C语言打印某一年的日历

本文通过实例为大家分享了C语言打印某一年日历的具体代码,供大家参考,具体内容如下

输入一个年份(1970以后的),以 2*6 的格式打印当年的日历。

主要思路:遍历日期,根据日期标记每一行应该打印的内容,存放到一个数组中,然后遍历数组,根据数组的内容逐行打印。代码如下:

// 打印日历
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

char month[12][10] = { "January", "February", "March", "April", "May", "June",
 "July", "August", "September", "October", "November", "December" };

//计算某日期是当年的第几天
int day_in_year(int y, int m, int d) {
 int r_day = 0;
 int m_days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//每个月的天数
 m_days[1] += y % 400 == 0 || y % 4 == 0 && y % 100 != 0;
 for (int i = 0; i < m - 1; ++i) {
  r_day += m_days[i];
 }
 r_day += d;
 return r_day;
}

//计算某日是星期几
int getWeek(int y, int m, int d) {
 //先计算出来距离1970年1月1日周四有多少天
 int days = 0; //当日距离1970.1.1的天数
 int res;   //存放结果,周几

 if (y == 1970) {
  days = day_in_year(y, m, d);
 }
 else {
  for (int i = 1970; i < y; ++i) {
   days = days + 365 + (i % 400 == 0 || i % 4 == 0 && i % 100 != 0);
  }
  days += (day_in_year(y, m, d) - 1);//因为算的是距离多少天,所以需要减一
 }

 //然后计算当日是周几
 res = (days + 4) % 7;
 return res;
}

//打印日历
void displayCalendar(int y) {
 int m_days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };//每个月的天数
 m_days[1] = 28 + (y % 400 == 0 || y % 4 == 0 && y % 100 != 0);
 int week_l;//左边月份的第一天是周几
 int week_r;//右边月份的第一天是周几
 for (int m = 0; m < 6; ++m) {//m控制月份,比实际月份小1
  //打印日历的表头
  printf("%-12s                    %-12s\n", month[m], month[m + 6]);
  printf("---------------------------     --------------------------- \n");
  printf("Sun Mon Tue Wed Thu Fri Sat     Sun Mon Tue Wed Thu Fri Sat \n");
  week_l = getWeek(y, m + 1, 1);//求出左边月份的第一天是星期几
  week_r = getWeek(y, m + 7, 1);//求出右边列月份的第一天是星期几
  int date_l = 1;
  int date_r = 1;
  while (date_l <= week_l + m_days[m] || date_r <= week_r + m_days[m + 6]) {
   //在范围内,打印
   int tag[15] = { 0 };//用来标记应该打印什么,整数表示打印日期,-1表示打印空格
   tag[7] = -1;//左右界线
   for (int p = 0; p < 7; ++p, ++date_l, ++date_r) {//p为tag的指针
    //根据指针p给tag赋值
    if (date_l <= week_l + m_days[m]) {
     if (date_l < week_l) {
      //指针还没有到左边月份的第一天,应该打印空格
      tag[p] = -1;
     }
     else {
      //记录应该打印的日期
      tag[p] = date_l - week_l;
     }
    }
    else {//该打印的日期标记完了,其他的用空格补上
     tag[p] = -1;
    }
    //标记右边的情况,逻辑与左边的一样
    if (date_r <= week_r + m_days[m + 6]) {
     if (date_r < week_r) {
      tag[p + 8] = -1;
     }
     else {
      tag[p + 8] = date_r - week_r;
     }
    }
    else {
     tag[p + 8] = -1;
    }
   }
   //一行一行打印
   for (int i = 0; i < 15; ++i) {
    if (tag[i] == -1||tag[i] == 0) {
     //没有日期要打印,打印四个空格
     printf("    ");
    }
    else {
     //有日期打印,打印日期
     printf("%-4d", tag[i]);
    }
   }
   printf("\n");
  }
  printf("\n");
 }
}

int main() {

 int year;//输入年份,打印该年的日历
 scanf("%d", &year);
 displayCalendar(year);
 return 0;
}

