实验名称:万年历的查询及打印
【内容】:设计一个查询并打印万年历的程序。
【步骤】:
1 画出程序流程图;
2 编写程序;
3 调试程序,对调试过程中出现的问题进行分析,找出错误的原因并予改正;
4 写出通过调试并修改正确的原程序。
【要求】:
2 程序运行后,首先在屏幕上显示主菜单:
3 查询某年某月某日是星期几
4 查询某年是否是闰年
5 打印某年的全年日历
6 退出
4 在主菜单中输入1后,显示:
“请输入年月日(XXXX,XX,XX)”
运行后输出:XXXX年XX月XX日是星期X,是否继续查询(Y/N)?
如果输入Y,则重新显示 “请输入年月日(XXXX,XX,XX)”,否则回到主菜单。
6 在主菜单中输入2后,显示:
“请输入要查哪一年?(XXXX)”
运行后输出:XXXX年是(否)是闰年,是否继续查询(Y/N)?
如果输入Y,则重新显示,“请输入要查哪一年?(XXXX)”,否则回到主菜单。
8 在主菜单中输入3后,显示:
“请输入要打印的年份(XXXX)”
运行后输出XXXX年的日历,格式为:
XXXX
X(月数)
0 1 2 3 4 5 6
S M T W T F S
x x x x x x x
x x x xx xx xx xx
xx xx xx xx xx xx xx
xx xx xx xx xx xx xx
xx xx xx
X(月数)
0 1 2 3 4 5 6
S M T W T F S
x x x x
x x x xx xx xx xx
xx xx xx xx xx xx xx
xx xx xx xx xx xx xx
xx xx xx xx xx
.
.
.
.
.
运行完后显示:“是否继续打印(Y/N)?”
如果输入Y,则重新显示,“请输入要打印的年份(XXXX)”,否则回到主菜单。
10 在主菜单中输入4后,显示:“是否要真的退出(Y/N)?”
如果输入Y,结束程序运行,否则重新显示主菜单。
【提示】:
2 闰年计算:A 能被4整除,但不能被100整除的年份是闰年 B 能被100整除又能被400整除的年份是闰年。
3 闰年的二月是29天,平年的二月是28天
4 星期几的计算:
S=X-1+(X-1)/4-(X-1)/100+(X-1)/400+C
X是年份,C是该年从元旦开始到到这一日的天数。
S/7的余数既是星期数
例1:1982年12月26日
由于1982年不是闰年(不能被4整除),所以该年的二月是28天。
C=31+28+31+30+31+30+31+31+30+31+30+26=360
(1月到11月的天数+12月的实际天数)
S=1982-1+(1982-1)/4+(1982-1)/100+(1982-1)/400+360=2821.3925
S/7=2821/7=403 余数为0,所以该日是星期天。
例2:2000年3月8日
由于2000年是闰年(能被4整除,又能被100和400整除),所以该年的二月是29天。
C=31+29+8=68 (1月到2月的天数+3月的实际天数)
S=2000-1+(2000-1)/4+(2000-1)/100+(2000-1)/400+68=2551.757
S/7=2551/7=364 余数为3,所以该日是星期三。
我写的代码如下,不知道怎么搞的,如果输入今天的日期,总说是星期五还是六吧.各位帮帮忙
#include <stdio.h> int knowday(int year,int month,int day); int puanduan(int year); void printdata(int year); int duoshaotian(int year,int month,int day); main() { char juxu='Y'; int year,m,month,day,select,data; printf("/************************************************/\n"); printf("program explaination:\n"); printf("Y stand for:you want to continue!\n"); printf("N stand for:you want to exit!\n"); printf("1 can know what day is the day you input!\n"); printf("2 can know if the year you input is run nian!\n"); printf("3 can print nian li of the year you input!\n"); printf("/************************************************/\n"); while(juxu=='Y') { printf("what do you want to do now?"); printf("please input the number:"); scanf("%d",&m); switch(m) { case 1:printf("please input the year/month/day:"); scanf("%d%d%d",&year,&month,&day); data=knowday(year,month,day); printf("%d %d %d is xingqi %d\n",year,month,day,data); break; case 2:printf("please input the year:"); scanf("%d",&year); if(puanduan(year)) printf("%d is nun nian!\n",year); else printf("%d is ping nian!\n",year); break; case 3:printf("please input the year:"); scanf("%d",&year); printdata(year); break; default:printf("the number you input is wrong!\n"); } printf("do you want to continue?Y/N\n"); scanf("%c",&juxu); getch(); } }
/*判断是否是闰年*/ int puanduan(int year) { if(year%4==0&&year%100!=0||year%400==0) return 1; else return 0; }
/*计算输入的那天离元旦多少天*/ int duoshaotian(int year,int month,int day) {int i,sum=0; int total=0; int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; for(i=1;i<month;i++) sum+=mon[i]; total=sum+day; if(month>2&&puanduan(year)) total++; return total; }
/*算出输入的那天是星期几*/ int knowday(int year,int month,int day) { int num,a; num=duoshaotian(year,month,day); a=year-1+(year-1)/4.0+(year-1)/100.0+(year-1)/400.0+num; return a%7; } /*打印输入年的年份*/ void printdata(int year) { int mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int i,n,j,k,rizi; if(puanduan(year)) mon[3]++; printf(" year:%d",year); for(i=1;i<13;i++) {printf("********************************\n"); printf("* month:%d *\n",i); printf("********************************\n"); printf("0 1 2 3 4 5 6\n"); printf("sa mo tu we th fr sa\n"); printf("--------------------------------\n"); rizi=knowday(year,i,1); n=0; for(j=0;j<rizi;j++) {printf(" "); n++; } for(k=1;k<=mon[i];k++) {printf("%-2d",k); printf(" "); n++; if(n%7==0) printf("\n"); } printf("\n"); } }