数据结构课程设计万年历查询_第1页
数据结构课程设计万年历查询_第2页
数据结构课程设计万年历查询_第3页
数据结构课程设计万年历查询_第4页
数据结构课程设计万年历查询_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录

一、题目概述(内容及要求)...............................2

二、功能分析.............................................2

三、设计.................................................3

四、运行与测试..........................................11

五、总结.................................................15

参考文献.................................................16

一、题目概述(内容及要求)

1.内容:

输出公元1年至9999年的日历;

以标准日历的形式输出,包含月份、星期以及具体某一天对应的年、月、星期;

用数据结构课上所学二叉树及队列顺序存储形式存储。

1.要求:①输入年份②选择列数③打印日历并写入文件。说明:列数表示打印

格式12行一列、6行二列、四行三列。。。。。

二、功能分析

1.当你输入正确的公元年份时,程序会弹出选择菜单,然你选择输出方式。然

后去F盘,看file文档即可。当你输入一个错误的年份,比如-2时。因为这

个年份无法通过循环的判定,所以程序无法继续下去。

同时,时间复杂度为Q(n)0

2.确定每年的第一天是星期儿。

设公元元年一日是星期一,根据蔡司公式,用365乘以(year-1)再与年多

出来的一天求和,与7取余,再加一天,就能求出所求年的一月一日是星期

儿了。

3.确定所求年是不是闰年。

普通年能被4整除且不能被100整除的为闰年。

4.使输出的数字对齐。

当输出数字小于10时,输出两个空格。当输出数字大于等于10时,输

出一个空格。

5.算法的改进设想。

(1)可以不以公元元年一月一日为起点,可以找出任意年的任意天作为原

点。

(2)case2,case3中的计算首日的部分可以共享,这样能减少代码长度。

图2-1程序功能图

三、设计

1.每个程序中使用的存储结构设计说明。

本程序用到的存储结构式数组

