203 lines
4.5 KiB
C++
203 lines
4.5 KiB
C++
#include <stdio.h>
|
|
#include <stdbool.h>
|
|
#include <process.h>
|
|
|
|
int yearstartday(int Year);
|
|
bool isLeapYear(int Year);
|
|
int monthDays(int Year, int Month);
|
|
int getWeekDay(int Year, int Month, int Day);
|
|
void outMonthDays(int Year, int Month);
|
|
void outMonthDays1582(int Year, int Month);
|
|
void menu();
|
|
void MenuChoice(int Choice);
|
|
void printYearCalendar(int Year);
|
|
|
|
const char* weekDays[] = {"日", "一", "二", "三", "四", "五", "六"};
|
|
|
|
int main() {
|
|
menu();
|
|
return 0;
|
|
}
|
|
|
|
int yearstartday(int Year) {
|
|
int detayear, corday, weekstartday, detaday;
|
|
detayear = Year - 2000;
|
|
if (detayear > 0) {
|
|
corday = 2;
|
|
detayear -= 1;
|
|
} else {
|
|
corday = 0;
|
|
if (detayear <= -418) {
|
|
corday = -3;
|
|
if (detayear <= -2000) {
|
|
corday = -1;
|
|
}
|
|
}
|
|
}
|
|
detaday = (detayear / 400) * 2 - detayear / 100 + detayear / 4 + detayear + corday;
|
|
weekstartday = (6 + detaday % 7) % 7;
|
|
return weekstartday;
|
|
}
|
|
|
|
bool isLeapYear(int Year) {
|
|
return (Year % 4 == 0 && Year % 100 != 0) || (Year % 400 == 0);
|
|
}
|
|
|
|
int monthDays(int Year, int Month) {
|
|
if (Month == 1 || Month == 3 || Month == 5 || Month == 7 || Month == 8 || Month == 10 || Month == 12) {
|
|
return 31;
|
|
} else if (Month == 4 || Month == 6 || Month == 9 || Month == 11) {
|
|
return 30;
|
|
} else {
|
|
return isLeapYear(Year) ? 29 : 28;
|
|
}
|
|
}
|
|
|
|
int getWeekDay(int Year, int Month, int Day) {
|
|
int i, temp, weekday, Days = 0;
|
|
for (i = 1; i <= Month - 1; i++) {
|
|
Days += monthDays(Year, i);
|
|
}
|
|
Days = Days + Day - 1;
|
|
temp = yearstartday(Year) + Days;
|
|
weekday = temp % 7;
|
|
if (Year == 1582 && Month > 10) {
|
|
weekday -= 3;
|
|
}
|
|
return weekday;
|
|
}
|
|
|
|
void outMonthDays(int Year, int Month) {
|
|
int i, j, weekday;
|
|
printf(" %d月日历\n", Month);
|
|
printf(" 日 一 二 三 四 五 六\n");
|
|
weekday = getWeekDay(Year, Month, 1);
|
|
for (i = 0; i < weekday; i++) {
|
|
printf(" ");
|
|
}
|
|
for (j = 1; j <= monthDays(Year, Month); j++) {
|
|
printf("%4d", j);
|
|
if ((j + weekday) % 7 == 0) {
|
|
printf("\n");
|
|
}
|
|
}
|
|
printf("\n");
|
|
printf("-------------------------------------\n");
|
|
}
|
|
|
|
void outMonthDays1582(int Year, int Month) {
|
|
int i, j, weekday;
|
|
printf(" %d月日历\n", Month);
|
|
printf(" 日 一 二 三 四 五 六\n");
|
|
weekday = getWeekDay(Year, Month, 1);
|
|
for (i = 0; i < weekday; i++) {
|
|
printf(" ");
|
|
}
|
|
for (j = 1; j <= monthDays(Year, Month); j++) {
|
|
if (Month == 10) {
|
|
if (j > 4 && j < 15) {
|
|
} else {
|
|
printf("%4d", j);
|
|
if (j == 16 || j == 23 || j == 30) {
|
|
printf("\n");
|
|
}
|
|
}
|
|
} else {
|
|
printf("%4d", j);
|
|
if ((j + weekday) % 7 == 0) {
|
|
printf("\n");
|
|
}
|
|
}
|
|
}
|
|
printf("\n");
|
|
printf("-------------------------------------\n");
|
|
}
|
|
|
|
void printYearCalendar(int Year) {
|
|
printf("Calendar for %d\n\n", Year);
|
|
for (int month = 1; month <= 12; month += 2) {
|
|
outMonthDays(Year, month);
|
|
printf("\n");
|
|
if (month + 1 <= 12) {
|
|
outMonthDays(Year, month + 1);
|
|
printf("\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
void menu() {
|
|
int choice;
|
|
while (1) {
|
|
printf("万年历\n1. 输入年月日输出星期几\n");
|
|
printf("2. 判断闰平年\n");
|
|
printf("3. 单列输出某年日历\n");
|
|
printf("4. 双列输出某年日历\n");
|
|
printf("5. 退出\n");
|
|
printf("请输入选择:");
|
|
scanf("%d", &choice);
|
|
MenuChoice(choice);
|
|
}
|
|
}
|
|
|
|
void MenuChoice(int Choice) {
|
|
int Year, Month, Day;
|
|
switch (Choice) {
|
|
case 1:
|
|
printf("请输入年 月 日:");
|
|
scanf("%d %d %d", &Year, &Month, &Day);
|
|
if (Year == 1582 && Month == 10 && Day > 4 && Day < 15) {
|
|
printf("1582年10月5日至10月14日不存在\n");
|
|
} else {
|
|
int weekday = getWeekDay(Year, Month, Day);
|
|
printf("%d年%d月%d日是星期%s\n", Year, Month, Day, weekDays[weekday]);
|
|
}
|
|
break;
|
|
case 2:
|
|
printf("请输入年份:");
|
|
scanf("%d", &Year);
|
|
if (isLeapYear(Year)) {
|
|
printf("%d年是闰年\n", Year);
|
|
} else {
|
|
printf("%d年是平年\n", Year);
|
|
}
|
|
break;
|
|
case 3:
|
|
printf("请输入年份:");
|
|
scanf("%d", &Year);
|
|
if (Year == 0) {
|
|
printf("输入错误,没有公元零年\n");
|
|
} else {
|
|
if (Year > 0) {
|
|
printf(" 公元%d年日历为:\n", Year);
|
|
} else {
|
|
printf(" 公元前%d年日历为:\n", -Year);
|
|
}
|
|
printf("=====================================\n");
|
|
if (Year != 1582) {
|
|
for (Month = 1; Month <= 12; Month++) {
|
|
outMonthDays(Year, Month);
|
|
}
|
|
} else {
|
|
for (Month = 1; Month <= 12; Month++) {
|
|
outMonthDays1582(Year, Month);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case 4:
|
|
printf("请输入年份:");
|
|
scanf("%d", &Year);
|
|
if (Year == 0) {
|
|
printf("输入错误,没有公元零年\n");
|
|
} else {
|
|
printYearCalendar(Year);
|
|
}
|
|
break;
|
|
case 5:
|
|
printf("退出程序\n");
|
|
exit(0);
|
|
default:
|
|
printf("无效的选择\n");
|
|
}
|
|
}
|