C语言课程设计万年历打印doc.docx
- 文档编号:17839872
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:24
- 大小:319.44KB
C语言课程设计万年历打印doc.docx
《C语言课程设计万年历打印doc.docx》由会员分享,可在线阅读,更多相关《C语言课程设计万年历打印doc.docx(24页珍藏版)》请在冰点文库上搜索。
C语言课程设计万年历打印doc
温馨提示
程序语言:
C、C++、C#、Python(红色字体表示本课设使用的程序设计语言)
图形功能选项:
Win32控制台程序(黑框、文本界面)、Win32程序、MFC、WinForm、DirectX10(黑体标明表示本课设的程序图形类别,默认为非图形界面Win32控制台程序)
数据结构:
基础类型、数组、链表、双向链表、搜索树(非平衡二叉树)、平衡二叉树、链表与平衡二叉树相结合、堆栈、队列、串、图(黑体标明表示本课设使用的数据结构)
C++语言项:
STL库(黑体标明表示使用C++的STL库)
编译环境:
Windows764位旗舰版(Linux及其他环境请谨慎下载)
集成开发环境:
VisualC++6.0、DEVC++、CodeBlocks、VisualStudio2015均可通过编译。
(若无法通过编译运行,则会用浅蓝色字体表示)
分多头文件编译:
否(所有代码基本都包含在一个文件内,如需试验头文件功能,请自行参考相关文献)
内容说明:
1、课设题目及预览内容将在第二页开始展示。
2、代码行数:
333行
3、目录所示内容,本文基本涵盖,如无内容,会在本页进行说明。
4、附录绝对包含用户使用手册及程序完整源代码和详细注释。
5、如需下载其他头文件(例如DirectX需另行配置),本文会在此进行说明。
6、本文撰写内容仅供学习参考,另外,由于本人水平有限,编写之处难免存在错误和纰漏,恳请各位老师或同学批评指正。
题目:
万年历显示
功能要求:
(1)输入一个年份,输出是在屏幕上显示该年的日历。
假定输入的年份在1940-2040年之间。
(2)输入年月,输出该月的日历。
(3)输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
功能
(二):
功能(三):
课程设计报告
课题:
学院:
专业:
学生姓名:
学号:
指导老师:
20XX年XX月XX日
摘要
万年历的主要功能是通过C语言编程实现查询某年的日历情况,并且可以查询某年月的日历情况,还可以对某年月日进行计算距今的天数和判断是否为公历节日,其功能和代码满足人性化设计和良好的编程规范要求。
关键词:
万年历,C语言编程,人性化设计
1总体设计
1.1需求分析
系统将以用户输入的信息进行功能的选择,提供某年日历的输出、某年某月日历的输出和距今天数的输出及节假日的判断这大三功能。
1.2功能流程图
本程序主要通过获取屏幕输入,然后进行字符串处理,选择相应的功能执行,最后打印输出信息。
功能流程图如下:
图1.1功能流程图
1.3功能模块图
图1.2功能模块图
2详细设计
2.1数据结构
建立日历信息结构体,结构体成员变量包括月末、月初星期几、屏幕信息左半边日历是否打印完毕。
typedefstructcalendar{
intmonth_end;//月末最后一天的数字
intfirst_day;//月初星期几0周日1周一......
intprintFinished;//打印完毕则为1,没打印完成则为0
}Calendar;
建立年月日信息结构体,结构体成员变量包括年份、月份、天数。
typedefstructdate{
intyear;
intmonth;
intday;
}Date;
2.2函数功能设计
本万年历系统主要分为三大功能,分别是打印某年日历、打印某年某月日历、打印距今天数和判断是否节假日,故分别设计三个函数实现三大功能,如下所示。
voidfirstFun(intyear,Calendarcal[]);//第一功能
voidsecondFun(intyear,intmonth,Calendarcal[]);//第二功能
voidthirdFun(intyear,intmonth,intday);//第三功能
各程序流程图如下:
3调试分析
3.1程序测试
运行程序之后,会进入主界面,如图3.1所示。
图3.1主界面图
随后,可分别通过输入年、年月、年月日实现三个功能的输出,具体如图3.2~3.4所示。
图3.2打印某年日历图
图3.3打印某年月日历图
图3.4计算距今天数图
3.2程序缺陷
1、该程序每次运行,只能执行一次,不能重复选择功能,属于设计缺陷。
2、对年份的不规范输入,可能出现与预期结果不一致的情况,如图3.5所示,理论应该输出12345年的日历,然而只是输出了12345年5月的日历,属于程序漏洞。
图3.5BUG展示图
4总结与体会
这个课程设计的难度在于打印输出日历,在设计过程中遇到问题,可以说是困难重重,因为毕竟是第一次做的,难免会遇到各种各样的问题,同时在设计过程中我也发现了自己的不足之处,对以前所学过的知识理解的不够深刻,掌握的不够牢固。
通过这次课程设计之后,我觉得以前学过的知识要重新温习才能够达到查漏补缺的效果。
我会在今后的日子里,努力学好程序设计,成为一名出色的工程师。
最后,这次的课程设计终于得以圆满完成。
其中,我在设计中也遇到了许许多多的问题,但在老师的指导和同学们的帮助下得到了解决,总的来说还不是这个程序还不是很完善,但我不会放弃继续完善这份程序,我会在课余时间里继续修改完善这份程序。
在此,感谢所有帮助过我的同学和指导老师。
参考文献
[1]谭浩强著.C程序设计(第四版).北京:
清华大学出版社,2010
[2]林锐著.高质量C编程指南.北京:
电子工业出版社,2001
[3]StephenA.Maguire.编程精粹:
编写高质量C语言代码.人民邮电出版社,2009
附录
用户使用手册
1、根据屏幕提示,输入即可。
2、输入年份,例如2018年,则会打印2018年的日历。
3、输入年月,例如201810(也可以尝试其他的分隔符,例如2018,10),则会打印2018年10的日历。
4、输入年月日,例如2018101(同上),则会输出距今的天数和输出具体的节假日。
程序源代码
#include
#include
#include
#include
#defineisPrime(year)((year%4==0&&year%100!
=0)||(year%400==0))//宏函数,判断是否为闰年
#defineTWELVEMONTH12//数组大小
#pragmawarning(disable:
4996)//消除VisualStdio编译环境的安全警告,其他编译环境可删除
//------------------------------
//----------结构体定义区---------
//------------------------------
typedefstructcalendar{
intmonth_end;//月末最后一天的数字
intfirst_day;//月初星期几0周日1周一......
intprintFinished;//打印完毕则为1,没打印完成则为0
}Calendar;
typedefstructdate
{
intyear;
intmonth;
intday;
}Date;
//----------------------------
//----------函数声明区---------
//----------------------------
voidjudgmentLeapYear(intyear,Calendar*cal);//判断闰年
intcalculateWeeks(inty,intm,intd);//计算该年月日是周几
voidfirstFun(intyear,Calendarcal[]);//第一功能
voidsecondFun(intyear,intmonth,Calendarcal[]);//第二功能
voidthirdFun(intyear,intmonth,intday);//第三功能
intdateDiff(structdatemindate,structdatemaxdate);//计算日期之间的间隔天数
intmain(void)
{
Calendarcal[TWELVEMONTH]={
{31},//1月
{28},//2月
{31},//3月
{30},//4月
{31},//5月
{30},//6月
{31},//7月
{31},//8月
{30},//9月
{31},//10月
{30},//11月
{31}//12月
};//初始化月份
intyear=2000,month=0,day=0;
intfun=0;
charcalendar[30]={'\0'};//用来处理输入
printf("Pleaseinputtheyourwhosecalendaryouwanttoknow:
");
fgets(calendar,30,stdin);
year=atoi(calendar);//得到年份
if(calendar[4]!
='\0')
month=atoi(calendar+4);//得到月份
if(strlen(calendar)>=8)
day=atoi(calendar+strlen(calendar)-2);
if(0!
=year&&0==month&&0==day)
fun=1;
else
fun=0==day?
2:
3;
judgmentLeapYear(year,&cal[1]);//调整闰年平年2月的天数
inti=0;
for(i=0;i cal[i].first_day=calculateWeeks(year,i+1,1); switch(fun){ case1: firstFun(year,cal);break; case2: secondFun(year,month,cal);break; case3: thirdFun(year,month,day);break; } return0; } voidjudgmentLeapYear(intyear,Calendar*cal) { if(((year%4==0)&&(year%100! =0))||(year%400==0)) cal->month_end=29; else cal->month_end=28; } intcalculateWeeks(intyear,intmonth,intday) { intc,w,y; y=year%100;//年 如2015即年是15年 c=year/100;//年份前两位 如2015即20 if(month==1||month==2){//判断月份是否为1或2 y--; month+=12;//某年的1、2月要看作上一年的13、14月来计算 } w=y+y/4+c/4-2*c+13*(month+1)/5+day-1;//蔡勒公式 while(w<0)w+=7;//确保余数为正 w%=7; returnw; } voidfirstFun(intyear,Calendarcal[]) { printf("|===================TheCalendarofYear%d====================|\n",year); intmonth=1; for(month=1;month<=TWELVEMONTH/2;month++){ printf("|%dSUNMONTUEWEDTHUFRISAT%2dSUNMONTUEWEDTHUFRISAT|\n",month,month+6); intright=1,left=1; inti=0; for(right=1,left=1;1;left++){ if(1==left){//左边首日打印 printf("|"); for(i=0;i printf("");; printf("%4d",left); if(6==calculateWeeks(year,month,left)){//既是首日也是周六 printf(""); } } elseif(left==cal[month-1].month_end){//左边月末打印 printf("%4d",left); for(i=0;i<6-calculateWeeks(year,month,left);i++) printf(""); printf(""); cal[month-1].printFinished=1;//月末,则表示左边日历打印完毕 } elseif(6==calculateWeeks(year,month,left)&&left<=cal[month-1].month_end){//左边日历的周六,则开始打印右边的日历 printf("%4d",left); for(i=0;i<6-calculateWeeks(year,month,left);i++) printf(""); printf(""); } elseif(1==cal[month-1].printFinished){//左边打印完毕则补齐空格 for(i=0;i<8;i++) printf(""); printf(""); } else printf("%4d",left); if(6==calculateWeeks(year,month,left)&&left<=cal[month-1].month_end||cal[month-1].printFinished){ for(;;right++){ if(1==right){//右边首日打印 for(i=0;i printf("");; printf("%4d",right); if(6==calculateWeeks(year,month+6,right)){//既是首日也是周六 printf("|\n|"); right++; break; } } elseif(right==cal[month-1+6].month_end){//右边月末打印 printf("%4d",right); for(i=0;i<6-calculateWeeks(year,month+6,right);i++) printf(""); printf("|\n|"); cal[month-1+6].printFinished=1;//月末,则表示右边日历打印完毕 right++; break; } elseif(6==calculateWeeks(year,month+6,right)&&right<=cal[month-1+6].month_end){//右边日历的周六,则开始打印左边的日历 printf("%4d|\n|",right); right++; break; } elseif(cal[month-1+6].printFinished){//右边打印完毕则补齐空格 for(i=0;i<7;i++) printf(""); printf("|\n|"); right++; break; } else printf("%4d",right); } } if(cal[month-1].printFinished&&cal[month-1+6].printFinished){ putchar('\r');//将光标跳到本行的开头,消除多余的打印字符 break; } } } putchar('|'); inti=0; for(i=0;i<65;i++) putchar('='); putchar('|'); putchar('\n'); } voidsecondFun(intyear,intmonth,Calendarcal[]) { printf("|======TheYear%dMonth%d=====|\n",year,month); printf("|%dSUNMONTUEWEDTHUFRISAT|\n",month); inti=1,j=1; for(i=1;i<=cal[month-1].month_end;i++){ if(1==i){//首日打印 printf("|"); for(j=0;j printf(""); printf("%4d",i); if(6==calculateWeeks(year,month,i)){//既是首日也是周六 printf("|\n|"); } } elseif(6==calculateWeeks(year,month,i)){//周六换行 printf("%4d|\n|",i); } elseif(i==cal[month-1].month_end){//月末 printf("%4d",i); for(j=0;j<6-calculateWeeks(year,month,i);j++) printf(""); printf("|\n"); } else printf("%4d",i); } putchar('\r'); putchar('|'); for(i=0;i<32;i++) putchar('='); putchar('|'); putchar('\n'); } voidthirdFun(intyear,intmonth,intday) { time_tt; structtm*timeinfo; Dated1={year,month,day}; Dated2; charch[20]={'\0'};//用于存储周几 charfestival[20]={'\0'};//用于存储节日 intiDayNum=0; time(&t);//获取今天的日期 timeinfo=localtime(&t); d2.year=timeinfo->tm_year+1900; d2.month=timeinfo->tm_mon+1; d2.day=timeinfo->tm_mday; iDayNum=(dateDiff(d1,d2)); switch(calculateWeeks(d1.year,d1.month,d1.day)) { case0: strcpy(ch,"Sunday");break; case1: strcpy(ch,"Monday");break; case2: strcpy(ch,"Tuesday");break; case3: strcpy(ch,"Wednesday");break; case4: strcpy(ch,"Thursday");break; case5: strcpy(ch,"Friday");break; case6: strcpy(ch,"Saturday");break; } if(1==d1.month&&1==d1.day) strcpy(festival,"Newyear'sDay");//元旦 elseif(3==d1.month&&8==d1.day) strcpy(festival,"InternationalWomen'sDay");//国际妇女节 elseif(3==d1.month&&12==d1.day) strcpy(festival,"ArborDay");//植物节 elseif(4==d1.month&&5==d1.day) strcpy(festival,"QingmingFestival");//清明节 else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 万年历 打印 doc