年历显示系统,输入一个年份,输出是在屏幕上显示该年的日历。

一、输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间
(1)输入年,输出该年的日历。
(2)输入年月,输出该月的日历。
(3)输入年月日,输出距今天还有多少天,星期几,是否是公历节日。

二、原理
此程序通过函数的调用实现了程序的运行,程序中运用了很多循环结构,来实现日期的显示,还运用了选择结构,通过选择判断闰年、星期几,输出相应的信息,还运用了指针,配合switch等语句显示日期是星期几。

三、 需求分析1.目前的计算机日历程序,比较典型的是Windows各版本中的日历程序以及基于该程序所开发的各种:应用程序中的日历程序。然而,这些程序都是千遍一律的局限于-一个很短的时间内。但是,很多情况下,特别是在众多的科学领域中,一个时间跨度较大的程序是有参考价值的。C++程序设计语言充分发挥了其自身无与伦比的优越性,用极短的程序文本就弥补了这一领域的空白。2.万年历作为日常中的一种小工具,它具有多方面的小工能,主要在日期的显示上给人以直观的表达效果,在日期的查询上方便简洁,还有就是在某些节日的提醒.上都给我们带来极大的方便,是一种比较实用的小工具给人的需求性很大,学生在做此万年历课程设计的同时,能够认识到C++编程给人带来的便捷,也能够清楚万年历表编程的出入。对培养学生的创新能力和动手能力具有很大的作用。

四、 总体思路
想要实现输出某年的日历,必须知道一个常识,那就是公元一年一月一日是星期一,这是一个重要的切入点。如果知道了这一点,那问题就迎刃而解了。首先,我们可以先把公元一年一月一日到这年一月一日之前的总天数计算出来,这用for语句比较容易实现,不过要注意到平年与闰年的区别。有了总天数,然后再除以7,余数为几,那么这年的一月一日就是星期几,如此依次排出一月的日历。再把一月的天数加上总天数得到的结果除以7,就可以知道二月一日是星期几,写出二月的日历。如此便可写出一到十二月的日历。至于输入年月,输出该月的日历,思路相同。至于判断是否为公历节日,用一个if语句便可实现。

(1)函数:
1.Isleapyear函数判断该年是否为闰年,判断一-年是否为闰年需要符合下面二者之一:
1.能被4整除,但不能被100整除。2.能被400整除。满足上述条件时,返回值为1,否则返回值为0。2.Alldays函数判断公元一月一号到公元某年某月的总天数,利用for循坏,求出该月前几月的天数和,加上输入日期的天数,就得到了公元一月一号到公元某年某月的总天数。
3.Days函数判断公元一月一号到公元前某年某月的总天数,利用for循坏,求出该月前几个月的天数和,再加上输入日期的天数,就得到了公元一月一号到公元前某年某月的总天数。
4.Outputtoscreen函数判断某年某月某日的編号,在l与j=0;j<1+1;j++的情况下,根据K=1;k<=dayofmonth[isleapyear(year)][month-1];k++,”%4d”,k,(i+k+1)%70得到与“日 一二三四五六"相对应的天数,并输出到屏幕。
5.Outputtofile函数判断某年某月某日的編号,在l6与j=0;j<1+1;j++的情况下,根据k=l;k<=dayofmonth[isleapyear (year)][month-1];k++, “%4d”,k ,(i+k+1)%70 得到与“日 一 二 三 四 五 六”相对应天数,并输出到文本
.6.Onemonth函数输入年分,月份,通过allday和day函数再由outputtoscreen函数得出结果,从而形成每七个数字一换行的效果,即形成月历。
7.Oneyear函数输入年份,通过allday和day函数再由outputtoscreen函数得出結果,定义変量month,赋初值为1,利用for循环,循环十二次,输出各个月的月历,从而显现出该年的毎一天,达到年历的效果。
8.Oneday函数输入年份,月份,日期,通过allday和day函数再由outputtoscreen函数得出结果,从而得到某天是周几。
9.ThedayafterN函数输入一个日期,再输入要经过的天数,通过allday和day函数,再由while语句得出査询的年月日星期。
10.Mainmenu函数输入要选择的服务项:
1.査询某年中的某个月;
2.査询某年;
3.査询某天是周几;
4.査询一段吋间日期;
5.査询两个日期间共有多少天;
6.输入一个日期,和一个整数n,査询n天以后的日期;
0: 退出。
再利用switch语句:
case l:onemonth();
break;
case 2:oneyear();
break;
case 3:oneday();
break;
case 4:somemonth();
break;
case 5:countof2date();
break;
case 6:thedayafterN();
break;
case 0:{Sign=1;break;}
链接到指定函数,运行所使用程序,得出结果。
(2)功能实现核心代码头文件#include <stdio.h>定义变量int monthdays[12]={31,28,31,30,31,30,31,31,30,31,30,31};int leapyearmonthdays[12]={31,29,31,30,31,30,31,31,30,31,30,31};int year=2011;int month=4;int day=22;int isweekday(int y,int m,int d)定义函数检测输入年份是否为闰年int isleapyear(int y){if (y%4000 || y%100!=0 && y%40)return 1; return 0;} void print_month(int y,int m){int i=0;int startday=isweekday(y,m,1);printf("\n%4d/%02d\n",y,m);printf("*****************************\n");检测该天是星期几int isweekday(int y,int m,int d){int weekday;if(m<3) { m+=12; y–;}return weekday=(2+2m+3(m+1)/5+y+y/4-y/100+y/400)%7;}计算输入日期距今的天数if(isleapyear(year) && month<=2)temp++; if(isleapyear(y) && m>2 ||(m2 && d29))temp++; for(i=month+1;i<=12;i++){days+=monthdays[i-1];} for(i=1;i<m;i++){days+=monthdays[i-1];}days+=(y-year-1)*365;}if(!(yeary && monthm)){days+=monthdays[month-1]-d
y+d;}else{days+=d-day;}days+=temp; printf("\n今天距%d/%d/%d还有%d天\n",y,m,d,days); return days;}主函数void main(){int temp;int y,m,d;char ch;do{printf(“请输入要查询的方式(1.查询年历\n 2.查询月历3.计算日期\n 4.设置当前日期(%d/%d/%d)):”,year,month,day);scanf("%d",&temp);switch(temp){case 1:printf(“请输入年份(ep:2011):”);scanf("%d",&y);print_year(y);break;case 2:printf(“请输入年月(ep:2011/4):”);scanf("%d/%d",&y,&m);print_month(y,m);break;case 3:printf(“请输入日期(ep:2011/4/22):”);scanf("%d/%d/%d",&y,&m,&d);counterdays(y,m,d);break;case 4:printf(“请输入当天日期(ep:2011/4/22):”);scanf("%d/%d/%d",&y,&m,&d);setday(y,m,d);break;default:break;}printf("\n\n是否继续?(Y键继续,任意键退出)");getchar();scanf("%c",&ch);}while(ch==‘y’ || ch==‘Y’);}

