CC++程序设计——万年历(完整代码+实验报告)

合集下载

c语言课程设计报告--万年历

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语言万年历实训报告万年历是一种历法,用于记录每年的日期和星期。

在日常生活中,我们常常需要使用万年历来查询某一天是星期几,或者某个月有多少天。

因此,开发一个万年历程序可以方便我们的日常使用。

本次实训中,我们使用c语言开发了一个简单的万年历程序。

下面将介绍该程序的实现过程和功能。

一、程序界面该程序的界面非常简洁,只有一个输入框和一个查询按钮。

用户可以在输入框中输入日期,然后点击查询按钮,程序将会返回该日期对应的星期几和当月的日历。

二、程序功能1. 输入检查在程序中,我们使用了正则表达式来检查用户输入的日期是否符合格式要求。

具体而言,日期的格式应该为“YYYY-MM-DD”,其中YYYY表示年份,MM表示月份,DD表示日期。

如果用户输入的日期格式不正确,程序将会提示用户重新输入。

2. 星期查询当用户输入符合格式要求的日期后,程序将会计算该日期对应的星期几。

具体而言,我们使用了蔡勒公式来计算星期几。

该公式的计算过程较为复杂,不在此做详细介绍。

3. 月历输出除了星期几之外,程序还能输出当月的日历。

具体而言,程序将会输出该月份的日历表格,其中包括每天的日期和星期几。

为了使输出的日历表格美观整洁,我们使用了格式化输出的方式,将日期和星期几对齐输出。

三、程序实现在程序实现过程中,我们主要使用了c语言中的日期和时间相关函数。

具体而言,我们使用了time.h头文件中的函数来获取当前日期和时间,然后使用strftime函数将其格式化。

我们还使用了ctype.h头文件中的isxdigit函数来检查用户输入的日期格式是否正确,以及math.h头文件中的floor函数来对日期进行取整操作。

除此之外,我们还使用了c语言中的数组和循环语句来实现日历的输出。

具体而言,我们使用了一个二维数组来存储日历中每天的日期和星期几,然后使用循环语句将其输出到屏幕上。

四、程序测试在程序开发完成后,我们进行了多次测试,确保程序的功能正常。

具体而言,我们测试了以下几个方面:1. 输入检查:测试了输入正确日期和错误日期两种情况,确保程序能够正确检查用户输入的日期格式。

C语言万年历设计报告

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语言报告范文1

万年历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语言程序设计报告《万年历》

《“万年历”》—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 定义整型,字符型,指针变量,字符型数组和指针数组。

(2023)C语言万年历设计报告(一)

(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语言万年历课程设计报告

本次课程设计的主题为“C语言万年历”,旨在通过设计和实现一个简单的万年历程序,深入了解C语言程序设计的基本方法和技巧。

通过本课程设计的学习,我对C语言程序设计的各个方面进行了深入的了解和掌握,同时也提高了自己的编程思维和实践能力。

一、设计思路。

本次课程设计的主要功能是实现万年历。

在设计程序之前,我首先对万年历的基本功能进行了分析和思考,包括输入年月日,输出当月的日历和星期几等。

同时,考虑到用户友好性,我还增加了一些额外的功能,如输入错误时的提示,具体日历同时附带节假日等。

在分析了功能需求之后,我便开始考虑程序设计的具体实现。

首先,我选择了C语言作为实现程序的语言,因为C语言广泛应用于各类软件工程和移动计算等领域,适用性强,易于学习和掌握。

接着,我根据分析需求,确定了程序的基本框架和主要模块,包括输入年月日模块、求解该日是星期几模块、绘制当月日历模块和判断节日等模块。

二、程序实现。

在程序实现过程中,我遵循了模块化编程的原则,把整个程序划分成几个独立的模块,并在模块之间进行数据交互和函数调用。

具体来说,我分别实现了以下几个模块:1.输入年月日模块:该模块负责接收用户输入的年月日信息,并检查输入格式是否正确。

在输入不合法时,该模块能够给用户相应的提示信息,并要求用户重新输入。

2.求解该日是星期几模块:该模块根据给定年月日,求出该日是星期几。

该模块采用基姆拉尔森计算公式来实现。

3.绘制当月日历模块:该模块负责绘制给定月份的日历,并标注当日及节假日等信息。

在绘制日历时,该模块能够考虑各种特殊情况,如闰年、月初不为星期一等。

4.判断节日等模块:该模块能够根据给定年月日信息,判断当日是否为节假日、纪念日等特殊日子,如春节、圣诞节等,并在日历上作出相应标注。

以上四个模块构成了整个程序的主要功能。

在实现过程中,我还遇到了一些问题,如求解闰年的问题、绘制多行日历的问题等。

针对这些问题,我通过查找资料、借鉴其他同学的代码等方式进行了解决。

桌面万年历程序设计综合实践报告

桌面万年历程序设计综合实践报告

程序设计综合实践报告(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可以判断出某一天是周几,然后可以确定日历表中各个月份天数所在的位置,实现了万年历的基本功能。

其次,利用按键功能,实现了对年月日的的选择。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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; } }
否 判断输入


