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

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

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
正文 第 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 表示列*/
/*实现 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; } }
源自文库
2、主要函数流程图: (1)类的构造函数:用于给类的对象赋值。提示用户输入数据,并具有较强的错误输 入数据检查功能。(参见图 3-1) (2)闰年判断函数:判断哪些年份为闰年。 (图 3-2)
正文 第 2 页(共 18 页)
开 始
开 始
year%4==0

输入待查询的 年份


year%100==0
"; ";
/*函数功能: 控制日历的输出格式,使日历能够以每两个月并排的方式输出 函数参数: 整型变量 n,存放当前打印的月份 函数返回值:无返回值*/ void Data::PrintForm(int n) { if(n%2) //如果是单月,则输出空格 { cout<<" "; fout<<" "; } else //若为双月,则输出回车换行 { cout<<endl; fout<<endl; }
char ss[5][10][7]= {"***** "," "* "* "* cout<<"\n fout<<"\n * "," * "," * "," * ","***** ","***** ","* * "," * ","* * "," "," * ","* * "," * ","***** ","***** ","***** ","***** ","***** ", * ","* * "," ","* * ","* "," * "," * ","* * ","* * ","* * "," * ", * ", * ","***** ","***** ", * ","***** ","***** ",};
正文 第 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<<" ";

程序设计能力 团队合作精神 课题功能实现情况

算法设计合理性 用户界面设计 报告书写认真程度

内容详实程度 文字表达熟练程度 回答问题准确度
简 短 评 语
教师签名: 年 月 日
评 分 等 级 备 注
评分等级有五种:优秀、良好、中等、及格、不及格
-
万年历查询系统
一、课题内容和要求
万年历在现在日常生活工作学习等众多方面被广泛使用。本课题旨在以“公元 2005 年 10 月 20 日星期四”为已知条件编写一个基本的万年历查询系统,可以查询公元元年至 公元 9999 年间任一年的全年日历,以双月并排显示的方式输出,并要求对用户输入的待 查询数据有较强的错误检查能力。通过该课题,进一步加深对 C++面向对象特性的认识, 更加深层的理解了类的封装意义,较为熟练的掌握了函数调用、文件读写、对象操作等知 识。
* ","***** ","***** ","***** ","***** ","***** "," * ","***** ","***** "," * ","***** ","***** ","
"***** ","
=====================公元"<<year<<"年日历====================="<<endl; =====================公元"<<year<<"年日历====================="<<endl;
正文 第 4 页(共 18 页)
函数参数: 整型变量 mm,存放输入的年份 函数返回值:闰年则返回 1,否则返回 0*/ int Data::IsLeapyear(int mm) { if(((mm%4==0)&&(mm%100!=0))||(mm%400==0)) return 1; else return 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)
三、概要设计
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(); };
否 判断输入数 据是否正确


year%400==0


是闰年
结 束
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 号为星期几 //用于存放用户输入的年份 //类 Data 的构造函数 //获取用户输入的年份 //求出任意一年元旦的星期数 //求出任意年份的每个月一号的星期数 //判断是否为闰年 //显示年份图案 //输出每个月日历的标题部分 //打印月份日历 //使日历按照每两个月并排的方式输出 //显示选择操作界面,实现程序的循环 //退出程序时显示结束信息
二、需求分析
功能框架图: (图 2-1)
进入万年历查询系统
输入待查询年份
检查输入的数 据是否有误 否 打印*号组成的年份图案

计算待求年份元旦为星期几
打印每月日历的标题与日期

是否继续查询 其它年份日历 否 退出万年历查询系统
图 2-1
正文 第 1 页(共 18 页)
功能详解: (1)提供界面友好的操作菜单: 输出欢迎信息和操作菜单, 用于提示用户选择需要的操 作。根据用户输入的选项实现相应的功能。 (2)进行数据的输入和错误检查:要求用户输入待查询数据,并对输入的数据执行错 误检查,如果输入有误,则提示用户重新输入,直到输入正确。 (3)计算待求年份元旦的星期数:通过求出待求年份与 2005 年元旦相距的总天数求出 待求年份元旦的星期数,为准确输出万年历奠定基础。 (4)打印日历的标题和日期:可以将万年历以双月并排的形式输出,一方面使得万年 历看起来美观;另一方面,也确保了万年历日期与星期的准确对应。 (5)选择菜单:供用户选择需要继续的操作,具有较强的输入数据错误检查能力;同 时实现了程序操作的循环性。
程序设计报告
(2009/2010 学年第一学期)

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


上机时的表现 学习态度 程序准备情况
相关文档
最新文档