UIT2024_Calendar/stu2024/虚拟2401杨博深.c
2024-12-07 16:23:34 +08:00

202 lines
5.7 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.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int menu() {
char g;
int h;
printf("1. 查询星期\n");
printf("2. 打印日历\n");
printf("输入x退出\n");
printf("请输入选项:");
scanf(" %c", &g);
if (g >= '1' && g <= '2') {
h = g - '0'; // 将字符 '1' 或 '2' 转换为整数 1 或 2
}
else if (g == 'x' || g == 'X') {
h = -2; // 表示退出程序
}
else {
h = -1; // 表示无效输入
}
return h;
}
//------------------------------------------------------
int main() {
int n;
int m[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; //一年的月份
for (;;) { //无限循环程序
mjq:;
n = menu();//用n替换h的值
if (n == -2)
break; //退出程序
else if (n == 1)
{
int year, a = 0, b, i, j;
printf("输入年份 月份 日期\n输入-1返回上一级\n");
scanf("%d", &year);
if (year == -1)
goto mjq;//返回首页
if (year < 0 || year>9999)//检测输入合法 万年历真的只有一万年哇!
printf("输入错误\n\n");
else {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) //判断闰年 是的话将月份中的二月换成29天
m[2] = 29;
scanf("%d", &m[0]);
scanf("%d", &b);
if (year == 1582 && m[0] == 10 && b > 4 && b < 15) //1582年10月4日至14日之间的日期这段时间在历史上被格里高利历改革所跳过
printf("输入错误\n1582年10月4日至14日之间的日期这段时间在历史上被格里高利历改革所跳过。\n\n");
else if (year < 0 || m[0] < 0 || m[0]>12 || b < 0 || b>31) { //检查年份、月份和日期是否在有效范围内
printf("输入错误\n\n");
}
else if (m[2] == 28 && b > 28 || m[2] == 29 && b > 29)//检查日期是否超过了该月的天数 闰年29天
printf("输入错误\n\n");
else if ((m[0] == 1 || m[0] == 3 || m[0] == 5 || m[0] == 7 || m[0] == 8 || m[0] == 10 || m[0] == 12) && b > 31)//如果这些月份是输入值大于31天则错误
printf("输入错误\n\n");
else {
j = b;
if (year == 1582) {
m[10] -= 10; //1582年10月4日至14日之间的日期这段时间在历史上被格里高利历改革所跳过 减去
if (b >= 15) //调整当月的日期
b -= 10;
}
if (year >= 2000)
a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7;//计算从公元1年到year-1年包括year年如果它是闰年的话之间的闰年总数 %7计算当天是星期几
else a = (year / 100) / 4 - 2 * (year / 100) + year % 100 + (year % 100) / 4 + (13 * 12 / 5);
for (i = 1; i < m[0]; i++) {
b += m[i];
}
a += b - 1;
a = a % 7;
if (a == 0)
a = 7; //如果a=0 a就是星期天
if (year == 1582) {
if (b >= 15) //同上
b -= 10;
}
printf("%d年%d月%d日是星期%d\n", year, m[0], j, a);
if (m[2] == 29)
printf("%d年是闰年\n\n", year);
else printf("%d年不是闰年\n", year);
}
}
}
else if (n == 2)
{
int year, a = 0, i, j, b, f;
cxk:;
printf("输入年份\n输入-1返回上一级\n");
scanf("%d", &year);
if (year == -1)
goto cxk;
if (year < 0 && year > 9999)
printf("输入错误\n\n");
else {
printf("1.单列输出\n2.双列输出\n输入-1返回上一级\n输入需要的序号\n");
scanf("%d", &n);
if (n == -1)
goto cxk;
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
m[2] = 29;
if (year >= 2000)
a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7;
else a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7;
if (a == 0)
a = 7;
if (n == 1)
{
printf("======================%.4d======================\n\n\n", year); //输出查询年份表头
for (i = 1; i <= 12; i++) {
printf("=======================%.2d=======================\n", i); //单列输出
printf("星期一 星期二 星期三 星期四 星期五 星期六 星期天\n");
for (b = 1; b < a; b++) //输出每个月空着的天数
printf(" ");
for (j = 1; j <= m[i]; j++) {
if (year == 1582 && i == 10) {
if (j == 5) //将5跳到15号
j = 15;
}
printf(" %.2d ", j);
a++;
if (a > 7) {
printf("\n");
a = 1;
}
}printf("\n");
}
}
else if (n == 2) {
int x1, x2, x3, x4;
printf("===============================================%.4d===============================================\n\n\n", year);
for (i = 1; i <= 12; i += 2) {
x2 = 1, x3 = 1;
printf("=======================%.2d======================= ", i); //双列输出
printf("=======================%.2d=======================\n", i + 1);
printf("星期一 星期二 星期三 星期四 星期五 星期六 星期天 ");
printf("星期一 星期二 星期三 星期四 星期五 星期六 星期天\n");
for (b = 1; b < a; b++)
printf(" ");
f = (a + m[i]) % 7;
if (f == 0)
f = 7;
x1 = 1;
for (j = 1; j <= 40; j++) {
if (j <= m[i])
printf(" %.2d ", j);
else if (x3 > m[i + 1]) {
break;
}
else printf(" ");
a++;
if (a > 7) {
if (x1 == 1) {
for (b = 1; b < f; b++)
printf(" ");
x1 = 0;
x2 = f, x4 = f;
}
for (x2; x2 <= 38; x2++) {
if (year == 1582 && (i + 1) == 10) {
if (x3 == 5)
x3 = 15;
}
if (x3 <= m[i + 1]) {
printf(" %.2d ", x3);
x3++;
}
x4++;
if (x4 > 7) {
printf("\n");
a = 1;
x2++;
x4 = 1;
break;
}
}
}
}
if (year == 1582 && (i + 1) == 10) {
m[10] -= 10;
}
a = ((year - 1) * 365 + ((year - 1) / 4) - ((year - 1) / 100) + ((year - 1) / 400) + 1) % 7;
int x5;
for (x5 = 1; x5 <= i + 1; x5++)
a += m[x5];
a = a % 7;
if (a == 0)
a = 7;
printf("\n");
}
}
else {
printf("输入错误\n\n");
}
}
}
else { printf("\n\n"); }
}
}