187 lines
5.2 KiB
C++
187 lines
5.2 KiB
C++
#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);
|
||
}
|