C万年历实验报告.docx
《C万年历实验报告.docx》由会员分享,可在线阅读,更多相关《C万年历实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
C万年历实验报告
《高级语言程序设计》课程设计报告
万年历程序设计
(1)课程设计名称:
C++万年历设计
(2)使用工具软件:
MicrosoftvisualC++
(3)课程设计内容简介
1、以开关语句进行执行功能的选择,这些功能分别是:
A、判断闰年;
B、判断某天是星期几;
C、判断某年的隶属生肖;
D、输出某年的日历;
E、输出某月的日期;
F、退出系统;
2、建立类wnl,定义类的成员函数;
voidisleapyear();//判断闰年,用于输出判断结果,以流的形式
boolisleap(intyear);//判断闰年,返回判断结果,用于计算天数
intgetdays(intyear,intmonth,intday);//获取据第一天天数
voidweekdays(intyear,intmonth,intday);//获取星期几
voidprintyear(intyear);//输出年的日历
voidprintyearmonth(intyear,intmonth);//输出某年某月的日历
voidanimal(intyear);//判断某年的生肖
intgetyear(){returnYear;}//返回私有成员的值
intgetmonth(){returnMonth;}
intgetday(){returnDay;}
3、定义私有成员:
intYear,Month,Day;
4、定义类的对象:
_wnl;
5、为类的成员函数填写代码,满足功能实现;
6、运行环境:
控制台应用程序的源程序;
(4)得意之处:
1、可以满足多功能实现,可以循环执行功能;
2、可以选择每行输出的月份数;
3、有欢迎界面;
4、客户输入错误会有提示;
5、使用了C语言的流的形式,判断闰年,提高执行速度;
6、使用I/O流控制头文件iomanip.h控制月份日历的输出,更加整齐;
(5)创意的技术实现
(6)
(7)
(8)
主函数流程
判断某天是周几
判断闰年
获取天数
输出年份
(9)课程设计中目前存在的问题:
无法在欢迎页面插入字符画;
(10)设计实践过程中的自我感受
这是我第一次编写如此长的代码,从网上如同大海捞针似的寻找编写方法,看铺天盖地的长代码,还有的程序是错的。
输入的时候,没有小工具。
在看着自己熬通宵打出的代码,一大串的错误,真的有些泄气。
改对了执行输出结果还是错的,只好重新思考算法。
不过通过这次编程我真的学会了好多,比如其他的头文件的功能;setfil(‘’)设置填充字符;setw()定义字段长度……也让我真正体会到了编程的作用,爱上了编程。
(11)参考文献:
[1]吕凤翥,《C++语言程序设计》,清华大学出版社。
实验代码:
//万年历
#include
#include
#include
intdayofmonth[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//整形数组用于储存每月的天数
charmonthname[13][5]={"","Jan","Feb","Mar","Apr","May","June","July","Aug","Seb","Oct","Nov","Dec"};//字符型数组用于储存月份名第一个数字用于表示字符串数(相当于行)第二个用于表示字符串长度(相当于列)
classwnl
{
public:
voidisleapyear(intyear);//判断闰年,用于输出判断结果,以流的形式
boolisleap(intyear);//判断闰年,返回判断结果,用于计算天数
intgetdays(intyear,intmonth,intday);//获取据第一天天数
voidweekdays(intyear,intmonth,intday);//获取星期几
voidprintyear(intyear);//输出年的日历
voidprintyearmonth(intyear,intmonth);//输出某年某月的日历
voidanimal(intyear);//判断某年的生肖
intgetyear(){returnYear;}//返回私有成员的值
intgetmonth(){returnMonth;}
intgetday(){returnDay;}
private:
intYear,Month,Day;
}_wnl;
voidmain()
{
intchoice,year,month,day;
cout<<"~~欢迎来到万年历查询系统~~"<cout<<"设计人:
"<cout<<"天津职业技术师范大学\n\t\t\t设计人:
张锦琪\n\n";
loop:
cout<<"╱请按序号输入您要做的工作:
╲"<cout<<"▏判断闰年请按1;▕"<cout<<"▏判断某天是星期几请按2;▕"<cout<<"▏判断某年的隶属生肖请按3;▕"<cout<<"▏输出某年的日历请按4;▕"<cout<<"▏输出某月的日期请按5;▕"<cout<<"╲如果您要退出系统请按0;╱"<cin>>choice;
switch(choice)
{
case0:
return;
case1:
cout<<"输入一个年份格式如:
xxxx";
cin>>year;
_wnl.isleapyear(year);break;
case2:
{
cout<<"请输入您要查询的天数格式如xxxxxxxx";
cin>>year>>month>>day;
_wnl.weekdays(year,month,day);
}break;
case3:
{
cout<<"请输入您要查询的年份格式如xxxx:
";
cin>>year;
_wnl.animal(year);
}break;
case4:
{
cout<<"请输入你要输出的年份xxxx:
";
cin>>year;
_wnl.printyear(year);
}break;
case5:
{
cout<<"请输入您要输出的年月,形如xxxxxx:
";
cin>>year>>month;
_wnl.printyearmonth(year,month);
}break;
default:
cout<<"输入错误"<}
cout<<"继续查询请输1"<intx;
cin>>x;
if(x==1)
gotoloop;
}
voidwnl:
:
isleapyear(intyear)
{
if(year>=1000&&year<=9999)
printf("%s\n",year%(year%100?
4:
400)?
"no":
"yes");//以C语言流的形式判断会更快一些,节省内存
else
printf("%s\n","没有按格式输入");
}
boolwnl:
:
isleap(intyear)
{
if(year%400==0||(year%100!
=0&&year%4==0))
return1;
else
return0;
}
voidwnl:
:
weekdays(intyear,intmonth,intday)
{
if(year>=1000&&year<=9999)
{
if(month<=12&&month>=1)
{
intmax=dayofmonth[month];
if(day>0&&day{
ints=getdays(year,month,day)%7;
switch(s)
{
case0:
cout<<"Sunday"<case1:
cout<<"Monday"<case2:
cout<<"Tuesday"<case3:
cout<<"Wednesday"<case4:
cout<<"Thursday"<case5:
cout<<"Friday"<case6:
cout<<"Saturday"<}
}
}
}
else
cout<<"没有按格式输入"<}
intwnl:
:
getdays(intyear,intmonth,intday)
{
inti,sum=0;
for(i=1;i{
if(isleap(i))sum+=366;
elsesum+=365;
}
if(isleap(year))dayofmonth[2]=29;
for(i=1;isum+=day;
returnsum;
}
voidwnl:
:
animal(intyear)
{
if(year>=1000&&year<=9999)
{
intn=year%12;
switch(n)
{
case0:
cout<<"该年是猴年"<case1:
cout<<"该年是鸡年"<case2:
cout<<"该年是狗年"<case3:
cout<<"该年是猪年"<case4:
cout<<"该年是鼠年"<case5:
cout<<"该年是牛年"<case6:
cout<<"该年是虎年"<case7:
cout<<"该年是兔年"<case8:
cout<<"该年是龙年"<case9:
cout<<"该年是蛇年"<case10:
cout<<"该年是马年"<case11:
cout<<"该年是羊年"<}
}
else
cout<<"没有按格式输入"<}
voidwnl:
:
printyear(intyear)
{
if(year>=1000&&year<=9999)
{
cout<<"输入一行输出的月份数:
";
intchoice;
cin>>choice;
ints;
inta[3],b[3];//b数组用来储存每月的天数a数组用来临时储存那一月输出到的日期
cout<<"year:
"<inti=1;
for(i=1;i<=12/choice;i++)//计算纵向输出几个月
{
for(inth=1;h<=choice;h++)//该循环用于输出横向月份名
{
intm=choice*(i-1)+h;//计算月份
cout<<""<}
cout<for(h=1;h<=choice;h++)
cout<<"---------------------";
cout<for(intj=0;j{
cout<<"Su"<<"Mo"<<"Tu"<<"We"<<"Th"<<"Fr"<<"Sa"<<"";
}
cout<for(j=0;j{
intmonth;
month=choice*(i-1)+j+1;//计算月份
s=getdays(year,month,1);
s=s%7;//获取每月第一天
for(intm=0;m
cout<<"";//输出月前的空
if(isleap(year))dayofmonth[2]=29;
b[j]=dayofmonth[month];//月份天数b数组储存一个月的天数
for(inti=1;i<8-s;i++)//从一号开始输出
cout<(2)<
a[j]=i;//a数组用来储存每一行的日期素材
cout<<"";//两个月份之间的空隙
}
cout<for(intw=1;w<=5;w++)//一个月最多会在五个星期出现
{
for(j=0;j{
intw=1;
for(w=1;w<=7;w++,a[j]++)//依次输出日期
{
if(a[j]>b[j])//如果那一行的日期数大于该月最大日期则跳出
break;
cout<(2)<if(w==7)
cout<<"";//输出每两个月之间日期间的空隙
}
for(intn=1;a[j]>b[j],n<=8-w;n++)//月份
cout<<"";
if(a[j]>b[j]&&w!
=8)//输出月份结束后的空
cout<<"";
}
cout<}
}
}
}
voidwnl:
:
printyearmonth(intyear,intmonth)
{
if(year>=1000&&year<=9999)
{
if(month<=12&&month>=1)
{
cout<<""<cout<<"----------------------------------------"<cout<<<"Wed"<intnumber=getdays(year,month,1)%7;//第一天就一就相当于有一天了
for(intk=0;k{cout<intmax=dayofmonth[month];
for(intj=1;j<=max;j++)
{
cout<if((number+j)%7==0)//周六换行
cout<}
cout<}
}
else
cout<<"没有按格式输入"<}