intmonth[13>{0,1,2,3,4,5,6,7,8,9,10,11,12}〃储存一年的总月数

intDay[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}〃储存每个月

的天数

inti=12;〃月份

intj=6;//每个月需要打印的行数

intk=7;//每个月需要打印的列数

a[i][j][k]〃储存每个月里,每个数据的位置

2.每个部分的算法设计说明。

图3-1算法流程图1

图3-2算法流程图2

图3-3算法流程图3

3.相应算法实现的源程序(有注解说明)

图4T:printf(,z万年历\n〃);

printf(〃请输入年份〃);

voidDrawMenu()〃菜单函数

图4-3:ystem(〃cls〃);

cout<<endl

«endl;

cout«,z\t/z<<endl;

cout<<,z\t请选择输出方式,z«endl;

cout«/z\tz\<endl;

COUt«Z,\t1.十二行一列/z«endl;

COUt«Z,\t〃<〈endl;

cout«,z\t2.六行二列〃<<endl;

COUt«Z,\t/z<<endl;

C0Ut«z,\t3,三行四列,,<<endl;

while(beContinue)

(

DrawMenu();

while(1)

(

ch=getchar();

if(ch<=,3'&&ch>=,T)

break;

DrawMenu();

图4-4:system(z/cls,z);

for(j=l;j<13;j++)

(

x=x+Day[j];

First_monthday=(x+First_yearday)%7;〃所求年中的每个月的第一1天是

星期儿

out«year<〃年〃<<〃z/<<month[j]«^月”;

out«〃星期日星期一星期二星期三星期四星期五星期六’\n〃;

for(i=0;i<First_monthday;i++)〃在每个月的第一天开始前,用空

格补位

out«?,〃;

for(x=l;x<=Day[j];x++)〃在每个月结束后用空格补位

(

if(x<10)

out«/z/z«x;

else

out«z,z,<<x;

if(((x+First_monthday)%7)==0&&x<Day[j])〃换行

out<<endl;

图4-5.:system(z,clsz,);

for(j=l;j<13;j++)

if(j!=l)

x+=Day[j-l];

First_monthday=(x+First_yearday)%7;

for(i=0;i<First_monthday;i++)

a[j-l][0][i]=0;

for(k=l;k<=Day[j];k++)

a[j-l][(i+k-l)/7][(i+k-l)%7]=k;

for(;k<43-First_monthday;k++)

a[j-l][(i+k-l)/7H(i+k-l)%7]=0;

)

for(i=0;i<12;i+=2)

(

1=1;

for(j=0;j<6;j++)

(

if(1==1)

***********\n〃;

out«year<<“年〃<<i+l<<〃月;

out«year<<〃年〃«i+2<X〃月〃<<〃\t\t〃;

*******\n〃;

out。"日•二三四五六日一二三四五六

1=0;

)

for(k=0;k<7;k++)

if(a[i][j][k]==0)

out<<”";

else

if(a[i][j][k]<10)

out<C

else

outY

out«"\t";

for(k=0;k<7;k++)

if(a[i+l][j][k]==0)

out<<”

else

if(a[i+l][j][k]<10)

out。"/,«a[i+l][j][k];

else

out<<z,z,«a[i+l][j][k];

)

out<<z/\tz/;

out«endl;

)

out<<endl;

)

out.close();

)

5.

system("cis");

for(j=l;j<13;j++)

(

if(j!=l)

x+=Day[j-l];

First_monthday=(x+First_yearday)%7;〃计算每个月的第一天是星

期几

for(i=0;i<First_monthday;1++)〃每个月到达第一天之前,置0

[0][i]=0;

for(k=l;k<=Day[j];k++)

(

a[j-1][(i+k-1)/7][(i+k-1)%7]=k;//输出日期

for(;k<43-First_monthday;k++)〃排版

a[j-1][(i+k-1)/7][(i+k-l)%7]=0;

for(i=0;i<12;i+=3)

(

1=1;

for(j=0;j<6;j++)

(

if(l==l)

out<〈year<<"年<<"月;

out«year<<"年”《i+2久"月

out<〈year«"年"<Xi+3〈〈“月;

out«,z日一二三.・二三六日一二三四五六日一二三

四五六'\n〃;

1=0;

)

for(k=0;k<7;k++)〃置零处,置成空格

(

if(a[i][j][k]==0)

out<<z/";

else

if(a[i][j][k]<10)

out。”"«a[i][j][k];

else

out<<-[k];

out«"\t";

for(k=0;k<7;k++)

(

if(a[i+l][j][k]==0)

out<<,z

else

if(a[i+l][j][k]<10)

out。”,,«a[i+l][j][k];

else

out<<〃

)

OUt«/Z\t,Z;

for(k=0;k<7;k++)

(

if(a[i+2][j][k]==0)

out<<,z〃;

else

if(a[i+2][j][k]<10)

out«,zz,«a[i+2][j][k];

else

out<<〃"<<a[i+2][j][k];

)

out<<endl;

)

out<<endl;

四、运行与测试

1.运行界面图。

6一C:\Docu»entsandSettings\Ad>inistrator\桌面'教学软件\Debug\翼马超12030--日I3E3

''D

请输入年份|

图4-1(输入年份之后单击回车)

c\C:\Docu>entsandSettings\Ad>inistrator\桌面'教学软件\Debug\翼马超12030...HlfiW

请选择输出方式

1.十二行一列

2.六行二列

3.三行四列

图4-2(选择输出方式,单击回车后自动写入文件)

2嬴年1月

星期日星期一星期二星期三星期四星期五星期六

135

678101112

13141516171819

20212223242526

2728293031

**************************************************:**

2000年2月

****************************************************

星期日星期一星期二星期三星期四星期五星期六

4

5671011

1213141718

1920212425

262728

************¥:*****¥:*******************:**************

2000年3月

****************************************************

星期日星期一星期二星期三星期四星期五星期六

123

567891011

12131415161718

19202122232425

262728293031

****************************************************

2000年4月

************************:1:****:1:***************:1:******

星期日星期一星期二星期三星期四星期五星期六

12

3456789

10111213141516

17181920212223

24252627282930

图4-312行1列

2000年1月2000年2月

日一二三四五六日一二三四五六

11234

3456786789101112

10111213141513141516171819

1617181920212220212223242526

232425262728292728

3031

2000年3月2000年4月

日一二—四五六a一二三四五六

1345

67810111234567

1314151617181910111213141516

2021222324252617181920212223

272829303124252627282930

瑞蕃5月******2温年々月

B——四五六S——四五六

1-456734

8101112131456781011

1516171819202112131415161718

2223242526272819202122232425

2930312627282930

图4-4六行2列

2000年1月2000年2月2000年3月

*********************************************************************************

日一二三四五六日一二三四五六日一二三四五六

11234512345

234567867891011126789101112

91011121314151314151617181913141516171819

161718192021222021222324252620212223242526

2324252627282927282728293031

3031

2000年4月2000年5月2000年6月

B一—四五六S—二—四五八B——四五六

567234

34567101112131456791011

101112131415161516171819202112131415161718

171819202122232223242526272819202122232425

242526272829302930312627282930

2000年7月2000年8月2000年9月

*********************************************************************************

日一二三四五六日一二三四五六日一二三四五六

12123456123

34567897891011121345678910

101112131415161415161718192011121314151617

171819202122232122232425262718192021222324

2425262728293028293031252627282930

31

图4~53行4列

五、总结

这两周课设从开始的确定命题,到搜集资料,到初步编程,到修改代

码,到最终完成代码,这是一个学习的过程,一个升华的过程。我想课设

的意义也是在于此吧。刚开始接触到课题感觉到无从下手,后来通过逐步

的思考,认真的研究逐步的建立了整个宏观的流程,然后就是一段时间的

埋头苦干,反复优化程序。现在,一切都结束了,感觉这个命题其实也不

难的。这就告诉我们理论与实践的关系。想到不一定能做到,但做到了一

定会想到,做到不一定有想象的那么难。只要你愿意做,就一定能做到。

当然课设也有很多的不足,由于刚学完数据结构没多久,因此没有建立一

个系统的知识框架,在编程时大体上还是延续C的思路,并没有过多的采

用数据结构在算法和效率上进行优化,这是此次最大的不足,也将会是今

后学习的重点。

在设计过程中不能够把书本上的知识与实践相结合,这也就增加了设计不好

该程序的想法!在设计过程中的一次次设计错误增加了我放弃的想法!不过经过

自己的独立思考和同学的帮助终于完成了课程设计!完成该程序后想起自己以前

的每一次对自己失去信心,就觉得并不是在知识掌握上打败了,而是自己对自己

缺乏信心!只要自己对自己不失去信心相信就可以完成那些以前认为完成不了的

事情!也让我懂得了要想成功首先就必须有很强的自信心!懂得了自己以后要在

做任何事情时都要自信!当自己都不相信自己能够成功时还可能会获得成功吗?

在课程设计的过程中也知道了自己在以前的学习中有很大的不足导致在设

计过程中出现了很多的问题,有些地方看不懂也不知道怎么去设计,但是在设计

过程中也学习了很多,掌握了自己以前没有学好的知识,虽然一时可以掌握完以

前没有学好的知识,不过也给自己敲响了警钟,在学习中不可以伏于表面,要想

学好每一门课程都要踏踏实实,做什么都不是给别人看的!都是要更好的掌握该

门知识,提高自己的自身的修养,提高自己的能力!为以后的工作打下良好的知

识基础和技能基础!

当然,我的成功也离不开大家的帮助,所以,在此我要感谢给于过我帮助的

指导老师和热心的同学们。

六、参考文献

[1]严蔚敏,吴伟民著.数据结构:C语言版.清华大学出版社,2007

[2]谭浩强著.C++面向对象程序设计.北京:清华大学出版社,2006

[3]李爱华著.C++面向对象程序设计.

七、附件

程序代码:

#include<iostream>

#include<conio.h>

#include<fstream>

usingnamespacestd;

voidDrawMenu()〃菜单函数

system(〃cls〃);

cout«endl

<<endl;

cout«/z\t"«endl;

cout«z/\t请选择输出方式/z<<endl;

cout«,z\t/z<<endl;

cout<</z\t1.十二行一列,z<<endl;

cout<<z'\t/z<<endl;

cout«/z\t2.六行二列z,«endl;

COUt«/Z\tz,«endl;

COUt<<,Z\t3.三行四列,z«endl;

)

intmain()

inta[12][6][7];

intyear;

intmonth[13]={0,1,2,3,4,5,6,7,8,9,10,11,12};〃定义一年的总月

intday;

intleapyear;〃闰年

intFirst_yearday;〃一年的第一天

intFirst_monthday;〃一个月的第一天

intx=0,i,j,k,1,y;

charch;

intDay[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//定义每

个月有多少天

ofstreamout;〃写入文件

out.open(,,f:\\file.txt",ios::out);

if(!out)

(

cout<<z,CanJtopenfile!!!z,<<endl;

return-1;

)

printfC万年历\n〃);

printf(〃请输入年份〃);

scanf(〃%d〃,&year);

First_yearday=(365*(year-1)+(year-1)/4-(year-1)/100+(year-1)/4

00)%7+l;"〃判断所求年的一月一日是星期儿

leapyear=(year%4==4&&year%100!=100I|year%400==0)?0:1;//

Day[2]=(leapyear==l)?29:28;〃求年是闰年的话,二月置为

29天否则二月置为28天

while(year>0)

(

DrawMenu();

while(l)

(

ch=getchar0;

if(ch<=,3'&&ch>=?T)

break;

DrawMenu();

switch(ch)

caseP:

system(z,cls,z);

for(j=l;j<13;j++)

(

x=x+Day[j];

First_monthday=(x+First_yearday)%7;〃所求年中的每个月的第一1天

是星期儿一

out〈<year«〃年〃〈〈"z,«month[j]月”;

[]t<<〃\51c51c51c51c51c51c51c51c51c51c51c51c51c51c51c51c51c51c51c51c51c51c51c51c\j~|〃.

out«〃星期日星期一星期二星期三星期四星期五星期‘六

'\n〃;

for(i=0;i<First_monthday;i++)〃在每个月的第一天开始前,

用空格补位

out«zz〃;

for(x=l;x<=Day[j];x++)〃在每个月结束后用空格补位

if(x<10)

OUt«Z,Z,«X;

else

out«z/z,<<x;

if(((x+First_monthday)%7)==0&&x<Day[j])〃换行

out<<endl;

}

break;

case'3’:

system(〃cls〃);

for(j=l;j<13;j++)

if(j!=l)

x+=Day[j-l];

First_monthday=(x+First_yearday)%7;〃计算每个月的第一天

是星期儿

for(i=0;i<First_monthday;i++)〃每个月到达第一天之前,置0

a[j-l][0][i]=0;

for(k=l;k<=Day[j];k++)

a[j-l][(i+k-l)/7][(i+k-l)%7]=k;〃输出日期

for(;k<43-First_monthday;k++)〃排版

a[j-l][(i+k-l)/7H(i+k-l)%7]=0;

for(i=0;i<12;i+=3)

(

1=1;

for(j=0;j<6;j++)

(

if(1==1)

out〈〈year<<"年"<<i+l<<"月"<<'\t\t\t";

out〈<year<<"年月;

out〈<year<<"年月;

out。"日二三,•四五)/日一二三四五六日一二

三四五六'\n";

1=0;

)

for(k=0;k<7;k++)〃置零处,置成空格

(

if(a[i][j][k]==0)

out<<z"";

else

if(a[i][j][k]<10)

out。”"«a[i][j][k];

else

)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论