《万年历C语言课程设计报告书.doc》由会员分享,可在线阅读,更多相关《万年历C语言课程设计报告书.doc(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C语言课程设计报告书设计人 :查波学号 :院系 :电信学院班级 :电气11203指导老师 :杜红一设计要求1.能够显示星期。2.能够显示年月日。二设计目的1.通过本项课程设计,可以培养独立思考、综合运用所学有关相应知识的能力,能更好的巩固C语言程序设计课程学习的内容,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!更加了解了c语言的好处和其可用性!同时增加了同学之间的团队合作精神!更加也体会到以后在工作中团队合作的重要性和必要性!2.通过C语言课程设计,使学生了解高级程序设计语言的结构,掌握基本的程序设计过程和技巧,掌握基本的分析问题和利用计算机求解问题的能力,具
2、备初步的高级语言程序设计能力。为后续各门计算机课程的学习和毕业设计打下坚实基础。三设计思想1. 总天数的算法:首先用if语句判断定义年到输入年之间每一年是否为闰年,是闰年,该年的总天数为366,否则,为355。然后判断输入的年是否为定义年,若是,令总天数S=1,否则,用累加法计算出定义年到输入年之间的总天数,再把输入年的一月到要输出的月份之间的天数累加起来,若该月是闰年中的月份并且该月还大于二月,再使总天数加1,否则,不加,既算出从定义年一月一日到输出年的该月一日的总天数。2 .输出月份第一天为星期几的算法:使总天数除以7取余加2得几既为星期几,若是7,则为星期日。3. 算出输出月份第一天为星
3、期几的算法:算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并总该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。四 要用到的函数和语句1. /*头文件*/2.main() /*主函数*/3.printf(),4.scanf()5.if 语句6.for 语句7. IsLeapYear(int) /*定义函数*/流程图 输入的年份 判断从定义年到输入的年份中每个年份是否为闰年是 否每年为366天 每年为365天 返回该年的天数 输入的年月 判断输入年是否为定义年 是 否总天数=year_days总天数为定义年前到输入年的总天
4、数求出定义年第一天星期几判断输入的月份是否为闰年中的月份是 否该月是否是二月 是 否求该月的万年历依次执行加1求该月的万年 执行下步历总天数判断总天数的最后一天为星期几从这一天起依次输出输入月份的天数直到该月底为止五 程序运行结果六源代码#include int IsLeapYear(int); main()int i;int day;int year;int temp;int temp_i;long int Year_days = 0; /输入的年份之前的所有年的天数之和int Year_Start = 1; /当前年份int Per_Year_Days;int month_day=31,2
5、8,31,30,31,30,31,31,30,31,30,31,29; /第n月的天数printf(请输入年份: );scanf(%d,&year); while(Year_Start year) /求输入的年份之前的所有年的天数之和if( IsLeapYear( Year_Start ) ) /当前年份是闰年Per_Year_Days = 366; /则当前年份的天数为366天 else /当前年份是平年Per_Year_Days = 365; /则当前年份的天数为365天 Year_days = Year_days + Per_Year_Days; /当前年份之前的所有年的天数之和Year
6、_Start+; for( temp = 1; temp =12; temp+ ) /一个for循环内部嵌套一个for循环和两个while循环switch( temp )case 1:printf( *一月(%d)*n,year);break; /break:跳出switch语句,执行switch语句后面的语句 case 2:printf( *二月(%d)*n,year);break;case 3:printf( *三月(%d)*n,year);break;case 4:printf( *四月(%d)*n,year);break;case 5:printf( *五月(%d)*n,year);b
7、reak;case 6:printf( *六月(%d)*n,year);break;case 7:printf( *七月(%d)*n,year);break;case 8:printf( *八月(%d)*n,year);break;case 9:printf( *九月(%d)*n,year);break;case 10:printf( *十月(%d)*n,year);break;case 11:printf( *十一月(%d)*n,year);break;case 12:printf( *十二月(%d)*n,year);break;i = Year_days % 7; /输入的年份的前一年的最
8、后一天对应星期i(i=16)星期天(i=0)printf(星期一 星期二 星期三 星期四 星期五 星期六 星期天n);if( i != 0 ) /i=0不需输出空格for( temp_i = 0; temp_i i; temp_i+) /temp_i用来计输出的空格数printf( ); /输出七个空格,保持数据右对齐,输入的年份的第一天对应星期i+1 (i=05)星期天(i=6)day = 1;if( IsLeapYear(year) & temp = 2) /输入的年份为闰年且当前月份为2月(确定闰年二月的月历)while( day = month_day12 ) /day1 ) /(一个
9、if语句嵌套两个if语句)如果 day 1 ,则执行if( Year_days % 7 = 0 ),否则(即day=1)执行printf( %d ,day),(两个空格)if( Year_days % 7 = 0 ) /如果Year_days % 7 = 0,则执行printf(n);否则执行空语句“;”,不进行任何处理printf(n);if( day = 10 ) /如果if( day = 10 ),则执行printf( %d ,day),(一个空格);否则执行空语句“;”,不进行任何处理printf( %d ,day);/四个空格,当数大于10时与小于10的数右对齐elseprintf(
10、 %d ,day);/五个空格,当数小于10时与大于10的数右对齐Year_days+;/Year_days自增,day+;/day自增,换到下一天 else /输入的年份为平年 或 当前月份不是2月while (day = month_daytemp-1) /day 1 )/(一个if语句嵌套两个if语句)如果 day 1 ,则执行if( Year_days % 7 = 0 ),否则(即day=1)执行printf( %d ,day),(两个空格)if( Year_days % 7 = 0 )/如果Year_days % 7 = 0,则执行printf(n);否则执行空语句“;”,不进行任何
11、处理printf(n);if( day =10 ) /如果if( day = 10 ),则执行printf( %d ,day),(一个空格);否则执行空语句“;”,不进行任何处理printf( %d ,day);/四个空格,当数大于10时与小于10的数右对齐elseprintf( %d ,day);/五个空格,当数小于10时与大于10的数右对齐Year_days+;day+;printf(n); /外层for循环结束 /主函数结束 int IsLeapYear( int year ) /定义被调函数(用户函数),(不)是闰年则返回1 (0),使条件语句的条件为真(假)if (year %4 = 0) & (year % 100 != 0) | /输入的年份能被4且 不能被100整除 或(year % 400 = 0) ) /输入的年份能被400整除(为闰年)return 1; /条件语句的条件为真elsereturn 0; /条件语句的条件为假六 实验小结 为期两个星期的课程设计很是短暂,由于本人水平有限,程序设计比较简单,没有多少复杂的语句,这是一个很好的锻炼机会,很多以前没看懂的都得到了答案,程序虽小,也费了一番功夫,同时上网借鉴了别人的程序,深为感谢,感谢老师的指导。