UIT2024_Calendar/stu2024/软件2401毕洺瑞.cpp
2024-12-07 16:23:34 +08:00

187 lines
5.2 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<bits/stdc++.h>
// 判断是否为闰年 (考虑1582年前后差异
int isLeapYear(int year) {
if (year >= 1582) {
if ((year%4 ==0 && year%100!=0) || year%400==0) {
return 1;
}
return 0;
} else {
if (year % 4 == 0) {
return 1;
}
return 0;
}
}
// 检查输入是否为数字
int isnumber(char input[]) {
int i = 0;
while (input[i]!= '\0') {
if (input[i] < '0' || input[i] > '9') {
return 0;
}
i++;
}
return 1;
}
// 检查日期是否有效
int Dateisture(int year, int month, int day) {
if (year == 1582 && month == 10 && (day > 4 && day <= 14)) {
return 0;
}
int daysInMonth[] = {0, 31, 28, 31, 32, 30, 31, 30, 31, 30, 31, 30, 31};
if (isLeapYear(year)) {
daysInMonth[2] = 29;
}
if(year>=1 && month>=1 && month<=12 && day>=1 && day<=daysInMonth[month]){
return 1;
}
return 0;
}
// 计算给定日期是星期几考虑1582年前后差异
int dayOfWeek(int year, int month, int day) {
if (year >= 1582) {
if (month < 3) {
year--;
month += 12;
}
int c = year / 100;
int y = year % 100;
int week = (c / 4 - 2 * c + y + y / 4 + 13 * (month + 1) / 5 + day - 1) % 7;
if (week < 0) {
week += 7;
}
return week;
} else {
int a = (14 - month) / 12;
int y = year - a;
int m = month + 12 * a - 2;
int week = (day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12) % 7;
return week;
}
}
// 输出(单列)
void Single(int year) {
int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(year)) {
daysInMonth[2] = 29;
}
printf("%d年的日历(单列):\n", year);
int dayOfWeekJan1 = dayOfWeek(year, 1, 1);
for (int month = 1; month <= 12; month++) {
printf("Mon Tue Wed Thu Fri Sat Sun\n");
for (int day = 1; day <= daysInMonth[month]; day++) {
printf("%3d ", day);
if ((dayOfWeekJan1 + day) % 7 == 0 && day!= daysInMonth[month]) {
printf("\n");
}
}printf("\n");
}
printf("\n");
}
// 输出(双列)
void Double(int year) {
int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if (isLeapYear(year)) {
daysInMonth[2] = 29;
}
printf("%d年的日历(双列):\n", year);
int dayOfWeekJan1 = dayOfWeek(year, 1, 1);
for (int month = 1; month <= 12; month++) {
printf("Mon Tue Wed Thu Fri Sat Sun \t Mon Tue Wed Thu Fri Sat Sun");
for (int day = 1; day <= daysInMonth[month]; day++) {
printf("%3d ", day);
if ((dayOfWeekJan1 + day) % 7 == 0 && day!= daysInMonth[month]) {
printf("\n");
}
}printf("\n");
}
printf("\n");
}
int main() {
char choice[10];
int zh;
do{
printf("1. 我想查询某年某月某日是星期几,该年是否为闰年\n");
printf("2. 我想查询某年的日历\n");
printf("3. 上个厕所\n");
printf("请选择: ");
scanf("%9s",choice);
if(!isnumber(choice)){
printf("输入错误,请重新输入\n");
continue;
}
zh=choice[0]-'0';
switch(zh){
case 1: char years[10], months[10], days[10];
int year, month, day;
while (1) {
printf("请输入年份: ");
scanf("%s", years);
if (!isnumber(years)) {
printf("错误,重新开始\n");
continue;
}
year = atoi(years);
printf("请输入月份: ");
scanf("%s", months);
if (!isnumber(months)) {
printf("请误,重新开始\n");
continue;
}
month = atoi(months);
printf("请输入日期: ");
scanf("%s", days);
if (!isnumber(days)) {
printf("请误,重新开始\n");
continue;
}
day = atoi(days);
if (!Dateisture(year, month, day)) {
printf("输入错误,请重新输入\n");
continue;
}
int weekDay = dayOfWeek(year, month, day);
char weekDayNames[][10] = {"周一", "周二", "周三", "周四", "周五", "周六", "周天"};
printf("%d-%02d-%02d是%s\n", year, month, day, weekDayNames[weekDay]);
if (isLeapYear(year)) {
printf("%d年是闰年\n", year);
} else {
printf("%d年不是闰年\n", year);
}
break;
}
case 2:
char yearss[10];
while (1) {
printf("请输入年份: ");
scanf("%s", yearss);
if (!isnumber(yearss)) {
printf("请输入正确的年份\n");
continue;
}
year = atoi(yearss);
Single(year);
Double(year);
break;
}
case 3:printf("不行");break;
default:printf("请选择正确选项\n");
continue;
}
}while(zh!=3);
}