UIT2024_Calendar/stu2024/虚拟2401张博文.c
2024-12-07 16:23:34 +08:00

124 lines
3.5 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <stdio.h>
#include <stdlib.h>
// 判断是否为闰年
int isLeapYear(int year) {
return (year % 4 == 0 && year % 100!= 0) || (year % 400 == 0);
}
// 计算某月有多少天
int daysInMonth(int year, int month) {
int days[] = {31, 28 + isLeapYear(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
return days[month - 1];
}
// 计算1900年1月1日到给定日期的总天数
int totalDays(int year, int month, int day) {
int total = 0;
int y;
for (y = 1900; y < year; y++) {
total += 365 + isLeapYear(y);
}
int m;
for (m = 0; m < month; m++) {
total += daysInMonth(year, m);
}
total += day;
return total;
}
// 打印日历
void printCalendar(int year, int singleColumn) {
int startDay = (totalDays(year, 1, 1) + 1) % 7;
printf("Calendar - %d\n", year);
if (singleColumn) {
int month;
for ( month = 1; month <= 12; month++) {
int days = daysInMonth(year, month);
printf("\n\t%d月\n", month);
printf("\tMon\tTue\tWed\tThu\tFri\tSat\tSun\n");
int i;
for (i = 0; i < startDay; i++)
printf("\t");
int day;
for (day = 1; day <= days; day++) {
printf("\t%d", day);
if ((startDay + day) % 7 == 0)
printf("\n");
}
if ((startDay + days) % 7!= 0)
printf("\n");
startDay = (startDay + days) % 7;
}
} else {
printf("\tMon\tTue\tWed\tThu\tFri\tSat\tSun\t\tMon\tTue\tWed\tThu\tFri\tSat\tSun\n");
int month;
for (month = 1; month <= 12; month++) {
int days = daysInMonth(year, month);
int currentStartDay = (totalDays(year, month, 1) + 1) % 7;
int i;
for (i = 0; i < currentStartDay; i++)
printf("\t");
int day;
for (day = 1; day <= days; day++) {
printf("\t%d", day);
if ((currentStartDay + day) % 7 == 0)
printf("\t\t");
}
printf("\n");
}
}
}
// 查询某日期是周几
void queryDay() {
int year, month, day;
printf("请输入日期(年 月 日)");
scanf("%d %d %d", &year, &month, &day);
int total = totalDays(year, month, day);
int weekDay = (total - 1) % 7;
char *weekDays[] = {"Mon", "Tue", "Wed", "Thu", "Fri", "Sat","Sun"};
printf("%d年%d月%d日是 %s\n", year, month, day, weekDays[weekDay]);
printf("该年是 %s年\n", isLeapYear(year)? "" : "");
}
// 菜单
void menu() {
int choice;
int year;
int singleColumn = 1;
while (1) {
printf("\n1. 查询某日期是周几并判断是否为闰年\n");
printf("2. 打印某一年的日历(单列)\n");
printf("3. 打印某一年的日历(双列)\n");
printf("4. 退出\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
queryDay();
break;
case 2:
printf("请输入年份:");
scanf("%d", &year);
printCalendar(year, singleColumn);
break;
case 3:
singleColumn = 0;
printf("请输入年份:");
scanf("%d", &year);
printCalendar(year, singleColumn);
singleColumn = 1;
break;
case 4:
exit(0);
default:
printf("无效的选择,请重新选择\n");
}
}
}
int main() {
menu();
return 0;
}