
一道C语言的程序题,有人帮忙做下吗
【内容】:设计一个查询并打印万年历的程序。【步骤】:1.画出程序流程图;2.编写程序;3.调试程序,对调试过程中出现的问题进行分析,找出错误的原因并予改正;4.写出通过调...
【内容】:设计一个查询并打印万年历的程序。
【步骤】:
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整除,同时又能被400整除的年份是闰年。
2. 闰年的二月是28天,平年的二月是29天
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,所以该日是星期三。 展开
【步骤】:
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整除,同时又能被400整除的年份是闰年。
2. 闰年的二月是28天,平年的二月是29天
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,所以该日是星期三。 展开
1个回答
展开全部
完整的回答和代码还有运行效果放在我的博客上了
地址
http://hi.baidu.com/ybbmdf/blog/item/b6b35c82688eafa20cf4d2a5.html
下面是 片断截取
老岩答案:老是有人问,所以作了一个,但是没做优化和容错,骨干写出来了,要求就按照上面这位朋友的说法吧。先纠正错误。星期计算公式 是S=X-1+(X-1)/4-(X-1)/100+(X-1)/400+C不是S=X-1+(X-1)/4+(X-1)/100+(X-1)/400+C而且 s%7 是星期数 0 代表星期日 1~6 代表星期1~星期6闰年的判断是 (能被400整除) 或者 (能够被4整除 并且 不能被100整除)即: (x % 400 == 0) || (x % 4 == 0 && x % 100 != 0)还有。。闰年的二月是28天,平年的二月是29天
正好说反了。。言归正传:
另外为了你方便 代码也发到这 但是没有缩进 请自己调整吧
代码如下:
#include <stdio.h>
int rn(int nianfen)/*判断某年是否是闰年*/
{
if( ((nianfen % 4 == 0) && (nianfen % 100 != 0)) || (nianfen % 400 == 0))
return 1;
else
return 0;
}
int yf(int yuefen, int runnian)/*获得当月天数*/
{
int dyts;
switch(yuefen)
{
case 1: dyts=31;break;
case 2: dyts=28 + runnian;break;
case 3: dyts=31;break;
case 4: dyts=30;break;
case 5: dyts=31;break;
case 6: dyts=30;break;
case 7: dyts=31;break;
case 8: dyts=31;break;
case 9: dyts=30;break;
case 10: dyts=31;break;
case 11: dyts=30;break;
case 12: dyts=31;break;
}
return dyts;
}
int yuandan(int nian)/*元旦是星期几*/
{
return (nian-1+(nian-1)/4-(nian-1)/100+(nian-1)/400 + 1) % 7;
}
void prin(int yuefen,int nian)/*输入月份表*/
{
int i,dyts,xqdw,sun=0,x=0;
dyts = yf(yuefen,rn(nian));/*获得当月天数*/
printf("\n\t\t\t%d年%d月\n",nian,yuefen);
printf("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\n");
for(i=1; i<yuefen; i++)/*计算这个月的第一天是星期几*/
{
sun += yf(i,rn(nian));
}
xqdw = (sun+yuandan(nian)) % 7;
for(i=0; i<xqdw; i++)/*把当月1日的前几天空过去*/
{
printf("\t");
x++;
}
for(i=1; i<=dyts; i++)/*输入月份表*/
{
printf("%d",i);
x++;
if(x == 7)
{
printf("\n");
x=0;
}
else
{
printf("\t");
}
}
printf("\n");
}
void gn1()/*第一功能项*/
{
int nian,yue,ri,ri2=0,xq,x=1,i;
char pd;
printf("请输入年月日(格式:xxxx,xx,xx):");
scanf("%d,%d,%d",&nian,&yue,&ri);
for(i=1; i<yue; i++)
{
ri2 += yf(i,rn(nian));
}
ri2 += ri;/*日期是当年的那一天*/
xq = (nian-1+(nian-1)/4-(nian-1)/100+(nian-1)/400+ri2) % 7;/*计算星期*/
do
{
if(xq == 0)
printf("%d年%d月%d日是星期日,是否继续查询(Y/N)\n",nian,yue,ri);
else
printf("%d年%d月%d日是星期%d,是否继续查询(Y/N)\n",nian,yue,ri,xq);
scanf("%c",&pd);
scanf("%c",&pd);
if(pd == 'y' || pd == 'Y')
{
x = 1;
gn1();
}
else
{
if(pd == 'n' || pd == 'N')
{
x = 1;
}
else
{
x = 0;
printf("选择错误请重新输入:\n");
}
}
}
while(x != 1);
}
void gn2()/*第二功能项*/
{
int nian,x=1;
char pd;
printf("请输入要查哪一年? (格式:xxxx):");
scanf("%d",&nian);
do
{
if(rn(nian) == 1)
printf("%d年是闰年,是否继续查询(Y/N)?",nian);
if(rn(nian) == 0)
printf("%d年是平年,是否继续查询(Y/N)?",nian);
scanf("%c",&pd);
scanf("%c",&pd);
if(pd == 'y' || pd == 'Y')
{
x = 1;
gn2();
}
else
{
if(pd == 'n' || pd == 'N')
{
x = 1;
}
else
{
x = 0;
printf("选择错误请重新输入:\n");
}
}
}
while(x != 1);
}
void gn3()/*第三功能项*/
{
int nian,x=1,i;
char pd;
printf("请输入要打印的年份(格式:xxxx):");
scanf("%d",&nian);
do
{
if(x == 1)/*正常输出*/
{
printf("\n\n");
for(i=1; i<=12; i++)/*输出月份表*/
{
prin(i,nian);
}
}
printf("是否继续打印(Y/N)?");
scanf("%c",&pd);
scanf("%c",&pd);
if(pd == 'y' || pd == 'Y')
{
x = 1;
gn3();
}
else
{
if(pd == 'n' || pd == 'N')
{
x = 1;
}
else
{
x = 0;
printf("选择错误请重新输入:\n");
}
}
}
while(x != 1);
}
int caidan()/*菜单项*/
{
int x;
printf("万年历功能菜单\n1. 查询某年某月某日是星期几\n2. 查询某年是否是闰年\n3. 打印某年的全年日历\n4. 退出\n");
printf("请输入您的选择:");
scanf("%d",&x);
switch(x)
{
case 1:gn1();return 0;
case 2:gn2();return 0;
case 3:gn3();return 0;
case 4:return -1;
default:printf("输入错误请重新输入!\n");return 0;
}
}
void main()
{
int pd=0;
do
{
printf("\n\n");
if(pd == 0)
{
pd = caidan();
}
}
while(pd != -1);
printf("程序成功退出!\n");
}
vc6.0调试通过
地址
http://hi.baidu.com/ybbmdf/blog/item/b6b35c82688eafa20cf4d2a5.html
下面是 片断截取
老岩答案:老是有人问,所以作了一个,但是没做优化和容错,骨干写出来了,要求就按照上面这位朋友的说法吧。先纠正错误。星期计算公式 是S=X-1+(X-1)/4-(X-1)/100+(X-1)/400+C不是S=X-1+(X-1)/4+(X-1)/100+(X-1)/400+C而且 s%7 是星期数 0 代表星期日 1~6 代表星期1~星期6闰年的判断是 (能被400整除) 或者 (能够被4整除 并且 不能被100整除)即: (x % 400 == 0) || (x % 4 == 0 && x % 100 != 0)还有。。闰年的二月是28天,平年的二月是29天
正好说反了。。言归正传:
另外为了你方便 代码也发到这 但是没有缩进 请自己调整吧
代码如下:
#include <stdio.h>
int rn(int nianfen)/*判断某年是否是闰年*/
{
if( ((nianfen % 4 == 0) && (nianfen % 100 != 0)) || (nianfen % 400 == 0))
return 1;
else
return 0;
}
int yf(int yuefen, int runnian)/*获得当月天数*/
{
int dyts;
switch(yuefen)
{
case 1: dyts=31;break;
case 2: dyts=28 + runnian;break;
case 3: dyts=31;break;
case 4: dyts=30;break;
case 5: dyts=31;break;
case 6: dyts=30;break;
case 7: dyts=31;break;
case 8: dyts=31;break;
case 9: dyts=30;break;
case 10: dyts=31;break;
case 11: dyts=30;break;
case 12: dyts=31;break;
}
return dyts;
}
int yuandan(int nian)/*元旦是星期几*/
{
return (nian-1+(nian-1)/4-(nian-1)/100+(nian-1)/400 + 1) % 7;
}
void prin(int yuefen,int nian)/*输入月份表*/
{
int i,dyts,xqdw,sun=0,x=0;
dyts = yf(yuefen,rn(nian));/*获得当月天数*/
printf("\n\t\t\t%d年%d月\n",nian,yuefen);
printf("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\n");
for(i=1; i<yuefen; i++)/*计算这个月的第一天是星期几*/
{
sun += yf(i,rn(nian));
}
xqdw = (sun+yuandan(nian)) % 7;
for(i=0; i<xqdw; i++)/*把当月1日的前几天空过去*/
{
printf("\t");
x++;
}
for(i=1; i<=dyts; i++)/*输入月份表*/
{
printf("%d",i);
x++;
if(x == 7)
{
printf("\n");
x=0;
}
else
{
printf("\t");
}
}
printf("\n");
}
void gn1()/*第一功能项*/
{
int nian,yue,ri,ri2=0,xq,x=1,i;
char pd;
printf("请输入年月日(格式:xxxx,xx,xx):");
scanf("%d,%d,%d",&nian,&yue,&ri);
for(i=1; i<yue; i++)
{
ri2 += yf(i,rn(nian));
}
ri2 += ri;/*日期是当年的那一天*/
xq = (nian-1+(nian-1)/4-(nian-1)/100+(nian-1)/400+ri2) % 7;/*计算星期*/
do
{
if(xq == 0)
printf("%d年%d月%d日是星期日,是否继续查询(Y/N)\n",nian,yue,ri);
else
printf("%d年%d月%d日是星期%d,是否继续查询(Y/N)\n",nian,yue,ri,xq);
scanf("%c",&pd);
scanf("%c",&pd);
if(pd == 'y' || pd == 'Y')
{
x = 1;
gn1();
}
else
{
if(pd == 'n' || pd == 'N')
{
x = 1;
}
else
{
x = 0;
printf("选择错误请重新输入:\n");
}
}
}
while(x != 1);
}
void gn2()/*第二功能项*/
{
int nian,x=1;
char pd;
printf("请输入要查哪一年? (格式:xxxx):");
scanf("%d",&nian);
do
{
if(rn(nian) == 1)
printf("%d年是闰年,是否继续查询(Y/N)?",nian);
if(rn(nian) == 0)
printf("%d年是平年,是否继续查询(Y/N)?",nian);
scanf("%c",&pd);
scanf("%c",&pd);
if(pd == 'y' || pd == 'Y')
{
x = 1;
gn2();
}
else
{
if(pd == 'n' || pd == 'N')
{
x = 1;
}
else
{
x = 0;
printf("选择错误请重新输入:\n");
}
}
}
while(x != 1);
}
void gn3()/*第三功能项*/
{
int nian,x=1,i;
char pd;
printf("请输入要打印的年份(格式:xxxx):");
scanf("%d",&nian);
do
{
if(x == 1)/*正常输出*/
{
printf("\n\n");
for(i=1; i<=12; i++)/*输出月份表*/
{
prin(i,nian);
}
}
printf("是否继续打印(Y/N)?");
scanf("%c",&pd);
scanf("%c",&pd);
if(pd == 'y' || pd == 'Y')
{
x = 1;
gn3();
}
else
{
if(pd == 'n' || pd == 'N')
{
x = 1;
}
else
{
x = 0;
printf("选择错误请重新输入:\n");
}
}
}
while(x != 1);
}
int caidan()/*菜单项*/
{
int x;
printf("万年历功能菜单\n1. 查询某年某月某日是星期几\n2. 查询某年是否是闰年\n3. 打印某年的全年日历\n4. 退出\n");
printf("请输入您的选择:");
scanf("%d",&x);
switch(x)
{
case 1:gn1();return 0;
case 2:gn2();return 0;
case 3:gn3();return 0;
case 4:return -1;
default:printf("输入错误请重新输入!\n");return 0;
}
}
void main()
{
int pd=0;
do
{
printf("\n\n");
if(pd == 0)
{
pd = caidan();
}
}
while(pd != -1);
printf("程序成功退出!\n");
}
vc6.0调试通过
参考资料: 百度老岩 gabmyd@126.com
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询