数据结构课程设计万年历查询.docx

上传人:b****5 文档编号:3300258 上传时间:2022-11-21 格式:DOCX 页数:25 大小:240.41KB
下载 相关 举报
数据结构课程设计万年历查询.docx_第1页
第1页 / 共25页
数据结构课程设计万年历查询.docx_第2页
第2页 / 共25页
数据结构课程设计万年历查询.docx_第3页
第3页 / 共25页
数据结构课程设计万年历查询.docx_第4页
第4页 / 共25页
数据结构课程设计万年历查询.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

数据结构课程设计万年历查询.docx

《数据结构课程设计万年历查询.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计万年历查询.docx(25页珍藏版)》请在冰豆网上搜索。

数据结构课程设计万年历查询.docx

数据结构课程设计万年历查询

 

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

1.内容:

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

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

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

1.要求:

①输入年份②选择列数③打印日历并写入文件。

说明:

列数表示打印格式12行一列、6行二列、四行三列。

二、功能分析

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

然后去F盘,看file文档即可。

当你输入一个错误的年份,比如-2时。

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

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

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

设公元元年一日是星期一,根据蔡司公式,用365乘以(year-1)再与年多出来的一天求和,与7取余,再加一天,就能求出所求年的一月一日是星期几了。

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

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

4.使输出的数字对齐。

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

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

5.算法的改进设想。

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

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

 

三、设计

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.相应算法实现的源程序(有注解说明)

图4-1:

printf("万年历\n");

printf("请输入年份");

voidDrawMenu()//菜单函数

{

图4-3:

ystem("cls");

cout<

<

cout<<"\t"<

cout<<"\t请选择输出方式"<

cout<<"\t"<

cout<<"\t1.十二行一列"<

cout<<"\t"<

cout<<"\t2.六行二列"<

cout<<"\t"<

cout<<"\t3.三行四列"<

}

while(beContinue)

