C++ 万年历

来源:互联网 发布:知净利润求利润总额 编辑:程序博客网 时间:2024/06/06 18:24

这是一个课程作业,也没有什么算法的内容,但是对编程风格的要求比较高,经过2个小时,写了200行左右的代码,可以大致实现控制台下的万年历功能。不过由于没有图形界面,看上去还是比较挫……

声明:由于课程作业的截止时间尚未到,所以严禁抄袭,否则后果自负……

/*author: lwfcgzstudentID: ********environment: Dev-C++ 4.9.2time: 2012-10-1*/#include<iostream>#include<string>#include<iomanip> using namespace std;//存储表示月份的字符串const string months[13]={"", "January","February","March","April","May","June","July","August","September","October","November","December"};//存储表示每个月天数的整数const int daysNumber[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//存储表示一周各天的字符串const string dayString[7]={"Mon","Tue","Wed","Thu","Fri","Sat","Sun"};//Month类用来为Date类提供基本服务class Month{public://返回月份对应的英语单词string getMonth(int monthNumber);//返回月份所对应的天数int getDaysNumber(int yearNumber, int monthNumber);//返回从公元0年到这一个月开始的总天数int getTotalDays(int yearNumber,int monthNumber);//判断一年是否为闰年bool isLeapYear(int yearNumber);};//日期类用来获取输入、显示日历class Date{private://年份int year;//月份int month;//天数计数器int daysCounter;//month月份的天数int daysNumberOfMonth;//Month类的实例Month monthInstance;//判断输入是否合法bool isValidInput();public://获取输入void getInput();//显示日历void showCalendar();};//主函数的执行入口int main(){Date date;while(1){//获取输入date.getInput();//显示日历date.showCalendar();system("pause");system("cls");}return 0;}//返回月份对应的英语单词string Month::getMonth(int monthNumber){if(monthNumber<0 ||monthNumber>12)return "out of range!";return months[monthNumber];}//返回月份所对应的天数int Month::getDaysNumber(int yearNumber, int monthNumber){if(monthNumber<0 ||monthNumber>12)return -1;//需要对2月进行单独讨论if(monthNumber!=2)return daysNumber[monthNumber];//闰年则返回29天if(isLeapYear(yearNumber)==true)return 29;//平年则返回28天else return 28;}//判断一年是否为闰年bool Month::isLeapYear(int yearNumber){if(yearNumber%4!=0)return false;if(yearNumber%100==0 && yearNumber%400!=0)return false;return true;}//返回从公元0年到这一个月开始的总天数int Month::getTotalDays(int yearNumber, int monthNumber){int counter=0;//从公元元年开始加for(int i=0;i<yearNumber;i++){if(isLeapYear(i)==true)counter+=366;else counter+=365;}//对当前年份进行计算for(int i=1;i<monthNumber;i++){counter+=getDaysNumber(yearNumber,i);}return counter;}//获取输入void Date::getInput(){while(1){cout<<"请输入年月(格式为“年 月”): ";cin>>year>>month;//检验有效则继续进行if(isValidInput()==true)break;//输入为无效年月则重新输入else{cout<<"输入数据无效!"<<endl;system("pause");system("cls");continue;}}}//显示日历void Date::showCalendar(){//无效输入不会进行月份显示if(isValidInput() == false)return;//获取从公元元年开始的总天数daysCounter=monthInstance.getTotalDays(year,month);daysCounter+=5;daysCounter%=7;//获取该月的总天数daysNumberOfMonth=monthInstance.getDaysNumber(year,month);//初始化计数器,保证每七个显示结果后面跟一个换行int tmpCounter=0;cout<<monthInstance.getMonth(month)<<endl;//输出表示星期几的字符串for(int i=0;i<7;i++){cout<<setw(4)<<dayString[i];}cout<<endl;//先填充空白的区域for(int i=0;i<daysCounter;i++){cout<<setw(4)<<" ";tmpCounter++;}//显示日历for(int i=0;i<daysNumberOfMonth;i++){if(tmpCounter%7==0 && tmpCounter!=0)cout<<endl;cout<<setw(4)<<i+1;tmpCounter++;}cout<<endl;return;}//判断输入是否有效bool Date::isValidInput(){if((this->year)<0 || (this->month)<=0 ||(this->month)>12)return false;return true;}

有不对的地方还请大家多多指正。。。。

原创粉丝点击