当前位置:文档之家› C++万年历实验报告

C++万年历实验报告

《高级语言程序设计》课程设计报告万年历程序设计(1)课程设计名称:C++万年历设计(2)使用工具软件:Microsoft visual C++(3)课程设计内容简介1、以开关语句进行执行功能的选择,这些功能分别是:A、判断闰年;B、判断某天是星期几;C、判断某年的隶属生肖;D、输出某年的日历;E、输出某月的日期;F、退出系统;2、建立类wnl,定义类的成员函数;void isleapyear(); //判断闰年,用于输出判断结果,以流的形式bool isleap(int year); //判断闰年,返回判断结果,用于计算天数int getdays(int year,int month,int day); //获取据第一天天数void weekdays(int year,int month,int day);//获取星期几void printyear(int year); //输出年的日历void printyearmonth(int year,int month); //输出某年某月的日历void animal(int year); //判断某年的生肖int getyear(){return Year;} //返回私有成员的值int getmonth(){return Month;}int getday(){return Day;}3、定义私有成员:i nt Year,Month,Day;4、定义类的对象:_wnl;5、为类的成员函数填写代码,满足功能实现;6、运行环境:控制台应用程序的源程序;(4)得意之处:1、可以满足多功能实现,可以循环执行功能;2、可以选择每行输出的月份数;3、有欢迎界面;4、客户输入错误会有提示;5、使用了C语言的流的形式,判断闰年,提高执行速度;6、使用I/O流控制头文件iomanip.h控制月份日历的输出,更加整齐;(5)创意的技术实现(6)(7)(8)主函数流程判断闰年获取天数输出年份无法在欢迎页面插入字符画;(10)设计实践过程中的自我感受这是我第一次编写如此长的代码,从网上如同大海捞针似的寻找编写方法,看铺天盖地的长代码,还有的程序是错的。

输入的时候,没有小工具。

在看着自己熬通宵打出的代码,一大串的错误,真的有些泄气。

改对了执行输出结果还是错的,只好重新思考算法。

不过通过这次编程我真的学会了好多,比如其他的头文件的功能;setfil(‘’)设置填充字符;setw()定义字段长度……也让我真正体会到了编程的作用,爱上了编程。

(11)参考文献:[1]吕凤翥,《C++语言程序设计》,清华大学出版社。

