c语言课程设计之桌面日历(完整源码+注释)

这篇具有很好参考价值的文章主要介绍了c语言课程设计之桌面日历(完整源码+注释)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

为了应付c语言课程设计,挑了个简单的题目随便写了写

桌面日历c语言源代码,c语言,c++,算法

 文章来源地址https://www.toymoban.com/news/detail-520593.html

题目描述:

桌面日历

1) 按照输入的年份,显示这一年每月日历。

2) 按照输入的年份和月份,显示这个月的日历。

3)显示当月的日历。

日历显示形式同挂历。

用到的知识点:

函数、简单的函数调用、简单的逻辑关系

实现功能演示:

主界面:

桌面日历c语言源代码,c语言,c++,算法

功能一:

桌面日历c语言源代码,c语言,c++,算法 

功能二:

桌面日历c语言源代码,c语言,c++,算法

功能三:

桌面日历c语言源代码,c语言,c++,算法

 完整代码

#include <stdio.h>
#include <time.h>
// 判断是否为闰年函数
int isLeapYear(int);
// 判断某年某月的第一天是周几的函数
int daysWeek(int, int);
// 判断月份有几天函数
int monthDays(int, int);
// 输出某年某月日历函数
void monthCalendar(int, int);
int main()
{
    int Year, Month;
    // 模式选择
    int mode;
    printf("-----------------------------------------\n");
    printf("|               简易日历                |\n");
    printf("-----------------------------------------\n");
    printf("|     (1) 输入年份打印出全年历          |\n");
    printf("-----------------------------------------\n");
    printf("|     (2) 输入年份月份打印出月日历      |\n");
    printf("-----------------------------------------\n");
    printf("|     (3) 打印出当前月的日历            |\n");
    printf("-----------------------------------------\n");
    printf("|    请输入数字1 2 3以选择要使用的功能  |\n");
    printf("-----------------------------------------\n");
    printf("输入数字:");
    scanf("%d", &mode);
    printf("\n");
    if (mode == 1)
    {
        // 实现第一个功能
        printf("请输入年份: ");
        scanf("%d", &Year);
        // 从1遍历到12月 代表1月到十二月
        for (int i = 1; i <= 12; i++)
        {
            printf("--------------------------------------------------\n");
            printf("%d 年 %d 月\n", Year, i);
            monthCalendar(Year, i);
        }
    }
    else if (mode == 2)
    {
        // 实现第二个功能
        printf("请输入年份: ");
        scanf("%d", &Year);
        printf("请输入月份: ");
        scanf("%d", &Month);
        monthCalendar(Year, Month);
    }
    else if (mode == 3)
    {
        // 固定格式
        time_t timep;
        struct tm *p;
        time(&timep);
        p = gmtime(&timep);
        //获取当前年份,从1900开始,所以要加1900
        Year = 1900 + p->tm_year;
        //获取当前月份,范围是0-11,所以要加1
        Month = 1 + p->tm_mon;
        printf("当前时间为:%d年%d月\n", Year, Month);
        printf("--------------------------------------------------\n");
        printf("%d 年 %d 月\n", Year, Month);
        monthCalendar(Year, Month);
    }
    else
    {
        printf("请输入数字1 2 3选择功能 输入其他字符无效!");
    }

    return 0;
}
// 判断是否为闰年
int isLeapYear(int Year)
{
    // 如果能整除4且不能整除100或能整除400,则为闰年
    if (Year % 4 == 0 && Year % 100 != 0 || Year % 400 == 0)
    {
        return 1;
    }
    return 0;
}
// 判断月份有几天
int monthDays(int Year, int Month)
{
    // 如果月份为1、3、5、7、8、10、12 天数为31天
    if (Month == 1 || Month == 3 || Month == 5 || Month == 7 || Month == 8 || Month == 10 || Month == 12)
    {
        return 31;
    }
    // 如果月份为4、6、9、11 天数为30天
    else if (Month == 4 || Month == 6 || Month == 9 || Month == 11)
    {
        return 30;
    }
    else
    {
        // 月份为2月 如果是闰年 天数为29天
        if (isLeapYear(Year))
        {
            return 29;
        }
        // 如果不是闰年 天数为28天
        return 28;
    }
}
// 判断某年某月的第一天是周几
int daysWeek(int Year, int Month)
{
    // day用于记录总天数
    // day1记录每月的天数,结合下面代码理解
    int day = 0, day1 = 0;
    // 得到从1900年到某年的天数
    /**
     * @brief
     * 由于1900年1月1日为周一 得到1900年到某年的天数之后
     * 只需要用天数取7的余数,余数即是某年1月1日的周几
     * 所以也可以换为其他1月1日为周一的年份,使用1900年
     * 后,只能判断出1900年之后的年份
     */
    for (int i = 1900; i < Year; i++)
    {
        // 判断闰年
        if (isLeapYear(i))
        {
            day = day + 366;
        }
        else
        {
            day = day + 365;
        }
    }
    //判断月份
    for (int m = 1; m <= Month; m++)
    {
        day1 = monthDays(Year, m);
        if (m < Month)
        {
            // 计算天数
            day = day + day1;
        }
    }
    // week为某年某月第一天的周几
    int week = day % 7;
    return week;
}
// 具体实现打印某年某月日历
void monthCalendar(int Year, int Month)
{
    printf("--------------------------------------------------\n");
    printf("一\t二\t三\t四\t五\t六\t日\n");
    //判断这个月的第一天是星期几
    int t = daysWeek(Year, Month);
    // 判断月份有几天
    int day1 = monthDays(Year, Month);
    for (int i = 0; i < t; i++)
    {
        printf("\t");
    }
    //控制输出格式
    for (int i = 1; i <= day1; i++)
    {
        printf("%d\t", i);
        if ((i + t) % 7 == 0)
        {
            printf("\n");
        }
    }
    printf("\n");
    printf("--------------------------------------------------\n");
    printf("\n");
}

代码详解

大体思路:

功能的核心在于打印出某年中某月的日历,要想实现这个功能,需要知道:

这个月一共有几天、这个月的第一天是星期几

找到月份的天数思路:

首先判断月份,如果月份为1、3、5、7、8、10、12 天数为31天,如果月份为4、6、9、11 天数为30天,月份为2月时,如果年份是闰年,天数为29天,不是闰年天数为28天

判断月份第一天是周几思路:

首先要找一个1月1日为周一的年份,这里选用1900年举例

假如现在需要找到2022年9月份的第一天是周几

就需要得到1900年到2022年的总天数,总天数 = 整年数 × 年份天数 + 整月数 × 月份天数

也就是(2022-1900)× 年份天数(闰年366 平年365) + 8(要算9月份的日历,整月数为8) × 月份天数

然后再用总天数取7的余数,就是9月份一号的周几

表达能力有限,看不懂可以百度一下

代码详解:

判断闰年函数

如果一个年份可以整除4且不能整除100 或者可以整除400,则为闰年

int isLeapYear(int Year)
{
    if (Year % 4 == 0 && Year % 100 != 0 || Year % 400 == 0)
    {
        return 1;
    }
    return 0;
}

判断每月天数函数

如果月份为1、3、5、7、8、10、12 天数为31天

如果月份为4、6、9、11 天数为30天

月份为2月 如果是闰年 天数为29天 否则为28天

int monthDays(int Year, int Month)
{
    if (Month == 1 || Month == 3 || Month == 5 || Month == 7 || Month == 8 || Month == 10 || Month == 12)
    {
        return 31;
    }
    else if (Month == 4 || Month == 6 || Month == 9 || Month == 11)
    {
        return 30;
    }
    else
    {
        if (isLeapYear(Year))
        {
            return 29;
        }
        return 28;
    }
}

 判断某年某月的第一天是周几函数

结合着注释和上面解释

int daysWeek(int Year, int Month)
{
    // day用于记录总天数
    // day1记录每月的天数,结合下面代码理解
    int day = 0, day1 = 0;
    // 得到从1900年到某年的天数
    /**
     * @brief
     * 由于1900年1月1日为周一 得到1900年到某年的天数之后
     * 只需要用天数取7的余数,余数即是某年1月1日的周几
     * 所以也可以换为其他1月1日为周一的年份,使用1900年
     * 后,只能判断出1900年之后的年份
     */
    for (int i = 1900; i < Year; i++)
    {
        // 判断闰年
        if (isLeapYear(i))
        {
            day = day + 366;
        }
        else
        {
            day = day + 365;
        }
    }
    printf("整年天数%d",day);
    //判断月份
    for (int m = 1; m <= Month; m++)
    {
        day1 = monthDays(Year, m);
        if (m < Month)
        {
            // 计算天数
            day = day + day1;
        }
    }
    // week为某年某月第一天的周几
    printf("月份天数%d",day);
    int week = day % 7;
    return week;
}

具体实现打印函数

调用上面写好的函数

void monthCalendar(int Year, int Month)
{
    printf("--------------------------------------------------\n");
    printf("一\t二\t三\t四\t五\t六\t日\n");
    //判断这个月的第一天是星期几
    int t = daysWeek(Year, Month);
    // 判断月份有几天
    int day1 = monthDays(Year, Month);
    for (int i = 0; i < t; i++)
    {
        printf("\t");
    }
    //控制输出格式
    for (int i = 1; i <= day1; i++)
    {
        printf("%d\t", i);
        if ((i + t) % 7 == 0)
        {
            printf("\n");
        }
    }
    printf("\n");
    printf("--------------------------------------------------\n");
    printf("\n");
}

主函数

声明一个变量mode,用于功能的选择,将不同的功能写到不同的if语句中

其中获取当前系统时间的代码为固定格式,详细可以看这篇文章

C语言获取当前的日期及时间_Coder802的博客-CSDN博客_c 获取时间

功能一(全年历)的实现:写一个for循环 从1遍历到12,调用12次写好的函数

功能二(月份日历):输入年份和月份 调用函数

功能三(当前月日历):获取系统时间年份和月份,作为参数调用函数

int main()
{
    int Year, Month;
    // 模式选择
    int mode;
    printf("-----------------------------------------\n");
    printf("|               简易日历                |\n");
    printf("-----------------------------------------\n");
    printf("|     (1) 输入年份打印出全年历          |\n");
    printf("-----------------------------------------\n");
    printf("|     (2) 输入年份月份打印出月日历      |\n");
    printf("-----------------------------------------\n");
    printf("|     (3) 打印出当前月的日历            |\n");
    printf("-----------------------------------------\n");
    printf("|    请输入数字1 2 3以选择要使用的功能  |\n");
    printf("-----------------------------------------\n");
    printf("输入数字:");
    scanf("%d", &mode);
    printf("\n");
    if (mode == 1)
    {
        // 实现第一个功能
        printf("请输入年份: ");
        scanf("%d", &Year);
        // 从1遍历到12月 代表1月到十二月
        for (int i = 1; i <= 12; i++)
        {
            printf("--------------------------------------------------\n");
            printf("%d 年 %d 月\n", Year, i);
            monthCalendar(Year, i);
        }
    }
    else if (mode == 2)
    {
        // 实现第二个功能
        printf("请输入年份: ");
        scanf("%d", &Year);
        printf("请输入月份: ");
        scanf("%d", &Month);
        monthCalendar(Year, Month);
    }
    else if (mode == 3)
    {
        // 固定格式
        time_t timep;
        struct tm *p;
        time(&timep);
        p = gmtime(&timep);
        //获取当前年份,从1900开始,所以要加1900
        Year = 1900 + p->tm_year;
        //获取当前月份,范围是0-11,所以要加1
        Month = 1 + p->tm_mon;
        printf("当前时间为:%d年%d月\n", Year, Month);
        printf("--------------------------------------------------\n");
        printf("%d 年 %d 月\n", Year, Month);
        monthCalendar(Year, Month);
    }
    else
    {
        printf("请输入数字1 2 3选择功能 输入其他字符无效!");
    }

    return 0;
}

桌面日历c语言源代码,c语言,c++,算法表达能力不佳,代码写的比较捞,有什么看不懂的地方可以私聊我,看到都会回的~~~

 

到了这里,关于c语言课程设计之桌面日历(完整源码+注释)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包