资源描述
C语言课程设计汇报书
万年历系统设计
学院:理学院
专业:信息和计算科学
姓名:
指导老师:
序言
经过一个学期对《C程序设计》学习,同学们全部认为真正学到了有用知识,可能有部分人学不够理想,但不管怎样,这些知识全部为我们下一步学习打下了坚实基础。做这么一个课程设计,首先是为了检验我们一个学期来我们学习结果,其次也是为了让我们深入掌握和利用它,同时也让我们认清自己不足之处和微弱步骤,加以填补和加强。
本程序是一个万年历程序,能够查询1970年1月1日到211月1日中任意一天是星期几,只要在运行程序时根据要求输入年,月,日,程序就会把这一天是星期几显示子啊屏幕上;也能够输入一个年份和30天份,程序就会把该月份月历显示在屏幕上,使人一目了然。该程序能和现在天文学研究中所采取多种日历程序所能计算结果相一致。还有很多功效等着你去探讨。
这个程序花费了很多时间,用了一天时间去设计程序和调试程序,而在调试程序过程中,常常会出现部分不如意地方,所以程序就要修改。所以这么经过一次又一次修改以后,程序更显得人性化。
经过这一次程序设计,让我深深感受到程序员辛劳。
6月11日
【课程设计题目:万年历系统】
【要求】
1:程序功效多样;
2:输入日期能够判定该日期是星期几;
3:输入一个年份能够显示出该年全部月历;
4:输入一个年月能够显示该月月历;
5:输入一个年份能够判定该年是闰年还是平年;
6:能够退出。
进入程序
【系统总体功效设计框架】
1:日期查询
2:十二个月月历查询
3:月历查询
4:闰年判定
5:退出
1、输入年,月,日(1970,1--2100,1)
2、输入年
(0--5000)
3、输入年,月
(0,1—5000,12)
4、输入年
(0--5000)
闰、平年
该月月历
12个月历
星期**
屏幕显示
继续
Y,y
N
退出程序
【系统功效模块图】
关键功效模块1:
输入year,month,day
计算month和当年1月间隔了多少天r
r=r+(year/4)*1461+(year%4)*365+day
r=r%7
r==0
r==1
r==2
r==3
r==4
r==5
r==6
Sat
Sun
Mon
Tue
Wed
Thu
Fir
Y或y返回菜单
其它输入均退出
程序代码:
{printf("please input the day you want(2100,1,1>****,**,**>1970,1,1):");
scanf("%d,%d,%d",&year,&month,&day);
for(b=0,r=0;b<month;b++)
{
r=a[b]+r;
}
year=year-1972;
r=r+(year/4)*1461+(year%4)*365+day;
if(r%7==0)printf (" Today is Saturday.\n");
else if(r%7==1)printf(" Today is Sunday.\n");
else if(r%7==2)printf(" Today is Monday.\n");
else if(r%7==3)printf(" Today is Tuesday.\n");
else if(r%7==4)printf(" Today is Wednesday.\n");
else if(r%7==5)printf(" Today is Thursday.\n");
else printf(" Today is Firday.\n");
choose=getchar();
printf("Continue?(y/n):\n");
scanf("%c",&choose);
if (choose=='y'||choose=='Y') main();
}
关键功效模块2:
输入年月
判定输入年是否为定义年
是 否
总天数S=1
总天数S为定义年到输入年总天数
把S加上该年一月到输入月份天数,再加1
判定输入月份是否
为闰年中月份
是 否
该月是否大于二月
是 否
把S加上该 年一月
到输入月份天数
把S再加上该 把S加上该年年一月到输入 一月到输入月
月份天数 份天数
再加1
总天数为S
判定S最终一天为星期几
从这一天起依次输出输入月份天数直到该月底为止
程序代码:
{
static int t[12]={31,0,31,30,31,30,31,31,30,31,30,31};
int i,y,weekday=0;
long days=0;
if(leap_year(year)) t[1]=29;
else t[1]=28;
y=t[month-1];
if(year>)
{
days=(year-)*365+count_leap(year)+monthdays(month,year);
weekday=days%7;
}
else if(year<)
{days=(-year)*365+count_leap(year)+monthdays(month,year);
weekday=7-days%7;
}
else
{days=monthdays(month,year);weekday=days%7;}
for (i=1;i<weekday+2;i++)
printf ("\t");
for (i=1;i<=y;i++)
{if ((i+weekday-1)%7==0) printf ("\n\t%3d\t",i);
else printf ("%3d\t",i);};
}
关键功效模块3:
输入年份
判定从定义年到输入年份中
每个年份是否为闰年
是 否
闰年
每十二个月为366天
平年
每十二个月为365天
返回该年天数
程序代码:
{ int i;
if (year%4==0&&year%100!=0||year%400==0) i=1;
else i=0;
return i;
}
【用到语句】
1.<stdio.h>,<conio.h> /*头文件*/
2.main() /*主函数*/
3.printf(),
4.scanf()
5.a[] /*数组*/
6.if 语句
7.for 语句
8.void /*要调用到函数*/
【源程序代码】
#include<stdio.h>
#include <conio.h>
int main() //主函数
{ int leap_year(int y);
int count_leap(int year);
int monthdays(int month,int year);
void monthprint(int year,int month);
int year,month,day,b,r,number; //定义变量
char choose;
int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
printf("*********************************mainMeun***********************************\n");
printf(" 1:ri qi>>>xing qi ji.\n");
printf(" 2:yue li.\n");
printf(" 3:ri li.\n");
printf(" 4:run nian pan duan. \n");
printf(" 5:exit\n");
printf("\n");
printf("*****************************************************************************\n");
printf (" please input the number:");
scanf("%d",&number);
if(number==1)
{printf("please input the day you want(2100,1,1>****,**,**>1970,1,1):");
scanf("%d,%d,%d",&year,&month,&day); //输入要查询日期
for(b=0,r=0;b<month;b++) //计算输入月份和但年月份间隔了多少天
{r=a[b]+r;}
year=year-1972;
r=r+(year/4)*1461+(year%4)*365+day; //计算输入日期和1970,1,1间隔了多少天
if(r%7==0)printf (" Today is Saturday.\n");
else if(r%7==1)printf(" Today is Sunday.\n");
else if(r%7==2)printf(" Today is Monday.\n");
else if(r%7==3)printf(" Today is Tuesday.\n");
else if(r%7==4)printf(" Today is Wednesday.\n");
else if(r%7==5)printf(" Today is Thursday.\n");
else printf(" Today is Firday.\n");
choose=getchar();
printf("Continue?(y/n):\n"); //选择是否继续
scanf("%c",&choose);
if (choose=='y'||choose=='Y') main(); //主函数调用主函数本身
}
else if(number==2)
{ printf(" please input the year(5000>****>0):");
scanf("%d",&year); //输入要查询年份
for(month=1;month<13;month++) //循环输出12个月份月历
{ printf(" %dyear %dmonth\n",year,month);
printf("****************************************************************************\n");
printf(" Sun Mon Tue Wen Thu Fri Sat\n");
monthprint(year,month);
printf("\n");
printf("****************************************************************************\n");
}
choose=getchar();
printf("Continue?(y/n):\n\n");
scanf("%c",&choose);
if (choose=='y'||choose=='Y') main();
}
else if(number==3)
{ printf("please input the year and month(2100,1>****,**>1970,1):");
scanf("%d,%d",&year,&month); //输入要查询年,月
printf(" %dyear %dmonth\n",year,month);
printf("************************************************************************\n");
printf(" Sun Mon Tue Wen Thu Fri Sat\n");
monthprint(year,month); //
printf("\n");
printf("************************************************************************\n");
choose=getchar();
printf("Continue?(y/n):\n\n");
scanf("%c",&choose);
if (choose=='y'||choose=='Y') main(); }
else if(number==4)
{ printf(" please input a year5000>****>0:");
scanf("%d",&year); //输入要查询年份
if(leap_year(year))
printf("This is runyear.\n");
else printf("This is pingyear.\n");
choose=getchar();
printf("Continue?(y/n):\n\n");
scanf("%c",&choose);
if (choose=='y'||choose=='Y') main();
}
else //选择其它则退出
return 0;
}
int leap_year(int year) //判定是否闰年
{ int i;
if (year%4==0&&year%100!=0||year%400==0) i=1;
else i=0;
return i;
}
int count_leap(int year)
{ int i=0,j,min,max;
if(year>) {min=;max=year;}
else {min=year+1;max=;}
for(j=min;j<max;j++)
if(leap_year(j)) i++;
return i;
}
int monthdays(int month,int year) //该月天数
{ int sum=0,i,j;
if(year>=)
{ static int t[12]={31,0,31,30,31,30,31,31,30,31,30,31};
j=month-1;
if(leap_year(year)) t[1]=29;
else t[1]=28;
for(i=0;i<j;i++)
sum=sum+t[i];
}
else
{ static int t1[12]={31,30,31,30,31,31,30,31,30,31,0,31};
j=12-month;
if(leap_year(year)) t1[10]=29;
else t1[10]=28;
for(i=0;i<=j;i++)
sum=sum+t1[i];
}
return sum;
}
void monthprint(int year,int month) //输出该月月历
{ static int t[12]={31,0,31,30,31,30,31,31,30,31,30,31};
int i,y,weekday=0;
long days=0;
if(leap_year(year)) t[1]=29;
else t[1]=28;
y=t[month-1];
if(year>)
{days=(year-)*365+count_leap(year)+monthdays(month,year);
weekday=days%7;
}
else if(year<)
{days=(-year)*365+count_leap(year)+monthdays(month,year);
weekday=7-days%7;
}
else
{days=monthdays(month,year);weekday=days%7;}
for (i=1;i<weekday+2;i++) //输出该月第一天所在位置之前空格
printf ("\t");
for (i=1;i<=y;i++) //输出该月月历
{if ((i+weekday-1)%7==0) printf ("\n\t%3d\t",i);
else printf ("%3d\t",i);
};
}
【调试及分析过程】
1:在代码编辑器上输入以上程序代码后,保留并f9到tc3.0上运行
结果输出:
分析:运行后出现“菜单”,选项意思是:输入1,则确定一个日期是星期几。输入2,则是查询某年12个月历。输入3,则是查询某年某月月历。4,则是判定输入年是闰年还是平年。5,退出。
2:选择1后,再依据提醒输入****,**,**:,10,28
结果输出:
分析:输入你要查询年月以后,程序会经过计算输出该日星期号。然后,输出结果后,系统会问询你是否继续,输入y或Y,继续;输入N或n或其它字母全部会直接退出。
3:选择y后
结果输出:
4:选择2后,再依据提醒输入你想查询年份****:
结果输出:
分析:输入你要查询年份后,系统会经过计算得出每个月月历,然后输出。但因为输出窗口限制,结果只能看到部分。一样,输出结果后,系统仍然会问询是否继续。
5:选择3后,再依据提醒输入你要查询月份****,**:,6
结果输出:
分析:输入你要查询月份后,系统会经过计算得出该月月历图,然后输出。一样系统仍然会问询是否继续。
6:选择4后,再依据提醒输入你要查询年份****:2100
结果输出:
7:在程序成功测试之前出现关键问题是:
错误:程序经计算后得出月历开头第一行对不上下面。
分析:原因是在给每个月第一天前面空格时多空了一个位
只要将“i<=weekday;”改为“i<weekday;”即可。
【总结】
经历了这次课程设计设计和制作整个过程,我才发觉我知识贫乏和知识面狭窄,真实感受到程序设计困难性,只说时间上面,我总共花了二十多个小时。
这次作课程设计我也是收获很大,首先,我对C语言有了更深了解,使用起来也愈加熟练,原来有部分不知道和不熟悉函数,我学会用了。其次,我这一次找了不少资料,找专业书籍、上网找各方面资料,也使我学到了部分书本中学不到知识,让我长了见识。同时我们同学之间也相互探讨,也促进了我们同学之间感情。
这次作这一个设计,即使我自己觉很有成就感,不过这必竟是我第一次作C语言课程设计,肯定会有很多不足之处有待改善,相信以后我一定会做愈加好。对C语言在编写程序时用处有了更明确认识,知道了编写C程序通常法方步骤。最大收获是,编写程序时一定要有信心和勇气,要相信自己一定能够把这个程序编写出来。分析问题做出算法,想好思绪,在心里有个大致框架,然后按部就班记下自己想到每一点内容,把写下东西认真整理,查缺补漏,把部分细节地方补上,就这么一个貌似极难程序就写出来了。其实编程并不难,关键是要投入,要钻到里面去。下一步就是读程序了,读程序时一定要小心仔细,一条语句一条语句读,看是否能输出自己想要输出结果,假如发觉错误要立即改过来,再接着向下读,直到把程序调试完美无缺为止。
展开阅读全文