实验代码://万年历#include<iostream.h>#include<stdio.h>#include<iomanip.h>int dayofmonth[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"}; //字符型数组用于储存月份名第一个数字用于表示字符串数(相当于行)第二个用于表示字符串长度(相当于列)class wnl{public:v oid isleapyear(int year); //判断闰年,用于输出判断结果,以流的形式b ool isleap(int year); //判断闰年,返回判断结果,用于计算天数i nt getdays(int year,int month,int day); //获取据第一天天数v oid weekdays(int year,int month,int day); //获取星期几v oid printyear(int year); //输出年的日历v oid printyearmonth(int year,int month); //输出某年某月的日历v oid animal(int year); //判断某年的生肖i nt getyear(){return Year;} //返回私有成员的值i nt getmonth(){return Month;}i nt getday(){return Day;}private:i nt Year,Month,Day;}_wnl;void main(){i nt choice,year,month,day;c out<<" ~~欢迎来到万年历查询系统~~"<<endl<<endl;c out<<"设计人:"<<endl;c out<<" 天津职业技术师范大学\n\t\t\t设计人:张锦琪\n\n";loop:c out<<" ╱请按序号输入您要做的工作:╲"<<endl;c out<<" ▏判断闰年请按1; ▕"<<endl;c out<<" ▏判断某天是星期几请按2; ▕"<<endl;c out<<" ▏判断某年的隶属生肖请按3; ▕"<<endl;c out<<" ▏输出某年的日历请按4; ▕"<<endl;c out<<" ▏输出某月的日期请按5; ▕"<<endl;c out<<" ╲如果您要退出系统请按0; ╱"<<endl;c in>>choice;s witch(choice){c ase 0:return;c ase 1:cout<<"输入一个年份格式如:xxxx";cin>>year;_wnl.isleapyear(year);break;c ase 2:{cout<<"请输入您要查询的天数格式如xxxx xx xx";cin>>year>>month>>day;_wnl.weekdays(year,month,day);}break;c ase 3:{cout<<"请输入您要查询的年份格式如xxxx:";cin>>year;_wnl.animal (year);}break;c ase 4:{cout<<"请输入你要输出的年份xxxx:";cin>>year;_wnl.printyear(year);}break;c ase 5:{cout<<"请输入您要输出的年月,形如xxxx xx:";cin>>year>>month;_wnl.printyearmonth(year,month);}break;d efault:cout<<"输入错误"<<endl;}c out<<"继续查询请输1 "<<endl<<"退出查询请输入字符"<<endl;i nt x;c in>>x;i f(x==1)goto loop;}void wnl::isleapyear(int year){i f(year>=1000&&year<=9999)printf("%s\n",year%(year%100?4:400)?"no":"yes"); //以C语言流的形式判断会更快一些,节省内存elseprintf("%s\n","没有按格式输入");}bool wnl::isleap(int year){i f(year%400==0||(year%100!=0&&year%4==0))return 1;e lsereturn 0;}void wnl::weekdays(int year,int month,int day){i f(year>=1000&&year<=9999){if(month<=12&&month>=1){int max=dayofmonth[month];if(day>0&&day<max){int s=getdays(year,month,day)%7;switch(s){case 0:cout<<"Sunday"<<endl;break;case 1:cout<<"Monday"<<endl;break;case 2:cout<<"Tuesday"<<endl;break;case 3:cout<<"Wednesday"<<endl;break;case 4:cout<<"Thursday"<<endl;break;case 5:cout<<"Friday"<<endl;break;case 6:cout<<"Saturday"<<endl;}}}}e lsecout<<"没有按格式输入"<<endl;int wnl::getdays(int year,int month,int day){i nt i,sum=0;f or(i=1;i<year;i++){if(isleap(i)) sum+=366;else sum+=365;}i f(isleap(year)) dayofmonth[2]=29;f or(i=1;i<month;i++) sum+=dayofmonth[i];s um+=day;r eturn sum;}void wnl::animal(int year){i f(year>=1000&&year<=9999){int n=year%12;switch(n){case 0: cout<<"该年是猴年"<<endl; break;case 1: cout<<"该年是鸡年"<<endl; break;case 2: cout<<"该年是狗年"<<endl; break;case 3: cout<<"该年是猪年"<<endl; break;case 4: cout<<"该年是鼠年"<<endl; break;case 5: cout<<"该年是牛年"<<endl; break;case 6: cout<<"该年是虎年"<<endl; break;case 7: cout<<"该年是兔年"<<endl; break;case 8: cout<<"该年是龙年"<<endl; break;case 9: cout<<"该年是蛇年"<<endl; break;case 10: cout<<"该年是马年"<<endl; break;case 11: cout<<"该年是羊年"<<endl; break; }}e lsecout<<"没有按格式输入"<<endl;}void wnl::printyear(int year){i f(year>=1000&&year<=9999)cout<<"输入一行输出的月份数:";int choice;cin>>choice;int s;int a[3],b[3]; //b数组用来储存每月的天数a数组用来临时储存那一月输出到的日期cout<<" year:"<<year<<endl;int i=1;for(i=1;i<=12/choice;i++)//计算纵向输出几个月{for(int h=1;h<=choice;h++) //该循环用于输出横向月份名{int m=choice*(i-1)+h; //计算月份cout<<" "<<monthname[m]<<" ";}cout<<endl;for(h=1;h<=choice;h++)cout<<"--------------------- ";cout<<endl;for(int j=0;j<choice;j++){cout<<"Su "<<"Mo "<<"Tu "<<"We "<<"Th "<<"Fr "<<"Sa "<<" ";}cout<<endl;for(j=0;j<choice;j++)//这个循环是为了输出第一行,第一行都是单数,所以提出来输{int month;month=choice*(i-1)+j+1;//计算月份s=getdays(year,month,1);s=s%7;//获取每月第一天for(int m=0;m<s;m++)cout<<" "; //输出月前的空if(isleap(year)) dayofmonth[2]=29;b[j]=dayofmonth[month];//月份天数b数组储存一个月的天数for(int i=1;i<8-s;i++) //从一号开始输出cout<<setw(2)<<i<<" "; //最后那个空是为了让一位数和两位数对齐a[j]=i;//a数组用来储存每一行的日期素材cout<<" "; //两个月份之间的空隙}cout<<endl;for(int w=1;w<=5;w++) //一个月最多会在五个星期出现{for(j=0;j<choice;j++)//输出要求个数的月份{int w=1;for(w=1;w<=7;w++,a[j]++)//依次输出日期{if(a[j]>b[j])//如果那一行的日期数大于该月最大日期则跳出break;cout<<setw(2)<<a[j]<<" ";if(w==7)cout<<" "; //输出每两个月之间日期间的空隙}for(int n=1;a[j]>b[j],n<=8-w;n++) //月份cout<<" ";if(a[j]>b[j]&&w!=8)//输出月份结束后的空cout<<" ";}cout<<endl;//为了美观空一行}}}}void wnl::printyearmonth(int year,int month){i f(year>=1000&&year<=9999){if(month<=12&&month>=1){cout<<" "<<monthname[month]<<endl;cout<<" ----------------------------------------"<<endl;cout<<setw(6)<<"Sun"<<setw(6)<<"Mon"<<setw(6)<<"Two"<<setw(6)<<"Wed"<<setw(6)<<"Thur"<<setw(6)<<"Fri"<<setw(6)<<"Sat"<<endl; //我觉得输出这个可以定义一个数组,用循环来做,但这样可能会使执行速度变慢int number=getdays(year,month,1)%7;//第一天就一就相当于有一天了for(int k=0;k<number;k++){cout<<setw(6)<<" ";}int max=dayofmonth[month];for(int j=1;j<=max;j++){cout<<setw(6)<<j;if((number+j)%7==0)//周六换行cout<<endl;}cout<<endl<<endl<<endl;}}e lsecout<<"没有按格式输入"<<endl;}。

相关主题