运行效果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C语言打印某一年的日历

    本文通过实例为大家分享了C语言打印某一年日历的具体代码,供大家参考,具体内容如下 输入一个年份(1970以后的),以 2*6 的格式打印当年的日历. 主要思路:遍历日期,根据日期标记每一行应该打印的内容,存放到一个数组中,然后遍历数组,根据数组的内容逐行打印.代码如下: // 打印日历 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> char month[12][10] = { "January", "Febr

  • C语言打印某一年中某月的日历

    在做学校作业发现的一道不错的练手题目,记录下来方便复习 大致思路: ① 判断输入的年份是否闰年: ② 计算输入月份的第一天是该年的第几天: ③ 计算输入月份的第一天是星期几: ④ 输出. 结合代码使用: #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int arr1[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; int i = 0; int year = 0;

  • C语言实现按月显示的日历

    本文实例为大家分享了C语言实现按月显示的日历,供大家参考,具体内容如下 首先显示一下我们最后要出来的效果图: 大概就是这个样子.那么我们先来说说基本的思路:首先计算出当前年的第一天是星期几,再根据当前年是星期几的结果计算出当前月是星期几的结果,最后再按照效果图的样子输出一下就OK了. 我们的基本步骤是: 1.定义输入函数,也就是你要输入的年和月. 2.计算当前年的第一天是星期几.我们需要定义一个基准年,再定义出基准年的第一天是星期几.最后计算出当前年与基准年之间的差值,用最后的结果加上基准年第一

  • C语言打印华氏-摄氏温度对照表的方法

    本文实例讲述了C语言打印华氏-摄氏温度对照表的方法.分享给大家供大家参考.具体实现方法如下: /* * 打印华氏-摄氏温度对照表 */ #include <stdio.h> /* 温度上限 */ #define MIN 20.0 /* 温度下限 */ #define MAX 300.0 /* 步长 */ #define BC 20.0 main() { /* 定义温度及上下限步常变量 */ float oc,of=1.0; /* 打印标题 */ printf("华氏-摄氏温度对照表\

  • java打印指定年月份的日历

    本文实例为大家分享了java打印指定年月份日历的具体代码,供大家参考,具体内容如下 做了一个小的日历打印,没有使用数组,所以不能对日期进行操作,用了单个for循环打印,对初学者来说应该好理解点 工具类: import java.util.Calendar; public class DaysTool { private int year; private int month; public DaysTool(){} public DaysTool(int year ,int month){ th

  • C语言打印菱形实例详解

    前言 打印菱形这道题对于初学编程者来说简直是噩梦,曾经我就是栽在这上面的,后来编程编多了之后对打印菱形也觉得不再那么难了,去年在公众号写了一篇推送是关于打印菱形的,觉得对一些师弟师妹还是有所帮助的,今天就把这道题分享出来. 以下是我遇到的各种各样的菱形: 普通菱形,输入n,输出n行n列的菱形 难度系数:♥ n行空心菱形,输入n,输出n行空心菱形 难度系数:♥♥ n行挖空菱形,输入n,输出n行n列空格菱形 难度系数:♥♥♥ n行数字菱形,输入n,输入n行数字从外到内递增的数字菱形 难度系数:♥♥♥

  • C语言打印各种图案实例代码

    1.线段图案 #include<stdio.h> int main() { int a = 0; while(~scanf("%d",&a)) { int i = 0; for(i=0;i<a;i++) { printf("*"); } printf("\n"); } return 0; } 2.正方形图案 #include<stdio.h> int main() { int a = 0; while(~sc

  • C语言打印杨辉三角形的示例代码

    目录 1. 题目描述 2. 解题思路 3. 动图演示 4. 代码实现 Step1 Step2 居中显示 5. 完整代码 6. 特性总结 1. 题目描述 杨辉三角形 解题之前,我们先来了解一下杨辉三角形到底是什么? 杨辉三角形,又称帕斯卡三角形.贾宪三角形.海亚姆三角形,它的排列形如三角形. 因为首现于南宋杨辉的<详解九章算法>得名,而书中杨辉说明是引自贾宪的<释锁算书>,故又名贾宪三角形. 古代波斯数学家欧玛尔·海亚姆也描述过这个三角形.在欧洲,因为法国数学家布莱兹‧帕斯卡在165

  • C语言打印正方形实例代码

    目录 题目描述 输入 输出 样例输入 样例输出 题目描述 由火柴棍组成的一个n×n的正方形,按从上到下,从左到右的顺序给火柴棍编号,从1开始,比如下图中,一共有24根火柴棍. 问去掉若干个火柴棍之后,这个图形中还存在多少个正方形? 如下图所示,n=3时,去掉12,17,23号火柴棒之后,还剩下5个正方形. 输入 第一行是一个整数T(1≤T≤1000),表示样例的个数. 每个样例的第1行是两个整数n(1≤n≤50),表示图形的宽度. 样例的第2行首先是一个整数m(0≤m≤2n(n+1),表示去掉火

  • C语言打印杨辉三角示例汇总

    杨辉三角是我们从初中就知道的,现在,让我们用C语言将它在计算机上显示出来. 在初中,我们就知道,杨辉三角的两个腰边的数都是1,其它位置的数都是上顶上两个数之和.这就是我们用C语言写杨辉三角的关键之一.在高中的时候我们又知道,杨辉三角的任意一行都是的二项式系数,n为行数减1.也就是说任何一个数等于这个是高中的组合数.n代表行数减1,不代表列数减1.如:第五行的第三个数就为=6. 现在我们按第一种思路来写:先定义一个二维数组:a[N][N],略大于要打印的行数.再令两边的数为1,即当每行的第一个数和

随机推荐