C++编写万年历,公元后日历程序,考虑了1582年前后以及该年的特殊情况。
目录
- 一,万年历的基本要求
- 前言:万年历的创建思路
- 1.公元天数与日期
- 1.日期输入问题
- 2.闰年与平年的数目
- 3.日历的输出问题
- 1.日数转化为星期
- 2.日历月份开头
- 二,万年历正确性的额外补丁
- 1.1582年闰年定义的变更解决
- 2.1582年消失的十天
- 三,万年历程序的组成函数
- 1.程序使用常量的设定
- 2.辅助函数
- 3.天数转化星期(其中有函数调用)
- 3.日历输出函数
- ==代码如上仅供参考==
一,万年历的基本要求
前言:万年历的创建思路
日历,要求日期与星期对应。基本格式输出就是,要求在一月内,从该月起始日到该月终止日,每一日都与星期相对应,因此,可以根据日期对天数7取余来完成对应。
其次,在一年内,每月都有属于自己的日期数,比如11月有30天。每一月份对应日历相互独立,(我们不可能将11月30日与12月1日连在一起,因为实际生活中的日历就不是这样的)。然而,需要注意到的是,虽然在日历上,它们处于两个不同日历月份,但在日期上他们只差一天,在星期上,它们也是两个相连的星期。因此,我们可以确定两个基本思路:
1.每一月份要规定最大日期,避免溢出,也规范了输出。
2.要确定某一日为参照日,用目标日减去参照日,得到距离日期,就可以做到本月末与下月初日期相连。
自然,要创作公元后日历,我们选用公元一年一月一日作为参照日,为1 。 这样我们确定了基本思路。
规定公元1年1月1日为1后,查找它对应的星期可以得到,为星期六,我们的两个起始点都确定,下面可以根据思路具体实现。
1.公元天数与日期
在确定了参照日后,我们假设要计算某一年某一月某一日的日数,
比如1900年5月21日,那么,我们必须用1900年以前所有年包含的日数,
加上前4月的所有日期数,再加上21,就得到了距离天数,再拿距离天数
加上某一特定数字(该数字作用是得到正确星期,因为参照日为星期六 )
对7取余,就可以得到该日的正确星期。
1.日期输入问题
首先,我们创造了一个日期转换函数,作用是得到某年某日某月距离参照日的日期。因此,参数输入为 年,月,日;返回参数为日期。
int Date_to_day(int y, int m, int d)
那我们定义该函数的第一件事,就是规避错误输入 ,避免后续错误发生的可能。错误输入就包括:年份,月份,日期不能为负数,不能超过对应最大值。
因此,先设立两个枚举,其中包括除二月份外每一月份的天数最大值,以及二月份在平闰年的天数最大值。
//月份天数最大值enum Month_d { Jan_d = 31, Mar_d = 31, Apri_d = 30, May_d = 31, Jun_d = 30, Jul_d = 31, Aug_d = 31, Sep_d = 30, Oct_d = 31, Nov_d = 30, Dec_d = 31};enum Month_leap_d { Feb_d = 28, Feb_ld = 29 };
//枚举创建数组static int month_darray[11] = {Jan_d,Mar_d,Apri_d,May_d,Jun_d,Jul_d,Aug_d,Sep_d,Oct_d,Nov_d,Dec_d};
在函数内设立输入判断条件:
//排除基本输入错误if (y < 1 || m < 1 || m>12 || d < 1 || d>31){cout << "输入错误.程序结束.\n";exit(EXIT_FAILURE);}//排除平年输入错误if (y % 4 != 0&&m==2)if (d > Feb_d){cout << "输入错误.程序结束.\n";exit(EXIT_FAILURE);}//补丁(排除定日期月份超出限额问题)if (m == 1){if (d > month_darray[0]){cout << "输入日期不符实际,超出月份上限,程序结束。\n";exit(EXIT_FAILURE);}}else if (m > 2){if (d > month_darray[m - 2]){cout << "输入日期不符实际,超出月份上限,程序结束。\n";exit(EXIT_FAILURE);}}
由于不能被4整除的年份一定是平年,因此在开头,我们先在开头排除了平年对程序的影响。在讨论闰年平年定义时,我们再对不足进行进一步补全。
2.闰年与平年的数目
现在日历上对闰年的定义为四年一闰百年不闰,每四百年再一闰。因此我们可以根据输入年数,该年(包括该年)以前共有多少闰年,多少平年。
再根据数目将年数转化为天数:
//得到1~y年的闰年平年数目int lead_y1 = y / 4;int lead_y2 = y / 100;int lead_y3 = y / 400;int total_lead = 0;total_lead = lead_y1 - lead_y2 + lead_y3+(JUDE_Y/100-JUDE_Y/400);//得到平年年数数目;int total_com = y - total_lead;//之前的年数转化为日(包括今年)int total_yday = total_lead * leap_year_day + total_com * year_day;
其中,上述代码块设定了常量值:
//声明使用常量static const int leap_year_day = 366;static const int year_day = 365;
在根据四年一闰百年不闰,每四百年再一闰的定义,对闰年判断,得到目标天数。
月份转化为天数:
//月份转化为日(不包括2月以及本月)int total_mday = 0;if (2 == m)total_mday += month_darray[m - 1];else{for (int i = 0; i < m - 2; i++)//不能加上本月份total_mday += month_darray[i];}
if ((0 == y % 4) && (0 != y % 100) || (0 == y % 400))//闰年{total_yday -= leap_year_day;if (m > 2)total_mday += Feb_ld;fe = 1;}else{total_yday -= year_day;if (m > 2)total_mday += Feb_d;fe = 0;}//补丁(排除二月份日期溢出的问题)if (m == 2 && 0 == fe){if (d > Feb_d){cout << "输入日期不符实际,超出月份上限,程序结束。\n";exit(EXIT_FAILURE);}}else if (2 == m && 1 == fe){if (d > Feb_ld){cout << "输入日期不符实际,超出月份上限,程序结束。\n";exit(EXIT_FAILURE);}}//年月日对应的日数int total_day = total_mday + total_yday + d;
总天数:
//年月日对应的日数int total_day = total_mday + total_yday + d;
3.日历的输出问题
1.日数转化为星期
至此,我们得到了基本正确的目标天数,可以将它加上一个数字对7取余,便得到了对应的星期数:
//日期转星期换算int day_to_weekday(int n){//公元1年1月1日是星期六static const int pud_day = 5;int weekday =(pud_day+n)%7;return weekday;}
设立一个数组保存需要输出星期日期。
const char weekDay[16] = { "日一二三四五六" };
然后再制作一个函数,输出该日期对应的星期:
//星期输出问题void weekday(int n){std::cout << "该日期为:星期" << weekDay[n * 2] << weekDay[n * 2 + 1] << std::endl;}
需要注意的是,汉字储存需要两个字节连续储存,因此输出时也因连续输出两个字节。
至此,日期得到对应星期的工作基本完成。
运行截图如下:
该图片为最终代码运行输出与实况并不相同
2.日历月份开头
日历的表头一般是”日一二三四五六“。
因此可以创建一个表头函数,在每次显示日历时在函数中调用该表头。
//日历表头void Cal_week(){std::cout << "日\t一\t二\t三\t四\t五\t六\n";};
同时,根据得到的函数取余返回值,可以利用循环得到日历表前空白:
Cal_week();//表头for (int j = 0; j < week_day; j++)cout << " \t";//表首
此时,输出的具体日历,需要根据该年的闰平年情况进行判断,因此设立变量作为判断返回结果:
if ((0 == n % 4) && (0 != n % 100) || (0 == n % 400))//闰年fe = 1;elsefe = 0;
然后根据每个月,月初距离参照日的目标天数对七取余的返回值,以及该月份最大值,便可输出得到日历:
部分参数设定:
//平年static int month_D[12] ={Jan_d,Feb_d,Mar_d,Apri_d,May_d,Jun_d,Jul_d,Aug_d,Sep_d,Oct_d,Nov_d,Dec_d};//闰年static int month_LD[12] ={Jan_d,Feb_ld,Mar_d,Apri_d,May_d,Jun_d,Jul_d,Aug_d,Sep_d,Oct_d,Nov_d,Dec_d};
日历输出代码块:
for (int i = 0; i < 12; i++){int week_day = Date_to_day(n, Month_array[i], 1);//制作日历表cout << '\t' << i + 1 << "月\n";Cal_week();//表头for (int j = 0; j < week_day; j++)cout << " \t";//表首if (fe == 1){for (int n = 1; n <= month_LD[i]; n++){cout << n << '\t';if (0 == (n + week_day) % 7)cout << endl;}}else{for (int n = 1; n <= month_D[i]; n++){cout << n << '\t';if (0 == (n + week_day) % 7)cout << endl;}}cout << endl;};
至此,输出万年历的基本操作完成。
以下为运行截图:
该图片为最终代码运行输出与实况并不相同
但如果我们细心观察,就会发现,日历与星期对不上,并且差距较大。这是为什么呢?
并不是程序运行出了什么差错,而是,闰年的定义经过了变更。
为保证万年历的正确性,下面我们要讨论闰年的定义补充。
二,万年历正确性的额外补丁
凡公历中有闰日(2月29日)的年份,阴阳历中有闰月的年份。
1582年以来公历的置闰规则:
普通闰年:公历年份是4的倍数,且不是100的倍数的,为闰年
(如2004年、2020年等就是闰年)。
世纪闰年:公历年份是整百数的,必须是400的倍数才是闰年
(如1900年不是闰年,2000年是闰年)。
1582年以前的惯例:四年一闰;
也就是说,如果我们按1582年以来的闰年定义来得到公元1年以后的日历的话,偏差会越来越大。
因此为了解决这个偏差,我们对日期转化函数进行了分段更进。
以1583前为一段,以1583开始为一段。
1.1582年闰年定义的变更解决
对闰年定义分段,则会得到两种闰年和平年的数目。
如果在转化函数内对日期分段,再将得到的日期转化为星期。在第一步的分段分析,再将数字相加将会很麻烦。
因此,我们不妨如同将公元1年1月1日作为参照日那样,将1583年1月1日作为参考日,即:
1.在1583年以前(输入年数小于1583),用四年一闰的方法,判断闰年数可以得到正确日期。
2.在1583年以后,输入的年份用现在定义的闰年方法定义(此时得到的日期数是错误的),减去用现在定义的闰年方法定义的1583年以前的错误日期(此时得到的1583年以前的日期也是错误的),就得到了1583年以后的日期相对于1583年1月1日的正确的距离天数。
即抛弃之前的错误,使用参照日为1583年1月1日的正确天数。
改进后代码块:
(1)平闰年数目以及年月转化:
//得到1~y年的闰年平年数目int lead_y1 = y / 4;int lead_y2 = y / 100;int lead_y3 = y / 400;int total_lead = 0;if (y < 1583)total_lead = lead_y1;elsetotal_lead = lead_y1 - lead_y2 + lead_y3+(JUDE_Y/100-JUDE_Y/400);//得到平年年数数目;int total_com = y - total_lead;//之前的年数转化为日(包括今年)int total_yday = total_lead * leap_year_day + total_com * year_day;//月份转化为日(不包括2月以及本月)int total_mday = 0;if (2 == m)total_mday += month_darray[m - 1];else{for (int i = 0; i < m - 2; i++)//不能加上本月份total_mday += month_darray[i];}
(2)1583年以前日期转化为天数:
if (y < 1583){if (0 == y % 4)//闰年{total_yday -= leap_year_day;if (m > 2)total_mday += Feb_ld;fe = 1;}else{total_yday -= year_day;if (m > 2)total_mday += Feb_d;fe = 0;}//补丁(排除二月份日期溢出的问题)if (m == 2 && 0 == fe){if (d > Feb_d){cout << "输入日期不符实际,超出月份上限,程序结束。\n";exit(EXIT_FAILURE);}}else if (2 == m && 1 == fe){if (d > Feb_ld){cout << "输入日期不符实际,超出月份上限,程序结束。\n";exit(EXIT_FAILURE);}}
//年月日对应的日数int total_day = total_mday + total_yday + d;
(3)1583年后:
//定义的常量:
static const int JUDE_YEAR = 1582 / 4 * leap_year_day + (1582 - 1582 / 4) * year_day;static const int JUDE_Y = 1582;else{//闰年新制定的日历方法total_yday -= JUDE_YEAR;if ((0 == y % 4) && (0 != y % 100) || (0 == y % 400))//闰年{total_yday -= leap_year_day;if (m > 2)total_mday += Feb_ld;fe = 1;}else{total_yday -= year_day;if (m > 2)total_mday += Feb_d;fe = 0;}//补丁(排除二月份日期溢出的问题)if (m == 2 && 0 == fe){if (d > Feb_d){cout << "输入日期不符实际,超出月份上限,程序结束。\n";exit(EXIT_FAILURE);}}else if (2 == m && 1 == fe){if (d > Feb_ld){cout << "输入日期不符实际,超出月份上限,程序结束。\n";exit(EXIT_FAILURE);}}//年月日对应的日数int total_day = total_mday + total_yday + d;
再如同定义公元1年1月1日那样,定义它:
//1582年后int day_to_weekday_new(int n){//公元1583年1月1日是星期六static const int Pud_day = 5;int weekday = (Pud_day + n) % 7;return weekday;}
再调用该函数即可:
//年月日对应的日数int total_day = total_mday + total_yday + d;//调用函数int wday = day_to_weekday_new(total_day);cout << "公元" << y << "年" << m << "月" << d << "日\t";weekday(wday);
这样,分段处理后,再搭配日历输出函数,便可以输出精准正确的星期与日历。
2.1582年消失的十天
下面,是1582年10月日历上消失的十天。
按照上述程序,程序以及可以完美实现公元后任意一年的日历输出。
但1582年有特殊情况:1582年10月5~14号并不存在,因此,要进行一下操作改进程序:
1.规避输入: 使程序判断输入该日期时,结果为false。
//判断是否在1582年后int Jude_year = 1582;//补丁://特殊情况: 1582年10月5~14输入为错误,消失的十天if(y==Jude_year&&m==Oct)if (4< d && d < 15){cout << "1582年10月" << d << "日不存在于日历中。\n";exit(EXIT_FAILURE);}
2.输出日期对应星期: 1582年十月消失10天,因此,10月5日以前可以使用四年一闰的方法得到正确日期,而10月14日以后,得到日期的总数要减去10。
因此,加一个判断条件(加在y<1583的条件语句块里):
//年月日对应的日数int total_day = total_mday + total_yday + d;//平年判断补丁//补丁(1582年特殊情况)if (y == Jude_year && m == Oct){if (d > 14){total_day -= 10;}}else if (y == Jude_year && m > Oct){total_day -= 10;}//调用函数int wday = day_to_weekday(total_day);cout << "公元" << y << "年" << m << "月" << d << "日\t";weekday(wday);
这样可以得到正确星期。
3.输出正确日历:
辅助函数:
//1582年11月1日为星期一int day_to_weekday_1582(int n){//公元1583年11月1日是星期一static const int Pud_day = 5;if (n == Nov){int weekday = (Pud_day + 3) % 7;return weekday;}//12月1日是星期三else if (n == Dec){int weekday = (Pud_day + 5) % 7;return weekday;}//10月1日为星期一else if (n == Oct){int weekday = (Pud_day + 3) % 7;return weekday;}}
输出日历部分:
if (n == 1582){fe = 0;//1~9月份的日期for (int i = 0; i < 9; i++){int week_day = Date_to_day(n, Month_array[i], 1);//制作日历表cout << '\t' << i + 1 << "月\n";Cal_week();//表头for (int j = 0; j < week_day; j++)cout << " \t";//表首for (int n = 1; n <= month_D[i]; n++){cout << n << '\t';if (0 == (n + week_day) % 7)cout << endl;}cout << endl;};//10月{int week_day = day_to_weekday_1582(Oct);cout << "公元" << JUDE_Y << "年" << Oct<< "月" << 1 << "日\t";weekday(week_day);cout << '\t' << Oct << "月\n";Cal_week();//表头for (int j = 0; j < week_day; j++)cout << " \t";//表首for (int n = 1; n <= 4; n++){cout << n << '\t';if (0 == (n + week_day) % 7)cout << endl;}for (int n = 15; n <= 31; n++){cout << n << '\t';if (0 == (n + week_day-10) % 7)cout << endl;}cout << endl;};//11~12月for (int i = 10; i < 12; i++){int week_day = day_to_weekday_1582(i + 1);cout << "公元" << JUDE_Y << "年" << i+1 << "月" << 1 << "日\t";weekday(week_day);//制作日历表cout << '\t' << i + 1 << "月\n";Cal_week();//表头for (int j = 0; j < week_day; j++)cout << " \t";//表首for (int n = 1; n <= month_D[i]; n++){cout << n << '\t';if (0 == (n + week_day) % 7)cout << endl;}cout << endl;};return;//结束进程}
运行结果截图:
至此,程序结束,万年历制作完成。
三,万年历程序的组成函数
代码部分仅供参考
1.程序使用常量的设定
//声明使用常量static const int leap_year_day = 366;static const int year_day = 365;//补丁static const int JUDE_YEAR = 1582 / 4 * leap_year_day + (1582 - 1582 / 4) * year_day;static const int JUDE_Y = 1582;enum Month{ZERO,Jan, Feb, Mar, Apri, May, Jun, Jul, Aug, Sep, Oct, Nov,Dec };//月份天数最大值enum Month_d { Jan_d = 31, Mar_d = 31, Apri_d = 30, May_d = 31, Jun_d = 30, Jul_d = 31, Aug_d = 31, Sep_d = 30, Oct_d = 31, Nov_d = 30, Dec_d = 31};enum Month_leap_d { Feb_d = 28, Feb_ld = 29 };//声明使用数组static int Month_array[12] = {Jan, Feb, Mar, Apri, May, Jun, Jul, Aug, Sep, Oct, Nov,Dec};static int month_darray[11] = {Jan_d,Mar_d,Apri_d,May_d,Jun_d,Jul_d,Aug_d,Sep_d,Oct_d,Nov_d,Dec_d};//平年static int month_D[12] ={Jan_d,Feb_d,Mar_d,Apri_d,May_d,Jun_d,Jul_d,Aug_d,Sep_d,Oct_d,Nov_d,Dec_d};//闰年static int month_LD[12] ={Jan_d,Feb_ld,Mar_d,Apri_d,May_d,Jun_d,Jul_d,Aug_d,Sep_d,Oct_d,Nov_d,Dec_d};const char weekDay[16] = { "日一二三四五六" };
2.辅助函数
表头函数:
//日历表头void Cal_week(){std::cout << "日\t一\t二\t三\t四\t五\t六\n";};
输出星期函数:
//星期输出问题void weekday(int n){std::cout << "该日期为:星期" << weekDay[n * 2] << weekDay[n * 2 + 1] << std::endl;}
换算日历函数(3个):
//日期转星期换算int day_to_weekday(int n){//公元1年1月1日是星期六static const int pud_day = 5;int weekday =(pud_day+n)%7;return weekday;}//1582年后int day_to_weekday_new(int n){//公元1583年1月1日是星期六static const int Pud_day = 5;int weekday = (Pud_day + n) % 7;return weekday;}//1582年11月1日为星期一int day_to_weekday_1582(int n){//公元1583年11月1日是星期一static const int Pud_day = 5;if (n == Nov){int weekday = (Pud_day + 3) % 7;return weekday;}//12月1日是星期三else if (n == Dec){int weekday = (Pud_day + 5) % 7;return weekday;}//10月1日为星期一else if (n == Oct){int weekday = (Pud_day + 3) % 7;return weekday;}}
3.天数转化星期(其中有函数调用)
//日期换算int Date_to_day(int y, int m, int d){using std::cout;using std::endl;using std::cin;//排除基本输入错误if (y < 1 || m < 1 || m>12 || d < 1 || d>31){cout << "输入错误.程序结束.\n";exit(EXIT_FAILURE);}//排除平年输入错误if (y % 4 != 0&&m==2)if (d > Feb_d){cout << "输入错误.程序结束.\n";exit(EXIT_FAILURE);}//补丁(排除定日期月份超出限额问题)if (m == 1){if (d > month_darray[0]){cout << "输入日期不符实际,超出月份上限,程序结束。\n";exit(EXIT_FAILURE);}}else if (m > 2){if (d > month_darray[m - 2]){cout << "输入日期不符实际,超出月份上限,程序结束。\n";exit(EXIT_FAILURE);}}//得到1~y年的闰年平年数目int lead_y1 = y / 4;int lead_y2 = y / 100;int lead_y3 = y / 400;int total_lead = 0;if (y < 1583)total_lead = lead_y1;elsetotal_lead = lead_y1 - lead_y2 + lead_y3+(JUDE_Y/100-JUDE_Y/400);//得到平年年数数目;int total_com = y - total_lead;//之前的年数转化为日(包括今年)int total_yday = total_lead * leap_year_day + total_com * year_day;//月份转化为日(不包括2月以及本月)int total_mday = 0;if (2 == m)total_mday += month_darray[m - 1];else{for (int i = 0; i < m - 2; i++)//不能加上本月份total_mday += month_darray[i];}//判断本年是否为闰年int fe = 0;//判断是否在1582年后int Jude_year = 1582;//补丁://特殊情况: 1582年10月5~14输入为错误,消失的十天if(y==Jude_year&&m==Oct)if (4< d && d < 15){cout << "1582年10月" << d << "日不存在于日历中。\n";exit(EXIT_FAILURE);}//得到年月的总日数//1583年以前的闰年规则if (y < 1583){if (0 == y % 4)//闰年{total_yday -= leap_year_day;if (m > 2)total_mday += Feb_ld;fe = 1;}else{total_yday -= year_day;if (m > 2)total_mday += Feb_d;fe = 0;}//补丁(排除二月份日期溢出的问题)if (m == 2 && 0 == fe){if (d > Feb_d){cout << "输入日期不符实际,超出月份上限,程序结束。\n";exit(EXIT_FAILURE);}}else if (2 == m && 1 == fe){if (d > Feb_ld){cout << "输入日期不符实际,超出月份上限,程序结束。\n";exit(EXIT_FAILURE);}}//年月日对应的日数int total_day = total_mday + total_yday + d;//平年判断补丁//补丁(1582年特殊情况)if (y == Jude_year && m == Oct){if (d > 14){total_day -= 10;}}else if (y == Jude_year && m > Oct){total_day -= 10;}//调用函数int wday = day_to_weekday(total_day);cout << "公元" << y << "年" << m << "月" << d << "日\t";weekday(wday);return wday;}//1583年后的闰年规则else{//闰年新制定的日历方法total_yday -= JUDE_YEAR;if ((0 == y % 4) && (0 != y % 100) || (0 == y % 400))//闰年{total_yday -= leap_year_day;if (m > 2)total_mday += Feb_ld;fe = 1;}else{total_yday -= year_day;if (m > 2)total_mday += Feb_d;fe = 0;}//补丁(排除二月份日期溢出的问题)if (m == 2 && 0 == fe){if (d > Feb_d){cout << "输入日期不符实际,超出月份上限,程序结束。\n";exit(EXIT_FAILURE);}}else if (2 == m && 1 == fe){if (d > Feb_ld){cout << "输入日期不符实际,超出月份上限,程序结束。\n";exit(EXIT_FAILURE);}}//年月日对应的日数int total_day = total_mday + total_yday + d;//调用函数int wday = day_to_weekday_new(total_day);cout << "公元" << y << "年" << m << "月" << d << "日\t";weekday(wday);return wday;}}
3.日历输出函数
//输出日历void month_Calendar(int n){using std::cout;using std::endl;cout << "年份:" << n << " 年\n";//该年是否为闰年的判断依据int fe;//考虑特殊情况 1582年if (n == 1582){fe = 0;//1~9月份的日期for (int i = 0; i < 9; i++){int week_day = Date_to_day(n, Month_array[i], 1);//制作日历表cout << '\t' << i + 1 << "月\n";Cal_week();//表头for (int j = 0; j < week_day; j++)cout << " \t";//表首for (int n = 1; n <= month_D[i]; n++){cout << n << '\t';if (0 == (n + week_day) % 7)cout << endl;}cout << endl;};//10月{int week_day = day_to_weekday_1582(Oct);cout << "公元" << JUDE_Y << "年" << Oct<< "月" << 1 << "日\t";weekday(week_day);cout << '\t' << Oct << "月\n";Cal_week();//表头for (int j = 0; j < week_day; j++)cout << " \t";//表首for (int n = 1; n <= 4; n++){cout << n << '\t';if (0 == (n + week_day) % 7)cout << endl;}for (int n = 15; n <= 31; n++){cout << n << '\t';if (0 == (n + week_day-10) % 7)cout << endl;}cout << endl;};//11~12月for (int i = 10; i < 12; i++){int week_day = day_to_weekday_1582(i + 1);cout << "公元" << JUDE_Y << "年" << i+1 << "月" << 1 << "日\t";weekday(week_day);//制作日历表cout << '\t' << i + 1 << "月\n";Cal_week();//表头for (int j = 0; j < week_day; j++)cout << " \t";//表首for (int n = 1; n <= month_D[i]; n++){cout << n << '\t';if (0 == (n + week_day) % 7)cout << endl;}cout << endl;};return;//结束进程}if (n < 1583){if (0 == n % 4)//闰年fe = 1;elsefe = 0;}else{if ((0 == n % 4) && (0 != n % 100) || (0 == n % 400))//闰年fe = 1;elsefe = 0;}//星期余数for (int i = 0; i < 12; i++){int week_day = Date_to_day(n, Month_array[i], 1);//制作日历表cout << '\t' << i + 1 << "月\n";Cal_week();//表头for (int j = 0; j < week_day; j++)cout << " \t";//表首if (fe == 1){for (int n = 1; n <= month_LD[i]; n++){cout << n << '\t';if (0 == (n + week_day) % 7)cout << endl;}}else{for (int n = 1; n <= month_D[i]; n++){cout << n << '\t';if (0 == (n + week_day) % 7)cout << endl;}}cout << endl;};}
代码如上仅供参考
如有不足,敬请指正。
C++编写万年历,公元后日历程序,考虑了1582年前后以及该年的特殊情况。相关推荐
- c语言万年历代码作业,用c语言编写万年历程序
用c语言编写万年历程序 <C 程序设计>课程设计报告 2011-2012学年第二学期 设计题目:万年历的设计 指导教师: 李素若 完成时间:2012 年 6月 1日至 2011年 6月 2 ...
- python编写万年历程序
好的,下面是编写万年历程序的一些建议. 首先,你可以使用 Python 的 calendar 模块来获取每个月的日历信息.这个模块提供了很多有用的函数,例如 isleap 函数可以用来判断某一年是否是 ...
- Java黑皮书课后题第8章:**8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府。当接收到用户输入后,程序报告答案是否正确。假设50个州以及它们的首府保存在一个二维数组中,提示用户回答所
**8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 **8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府. ...
- Java学习之编写实现简单加密的程序,要求从键盘输入一个字符,输出加密后的字符。
案例介绍: 编写实现简单加密的程序,要求从键盘输入一个字符,输出加密后的字符. 加密规则:输入A,输出Z;输入B,输出Y:输入a,输出z;输入b,输出y. 案例代码: import java.io.* ...
- 编写一个打印全年日历的程序
/* 判断闰年3 如果知道某年元月一日是星期几,能否在本程序的基础上, 编写一个打印全年日历的程序? */ #include <iostream> using namespace std; ...
- 用C语言编写万年历6,C语言编写万年历
<C语言编写万年历>由会员分享,可在线阅读,更多相关<C语言编写万年历(8页珍藏版)>请在人人文库网上搜索. 1.C语言编写万年历 [要求]:1 程序运行后,首先在屏幕上显示主 ...
- C语言小项目实践——日历程序
完整代码包已经上传至我的down,修改请保留原作者注释 http://download.csdn.net/detail/xuptacm/9835030 炫迈日历计划研究报告 1.引言 日常生活中我们往 ...
- c语言编写万年历课程设计,用C语言编写万年历 C课程设计.pdf
用C语言编写万年历 C课程设计 用用 C++语言编写万年历语言编写万年历 用用 语言编写万年历语言编写万年历 学生姓名:学生姓名: 指导老师:指导老师: 学生姓名学生姓名:: 指导老师指导老师:: 摘 ...
- 技术分享 | 使用 C++20 Ranges 标准库实现日历程序
作者 | 罗能(知乎 id:@netcan) 整理 | 编程语言 Lab 花了我 3 个晚上才搞定,结论是目前 C++ 的 Ranges 标准库 [1] 对于实现 复杂的程序还不够用 ,提供的 vie ...
最新文章
- python json模块有什么用_Python的json模块及使用
- Spring详解(一):简介
- anaconda tensorflow 2.3_2020款福特撼路者将于7月17日上市 动力升级/搭载2.3T+10AT
- android 之 Hnadler 、Message 、Looper
- 一步步学习微软InfoPath2010和SP2010--第九章节--使用SharePoint用户配置文件Web service(2)--在事件注册表单上创建表单加载规则...
- LeetCode 938. 二叉搜索树的范围和(二叉树遍历+搜索剪枝)
- Perl IDE之Perl Express和Eclipse+EPIC+PadWalker
- java实现客服转接_Java微信公众平台开发(9) 关键字回复以及客服接口实现
- shell中设置文字输出的颜色及字体格式
- SmartSql使用教程(1)——初探,建立一个简单的CURD接口服务
- 28.Linux/Unix 系统编程手册(上) -- 详述进程创建和程序执行
- Android Studio代码自动提示无效
- 自己动手做Arduino玩具(二)
- shufflenet_v1
- pdf怎么删除其中一页 删除pdf页面的方法
- 1114 Family Property (25 point(s))
- 苹果付费app共享公众号_【苹果iOS付费游戏应用帐号分享】新增一款25元iOS游戏应用共享帐号...
- 万字长文之spring的整合
- Rime常用配置||输入默认英文
- python中日期的数据类型_强制日期时间转换,强制日期时间数据类型,在pandas中使用read_表...