制作不易,请先点赞关注!
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<windows.h>
//菜单
void menu();
//判断给定年份是否是闰年
int isLeapYear(int y);
//这个函数用于计算返回该月的天数
int daysInMonth(int y, int m);
//这个函数用于计算给定日期是星期几
int dayOfWeek(int y, int m, int d);
//可突出显示当前指定年月的月历
void displayCalendar(int y, int m, int currentDay);
//这个函数用于显示指定年份 year 的全年日历
void displayYearCalendar(int y);
//这个函数用于验证给定的日期是否有效
int isValidDate(int y, int m, int day);
//查询指定日期的月历并突出显示
void queryDate(int y, int m, int day);
//允许用户通过键盘输入来调整日期
void adjustDate(int y, int m, int d);
//重置时间为当前系统时间
void resetTime();
//定义全局变量
time_t t;
struct tm* today;
int choice = 0;
int year, month, day;
int year1, month1, day1;
int main()
{
int year2, month2, day2;
t = time(NULL);//time(&t),获取当前时间戳(秒数)
//将时间戳(秒数)转换为 struct tm 结构体,对应本地时区
today = localtime(&t);
year = today->tm_year + 1900;//年份从1900开始
month = today->tm_mon + 1; //月份从1开始
day = today->tm_mday;
do
{
int week = dayOfWeek(year, month, day);
printf(">>>\033[36;5mNOW: %d-%d-%d · 周%d\033[0m\n", year, month, day, week);
menu();
printf("\033[1m请输入选择的操作: \033[0m");
scanf("%d", &choice);
switch (choice)
{
case 1:
//显示当前的月历,并突出显示今天的日期
displayCalendar(year, month, day);
break;
case 2:
system("cls");//清空已有内容
displayYearCalendar(year);
break;
case 3:
printf("请输入要查询的日期(YYYY MM DD): ");
scanf("%4d %2d %2d", &year1, &month1, &day1);
queryDate(year1, month1, day1);
break;
case 4:
printf("请输入修改后的日期(YYYY MM DD): ");
scanf("%4d %2d %2d", &year2, &month2, &day2);
adjustDate(year2, month2, day2);
break;
case 0:
printf("已退出万年历系统!\n");
break;
default:
printf("输入错误,请重试!\n");
break;
}
} while (choice);
return 0;
}
//菜单
void menu()
{
printf("\033[36m| 1, 获取当前日期 |\033[0m\n");
printf("\033[36m| 2, 显示全年日历 |\033[0m\n");
printf("\033[36m| 3, 查询日期 |\033[0m\n");
printf("\033[36m| 4, 调整日期 |\033[0m\n");
printf("\033[36m| 0, 退出 |\033[0m\n");
printf("\n");
}
//判断给定年份 year 是否是闰年
int isLeapYear(int y)
{
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)
return 1;//闰年
else
return 0;//平年
}
//用于计算返回该月的天数
int daysInMonth(int y, int m)
{
int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
if (m == 2 && isLeapYear(y))
{
days[2] = 29;
}
return days[m];
}
//计算给定日期的星期几
int dayOfWeek(int y, int m, int d)
{
if (m < 3)
{
m += 12;
y--;
}
int h = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;
/*余数的值将是0(星期日)到6(星期六)之间的一个整数,
分别代表一周的不同天,再加1准确表示周几)*/
//h+1表示某时间是星期几
return h + 1;
}
//显示当前指定年月的月历
void displayCalendar(int y, int m, int currentDay)
{
printf("\033[33m================== %4d 年 %2d 月 =================\033[0m\n", y,m);
printf("日\t一\t二\t三\t四\t五\t六\n");
printf("--------------------------------------------------\n");//6*6+2*7
int first_day = dayOfWeek(y, m, 1);//获取每月1号的周数
int ofday = daysInMonth(y, m);//获取一个月有多少天
int count = first_day;
for (int i = 0; i <= ofday; i++)
{
//使日期能对齐对应的星期
if (i == 0)
{
for (int j = 0; j < count % 7; j++)
{
printf("\t");
}
}
else if (i == currentDay)
{
//突出显示日期
if (m == month || m == month1)
{
printf("\033[31m%2d\033[0m\t", i);
count++;
}
else
{
printf("%2d\t", i);
count++;
}
}
else
{
printf("%2d\t", i);
count++;
}
//循环打印一周后换行
if (count % 7 == 0)
{
printf("\n");
}
}
printf("\n");
}
//这个函数用于显示指定年份的全年日历
void displayYearCalendar(int y)
{
int i = 0;
for (i = 1; i <= 12; i++)
{
displayCalendar(y, i, day);
printf("\n");
}
}
//验证给定的日期是否有效
int isValidDate(int y, int m, int d)
{
if (y < 1900 || (m < 1 || m >12) || (d < 1 || d > daysInMonth(y, m)))
return 0;//格式错误
else
return 1;//格式正确
}
//查询指定日期的月历并突出显示
void queryDate(int y, int m, int d)
{
int choice = 0;
int flag = isValidDate(y, m, d);
if (flag)
{
printf("请选择: \033[36m| 1.月历 - 2.年历 |\033[0m\n");
scanf("%d", &choice);
if (choice == 1)
{
displayCalendar(y, m, d);
}
else if(choice == 2)
{
//将关于日期的全局变量修改为指定的日期,在突出显示后再修改回系统值.
day = d;
month = m;
displayYearCalendar(y);
day = today->tm_mday;
month = today->tm_mon + 1;
}
else
printf("请重新选择!\n");
}
else
printf("无效的日期!\n");
}
//将当前日期调整为新输入的日期,无效则重置时间
void adjustDate(int y, int m, int d)
{
int flag = isValidDate(y, m, d);
if (flag)
{
year = y;
month = m;
day = d;
printf("当前的时间已修改为:%d年%d月%d日\n", y, m, d);
}
else
{
printf("无效的日期!\n");
//输入日期无效则进行重置时间
resetTime();
}
}
//重置时间为当前系统时间
void resetTime()
{
year = today->tm_year+1900;
month = today->tm_mon+1;
day = today->tm_mday;
printf("\033[31m已重置为系统时间!\033[0m\n");
getchar();
Sleep(1300);
system("cls");
}