184 lines
4.5 KiB
C++
184 lines
4.5 KiB
C++
#include <stdio.h>
|
||
#include <stdlib.h>
|
||
|
||
|
||
int isLeapYear(int year) {
|
||
if ((year % 4 == 0 && year % 100!= 0) || (year % 400 == 0)) {
|
||
return 1;
|
||
}
|
||
return 0;
|
||
}
|
||
int getDaysInMonth(int year,int month){
|
||
scanf("%d%d",&year,&month);
|
||
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
|
||
printf("31");
|
||
else if(month==4||month==6||month==9||month==11)
|
||
printf("30");
|
||
else{
|
||
if((year % 4 == 0 && year % 100!= 0) || (year % 400 == 0))
|
||
printf("29");
|
||
else
|
||
printf("28");
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
int getDayOfWeek(int year, int month, int day) {
|
||
if (month < 3) {
|
||
month += 12;
|
||
year--;
|
||
}
|
||
int c = year / 100;
|
||
int y = year % 100;
|
||
int week = (day + 2 * month + 3 * (month + 1) / 5 + y + y / 4 + c / 4 - 2 * c + 7) % 7;
|
||
return week;
|
||
}
|
||
|
||
/*单月日历*/
|
||
void x(int year, int month) {
|
||
printf("%d%d\n", year, month);
|
||
printf("日 一 二 三 四 五 六\n");
|
||
|
||
int dayOfWeek = getDayOfWeek(year, month, 1);
|
||
for (int i = 0; i < dayOfWeek; i++) {
|
||
printf(" ");
|
||
}
|
||
int daysInMonth;
|
||
int getDaysInMonth;
|
||
for (int i = 1; i <= daysInMonth; i++) {
|
||
printf("%2d ", i);
|
||
if ((i + dayOfWeek) % 7 == 0) {
|
||
printf("\n");
|
||
}
|
||
}
|
||
if ((daysInMonth + dayOfWeek) % 7!= 0) {
|
||
printf("\n");
|
||
}
|
||
}
|
||
void z(int year, int month) {
|
||
printf(" %d%d%d%d\n", year, month, year, month + 1);
|
||
printf("日 一 二 三 四 五 六 日 一 二 三 四 五 六\n");
|
||
|
||
int dayOfWeek1 = getDayOfWeek(year, month, 1);
|
||
int dayOfWeek2 = getDayOfWeek(year, month + 1, 1);
|
||
|
||
for (int i = 0; i < dayOfWeek1; i++) {
|
||
printf(" ");
|
||
}
|
||
|
||
int daysInMonth1 ;
|
||
int daysInMonth2 ;
|
||
|
||
int i1 = 1, i2 = 1;
|
||
while (i1 <= daysInMonth1 || i2 <= daysInMonth2) {
|
||
if (i1 <= daysInMonth1) {
|
||
printf("%2d ", i1);
|
||
i1++;
|
||
} else {
|
||
printf(" ");
|
||
}
|
||
|
||
if ((i1 + dayOfWeek1 - 1) % 7 == 0 && i1 <= daysInMonth1) {
|
||
printf(" ");
|
||
}
|
||
|
||
if (i2 <= daysInMonth2) {
|
||
printf("%2d ", i2);
|
||
i2++;
|
||
} else {
|
||
printf(" ");
|
||
}
|
||
|
||
if ((i2 + dayOfWeek2 - 1) % 7 == 0 && i2 <= daysInMonth2) {
|
||
printf("\n");
|
||
}
|
||
}
|
||
if ((daysInMonth1 + dayOfWeek1) % 7!= 0 || (daysInMonth2 + dayOfWeek2) % 7!= 0) {
|
||
printf("\n");
|
||
}
|
||
}
|
||
void showMenu() {
|
||
printf("菜单:\n");
|
||
printf("1. 查询某年某月某日的日期是周几及该年是否为闰年\n");
|
||
printf("2. 输入年份,输出这一年的单月日历\n");
|
||
printf("3. 输入年份,输出这一年的双月日历(并排显示两个月)\n");
|
||
printf("4.");
|
||
}
|
||
int main() {
|
||
int choice;
|
||
int year, month, day;
|
||
int m;
|
||
do {
|
||
showMenu();
|
||
scanf("%d",&choice);
|
||
|
||
switch (choice) {
|
||
case 1:
|
||
printf("请输入年份:");
|
||
scanf("%d",&year);
|
||
printf("请输入月份:");
|
||
scanf("%d",&month);;
|
||
printf("请输入日期:");
|
||
scanf("%d",&day);
|
||
|
||
if (year < 1583 && year == 1582 && month == 10 && day >= 5 && day <= 14) {
|
||
printf("1582年10月5日 - 14日不存在,请重新输入。\n");
|
||
continue;
|
||
}
|
||
|
||
printf("%d%d%d", year, month, day);
|
||
switch (getDayOfWeek(year, month, day)) {
|
||
case 0:
|
||
printf("日\n");
|
||
break;
|
||
case 1:
|
||
printf("一\n");
|
||
break;
|
||
case 2:
|
||
printf("二\n");
|
||
break;
|
||
case 3:
|
||
printf("三\n");
|
||
break;
|
||
case 4:
|
||
printf("四\n");
|
||
break;
|
||
case 5:
|
||
printf("五\n");
|
||
break;
|
||
case 6:
|
||
printf("六\n");
|
||
break;
|
||
}
|
||
|
||
if (is LeapYear){
|
||
printf("%d\n", year);
|
||
} else {
|
||
printf("%d年不是闰年\n", year);
|
||
}
|
||
break;
|
||
case 2:
|
||
printf("请输入年份:");
|
||
scanf("%d",&year);
|
||
for (month = 1; month <= 12; month++) {
|
||
x(year, month);
|
||
printf("\n");
|
||
}
|
||
break;
|
||
case 3:
|
||
printf("请输入年份:");
|
||
scanf("%d",&year);;
|
||
for (month = 1; month <= 11; month += 2) {
|
||
z(year, month);
|
||
printf("\n");
|
||
}
|
||
break;
|
||
default:
|
||
printf("无效的选择,请重新输入。\n");
|
||
}
|
||
} while (choice!= 0);
|
||
|
||
return 0;
|
||
}
|
||
|