万年日历(C语言)

article/2025/10/21 13:51:26

C Language 万年历程序----(1840~2110)年

##声明:此程序并非本人全原创,已修改其中少数内容,仅供小白参考,大佬者若言论,来吧,用点力——后续本人将更新此万年历添加更有丰富的内容,先让此源码再飞一会儿(暂时没空,腾不出手),各位使劲消化下。源例请参考《C语言项目开发全程实录》第二版。但这书是个外包公司编撰,内容很dog,主要体现为在大多项目程序主要关键算法处一概而过,要么直接跳过去。资源视频讲解完全照着注释一句句念。所以小白看的一头雾水,老白看的似懂非懂,大佬:什么鬼(仅个人愚见,望海涵)但大多事实。
写此文章原因:一,因书内所编写的程序很经典,仅能在书内指定的IDE(DEV-C++)下运行。
二,本人查询了关于本人目前已知销售此书的原址出反馈,评论。发现不少萌新直接拿书内源程序一字不差照搬(您仔细审阅下那代码块顺序,逻辑运行,往前翻看下业务流程图,就不会猛抄了),导致BUG满天飞的现象(此书页面内大多只提供80%源码并附于解说,并非完整程序)——虽然书内提供了完整源码资源下载网址,但若想在其它编译器上正确运行,依旧最好别照搬,还是那句话“请在本书指定IDE下运行”。所以,本人如今把修改后可以在常用的VS2015~2019系列下运行的发布下。本人常用PC.VS Enterprise 2017x64。VS2017加载修改后C语言部分效果展示(8个功能块较多不再展示)如下:
请添加图片描述请添加图片描述
主函数全部源码如下

