程序设计万历.docx
- 文档编号:4997955
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:18
- 大小:298.91KB
程序设计万历.docx
《程序设计万历.docx》由会员分享,可在线阅读,更多相关《程序设计万历.docx(18页珍藏版)》请在冰豆网上搜索。
程序设计万历
程序设计报告
(2013/2014学年第二学期)
题目:
万年历
专业地理信息科学
组长学号姓名B13090223邵家琦
组员学号姓名B13090222陈俊良
B13090224练彤天
指导教师郭剑
指导单位计算机软件教学中心
日期2014年4月25日
成员分工
组长(邵家琦)
设计算法;调试程序;
编写程序;编写文档;
组员(练彤天)
查找资料;
编写程序;
组员(陈俊良)
查找资料;
编写程序;
评分细则
评分项
优秀
良好
中等
差
遵守机房规章制度
上机时的表现
学习态度
程序准备情况
程序设计能力
团队合作精神
课题功能实现情况
算法设计合理性
用户界面设计
报告书写认真程度
内容详实程度
文字表达熟练程度
回答问题准确度
简短评语
教师签名:
郭剑
2014年4月28日
评分等级
B13090223邵家琦
B13090222陈俊良
B13090224练彤天
备注
评分等级共五种:
优秀、良好、中等、及格、不及格
万年历
一、课题内容和要求
问题描述:
已知2005年10月20日是星期四。
现要求编写一个程序,输出指定年份的日历到规定路径的.txt文件。
万年历要能提供以下几个基本功能:
(1)从键盘读入要求输出日历的年份xxxx,此部分要求对读入的数据具有一定的错误检查能力,如输入的不是数字,或输入的是五位以上的年份等。
(2)根据2005年10月20日是星期四,推算出xxxx年的1月1日是星期几。
(3)输出到指定文件夹下面。
二、需求分析
万年历系统的功能框架图如图一所示。
三、概要设计
1主要结构体
classData//声明一个类Data
{//私有变量
public:
intyear;//公有变量
voidgetyear();//提示用户输入想要查询的年份
voidPrintYear();
intioleapyear(intyear);//判断该年是不是闰年
intweekday();//判断该年的元旦是星期几
intmonthday(inti);//该年每个月的天数
intchar_to_int();//判断输入字符是否合法
intNowToDay(intyear,intmonth,intday);//累计天数
voidDisplayYear(intyear);
};
2主要函数流程图
(1)char_to_int()//把输入的字符转换为数字
(2)ioleapyear()//判断闰年和平年
(3)weekday();//判断该年的元旦是星期几
(3)dispyear()//显示函数
四、源程序代码
#include
#include
#include
usingnamespacestd;
ofstreamoutfile("万年历.txt",ios_base:
:
out);
classData//声明一个类Data
{//私有变量
public:
intyear;//公有变量
voidgetyear();//提示用户输入想要查询的年份
voidPrintYear();
intioleapyear(intyear);//判断该年是不是闰年
intweekday();//判断该年的元旦是星期几
intmonthday(inti);//该年每个月的天数
intchar_to_int();//判断输入字符是否合法
intNowToDay(intyear,intmonth,intday);//累计天数
voidDisplayYear(intyear);
};
char*weekd[7]={"MON","TUE","WEN","THU","FRI","STA","SUN"};//记录星期一到星期天
voidData:
:
getyear()
{
cout<<"请输入你想要查询的年份:
";//
year=char_to_int();
}
intData:
:
ioleapyear(intyear)//判断闰年和平年,闰年返回1,平年返回0
{
if(year%4==0&&year%100!
=0||year%400==0)//计算闰年和平年的方法
//四位年份能被4整除但不能被100整除,或能被400整除
return1;
else
return0;
}
intData:
:
weekday()
{
intn=year-1900;//已知1900年的元旦刚好是星期一
n=n+(n-1)/4+1;//判断,以每年52个整星期计算year年比1900年多出来的天数
//多出来的天数除以7的余数就是这年第一天是星期几
n=n%7;
if(n==0)//当n=0的时候是周日,使它返回7
return7;//返回输入的年份的元旦是星期几
else
returnn;//n不是0的时候反回n的值就是星期几
}
intData:
:
monthday(inti)//这里是返回月有几天的,i是月份
{
if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)
return31;//如果是1,2,5,7,8,10,12月,则返回是31天
elseif(i==2)//判断2月
if(ioleapyear(year))//当ioleapyear()返回1时就是闰年,则为29天,ioleapyear()是一个函数,调用的一个函数
return29;
elsereturn28;//否则为28天
else
return30;//其他的月份为30天
}
intData:
:
char_to_int()
{
charyear_char[5];
intyear1=0,i=0;
boolj=0;
there:
cin>>year_char;
for(i=0;year_char[i]!
='\0';i++)
{
if(year_char[i]<'0'||year_char[i]>'9'){cout<<"输入的年份有误,请重新输入"< if(i>=5){cout<<"输入的年份有误请重新输入"< elsej=1; } if(j==1)for(i=0;year_char[i]! ='\0';i++)year1=year1*10+year_char[i]-48; elsegotothere; returnyear1; } voidData: : PrintYear() { intm=year/1000; intn=(year/100)%10; intp=(year/10)%10; intq=year%10; intnum[4]={m,n,p,q}; charss[5][10][8]={ "*****","*","*****","*****","**","*****","*****","*****","*****","*****", "**","*","*","*","**","*","*","*","**","**", "**","*","*****","*****","*****","*****","*****","*","*****","*****", "**","*","*","*","*","*","**","*","**","*", "*****","*","*****","*****","*","*****","*****","*","*****","*****",}; for(intg=0;g<5;g++) {{cout<<"";outfile<<"";} for(inti=0;i<4;i++) { for(inth=0;h<7;h++) { {cout< } } {cout< } } intData: : NowToDay(intyear,intmonth,intday) {intDiDay,i; for(i=1800,DiDay=0;i if(ioleapyear(i))DiDay+=366; elseDiDay+=365; for(i=1;i DiDay+=day-1; returnDiDay; } voidData: : DisplayYear(intyear) { inti,j,n,month1,month2;//按照一个季度输出日历month1month2month3是该月应该有天数 intExcur1,Excur2;//i,j,k分别表示三个月的天数值Excur1,Excur2,Excur3表示偏移量 intsea; charMonths[12][10]={{"Jan"},{"Feb"},{"Mar"},{"Apr"},{"May"},{"Jun"},{"Jul"},{"Aug"},{"Sep"},{"Oct"},{"Nev"},{"Dec"}}; constintSpaceSize=4; for(sea=1;sea<=12;sea+=2){//分两列显示 Excur1=(NowToDay(year,sea,1)+3)%7;//分别计算2个月的偏移量 Excur2=(NowToDay(year,sea+1,1)+3)%7; month1=monthday(sea);//分别计算2个月的天数 month2=monthday(sea+1); cout< outfile< cout<<"--------------------------------------------------------"< outfile<<"--------------------------------------------------------"< cout< outfile< cout< outfile< cout< outfile< cout< outfile< cout< outfile< cout< for(n=1;n<=Excur1;n++)//第一行单独处理首先输出多余的空格然后在输出天数 {cout< for(n;n<=7;n++){cout< {cout< i=n-Excur1;//i,j单独保存当前的日期 for(n=1;n<=Excur2;n++) {cout< for(n;n<=7;n++)//第一行单独处理首先输出多余的空格然后在输出天数 {cout< {cout< {cout< j=n-Excur2;//i,j单独保存当前的日期 while(i<=month1||j<=month2)//当两个月的日期都大于应有的天数后循环结束 {//接下来的7天输出一次。 但是大于天数的部分输出空格 for(n=i;i if(i<=month1){cout< else{cout< cout< for(n=j;j if(j<=month2){cout< else{cout< cout< } cout< } cout< } intmain() { Dataa;//创建一个对象a //ofstreamoutfile("万年历.txt",ios_base: : out); if(! outfile) { cerr<<"error: cannotopen\"万年历.txt\"foroutput\n"; exit(-1); } cout< cout<<"-------------------------------------------------------------------------------" < a.getyear();//调用对象a里的函数,这个就管输入一个年份 a.PrintYear(); a.DisplayYear(a.year); system("pause"); return0; }}. 五、测试数据及其结果分析 运行后,程序的主菜单界面如下。 图a。 1.输入“abcd”,运行结果如下,图b 2.输入“123456”,运行结果如下,图c 3.输入“A123”,运行结果如下,图d 4.输入“2005”,运行结果如下,图e 5.输入“2014”,运行结果如下,图f 6.输出的文件,如图g 结果分析如下。 (1)在输入菜单选项时如果输入的内容不是1-0之间的数字,而是其他字符,系统将继续执行等待下次正确的输入;若输入的为大于5位的数字,将继续等待下次正确的输入; (2)输入的为5位以下的数字时,执行下一步操作。 六、调试过程中的问题 (1)在字符判断函数中,原来是不把字符和超过5位数字分开的,这样的话比如输入“a12”,由该表达式算出的结果根据ASCII码来算的话仍然在允许的范围内,所以我们选择了分开判断。 (2)在计算每个月日子的时候,先将2月作为30日处理,再在基础上减去。 后发现运行过程中和原先算法预计的情况不同,所以我们选择将12个月的日子枚举出来,2月默认为28天,闰年29天。 (3)在推算每天是周几的时候,我们原来以非元旦计算,就会出现有些日期出现错误的情况。 后改用每年的元旦开始计算周几,实现了只需考虑元旦随后在一年内除以7取余数的算法。 (4)在输出年份的算法中,原先输出的字符形状有不准之处,我们就以“1234....abcd....! @#$%^&”等字符来代替“*”,就得以很快定位到字符串不准确的地方,实现修改。 (5)文件输出的过程中,起先无法将字符文件和日历文件同时输出,后发现将“ofstreamoutfile("万年历.txt",ios_base: : out);”语句放在程序起始部,成为一个全局函数的声明,就可以实现输出文件了。 七、课程设计总结 程序设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。 因此作为二十一世纪的大学生来说掌握程序开发技术是十分重要的,而C++语言又是最常见,功能最强大的一种高级语言,因此做好C++语言课程设计是十分必要的。 通过C++课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。 在设计的过程中遇到问题,可以说得是困难重重。 做程序设计,难免会遇到过各种各样的问题,同时在设计的过程中我们也发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说数组的灵活应用,循环语句,类的封装与继承……通过这次程序设计之后,我们把前面所学过的知识又重新温故了一遍。 我们做的是简易万年历的课程设计,虽然是很简单的一个小的程序,但对我们来说也是是一个不小的困难。 开始的时候真的感觉编程是一件很复杂的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。 又经过几天的努力,终于把程序完成了,尽管程序还是有很多功能上的欠缺和漏洞,但我们仍然会继续努力实现更大的提高。 随着信息技术的发展,计算机语言逐步显示了其重要性。 信息的处理就显得尤为重要。 而我们相信随着我们不断地努力,一定可以成为信息波浪中的弄潮儿!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 万历