C语言小实验:打印日历

项目实现首先输入公元后任意年份,然后可以打印出该年份的日历。
面向c语言初学者,大神轻喷hhh
下面是程序实际运行效果:
先输入年份

然后输出日历

思路分析:

  1. 想要输出每年的日历,首先要确立一个基准年。本人以公元1年为基准年,公元1年第一天定为星期日。
  2. 以公元第一年递推,从而推出每年的第一天是星期几。(也可以用计算公式来计算每年的第一天为星期几,但我选择了不需要数学推导的方法)
  3. 推算出第一天的星期之后可以简单地推出每天的星期。
  4. 设计表头,并且注意日期的叠加与换行。

下面介绍我用到的代码段:

一、递推每年第一天时要计算这一天是公元后的第几天,所以需要判断闰年。

int runnian(int year){int x;if(((year%4==0)&&(year%100!=0))||(year%400==0)){x=1;
}else{x=0;
}
return x;
}

用if判断语句判断是否为闰年,返回值为1即为闰年。
二、用递推法判断是公元后的第几天

int day(int year){int y,d;for(y=year-1,d=1;y>0;y--){if(runnian(y)){d=d+366;}else{d=d+365;}
}return d;
}

循环语句求加和,注意判断闰年。
三、判断某年第一天是星期几

int week(int d){int w;switch(d%7){case 0: w=7; break;case 1: w=1;break;case 2: w=2;break;case 3: w=3;break;case 4: w=4;break;case 5: w=5;break;case 6: w=6;break;}return w;
}

我使用了switch语句,通过余数判断。也可以通过数组实现。
四、判断某月有几天