#include"Calendar.h"int main()
{system("color f0");//控制台背景显示为白色。int mode = 0;int year, month, day, dMn, days;int error_times = 0;LUNARDATE lunar_date;LONGTIME It;while (error_times < 5) {year = -1, month = -1, dMn = -1, days = 9025910;printf("\t\t\t C语言万年历(1840~2110)\n\n");It = GetCurTime();hOut = GetStdHandle(STD_OUTPUT_HANDLE);//获取控制台输出句柄SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);//更改文字颜色,为红色printf("\t\t\t   %d-%d-%d %02d:%02d:%02d %s\r\n\n", It.wYear, It.wMonth, It.wDay, It.wHour, It.wMinute, It.wSecond, Week[It.wDayOfWeek]);//输出年,月,日,时,分,秒,周SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);//返回文字颜色,为蓝色。色彩设置根据三原色混色标准设定,例如:黑色+白色=灰,红+绿=黄,蓝+红=紫 等......SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);printf("\t\t\t      ★");SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED |FOREGROUND_BLUE);printf("★");SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf("功能选择:");SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE |FOREGROUND_GREEN);printf("★");SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);printf("★         \n\n");SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);//打印主界面菜单选项printf("\t\t-------------------------------------------------\n");printf("\t\t|\t*  1、农历  \t\t\t\t|\n\t\t|\t\t\t\t\t\t|\n\t\t|\t*  ""2、公历  \t\t\t\t|\n\t\t|\t\t\t\t\t\t|\n\t\t|\t*  ""3、月历  \t\t\t\t|\n\t\t|\t\t\t\t\t\t|\n\t\t|\t*  ""4、某天距今天的天数  \t\t|\n\t\t|\t\t\t\t\t\t|\n\t\t|\t*  ""5、距今天相应天数的日期   \t\t|\n\t\t|\t\t\t\t\t\t|\n\t\t|\t*  ""6、任意两天之间的天数差   \t\t|\n\t\t|\t\t\t\t\t\t|\n\t\t|\t*  ""7、二十四节气  \t\t\t|\n\t\t|\t\t\t\t\t\t|\n\t\t|\t*  ""8、节日  \t\t\t\t|\n");printf("\t\t-------------------------------------------------\n");printf("\t\t你的输入: ");scanf_s("%d", &mode);//输入功能选择序号1,2,3,4,5,6,7,8system("cls");//每次选择功能后,刷新菜单It = GetCurTime();//无论选择哪项,将会一直显示当前时间printf("\t\t当前时间:%d-%d-%d %02d:%02d:%02d %s\r\n\r\n", It.wYear, It.wMonth, It.wDay, It.wHour, It.wMinute, It.wSecond, Week[It.wDayOfWeek]);//万年历功能响应模板switch (mode) {case 1:printf("农历查询:\n\n");printf("请输入要查询的公历日期(输入格式为:年 月 日):Year Month Day>");while (1){scanf_s("%d %d %d", &year, &month, &day);//输入年,月,日if (year <= start_year || year > end_year || month < 1 || month>12 || day < 1 || day>31){error_times++;printf("您输入的日期有误,请重新输入(错误%d 次/5 次): Year Month Day>", error_times);if (error_times >= 5){printf("\r\n错误次数已达上限,请按任意键退出程序。");system("pause>nul");//系统退出按键映射return 1;}}else{dMn = GetDaysOfMonth(year, month, false, false);if (day > dMn){error_times++;printf("当前月份只有%d 天。请重新输入(错误%d 次/5 次):Year Month Day>", dMn, error_times);if (error_times >= 5){printf("\r\n错误次数已达上限,请按任意键退出程序。");system("pause>nul");return 1;}}else{break;}}LONGTIME It;double SoTer1, SoTer2;//24节气临时变量int index_Solterms = 0;//24节气序号int dM0 = CriterionDay(year, month, 1);int row = 0, line = 0;//行,列row = year - start_year;for (index_Solterms = (month - 1) * 2; index_Solterms < 24; index_Solterms++){SoTer1 = SolTerms[row * 24 + index_Solterms];SoTer2 = SolTerms[row * 24 + index_Solterms + 1];if (int2(SoTer1 + 0.5) <= (dM0 + 14) && int2(SoTer2 + 0.5) > (dM0 + 14)){break;}}//显示当月节气It = GetDate(SoTer1);hOut = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);//更改文字颜色,为蓝色printf("\n\t%s: %d-%d-%d %02d:%02d:%02d  ", Solterms[(index_Solterms) % 24], It.wYear, It.wMonth, It.wDay, It.wHour, It.wMinute, It.wSecond);It = GetDate(SoTer2);//显示下一个节气,并计算输出当月节气于下一个节气之间的时间差printf("%s: %d-%d-%d %02d:%02d:%02d\r\n\r\n", Solterms[(index_Solterms + 1) % 24], It.wYear, It.wMonth, It.wDay, It.wHour,It.wMinute, It.wSecond);SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);}ShowCalendar(year, month, day);DateRefer(year, month, day, false);break;case 2:printf("公历查询: \r\n\r\n");printf("请输入农历日期(如1949年十月一日则输入: 1949 10 1,)(范围:1840~2110)\nYear Month Day>");while (1){scanf_s("%d %d %d", &year, &month, &day);if (year <= start_year || year > end_year || month < 1 || month>12 || day < 1 || day>30){error_times++;//错误次数累计printf("您输入的日期有误,请重新输入(错误%d 次/5 次):Year Month Day>", error_times);if (error_times >= 5){printf("\r\n错误次数已达上限,请按任意键退出程序。");system("pause>nul");return 1;}}else{lunar_date.iYear = year;lunar_date.wMonth = month;lunar_date.wDay = day;lunar_date.blsLeap = false;if (GetGre(lunar_date) != 0){error_times++;//错误计数大于等于5次,显示警告信息if (error_times >= 5){printf("\r\n错误次数已达上限,请按任意键退出程序。");system("pause>nul");return 1;}}else{break;}}}printf("\r\n");break;case 3:printf("月历显示:\r\n\r\n");printf("请输入要查询的公历年月(1840~2110):Year Month Day>");while (1){scanf_s("%d %d %d", &year, &month, &day);if (year <= start_year || year > end_year || month < 1 || month>12){error_times++;printf("您输入的年月有误,请重新输入(错误%d 次/5 次)。Year Month", error_times);if (error_times >= 5){printf("\r\n错误次数已达上限,请按任意键退出程序。");system("pause>nul");return 1;}}else{break;}}ShowCalendar(year, month, day);//打印当月月历break;case 4:printf("查询某天距今天的天数:\r\n\r\n");printf("请输入日期:Year Month Day>");while (1){scanf_s("%d %d %d", &year, &month, &day);if (year <= start_year || year > end_year || month > 12 || month < 1 || day > 31 || day < 1){error_times++;printf("您输入的日期有误,请重新输入(错误%d 次/5 次):Year Month Day>", error_times);if (error_times >= 5){printf("\r\n错误次数已达上限,请按任意键退出程序。");system("pause>nul");return 1;}}else{dMn = GetDaysOfMonth(year, month, false, false);//获取当月实际天数if (day > dMn){error_times++;printf("当前月份只有%d 天。请重新输入(错误%d 次/5 次):Year Month Day>", dMn, error_times);if (error_times >= 5){printf("\r\n错误次数已达上限,请按任意键退出程序。");system("pause>nul");return 1;}}else{break;}}}dMn = CriterionDay(year, month, day);//获得当月实际天数It = GetCurTime();dMn = CriterionDay(It.wYear, It.wMonth, It.wDay);hOut = GetStdHandle(STD_OUTPUT_HANDLE);if (dMn >= 0){SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);printf("%d-%d-%d", year, month, day);SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf("比今天(");SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);printf("%d-%d-%d", It.wYear, It.wMonth, It.wDay);SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf(") 晚【");SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE |FOREGROUND_RED);printf("%d", dMn);SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf("】天\r\n\n\n\n");}else{SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);printf("%d-%d-%d", year, month, day);SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf("比今天(");SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);printf("%d-%d-%d", It.wYear, It.wMonth, It.wDay);SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf(") 早【");SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE |FOREGROUND_RED);printf("%d", dMn);SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf("】天\r\n\n\n\n");}break;case 5:LONGTIME It, It2, It3;It = GetCurTime();dMn = CriterionDay(It.wYear, It.wMonth, It.wDay);hOut = GetStdHandle(STD_OUTPUT_HANDLE);printf("查询距今天相应天数的日期(请输入距今天(%d-%d-%d)的天数 范围%d~%d): ", It.wYear, It.wMonth, It.wDay, -dMn - 2451545, 6574364 - dMn);while (1){scanf_s("%d", &days);//如果输入天数超出给定范围,会记一次错误次数。错误次数累计到5次,将退出程序。if (days > (6574364 - dMn) || days < (-dMn - 2451545)){if (error_times >= 5){printf("\r\n错误次数已达上限,请按任意键退出程序。");system("pause>nul");return 1;}}else{break;}}It2 = GetDate((double)(dMn + days));It3 = GetDate((double)(dMn - days));printf("距离今天(%d-%d-%d)【 %d 】天的日期为: ", It.wYear, It.wMonth, It.wDay, days);SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);printf("\n%d-%d-%d %s", It2.wYear, It2.wMonth, It2.wDay, Week[It2.wDayOfWeek]);SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf(" 或者为: ");SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);printf("\n%d-%d-%d %s\r\n\n\n", It3.wYear, It3.wMonth, It3.wDay, Week[It3.wDayOfWeek]);SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);break;case 6:printf("查询任意两天之间的天数差: \r\n\r\n");printf("请输入第一个日期: Year Month Day>");while (1){scanf_s("%d %d %d", &year, &month, &day);if (year <= start_year || year > end_year || month > 12 || month < 1 || day > 31 || day < 1){error_times++;printf("您输入的日期有误,请重新输入第一个日期(错误%d 次/5 次):Year Month Day>", error_times);if (error_times >= 5){printf("\r\n错误次数已达上限,请按任意键退出程序。");system("pause>nul");return 1;}}else{dMn = GetDaysOfMonth(year, month, false, false);//获取当月实际天数if (day > dMn){error_times++;printf("当前月份只有%d 天。请重新输入第一个日期(错误%d 次/5 次):Year Month Day>", dMn, error_times);if (error_times >= 5){printf("\r\n错误次数已达上限,请按任意键退出程序。");system("pause>nul");return 1;}}else{break;}}}It2.wYear = year;It2.wMonth = month;It2.wDay = day;printf("请输入第二个日期: Year Month Day>");while (1){scanf_s("%d %d %d", &year, &month, &day);if (year <= start_year || year > end_year || month > 12 || month < 1 || day > 31 || day < 1){error_times++;printf("您输入的日期有误,请重新输入第二个日期(错误%d 次/5 次):Year Month Day>", error_times);if (error_times >= 5){printf("\r\n错误次数已达上限,请按任意键退出程序。");system("pause>nul");return 1;}}else{dMn = GetDaysOfMonth(year, month, false, false);//获取当月实际天数if (day > dMn){error_times++;printf("当前月份只有%d 天。请重新输入第二个日期(错误%d 次/5 次):Year Month Day>", dMn, error_times);if (error_times >= 5){printf("\r\n错误次数已达上限,请按任意键退出程序。");system("pause>nul");return 1;}}else{break;}}}//计算两个日期之间的差值days = CriterionDay(It2.wYear, It2.wMonth, It2.wDay) - CriterionDay(year, month, day);hOut = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);printf("\n%d-%d-%d", It2.wYear, It2.wMonth, It2.wDay);SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf("与");SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);printf("%d-%d-%d", year, month, day);SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf("相差【");SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);printf("%d", abs(days));SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf("】天。\r\n");break;case 7:printf("显示二十四节气:\r\n\r\n");printf("请输入要查询的年份(1840~2110): ");while (1){scanf_s("%d", &year);if (year <= start_year || year > end_year){error_times++;printf("您输入的年份有误,请重新输入(错误%d 次/5 次): Year>", error_times);if (error_times >= 5){printf("\r\n错误次数已达上限,请按任意键退出程序。");system("pause>nul");return 1;}}else{break;}}ShowSolarTerms(year);break;case 8:printf("\t\t\t       显示节日\r\n\r\n");printf("\t\t=============================================================\n");printf("\n\t\t1、显示公历节日\t\t2、显示农历节日\n");printf("\n\t\t请选择: ");int choice = 0;scanf_s("%d", &choice);system("cls");switch (choice){case 1:printf("\n\t\t\t\t 公里节日查询\n\n");printf("\t\t==============================================================\n");printf("\n");printf("\t\t 请输入要查询的月份: ");while (1){int month = 0;scanf_s("%d", &month);if (month < 0 || month>13){printf("\t\t输入错误,请输入正确年份(1~12):");}else{hOut = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE |FOREGROUND_RED);printf("\n\t\t\t\t%d月份的节日\n", month);SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);Holiday(month);break;}}break;case 2:printf("\n\t\t\t\t 农历节日查询\n\n");printf("\t\t==============================================================\n");printf("\n");hOut = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(hOut, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);printf("\n\t\t农历正月初一    春节(the Spring Festival)\n");printf("\n\t\t农历正月十五    元宵节(Lantern Festival)\n");printf("\n\t\t农历五月初五    端午节(the Dragon-Boat Festival)\n");printf("\n\t\t农历七月初七    七夕节(情人节)(Double-Seventh Day)\n");printf("\n\t\t农历八月十五    中秋节(the Mid-Autum Festival)\n");printf("\n\t\t农历九月初九    重阳节(the Double Ninth Festival)\n)");printf("\n\t\t农历腊月初八    腊八节(the laba Rice Porridge Festival)\n");printf("\n\t\t农历腊月二十四  传统扫房日(the Traditional House Cleaning Day)\n\n");SetConsoleTextAttribute(hOut, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);break;default:error_times++;printf("您输入的有误,请重新输入(错误%d 次/5 次)。\r\n\r\n", error_times);if (error_times >= 5){printf("\r\n错误次数已达上限,请按任意键退出程序。");system("pause>nul");return 1;}break;}break;}printf("请按任意键放回主菜单。");system("pause>nul");system("cls");}return 0;
}/*打印一个月的月历*/
void ShowCalendar(int year, int month, int day)
{int dM0 = CriterionDay(year, month, 1);//公历月首天数int CriDay_day = dM0;//用来查询公历月首所在农历月份int base_days = 0;base_days = CriterionDay(year, month, 1);int dw0 = (dM0 + 142113) % 7;//月首星期int idw = dw0;//用于标记星期,用于第一行填充int dMn = GetDaysOfMonth(year, month, false, false);//获取本月总天数int row = 0, line = 0;int Lyear = 0, Lmonth = 0, Lday = 0;int GreCaday = 1, LunCaday = 1;int lunar_ndays = 0;const char *leap="";const char *MaxMini="";//大月或小月int dM0_lunar = 0, dM_lunar = 0;int cal_item = 0;bool isfirstline = true;bool fillBlanks = true;bool isLunarCal = false;double Solterms1, Solterms2;int Lmonth_index = 0;int index_Solterms = 0;/*LONGTIME It;*/row = year - start_year;//当前年份所处数据表中的行号,从开始年起算line = month - 1;//考虑到查询的范围,所以月份-1为初始查询序号,农历月号与公历月号最多相差2//查询公历月首所在农历月for (line; line < 15; line++){if ((MonHead[row * 15 + line - 1] <= dM0) && (MonHead[row * 15 + line] > dM0)){break;}}line--;//查找,计算公历月序表内闰月if (MonOrder[row * 14 + line - 1] == MonOrder[row * 14 + line]){leap="闰";}//查找当前月份大,小月lunar_ndays = MonHead[row * 15 + line + 1] - MonHead[row * 15 + line];if (lunar_ndays == 31){MaxMini = "大";}else if(lunar_ndays==30){MaxMini = "小";}//计算月历中第一天的农历日期Lyear = year;Lmonth_index = row * 14 + line;Lmonth = MonOrder[Lmonth_index] - 1;//农历月,从十一月开始(即冬至所在农历月为首)if (Lmonth < 1){Lmonth += 12;}if (Lmonth > 10 && ((row * 14 + line) % 14 < 2)){Lyear--;}Lday = dM0 - MonHead[row * 15 + line];//农历日则是距农历月首天数来计算//计算节气日期所在位置dM0_lunar = Lday;dM_lunar = dM0_lunar;for (index_Solterms = (month - 1) * 2; index_Solterms < 24; index_Solterms++){Solterms1 = SolTerms[row * 24 + index_Solterms];Solterms2 = SolTerms[row * 24 + index_Solterms + 1];if (int2(Solterms1 + 0.5) <= (dM0 + 14) && int2(Solterms2 + 0.5) > (dM0 + 14)){break;}}HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE |FOREGROUND_RED);printf("\r\n\t\t公历  %d年%d月  %s%s\r\n\r\n", year, month, Week[(base_days + 142113) % 7], leap);SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);printf("  周日\t");SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf("  周一\t  周二\t  周三\t  周四\t  周五\t");SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);printf("  周六\r\n");SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf("_________________________________________________________\r\n");for (cal_item = 0; cal_item < 7; cal_item++){if (!isLunarCal){if (fillBlanks){if (isfirstline&&dw0 != 0){printf("  \t  ");}if (dw0 == 0){printf("");cal_item = -1;}for (idw; idw > 1; idw--){printf("\t   ");cal_item++;}idw = dw0;fillBlanks = false;}else{if (cal_item == 0){printf("  ");}printf("%d\t   ", GreCaday);GreCaday++;if (cal_item == 5 || cal_item == 6){handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE |FOREGROUND_RED);}else{SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);}if (GreCaday > dMn){printf("\r\n");cal_item = -1;isLunarCal = true;}if (cal_item == 6){cal_item = -1;printf("\r\n");isLunarCal = true;if (isfirstline){fillBlanks = true;}}}}else{if (fillBlanks){if (isfirstline&&dw0 != 0){printf("  \t ");}if (dw0 == 0){printf("");cal_item = -1;}for (idw; idw > 2; idw--){printf("\t   ");cal_item++;}if (dw0 > 1){printf("\t ");cal_item++;}fillBlanks = false;}else{if (dM_lunar >= lunar_ndays){Lmonth_index++;Lmonth = MonOrder[Lmonth_index] - 1;if (Lmonth < 1){Lmonth += 12;}if (Lmonth > 10){year--;}lunar_ndays = MonHead[row * 15 + line + 2] - MonHead[row * 15 + line + 1];dM_lunar = 0;}if (cal_item == 0 || cal_item == 6){handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE |FOREGROUND_RED);}else{SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);}if (int2(Solterms1 + 0.5) == CriDay_day){if (cal_item == 0){printf(" ");}HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);printf("%s", Solterms[(index_Solterms) % 24]);SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);}else if (int2(Solterms2 + 0.5) == CriDay_day){if (cal_item == 0){printf(" ");}HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);printf("%s", Solterms[(index_Solterms)+1 % 24]);SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);}else{if (dM_lunar == 0){if (MonOrder[Lmonth_index] == MonOrder[Lmonth_index - 1]){printf("闰");}else{if (cal_item == 0){printf(" ");}}printf("%s", mName[Lmonth - 1]);if (lunar_ndays == 30){printf("大");}else{printf("小");}}else{if (cal_item == 0){printf(" ");}printf("%s", dName[dM_lunar]);}}CriDay_day++;dM_lunar++;LunCaday++;if (dM_lunar == lunar_ndays){if (MonOrder[Lmonth_index + 1] == MonOrder[Lmonth_index]){printf(" ");}else{printf("\t");}}else{if (MonOrder[Lmonth_index - 1] == MonOrder[Lmonth_index]){if (dM0_lunar == 0){printf(" ");}else{printf("\t ");}}else{printf("\t ");}}if (LunCaday > dMn){break;}if (cal_item == 6){cal_item = -1;printf("\r\n\r\n");isLunarCal = false;if (isfirstline){isfirstline = false;}if (LunCaday > dMn){break;}}}}}printf("\r\n_________________________________________________________\r\n");
}int GetDaysOfMonth(int year, int month, bool mode, bool bLeap)
{int dM0 = 0, dMn = 0;if (!mode){dM0 = CriterionDay(year, month, 1);				//月首天数if (month == 12){dMn = CriterionDay(++year, 1, 1) - dM0;			//元旦}else{dMn = CriterionDay(year, ++month, 1) - dM0;		//下个月}}else{int leap_Month = -1;						//农历闰月所在位置int row = year - start_year;				//所在行int i = 0;int line = month + 1;for (i = 0; i < 14; i++){if (MonOrder[row * 14 + i + 1] == MonOrder[row * 14 + i]){leap_Month = i - 1;break;}}if (leap_Month == -1){if (bLeap){return -1;					//如果当前年份无闰月,而输入有闰月,则返回-1,以代表输入错误}}else{if (bLeap){if (leap_Month != month){return -1;			//当前年份有闰月,但并非当前输入月份}}}if (leap_Month != -1){if (month > leap_Month)		//在当年闰月以及之后{line++;}else{if (bLeap == true && month == leap_Month){line++;}}}dMn = MonHead[row * 15 + line + 1] - MonHead[row * 15 + line];}return dMn;//返回当前公历月份的天数
}/*查询某天农历和节气*/
void DateRefer(int year, int month, int day, bool SST)
{int Lyear = 0, Lmonth = 0, Lday = 0;int base_days = 0;			//基准日int row = 0, line = 0;			//行与列int i = 0, SoTer = 0, SoTer1 = 0;		//节气const char *leap="";				//闰月const char *MaxMini="";			//大月或小月Lyear = year;base_days = CriterionDay(year, month, day);row = year - start_year;line = month - 1;for (line; line < 15; line++){if ((MonHead[row * 15 + line - 1] <= base_days) && (MonHead[row * 15 + line] > base_days)){break;}}line--;//减掉多加的1if (MonOrder[row * 14 + line - 1] == MonOrder[row * 14 + line]){leap = "闰";}if ((MonHead[row * 15 + line + 1] - MonHead[row * 15 + line]) == 31){MaxMini = "大";}else{MaxMini = "小";}Lmonth = MonOrder[row * 14 + line] - 1;if (Lmonth < 1){Lmonth += 12;}if (Lmonth > 10 && ((row * 14 + line) % 14 < 2)){Lyear--;//对于十一月和十二月的,年份应为上一年的}Lday = base_days - MonHead[row * 15 + line];//从初一开始if (SST)        //SST为true时,显示农历不显示节气{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);				//获取控制台句柄SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE | FOREGROUND_RED);   	//更改文字颜色,为粉色printf("%s%s年 %s%s(%s)%s", HeavenlySte[(Lyear - 1984 + 9000) % 10],EarthlyBran[(Lyear - 1984 + 9000) % 12], leap, mName[Lmonth - 1], MaxMini, dName[Lday]);SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);}else{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);				//获取控制台句柄SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE | FOREGROUND_RED);   	//更改文字颜色,为粉色printf("\n\t\t农历  %s%s[%s]年 %s%s(%s)%s\t\n", HeavenlySte[(Lyear - 1984 + 9000) % 10],EarthlyBran[(Lyear - 1984 + 9000) % 12], ChineseZod[(Lyear - 1984 + 9000) % 12],leap, mName[Lmonth - 1], MaxMini, dName[Lday]);SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);for (i = (month - 1) * 2; i < 48; i++){SoTer = int2(SolTerms[row * 24 + i] + 0.5);SoTer1 = int2(SolTerms[row * 24 + i + 1] + 0.5);if (SoTer1 > base_days&&SoTer <= base_days){if (SoTer == base_days){LONGTIME lt = GetDate(SolTerms[row * 24 + i]);printf("\n\t今日节气:");HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);				//获取控制台句柄SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);   	//更改文字颜色,为红色printf("%s", Solterms[i % 24]);SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf(" 交节时间:");SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);   	//更改文字颜色,为红色printf("%d-%d-%d %02d:%02d:%02d\r\n\r\n", lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond);SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);}else{printf("\n\t距离下一个节气『");HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);				//获取控制台句柄SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);   	//更改文字颜色,为红色printf("%s", Solterms[(i + 1) % 24]);SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf("』还有");SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);   	//更改文字颜色,为红色printf("%d", SoTer1 - base_days);SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf("天\n");}break;}}}
}
/*基准天数计算*/
int CriterionDay(int year,int month,int day)
{int basedays = 0;int x = 0, y = 0;if (month <= 2 && month > 0){year--;month += 12;}x = (int)(year / 100);y = 0;if (year == 1582){if (month == 10){if (day >= 15){y = 2 - x + (int)(x / 4);}}else if (month > 10){y = 2 - x + (int)(x / 4);}}else if (year > 1582){y = 2 - x + (int)(x / 4);}basedays = (int)(365.25*(year + 16)) + 36525 * 47 + (int)(30.6001*(month + 1)) + day + y - 2453069;return basedays;
}/*获得小于等于该数的整数*/
int int2(double v)
{int a = (int)v;if (v < 0){double rm = GetDecimal(v);if (rm != 0){a--;}}return a;
}/*获取小数部分,对负数取负部分*/
double GetDecimal(double n)
{n -= (int)n;return n;
}/*将小数日转公历*/
LONGTIME GetDate(double n)
{LONGTIME lt;double A, F, D;int x = 0;n += 0.5;x += 2;x *= 10;x += 4;x *= 10;x += 5;x *= 10;x += 1;lt.wYear = 0;lt.wMonth = 0;lt.wDay = 0;lt.wHour = 0;lt.wMinute = 0;lt.wSecond = 0;lt.wMillisecond = 0;x *= 10;x += 5;x *= 10;x += 4;x *= 10;x += 5;n += x;lt.wDayOfWeek = ((int2)(n + 1)) % 7;A = (int)n;F = n - A;if (A >= 2299161){D = (int)((A - 1867216.25) / 36524.25);A += 1 + D - (int)(D / 4);}A += 1524;lt.wYear = (int)((double)(A - 122.1) / 365.25);D = A - (int)(365.25*lt.wYear);lt.wMonth = (int)(D / 30.6001);lt.wDay = (int)(D - (int)(lt.wMonth*30.6001));lt.wYear -= 4716;lt.wMonth--;if (lt.wMonth > 12){lt.wMonth -= 12;}if (lt.wMonth <= 2){lt.wYear++;}F *= 24;lt.wHour = (int)F;F -= lt.wHour;F *= 60;lt.wMinute = (int)F;F -= lt.wMinute;F *= 60;lt.wSecond = (int)F;F -= lt.wSecond;F *= 1000;lt.wMillisecond = (int)F;return lt;
}/*农历查公历*/
int GetGre(LUNARDATE LunarDate)
{int row = LunarDate.iYear - start_year;int line = LunarDate.wMonth + 1;int leap_month = -1;int i = 0;double ndays = 0.0;int ileapMonth = 0;int dMn = 0;LONGTIME lt;for (i = 0; i < 14; i++){if (MonOrder[row * 14 + i + 1] == MonOrder[row * 14 + i]){leap_month = i - 1;//农历闰月if (leap_month <= 0){leap_month += 12;}break;}}if (leap_month == LunarDate.wMonth){printf("当前月份是否为闰月?(是闰月则输入“Y”,否则输入“N”)>");ileapMonth = _getche();if (ileapMonth == 89 || ileapMonth == 121){LunarDate.blsLeap = true;}else if (ileapMonth == 78 || ileapMonth == 110){LunarDate.blsLeap = false;}printf("\r\n");}dMn = GetDaysOfMonth(LunarDate.iYear, LunarDate.wMonth, true, LunarDate.blsLeap);if (dMn == -1){printf("当前农历闰月信息有误,请重新输入:Year Month Day>");return 2;//返回错误}else{if (dMn < LunarDate.wDay){if (LunarDate.blsLeap){printf("%d年闰%s只有 %d 天,请重新输入:Year Month Day>", LunarDate.iYear, mName[LunarDate.wMonth - 1], dMn);}else{printf("%d年%s只有 %d 天,请重新输入:Year Month Day>", LunarDate.iYear, mName[LunarDate.wMonth - 1], dMn);}return 1;}}if (leap_month != -1){//定位当前列if (LunarDate.wMonth > leap_month){line++;}else{if (LunarDate.wMonth == leap_month && LunarDate.blsLeap == true){line++;}}}ndays = MonHead[row * 15 + line];ndays += LunarDate.wDay;ndays--;lt = GetDate(ndays);HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);				//获取控制台句柄SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);   	//更改文字颜色,为红色printf("\r\n%d (%s%s)年 [%s] ", LunarDate.iYear, HeavenlySte[(LunarDate.iYear - 1984 + 9000) % 10], EarthlyBran[(LunarDate.iYear - 1984 + 9000) % 12], ChineseZod[(LunarDate.iYear - 1984 + 9000) % 12]);if (LunarDate.blsLeap){printf("闰");}printf("%s%s ", mName[LunarDate.wMonth - 1], dName[LunarDate.wDay - 1]);SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);		//恢复颜色printf("的公历日期为:");SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);printf("%d年%d月%d日 %s\r\n", lt.wYear, lt.wMonth, lt.wDay, Week[lt.wDayOfWeek]);SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);		return 0;
}/*获得当前日期*/
LONGTIME GetCurTime()
{SYSTEMTIME st;LONGTIME lt;GetSystemTime(&st);lt = SysTimeToLong(st);lt = GMTConvert(lt);return lt;
}/*时间结构体转换*/
LONGTIME SysTimeToLong(SYSTEMTIME SystemTime)
{LONGTIME LongTime;LongTime.wYear = (long int)SystemTime.wYear;LongTime.wMonth = SystemTime.wMonth;LongTime.wDay = SystemTime.wDay;LongTime.wHour = SystemTime.wHour;LongTime.wMinute = SystemTime.wMinute;LongTime.wSecond = SystemTime.wSecond;LongTime.wMillisecond = SystemTime.wMilliseconds;LongTime.wDayOfWeek = SystemTime.wDayOfWeek;return LongTime;
}/*时区转换*/
LONGTIME GMTConvert(LONGTIME OrigTime)
{//从零时区转换到系统当前时区int m_hour = 0, m_day = 0, m_month = 0, m_year = 0, m_minute = 0, m_second = 0, zone = 0;TIME_ZONE_INFORMATION stTimeZone;ZeroMemory(&stTimeZone, sizeof(TIME_ZONE_INFORMATION));GetTimeZoneInformation(&stTimeZone);//获取当前时区zone = 0 - stTimeZone.Bias / 60;m_year = OrigTime.wYear;m_month = OrigTime.wMonth;m_day = OrigTime.wDay;m_hour = OrigTime.wHour;m_minute = OrigTime.wMinute;m_second = OrigTime.wSecond;if (m_hour >= 24 - zone){//需要加一天m_hour = m_hour - 24 + zone;if (OrigTime.wDayOfWeek < 7){OrigTime.wDayOfWeek++;}else{OrigTime.wDayOfWeek = OrigTime.wDayOfWeek - 6;}/*平年,闰年判断条件*/if (IsLeapYear(m_year)){if (m_month == 2)//2月为29天{if (m_day == 29){m_month++;m_day = 1;}else{m_day++;//条件内,如果小于29天,+1}}else if (m_month == 1 || m_month == 3 || m_month == 5 || m_month == 7 || m_month == 8 || m_month == 10)//一年当中1,3,5,7,8,10月为31天。{if (m_day == 31){m_month++;m_day = 1;}else{m_day++;//条件内,如果小于31天,+1}}else if (m_month == 4 || m_month == 6 || m_month == 9 || m_month == 11)//一年当中4,6,9,11月为30天。{if (m_day == 30){m_month++;m_day = 1;}else{m_day++;}}else if (m_month == 12)//12月为31天。{if (m_day == 31){m_month = 1;m_day = 1;m_year++;}else{m_day++;}}}else{if (m_month == 2){if (m_day == 28){m_month++;m_day = 1;}else{m_day++;}}else if (m_month == 1 || m_month == 3 || m_month == 5 || m_month == 7 || m_month == 8 || m_month == 10){if (m_day == 31){m_month++;m_day = 1;}else{m_day++;}}else if (m_month == 4 || m_month == 6 || m_month == 9 || m_month == 11){if (m_day == 30){m_month++;m_day = 1;}else{m_day++;}}else if (m_month == 12){if (m_day == 31){m_month = 1;m_day = 1;m_year++;}else{m_day++;}}}}else{m_hour = m_hour + zone;}OrigTime.wYear = m_year;OrigTime.wMonth = m_month;OrigTime.wDay = m_day;OrigTime.wHour = m_hour;OrigTime.wMinute = m_minute;OrigTime.wSecond = m_second;return OrigTime;
}/*判断所传入的年份是否为闰年*/
bool IsLeapYear(int nYear)
{if (nYear > 1582){if (nYear % 4 == 0 && nYear % 100 != 0 || nYear % 400 == 0)//能被4整除,不能被100整除,或可以被400整除的为闰年。{return true;}else{return false;}return true;}else if (nYear > -4713){if (nYear % 4 == 0){return true;}else{return false;}return true;}return false;
}/*显示二十四节气*/
void ShowSolarTerms(int year)
{int row = year - start_year;int line = 3;//从立春开始算。LONGTIME lt;printf("\r\n  节气名称\t交节日期\t交节时间\t  农历\t\t星期\r\n");printf("----------------------------------------------------------------------\r\n");for (line; line < 27; line++)//因为lie初始为3,则算24个节气后,为26,因此小于27{lt = GetDate(SolTerms[row * 24 + line]);printf("  %02d. ", line - 2);HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);				//获取控制台句柄SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);   	//更改文字颜色,为红色printf("%s", Solterms[line % 24]);SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);printf("  \t%d-%d-%d\t%02d:%02d:%02d  ", lt.wYear, lt.wMonth, lt.wDay, lt.wHour, lt.wMinute, lt.wSecond);DateRefer(lt.wYear, lt.wMonth, lt.wDay, true);if (line == 26){printf("  %s\r\n", Week[lt.wDayOfWeek]);}else{printf("  %s\r\n\r\n", Week[lt.wDayOfWeek]);}}printf("----------------------------------------------------------------------\r\n");
}/*获得公历节日*/
void Holiday(int month)
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);				//获取控制台句柄switch (month){case 1:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);	//蓝字printf("\n\t\t 1月1日元旦(New Year's Day)\n");printf("\t\t 1月最后一个星期日国际麻风节(International Lepresi Day)\n\n");SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);		//恢复文字颜色break;case 2:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);	//蓝字printf("\n\t\t 2月2日  世界湿地日(World Wetlands Day)\n");printf("\t\t 2月14日 情人节(Valentine's Day)\n\n");SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);		break;case 3:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);	//蓝字printf("\n\t\t 3月3日  全国爱耳日(Ear Car Day)\n");printf("\t\t 3月5日  青年志愿者服务日(Youth Volunter Service Day)\n");printf("\t\t 3月8日  国际妇女节(International Women' Day)\n");printf("\t\t 3月9日  保护母亲河日(Protect Mother River Day)\n");printf("\t\t 3月12日 中国植树节(China Arbor Day)\n");printf("\t\t 3月14日 白色情人节(White Valentine's Day)\n");printf("\t\t 3月14日 国际警察日(International Policemen' Day)\n");printf("\t\t 3月15日 世界消费者权益日(World Consumer Right Day)\n");printf("\t\t 3月21日 世界森林日(World Forest Day)\n");printf("\t\t 3月21日 世界睡眠日(World Sleep Day)\n");printf("\t\t 3月22日 世界水日(World Water Day)\n");printf("\t\t 3月23日 世界气象日(World Meteorological Day)\n");printf("\t\t 3月24日 世界防治结核病日(World Tuberculosis Day)\n");printf("\t\t 3月最后一个完整周的星期一中小学生安全教育日\n\n");SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);		break;case 4:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);	//蓝字printf("\n\t\t 4月1日  愚人节(April Fools' Day)\n");printf("\t\t 4月5日  清明节(Tomb-sweeping Day)\n");printf("\t\t 4月7日  世界卫生日(World Health Day)\n");printf("\t\t 4月22日 世界地球日(World Earth Day)\n");printf("\t\t 4月26日 世界知识产权日(World Intellectual PropertyDay)\n\n");SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);		break;case 5:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);	//蓝字printf("\n\t\t 5月1日  国际劳动节(International Labour Day)\n");printf("\t\t 5月3日  世界哮喘日(World Asthma Day)\n");printf("\t\t 5月4日  中国青年节(Chinese Youth Day)\n");printf("\t\t 5月8日  世界红十字日(World Red-Cross Day)\n");printf("\t\t 5月12日 国际护士节(International Nurse Day)\n");printf("\t\t 5月15日 国际家庭日(International Family Day)\n");printf("\t\t 5月17日 世界电信日(World Telecommunications Day)\n");printf("\t\t 5月20日 全国学生营养日(National Student Nutrition Day)\n");printf("\t\t 5月23日 国际牛奶日(International Milk Day)\n");printf("\t\t 5月31日 世界无烟日(World No-Smoking Day)\n");printf("\t\t 5月第二个星期日母亲节(Mother's Day)\n");printf("\t\t 5月第三个星期日全国助残日(National Disabled Day)\n\n");SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);		break;case 6:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);	//蓝字printf("\n\t\t 6月1日  国际儿童节(International Children's Day)\n");printf("\t\t 6月5日  世界环境日(International Environment Day)\n");printf("\t\t 6月6日  全国爱眼日(National Eye Day)\n");printf("\t\t 6月17日 世界防治荒漠化和干旱日(World Day to combat desertification)\n");printf("\t\t 6月23日 国际奥林匹克日(International Olympic Day)\n");printf("\t\t 6月25日 全国土地日(National Land Day)\n");printf("\t\t 6月26日 国际禁毒日(International Day Against Drug Abuse and Illicit Trafficking)\n");printf("\t\t 6月第三个星期日父亲节(Father's Day)\n\n");SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);		break;case 7:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);	//蓝字printf("\n\t\t 7月1日  中国共产党诞生日(Anniversary of the Founding of the Chinese Communist Party)\n");printf("\t\t 7月1日  国际建筑日(International Architecture Day)\n");printf("\t\t 7月7日  中国人民抗日战争纪念日(Chinese People Sino-Japanese War Commemoration Day)\n");printf("\t\t 7月11日 世界人口日(World Population Day)\n\n");SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);		break;case 8:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);	//蓝字printf("\n\t\t 8月1日  中国人民解放军建军节(Army Day)\n");printf("\t\t 8月12日 国际青年节(International Youth Day)\n\n");SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);		break;case 9:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);	//蓝字printf("\n\t\t 9月8日  国际扫盲日(International Anti-illiteracy Day)\n");printf("\t\t 9月10日 中国教师节(Teacher's Day)\n");printf("\t\t 9月16日 中国脑健康日(Brain Health Day)\n");printf("\t\t 9月16日 国际臭氧层保护日(International Day for the Preservation of the Ozone Layer)\n");printf("\t\t 9月20日 全国爱牙日(Love Toth Day)\n");printf("\t\t 9月21日 世界停火日(World Cease-fire Day)\n");printf("\t\t 9月27日 世界旅游日(World Tourism Day)\n");printf("\t\t 9月第三个星期二国际和平日(International Peace Day)\n");printf("\t\t 9月第三个星期六全国国防教育日(National Defense Education Day)\n");printf("\t\t 9月第四个星期日国际聋人节(International Day of the Deaf)\n\n");SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);		break;case 10:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);	//蓝字printf("\n10月1日  中华人民共和国国庆节(National Day)\n");printf("\t\t 10月1日  国际音乐日(International Music Day)\n");printf("\t\t 10月1日  国际老年人日(International Day of Older Persons)\n");printf("\t\t 10月4日  世界动物日(World Animal Day)\n");printf("\t\t 10月5日  世界教师日(World Teachers' Day)(联合国教科文组织确立)\n");printf("\t\t 10月8日  全国高血压日(Hypertension Day)\n");printf("\t\t 10月9日  世界邮政日(World Post Day)\n");printf("\t\t 10月10日 世界精神卫生日(World Mental Health Day)\n");printf("\t\t 10月14日 世界标准日(World Standards Day)\n");printf("\t\t 10月15日 国际盲人节(International Day of the Blind)\n");printf("\t\t 10月15日 世界农村妇女日(World Rural Women's Day)\n");printf("\t\t 10月16日 世界粮食日(World Food Day)\n");printf("\t\t 10月17日 国际消除贫困日(International Day for the Eradication of Poverty)\n");printf("\t\t 10月24日 联合国日(United Nations Day)\n");printf("\t\t 10月24日 世界发展新闻日(World Development Information Day)\n");printf("\t\t 10月28日 中国男性健康日(Chinese Men's Health Day)\n");printf("\t\t 10月29日 国际生物多样性日(International Biodiversity Day)\n");printf("\t\t 10月31日 万圣节(Halloween)\n");printf("\t\t 10月的第一个星期一世界住房日(World Habitat Day)\n");printf("\t\t 10月的第二个星斯一加拿大感恩节(Thanksgiving Day)\n");printf("\t\t 10月第二个星期三国际减轻自然灾害日(International Day for Natural Disaster Reduction)\n");printf("\t\t 10月第二个星期四世界爱眼日(World Sight Day)\n\n");SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);		break;case 11:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);	//蓝字printf("\n\t\t 11月8日  中国记者节(Chinese Journalist's Day)\n");printf("\t\t 11月9日  消防宣传日(Fire Protection Publicity Day)\n");printf("\t\t 11月14日 世界糖尿病日(World Diabetes Day)\n");printf("\t\t 11月17日 国际大学生节(International University Day)\n");printf("\t\t 11月25日 国际消除对妇女的暴力日(International Day For the elimination of Violence against Women)\n");printf("\t\t 11月最后一个星期四美国感恩节(Thanksgiving Day)\n\n");SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);		break;case 12:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);	//蓝字printf("\n\t\t 12月1日  世界爱滋病日(World AIDS Day)\n");printf("\t\t 12月3日  世界残疾人日(World Disabled Day)\n");printf("\t\t 12月4日  全国法制宣传日(National Legal Publicity Day)\n");printf("\t\t 12月9日  世界足球日(World Football Day)\n");printf("\t\t 12月25日 圣诞节(Christmas Day)\n");printf("\t\t 12月29日 国际生物多样性日(International Biological Diversity Day)\n\n");SetConsoleTextAttribute(handle, BACKGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);		break;}
}

提示:SetConsoleTextAttribute():用来设置控制台文本颜色和背景色的函数。
函数原型:BOOL SetConsoleTextAttribute(HANDLE,hConsoleOutput,WORD wAttribute);/*hConsoleOutput:控制台屏幕输出流句柄。文件流句柄需以(GENERIC_READ)颜色属性值为写入权限。WORD wAttribute:用来设置颜色*/

常用wAttribute色彩属性值表如下:

参数值含义
FOREGROUND_BLUE前景蓝色
FOREGROUND_GREEN前景绿色
FOREGROUND_RED前景红色
FOREGROUND_INTENSITY前景色彩高亮强度
BACKGROUND_BLUE背景蓝色
BACKGROUND_GREEN背景绿色
BACKGROUND_RED背景红色
BACKGROUND_INTENSITY背景色彩高亮强度

因篇幅过长系统提示“此文章阅读完大约需要2个多小时,请优化”。故"Calendar.h"头文件已上传为资源,具体注意事项将以注释的方式写入头文件。请自行查阅。
资源链接:https://download.csdn.net/download/qq_31293403/86507411


http://chatgpt.dhexx.cn/article/10urtdLL.shtml

相关文章

C语言万年历程序

刚复习了C语言&#xff0c;写一个万年历程序&#xff0c;比较初级&#xff0c;见笑了。 /*Name : calendar.cAuthor : 飞翔de猪油Version : v1.0Description : 万年历程序*/#include <stdio.h> #include <stdlib.h> #include <string.h> #in…

面向对象程序设计实训——万年历

设计内容&#xff1a; 1.运用程序设计基础基本知识&#xff0c;使用C、Java或Python等面向对象程序设计语言&#xff0c;按以下要求编程实现万年历的功能&#xff1a; (1)输入任一年&#xff0c;判断该年是否为闰年&#xff1b; (2)输入年月日计算该日为星期几&#xff0c;…

Qt项目简单贪吃蛇代码

目录 第一个界面 第二个界面 第一个界面 在.pro文件里添加sql QT core gui sql 点击.ui文件添加组件 类和对象如图所示&#xff0c;右键MianWindow->改变样式表&#xff0c;在编辑样式表里添加代码改变按钮样式 QPushButton{border:2px solid #7b7b7b; //按钮…

贪吃蛇php代码下载,C语言贪吃蛇代码

C语言编写贪吃蛇源代码&#xff0c;简单易懂&#xff0c;文件为VC源代码&#xff0c;附txt代码和源代码程序。 相关软件软件大小版本说明下载地址 c语言编写贪吃蛇源代码&#xff0c;简单易懂&#xff0c;文件为VC源代码。如果你正在学习c语言&#xff0c;就来下载吧。很经典的…

Html/Javascript snake game 贪吃蛇游戏(附全部代码)

以前用pyhton 做了贪吃蛇游戏&#xff0c; 这里发表的是html/javascript 版本。难度差不多&#xff0c; 区别是python 主要用class, 而javascript 主要用function &#xff0c; 他们的功能很相似&#xff0c; 写法稍微有些不同。内容大致是&#xff1a; 1. 蛇由蛇头&#xff0…

实验二.贪吃蛇的设计

目录 一.实验内容&#xff1a; 二.贪吃蛇的代码实现 &#xff08;1&#xff09;类的声明 &#xff08;2&#xff09;初始化界面 &#xff08;3&#xff09;游戏界面 &#xff08;4&#xff09;蛇的位置 &#xff08;5&#xff09;键盘监听 &#xff08;6&#xff09;更…

Python贪吃蛇 (完整代码+详细注释+粘贴即食)

文章目录 代码运行截图笔记补充参考博客&#xff08;阿里嘎多&#xff01;&#xff09; 代码 #!/usr/bin/env python # -*- coding: utf-8 -*- # author&#xff1a;Wangdali time:2021年1月20日16:08:44 #python实现&#xff1a;贪吃蛇游戏玩法&#xff1a;回车开始游戏&am…

k-means聚类算法及matlab实现(简单实现)

k-means简介 k-means算法也称k均值算法&#xff0c;是一种常用的聚类算法。聚类算法是研究最多、应用最广的一种无监督学习算法。   聚类试图将数据集中的样本划分为若干个通常是不相交的子集&#xff0c;每个子集称为一个“簇”。通过这样的划分&#xff0c;每个簇里的样本可…

matlab 层次聚类

MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法&#xff1a; 1.层次聚类 hierarchical clustering 2.k-means聚类 这里用最简单的实例说明以下层次聚类原理和应用发法。 层次聚类是基于距离的聚类方法&#xff0c;MATLAB中通过pdist、linkage、dendrogram、…

K-means聚类算法及其MATLAB实现

参考&#xff1a; http://www.csdn.net/article/2012-07-03/2807073-k-means http://www.cnblogs.com/zhzhang/p/5437778.html http://blog.csdn.net/qll125596718/article/details/8243404/ K-means属于无监督学习方法 K表示类别数&#xff0c;Means表示均值&#xff0c;K…

基于MATLAB的K-means聚类算法

实验数据说明 Iris也称鸢尾花卉数据集&#xff0c;是一类多重变量分析的数据集。通过花萼长度&#xff0c;花萼宽度&#xff0c;花瓣长度&#xff0c;花瓣宽度4个属性预测鸢尾花卉属于&#xff08;Setosa(山鸢尾)&#xff0c;Versicolour(杂色鸢尾)&#xff0c;Virginica(维吉尼…

k-means聚类算法(matlab实现)

k-means聚类算法 文章目录 k-means聚类算法前言一、k-means聚类算法简介二、k-means聚类算法步骤三、代码实现总结 前言 k-means聚类算法是硬聚类算法的一种&#xff0c;即在n纬欧几里得空间把n个样本数据分为k类。首先根据用户要确定聚类的数目k,随机性的选取k个样本&#xf…

Kmeans聚类算法——Matlab

聚类算法 原理步骤代码绘图选取四个迭代步骤进行可视化&#xff08;散点图&#xff0c;条形图&#xff09;聚类结果可视化&#xff08;散点图&#xff09; 原理 聚类算法的基本思想是&#xff1a;以空间中k个点为中心进行聚类&#xff0c;对距离他们最近的对象进行归类。通过迭…

matlab实现聚类算法

simulate2020625数据集 clear;clc load simulate2020625;kmax(subcluster(:,3));%设置聚类数目 data subcluster(:,1:2); cata subcluster; [m,n]size(data); c1subcluster(:,3); c1c1;%% 实际聚类图 figure(1); plot(cata(cata(:,3)1,1),cata(cata(:,3)1,2),r*) hold on pl…

K-means++聚类算法(matlab实现)

K-means聚类算法 文章目录 K-means聚类算法前言一、算法简介二、K-means算法步骤三、K-means算法matlab实现总结 前言 K-means算法&#xff1a;K-means算法是K-means算法的改进版&#xff0c;其在选择初始质心时采用了一种更加聪明的方法&#xff0c;能够有效地避免局部最优解…

MATLAB聚类分析(Cluster Analysis)

使用环境&#xff1a;MATLAB2016a、MATLAB2010a 聚类分析是一种无监督式学习&#xff0c;不像回归分析等需要Inputs 和 Targets &#xff0c;聚类分析是只通过提供一组数据实现分类的算法。下面给出本人在学习聚类分析的MATLAB程序 x15*[randn(500,1)5,randn(500,1)5]; x25*[…

matlab统计与机器学习工具箱中的7种聚类算法

1. matlab中自带聚类算法概述 本文简要概述了matlab统计和机器学习工具箱中可用的聚类方法&#xff0c;并给出了其聚类函数。在使用过程中&#xff0c;直接调用该函数即可&#xff0c;十分方便&#xff0c;不得不感慨matlab的强大。 聚类分析&#xff0c;又称分割分析或分类分…

K-mean(多维度)聚类算法(matlab代码)

申明: 仅个人小记。 Email: officeforcsdn163.com 目录 效果演示二维度三维度 k-mean 算法思想简要说明代码分析二维度k-mean代码三维度k-mean代码多维度k-mean代码功能使用示范后期函数接口改造 (借助matlab中cell结构实现)新的函数接口使用范例 小结 效果演示 二维度 (1) K…

k-Means——经典聚类算法实验(Matlab实现)

聚类算法—k-Means实验 k-平均&#xff08;k-Means&#xff09;&#xff0c;也被称为k-均值&#xff0c;是一种得到最广泛使用的聚类算法[1]. k-Means算法以k为参数&#xff0c;把n个对象分为k个簇&#xff0c;使得簇内具有较高的相似度。 实验目的 了解常用聚类算法及其优缺…

MATLAB K-means聚类的介绍与使用

K-means算法是硬聚类算法 &#xff0c;是典型的基于原型的目标函数 聚类方法的代表&#xff0c;它是数据点到原型的某种距离作为优化的目标函数&#xff0c;利用函数求极值的方法得到迭代运算的调整规则。K-means算法以偶是距离 作为相似度测度&#xff0c;它是求对应某一初…