124 lines
3.5 KiB
C
124 lines
3.5 KiB
C
#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;
|
||
}
|