UIT2024_Calendar/stu2024/数技2402张馨予.cpp
2024-12-07 16:23:34 +08:00

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");
}
}