最近帮朋友做一些C语言的练习题,期间遇到了个比较有意思的题目,意在考察模块化程序设计,大致要求如下:

电子万年历:

1、编写函数int isleapyear(int year);判某年是否为闰年,如该年为闰年返回1,否则返回0。编写主函数输入年份给出该年是否为闰年。

2、编写函数int dayofmonth(int year ,int month);计算某年某月有几天。主函数中输入任意的年和月,给出此年该月有几天。

3、编写万年历。请利用上述1、2已编写的函数和下边已提供的函数来完成:

(1)输入年打印出此年的日历。

(2)输入年和月打印给出此年该月的日历。

1 /*参考代码*/

2 int firstdayofyear(int year) /*求某年的第一天是星期几*/

3

4 { inti;5

6 long n,days=year;7

8 days=days*365; /*printf("\n%ld",days);*/

9

10 for(i=1;i

11

12 n=days%7;13

14 returnn;15

16 }17

18 int firstdayofmonth(int year, int month) /*求某年某月的第一天是星期*/

19

20 { int i,days=0, weekdays;21

22 weekdays=firstdayofyear(year);23

24 for(i=1;i

26 return (days+weekdays)%7;27

28 }

这道题并不算困难(给出了一些参考代码),而且根据上面给出的要求也不难得到如下思路:

第一问:根据闰年计算的规则编写一个闰年判断函数。

这里我采用的是格里高利闰年规则:

1.公元年份非4的倍数,为平年。

2.公元年份为4的倍数但非100的倍数,为闰年。

3.公元年份为100的倍数但非400的倍数,为平年。

4.公元年份为400的倍数,为闰年。

转换为C语言代码形式就成了下面这样子:

1 int isLeapyear(intyear)2 {//判断否为闰年3 //满足上述规则2或4,返回1,否则返回0

4 return ((year%100!=0&&year%4==0) || year%400==0) ? 1 : 0;5 }

第二问:编写函数计算某年某月有几天。

由于每一年的天数差别只在二月,而二月份天数的多少又受闰年的影响,所以我们只需要对二月进行特殊判断即可。可以利用第一问已经写过的函数,完成第二问,代码如下:

1 int dayOfMonth(int year, intmonth)2 {//计算某年某月的天数

3 int x;//天数

4 switch(month){5 case 1:case 3:case 5:case 7:case 8:case 10:case 12:6 x=31;7 break;8 case 2:9 //闰年2月29天,平年28天

10 x=isLeapyear(year) ? 29 : 28;11 break;12 case 4:case 6:case 9:case 11:13 x=30;14 break;15 default: break;16 }17 returnx;18 }

第三问:利用已知函数,根据输入打印出相应的年或月的日历。

重点在于第一小问,只要我们能正确输出某一月的日历,那么输出某年的日历就相当于依次输出1~12月的日历。参考代码中已经给出了两个非常有用的函数,分别是:

int firstdayofyear(int year) /*求某年的第一天是星期几*/

int firstdayofmonth(int year, int month) /* 求某年某月的第一天是星期*/

这里我的想法是先利用firstdayofmonth这个函数计算出某年某月第一天是星期几,然后计算出该月有多少天,最后利用循环输出,为了美观每七天换行一次。代码如下:

1 void displayMonth(int year, intmonth)2 {3 int start,days;//该月第一天是周几 该月的天数

4 start=firstdayofmonth(year,month);5 days=dayOfMonth(year,month);6 if(start==0)//如果等于零说明第一天刚好是星期天,要转换一下

7 start=7;8 printf("一\t二\t三\t四\t五\t六\t日\n");9 for(int i=1;i

11 printf("\t");12 else//从1开始依次输出日期

13 printf("%2d\t",i-start+1);14 if(i%7==0)//满七天换行

15 printf("\n");16 }17 }

第二小问就简单了,循环依次打印每月的日历就是某年的日历,代码如下:

1 void displayYear(intyear)2 {//循环调用打印月份的函数输出某年的日历

3 for(int i=1;i<=12;++i){4 printf("%d月:\n",i);5 displayMonth(year,i);6 printf("\n");7 }8 }

最后把他们整合到成一个程序,代码如下:

1 #include

2

3 /**4 * 目前使用的格里高利历闰年规则如下:5 * 1.公元年份非4的倍数,为平年。6 * 2.公元年份为4的倍数但非100的倍数,为闰年。7 * 3.公元年份为100的倍数但非400的倍数,为平年。8 * 4.公元年份为400的倍数,为闰年。9 */

10

11 //函数声明

12 int isLeapyear(int year); //判断是否为闰年

13 int dayOfMonth(int year, int month); //计算某年某月的天数

14 int firstdayofyear(int year); //求某年的第一天是星期几

15 int firstdayofmonth(int year, int month);//求某年某月的第一天是星期几

16 void displayYear(int year); //打印某年的日历

17 void displayMonth(int year, int month); //打印某年某月的日历

18

19 intmain()20 {21 intyear,month;22 printf("请依次输入年份和月份:\n");23 scanf("%d%d",&year,&month);24 if(year<=0 || month<1 || month>12)25 printf("输入不合法!");26 else{27 if(isLeapyear(year))28 printf("是闰年,该月有%d天",dayOfMonth(year, month));29 else

30 printf("是平年,该月有%d天",dayOfMonth(year, month));31 printf("\n%d年的日历如下:\n",year);32 displayYear(year);33 printf("%d年%d月的日历如下:\n",year,month);34 displayMonth(year,month);35 }36 return 0;37 }38

39 int isLeapyear(intyear)40 {//判断否为闰年41 //满足上述规则2或4,返回1,否则返回0

42 return ((year%100!=0&&year%4==0) || year%400==0) ? 1 : 0;43 }44

45 int dayOfMonth(int year, intmonth)46 {//计算某年某月的天数

47 int x;//天数

48 switch(month){49 case 1:case 3:case 5:case 7:case 8:case 10:case 12:50 x=31;51 break;52 case 2:53 //闰年2月29天,平年28天

54 x=isLeapyear(year) ? 29 : 28;55 break;56 case 4:case 6:case 9:case 11:57 x=30;58 break;59 default: break;60 }61 returnx;62 }63

64 int firstdayofyear(intyear)65 {//求某年的第一天是星期几

66 long days; //天数

67 days=year*365;//从0年到year年一共有多少天

68 for(int i=1;i

69 days=days+isLeapyear(i);70 return days%7; //取余得出year年的第一天是星期几

71 }72

73 int firstdayofmonth(int year, intmonth)74 {//求某年某月的第一天是星期几

75 int days=0,weekdays; //天数 星期几

76 weekdays=firstdayofyear(year); //得出year年的第一天是weekdays

77 for(int i=1;i

78 days+=dayOfMonth(year, i);79 return (days+weekdays)%7; //取余得出year年month月的第一天是星期几

80 }81

82 void displayYear(intyear)83 {84 for(int i=1;i<=12;++i){//循环调用打印月份的函数输出某年的日历

85 printf("%d月:\n",i);86 displayMonth(year,i);87 printf("\n");88 }89 }90

91 void displayMonth(int year, intmonth)92 {93 int start,days;//该月第一天是周几 该月的天数

94 start=firstdayofmonth(year,month);95 days=dayOfMonth(year,month);96 if(start==0)//如果等于零说明第一天刚好是星期天,要转换一下

97 start=7;98 printf("一\t二\t三\t四\t五\t六\t日\n");99 for(int i=1;i

101 printf("\t");102 else//从1开始依次输出日期

103 printf("%2d\t",i-start+1);104 if(i%7==0)//满七天换行

105 printf("\n");106 }107 }

万年历

运行效果见下图(根据可需要在主函数修改输出内容):

虽然说是万年历,但实际有点过于简单了(只显示公历),而且这个输入范围也有限制(不能超过int的范围),不过还是有点参考价值的。如果对你有帮助的话不妨支持一下,非常感谢

c语言电子万年历大作业,C语言实现一个简单的电子万年历相关推荐

  1. c语言程序设计创新大作业,C语言程序设计大作业报告.pdf

    C语言程序设计大作业报告 课程设计(大作业)报告 课程名称: C 语言程序设计 设计题目: 实验设备管理系统 院 系: 信息技术学院 班 级: 2015级物联网工程 1班 设 计 者: 何盛 高陶 王 ...

  2. 通讯录管理系统C语言课程设计大作业,c语言课程设计报告---通讯录管理系统.doc...

    c语言课程设计报告---通讯录管理系统.doc Yangtze University College of Arts and Science 学生实习手册 (课程设计报告) 学 部 理 工 学 部 专 ...

  3. 编译原理大作业-PL0语言编译器

    编译原理大作业-PL0语言编译器 一.实验目的 二.源码说明 1.头文件pl0.h (1 词法分析主要数据结构(通过enum symbol类实现) 1.保留字(13+4个): 2.运算符及界符(16+ ...

  4. 0039c语言作业答案2020,西南大学2019年网络与继续教育[0039]《C语言程序设计》大作业试题(资料).doc...

    西南大学2019年网络与继续教育[0039]<C语言程序设计>大作业试题(资料).doc 文档编号:764150 文档页数:4 上传时间: 2019-10-12 文档级别: 文档类型:do ...

  5. 合肥学院C语言大作业,C语言实践课程综合大作业..doc

    C语言实践课程综合大作业. 昆明理工大学 <程序设计基础>课程 综合设计实践教学课题报告 课程名称: C语言程序设计综合大作业 课题名称:数学计算工具程序设计 组长:学号 20131040 ...

  6. bupt 大作业C语言 ——冯诺依曼式CPU模拟器

    bupt 大作业C语言 --冯诺依曼式CPU模拟器 /* 作者:bupt 时间:2021.7.10主函数main1>取指令,保存到寄存器2>分析指令,执行指令3>输出代码,数据 代码 ...

  7. HTML5期末大作业:旅游网站设计——简单大气的响应式旅游网页(5页) HTML+CSS+JavaScript...

    HTML5期末大作业:旅游网站设计--简单大气的响应式旅游网页(5页) HTML+CSS+JavaScript 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码 常见网页 ...

  8. c语言程序设计0039大作业答案,2019西南大学0039C语言程序设计机考大作业答案.doc...

    - PAGE 1 - 西南大学网络与继续教育学院课程考试试题卷 类别: 网教 2019年 6月 课程名称[编号]: C语言程序设计 [0039] A卷 大作业 满分:100 分 一.大作业题目 1.简 ...

  9. python2048小游戏程序设计大作业_C语言大作业报告——2048小游戏程序

    大作业题目 类型 游戏 班 号 学 号 所在院系 学 期 2020 年春季学期 任课教师 实验类型 综合设计型 实验目的:  掌握程序设计的基本算法和简单数据结构基础,能够综合运用基本控制语句.算法 ...

最新文章

  1. 论文《一种金融市场预测的深度学习模型:FEPA》(2)----有效市场假说,预测原则概念及自己的思考
  2. java实现局域网内单对单和多对多通信的设计思路
  3. 火出圈!河南大学教授毕业典礼金句频现:躺平得了初一,躺平不到十五!
  4. 火蚁机器人_适度偷懒提高整体效率:火蚁工作方式启发机器人群组协作
  5. Servlet开发(二)
  6. spring整合jdbc
  7. 测量仪图片_南昌高度仪价格,大行程非标影像测量仪组装
  8. 完全编译安装boost
  9. 1+X web中级 Laravel学习笔记——路由和控制器的简单使用
  10. Linux下文件系统目录结构
  11. FPGA复位激励编写(方法三)
  12. git 查看pop内容_原创 | 有了Git这个操作,我再也不怕代码混乱了!
  13. php7 php5 区别,php7与php5的区别有哪些?
  14. js 读取外部的本地json文件
  15. python gif图 ctf_从两道CTF实例看python格式化字符串漏洞
  16. 洗头 Wet Hair
  17. 计算机基础与应用演示文稿教案,计算机应用基础教案82修饰演示文稿.pdf
  18. keil MDK5 无法 Go To Definition Of
  19. 项目经理应该具备的技能和素质是什么?
  20. 关于bootbox.js自定义弹出框样式,如修改宽度等

热门文章

  1. 举例说明协方差矩阵的运算
  2. 数据分析技术:时间序列分析的AR/MA/ARMA/ARIMA模型体系
  3. python 方差齐性检验_Python数据科学:正态分布与t检验
  4. SDWebImage使用详解
  5. word隐藏段落标记,回车三角
  6. SMETA验厂辅导,对于已经通过了审核公司的ETI标准验厂,如何将验厂结果上传到SEDEX上
  7. 华硕天选1隐藏盘恢复系统
  8. 通过python调用OpenAI的API
  9. JAVA对象 到底是什么?
  10. 【Django】二手交易市场开发备忘录