程序设计- 万年历

更新时间:2023-09-22 20:28:01 阅读量: 经管营销 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

程序设计报告

( 2013 / 2014 学年 第 二 学期)

题 目:万年历

专 业 地理信息科学 组长 学号姓名 B13090223 邵家琦 组员 学号姓名 B13090222 陈俊良 B13090224 练彤天 指 导 教 师 郭剑 指 导 单 位 计算机软件教学中心 日 期 2014年4月25日

- 1

组长(邵家琦) 设计算法;调试程序; 编写程序;编写文档; 查找资料; 编写程序; 查找资料; 编写程序; 优秀 良好 中等 差 成员分工 组员(练彤天) 组员(陈俊良) 评分项 遵守机房规章制度 上机时的表现 学习态度 程序准备情况 程序设计能力 评分细则 团队合作精神 课题功能实现情况 算法设计合理性 用户界面设计 报告书写认真程度 内容详实程度 文字表达熟练程度 回答问题准确度 简短评语 教师签名: 郭剑 2014 年 4 月 28 日 评分等级备注 B13090223 邵家琦 B13090222 陈俊良 B13090224 练彤天 评分等级共五种:优秀、良好、中等、及格、不及格

- 2

万年历

一、 课题内容和要求

问题描述:已知2005年10月20日是星期四。现要求编写一个程序,输出指定年份的日历到规定路径的.txt文件。

万年历要能提供以下几个基本功能:

(1)从键盘读入要求输出日历的年份xxxx,此部分要求对读入的数据具有一定的错误检查能力,如输入的不是数字,或输入的是五位以上的年份等。

(2)根据2005年10月20日是星期四,推算出xxxx年的1月1日是星期几。 (3)输出到指定文件夹下面。

二、 需求分析

万年历系统的功能框架图如图一所示。

输入年份万年历系统

错误判断输入是否合法正确输出年历文本输出屏幕输出- 3

图一

三、概要设计

1 主要结构体

class Data //声明一个类Data { //私有变量 public:

int year;//公有变量

void getyear(); //提示用户输入想要查询的年份

void PrintYear();

int ioleapyear(int year); //判断该年是不是闰年 int weekday(); //判断该年的元旦是星期几 int monthday(int i); //该年每个月的天数

int char_to_int();//判断输入字符是否合法

int NowToDay(int year,int month ,int day); // 累计天数 void DisplayYear ( int year );

};

2 主要函数流程图

(1)char_to_int() //把输入的字符转换为数字

开始输入字符图二Year=1000*a+100*b+10*c+d否E为‘\\0’且year在0~10000间输出年份结束- 4

(2)ioleapyear() //判断闰年和平年

开始闰年366天得到年份是结束被4整除且不被100整除或者被400整除平年365天否

(3) weekday(); //判断该年的元旦是星期几

开始除以7取余数得到该年元旦时周几得到年份递推依次得到该年每天是周几计算该年元旦与已知日期的天数存储数据图四结束5

- 图三

(3)dispyear() //显示函数

开始结束得到年份是月份加一图五否月份小于12否换行由第一天开始在对应的周几下输出日期是否小于每月实际天数是两个月同时到最后一天否日期加一是输出

四、源程序代码

#include #include #include using namespace std;

