c和c++的一些训练题(7)(编排日历)

来源:互联网 发布:梦幻西游网络乾坤 编辑:程序博客网 时间:2024/05/14 08:13

问题的提出:日历的编排是每400年一个大循环周期,即今年的月、日、星期几和400年前的完全一样。现行天文历法根据天体运行规律,取每年365.2425天。这样,每400年共有365.2425×400=146097天。如果以365天作为一年,每400年就少了0.2425×400=97天。这97天要靠设置闰年(每年366)天来凑齐,所以,每400年要设置97个闰年。

       编程思路:按照以上背景知识可得判断闰年的规律:某年年份如果能被4整除但不能被100整除,或者能被400整除则是闰年。由此规则可推得计算万年历的公式:

s=X-1+(X-1)/4-(X-1)/100+(x-1)/400+c  上式中:X为公元年数(如2003年);C 为从元旦起,到要算的那天总数(如2003年3月23日,C=31+28+23=82)。S/7余数是星期几。

这个题目我理解错了,我编了这么一个程序:输入年月日,输出这个日期是星期几,利用了上面的公式,可是没有完成上面万年历的编写,也贴出来吧。

代码:

// test5.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>using namespace std;int IsLeap(int y){if(y%4==0){if(y%100==0){if(y%400==0) {return 1;}else{return 0;}}else{return 0;}}else{return 0;}}int _tmain(int argc, _TCHAR* argv[]){cout<<"请输入需要查询的日期:"<<endl;int year, month, day;cout<<"年份: ";cin>>year;cout<<"月份: ";cin>>month;cout<<"日期: ";cin>>day;int sum=0;int c=0;int r;if(IsLeap(year)){r=0;}else{r=1;}switch(month){case 1: c=day;break;case 2:c=day+31;break;case 3:c=day+31+28+r;break;case 4:c=day+31+28+r+31;break;case 5:c=day+31+28+r+31+30;break;case 6:c=day+31+28+r+31+30+31;break;case 7:c=day+31+28+r+31+30+31+30;break;case 8:c=day+31+28+r+31+30+31+30+31;break;case 9:c=day+31+28+r+31+30+31+30+31+31;break;case 10:c=day+31+28+r+31+30+31+30+31+31+30;break;case 11:c=day+31+28+r+31+30+31+30+31+31+30+31;break;case 12:c=day+31+28+r+31+30+31+30+31+31+30+31+30;break;default:cout<<"您输入的月份有误,请检查后输入。"<<endl;}sum=year-1+(year-1)/100+(year-1)/400+c;int week;week=sum%7;char *weeks[]={"星期一","星期二","星期三","星期四","星期五","星期六","星期天"};cout<<year<<"年"<<month<<"月"<<day<<"日是"<<weeks[week-1]<<endl;system("pause");return 0;}
结果:


0 0
原创粉丝点击