目录

  • 一,万年历的基本要求
    • 前言:万年历的创建思路
    • 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年前后以及该年的特殊情况。相关推荐

  1. c语言万年历代码作业,用c语言编写万年历程序

    用c语言编写万年历程序 <C 程序设计>课程设计报告 2011-2012学年第二学期 设计题目:万年历的设计 指导教师: 李素若 完成时间:2012 年 6月 1日至 2011年 6月 2 ...

  2. python编写万年历程序

    好的,下面是编写万年历程序的一些建议. 首先,你可以使用 Python 的 calendar 模块来获取每个月的日历信息.这个模块提供了很多有用的函数,例如 isleap 函数可以用来判断某一年是否是 ...

  3. Java黑皮书课后题第8章:**8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府。当接收到用户输入后,程序报告答案是否正确。假设50个州以及它们的首府保存在一个二维数组中,提示用户回答所

    **8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府 题目 题目描述与运行示例 破题 代码 题目 题目描述与运行示例 **8.37(猜测首府)编写一个程序,重复提示用户输入一个州的首府. ...

  4. Java学习之编写实现简单加密的程序,要求从键盘输入一个字符,输出加密后的字符。

    案例介绍: 编写实现简单加密的程序,要求从键盘输入一个字符,输出加密后的字符. 加密规则:输入A,输出Z;输入B,输出Y:输入a,输出z;输入b,输出y. 案例代码: import java.io.* ...

  5. 编写一个打印全年日历的程序

    /* 判断闰年3 如果知道某年元月一日是星期几,能否在本程序的基础上, 编写一个打印全年日历的程序? */ #include <iostream> using namespace std; ...

  6. 用C语言编写万年历6,C语言编写万年历

    <C语言编写万年历>由会员分享,可在线阅读,更多相关<C语言编写万年历(8页珍藏版)>请在人人文库网上搜索. 1.C语言编写万年历 [要求]:1 程序运行后,首先在屏幕上显示主 ...

  7. C语言小项目实践——日历程序

    完整代码包已经上传至我的down,修改请保留原作者注释 http://download.csdn.net/detail/xuptacm/9835030 炫迈日历计划研究报告 1.引言 日常生活中我们往 ...

  8. c语言编写万年历课程设计,用C语言编写万年历 C课程设计.pdf

    用C语言编写万年历 C课程设计 用用 C++语言编写万年历语言编写万年历 用用 语言编写万年历语言编写万年历 学生姓名:学生姓名: 指导老师:指导老师: 学生姓名学生姓名:: 指导老师指导老师:: 摘 ...

  9. 技术分享 | 使用 C++20 Ranges 标准库实现日历程序

    作者 | 罗能(知乎 id:@netcan) 整理 | 编程语言 Lab 花了我 3 个晚上才搞定,结论是目前 C++ 的 Ranges 标准库 [1] 对于实现 复杂的程序还不够用 ,提供的 vie ...

最新文章

  1. python json模块有什么用_Python的json模块及使用
  2. Spring详解(一):简介
  3. anaconda tensorflow 2.3_2020款福特撼路者将于7月17日上市 动力升级/搭载2.3T+10AT
  4. android 之 Hnadler 、Message 、Looper
  5. 一步步学习微软InfoPath2010和SP2010--第九章节--使用SharePoint用户配置文件Web service(2)--在事件注册表单上创建表单加载规则...
  6. LeetCode 938. 二叉搜索树的范围和(二叉树遍历+搜索剪枝)
  7. Perl IDE之Perl Express和Eclipse+EPIC+PadWalker
  8. java实现客服转接_Java微信公众平台开发(9) 关键字回复以及客服接口实现
  9. shell中设置文字输出的颜色及字体格式
  10. SmartSql使用教程(1)——初探,建立一个简单的CURD接口服务
  11. 28.Linux/Unix 系统编程手册(上) -- 详述进程创建和程序执行
  12. Android Studio代码自动提示无效
  13. 自己动手做Arduino玩具(二)
  14. shufflenet_v1
  15. pdf怎么删除其中一页 删除pdf页面的方法
  16. 1114 Family Property (25 point(s))
  17. 苹果付费app共享公众号_【苹果iOS付费游戏应用帐号分享】新增一款25元iOS游戏应用共享帐号...
  18. 万字长文之spring的整合
  19. Rime常用配置||输入默认英文
  20. python中日期的数据类型_强制日期时间转换,强制日期时间数据类型,在pandas中使用read_表...

热门文章

  1. (十一)XML 文件解析以及工具实现(详解)
  2. 传统HTML让图片横向水平居中方
  3. MySQL必知必会05:正确设置主键
  4. Windows系统 命令行修改默认的TTL值 不用重启的方法
  5. 【JVM】 双亲委派机制
  6. JVM系列(三):打破双亲委派及案例
  7. 市场人员被 CEO、销售要求去证明“数量指标”作用的现象越来越常见
  8. 自动驾驶 | Apollo无人驾驶课程笔记3-定位
  9. C++中 DWORD和int的区别
  10. 行亦谦ACM自闭之旅第五周