由日期得星期几C++课程设计报告书.docx
《由日期得星期几C++课程设计报告书.docx》由会员分享,可在线阅读,更多相关《由日期得星期几C++课程设计报告书.docx(20页珍藏版)》请在冰豆网上搜索。
由日期得星期几C++课程设计报告书
河北联合大学
2011-2012第2学期
《软件设计基础-C++》
课程设计报告
设计名称:
由日期得星期几
姓名:
学号:
专业班级:
学院:
设计时间:
设计地点:
成绩:
指导教师评语:
指导教师签字:
年月日
目录
1.课程设计目的
2.课程设计任务与要求
3.课程设计说明书
4.课程设计成果
5.程序调试过程
6.设计问题的不足和改进方案
7.课程设计心得
8.参考文献
1.课程设计目的
《软件设计基础-C++》课程设计是这门课程的实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖C++的知识点,又接近工程实际需要。
目的是通过课程设计的综合训练,培养学生实际分析问题、解决问题的能力,以及编程和动手能力,最终目标是通过课程设计这种形式,帮助学生系统掌握C++这门课程的主要内容,养成良好的编程习惯,更好的完成教学任务。
2.课程设计任务与要求:
要求:
本次课程设计利用《软件设计基础-C++》课程中所学到的编程知识和编程技巧,完成具有一定难度和工作量的程序设计题目,帮助学生掌握编程、调试的基本技能,独立完成所布置的任务。
要求:
1、对系统进行功能需求分析
2、设计合理的数据结构和系统框架
3、编程简练,程序功能齐全,能正确运行
4、说明书、流程图要清楚
5、课题完成后必须按要求提交课程设计报告
任务:
1.基本要求:
(1)要求用模块化设计和C++的思想来完成程序的设计;
(2)培养上机动手能力,巩固分支结构和循环结构。
(3)在VC++6.0环境中,学会调试程序的方法,及时查究错误,独立调试完成。
(4)程序调试通过后,完成程序文档的整理,加必要的注释。
2.创新要求
在完成本课题要求外,创新性提出算法设计,评分将把创造性、程序是否优美作为重要标准,总之,创造是此题目的重要方面。
4.书写设计报告的要求
设计报告中包含以下几个方面:
(1)设计题目
(2)总体设计
①概述所作系统的功能及用途
②用自顶而下或自底而上的方法,划分功能模块。
③确定各模块的算法
(3)根据算法画出模块图
(4)列出程序清单,并加以必要的注释
(5)写出调试程序的方法
(6)指出所设计问题的不足和改进方案
(7)总结本次设计的收获及心得
3.课程设计说明书
概要设计
★模块说明:
在我设计的程序中一共包含了五个模块,输入模块,数据校验模块,计算距离基准日期(2012-1-1)天数模块,计算星期模块,显示星期模块。
★模块结构图:
Main主函数
While控制循环语句(true)
:
计算星期模块
显示星期模块
输入模块
计算距离基准日期天数模块
数据校验模块
详细设计
★总体流程图:
Main主函数
While控制循环语句(true)
:
利用while(true)循环输入
计算星期模块
显示星期模块
输入模块
利用switch语句控制显示
利用getWeek函数求出星期
计算距离天数模块块
数据校验模块
利用validate函数校验数据
利用数组Const,枚举出平年与闰年各月的天数
利用isPrime函数,计算出时闰年还是平年
利用getDistanceDays函数
★各功能模块流程图:
输入模块
while(true)循环输入
校验模块
validate函数
isPrime
getDistanceDays函数
计算距离天数模块
getWeek函数
计算星期模块
显示星期模块
利用switch语句控制显示
4.课程设计成果
★程序源代码
#include
usingnamespacestd;
//闰年各月的天数
constintdaysOfPrimeMonths[]
={0,31,29,31,30,31,30,31,31,30,31,30,31};
//平年各月的天数
constintdaysOfUnPrimeMonths[]
={0,31,28,31,30,31,30,31,31,30,31,30,31};
/*
*判断year是否为闰年
*是闰年返回true,否则返回false
*/
boolisPrime(intyear)
{
return((0==year%400)||((0==year%4)&&(year%100!
=0)));
}
/*
*计算year/month/day距离2012/1/1的天数
*/
intgetDistanceDays(intyear,intmonth,intday)
{
intdistanceDays=0;
inti,j;
if(year<2012)//2012/1/1以前某天距离该天的天数
{
for(i=year+1;i<2012;i++)
{
if(isPrime(i))
{
distanceDays+=366;
}
else
{
distanceDays+=365;
}
}
boolbPrime=isPrime(year);
if(bPrime)
{
for(j=month+1;j<=12;j++)
{
distanceDays+=daysOfPrimeMonths[j];
}
distanceDays+=(daysOfPrimeMonths[month]-day+1);
}
else
{
for(j=month+1;j<=12;j++)
{
distanceDays+=daysOfUnPrimeMonths[j];
}
distanceDays+=(daysOfUnPrimeMonths[month]-day+1);
}
}
else//2012/1/1以后某天距离该天的天数
{
for(i=2012;i{
if(isPrime(i))
{
distanceDays+=366;
}
else
{
distanceDays+=365;
}
}
if(isPrime(year))
{
for(j=1;j{
distanceDays+=daysOfPrimeMonths[j];
}
distanceDays+=(day-1);
}
else
{
for(j=1;j{
distanceDays+=daysOfUnPrimeMonths[j];
}
distanceDays+=(day-1);
}
}
returndistanceDays;
}
/*
*若month>12||month<1返回-1
*若day<1||day>该月天数返回-2
*否则返回0
*/
intvalidate(intyear,intmonth,intday)
{
if(month>12||month<1)
{
return-1;
}
else
{
if(day<1)
{
return-2;
}
else
{
intdaysOfMonth=0;
if(isPrime(year))
{
daysOfMonth=daysOfPrimeMonths[month];
}
else
{
daysOfMonth=daysOfUnPrimeMonths[month];
}
if(day>daysOfMonth)
{
return-2;
}
else
{
//donothing
}
}
}
return0;
}
/*
*返回year/month/day是星期几(1~7)
*若month>12||month<1返回-1
*若day<1||day>该月天数返回-2
*/
intgetWeek(intyear,intmonth,intday)
{
intflag=validate(year,month,day);
if(flag!
=0)//月份或天错误
{
returnflag;
}
else//格式正确
{
intweek=0;
intdistanceDays=getDistanceDays(year,month,day);
distanceDays%=7;//7天一个循环
if(year<2012)//求2012/1/1前的某天是星期几
{
//前面i(0<=i<=6)天,为星期7-i
return7-distanceDays;
}
else//求2012/1/1及以后某天
{
if(0==distanceDays)
{
return7;
}
else
{
returndistanceDays;
}
}
}
}
intmain()
{
intyear,month,day;
intweek;
while(true)//一直接收用户输入,CTRL+C终止程序运行
{
cout<<"Pleaseinputyear:
";
cin>>year;
cout<<"Pleaseinputmonth:
";
cin>>month;
cout<<"Pleaseinputday:
";
cin>>day;
week=getWeek(year,month,day);
switch(week)
{
case1:
{
cout<<"Monday"<}break;
case2:
{
cout<<"Tuesday"<}break;
case3:
{
cout<<"Wednesday"<}break;
case4:
{
cout<<"Thursday"<}break;
case5:
{
cout<<"Friday"<}break;
case6:
{
cout<<"Saturday"<}break;
case7:
{
cout<<"Sunday"<}break;
case-1:
//月份错误(不在1~12之间)
{
cout<<"Monthshouldbein1and12"<}break;
default:
//天错误(不在1~该月天数之间)
{
intdaysOfMonth=isPrime(year)?
daysOfPrimeMonths[month]:
daysOfUnPrimeMonths[month];
cout<<"Dayshouldbein1and"<}break;
}
}
return0;
}
★运行结果:
:
5.程序调试过程
●程序调试步骤:
1编译,检查是否有语法错误,如果有,则点击错处,就会在程序中指出,根据提示进行修改。
没有的话进行链接,如此时出现错误很有可能是算法的错误,如若没有,则运行程序。
2根据提示,分别输入年、月、日。
若年月日都符合要求,则输出正确的星期;否则提示你相应的年月日的正确的范围是什么,根据提示再正确输入年月日。
●调试中遇到的问题:
1忽略每个月天数,若与本月的天数不相符,比如day>该月天数,或者day<1,系统不能报错,导致输出错误的星期。
2初始值定义2012-01-01为星期六,再计算2012-01-01以前距离该填的天数时,忘记应先在本月的基础上再加一个月后,计算出距离的天数,最后再加上改天距离本月末的天数,才为最终的距离天数。
3在算出distanceDays%=7,七天一循环后,所余的天数直接当做星期数(因为基准日期2012-01-01为周日),忽略了基准以前的日期,
6.设计问题的不足和改进方案:
不能实现农历日期想星期的转变,没有设计出MFC的界面使日期向星期的转化更加清晰直观,
7.课程设计心得:
(1)培养我们综合利用C++语言进行程序设计的能力,更好学习了while循环与ifelse的嵌套,还有数组的使用。
(2)培养独立思考的习惯,清楚的了解日期与星期的内在关系
(3)提高我们自学能力。
更好的利用图书馆资料解答问题。
8.参考文献
(1)《标准C++程序设计》牛连强编著人民邮电出版社
(2)《C++编程习题与答案》JchnRHubbard编著机械工业出版社
(3)《VisualC++程序设计基础(第二版柴欣张红梅编著中国铁道出版设