CC++程序设计——万年历 完整代码+实验报告
c语言课程设计报告--万年历
c语言课程设计报告--万年历C 语言课程设计报告C语言课程设计报告实验课程:c语言课程设计年级:软件2班实验成绩:课程设计名称万年历姓名:**任课教师:杨** 学号:**** 实验日期:2014.6.11一、目的利用所学的知识解决生活中的实际问题。
本课题涉及的知识内容:时间函数,tm结构,for,do..while循环嵌套,if语句,指针,函数回调,结构体函数,文件创建与保存,自定义函数等语言内容。
二、内容与设计思想1.设计内容①显示系统当前时间②查询用户输入的时间③在用户输入的时间上,进行下一步的查询④对用户所需日期添加备忘,可供查看和添加2.主要代码结构main()函数调用了菜单函数,通过菜单函数来调用各个不同功能的函数。
3.主要代码段分析。
先显示系统时间,再通过列一个菜单来调用各个功能的函数;Themonth函数实现了对用户输入日期当月的处理,例如:日期的显示,日期与周几的对应等等。
Nextstep函数则是对输入日期的后续操作. Writetext、Readtext,、Changetext函数是对备忘录方面的操作,主要功能分别是写备忘,查看备忘,修改备忘。
三、使用环境本次上机实践所使用的平台和相关软件。
平台:Windows 2000相关软件:VC++四、调试过程1.测试结果分析经检验,运行结果正确五、总结1.设计中遇到的问题及解决过程调试过程中往往一个月的第一天与相对应的星期几对上比较棘手,通过查阅资料,找到了相应的函数;解决了问题备忘方面设计有关文件的读取方面的知识,在此之前,对文件的读取,修改比较,生疏模糊。
通过看书和上网寻找有关文件读取方面的例子,对文件有了初步的认识和应用。
期望备忘录功能中有修改功能,后期实在解决不了,换成了较为简单的添加功能。
2.设计体会和收获。
学会了如何通过现有资源解决问题;对c语言的有了更深的了解六、附录1.源代码#include "stdio.h"#include "time.h"#include "malloc.h"#include "stdlib.h"#include "string.h"typedef struct text{int num;char date[100];}Text[30],*pText;//函数声明void in_menu(void);void menu(void);void themonth(int,int);void nextstep(int,int);void Writetext(pText);void Readtext(void);void addtext(pText);void exit_calendar(void);int thelast(FILE*);//总菜单void allmenu(void){in_menu();//输出菜单menu();//选择菜单}//输出菜单void in_menu(void){printf(" △○日历查询及备忘系统○△\n");printf("\n");printf(" ===================1、日历==============================\n\n");printf(" ===================2、编辑备忘=========================\n\n");printf(" ===================3、查看备忘===========================\n\n");printf(" ===================4、添加备忘===========================\n\n");printf("====================5、退出==============================\n\n");printf("******************************************************* *********\n\n");printf("请选择菜单号码:");}//菜单选择void menu(void){struct text t;int i;scanf("%d",&i);switch(i){case 1:{//当前查询的月份int year;int month;printf("请输入要查询的年份及月份:\n"); scanf("%d %d",&year,&month); themonth(year,month);printf("按回车键返回主菜单!\n"); getchar();getchar();system("cls");allmenu();break;}case 2:{Writetext(&t);//写备忘printf("按回车键返回主菜单!\n"); getchar();getchar();system("cls");allmenu();break;}case 3:{Readtext();//查看备忘内容printf("按回车键返回主菜单!\n"); getchar();getchar();system("cls");allmenu();break;}case 4:{addtext(&t);//修改备忘printf("按回车键返回主菜单!\n"); getchar();getchar();system("cls");allmenu();break;}case 5:{exit_calendar();}default: break;}void nextmenu(int year,int month){int j;printf("===================1、结束本次查询,回菜=====================\n");printf(" ===================2、继续查询============================\n");scanf("%d",&j);if(j == 1){allmenu();}else{nextstep(year, month);}}/************************查询的当月*/void themonth(int year,int month){//定义变量struct tm t,*date;//tm结构指针time_t t_day;//声明time_t类型的变量t_dayint i,j;int day;if(month == 2 )//月份天数的判断if(year%4 == 0&&year%100 == 0||year%400 == 0)day = 28;elseday = 29;}else if(month == 4 || month == 6 || month == 9 || month == 11)//小月{day=30;}elseday=31;printf("查询日期当月天数是:%d\n日历\n",day); //输出当前天数printf("一\t二\t三\t四\t五\t六\t日\t\n"); //日历的第一行,显示一二三四五六日//功能:使当月中的每一天与对应的周几对齐for(i = 1;i <= day;i++){t.tm_year=year-1900;//从1900开始t.tm_mon=month-1;//月份【取值[0-11]】t.tm_mday=i;//一个月的日期[1-31]t.tm_hour=0;//时-取值区间t.tm_min=0;//分-取值区间t.tm_sec=0;//秒-取值区间t.tm_isdst=0;//夏令时标识符,实行夏令的时候为正否则为0t_day=mktime(&t);//date=gmtime(&t_day);if(i==1)for(j=0;jtm_wday;j++)printf("\t");}if(date->tm_wday == 6){printf("%d\n",i);}elseprintf("%d\t",i);}printf("\n\n");nextmenu(year,month);}bool sfnext(int * k)//判断是否继续{if((*k) == 1)return true;elsereturn false;}//是否进行后续操作void nextstep(int year,int month) {int m,k;do{printf("月历上翻请按-1,下翻请按1\n"); scanf("%d", &m);system("cls");if(m == 1){month += 1;printf("现在查询时间为%d年%d月的日历:\n",year,month); if(month/12 != 0){year = year + month/12;month = month % 12;}themonth(year,month);printf("是否继续查询,是:请按1\n");printf("否:请按0\n");scanf("%d",&k);}else if(m == -1){month -= 1;printf("现在查询时间为%d年%d月的日历:\n",year,month); if(month == 0){month = 12;year--;}if(month <= 0){month += 12;year--;}themonth(year,month);printf("是否继续查询,是:请按1\n");printf("否:请按0\n");scanf("%d",&k);}else{printf("error");}}while(sfnext(&k));}//读文件void Writetext(pText t){int len;char n;//读取文件FILE *fp;if((fp = fopen("C:\\text.txt","a+"))==NULL)//a+:以读写方式打开一个文件,允许读{printf("Cannot open the file ,press any key to exit");getchar();exit(0); //退出程序}printf("是否确定对某年某月某日进行备忘:y或n\n");getchar();scanf("%c",&n);if(n == 'y'||n == 'Y'){printf("请输入要添加备忘的数量:\n");scanf("%d",&len);printf("按格式输入(如:1 2014 6 17 c语言作业)\n");//输入需要备忘的年月日for(int i = 0;i < len; i++){printf("Num%d:",i+1);scanf("%d %s",&t[i].num ,&t[i].date);fprintf(fp,"%d %s\n",t[i].num ,t[i].date);//格式化读写}fclose(fp);}else{exit(-1);}}//判断文件是否读完int thelast(FILE*fp){if(fgetc(fp) == EOF)return 1;else{fseek(fp,-1L,SEEK_CUR);return 0;}}//查看备忘内容void Readtext(void){static char c[200];//文件输入FILE*fp;if((fp = fopen("c:\\text.txt","r")) == NULL){printf("文件不存在,按任意键退出.");exit(0);}else{printf("序号\n备忘内容\n");while(!thelast(fp)){fscanf(fp,"%s",c);//读取文件中的信息printf("%s\n",c);}printf("\n");}}void addtext(pText t){FILE *fp;int n,m;if((fp = fopen("C:\\text.txt","a+"))==NULL)//a+:以读写方式打开一个文件,允许读{printf("Cannot open the file ,press any key to exit");getchar();exit(0); //退出程序}printf("请输入要继续添加备忘的数量:\n");scanf("%d",&n);printf("已备忘数量:");scanf("%d",&m);printf("按格式输入(如:1 2014 6 17 c语言作业)\n");//输入需要备忘的年月日for(int i = 0;i < n; i++){printf("Addnum%d:",i+m+1);scanf("%d %s",&t[i+m].num ,&t[i+m].date);fprintf(fp,"%d %s\n",t[i+m].num ,t[i+m].date);//格式化读写}fclose(fp);}void exit_calendar(void)//退出系统{exit(1);}//主函数void main(){time_t now;//声明time_t类型变量time(&now);//获取时间printf("\n\t\t现在是:%s\n",ctime(&now));//系统时间allmenu();// nextstep(year, month,&t);//对当前月份的后续操作}。
c语言万年历实训报告
c语言万年历实训报告万年历是一种历法,用于记录每年的日期和星期。
在日常生活中,我们常常需要使用万年历来查询某一天是星期几,或者某个月有多少天。
因此,开发一个万年历程序可以方便我们的日常使用。
本次实训中,我们使用c语言开发了一个简单的万年历程序。
下面将介绍该程序的实现过程和功能。
一、程序界面该程序的界面非常简洁,只有一个输入框和一个查询按钮。
用户可以在输入框中输入日期,然后点击查询按钮,程序将会返回该日期对应的星期几和当月的日历。
二、程序功能1. 输入检查在程序中,我们使用了正则表达式来检查用户输入的日期是否符合格式要求。
具体而言,日期的格式应该为“YYYY-MM-DD”,其中YYYY表示年份,MM表示月份,DD表示日期。
如果用户输入的日期格式不正确,程序将会提示用户重新输入。
2. 星期查询当用户输入符合格式要求的日期后,程序将会计算该日期对应的星期几。
具体而言,我们使用了蔡勒公式来计算星期几。
该公式的计算过程较为复杂,不在此做详细介绍。
3. 月历输出除了星期几之外,程序还能输出当月的日历。
具体而言,程序将会输出该月份的日历表格,其中包括每天的日期和星期几。
为了使输出的日历表格美观整洁,我们使用了格式化输出的方式,将日期和星期几对齐输出。
三、程序实现在程序实现过程中,我们主要使用了c语言中的日期和时间相关函数。
具体而言,我们使用了time.h头文件中的函数来获取当前日期和时间,然后使用strftime函数将其格式化。
我们还使用了ctype.h头文件中的isxdigit函数来检查用户输入的日期格式是否正确,以及math.h头文件中的floor函数来对日期进行取整操作。
除此之外,我们还使用了c语言中的数组和循环语句来实现日历的输出。
具体而言,我们使用了一个二维数组来存储日历中每天的日期和星期几,然后使用循环语句将其输出到屏幕上。
四、程序测试在程序开发完成后,我们进行了多次测试,确保程序的功能正常。
具体而言,我们测试了以下几个方面:1. 输入检查:测试了输入正确日期和错误日期两种情况,确保程序能够正确检查用户输入的日期格式。
C语言万年历设计报告
C语言课程设计报告题目:编写万年历系统年级:专业:班级:姓名:学号:目录第1章设计目的第2章需求分析第3章概要设计第4章源程序清单第5章执行结果1)登陆界面2)显示当前日月历3)显示具体日期信息第6章程序问题调试与课程设计心得第1章设计目的设计目的(实验要求):1.模仿现实生活中的挂历.2.当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几).3.当系统日期变到下一月时,系统自动翻页到下一月.第2章需求分析(1)程序运行时,首先给出菜单选项和输入提示:(2)用户可以通过主菜单选择不同选项。
输入1,通过输入当前日期可显示当前月的日历;输入2,通过输入具体日期(中间以空格分开)可显示该日具体信息;输入3,则退出查询系统。
第3章概要设计1.菜单选择界面可通过下面所示函数时现;主要思路:通过while语句与swich…case以及if条件语句实现菜单的循环功能和不同选项的功能实现。
闰年与平年的判断:代码如下:void main(){int year,month,day,a,b;while(1){printf("\n\n\n\n");printf("**********************************************************\n\n");printf(" * * \n");printf(" Welcome to enter calendar system \n");printf(" * * \n\n");printf("**********************************************************\n\n\n");printf(" 1 The month of current date 2 Date 3 Exit\n");printf(" please import your choose<1~3>,press Enter to define: ");scanf("%d",&b);switch(b){case 1:printf("\n Please import the year,month and day which you want tocheck,the year,month and day separation by blank space: ");scanf("%d%d%d",&year,&month,&day);a=x3(year,month,1);if(a==0){printf("Error!Please import again.\n");break;}yueli(year,month,day);break;case 2:printf("\n Please import the year,month and day which you want to check,the year,month and day separation by blank space: ");scanf("%d%d%d",&year,&month,&day);a=x3(year,month,day);if(a==0){printf("Error!Please import again.\n");break;}rili(year,month,day);break;case 3:exit(0);default:printf("Error!Please import again.\n\n");}}2.闰年的判断:计算所输入的年份是否可被4整除,若不能被整除,为平年。
c语言课程设计报告 万年历系统
中国矿业大学徐海学院软件开发基础实践报告姓名:李岳学号: ******** 专业:计算机科学与技术指导教师:孙锦程职称:讲师2012 年 6 月30 徐州源代码#include <stdio.h>#include <conio.h> //getch(); tolower(); exit();#include <stdlib.h> //system();int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};char *weeks[7] ={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};char *months[12] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November","December"};bool isLeap(int year) //by theLeap(); theCalendar();/*判断是否为闰年*/{if(year%4 == 0 && year%100 != 0 || year%400 == 0) return 1;else return 0;}void theLeap() //by Select();/*输入输出改年是否为闰年的信息*/{int year;printf("\nPlease input the year: ");scanf("%d", &year);if( isLeap( year ) ){ printf("\nThe year %d is leap year.", year); }else { printf("\nThe year %d is not leap year.", year); }getch();}int Zeller(int year, int month, int day) //by theWeek(); printCalendar();/*判断星期的自定义函数*/{int c, y, m, d, w;if( month < 3) { year -= 1; month += 12; }c = year / 100;y = year % 100;m = month;d = day;w = y + y/4 + C/4 - 2*C + 26*(m+1)/10 + d - 1;w %= 7;return (w >= 0 ? w : w+7);}void theWeek() //by Select();/*对于输入的日期输出该天是星期几*/ {int year, month, day, w;printf("\n");do{printf("Please input the date(YYYY-MM-DD): ");scanf("%d-%d-%d", &year, &month, &day);if( isLeap( year ) ) days[1] = 29; //是否闰年else days[1] = 28;}while(!( (month > 0 && month < 13) && (day > 0 && day <= days[month - 1]) ) );w = Zeller(year, month, day);printf("\nThis day %d-%02d-%02d is %s.", year, month, day, weeks[w]);getch();}void printCalendar(int year, int month) //by details(); theCalendar();/*输出日期详情及表格*/{int w, d;w = Zeller(year, month, 1);printf("%28s", months[month - 1]);printf("\n -%02d-\n", month);printf(" SUN MON TUE WED THU FRI SAT\n");for(d = 0; d < w; d++) { printf(" "); }for(month--, d = 1; d <= days[month]; d++){printf("%4d", d);if( (d + w)%7 == 0 && d != days[month]) printf("\n"); }printf("\n============================\n");}void details(int year) //by theCalendar();/*月历详情函数*/ {int month;while(true){do{system("Cls");printf("Press '0' to exit.\n");printf("Please input the month: ");scanf("%d", &month);}while(!(month >=0 && month <= 12));if(month != 0){printf("\n");printf("Calendar %d\n", year);printCalendar(year, month);if( getch() == '0') break;}else break;}}void theCalendar() //by Select();{int year, month;printf("\nPlease input the year: ");scanf("%d", &year);if( isLeap( year ) ) days[1] = 29; //是否闰年else days[1] = 28;system("Cls");printf("Calendar %d\n", year);for(month = 1; month <= 12; month++){printCalendar(year, month);}printf("More details of each month ?[Y/N]");if( tolower(getch()) == 'y' ) details( year );}void Menu() //by main();/*程序的主菜单*/{system("cls");printf("1 -This year is leap year or not\n");printf("2 -This day is which day of the week\n"); printf("3 -The Calendar of this year\n");printf("0 -Exit\n\n");printf("Please select the options:");}void Select() //by main();/*按键的控制函数*/{char key;bool v = true;while( v ){key = getch();switch( key ){Case '1': theLeap(); v = false; break;Case '2': theWeek(); v = false; break;Case '3': theCalendar(); v = false; break; Case '0': exit(1);}}}void main(){while(true) { Menu(); Select(); }}。
万年历C语言报告范文1
万年历C语言报告范文1万年历实验报告---软件工程老师:班级:学号:姓名:-1-实验题目:编制一个万年历程序要求:输入一个年份(1-3000),然后显示12个月的月历,如屏幕显示不下,则应提供翻页功能。
一.实验目的通过实例使同学们掌握结构化数据流分析技术。
二.实验内容软件需求分析:1.总体而言,根据老师的要求来做一个万年历的C程序,要求分页输出每个月的月历,首先输入想要知道日历的年份,然后可按ENTER键逐月显示日历,这样就可以达到要求了。
3.求出一年中的第一天是周几(year+(year-1)/4-(year-1)/100+(year-1)/400)%7。
4.用FOR循环输出各月份的日历。
数据流图:软件设计与编码:实验完整代码:#include\longintf(intyear,intmonth){if(month<3)returnyear-1;elereturnyear;}longintg(intmonth){if(month<3)returnmonth+13;elereturnmonth+1;}longintn(intyear,intmonth,intday){return1461L某f(year,month)/4+153L某g(month)/5+day;}intw(intyear,intmonth,intday){return(int)((n(year,month,day)%7-621049L%7+7)%7);}intdate[12][6][7];intday_tbl[][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}};main(){intw,leap,i,j,k,wd,day;intyear;chartitle[]=\printf(\请输入您想要知道万年历的年份:\输入年某/canf(\输入年份值和掠过值后的回车某/w=w(year,1,1);for(k=0;k<7;k++)date[i][j][k]=0;/某日期表置0某/for(i=0;i<12;i++)/某一年十二个月某/-3-for(wd=0,day=1;day<=day_tbl[leap][i];day++){/某将第i+1月的日期填入日期表某/date[i][wd][w]=day;w=++w%7;/某每星期七天,以0至6计数某/if(w==0)wd++;/某日期表每七天一行,星期天开始新的一行某/}printf(\年的年历===========|\\n\for(i=0;i<12;i++){/某先测算第i+1月的最大星期数某/for(wd=0,k=0;k<7;k++)/某日期表的第六行有日期,则wd!=0某/wd+=date[i][5][k]+date[i+6][5][k];wd=wd6:5;put(\printf(\月%|\\n|\for(j=0;jprintf(\\for(k=0;k<7;k++)if(date[i][j][k])printf(\eleprintf(\\printf(\\printf(\}put(\canf(\键入回车输出下一个月的日历某/}put(\put(\按任意键退出...\getch();}截图:-4--5-三.总结1.实验内容总结经过运行和调试得到了想要的结果——“万年历”,任意输入一个年份能按当初设计的格式输出每个月份的日历。
c语言课程设计报告--万年历,最详细
C语言课程设计报告 -----万年历设计人:贾伟涛学号:2013010912班级:13电信应电班指导老师:张伟日期:2014年6月9日内容提要通过大一下学期对C语言的学习,了解到了很多C语言的相关知识。
学习的过程虽然有很多困惑,但是当自己能够独立的看懂和独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。
我虽然可以看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想——编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对c语言的兴趣。
C语言是近年在国内外得到迅速推广应用的一种机器语言。
C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。
因此,C语言特别适合于编写各种软件。
在这次的课程设计中我将把日常生活中最经常接触的——日历的查询,利用C语言的程序编成一个简单的万年历查询系统。
通过这个小小的系统可以实现很多功能。
在程序中你能看到很多熟悉的C语言关键字,同时也加入了很多自己课外了解到的一些关键字。
在不断的调试中最终才获得最为完整的程序。
接下来就是我的C语言课程设计的具体内容来了,大家拭目以待吧!目录一、系统功能和数据说明-----------------------二、问题分析---------------------------------三、程序总体设计及功能结构框图---------------四、程序流程图-------------------------------五、源程序代码-------------------------------六、使用说明---------------------------------七、个人心得---------------------------------八、参考文献---------------------------------一、系统功能和数据说明(一)功能简介在日常生活中能接触到很多不同类型的日历,在日历上我们通常希望它能简单明了的给我们最想要的日期信息。
CC++程序设计——万年历(完整代码+实验报告)
2、主要函数流程图: (1)类的构造函数:用于给类的对象赋值。提示用户输入数据,并具有较强的错误输 入数据检查功能。(参见图 3-1) (2)闰年判断函数:判断哪些年份为闰年。 (图 3-2)
正文 第 2 页(共 18 页)
开 始
开 始
year%4==0
否
输入待查询的 年份
是
否
year%100==0
* ","***** ","***** ","***** ","***** ","***** "," * ","***** ","***** "," * ","***** ","***** ","
"***** ","
=====================公元"<<year<<"年日历====================="<<endl; =====================公元"<<year<<"年日历====================="<<endl;
/*实现 3 维数组图案的输出*/ for(int g=0;g<5;g++) { cout<<" fout<<" for(int i=0;i<4;i++) for(int h=0;h<7;h++) { cout<<ss[g][num[i]][h]; fout<<ss[g][num[i]][h]; } cout<<endl; fout<<endl; } }
C语言程序设计报告《万年历》
《“万年历”》—C语言程序设计报告专业:计算机科学与技术班级:姓名:指导教师:年月日目录1.设计的任务 (3)2.对问题的分析理解 (3)3. 采用的算法(流程图) (5)4. 算法中涉及的知识点 (6)5.设计用的计算机环境 (6)6 结论 (6)7.源代码 (7)1.设计的任务1.1设计编写一个C程序—“万年历”。
1.2输入任一年将显示出该年的所有月份日期,对应的星期。
1.3 下一行显示星期,从周日到周六,中英文都可以。
1.4 下一行开始显示日期从1号开始,并按其是周几实际情况与上面的星期数垂直对齐。
1.5 月份:中文英文都可以,注意闰年情况。
2.对问题的分析理解2.1 要输入任一年显示出该年的所有月份日期,应该先设计具体的输出格式,如下:the calendar of the year2008.JanuarySun Mon Tue Wed Thu Fri Sat1 2 3 4 56 7 8 9 10 11 1213 14 15 16 17 18 1920 21 22 23 24 25 2627 28 29 30 31FebruarySun Mon Tue Wed Thu Fri Sat1 23 4 5 6 7 8 910 11 12 13 14 15 1617 18 19 20 21 22 2324 25 26 27 28 29=============================================…………2.2 判断是不是闰年 (year%4!=0||year%100==0&&year%400!=0)满足条件就是平年,把一年中的所有月份分为四类(28,29,30,31)。
2. 3 求出一年中的第一天是周几(year +(year-1)/4-(year-1)/100+(year-1)/400)%7。
2.4 有指针数组存放十二个月的英文和星期的英文缩写。
2.5 用FOR循环输出各月份的日历3. 采用的算法(流程图)开始定义整型变year,i=0,j=0,a,n,m=1,k=0和函数judge 定义一个指针变量**p定义两个字符型数组,month,week输入年份,yeara=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7i++,i<4n=judge(year,i+1),p=month+i输出月份回车Nj++,j<7输出星期回车k++,k<a输出六个空格m++,m<3输出占六个字节的天数(a+m)%7==0YY N输出回车n==2&&m==28YYn==3&&m==29break,退出本次循环break,退出本次循环n==4&&m==30break,退出本次循环Na=(a+m)%7回车输出”==============”结束NYYY Y4.算法中涉及的知识点4.1 定义整型,字符型,指针变量,字符型数组和指针数组。
万年历系统——C语言完整版
实验十九:编写一个万年历系统1.设计目的:从实验的角度来看,这次课程设计一方面可以让自己巩固并加深对C语言程序设计知识的理解,掌握和提高C语言编程和程序的基本调试的基本技能,进一步理解和运用结构化程序的思想和方法;另一方面,可以让自己在面对一个全新的问题时,学会如何思考,如何寻找问题的关键,从而提升自己的能力。
2.总体设计:1.、当前页以系统当前日期的月份为准,显示当前月的每一天(显示出日及对应的星期几);2、当系统日期变到下一个月时,系统自动翻页到下一月。
3.调试与测试:4.源程序清单和执行结果:#include <stdio.h>#include <conio.h>#include <stdlib.h>#include <time.h>int leap(int year ){if ((year %4 == 0) && (year % 100 != 0)|| (year % 400 == 0)){return 1;}return 0;}void show(int year,int month,int date,int sec,int mini,int hour) {const char month_str[][4]={"","Jan","Feb","Mar","Apl", "May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};const int month_day[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int i,j,wdays,mdays,days;for(i=1,days=0;i<year;i++){if(leap(i)){days += 366;}else{days += 365;}}for(i=1;i<month;i++){if(i==2 && leap(year)){days+=29;}else{days+=month_day[i];}}printf(" %s.%d.%d %d:%d:%d \n",month_str[month],date,year,hour,mini,sec);printf(" 一二三四五六日\n");wdays = days % 7;for( j = 0; j < wdays; j++){printf(" ");}if(month == 2 && leap(year)){mdays=29;}else{mdays= month_day[month];}for(i=1;i<=mdays;i++){if( i > 1 && days % 7 == 0 ){Printf(“\n”);printf("\n");}printf("%4d",i);days=days+1;}printf("\n---------------------------\n\n\n");}void main(){time_t rawtime;struct tm *info;int year,month,date,sec,mini,hour; char ch;time ( &rawtime );info = localtime ( &rawtime );year =info->tm_year + 1900; month =info->tm_mon + 1;date =info->tm_mday;hour =info->tm_hour;mini =info->tm_min;sec =info->tm_sec;while(1){show(year,month,date,sec,mini,hour); printf("↑......上一年\n\n");printf("↓......下一年\n\n");printf("←....前一个月\n\n");printf("→....后一个月\n\n");printf("Esc.......退出\n\n");ch=getch();switch(ch){case 27://Ecsexit(0);case -32://Navigatorch=getch();if(ch==77){//Rightyear+=(month==12)?1:0;month=month%12+1;}else if(ch==75){//Leftyear-=(month==1)?1:0;month=(month-2+12)%12+1;}else if(ch==72) {//Upyear--;}else if(ch==80) {//Downyear++;}system("cls"); }}}。
(2023)C语言万年历设计报告(一)
(2023)C语言万年历设计报告(一)C语言万年历设计报告这份报告是针对 2023 年度 C 语言万年历设计而准备的。
设计目的该万年历的设计目的是为了让用户能够快速地查看任意公历年份的日历,同时还能够显示节气、万年历和日历信息。
设计思路该万年历的主要思路是通过用户输入任意公历年份,在程序中计算并显示该年的日历信息。
具体实现思路如下:1.用户输入年份信息。
2.程序判断该年份是否为闰年,并计算该年的总天数。
3.根据该年第一天是星期几,排列该年每个月的天数。
4.标记国历节日,如元旦、劳动节等。
5.计算并标记该年的节气,如立春、清明等。
6.计算并标记该年的重要万年历信息,如“三伏”、“四季”等。
设计要点在实现该万年历的过程中需要注意以下几个要点:1.为了代码的可维护性,尽量将每个功能模块拆分成函数的形式。
2.程序中需要处理日期的加减运算,可以使用标准库中的<time.h>。
3.节气和万年历的计算应该基于一些公式而不是硬编码。
设计结果经过实现,该万年历已经能够正常运行,并能够正确地显示各种信息。
用户输入任意公历年份后,程序可以迅速计算并展示该年的万年历、节气和重要节日信息。
结论通过本次 C 语言万年历的设计,我们不仅深入地了解了日期处理等相关知识,还提升了编码的能力。
在日常开发中,我们也可以根据这些基础知识,设计更为实用的应用程序。
可改进之处尽管该万年历已经能够满足基本的需求,但仍有一些改进空间。
例如:1.目前仅支持公历,可以添加其他历法的支持,如农历、阴阳历等。
2.界面可以进一步美化,增加更多交互性的组件,如按钮、下拉菜单等。
3.可以添加更多的功能,如查询特定日期的天气、星座运势等。
总结本次 C 语言万年历设计,使我们更好地理解了日期处理的相关知识,提高了我们的编码水平。
同时,我们也意识到在实际项目中,需要更多的功能和优化,才能更好地服务于用户的需求。
通过持续不断的学习和实践,我们可以不断提升自己的编程技能。
c语言课程设计报告万年历最详细
c语言课程设计报告万年历最详细集团文件发布号:(9816-UATWW-MWUB-WUNN-INNUL-DQQTY-C语言课程设计报告-----万年历设计人:贾伟涛学号:12班级:13电信应电班指导老师:张伟日期:2014年6月9日内容提要通过大一下学期对C语言的学习,了解到了很多C语言的相关知识。
学习的过程虽然有很多困惑,但是当自己能够独立的看懂和独立的完成一个简单的程序时,心中就会收获无限的喜悦和成就感。
我虽然可以看懂一些简单的程序,编写一些简单的计算程序,更多的是学会了一种思想——编程,它让我在去思考很多日常生活中的事物是怎么样通过一个个小小的函数实现功能的,激发我对c语言的兴趣。
C语言是近年在国内外得到迅速推广应用的一种机器语言。
C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。
因此,C语言特别适合于编写各种软件。
在这次的课程设计中我将把日常生活中最经常接触的——日历的查询,利用C 语言的程序编成一个简单的万年历查询系统。
通过这个小小的系统可以实现很多功能。
在程序中你能看到很多熟悉的C语言关键字,同时也加入了很多自己课外了解到的一些关键字。
在不断的调试中最终才获得最为完整的程序。
接下来就是我的C 语言课程设计的具体内容来了,大家拭目以待吧!目录一、系统功能和数据说明-----------------------二、问题分析---------------------------------三、程序总体设计及功能结构框图---------------四、程序流程图-------------------------------五、源程序代码-------------------------------六、使用说明---------------------------------七、个人心得---------------------------------八、参考文献---------------------------------一、系统功能和数据说明(一)功能简介在日常生活中能接触到很多不同类型的日历,在日历上我们通常希望它能简单明了的给我们最想要的日期信息。
桌面万年历程序设计综合实践报告
程序设计综合实践报告(C语言)项目名称:桌面万年历班级:姓名:学号:山东科技大学信息科学与工程学院2012年12月目录1. 项目概述 (3)1.1 需求陈述 (3)1.2 开发技术、环境与工具 (3)2. 软件需求 (3)2.1 功能性需求 (3)2.2 非功能性需求 (3)3. 软件架构设计 (3)4. 软件详细设计与实现 (3)4.1 主要模块的流程图 (3)4.2 核心代码 (4)5 总结与体会 (22)5.1遇到的问题与解决途径 (22)5.2 心得体会 (22)1. 项目概述1.1 需求陈述本项目是桌面小时钟的实现,表盘上可以实现星期、年月日、时分秒、生肖以及天干地支,右击可以打开延伸项目,包括日历、关于、表盘颜色设置、以及退出等选型,在日历表中可以实现从1901-2099年公历农历以及周几的查询,在日历表格中也可以进行换肤操作,同时还可以进行闹钟设定,通过“开启闹钟”“关闭闹钟”两个按钮来实现对闹钟开关的控制1.2 开发技术、环境与工具相关技术:1、(DrawClocktext)2、(DrawCalendar)2. 软件需求基于c语言利用vb2008实现改程序2.1 功能性需求可以实现时钟的消息处理(包括添加图片、背景色透明、更新时钟、绘制时钟、弹出菜单、处理菜单消息)、绘制时钟(包括年月日、时分秒)、万年历的背景的绘制、日历的绘制、以及按键消息。
2.2 非功能性需求编制闹钟,实现了闹钟的设定3. 软件架构设计1、日历绘制函数2、表盘函数的绘制3、按键函数的绘制4. 软件详细设计与实现1、通过GetLocalTime(&datetime);来实现获得当下时间,然后通过SunToLunar实现公历和农历日期的转化。
通过绘制表格,由GetDayOfWeek可以判断出某一天是周几,然后可以确定日历表中各个月份天数所在的位置,实现了万年历的基本功能。
其次,利用按键功能,实现了对年月日的的选择。
C语言课程设计实验报告(万年历)
C语言课程设计一、题目及功能描述题目:万年历的设计利用C语言设计出万年历,使其实现如下要求1、输入一个年份,在屏幕上输出该年的年历(包括每月的天数和所对应的星期几),并且在每月的左上角或右上角打印出相应的年份和月份,要求输出界面尽可能整齐、美观,符合年历显示规范。
假定输入的年份在1-9999年之间。
2、输入年月,输出该月的月历。
3、输入年月日,输出距今天还有多少天,是星期几,是否是公历节日。
:4、指定键盘的某些键,用于控制变换不同年、月、日的显示。
即:当前若正在显示2011年的年历,按下键盘“←”方向键后,年历变为2010年的。
二、使用的所有变量的说明变量说明:(以下均为整型变量)year 表示年份的变量month 表示月份的变量day 表示日期的变量select 表示菜单选择的变量i 表示月份的变量j 表示一个月中的某一天的变量sum 判断某天是一年中的第几天的变量number判断某天离公元1年1月1日还有几天的变量a[] 表示每月天数的数组变量year1 系统时间年份的变量month1 系统时间月份的变量day1 系统时间日期的变量三、程序清单及其说明#include "time.h" /*包含的头文件*/#include "stdio.h"#include "math.h"#include "windows.h"#include "conio.h"#define KEYNUMUp 0x48 /*宏定义*/#define KEYNUMDown 0x50#define KEYNUMLeft 0x4b#define KEYNUMRight 0x4d#define KEYNUMPageUp 0x49int eachyeartotal(int year,int month,int day); /*函数声明*/int counterdays(int year,int month,int day);int nowtime(int year,int month,int day);int week(int year,int month,int day);int maxDay(int year,int month);int isleap(int year);void whatweek(int year,int month,int day);void display(int year ,int month);void display2(int year,int month);void display3(int year,int month,int day) ;void setDay1(int year,int month,int day);void setDay2(int year,int month,int day);void setDay3(int year,int month,int day);void jieri(int month,int day);void display1(int year);void getmenu();void main() /*主函数*/{int year,month,day,select;while(1){getmenu();printf(" 请输入相应数字:"); /*菜单选择*/scanf("%d",&select);system("cls");switch(select){case 1: /*当选择为1时显示年历*/printf(" 年历显示:输入年(如2011):");scanf("%d",&year);if(year>0&&year<10000) /*显示年份从0-10000 */{display1(year); /*调用函数*/printf(" 提示按↑:上一年按↓:下一年按其他键:返回菜单\n\n");setDay1( year,month, day);}elsesystem("cls");printf(" 输入无效,重新输入!\n");break;case 2: /*当选择为2显示月历*/printf(" 月历显示:输入年月(如2011,6):");if(year>0&&year<10000&&month>=1&&month<=12){display2(year,month);printf(" 提示按←:上个月按→:下个月按其他键:返回菜单\n\n");setDay2( year,month, day);}elsesystem("cls");printf(" 输入无效,重新输入!\n");break;case 3: /*当选择为3时显示日期*/printf(" 日期显示:输入年月日(比如2011,6,23):");scanf("%d,%d,%d",&year,&month,&day);if(year>0&&year<10000&&month>=1&&month<=12&&day>=1&&day<=maxDay(year,month) ){display3(year,month,day);printf(" 提示按PageUp:前一天按PageDown:后一天按其他键:返回菜单\n\n");setDay3( year,month, day);}elsesystem("cls");printf(" 输入无效,重新输入!\n");break;case 4:exit(0);default: /*当输入其他数字时,输入无效,重新输入*/system("cls");printf(" 输入无效,重新输入!\n");}}}int isleap(int year) /*判断是否为闰年*/{if(year%4==0&&year%100!=0||year%400==0)return 1;elsereturn 0;int maxDay(int year,int month) /*每月的天数*/{int a[]={31,28,31,30,31,30,31,31,30,31,30,31}; /*每个月中的天数*/ if(isleap( year))a[1]=29; /*闰年2月份有29天*/ return a[month-1];}int eachyeartotal(int year,int month,int day) /*判断某天是一年中的第几天*/ {int i,sum=0;for(i=1;i<month;i++)sum+=maxDay(year,i);sum+=day;return sum;}int week(int year,int month,int day) /*对天数进行判断确定是星期几*/ {int number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+eachyeartotal(year,month,day);number=number%7 ;return number;}void display(int year ,int month) /*输出年月*/{int max,number,i,j=1;max=maxDay(year,month);number=week(year,month,1);printf(" %4s %4s %4s %4s %4s %4s %4s\n","Sun","Mon","Tue","Wed", "Thu","Fri","sat");for(i=0;i<number;i++)printf(" "); /*1号前的星期补空格*/ while(j<=max){printf("%6d",j);if (i%7==6)printf("\n"); /* 每7格换一行*/i++;j++;printf("\n\n");}void display1(int year) /*输出年历*/{int i;printf("\n");for(i=1;i<=12;i++){printf("%d 年%d 月\n\n ",year,i);display(year,i);}}void display2(int year,int month) /*输出月历*/{printf("\n%d 年%d 月\n ",year,month);display(year,month);}void display3(int year,int month,int day) /*输出日历*/{whatweek( year,month,day);jieri(month,day);counterdays(year,month, day);}int counterdays(int year,int month,int day) /*判断今天距特定日期的天数*/{int year1, days0,days1,month1,days, day1;time_t timep;struct tm *p;time(&timep);p=gmtime(&timep);year1=(1900+p->tm_year) ;month1=(1+p->tm_mon) ;day1=(p->tm_mday); /*获取系统时间year1、month1、day1分别为年、月、日*/days0=(year-1)*365+(year-1)/4-(year-1)/100+(year-1)/400+eachyeartotal(year,month,day);days1=(year1-1)*365+(year1-1)/4-(year1-1)/100+(year1-1)/400+eachyeartotal(year1,month1,daydays=days0-days1; /*计算出两个日期之间的时间差*/printf("\n 今天距%d年%d月%d日还有%d天\n\n",year,month,day,days);return days;}void whatweek(int year,int month,int day) /*判断是星期几*/{int number;number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+eachyeartotal(year,month,day); number=number%7 ;switch( number){case 0:printf( "\n %d年%d月%d日是星期日",year,month,day);break;case 1:printf( "\n %d年%d月%d日是星期一",year,month,day);break;case 2:printf( "\n %d年%d月%d日是星期二",year,month,day);break;case 3:printf( "\n %d年%d月%d日是星期三",year,month,day);break;case 4:printf( "\n %d年%d月%d日是星期四",year,month,day);break;case 5:printf( "\n %d年%d月%d日是星期五",year,month,day);break;case 6:printf( "\n %d年%d月%d日是星期六",year,month,day);break;default:system("cls");printf(" 出现错误!\n" );}}void jieri(int month,int day) /*判断是否公历节日*/{if(month==1)switch(day){case 1:printf(",这天是元旦");}if(month==2)switch(day){case 14:}if(month==3)switch(day){case 8:printf(",这天是妇女节");break;case 12:printf(",这天是植树节");}if(month==4)switch(day){case 1:printf(",这天是愚人节");}if(month==5)switch(day){case 1:printf(",这天是劳动节");break;case 4:printf(",这天是青年节");}if(month==6)switch(day){case 1:printf(",这天是儿童节");}if(month==7)switch(day){case 1:printf(",这天是建党节");}if(month==8)switch(day){case 1:printf(",这天是建军节");}if(month==9)switch(day){printf(",这天是教师节");}if(month==10)switch(day){case 1:printf(",这天是国庆节");}}void setDay1(int year,int month,int day) /*通过键盘“↑”“↓”控制年历的变换*/ { char k;getch();k=getch();switch(k){case KEYNUMUp: /*“↑”年份减小*/ if(year<2){system("cls");printf(" 警告!超出范围!\n");break;}year--;display1(year);setDay1(year,month,day);break;case KEYNUMDown:/*“↓”年份变大*/ year++;display1(year);setDay1(year,month,day);break;default:system("cls");}}void setDay2(int year,int month,int day) /*通过键盘“←”“→”控制月历的变换*/char k;getch();k=getch();switch(k){case KEYNUMLeft: /*“←”月份变小*/if(month<2){month+=12;year--;}if(year<1){system("cls");printf(" 警告!超出范围!\n");break;}month--;display2(year , month);setDay2(year,month,day);break;case KEYNUMRight:/*“→”月份变小*/if(month>11){month-=12;year++;}if(year<9999);month++;display2(year , month);setDay2(year,month,day);break;default:system("cls");;}}void setDay3(int year,int month,int day) /*通过键盘“PageUp”“PageDown”控制日期的变换*/{char k;getch();switch(k){case KEYNUMPageUp: /*“PageUp”日期变小*/ if(day<2){month--;day=maxDay(year,month);}if(month<1){month+=12;year--;}if(year<1){system("cls");printf(" 警告!超出范围!\n");break;}day--;display3(year , month,day);setDay3(year,month,day);break;case KEYNUMPageDown: /*“PageDown”日期变大*/ day++;if(day>maxDay(year,month)){day=1;month++;}if(month>12){month-=12;year++;}if(year<10000);display3(year , month,day);setDay3(year,month,day);break;default:system("cls");;}}{printf(" ************主菜单************\n\n");printf(" * 欢迎进入万年历系统*\n\n");printf(" * 1、年历显示*\n\n");printf(" * 2、月历查询*\n\n");printf(" * 3、日期查询*\n\n");printf(" * 4、退出系统*\n\n");printf(" ******************************\n\n"); }四、运行结果清单打开软件,进入如下菜单界面,输入数字进行选择1年历的显示(1)输入数字1进入年历的显示(2)输入年份2011,显示2011年的年历如下(3)按↑键盘显示上一年(2010年)的年历,显示如下(4)按↓键盘显示上一年(2012年)的年历,显示如下2、月历的显示(1)在菜单中选择2,进入月历的显示,输入2011,6,显示2011年6月份的月历,显示效果如下(2)按←键盘显示上一个月(5月)的月历,显示效果如下(3)按→键盘显示上上个月(7月)的月历,显示效果如下3、日历的显示(1)输入选择3进入日历的显示,如图输入2011,10,1显示这天的星期,是否为公历节日,距离现在还有多少天(2)按PagDown显示前一天的日历,显示如下(3)按PagUp显示后一天的日历,显示如下4 退出程序输入选择4,显示如下界面,按任意键退出程序五、总结和体会。
课程设计实验报告(万年历)..
int days2(int y);//判断该年有多少天
int days3(int y);//计算从元年到该之年前总天数
int totaldays(int y,int m,int d);//计算指定日期距今天的天数
int yi();//实现万年历的时间校对功能
second=59;
minute--;}
if(minute==-1){
minute=59;
hour--;}
if(hour==-1)
hour=23;}
private:
int hour,minute,second;};
int yi(){
char a,i,temp[30];
int b,c,d,shi,fen,miao;
《C++语言程序设计》
课程设计报告
设计题目:简单万年历
专业:网络工程
班级:12级
姓名:杨茂林
学号:121124028
联系方式:13213501410
1.设计目标……………………………………………3
2.设计思想……………………………………………3
3.类及函数的实现……………………………………3
4.程序流程图…………………………………………3
cout<<setw(6)<<" "<<"╬★欢迎进入万年历的页面★╬"<<endl;
cout<<setw(6)<<" "<<"╬★★★★╬"<<endl;
万年历C程序设计报告
C语言课程设计报告一、设计目标设计一个C语言程序(万年历系统),具体要求:模仿生活中的挂历设计一个C语言程序,由键盘输入一个日期(年月日)对其进行如下处理:主要功能:1、调用计算机的系统日期。
2、输出本年中该月份的日历,并能查看该月份前后月份的日历。
3、通过函数输出输入日期是星期几。
4、通过函数判断输出输入日期是否为特殊节日。
二、总体设计1、程序设计组成框图2、程序流程图三、详细设计 ( 流程图见附录 )1、功能函数f ( )——本函数由设计函数的功能:调用系统当前日期。
函数的入口:从main()按顺序进入该函数。
函数调用关系:被主函数调用。
在文中无返回值的空值void函数。
函数的出口:在主函数中按顺序执行后自动跳出,继续执行主函数。
2、功能函数f1( )——本函数由设计函数的功能:显示一个月的天数及对应星期。
函数的入口:从main()的switch()开关结构中进入,即choice的值为1时进入该函数。
函数调用关系:被主函数调用。
由switch()开关结构中进入,并在文中无返回值的空值void函数。
函数的出口:当程序执行提示语“printf("1-查看上一月\n 2-查看下一月\n 3-返回上一级\n");”的时候,对用户的操作进行提示,如果用户选择了按“1或2”键,则用户选择了继续该函数,如果用户选择了按“3”键,将结束该函数,返回主函数main(),继续执行主函数。
3、功能函数f2()——本函数由设计函数的功能: 输入一个日期,输出它并输出对应的星期。
函数的入口:程序从main()的开关1结构中进入,即按2时,开始进入该函数,进入函数后,按提示输入所查询的日期。
函数调用关系:被主函数调用。
由开关2结构中进入,并在文中无返回值的空值void函数。
函数的出口:当输出排序结果用printf()标准输出到屏幕上,然后结束该函数,而执行主函数main()中“goto”跳出开关2函数,继续执行其他功能。
C语言程序设计报告―“万年历”
C语言程序设计报告―“万年历”一、程序实现的功能“万年历”,也叫做历法及历历,是一种用于计算日期及节假日的日历,它可以帮助我们计算一些特定的日期及其所属的节日。
本程序通过C语言实现了一款传统的“万年历”的功能,它可以根据用户输入的年份和月份,打印出当月的日历表格,以及当月的公历及节假日。
二、程序的功能结构及总体设计本程序的功能结构如下:(1)输入年份及月份,计算出当月有多少天;(2)根据此判断出当月的第一天是星期几;(3)将前面算出的信息用表格形式打印出来;(4)计算当月的节假日及其所属的日期;(5)将节假日打印到表格中,形成一张完整的月历表。
程序的总体设计,主要由两部分组成:(1)调用函数实现实际的打印功能;(2)实现主函数的调用以控制程序的流程。
1. 程序结构:程序的核心是对日历表的生成,其结构如下:主函数:负责主函数的调用,以控制程序的流程。
日历表生成函数:调用该函数以生成日历表;在调用该函数之前,首先运行“getfirstday”函数,以计算当月的第一天是星期几;然后调用“dayOut”函数,将当月的日期和节日打印出来。
“getfirstday”函数:该函数用来计算某年某月的第一天是星期几,实现的核心思想是以1900年为基准,计算出某年某月离1900年相差多少天,然后根据求出的和1900年的差值,计算出当月的第一天是星期几;此外,还进行了考虑闰年等特殊情况的特别处理,以进一步检查结果。
2. algorithm:(1) 从键盘输入年份及月份,将年份及月份保存在相应的变量中;(2) 调用“getfirstday”函数,计算出当月的第一天是星期几;(3) 调用日历表生成函数,生成当月的日历表;(4) 输出生成的日历表,完成程序的运行。
四、程序的测试为了验证本程序的可行性,我进行了严格的测试,并与电子版的日历比较,测试结果表明,本程序的结果完全一致,能够满足正确的要求,用户可以使用该程序进行相应的日历计算。
C语言实训题目设计报告 万年历
C语言实训题目设计报告:万年历系统1、题目设计:设计一个万年历系统功能要求:(1)从2000年开始,用户输入年份与月份,将显示出该年该月份的日历,对应的星期。
(2)用户输入年份,将显示该年的日历(3)注意闰年情况显示格式要求如下:(1)第一行显示月份(中英文都可以)(2)下一行显示星期,从周日到周六,中英文都可以(3)下一行开始显示日期从1号开始,并按其是星期几实际情况与上面的星期数垂直对齐(4)程序输出菜单,用户按照提示操作,最终得到计算结果。
2、问题分析:该程序可大致分成主菜单、年历、月历3个部分,并且还有判断是否为闰年、月份的天数、该月第一天为周几三个小模块,并可由年历、月历调用,年历、月历可由主菜单调用。
最后可以考虑一下界面的优化和输入错误等小问题。
3、算法设计:主菜单部分:用户输入选项,用一个switch语句来进行接下来的任务,其中有一个选项是用来退出的。
在进行到程序结尾的时候用goto语句来实现回到函数最开始的目的。
月历部分:从键盘接收年份和月份,通过小函数来获得本月的天数和本月一号是周几,从而在屏幕上输出月历。
在到周末的时候换行。
年历部分:大体思路和月历相似,只是多用了一个for循环,使得月份从一月一直到十二月(其实这部分我是复制的月历部分的)。
判断闰年部分:输入年份,输出1或0。
判断天数部分:输入年份,月份,输出天数。
其中有调用闰年的函数。
判断周几部分:输入年,月,日,输出是周几的信息。
4、程序源代码:#include<stdio.h>#include<color.h>#include<conio.h>int ifren(int year)//判断是否是闰年{if(year%4==0&&year%100!=0||year%400==0)return 1;elsereturn 0;}int monthday(int month,int year)//判断这个月有多少天{if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) return 31;if(month==4||month==6||month==9||month==11)return 30;if(month==2&&ifren(year)==1) return 29;else return 28;}int firstday(int month,int year)//判断本月一日是周几{int w;if(month==1||month==2){month+=12;year=year-1;}w=(1+2*month+3*(month+1)/5+year+year/4+year/400-year/100)%7+1; //蔡勒公式return w;}void yueli(){ int i,k=1,startday,monthdays,month,year;//k是第几周的标志system("cls");printf("=======================================================\n输入年份:");scanf("%d",&year);printf("输入月份:");scanf("%d",&month);monthdays=monthday(month,year);startday=firstday(month,year);printf("\t\t\t%d月\n",month);printf(" Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");if(startday==7){for(i=1;i<=monthdays;i++){printf("%d\t",i);if(i%7==0){printf("\n");}}}if(startday!=7){for(i=1;i<=startday;i++){printf("\t");//把每月1日之前的空格打出来}for(i=1;i<=monthdays;i++){printf("%d\t",i);if(i==7*k-startday){printf("\n");k++;}}}printf("\n\n");}void nianli(){int i,j,k,startday,monthdays,month,year;system("cls");printf("=======================================================\n输入年份:");scanf("%d",&year);for(month=1;month<=12;month++){k=1;monthdays=monthday(month,year);startday=firstday(month,year);printf("\t\t\t%d月\n",month);printf(" Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");if(startday==7){for(i=1;i<=monthdays;i++){printf("%d\t",i);if(i%7==0){printf("\n");}}}if(startday!=7){for(j=1;j<=startday;j++){printf("\t");}for(i=1;i<=monthdays;i++){printf("%d\t",i);if(i==7*k-startday){printf("\n");k++;}}}printf("\n\n");}}int main(){restart:printf("\n\n\n\n");printf("=======================================================\n\n");//主菜单printf("== 万年历==\n\n");printf("== 1、月历==\n\n");printf("== 2、年历==\n\n");printf("== 3、退出==\n\n");printf("=======================================================\n\n");printf("输入数字,来执行相应的功能\n");int select;scanf("%d",&select);switch (select){case 1:yueli();break;case 2:nianli();break;case 3:system("cls");exit(0);break;default:printf("输入错误!\n祖さま、すごいですね!\n");}system("pause");//弄成可以在windows下人性化运行system("cls");goto restart;return 0;}截图:主菜单:月历:年历:5、使用说明:打开程序后,依照主菜单的提示输入数字选择功能,进行万年历的查阅。
C语言万年历设计报告
千里之行,始于足下。
C语言万年历设计报告设计报告:C语言万年历1. 引言本文旨在介绍一个基于C语言开发的万年历设计,并对其设计思路、代码细节、实现效果进行具体的阐述。
万年历是一种依据历法规章,能够显示任意年份任意月份的日历的工具。
在本设计中,我们使用C语言来编写一个简易的万年历程序,具备显示任意年份任意月份的日历、日期查询等功能。
2. 设计思路2.1 数据结构设计在设计万年历程序时,我们需要设计适用于存储日期信息的数据结构。
考虑到日历是依据年份和月份来呈现的,我们可以使用结构体来存储日期的年、月、日信息。
具体数据结构如下:```struct Date {int year;int month;int day;};```2.2 星期计算算法第1页/共3页锲而不舍,金石可镂。
在日历中,我们需要依据给定日期计算出其对应的星期。
这里我们接受Zeller公式来计算星期。
Zeller公式可以依据给定的年、月、日计算出一个对应的星期数。
具体公式如下:```h = (q + ((13*(m+1))/5) + K + (K/4) + (J/4) - (2*J)) % 7```其中,h是一个星期的编号,0代表星期一,1代表星期二,以此类推。
2.3 日历显示算法对于日历的显示,我们需要依据给定的年份和月份计算出该月的天数,并打印出日历表。
具体算法如下:- 首先,依据给定的年份和月份,计算出该月的天数。
- 然后,依据给定年份、月份、星期计算公式,计算出该月的第一天是星期几。
- 接下来,依据计算结果,打印出日历表。
3. 主要函数设计在C语言万年历程序的设计中,我们主要需要设计以下几个函数:3.1 输入函数该函数用于接收用户输入的年份和月份,并进行基本的输入验证,确保输入的年份和月份在合理范围内。
千里之行,始于足下。
3.2 星期计算函数该函数依据给定的年份、月份、日期,计算出对应的星期数,并返回星期数。
3.3 天数计算函数该函数依据给定的年份和月份,计算出该月的天数,并返回天数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序设计报告(2009/2010学年第一学期)题目:万年历查询系统专业电气信息工程 _学生姓名王XX班级学号 B080510XX指导教师张台国指导单位计算机软件基础教学中心日期 2009.10.30万年历查询系统一、课题内容和要求万年历在现在日常生活工作学习等众多方面被广泛使用。
本课题旨在以“公元2005年10月20日星期四”为已知条件编写一个基本的万年历查询系统,可以查询公元元年至公元9999年间任一年的全年日历,以双月并排显示的方式输出,并要求对用户输入的待查询数据有较强的错误检查能力。
通过该课题,进一步加深对C++面向对象特性的认识,更加深层的理解了类的封装意义,较为熟练的掌握了函数调用、文件读写、对象操作等知识。
二、需求分析功能框架图:(图2-1功能详解:(1)提供界面友好的操作菜单:输出欢迎信息和操作菜单,用于提示用户选择需要的操作。
根据用户输入的选项实现相应的功能。
(2)进行数据的输入和错误检查:要求用户输入待查询数据,并对输入的数据执行错误检查,如果输入有误,则提示用户重新输入,直到输入正确。
(3)计算待求年份元旦的星期数:通过求出待求年份与2005年元旦相距的总天数求出待求年份元旦的星期数,为准确输出万年历奠定基础。
(4)打印日历的标题和日期:可以将万年历以双月并排的形式输出,一方面使得万年历看起来美观;另一方面,也确保了万年历日期与星期的准确对应。
(5)选择菜单:供用户选择需要继续的操作,具有较强的输入数据错误检查能力;同时实现了程序操作的循环性。
三、概要设计1、主要类:class Data{private:int Week[12]; //用于储存每个月1号为星期几int year; //用于存放用户输入的年份public:Data(); //类Data的构造函数int Getyear(); //获取用户输入的年份void FirstDayOfYear(int); //求出任意一年元旦的星期数void FirstDayOfMonth(int); //求出任意年份的每个月一号的星期数int IsLeapyear(int); //判断是否为闰年void PrintYear(int); //显示年份图案void PrintTitle(int); //输出每个月日历的标题部分void PrintMonth(int); //打印月份日历void PrintForm(int); //使日历按照每两个月并排的方式输出void ChooseMenu(); //显示选择操作界面,实现程序的循环void PrintThanks(); //退出程序时显示结束信息};2、主要函数流程图:(1)类的构造函数:用于给类的对象赋值。
提示用户输入数据,并具有较强的错误输入数据检查功能。
(参见图3-1)(2)闰年判断函数:判断哪些年份为闰年。
(图3-2)(3)求待求年份元旦星期函数:求出待求年份元旦距离2005年元旦的总天数,进而求出待求年份元旦的星期数。
(图3-3,其中Week[0]代表元旦星期数)四、程序源码#include<iostream>#include<fstream>#include<iomanip>#include<string>using namespace std;ofstream fout("万年历_执行结果.txt"); //文件输出到“万年历_执行结果.txt文件中”const int Year=2005; //const符号常量,代表2005年int MonNum[12]={31,28,31,30,31,30,31,31,30,31,30,31}; //储存每月的天数void PrintWelcome(); //顶层函数,用于开始执行程序时输出欢迎信息class Data{private:int Week[12]; //用于储存每个月1号为星期几int year; //用于存放用户输入的年份public:Data(); //类Data的构造函数int Getyear(); //获取用户输入的年份void FirstDayOfYear(int); //求出任意一年元旦的星期数void FirstDayOfMonth(int); //求出任意年份的每个月一号的星期数int IsLeapyear(int); //判断是否为闰年void PrintYear(int); //显示年份图案void PrintTitle(int); //输出每个月日历的标题部分void PrintMonth(int); //打印月份日历void PrintForm(int); //使日历按照每两个月并排的方式输出void ChooseMenu(); //显示选择操作界面,实现程序的循环void PrintThanks(); //退出程序时显示结束信息};void main(){static int i=0; //静态全局变量i,控制PrintWelcome()只输出一次if(!i++)PrintWelcome(); //调用顶层函数,输出欢迎信息Data data; //定义类Data的对象dataint yy=data.Getyear();data.PrintYear(yy);data.FirstDayOfYear(yy);data.ChooseMenu();}/*函数功能:判断输入的年份是否为闰年,如果是则返回1,否则返回0函数参数:整型变量mm,存放输入的年份函数返回值:闰年则返回1,否则返回0*/int Data::IsLeapyear(int mm){if(((mm%4==0)&&(mm%100!=0))||(mm%400==0))return 1;elsereturn 0;}/*函数功能:构造函数,用于提示用户输入要查询的年份,如果输入的不是数字或者输入的数字不在0-9999之内,则提示输入错误,并要求用户重新输入函数参数:无函数返回值:无返回值*/Data::Data(){char ch; //定义字符型变量ch,存放错误输入字符cout<<"\n 请输入要查询的年份:";while(1) //对输入值错误处理{cin>>year;scanf("%c",&ch); //将数字后输入的非数字字符读取到ch中if(year<0||year>9999||ch!='\n') //如果输入的年份不在0-9999之列或者含有非数字字符则报错{cout<<" 输入错误,您所输入的年份必须在0~9999之间!"<<endl<<" 请重新输入要查询的年份:";cin.clear();cin.ignore(1000,'\n');}else break;}}/*函数功能:获取用户输入的待查询年份函数参数:无函数返回值:用户输入的待查询年份*/int Data::Getyear(){return year;}/*函数功能:当用户输入正确的可查询年份时,打印出由“*”所组成的待查询年份的数字图案函数参数:整型变量year,存放输入的待查询年份函数返回值:无返回值*/void Data::PrintYear(int year)int m=year/1000; //m代表待查询年份的千位数字int n=(year/100)%10; //n代表待查询年份的百位数字int p=(year/10)%10; //p代表待查询年份的十位数字int q=year%10; //q代表待查询年份的各位数字int num[4]={m,n,p,q}; //数组num用于存放年份的千、十、百、个位数/*3维数组ss用于存放由*组成的0~9这10个数字的图案,其中5表示行,7表示列*/char ss[5][10][7]= {"***** "," * ","***** ","***** ","* * ","***** ","***** ","***** ","***** ","***** ", "* * "," * "," * "," * ","* * ","* ","* "," * ","* * ","* * ","* * "," * ","***** ","***** ","***** ","***** ","***** "," * ","***** ","***** ","* * "," * ","* "," * "," * "," * ","* * "," * ","* * "," * ","***** "," * ","***** ","***** "," * ","***** ","***** "," * ","***** ","***** ",};cout<<"\n =====================公元"<<year<<"年日历====================="<<endl;fout<<"\n =====================公元"<<year<<"年日历====================="<<endl;/*实现3维数组图案的输出*/for(int g=0;g<5;g++){cout<<" ";fout<<" ";for(int i=0;i<4;i++)for(int h=0;h<7;h++){cout<<ss[g][num[i]][h];fout<<ss[g][num[i]][h];}cout<<endl;fout<<endl;}}/*函数功能:控制日历的输出格式,使日历能够以每两个月并排的方式输出函数参数:整型变量n,存放当前打印的月份函数返回值:无返回值*/void Data::PrintForm(int n){if(n%2) //如果是单月,则输出空格{cout<<" ";fout<<" ";}else //若为双月,则输出回车换行{cout<<endl;fout<<endl;}/*函数功能:打印每个月日历的表头部分信息,并为每两个月并列显示函数参数:整型变量n,存放待打印月份函数返回值:无返回值*/void Data::PrintTitle(int n){do{string ss[12]={" Jan "," Feb "," Mar "," Apr "," May "," June "," July "," Aug "," Sept "," Oct "," Nov "," Dec "};cout<<ss[n-1];fout<<ss[n-1];PrintForm(n); //调用PrintForm()函数控制日历输出格式n++;}while(!(n%2)); //输出月份标题,每行打印两个月份标题do{cout<<"____________________________ ";fout<<"____________________________ ";PrintForm(n); //调用PrintForm()函数控制日历输出格式n++;}while(!(n%2)); //在相应的月份标题下打印横线do{cout<<" Sun Mon Tue Wed Thu Fri Sat ";fout<<" Sun Mon Tue Wed Thu Fri Sat ";PrintForm(n); //调用PrintForm()函数控制日历输出格式n++;}while(!(n%2)); //在相应的横线下面打印对应的星期标题}/*函数功能:打印每个月日历的详细日期,并按照每两个月并排的方式显示函数参数:整型变量mon,存放待打印月份函数返回值:无返回值*/void Data::PrintMonth(int mon){int CurDay[2]; //CurrentDay,储存每两个月中当前打印的日期do{int k=0;for(;k<Week[mon-1];k++) //使每个月的一号与星期对应{cout<<" ";fout<<" ";}k++;for(int d=1;k<8;d++,k++) //输入每个月的第一行{cout<<" "<<d<<" ";fout<<" "<<d<<" ";}if(mon%2) //判断,如果为单月,则输出一段空格{cout<<" ";fout<<" ";CurDay[0]=d;}else //若为双月,则换行{cout<<endl;fout<<endl;CurDay[1]=d-1;}mon++;}while(!(mon%2)); //控制每两个月并排打印mon=mon-2;int i=0,k=1,m=mon-1;for(;CurDay[i]<MonNum[m]+1;CurDay[i]++,k++){if(CurDay[i]<10){cout<<" "<<CurDay[i]<<" ";fout<<" "<<CurDay[i]<<" ";}else{cout<<" "<<CurDay[i]<<" ";fout<<" "<<CurDay[i]<<" ";}if(k==7){if(!i){cout<<" ";fout<<" ";i=1;m++;}else{cout<<endl;fout<<endl;i=0;m--;}k=0;}}m=mon-1;/*当双月输出还没结束,但单月输出已结束时,让单月的一边继续以空格形式补充输出*/ if(CurDay[0]==MonNum[m]+1&&CurDay[1]<MonNum[m+1]+1){for(;k<8;k++){cout<<" ";fout<<" ";}cout<<" ";fout<<" ";k=1;for(CurDay[1]++;CurDay[1]<MonNum[m+1]+1;CurDay[1]++,k++){cout<<" "<<CurDay[1]<<" ";fout<<" "<<CurDay[1]<<" ";if(k==7){cout<<endl;fout<<endl;cout<<" ";fout<<" ";}}cout<<endl;fout<<endl;}/*当单月未结束,双月输入结束跳出时最后一行的输出情况*/if(CurDay[0]<MonNum[m]+1&&CurDay[1]==MonNum[m+1]+1){cout<<endl;fout<<endl;k=1;for(CurDay[0]++;CurDay[0]<MonNum[m]+1;CurDay[0]++,k++){cout<<" "<<CurDay[0]<<" ";fout<<" "<<CurDay[0]<<" ";if(k==7){cout<<endl;fout<<endl;cout<<" ";fout<<" ";}}cout<<endl;fout<<endl;}}/*函数功能:在首次查询结束后输出提示信息,询问用户是选择继续查询其它的年份日历还是选择退出万年历查询系统,以此保证查询系统可以循环操作函数参数:无函数返回值:无返回值*/void Data::ChooseMenu(){string ss; //字符型变量ss,存放选择操作命令cout<<"*****************************操作提示*****************************"<<endl<<endl <<" 1.继续查询其它年份的日历"<<endl<<endl<<" 2.退出查询系统"<<endl<<endl <<" 请选择您需要的操作:";do{cin>>ss;if(ss=="1") //选择1时,继续查询其它的年份日历main();else if(ss=="2") //选择2时,执行退出命令{PrintThanks(); //调用PrintThanks()函数输出结束信息exit(0); //正常退出}else{cout<<"\n 您的输入有误!请重新选择:";}}while(1);}/*函数功能:求出待求年份的每个月一号是星期几函数参数:整形参数m,存放待求年份函数返回值:无返回值*/void Data::FirstDayOfYear(int m){long n;if(m>=Year) //当输入年份大于等于2005的时候的情况{n=(m-Year)*365; //按每年365天计算待查年份元旦距05年元旦总天数for(int i=Year;i<=m-1;i++)n+=IsLeapyear(i); //遇到有闰年情况的,总天数中就相应的加上1Week[0]=(n+1)%7-2 ; //计算该年的元旦的星期数}else //当输入年份小于2005的时候的情况{n=(Year-m)*365;for(int i=m;i<Year;i++)n+=IsLeapyear(i);Week[0]=7-(n+1)%7; //计算该年元旦为星期几}if(Week[0]<0) //使Week[0]控制在0-6内,出现负值则加7Week[0]+=7;FirstDayOfMonth(m); //调用FristDayOfMonth()求出其他月份一号为星期几}/*函数功能:求出待求年份的除一月之外的每个月一号是星期几函数参数:整形参数m,存放待求年份函数返回值:无返回值*/void Data::FirstDayOfMonth(int m){if(IsLeapyear(m)==1) //如果该年为闰年,则二月天数为29天,否则28天MonNum[1]=29;elseMonNum[1]=28;for(int n=0;n<11;n++) //计算该年2-12月第一天为星期几{Week[n+1]= Week[n]+MonNum[n]%7;if(Week[n+1]>6) //用0-6来代表星期日至星期六Week[n+1]=Week[n+1]-7;}for(int h=1;h<12;h=h+2) //调用PrintTitle()和PrintMonth()函数输出日历{PrintTitle(h);PrintMonth(h);}}/*函数功能:用户选择退出时显示结束界面函数参数:无函数返回值:无返回值*/void Data::PrintThanks(){cout<<" ********************************************"<<endl<<" * <万年历查询系统> *"<<endl<<" * ================ *"<<endl<<" * 谢谢使用*"<<endl<<" * ================ *"<<endl<<" * 王XX B080510XX *"<<endl<<" ********************************************"<<endl;fout<<" ***************谢**谢**使**用***************"<<endl<<" 王XX\n B080510XX"<<endl; }/*函数功能:程序执行时显示欢迎界面函数参数:无函数返回值:无返回值*/void PrintWelcome(){cout<<"*******************************************************************"<<endl <<"* <欢迎进入万年历查询系统> *"<<endl <<"* 王XX B080510XX *"<<endl<<"* 自动化学院电气信息工程*"<<endl<<"*******************************************************************"<<endl;fout<<"*******************************************************************"<<endl <<"* <欢迎进入万年历查询系统> *"<<endl <<"* 王XX B080510XX *"<<endl<<"* 自动化学院电气信息工程*"<<endl<<"*******************************************************************"<<endl; }五、测试结果及结果分析(1)主程序功能测试:******************************************************************** <欢迎进入万年历查询系统> ** 王XX B080510XX ** 自动化学院电气信息工程********************************************************************请输入要查询的年份:2009=====================公元2009年日历=====================***** ***** ***** ****** * * * * * ****** * * * * ****** * * * * ****** ***** ***** *****Jan Feb____________________________ ____________________________ Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat1 2 3 1 2 3 4 5 6 7 4 5 6 7 8 9 10 8 9 10 11 12 13 14 11 12 13 14 15 16 17 15 16 17 18 19 20 21 18 19 20 21 22 23 24 22 23 24 25 26 27 28 25 26 27 28 29 30 31Mar Apr____________________________ ____________________________ Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat 1 2 3 4 5 6 7 1 2 3 4 8 9 10 11 12 13 14 5 6 7 8 9 10 11 15 16 17 18 19 20 21 12 13 14 15 16 17 18 22 23 24 25 26 27 28 19 20 21 22 23 24 25 29 30 31 26 27 28 29 30May June____________________________ ____________________________ Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat1 2 1 2 3 4 5 6 3 4 5 6 7 8 9 7 8 9 10 11 12 13 10 11 12 13 14 15 16 14 15 16 17 18 19 20 17 18 19 20 21 22 23 21 22 23 24 25 26 27 24 25 26 27 28 29 30 28 29 3031July Aug____________________________ ____________________________ Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat1 2 3 4 1 5 6 7 8 9 10 11 2 3 4 5 6 7 8 12 13 14 15 16 17 18 9 10 11 12 13 14 15 19 20 21 22 23 24 25 16 17 18 19 20 21 22 26 27 28 29 30 31 23 24 25 26 27 28 2930 31Sept Oct____________________________ ____________________________ Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat1 2 3 4 5 1 2 3 6 7 8 9 10 11 12 4 5 6 7 8 9 10 13 14 15 16 17 18 19 11 12 13 14 15 16 17 20 21 22 23 24 25 26 18 19 20 21 22 23 24 27 28 29 30 25 26 27 28 29 30 31Nov Dec____________________________ ____________________________ Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat1 2 3 4 5 6 7 1 2 3 4 58 9 10 11 12 13 14 6 7 8 9 10 11 1215 16 17 18 19 20 21 13 14 15 16 17 18 1922 23 24 25 26 27 28 20 21 22 23 24 25 2629 30 27 28 29 30 31(2)循环程序检错能力测试:*****************************操作提示*****************************1.继续查询其它年份的日历2.退出查询系统请选择您需要的操作:3您的输入有误!请重新选择:f您的输入有误!请重新输入:1请输入要查询的年份:12345输入错误,您所输入的年份必须在0~9999之间!请重新输入要查询的年份:abcd输入错误,您所输入的年份必须在0~9999之间!请重新输入要查询的年份:2kf6输入错误,您所输入的年份必须在0~9999之间!请重新输入要查询的年份:2005=====================公元2005年日历=================***** ***** ***** ****** * * * * ****** * * * * ****** * * * * ****** ***** ***** *****Jan Feb____________________________ ____________________________ Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat1 1234 52 3 4 5 6 7 8 6 7 8 9 10 11 129 10 11 12 13 14 15 13 14 15 16 17 18 1916 17 18 19 20 21 22 20 21 22 23 24 25 2623 24 25 26 27 28 29 27 2830 31Mar Apr____________________________ ____________________________ Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat1 2 3 4 5 1 26 7 8 9 10 11 12 3 4 5 6 7 8 913 14 15 16 17 18 19 10 11 12 13 14 15 1620 21 22 23 24 25 26 17 18 19 20 21 22 2327 28 29 30 31 24 25 26 27 28 29 30……(其它月份略去)(3)程序退出功能测试:*****************************操作提示*****************************1.继续查询其它年份的日历2.退出查询系统请选择您需要的操作:2********************************************* <万年历查询系统> ** ================ ** 谢谢使用** ================ ** 王XX B080510XX *********************************************六、调试过程中的问题在程序的设计及调试过程中,曾遇到诸多问题:1、编写类Data的构造函数时,为使其具有一定的错误检查能力,使用如下的语句:while(1){cin>>year;if(year<0||year>9999||ch!='\n'){cout<<" 输入错误,您所输入的年份必须在0~9999之间!"<<endl<<"请重新输入要查询的年份:";}else break;}但是,在调试中发现,如果输入一个错误的年份(如12345、-2394),则可以检查出输入有误,并提示重新输入;但如果输入了非数字字符(如wefd、jhdv)时,程序便进入死循环。