程序设计万历Word格式.docx
- 文档编号:17951304
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:18
- 大小:298.91KB
程序设计万历Word格式.docx
《程序设计万历Word格式.docx》由会员分享,可在线阅读,更多相关《程序设计万历Word格式.docx(18页珍藏版)》请在冰豆网上搜索。
文字表达熟练程度
回答问题准确度
简短评语
教师签名:
郭剑
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<
iostream>
iomanip>
fstream>
usingnamespacestd;
ofstreamoutfile("
万年历.txt"
ios_base:
:
out);
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;
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;
//返回输入的年份的元旦是星期几
returnn;
//n不是0的时候反回n的值就是星期几
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天
return30;
//其他的月份为30天
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<
输入的年份有误,请重新输入"
endl;
j=0;
break;
}
if(i>
=5){cout<
输入的年份有误请重新输入"
elsej=1;
}
if(j==1)for(i=0;
i++)year1=year1*10+year_char[i]-48;
elsegotothere;
returnyear1;
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;
for(inth=0;
h<
7;
h++)
{cout<
ss[g][num[i]][h];
{cout<
intData:
NowToDay(intyear,intmonth,intday)
{intDiDay,i;
for(i=1800,DiDay=0;
i<
year;
i++)//闰年单独+366天
if(ioleapyear(i))DiDay+=366;
elseDiDay+=365;
for(i=1;
month;
i++)DiDay+=monthday(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);
setw(16)<
Months[sea-1]<
setw(31)<
Months[sea]<
outfile<
--------------------------------------------------------"
cout<
setw(SpaceSize)<
<
;
//输
//出
WED"
THR"
//周
//号
SAT"
outfile<
for(n=1;
n<
=Excur1;
n++)//第一行单独处理首先输出多余的空格然后在输出天数
}//处理奇数月
for(n;
n<
=7;
n++){cout<
setw(SpaceSize)<
n-Excur1;
outfile<
n-Excur1;
{cout<
i=n-Excur1;
//i,j单独保存当前的日期
for(n=1;
=Excur2;
n++)
=7;
n++)//第一行单独处理首先输出多余的空格然后在输出天数
n-Excur2;
n-Excur2;
}//处理偶数月
j=n-Excur2;
//i,j单独保存当前的日期
while(i<
=month1||j<
=month2)//当两个月的日期都大于应有的天数后循环结束
{//接下来的7天输出一次。
但是大于天数的部分输出空格
for(n=i;
n+7;
i++)//处理奇数月
if(i<
=month1){cout<
setw(SpaceSize)<
i;
else{cout<
cout<
for(n=j;
j<
n+7;
j++)//处理偶数月
if(j<
=month2){cout<
j;
else{cout<
cout<
}
endl;
cout<
intmain()
Dataa;
//创建一个对象a
//ofstreamoutfile("
if(!
outfile)
cerr<
error:
cannotopen\"
万年历.txt\"
foroutput\n"
exit(-1);
setw(45)<
万年历查询"
-------------------------------------------------------------------------------"
a.getyear();
//调用对象a里的函数,这个就管输入一个年份
a.PrintYear();
a.DisplayYear(a.year);
system("
pause"
);
}}.
五、测试数据及其结果分析
运行后,程序的主菜单界面如下。
图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("
”语句放在程序起始部,成为一个全局函数的声明,就可以实现输出文件了。
七、课程设计总结
程序设计是培养学生综合运用所学知识,发现,提出,分析和解决实际问题,锻炼实践能力的重要环节,是对我们的实际工作能力的具体训练和考察过程.随着科学技术发展的日新月异,当今计算机应用在生活中可以说得是无处不在。
因此作为二十一世纪的大学生来说掌握程序开发技术是十分重要的,而C++语言又是最常见,功能最强大的一种高级语言,因此做好C++语言课程设计是十分必要的。
通过C++课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重。
做程序设计,难免会遇到过各种各样的问题,同时在设计的过程中我们也发现了自己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如说数组的灵活应用,循环语句,类的封装与继承……通过这次程序设计之后,我们把前面所学过的知识又重新温故了一遍。
我们做的是简易万年历的课程设计,虽然是很简单的一个小的程序,但对我们来说也是是一个不小的困难。
开始的时候真的感觉编程是一件很复杂的事情,不过当一个程序运行成功的时候那种喜悦是无法言语的,那种成就感是无法比拟的。
又经过几天的努力,终于把程序完成了,尽管程序还是有很多功能上的欠缺和漏洞,但我们仍然会继续努力实现更大的提高。
随着信息技术的发展,计算机语言逐步显示了其重要性。
信息的处理就显得尤为重要。
而我们相信随着我们不断地努力,一定可以成为信息波浪中的弄潮儿!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 万历