125 lines
3.5 KiB
C++
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;
|
|
} |