int monthday(int month,int year){
int y;switch(month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:y=31;break;case 4:case 6:case 9:case 11:y=30;break; case 2:if(runnian(year))    {y= 29;//闰年29天 break;}else{y= 28;break;}          } return y;
}

在每月输出足够数量的天数后,进入下一个月的循环。我依然使用的switch,依然也可以用数组实现。注意判断闰年。
至此,全部的准备工作完成,进入主函数,打印日历。

int main(void) {
int year,month;
int w;
int i,n;
printf("year:\n");
scanf("%d",&year);
//这年第一天是星期几
w=week(day(year));
//按顺序输出表格
for(month=1;month<=12;month++){printf("\t****%d年--%d月****\n",year,month);printf("日   一   二   三   四   五   六   \n");//表头
//因为周日在第一列,所以加if防止在第一天是周日时空格太多乱码if(w!=7){for(i=1;i<=w;i++){printf("     ");}}for(n=1;n<=monthday(month,year);n++){ if(w==6){printf("%d\n",n);}else{printf("%2d   ",n);}w++;if(w>7)w=1;if(n==monthday(month,year)){printf("\n");n=1;break;}}
}
system("pause");
return 0;
}

注意输出的回车设置,每当星期到六时,要输出回车。为了不乱码最好设置输出日期数字时的域宽,因为汉字占两个域宽,所以我也设置的二域宽。中间用空格分隔,达到整齐的效果。也可以设置更大的域宽,就不需要再单独输出空格了。
备注:因为我使用的VS2010编译器,所以需要引入<stdlib.h>库使用system(“pause”)语句,不然输出结果只会闪一下就结束。用其他编译器时可以不写。
下面展示全部代码(本人已经在编译器上试过,可以直接使用)

#include <stdio.h>
#include<stdlib.h>
//声明判断闰年的函数
int runnian(int year){int x;if(((year%4==0)&&(year%100!=0))||(year%400==0)){x=1;
}else{x=0;
}
return x;
}
//声明判断第几天的函数
int day(int year){int y,d;for(y=year-1,d=1;y>0;y--){if(runnian(y)){d=d+366;}else{d=d+365;}
}return d;
}
//声明判断是星期几的函数
int week(int d){int w;switch(d%7){case 0: w=7;break;case 1: w=1;break;case 2: w=2;break;case 3: w=3;break;case 4: w=4;break;case 5: w=5;break;case 6: w=6;break;}return w;
}
//声明每月天数的函数
int monthday(int month,int year){
int y;switch(month){case 1:case 3:case 5:case 7:case 8:case 10:case 12:y=31;break;case 4:case 6:case 9:case 11:y=30;break; case 2:if(runnian(year))    {y= 29;//闰年29天 break;}else{y= 28;break;}} return y;
}
int main(void) {
int year,month;
int w;
int i,n;
printf("year:\n");
scanf("%d",&year);
//这年第一天是星期几
w=week(day(year));
//按顺序输出表格
for(month=1;month<=12;month++){printf("\t****%d年--%d月****\n",year,month);printf("日   一   二   三    四   五   六   \n");//表头
//因为周日在第一列,所以加if防止在第一天是周日时空格太多乱码if(w!=7){for(i=1;i<=w;i++){printf("     ");}}for(n=1;n<=monthday(month,year);n++){ if(w==6){printf("%d\n",n);}else{printf("%2d   ",n);}w++;if(w>7)w=1;if(n==monthday(month,year)){printf("\n");n=1;break;}}
}
system("pause");
return 0;
}

打印日历的全过程就是这样。
如果有不正确的地方,欢迎批评指正!

C语言实验:打印日历相关推荐

  1. 2016: C语言实验——打印金字塔

    2016: C语言实验--打印金字塔 Description 输入n值,打印下列形状的金字塔,其中n代表金字塔的层数. Input 输入只有一个正整数n. Output 打印金字塔图形,其中每个数字之 ...

  2. c语言实验平台答案,山东理工大学ACM平台题答案 C语言实验——打印数字图形 1179...

    C语言实验--打印数字图形 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 从键盘输入一个整数n(1≤n≤9),打印出指定的数字图 ...

  3. C语言实现打印日历的功能

    C语言实现打印日历的功能,输入年月,可以打印日历 话不多说,上代码: #include <stdio.h> #include <stdlib.h>int isRn(int ye ...

  4. C语言实验——打印金字塔_JAVA

    输入n值,打印下列形状的金字塔,其中n代表金字塔的层数. Input 输入只有一个正整数n. Output 打印金字塔图形,其中每个数字之间有一个空格. Sample Input 3 Output 1 ...

  5. C语言实验——打印数字图形(JAVA)

    Description 从键盘输入一个整数n(1≤n≤9),打印出指定的数字图形. Input 正整数n(1≤n≤9). Output 指定数字图形. Sample Input 5 Output 1 ...

  6. C语言实验——打印数字图形

    Problem Description 从键盘输入一个整数n(1≤n≤9),打印出指定的数字图形. Input 正整数n(1≤n≤9). Output 指定数字图形. Example Input 5 ...

  7. Q - C语言实验——打印菱形

    Description 从键盘输入一个整数n(1≤n≤9),打印出指定的菱形. Input 正整数n(1≤n≤9). Output 指定的菱形. 第一行前面有n-1个空格,第二行有n-2个空格,依此类 ...

  8. C语言实验(十二):函数(输入年份输出日历、闰年判断、元旦星期几)

    C语言实验(十二):函数(输入年份输出日历.闰年判断.元旦星期几) 一.判断闰年和某年元旦星期几的函数 1. 编写一个函数,输入年份,判断是否为闰年: 2. 编写一个函数,输入年份,判断当年元旦所对应 ...

  9. C语言/打印日历,用户输入年分和月份两个变量,系统计算该月份的1号是星期几,并计算该月有多少天。最后打印出该日历。已知:1900年1月1日是星期一

    打印日历,用户输入年分和月份两个变量,系统计算该月份的1号是星期几,并计算该月有多少天.最后打印出该日历.已知:1900年1月1日是星期一 C语言 #define _CRT_SECURE_NO_WAR ...

最新文章

  1. [转]理解“Future”
  2. 2.4 理解指数加权平均-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  3. 全球及中国冷冻玉米粒行业盈利分析与投资机会评估报告2022-2028年版
  4. springboot tomcat默认线程数_记一次JAVA线程池的错误用法
  5. c mysql 异步查询_C#Mysql – 使用锁在数据库上查询异步等待服务器
  6. ElasticSearch索引的基本操作命令
  7. mysql官网下载页面
  8. Tomcat8用JDK1.7问题
  9. kernel中的日志打印
  10. Centos7 安装coturn部署一套 STUN/TURN 服务 webRTC打洞服务器
  11. 51单片机c语言dac0832产生波形,基于51单片机的DAC0832波形发生器设计
  12. java cause_Cause: java.lang.UnsupportedOperationException
  13. 安全警告——“Windows已经阻止此软件因为无法验证发行者”解决办法
  14. 电脑连接电视html,电脑HDMI连接电视无信号的解决方法
  15. 关于CList的小知识
  16. 2023 开工大吉!爆料各司年终奖
  17. 04【结构面】 面试之结构面,什么是结构面?结构面的准备,常见问题分析?
  18. linux 只读文件 删除,linux – 我无法删除文件’rm:无法删除X只读文件系统’
  19. Python库的安装详解
  20. 如何使用python寻找K线中的黄昏之星

热门文章

  1. 六、【中级篇】看门狗(watch dog)
  2. 神经网络—卷积神经网络CNN
  3. [论文素材]Previous Work----自动仇恨言论检测和冒犯性语言问题
  4. 数据结构C语言版(答案)
  5. pyecharts js 地图无法显示 Map china not exists the geoJson of the map must be provided
  6. python如何查询数据库_通过Python查询数据库信息
  7. 2014-2015-1(实变函数56)
  8. 【C语言练习】趣味题 疏散
  9. 本地通过配置代理访问远端服务器
  10. 面向对象编程(OOP)面向对象编程(OOP)