数据结构课程设计万年历查询
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
一、题目概述(内容及要求) (2)
二、功能分析 (2)
三、设计 (3)
四、运行与测试 (11)
五、总结 (15)
参考文献 (16)
一、题目概述(内容及要求)
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. 每个程序中使用的存储结构设计说明。
本程序用到的存储结构式数组
int month[13]={0,1,2,3,4,5,6,7,8,9,10,11,12} //储存一年的总月数int Day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31} //储存每个月的天数
int i=12; //月份
int j=6; //每个月需要打印的行数
int k=7; // 每个月需要打印的列数
a[i][j][k] //储存每个月里,每个数据的位置
2.每个部分的算法设计说明。
图3-3 算法流程图3
3. 相应算法实现的源程序(有注解说明)
图4-1:printf(" 万年历 \n "); printf("请输入年份");
void DrawMenu() //菜单函数
{
图4-3:ystem("cls");
cout<<endl
<<endl;
cout<<"\t "<<endl;
cout<<"\t 请选择输出方式 "<<endl;
cout<<"\t "<<endl;
cout<<"\t 1.十二行一列 "<<endl;
cout<<"\t "<<endl;
cout<<"\t 2.六行二列 "<<endl;
cout<<"\t "<<endl;
cout<<"\t 3.三行四列 "<<endl;
}
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<<year<"年"<<" "<<month[j]<<”月”;
out<<"\n****************************************************\n";
out<<" 星期日星期一星期二星期三星期四星期五星期六´\n";
for(i=0;i<First_monthday;i++) //在每个月的第一天开始前,用空格补位
out<<" ";
for(x=1;x<=Day[j];x++) //在每个月结束后用空格补位
{
if(x<10)
out<<" "<<x;
else
out<<" "<<x;
if(((x+First_monthday)%7)==0 && x<Day[j]) //换行
out<<endl;
图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<First_monthday;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<<year<<"年"<<i+1<<"月"<<"\t\t\t";
out<<year<<"年"<<i+2<<"月"<<"\t\t";
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<<" "<<a[i][j][k];
else
out<<" "<<a[i][j][k];
}
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<<" "<<a[i+1][j][k];
else
out<<" "<<a[i+1][j][k];
}
out<<"\t";
out<<endl;
}
out<<endl;
}
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<First_monthday;i++) //每个月到达第一天之前,置0
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<<year<<"年"<<i+1 <<"月"<<"\t\t\t";
out<<year<<"年"<<i+2<<"月"<<"\t\t";
out<<year<<"年"<<i+3<<"月"<<"\n";
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<<" "<<a[i][j][k];
else
out<<" "<<a[i][j][k];
}
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<<" "<<a[i+1][j][k];
else
out<<" "<<a[i+1][j][k];
}
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<<" "<<a[i+2][j][k];
else
out<<" "<<a[i+2][j][k];
}
out<<endl;
}
out<<endl;
}
四、运行与测试
1. 运行界面图。
图4-1(输入年份之后单击回车)
图4-2(选择输出方式,单击回车后自动写入文件)
图4-3 12行1列
图4-4 六行2列
图4-5 3行4列
五、总结
这两周课设从开始的确定命题,到搜集资料,到初步编程,到修改代码,到最终完成代码,这是一个学习的过程,一个升华的过程。
我想课设的意义也是在于此吧。
刚开始接触到课题感觉到无从下手,后来通过逐步的思考,认真的研究逐步的建立了整个宏观的流程,然后就是一段时间的埋头苦干,反复优化程序。
现在,一切都结束了,感觉这个命题其实也不难的。
这就告诉我们理论与实践的关系。
想到不一定能做到,但做到了一定会想到,做到不一定有想象的那么难。
只要你愿意做,就一定能做到。
当然课设也有很多的不足,由于刚学完数据结构没多久,因此没有建立一个系统的知识框架,在编程时大体上还是延续C的思路,并没有过多的采用数据结构在算法和效率上进行优化,这是此次最大的不足,也将会是今后学习的重点。
在设计过程中不能够把书本上的知识与实践相结合,这也就增加了设计不好该程序的想法!在设计过程中的一次次设计错误增加了我放弃的想法!不过经过自己的独立思考和同学的帮助终于完成了课程设计!完成该程序后想起自己以前
的每一次对自己失去信心,就觉得并不是在知识掌握上打败了,而是自己对自己缺乏信心!只要自己对自己不失去信心相信就可以完成那些以前认为完成不了的事情!也让我懂得了要想成功首先就必须有很强的自信心!懂得了自己以后要在做任何事情时都要自信!当自己都不相信自己能够成功时还可能会获得成功吗?
在课程设计的过程中也知道了自己在以前的学习中有很大的不足导致在设计过程中出现了很多的问题,有些地方看不懂也不知道怎么去设计,但是在设计过程中也学习了很多,掌握了自己以前没有学好的知识,虽然一时可以掌握完以前没有学好的知识,不过也给自己敲响了警钟,在学习中不可以伏于表面,要想学好每一门课程都要踏踏实实,做什么都不是给别人看的!都是要更好的掌握该门知识,提高自己的自身的修养,提高自己的能力!为以后的工作打下良好的知识基础和技能基础!
当然,我的成功也离不开大家的帮助,所以,在此我要感谢给于过我帮助的指导老师和热心的同学们。
六、参考文献
[1]严蔚敏,吴伟民著. 数据结构:C语言版. 清华大学出版社,2007
[2]谭浩强著. C++面向对象程序设计. 北京:清华大学出版社,2006
[3]李爱华著. C++面向对象程序设计.
七、附件
程序代码:
#include<iostream>
#include<conio.h>
#include<fstream>
using namespace std;
void DrawMenu() //菜单函数
{
system("cls");
cout<<endl
<<endl;
cout<<"\t "<<endl;
cout<<"\t 请选择输出方式 "<<endl;
cout<<"\t "<<endl;
cout<<"\t 1.十二行一列 "<<endl;
cout<<"\t "<<endl;
cout<<"\t 2.六行二列 "<<endl;
cout<<"\t "<<endl;
cout<<"\t 3.三行四列 "<<endl;
}
int main()
{
int a[12][6][7];
int year;
int month[13]={0,1,2,3,4,5,6,7,8,9,10,11,12};//定义一年的总月数
int day;
int leapyear; //闰年
int First_yearday; //一年的第一天
int First_monthday; //一个月的第一天
int x=0,i,j,k,l,y;
char ch;
int Day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //定义每个月有多少天
ofstream out; //写入文件
out.open("f:\\file.txt",ios::out);
if(!out)
{
cout<<"Can't open file"<<endl;
return -1;
}
printf(" 万年历 \n ");
printf("请输入年份");
scanf("%d",&year);
First_yearday=(365*(year-1)+(year-1)/4-(year-1)/100+(year-1)/4 00)%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<<year<<"年"<<" "<<month[j]<<”月”;
out<<"\n****************************************************\n";
out<<" 星期日星期一星期二星期三星期四星期五星期六´\n";
for(i=0;i<First_monthday;i++) //在每个月的第一天开始前,用空格补位
out<<" ";
for(x=1;x<=Day[j];x++) //在每个月结束后用空格补位
{
if(x<10)
out<<" "<<x;
else
out<<" "<<x;
if(((x+First_monthday)%7)==0 && x<Day[j]) //换行
out<<endl;
}
}
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<First_monthday;i++) //每个月到达第一天之前,置0
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<<year<<"年"<<i+1 <<"月"<<"\t\t\t";
out<<year<<"年"<<i+2<<"月"<<"\t\t";
out<<year<<"年"<<i+3<<"月"<<"\n";
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<<" "<<a[i][j][k];
else
out<<" "<<a[i][j][k];
}
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<<" "<<a[i+1][j][k];
else
out<<" "<<a[i+1][j][k];
}
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<<" "<<a[i+2][j][k];
else
out<<" "<<a[i+2][j][k];
}
out<<endl;
}
out<<endl;
}
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<First_monthday;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<<year<<"年"<<i+1<<"月"<<"\t\t\t";
out<<year<<"年"<<i+2<<"月"<<"\t\t";
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<<" "<<a[i][j][k];
else
out<<" "<<a[i][j][k];
}
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<<" "<<a[i+1][j][k];
else
out<<" "<<a[i+1][j][k];
}
out<<"\t";
out<<endl;
}
out<<endl;
}
out.close();
}
}
return 0;
}。