程序源代码:
#include <stdio.h>  int monthdays[12]={31,28,31,30,31,30,31,31,30,31,30,31};int leapyearmonthdays[12]={31,29,31,30,31,30,31,31,30,31,30,31};int year=2019;int month=6;int day=20; int isweekday(int y,int m,int d){int weekday;if(m<3) { m+=12; y–;}return weekday=(2+2m+3(m+1)/5+y+y/4-y/100+y/400)%7;} int isleapyear(int y){if (y%4000 || y%100!=0 && y%40) return 1; return 0;} void print_month(int y,int m){int i=0;int startday=isweekday(y,m,1);printf("\n%4d/%02d\n",y,m);printf(“\n");for(i=0;i<startday;i++){printf(" “);}if(isleapyear(y)){for(i=1;i<=leapyearmonthdays[m-1];i++){printf(”%3d “,i); if((startday+i)%70)printf("\n");}}else{for(i=1;i<=monthdays[m-1];i++){printf("%3d ",i); if((startday+i)%70)printf(”\n");}}printf("\n\n”);} void print_year(int y){int i;for(i=1;i<=12;i++){print_month(y,i);}} int counterdays(int y,int m,int d){int temp=0;int days=0;int i;for(i=year+1;i<y;i++){if(isleapyear(i))temp++;} if(y-year>=1){if(isleapyear(year) && month<=2)temp++; if(isleapyear(y) && m>2 ||(m2 && d29))temp++; for(i=month+1;i<=12;i++){days+=monthdays[i-1];} for(i=1;i<m;i++){days+=monthdays[i-1];}days+=(y-year-1)*365;}if(!(yeary && monthm)){days+=monthdays[month-1]-day+d;}else{days+=d-day;}days+=temp; printf("\n今天距%d/%d/%d还有%d天\n",y,m,d,days); return days;}  void setday(int y,int m,int d){year=y;month=m;day=d;} void main(){int temp;int y,m,d;char ch;do{printf(“请输入要查询的方式(1.查询年历2.查询月历3.计算日期4.设置当前日期(%d/%d/%d)):”,year,month,day);scanf("%d",&temp);switch(temp){case 1:printf(“请输入年份(ep:2019):”);scanf("%d",&y);print_year(y);break;case 2:printf(“请输入年月(ep:2019/6):”);scanf("%d/%d",&y,&m);print_month(y,m);break;case 3:printf(“请输入日期(ep:2019/6/20):”);scanf("%d/%d/%d",&y,&m,&d);counterdays(y,m,d);break;case 4:printf(“请输入当天日期(ep:2019/6/20):”);scanf("%d/%d/%d",&y,&m,&d);setday(y,m,d);break;default:break;}printf("\n\n是否继续?(Y键继续,任意键退出)");getchar();scanf("%c",&ch);}while(ch==‘y’ || ch==‘Y’);}
总体设计流程图

  • 30
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值