202 lines
5.7 KiB
C
202 lines
5.7 KiB
C
#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"); }
|
||
}
|
||
} |