ofstream outfile(\万年历.txt\ class Data //声明一个类Data { //私有变量 public: int year;//公有变量

void getyear(); //提示用户输入想要查询的年份 void PrintYear();

int ioleapyear(int year); //判断该年是不是闰年 int weekday(); //判断该年的元旦是星期几 int monthday(int i); //该年每个月的天数 int char_to_int();//判断输入字符是否合法 int NowToDay(int year,int month ,int day); // 累计天数 void DisplayYear ( int year ); };

char* weekd[7]={\ //记录星期一到星期天

- 6

void Data::getyear() {

cout<<\请输入你想要查询的年份:\ year= char_to_int(); }

int Data::ioleapyear(int year) //判断闰年和平年,闰年返回1,平年返回0 {

if(year%4==0&&year0!=0||year@0==0) //计算闰年和平年的方法 //四位年份能被4整除但不能被100整除,或能被400整除 return 1; else

return 0; }

int Data::weekday() {

int n=year-1900; //已知1900年的元旦刚好是星期一

n=n+(n-1)/4+1; // 判断,以每年52个整星期计算year年比1900年多出来的天数 //多出来的天数除以7的余数就是这年第一天是星期几 n=n%7;

if(n==0) //当n=0的时候是周日,使它返回7

return 7; //返回输入的年份的元旦是星期几 else

return n; //n不是0的时候反回n的值就是星期几 }

int Data::monthday(int i) //这里是返回月有几天的,i是月份 {

if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)

return 31; //如果是1,2,5,7,8,10,12月,则返回是31天 else if (i==2) //判断2月

if(ioleapyear(year)) //当ioleapyear()返回1时就是闰年,则为29天,ioleapyear()是一个函数,调用的一个函数

return 29;

else return 28; //否则为28天 else

return 30; //其他的月份为30天 }

int Data::char_to_int() { char year_char[5]; int year1=0,i=0; bool j=0;

there:cin>>year_char; for( i=0;year_char[i]!='\\0';i++)

- 7

{ if(year_char[i]<'0'||year_char[i]>'9') {cout<<\输入的年份有误,请重新输入\

if(i>=5){cout<<\输入的年份有误请重新输入\ else j=1; } if(j==1) for( i=0;year_char[i]!='\\0';i++) year1=year1*10+year_char[i]-48; else goto there; return year1; }

void Data::PrintYear() {

int m=year/1000; int n=(year/100); int p=(year/10); int q=year;

int num[4]={m,n,p,q}; char ss[5][10][8]={ \ \ * \ \ \ * \\ \ \

\ * \ * \ * \ * \ * \ * \ * \

\ * \ * \ \ \ \\ \ \

\ * \ * \ \ * \ * \ * * \ * \

\ \ * \ \ \ * \\ \ \

for(int g=0;g<5;g++)

{{cout<<\ \ \for(int i=0;i<4;i++) {

for(int h=0;h<7;h++) { { cout<

{cout<

int Data :: NowToDay(int year,int month ,int day) { int DiDay , i;

for( i =1800 , DiDay = 0 ; i < year ; i++) // 闰年 单独+ 366 天 if( ioleapyear( i ) ) DiDay += 366; else DiDay += 365;

8

- \\ \\ * \\\ * \ * \ * \ * \\ for( i = 1 ; i < month ; i++ ) DiDay += monthday(i); DiDay += day - 1 ; return DiDay; }

void Data ::DisplayYear ( int year ) { int i , j, n , month1 ,month2 ;// 按照 一个季度输出 日历 month1 month2 month3 是 该月应该有天数

int Excur1 , Excur2 ; // i , j , k 分别表示 三个月的 天数值 Excur1,Excur2,Excur3 表示偏移量

int sea; char

Months[12][10]={{\\

const int SpaceSize = 4;

for( sea = 1 ; sea <= 12 ; sea += 2 ){ // 分两列显示 Excur1 = ( NowToDay(year,sea, 1) + 3 ) % 7 ; // 分别计算2个月的偏移量 Excur2 = ( NowToDay(year,sea+1 , 1 ) + 3 ) % 7; month1 = monthday(sea ); // 分别计算 2个月的 天数 month2 = monthday(sea + 1 ); cout<

outfile<< setw( SpaceSize ) <<\<<\ ; //出

cout << setw( SpaceSize ) <<\<<\ //周

outfile<< setw( SpaceSize ) <<\<<\ //号

cout << setw( SpaceSize ) <<\ outfile << setw( SpaceSize ) <<\ cout << setw( SpaceSize ) <<\<<\ ;

outfile<< setw( SpaceSize ) <<\<<\ ;

cout << setw( SpaceSize ) <<\<<\

outfile<< setw( SpaceSize ) <<\<<\

cout << setw( SpaceSize ) <<\ for( n = 1 ; n <= Excur1; n++) // 第一行 单独处理 首先输出 多余的空格 然后在输出天数

- 9

{ cout<< setw( SpaceSize ) << \ ; outfile << setw( SpaceSize ) << \ ;} //处理奇数月 for( n ;n<=7;n++) {cout<

{cout<< setw( SpaceSize ) << \ ;outfile<< setw( SpaceSize ) << \ ;} i = n - Excur1 ;// i ,j 单独保存当前的日期 for( n = 1; n <= Excur2; n++) {cout<< setw( SpaceSize ) << \ ; outfile << setw( SpaceSize ) << \ ;} for( n ; n <= 7 ;n++) // 第一行 单独处理 首先输出 多余的空格 然后在输出天数 { cout<

{cout<< setw( SpaceSize ) << \ ;outfile<< setw( SpaceSize ) << \ ;} {cout<

cout << endl;outfile<

int main() {

Data a; //创建一个对象a

// ofstream outfile(\万年历.txt\ if (!outfile) {

cerr<<\万年历.txt\\\ exit(-1); }

cout<

cout<<\ <

a.getyear(); //调用对象a里的函数,这个就管输入一个年份 a.PrintYear(); a.DisplayYear(a.year); system(\

- 10

return 0; }}.

五、测试数据及其结果分析

运行后,程序的主菜单界面如下。图a。

1.输入“abcd”,运行结果如下,图b

2.输入“123456”,运行结果如下,图c

- 11

3.输入“A123”,运行结果如下,图d

4.输入“2005”,运行结果如下,图e

- 12

5.输入“2014”,运行结果如下,图f

- 13

6.输出的文件,如图g

结果分析如下。

(1)

在输入菜单选项时如果输入的内容不是1-0之间的数字,而是其他字符,系统将继续执行等待下次正确的输入;若输入的为大于5位的数字,将继续等待下次正确的输入;

输入的为5位以下的数字时,执行下一步操作。

(2)

六、调试过程中的问题

(1)在字符判断函数中,原来是不把字符和超过5位数字分开的,这样的话比如输入“a12”,由该表达式算出的结果根据ASCII码来算的话仍然在允许的范围内,所以我们选择了分开判断。

(2)在计算每个月日子的时候,先将2月作为30日处理,再在基础上减去。后发现运行过程中和原先算法预计的情况不同,所以我们选择将12个月的日子枚举出来,2月默认为28天,闰年29天。

(3)在推算每天是周几的时候,我们原来以非元旦计算,就会出现有些日期出现错误的情况。后改用每年的元旦开始计算周几,实现了只需考虑元旦随后在一年内除以7取

- 14

余数的算法。

(4)在输出年份的算法中,原先输出的字符形状有不准之处,我们就以“1234....abcd....!@#$%^& ”等字符来代替“*”,就得以很快定位到字符串不准确的地方,实现修改。

(5)文件输出的过程中,起先无法将字符文件和日历文件同时输出,后发现将“ofstream outfile(\万年历.txt\”语句放在程序起始部,成为一个全局函数的声明,就

可以实现输出文件了。

七、课程设计总结

程序设计是培养学生综合运用所学知识 ,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。因此作为二十一世纪的大学生来说掌握程序开发技术是十分重要的,而C++语言又是最常见,功能最强大的一种高级语言,因此做好C++语言课程设计是十分必要的。

通过C++课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重。做程序设计,难免会遇到过各种各样的问题,同时在设计的过程中我们也发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说数组的灵活应用,循环语句,类的封装与继承??通过这次程序设计之后,我们把前面所学过的知识又重新温故了一遍。

我们做的是简易万年历的课程设计,虽然是很简单的一个小的程序,但对我们来说也是是一个不小的困难。开始的时候真的感觉编程是一件很复杂的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。又经过几天的努力,终于把程序完成了,尽管程序还是有很多功能上的欠缺和漏洞,但我们仍然会继续努力实现更大的提高。

随着信息技术的发展, 计算机语言逐步显示了其重要性。信息的处理就显得尤为重要。而我们相信随着我们不断地努力,一定可以成为信息波浪中的弄潮儿!

- 15

本文来源:https://www.bwwdw.com/article/iqcd.html

Top