{

DrawMenu();

while

(1)

{

ch=getchar();

if(ch<='3'&&ch>='1')

break;

DrawMenu();

}

图4-4:

system("cls");

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

{

x=x+Day[j];

First_monthday=(x+First_yearday)%7;//所求年中的每个月的第一天是星期几

out<<"\n****************************************************\n";

out<

out<<"\n****************************************************\n";

out<<"星期日星期一星期二星期三星期四星期五星期六´\n";

for(i=0;i

out<<"";

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

{

if(x<10)

out<<""<

else

out<<""<

if(((x+First_monthday)%7)==0&&x

out<

图4-5.:

system("cls");

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

{

if(j!

=1)

x+=Day[j-1];

First_monthday=(x+First_yearday)%7;

for(i=0;i

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

for(k=1;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-1)%7]=0;

}

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

{

l=1;

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

{

if(l==1)

{

out<<"\n********************************************************************\n";

out<

out<

out<<"\n********************************************************************\n";

out<<"日一二三四五六日一二三四五六\n";

l=0;

}

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

{

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

out<<"";

else

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

out<<""<

else

out<<""<

}

out<<"\t";

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

{

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

out<<"";

else

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

out<<""<

else

out<<""<

}

out<<"\t";

out<

}

out<

}

out.close();

}

}

5.

system("cls");

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

{

if(j!

=1)

x+=Day[j-1];

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

for(i=0;i

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

for(k=1;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-1)%7]=0;

}

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

{

l=1;

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

{

if(l==1)

{

out<<"\n*********************************************************************************\n";

out<

out<

out<

out<<"\n*********************************************************************************\n";

out<<"日一二三¨四五六日一二三四五六日一二三四五六´\n";

l=0;

}

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

{

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

out<<"";

else

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

out<<""<

else

out<<""<

}

out<<"\t";

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

{

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

out<<"";

else

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

out<<""<

else

out<<""<

}

out<<"\t";

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

{

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

out<<"";

else

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

out<<""<

else

out<<""<

}

out<

}

out<

}

四、运行与测试

1.运行界面图。

 

图4-312行1列

图4-4六行2列

 

图4-53行4列

五、总结

这两周课设从开始的确定命题,到搜集资料,到初步编程,到修改代码,到最终完成代码,这是一个学习的过程,一个升华的过程。

我想课设的意义也是在于此吧。

刚开始接触到课题感觉到无从下手,后来通过逐步的思考,认真的研究逐步的建立了整个宏观的流程,然后就是一段时间的埋头苦干,反复优化程序。

现在,一切都结束了,感觉这个命题其实也不难的。

这就告诉我们理论与实践的关系。

想到不一定能做到,但做到了一定会想到,做到不一定有想象的那么难。

只要你愿意做,就一定能做到。

当然课设也有很多的不足,由于刚学完数据结构没多久,因此没有建立一个系统的知识框架,在编程时大体上还是延续C的思路,并没有过多的采用数据结构在算法和效率上进行优化,这是此次最大的不足,也将会是今后学习的重点。

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

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

不过经过自己的独立思考和同学的帮助终于完成了课程设计!

完成该程序后想起自己以前的每一次对自己失去信心,就觉得并不是在知识掌握上打败了,而是自己对自己缺乏信心!

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

也让我懂得了要想成功首先就必须有很强的自信心!

懂得了自己以后要在做任何事情时都要自信!

当自己都不相信自己能够成功时还可能会获得成功吗?

在课程设计的过程中也知道了自己在以前的学习中有很大的不足导致在设计过程中出现了很多的问题,有些地方看不懂也不知道怎么去设计,但是在设计过程中也学习了很多,掌握了自己以前没有学好的知识,虽然一时可以掌握完以前没有学好的知识,不过也给自己敲响了警钟,在学习中不可以伏于表面,要想学好每一门课程都要踏踏实实,做什么都不是给别人看的!

都是要更好的掌握该门知识,提高自己的自身的修养,提高自己的能力!

为以后的工作打下良好的知识基础和技能基础!

当然,我的成功也离不开大家的帮助,所以,在此我要感谢给于过我帮助的指导老师和热心的同学们。

六、参考文献

[1]严蔚敏,吴伟民著.数据结构:

C语言版.清华大学出版社,2007

[2]谭浩强著.C++面向对象程序设计.北京:

清华大学出版社,2006

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

七、附件

程序代码:

#include

#include

#include

usingnamespacestd;

voidDrawMenu()//菜单函数

{

system("cls");

cout<

<

cout<<"\t"<

cout<<"\t请选择输出方式"<

cout<<"\t"<

cout<<"\t1.十二行一列"<

cout<<"\t"<

cout<<"\t2.六行二列"<

cout<<"\t"<

cout<<"\t3.三行四列"<

}

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,l,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<<"Can'topenfile"<

return-1;

}

printf("万年历\n");

printf("请输入年份");

scanf("%d",&year);

First_yearday=(365*(year-1)+(year-1)/4-(year-1)/100+(year-1)/400)%7+1;//判断所求年的一月一日是星期几

leapyear=(year%4==4&&year%100!

=100||year%400==0)?

0:

1;//

Day[2]=(leapyear==1)?

29:

28;//求年是闰年的话,二月置为29天否则二月置为28天

while(year>0)

{

DrawMenu();

while

(1)

{

ch=getchar();

if(ch<='3'&&ch>='1')

break;

DrawMenu();

}

switch(ch)

{

case'1':

system("cls");

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

{

x=x+Day[j];

First_monthday=(x+First_yearday)%7;//所求年中的每个月的第一天是星期几

out<<"\n****************************************************\n";

out<

out<<"\n****************************************************\n";

out<<"星期日星期一星期二星期三星期四星期五星期六´\n";

for(i=0;i

out<<"";

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

{

if(x<10)

out<<""<

else

out<<""<

if(((x+First_monthday)%7)==0&&x

out<

}

}

break;

case'3':

system("cls");

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

{

if(j!

=1)

x+=Day[j-1];

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

for(i=0;i

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

for(k=1;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-1)%7]=0;

}

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

{

l=1;

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

{

if(l==1)

{

out<<"\n*********************************************************************************\n";

out<

out<

out<

out<<"\n*********************************************************************************\n";

out<<"日一二三¨四五六日一二三四五六日一二三四五六´\n";

l=0;

}

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

{

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

out<<"";

else

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

out<<""<

else

out<<""<

}

out<<"\t";

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

{

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

out<<"";

else

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

out<<""<

else

out<<""<

}

out<<"\t";

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

{

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

out<<"";

else

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

out<<""<

else

out<<""<

}

out<

}

out<

}

break;

case'2':

system("cls");

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

{

if(j!

=1)

x+=Day[j-1];

First_monthday=(x+First_yearday)%7;

for(i=0;i

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

for(k=1;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-1)%7]=0;

}

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

{

l=1;

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

{

if(l==1)

{

out<<"\n********************************************************************\n";

out<

out<

out<<"\n********************************************************************\n";

out<<"日一二三四五六日一二三四五六\n";

l=0;

}

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

{

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

out<<"";

else

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

out<<""<

else

out<<""<

}

out<<"\t";

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

{

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

out<<"";

else

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

out<<""<

else

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1