#include<stdio.h> /*自定义函数说明*/ void screen(); /*系统主界面*/ void whatisit(); /*查询某年某月某日是星期几*/ void leapyear(); /*查询某年是否闰年*/ void printyearday(); /*打印某年的全年日历*/ int IsLeapYear(int); /*判断某年是否为闰年*/ int whatisita(int,int); /*计算今天是星期几*/ int everymonth(int,int); /*查询每月最大天数*/ void printmonth(int,int);/*打印某年某月日历*/ void printmonthday(); /*打印某年的某月最大天数*/ void printyearmonthday(); /*查询某年某月日历*/ /*定义一个判断星期几的指针数组*/ char *week[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; int main() { system("color 2F"); /*设置背景颜色为浅绿色*/ printf("制作人ID:2013914215.\n\n"); /*个人信息,姓名、学号*/ screen(); /*万年历的入口*/ getch(); } /*万年历查询主界面(含部分功能)*/ void screen() { int n; while (1) { /*万年历的功能*/ printf(" 万年历查询程序:\n"); printf("1:查询某年某月某日是星期几\n"); printf("2:查询某年是否是闰年 "); printf("3:打印某年的全年日历 "); printf("4:打印某年某月的日历 "); printf("5:查询某年某月的最大天数 "); printf("6:退出 "); printf("请输入要查询的选项: "); scanf("%d",&n); switch (n) { /*实现相应功能的函数*/ case 1:whatisit();break; case 2:leapyear();break; case 3:printyearday();break; case 4:printyearmonthday();break; case 5:printmonthday();break; case 6:return; default:printf("你输入错误,请按要求输入!!! ");break; }/*end of switch (n)*/ }/*end of while (1)*/ }/*end of void screen ()*/ /*查询某年某月某日是星期几*/ void whatisit() { int y, m, d, s, k=1, sum, n, i; char yn; /*定义一个数组,计算每月的天数*/ int a[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; while (k) { printf("请依次输入年,月,日:"); scanf("%d,%d,%d",&y,&m,&d); /*输入要查询的年、月、日*/ s = 0; for (i = 1; i < m; i++) { s = s + a[i]; } s = s + d; if (IsLeapYear(y) && m > 2) { s = s + 1; } sum = s; n = (y-1 + (y-1)/4-(y-1)/100 + (y-1)/400 + sum) % 7; printf("%d 年 %d 月 %d 号是: %s.\n",y,m,d,week[n]); printf("是否要继续查询(Y/N)?"); scanf("%c",&yn); getchar(); if (yn == 'y' || yn == 'Y') { k = 1; } else { k = 0; }/*end of if (yn == 'y' || yn == 'Y')*/ }/*end of while (k)*/ }/*end of void whatisit()*/ /*判断某年是否是闰年*/ int IsLeapYear(int year) { return(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); /*返回一个整型值0或1*/ } /*end of int IsLeapYear(int year)*/ /*查询某年是否是闰年*/ void leapyear() { int y, k = 1; char yn; while (k) { printf("请输入要查询的年份: "); scanf("%d",&y); if (IsLeapYear(y)) /*y是判断标志*/ { printf("%d 年是闰年! ",y); } else { printf("%d 年不是闰年!\n",y); } printf("是否继续查询(Y/N)?"); scanf("%c",&yn); getch(); if (yn == 'y' || yn == 'Y') /*是否继续查询入口*/ { k = 1; /*k是是否继续查询的标志*/ } else { k = 0; } /*end of if (yn == 'y' || yn == 'Y')*/ } /*end of while (k)*/ } /*end of void leapyear()*/ /*计算当天是星期几*/ int whatisita(int y,int m) /*whatisita 是有参函数,返回值是整型,y表示年,m表示月*/ { int n, i; int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, s = 0; for (i = 1;i < m;i++) /*计算总天数*/ { s = s + a[i]; } if (IsLeapYear(y) && m > 2) /*判断是否闰年,如果是闰年就总天数加1天*/ { s = s + 1; } n = (y-1+(y-1)/4-(y-1)/100+(y-1)/400+s+1)%7; return n; /*返回值是n*/ }/*end of int whatisita(int y,int m)*/ /*打印某年的全年日历*/ void printyearday() { int y, value, sum, i, j, k = 1; char yn; while (k) { printf("请输入查询的日历的年份: "); scanf("%d",&y); for (i = 1; i <= 12; i++) { printf(" %d年%d月 \n",y,i); value = whatisita(y, i); sum = everymonth(y, i); printmonth(value, sum); printf("\n\n"); } printf("是否继续查询(Y/N)?"); scanf("%c",&yn); getchar(); if (yn == 'Y' || yn == 'y') { k = 1; } else { k = 0; } } /*end of while (k)*/ } /*end of void printyearday()*/ /*查询某月最大天数*/ int everymonth(int year, int month) /*everymonth是有参函数,year是年份,month是月份,返回值是整型*/ { int s; static int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; s =a [month]; if (IsLeapYear(year) && month == 2) { s = s + 1; } return s; /*s是返回值*/ } /*end of int everymonth(int year, int month)*/ /*打印某年的某月最大天数函数*/ void printmonthday() { int y, m, value, k = 1; char yn; while (k) { printf("请输入查询的年份,月份: "); scanf("%d,%d",&y,&m); value = everymonth(y,m); printf("%d年%d月的最大天数为%d.\n",y,m,value); printf("是否继续查询(Y/N)?"); scanf("%c",&yn); getchar(); if (yn == 'y' || yn == 'Y') { k = 1; } else { k = 0; } } /*end of while (k)*/ } /*end of void printmonthday()*/ /*打印月历*/ void printmonth(int value,int sum) /*printmonth是有参函数,value和sum是参数,无返回值*/ { int n, i = 0, j; char *x[7] = {"Sunday", "Monday", "Tuesday", "Wenesday", "Thursday", "Friday", "Saturday"}; for (j = 0; j < 7; j++) { printf("%-10s",x[j]); } printf("\n"); while (i < value) { printf(" "); i++; } for (n = 1; n < 7-value; n++) { printf("%-10d",n); } while (n <= sum) { if ((n + value - 1) % 7 == 0) { printf("\n"); } if (n/10 > 0) { printf("%-10d",n); } else { printf("%-10d",n); } n++; }/*end of while (n <= sum)*/ } /*end of void printmonth(int value,int sum)*/ /*查询某年某月日历*/ void printyearmonthday() { int y, m, value, sum, k = 1; char yn; while (k) { printf("请输入要查询日历的年份,月份: "); scanf("%d,%d",&y,&m); printf(" %d年%d月的日历\n",y,m); value = whatisita(y,m); /*whatisit 函数返回一个值,返回值是本月的第一天是星期几*/ sum = everymonth(y,m); /*everymonth 函数返回一个值,返回值是本月的最大天数*/ printmonth(value,sum); printf("\n"); printf("是否继续查询(Y/N)?"); scanf("%c",&yn); getchar(); if (yn == 'y' || yn == 'Y') { k = 1; } else { k = 0; } }/*end of while (k)*/ } /*end of void printyearmonthday()*/
总结:要理解这个万年历的代码才可以改进,得到功能更加齐全的万年历,个人改进的地方还是比较少的,融入了个人的一些想法,例如,我不喜欢黑白的显示屏,我把显示屏的背景色调为了浅绿色,我增加了万年历的一个功能,就是可以查询某一年的某月的日历,书本上的日历的显示并不标准,星期几与日期不一致,造成查看日历的人不容易看懂日历,对此,我也进行了改编,我把星期几与日期一一对应,这样子可以让查询日历的人更容易看懂,也更加符合实际情况,在改编程序的过程中也遇到很多问题,不断调试,不断完善,最终实现了自己的想法,希望老师多多指点,谢谢!
共1条
1/1 1 跳转至页
C语言课程设计作业--多功能实用万年历
关键词: 多功能 实用 万年历
共1条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |