c语言万年历最强版本

制作不易,请先点赞关注!

#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");
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值