



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C 语言课程设计报告-万年历设计人:贾伟涛学号: 2013010912班级: 13 电信应电班指导老师:张伟日期:2014年 6月 9日内容提要通过大一下学期对 C 语言的学习,了解到了很多 C 语言的相关知识。学习的过程虽然有很多困惑,但是当自己能够独立的看懂和独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。我虽然可以看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对c 语言的兴趣。C 语言是近年在国内外得到迅速推广应用的一种机器语言。C 语言功能丰富, 表达能力强, 使用灵活
2、方便, 应用面广, 目标程序效率高, 可移植性好, 既具有高级语言的优点,又具有低级语言的许多特点。因此,C语言特别适合于编写各种软件。在这次的课程设计中我将把日常生活中最经常接触的日历的查询,利用C语言的程序编成一个简单的万年历查询系统。通过这个小小的系统可以实现很多功能。在程序中你能看到很多熟悉的C 语言关键字,同时也加入了很多自己课外了解到的一些关键字。在不断的调试中最终才获得最为完整的程序。接下来就是我的语言课程设计的具体内容来了,大家拭目以待吧!C目 录一、系统功能和数据说明-二、问题分析 -三、程序总体设计及功能结构框图-四、程序流程图 -五、源程序代码 -六、使用说明 -七、个人
3、心得 -八、参考文献 -一、系统功能和数据说明(一)功能简介在日常生活中能接触到很多不同类型的日历,在日历上我们通常希望它能简单明了的给我们最想要的日期信息。在我的万年历系统当中,就是将日历,月历做的简单明了,很方便我们的查询使用。下面是它要实现的一些基本功能:C 语言编写万年历查询系统:(1) 输入年份,判断是否为闰年(2) 输入年月日,判断是星期几(3) 输入年份,打印出 12 个月的月历(4) 输入年月,打印出本月的日历另新增:(1) 对输入指令错误的提示(2) 加入了调用系统时间函数(3) 还添加了欢迎界面并进行界面优化(二)程序中的数据说明 int days12 = 31, 28,
4、31, 30, 31, 30, 31, 31, 30, 31, 30, 31;这是定义的关于每个月天数的数组,根据大小月以及二月份的特殊情况将每个月的天数变为数组中的元素存入数组当中。其中 days1=28, 是将闰年二月的天数 28 天作为初始元素存入。在经过 yearMonth 函数后就可以给 days1 中存入正确的月天数。 tm *tp;char *week="一"," 二"," 三 "," 四 "," 五 "," 六"," 日 "这两组数据设计都
5、利用了指针定义,利用指针可以提高程序的可读性,可以更方便使用。 这两个数组的作用是用于调用系统时间, 而定义的星期数组 *week 和年月日变量 *tp ,由于还没学到指针,在这里查阅了很多资料,并也借鉴了前辈们的很多程序。二、问题分析对于闰年的判断, 能被 4 整除但不能被 100 整除,或者能被 400 整除的年份为闰年,否则为平年。日期的查询,就是直接打印改天所在月份的月历。程序难点在于判断星期,但根据公式, 我们可以很容易地用年月日推断出星期:weekday=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7;其中 y
6、ear :要查询的年份day:从该年的一月一日起到该天的天数weekday:得出的星期数。在打印月历时, 只要知道第一天的星期, 就可以依次输入后面的日期, 通过一定长度输出日期, 在遇到某天时星期天时, 就换行输出, 因此可以按照月历的格式输出。对于初始输入当前系统时间,可以通过 <time.h> 中的 time和 localtime函数取出系统时间进行初始化。判断日期是否合法,if(year>=3000|year<=1600)|(month>=12|month<0)|(day>=31|day<=0)system("CLS"
7、);printf("输入错误,系统及即将返回!");Sleep(3000);goto tz;可以先判断年月日是否有小于 0 的值,月和日是否有超出最大值 12 和 31 ,如果通过此判断合法, 再判断是否时闰年, 如果时闰年, 则判断二月份是否满足要求,闰年二月份不能超过 29 天,平年二月份不能超过 28 天。在查询过程中,如果发现输入不合法或者不满足输入要求,则提示错误,并返回主菜单。三、程序总体设计及功能结构框图(一)功能结构框图闰年判星期查输出年输出月(二)程序设计头文件: #include<stdio.h>/系统时间显标准输入输出函数#include&
8、lt;stdlib.h>/清屏函数 system()#include<windows.h>/延时函数 Sleep()#include<time.h> /调用系统时间函数time ()在程序中运用了大量的自定义函数,都涉及为了使程序更简介明了。其中有:int isLeapYear(int year)/判断是否为闰年void hy()/欢迎信息;void Time() /获取系统时间;intwhichWeekday(intyear,intmonth,intday)/判断某天为星期几;void yearMonth(int year, int month)/打印某年某月的
9、月历;void monthDay(int year)/输入年份,打出个月历;void menu()/主菜单;void main()/主函数;这些函数的定义及其相应的内部程序共同构筑起了这个万年历查询系统的总程序。 其中 isLeapYear 函数是用来判断输入的年份是否为闰年, 实现了预计功能的第一个方面; whichWeekday 函数则是为了实现判断星期而编写的; yearMonth函数则是为了实现月历而编写的; Time()函数则是为调用系统时间而编写, 该 Time ()函数采用指针形式定义了 *week 数组和 *tp 变量 ; yearMonth ,monthDay 这两个函数的共
10、同使用就能够完成输出年历的功能。四、程序流程图(一)总流程图按键计算是否为闰计算星期数计算编辑接收输 出 是输出星期输出具体按键(二)算法说明1. 总天数的算法:isLeapYear 函数的使用,判断出了输入年份是否为闰年的信息。判断一年是否为闰年的方法是:该年分而能被4 整除但不能被100 整除,或者是能被400 整除。判断是否为闰年的流程图:2. 输入日期计算星期几:利用whichWeekday 函数可以判断出星期,然后对于输入的日期可以通过公式weekday=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7计算就可以输
11、出相应的星期数。int whichWeekday(int year, int month, int day)/判断某天为星期几int weekday;if (month = 1 | month = 2)/公式中要把月和月换成是上一年的月和月month += 12;year -= 1;weekday=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7; /计算星期的公式return weekday+1;3. 对输入信息的汇总:voidyearMonth( intyear,intmonth) /打 印 某 年 某 月 的 月 历
12、, voidmonthDay(intyear) / 输入年份,打出个月历;通过这两个函数可以将输入数据的具体信息通过完整日历的形式表示出来。void yearMonth(int year, int month)/ 打印某年某月的月历int i,j=0;int weekday; /计算这个月第一天是星期几weekday = whichWeekday(year, month, 1);printf("nprintf("%d 年 %d月 n",year,month); -n");printf("星期一星期二星期三星期四星期五星期六星期天n")
13、;if(isLeapYear(year) && month = 2)days1 = days1 + 1;printf("");for(i = 1; i < weekday; i +)printf("");for(i = 0; i < 8 - weekday; i +)printf("%6d", i+1);printf(" ");printf("n");for(i = 9-weekday; i <= daysmonth-1; i +,j+)if(j = 7)j =
14、 0;printf("n");printf("%6d ", i);printf("n-n");void monthDay(int year)/输入年份,打出个月历int i;for(i = 0; i < 12; i +)yearMonth(year,i+1);printf("nn");五、源程序代码#include<stdio.h>/标准输入输出函数#include<stdlib.h>/清屏函数 system()#include<windows.h>/延时函数 Sleep(
15、)#include<time.h> /调用系统时间函数time ()int days12=31,28,31,30,31,30,31,31,30,31,30,31;/每月的天数,闰年二月要加int isLeapYear(int year)/判断是否为闰年if(year%4 = 0 && year%100 != 0 | year%400 = 0)return 1;elsereturn 0;void hy()/欢迎信息printf("n欢迎使用万年历查询系统nn");Sleep(700);/延时毫秒printf("祝您每天好心情!nnn&qu
16、ot;);Sleep(1000);printf("版本: v2.0nnn");Sleep(1000);printf("正在进入功能菜单,请稍候n");Sleep(5000);/延时秒void Time() /获取系统时间time_t t;struct tm *tp;static char *week="一"," 二 "," 三 "," 四 "," 五"," 六 "," 日 "t=time(NULL);tp=local
17、time(&t);printf("tn");printf("tt系统时间日期:%d年%d月%d日",tp->tm_year+1900,tp->tm_mon+1,tp->tm_mday);printf(" %d:%d:%d ",tp->tm_hour,tp->tm_min,tp->tm_sec);printf("星期 %sn",week(tp->tm_wday)-1);printf("tn");int whichWeekday(int year,
18、int month, int day)/ 判断某天为星期几int weekday;if (month = 1 | month = 2)/公式中要把月和月换成是上一年的月和月month += 12;year -= 1;weekday=(day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7; /计算星期的公式return weekday+1;void yearMonth(int year, int month)/ 打印某年某月的月历int i,j=0;int weekday; /计算这个月第一天是星期几weekday = whichW
19、eekday(year, month, 1);printf("n%d 年 %d月n",year,month);printf("-n");printf("星期一星期二星期三星期四星期五星期六星期天n");if(isLeapYear(year) && month = 2)days1 = days1 + 1;printf("");for(i = 1; i < weekday; i +)printf("");for(i = 0; i < 8 - weekday; i +)pr
20、intf("%6d", i+1);printf(" ");printf("n");for(i = 9-weekday; i <= daysmonth-1; i +,j+)if(j = 7)j = 0;printf("n");printf("%6d ", i);printf("n-n");void monthDay(int year)/输入年份,打出个月历int i;for(i = 0; i < 12; i +)yearMonth(year,i+1);printf(
21、"nn");void menu()/主菜单printf("-n");printf("");printf("万年历查询系统 nn");printf("*n");printf("*1、输入年份,判断是否为闰年*n");printf("*2、输入年月日,判断该日为星期几*n");printf("*3、输入年份,打出个月历*n");printf("*4、输入月份,打出该月的日历*n");printf("*5、退出*
22、n");printf("*nn");void main()/主函数int num,year,month,day,weekday;char ch;while(1)system("CLS");/ 清屏hy();/欢迎信息tz:system("CLS");/goto语句跳转菜单标志Time();/调用系统函数menu();/菜单printf("请输入对应操作:");scanf("%d", &num);switch(num)case 1:system("CLS");
23、t1:printf("n请输入年份, 确定按回车 (格式:):n");/goto语句标志scanf("%d", &year);if(year>=3000|year<=1600)system("CLS");printf("输入错误,系统及即将返回!");Sleep(3000);goto tz;if(isLeapYear(year)printf("%d年是闰年。 n",year);elseprintf("%d年不是闰年。 n",year);printf(&qu
24、ot;提示 :n如继续运行请按 n 如回首菜单请按 n 如退出请按n 请选择: "); ch=getch(); if(ch='1')goto t1;/goto语句返回的t1if(ch='2')goto tz;/if(ch='0')执行主函数exit(0);/break;退出case 2:system("CLS");t2:printf("n请输入年月日,以空格隔开, 确定按回车(格式: 6 10 ) :n");scanf("%d%d%d", &year,&mont
25、h,&day);if(year>=3000|year<=1600)|(month>=12|month<0)|(day>=31|day<=0)system("CLS");printf("输入错误,系统及即将返回!");Sleep(3000);goto tz;weekday = whichWeekday(year, month, day);printf("这天是星期 %d。 nn",weekday);printf("提示 :n如继续运行请按 n 如回首菜单请按 n 如退出请按n 请选择
26、: ");ch=getch();if(ch='1')goto t2;if(ch='2')goto tz;if(ch='0')exit(0);break;case 3:system("CLS");t3:printf("n请输入年份, 确定按回车 (格式:):n");scanf("%d", &year);if(year>=3000|year<=1600)system("CLS");printf("输入错误,系统及即将返回!"
27、;);Sleep(3000);goto tz;monthDay(year);printf("提示 :n如继续运行请按 n 如回首菜单请按 n 如退出请按n 请选择: ");ch=getch();if(ch='1')goto t3;if(ch='2')goto tz;if(ch='0')exit(0);break;case 4:system("CLS");t4:printf("n请输入年份(格式:):n");scanf("%d", &year);printf(&
28、quot;请输入月份, 确定按回车 (格式:):n");scanf("%d", &month);if(year>=3000|year<=1600)|(month>=12|month<0)system("CLS");printf("输入错误,系统及即将返回!");Sleep(3000);goto tz;yearMonth(year,month);if(isLeapYear(year)&& month = 2)/如果年份为闰年,则月加天days1 = days1 + 1;printf("提示 :n如继续运行请按 n 如回首菜单请按 n 如退出请按 n 请选择: ");ch=getch();if(ch='1')goto t4;if(ch
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论