数据结构实践报告.docx
《数据结构实践报告.docx》由会员分享,可在线阅读,更多相关《数据结构实践报告.docx(13页珍藏版)》请在冰点文库上搜索。
![数据结构实践报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/51819a34-7945-4c7a-aa32-7edcfe5b38f4/51819a34-7945-4c7a-aa32-7edcfe5b38f41.gif)
数据结构实践报告
《数据结构》课程设计报告
专业:
计算机网络技术
班级:
计网0902
******
学号:
**********
完成日期:
2010年12月27日星期一
二0一0年12月27日
多功能万年历
需求分析:
现在大多数万年历,只能查询某一年的日期几星期几,而随着社会的发展人们的需求也在提高在查询日期的同时人们有时候也需要查询相应的星座,我设计的多功能万年历,不但能完成日期以及是否是闰年的查询,而且可以查询星座并附有一小部分的娱乐功能,也就是里面的缘分对对碰模块。
特别对于对齐日期与星期部分,需要运用巧妙的换行与空格。
程序功能包括:
1.查询某年某月是星期几2.查询某年是否是闰年3.打印某年的全年日历4.查询某月的最大天数5.星座查询6.缘分对对碰
概要设计
详细设计:
(部分源程序)
voidscreen();//系统主菜单
voidwhatisit();//查询某年某月是星期几
voidleapyear();//查询某年是否为闰年
voidprintyearday();//打印某年全年的日历
intisleapyear(int);//判断某年是否为闰年
intwhatisita(int,int);//计算当天是星期几
inteverymonth(int,int);//查询某月的最大天数
voidprintmonth(int,int);//打印某年某月月历
voidprintmonthday();//打印某年某月的最大天数
voidXingZuo();//打印星座及介绍
voidYuanFen();//测试两人缘分的分数级介绍//为图的邻接矩
voidscreen()//系统主菜单
{
intn;
while
(1)
{
printf("【星座。
万年历查询系统】\n");
printf("1.查询某年某月是星期几\n");
printf("2.查询某年是否是闰年\n");
printf("3.打印某年的全年日历\n");
printf("4.查询某月的最大天数\n");
printf("5.星座物语\n");
printf("6.缘分对对碰\n");
printf("7.退出\n");
printf("请输入要查询的选项\n");//打印内容
scanf("%d",&n);
switch(n)//开关分支语句供用户选择
{
case1:
whatisit();break;//调用函数
case2:
leapyear();break;//调用函数
case3:
printyearday();break;//调用函数
case4:
printmonthday();break;//调用函数
case5:
XingZuo();break;//调用函数
case6:
YuanFen();break;//调用函数
case7:
return;//调用函数
default:
printf("你输入错误,请按要求输入\n");//错误情况
}
}
}
//查询某年某月是星期几
voidwhatisit()//查询某年某月是星期几
{
inty,m,d,s,k=1,sum,n,i;
charyn;
inta[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//定义十二个月天数组
while(k!
=0)//循环
{
printf("请依次输入年、月、日\n");
scanf("%d,%d,%d",&y,&m,&d);//输入年月日
s=0;
for(i=1;is=s+a[i];
s=s+d;
if(isleapyear(y)&&m>2)s=s+1;//闰年天数加1
sum=s;
n=(y-1+(y-1)/4-(y-1)/100+(y-1)/400+sum)%7;//计算星期几的公式
printf("这天是%s\n",week[n]);
printf("是否继续查询(y/n)?
");
scanf("%c",&yn);getchar();
if(yn=='y'||yn=='Y')k=1;
elsek=0;
}
}
intisleapyear(intyear)//判断是否是闰年
{
return(year%4==0&&year%100!
=0)||(year%400==0);//闰年条件
}
voidleapyear()//查询某年是否为闰年
{
inty,k=1;
charyn;
while(k!
=0){
printf("请输入要查询的年份:
\n");
scanf("%d",&y);
if(isleapyear(y))//判断某年是否是闰年
printf("是闰年\n");//是
else
printf("不是闰年!
\n");//不是
printf("是否继续查询(y/n)?
");
scanf("%c",&yn);getchar();
if(yn=='y'||yn=='Y')k=1;
elsek=0;//退出循环条件
}
}
voidprintyearday()//打印全年日历
{
inty,value,sum,i,k=1;
charyn;
while(k!
=0)
{
printf("请输入要查询的年份\n:
");
scanf("%d",&y);
if(y=1990){printf("这一年郭玉峰同学出生了\n");}
for(i=1;i<=12;i++)//打出十二个月的月历
{
printf("%d年%d月的信息:
\n",y,i);
value=whatisita(y,i);//求出这个月的第一天是星期几
sum=everymonth(y,i);//这个月的总天数
printmonth(value,sum);//打印出这个月的月历
printf("\n");
}
printf("是否继续查询(y/n)?
");
scanf("%c",&yn);getchar();
if(yn=='y'||yn=='Y')k=1;
elsek=0;
}
}
voidprintmonth(intvalue,intsum)//打印月历
{
intn,i=0,j;
char*x[7]={"Sun","Mon","Tue","Wen","Thu","Fri","Sat"};//把星期放在数组中
for(j=0;j<7;j++)
{
printf("%s",x[j]);
printf("");
}
printf("\n");
while(i{
printf("");//便于对齐
i++;
}
for(n=1;n<=7-value;n++)
printf("%d",n);
while(n{
if((n+value-1)%7==0)//输出日期控制输出
printf("\n");
if(n<10)printf("%d",n);//因为双位数占位多一位,重新控制输出格式
else
printf("%d",n);
n++;//n自加
}
3:
调试分析
1.对于打印年历的对情况的调整
在考虑对齐的时候主要是,换行与空格的占位控制。
要计算出什么时候应该换行,列距与行距,都要充分考虑充分,要不然,每次少计一个空格的话,一行下来,错位将会很严重。
2.对于闰年的判断
如果是闰年2月的天数天数要调整。
测试数据:
1.主菜单
2.查询某年某月是星期几
3查询某年是否是闰年
3.打印全年日历
4.查询某月的最大天数
5.星座查询
6.缘分对对碰
4.总结
在做这个题目的时候,遇到很多困难,比如在输出格式的对齐问题上,我做了好多尝试,在调试的过程中不断的改进。
在退出循环这里,刚刚一开始本来考虑用FOR(;;;)这个语句,但是最后换做了WHILE()这个语句,因为我要充分利用在万年历中用户的主导作用,要用户选择退出的时间。
在这次作业中我学到了很多,首先,遇到问题要多与同学讨论,多交流,多去图书馆。
在程序的调试过程中,要多输入不同的数据,将情况考虑全面,这样才能把程序做到让用户满意。
5.参考书目
【1】庄晋林,杨彬。
实用数据结构与算法设计。
中国水利邮电出版社
【2】龚尚福C/C++程序设计,中国矿业大学出版社