实验名称:万年历的查询及打印
【内容】:设计一个查询并打印万年历的程序。
【步骤】:
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");
}
}