是闰年
结 束
return 1
不是闰年 return 0
图 3-1
结 束 图 3-2
开 始 是 否
year>=2005
n=(year-2005)*365
n=(2005-year)*365
year 为闰年 是 n=n+1


year 为闰年 是 n=n+1
三、概要设计
1、主要类:
class Data { private: int Week[12]; int year; public: 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(); };
"; ";
/*函数功能: 控制日历的输出格式,使日历能够以每两个月并排的方式输出 函数参数: 整型变量 n,存放当前打印的月份 函数返回值:无返回值*/ void Data::PrintForm(int n) { if(n%2) //如果是单月,则输出空格 { cout<<" "; fout<<" "; } else //若为双月,则输出回车换行 { cout<<endl; fout<<endl; }
程序设计报告
(2009/2010 学年第一学期)

目:
万年历查询系统
专 学 班 指 指 日 生 级 导 导 姓 学 教 单
业 名 号 师 位 期
电气信息工程 王 XX B080510XX 张台国
_
计算机软件基础教学中心 2009.10.30
-
评分项 遵守机房规章制度
优秀
良好
中等


上机时的表现 学习态度 程序准备情况
正文 第 5 页(共 18 页)
{ 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 表示列*/
正文 第 6 页(共 18 页)
} /*函数功能: 打印每个月日历的表头部分信息,并为每两个月并列显示 函数参数: 整型变量 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<<" ";
char ss[5][10][7]= {"***** "," "* "* "* cout<<"\n fout<<"\n * "," * "," * "," * ","***** ","***** ","* * "," * ","* * "," "," * ","* * "," * ","***** ","***** ","***** ","***** ","***** ", * ","* * "," ","* * ","* "," * "," * ","* * ","* * ","* * "," * ", * ", * ","***** ","***** ", * ","***** ","***** ",};
//用于储存每个月 1 号为星期几 //用于存放用户输入的年份 //类 Data 的构造函数 //获取用户输入的年份 //求出任意一年元旦的星期数 //求出任意年份的每个月一号的星期数 //判断是否为闰年 //显示年份图案 //输出每个月日历的标题部分 //打印月份日历 //使日历按照每两个月并排的方式输出 //显示选择操作界面,实现程序的循环 //退出程序时显示结束信息
Week[0]=(n+1)%7-2
Week[0]=7-(n+1)%7
结 束
图 3-3
正文 第 3 页(共 18 页)
(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 的对象 data int yy=data.Getyear(); data.PrintYear(yy); data.FirstDayOfYear(yy); data.ChooseMenu(); } /*函数功能: 判断输入的年份是否为闰年,如果是则返回 1,否则返回 0
相关文档
最新文档