C语言程序设计
《C语言程序设计》综合性程序设计(文科类)
实验名称:万年历的查询及打印
【内容】:设计一个查询并打印万年历的程序。用rar格式上传
【步骤】:
1. 画出程序流程图;
2. 编写程序;
3. 调试程序,对调试过程中出现的问题进行分析,找出错误的原因并予改正;
4. 写出通过调试并修改正确的原程序。
【要求】:
1. 程序运行后,首先在屏幕上显示主菜单:
1. 查询某年某月某日是星期几
2. 查询某年是否是闰年
3. 打印某年的全年日历
4. 退出
2. 在主菜单中输入1后,显示:
“请输入年月日(XXXX,XX,XX)”
运行后输出:XXXX年XX月XX日是星期X,是否继续查询(Y/N)?
如果输入Y,则重新显示 “请输入年月日(XXXX,XX,XX)”,否则回到主菜单。
3. 在主菜单中输入2后,显示:
“请输入要查哪一年?(XXXX)”
运行后输出:XXXX年是(否)是闰年,是否继续查询(Y/N)?
如果输入Y,则重新显示,“请输入要查哪一年?(XXXX)”,否则回到主菜单。
4. 在主菜单中输入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)”,否则回到主菜单。
5. 在主菜单中输入4后,显示:“是否要真的退出(Y/N)?”
如果输入Y,结束程序运行,否则重新显示主菜单。
【提示】:
1. 闰年计算:满足下列二者之一,是闰年:
能被4整除,但不能被100整除;
能被4整除,且能被400整除。
2.闰年的二月是29天,平年的二月是28天
3.星期几的计算:
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>
#include <stdlib.h>
struct nyr
{int weekday;
int year;
int month;
int day;
int flag;
}nyr_1,* nyr_2;
void runnian(struct nyr * nyr_3) /* 判断是否是闰年的函数*/
{ if(nyr_3->year%4==0)
{if(nyr_3->year%100==0)
{if(nyr_3->year%400==0)
nyr_3->flag=1;
else
nyr_3->flag=0;
}
else
nyr_3->flag=1;
}
else
nyr_3->flag=0;
}
void xingqi(struct nyr * nyr_4) /* 判断某年某月某日是星期几的函数 */
{
int count,k,t;
t=nyr_4->month-1;
runnian(nyr_4);
if(nyr_4->flag)
k=29;
else
k=28;
count=31*(t/1&&1)+k*(t/2&&1)+31*(t/3&&1)+30*(t/4&&1)+31*(t/5&&1)+30*(t/6&&1)+31*(t/7&&1)+31*(t/8&&1)+30*(t/9&&1)+31*(t/10&&1)+30*(t/11&&1)+31*(t/12&&1)+nyr_4->day;
nyr_4->weekday=((nyr_4->year-1)+(nyr_4->year-1)/4-(nyr_4->year-1)/100+(nyr_4->year-1)/400+count)%7;
}
void print_calendar(struct nyr * nyr_5) /*打印某年的全年日历的函数 */
{ int j,k,firstday=1,count,da;
runnian(nyr_5);
if(nyr_5->flag)
k=29;
else
k=28;
for(nyr_5->month=1;nyr_5->month<=12;nyr_5->month++)
{
printf("\n\n%4d年%2d月\n0 1 2 3 4 5 6 \nS M T W T F S\n",nyr_5->year,nyr_5->month);
xingqi(nyr_5);
for(j=1;j<=(nyr_5->weekday%7)*6;j++)
printf(" ");
switch(nyr_5->month)
{
case 1:count=31;break;
case 2:count=k; break;
case 3:count=31;break;
case 4:count=30;break;
case 5:count=31;break;
case 6:count=30;break;
case 7:count=31;break;
case 8:count=31;break;
case 9:count=30;break;
case 10:count=31;break;
case 11:count=30;break;
case 12:count=31;break;
}/*switch*/
for(j=1,da=1;j<=7-nyr_5->weekday;j++,da++)
{
printf("%2d ",da);
if(!((nyr_5->weekday+j)%7))
printf("\n");
}/*for*/
for(j=1;da<=count;j++,da++)
{printf("%2d ",da);
if(!(j%7))
printf("\n");
}/*for*/
}/*for*/
}/*print_calendar*/
int main() /*主函数,带返回值*/
{char answer;
nyr_1.year=nyr_1.month=nyr_1.day=0;
nyr_2=&nyr_1;
while(1)
{int option;
printf("1.查询某年某月某日是星期几\n");
printf("2.查询某年是否是闰年\n");
printf("3.打印某年的全年日历\n");
printf("4.退出\n");
printf("请输入你所需要的操作:");
scanf("%d",&option);
switch(option) /*判断某项操作的开关语句*/
{
case 1:
do
{printf("\n请输入年月日(****,**,**)(注意输入格式,要输逗号!):");
scanf("%d,%d,%d",&nyr_1.year,&nyr_1.month,&nyr_1.day);
if(nyr_1.month<1||nyr_1.month>12)
printf("输入的月份不正确\n");
else
{
xingqi(nyr_2);
printf("\n%d年%d月%d日是星期%d,是否继续查询(Y/N)?:",nyr_1.year,nyr_1.month,nyr_1.day,nyr_1.weekday);
scanf("%s",&answer);
}
}while(answer=='Y'||answer=='y');
break;
case 2:
do
{printf("\n请输入要查哪一年?(****):");
scanf("%d",&nyr_1.year);
runnian(nyr_2);
if(nyr_1.flag)
printf("\n%d是闰年,是否继续查询(Y/N)?:",nyr_1.year);
else
printf("\n%d不是闰年,是否继续查询(Y/N)?:",nyr_1.year);
scanf("%s",&answer);
}while(answer=='Y'||answer=='y');
break;
case 3:
do
{printf("\n请输入要打印的年份(****):");
scanf("%d",&nyr_1.year);
print_calendar(nyr_2);
printf("\n是否继续打印(Y/N)?:");
scanf("%s",&answer);
}while(answer=='Y'||answer=='y');
break;
case 4:
printf("\n是否真的要退出?(Y/N):");
scanf("%s",&answer);
if(answer=='Y'||answer=='y')
exit(0);
else
break;
default :printf("错误!只能输入1至4中的某个整数!");
}/*switch*/
}/*while*/
return 1;
}
本程序在VC++6.0环境下编译通过。