绥化学院程序设计实践实验报告范例 参考
实 验 六:万年历
实验目的:
1、复习、巩固C语言的基础知识,进一步加深对C语言的理解和掌握;
2、将课本上的理论知识和实际有机的结合起来,锻炼分析解决实际问题的能力 3、提高学生适应实际,实践编程的能力。
实验内容:
程序一:编写万年历 小组分工情况
小组分工情况统计表 信息工程学院 计算机科学与技术专业 2012级 软件工程(方向)
班级 班 组 名称 项目组长 组员 组员学号 工作简介 学生成绩管理系统 (本次项目小组组长) 一 需求分析 万年历能实现一些功能,主要包括以下几点:
(1)日历显示功能。能根据系统日期进行初始化,如果没有任何输入,则显示系统日期所在月份的月历。
判断星期,但根据蔡勒公式,可以很容易地有年月日推断出星期: nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday; w=nDay%7;
其中year:要查询的年份
nday:从该年的一月一日起到该天的天数 w:得出的星期数,w==0表示星期天。
在打印月历时,只要知道第一天的星期,就可以依次输入后面的日期,通过定长度输出日期,在遇到某天时星期六时,就换行输出,因此可以按照月历的格式输出。对于初始输入当前月历,可以通过
gmt=localtime(&timer);
gmt就是一个时间结构体,可以从中取出年月日.
(2)日历查询、闰年判断功能。输入日期进行查询,显示查询日期所在月份的月历,还将显示所在年份是否为闰年
能被4整除但不能被100整除,或者能被400整除的年份为闰年,否则为平年。日期的查询,就是直接打印改天所在月份的月历
(3)参数检查功能。如果输入日期不合法,查询将被拒绝,并显示提示信息。
判断日期是否合法,可以先判断年月日是否有小于0的值,月和日是否有超出最大值12和
16
绥化学院程序设计实践实验报告范例 参考
31 ,如果通过此判断合法,再判断是否时闰年,如果时闰年,则判断二月份是否满足要求,闰年二月份不能超过29天,平年二月份不能超过28天。在查询过程中,如果发现输入不合法或者不满足输入要求,则要求重新输入。
(4)通过键盘操作(如:光标上、下、左、右移动键,pageup、pagedown键)调整年份、月份和日期,并显示调整后的日期及月历。
捕获键盘的输入,通过两个getch();将后一个getch()的返回值付给整型或字符型k,k为相应键的ascii值,判断ascii值,就可以知道时哪个键的输入。若捕获到某键的输入,则设置相应的年或月或日的值,再进行刷性输出,就可以实现日期的调整。 二 总体设计(visio)
本系统包括4个模块,分别是功能控制模块﹑打印输出模块﹑日历显示模块和键值获取模块。
1、功能控制模块。该模块用于实现日期有效性检查﹑判断是否是闰年和返回指定日期对应的日期。
2、打印输出模块。该模块主要是进行输出显示,包括打印指定个数的空格﹑打印分隔线﹑打印用户使用手册﹑打印当前日期对应的星期以及打印指定的星期。
3、日历显示模块。该模块是系统的核心模块,是用来显示指定日期所在月份的月历。 4、键值获取模块。该模块接受键盘操作,获取键值,来进行日期调整,并调用日历显示模块中的函数来显示调整后的日历。
万年历
功打 日键能印 历值控输 显获制出 示取模模 模模块 块 块 块 日日修帮 历历改助 显查日退 期 示 询 出 图2-1功能模块图
总函数流程图
17
绥化学院程序设计实践实验报告范例 参考
图3-1总函数流程图 三、详细设计
(1)由于万年历具有以下特点:
平年365天(52周+1天),闰年366天(52周+2天)。平年2月28天,闰年2月29天。 (2)根据万年历以上特点进行编写
1)首先对万年历年、月、日进行编写,编写程序先定义每月的天数为28天,如月份为1、3、5、7、8、10、12就定义天数为31天反之如果月份为4、6、9、11就输出天数为30天,由上可见2月份为28天但是如果为闰年就有29天就要定义一个数组存放天数,用while循环控制。
2)再对其中的星期进行编写:
由于公元1月1日设为星期六,故3月1日为星期三,可以用万年3月1日星期算法(特别是那个三)由于其公式为:某年3月1日星期几=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7
闰4百年3月1日星期算法(百年%4=0)其公式为:某年3月1日星期几=(年+年/4+月星期表+日+2天)%7例: 2000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
18
绥化学院程序设计实践实验报告范例 参考
平4百年3月1日星期算法(百年%4<>0)其公式为:某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7 例:2100年3月1日星期几=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7=8%7=星期一(注意:2100年是平年)
其中万年某日星期算法 其公式为:某日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
(1)int isleapYear(int year);
该函数判断某年是否是闰年,参数year表示要判断的年份,返回值1表示该年为闰年,0表示该年为平年。
int IsLeapYear( int year )
{if ((year %4 == 0) && (year % 100 != 0) ||(year % 400 == 0) ) return 1; else return 0; 流程图: 开始 Y Return 1 Year@0 N
Y N Year%4 Year0 Return 0 N Y
Return 0 Return 1 闰年判断 (2)struct tm* getDay();
该函数用以取得系统的时间。该函数没有参数,返回值类型为struct tm*,是一个包含时间的结构体
struct tm* getDay()//从系统取得当前时间 {
time_t timer; struct tm* gmt; time(&timer);
gmt=localtime(&timer); return gmt; }
(3)int getwDay(int year,int month,int day);
该函数用以根据一个日期推断星期,参数为要判断的年月日。返回值为整型,123456分别表示星期一到星期六,0表示星期天。
int getwDay(int year,int month,int day)//取得星期 {
int nday=0,nDay,i,w; for(i=0;i nday+=daysOfMonth[runYear(year)][i]; nday+=day; nDay=year-1+(year-1)/4-(year-1)/100+(year-1)/400+nday; w=nDay%7; return w; } 19 绥化学院程序设计实践实验报告范例 参考 (流程图!!!) 四、程序源代码 #include #define KEYNUMUp 0x48 #define KEYNUMDown 0x50 #define KEYNUMLeft 0x4b #define KEYNUMRight 0x4d #define KEYNUMPageUp 0x49 #define KEYNUMPageDown 0x51 int year,month,day; //全局变量记录时间 int daysOfMonth[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31, 30,31}}; int runYear(int year) //判断是否是闰年 { int flag=0; if(year@0==0||(year%4==0&&year0!=0)) flag=1; return flag; } struct tm* getDay()//从系统取得当前时间 { time_t timer; struct tm* gmt; time(&timer); gmt=localtime(&timer); return gmt; } int dayExame(int year,int month,int day)//检查日期是否正确 { if(year<0||month<1||month>12||day<1||day>31) return 0; switch(month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: if(day>31)return 0;break; case 4: case 6: case 9: case 11: 20 搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新医药卫生C语言程序设计实践实验题目 (4)全文阅读和word下载服务。
相关推荐: