UIT2024_Calendar/stu2024/软件2402田世涛.cpp
2024-12-07 16:23:34 +08:00

125 lines
3.5 KiB
C++

#include <stdio.h>
// 判断闰年
int isLeapYear(int year) {
return ((year % 4 == 0 && year % 100!= 0) || year % 400 == 0);
}
// 计算给定日期是周几(蔡氏公式)
int dayOfWeek(int year, int month, int day)
{
if (month < 3) {
year--;
month += 12;
}
int c = year / 100;
int y = year % 100;
int d = (day + (13 * (month + 1) / 5) + y + (y / 4) + (c / 4) + (5 * c)) % 7;
return d;
}
// 输出单列日历
void printSingleColumnCalendar(int year) {//printSingleColumnCalendar打印单个月日历空间
char *months[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};//储存一年每月的天数
if (isLeapYear(year)) {
daysInMonth[1] = 29;//特殊年份
}
for (int m = 0; m < 12; m++) {//输出一年的月份
printf("%s %d\n", months[m], year);
printf("Sun Mon Tue Wed Thu Fri Sat\n");
int weekDay = dayOfWeek(year, m + 1, 1);
for (int i = 0; i < weekDay; i++) {
printf(" ");
}
for (int d = 1; d <= daysInMonth[m]; d++) {
printf("%3d ", d);
if ((weekDay + d) % 7 == 0) {
printf("\n");
}
}
printf("\n\n");
}
}
// 输出双列日历
void printDoubleColumnCalendar(int year) {//printDoubleColumnCalendar打印并排月的日历
char *months[] = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};
int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(year)) {
daysInMonth[1] = 29;
}
for (int m = 0; m < 12; m++) {
printf("%s %d\t\t", months[m], year);
if (m % 2 == 0) {
printf("\n");
}
printf("Sun Mon Tue Wed Thu Fri Sat\t\tSun Mon Tue Wed Thu Fri Sat\n");
int weekDay = dayOfWeek(year, m + 1, 1);
for (int i = 0; i < weekDay; i++) {
printf(" ");
}
for (int d = 1; d <= daysInMonth[m]; d++) {
printf("%3d ", d);
if ((weekDay + d) % 7 == 0) {
printf("\n");
}
}
printf("\n\n");
}
}
// 菜单显示
void menu() {
int choice, year,a;
printf("1.输出对应年份全年的日历:\n");
printf("2.判断输入年份是否为闰年:\n");
printf("3.对应日期为周几:\n");
printf("4.退出:\n");
scanf("%d",&a);
if(a==1)
{
printf("1. 输出单列日历\n2. 输出双列日历\n3. 退出\n: ");
scanf("%d", &choice);
if (choice == 1 || choice == 2) {
printf("请输入年份: ");
scanf("%d", &year);
if (year < 1900 || year > 2100) {//报错范围
printf("年份超出范围,请重新输入\n");
menu();
return;
}
if (choice == 1) {
printSingleColumnCalendar(year);//选择单列
} else {
printDoubleColumnCalendar(year);//选择双列
}
} else if (choice == 3) {
return;
} else {
printf("无效选择,请重新选择\n");
menu();
}
}
else if(a==2)
{
printf("请输入年份:\n");
scanf("%d",&year);
if((year % 4 == 0 && year % 100!= 0) || year % 400 == 0)
printf("闰年");
else
printf("平年");
}
else if(a==3)
{
}
}
int main() {
menu();
return 0;
}