用C语言实现万年历的代码及思路(详细教程)

这篇具有很好参考价值的文章主要介绍了用C语言实现万年历的代码及思路(详细教程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

万年历程序要求:

1.当选择1的时候,输入,打印输入的这一年12月的日历。
2.当选择2的时候,输入年-月,打印输入这一年这一月的日历。
实现效果:
选择1时

*********************Please chose*************************
*************1.Print a year's calendar *******************
*************2.Print a month's calendar*******************
**********************************************************
your chose:>1
input(year)>2022
2022-1
        Sun     Mon     Tue     Wed     Thu     Fri     Sat
                                                        1
        2       3       4       5       6       7       8
        9       10      11      12      13      14      15
        16      17      18      19      20      21      22
        23      24      25      26      27      28      29
        30      31
2022-2
        Sun     Mon     Tue     Wed     Thu     Fri     Sat
                        1       2       3       4       5
        6       7       8       9       10      11      12
        13      14      15      16      17      18      19
        20      21      22      23      24      25      26
        27      28
2022-3
        Sun     Mon     Tue     Wed     Thu     Fri     Sat
                        1       2       3       4       5
        6       7       8       9       10      11      12
        13      14      15      16      17      18      19
        20      21      22      23      24      25      26
        27      28      29      30      31
2022-4
        Sun     Mon     Tue     Wed     Thu     Fri     Sat
                                                1       2
        3       4       5       6       7       8       9
        10      11      12      13      14      15      16
        17      18      19      20      21      22      23
        24      25      26      27      28      29      30
2022-5
        Sun     Mon     Tue     Wed     Thu     Fri     Sat
        1       2       3       4       5       6       7
        8       9       10      11      12      13      14
        15      16      17      18      19      20      21
        22      23      24      25      26      27      28
        29      30      31
2022-6
        Sun     Mon     Tue     Wed     Thu     Fri     Sat
                                1       2       3       4
        5       6       7       8       9       10      11
        12      13      14      15      16      17      18
        19      20      21      22      23      24      25
        26      27      28      29      30
2022-7
        Sun     Mon     Tue     Wed     Thu     Fri     Sat
                                                1       2
        3       4       5       6       7       8       9
        10      11      12      13      14      15      16
        17      18      19      20      21      22      23
        24      25      26      27      28      29      30
        31
2022-8
        Sun     Mon     Tue     Wed     Thu     Fri     Sat
                1       2       3       4       5       6
        7       8       9       10      11      12      13
        14      15      16      17      18      19      20
        21      22      23      24      25      26      27
        28      29      30      31
2022-9
        Sun     Mon     Tue     Wed     Thu     Fri     Sat
                                        1       2       3
        4       5       6       7       8       9       10
        11      12      13      14      15      16      17
        18      19      20      21      22      23      24
        25      26      27      28      29      30
2022-10
        Sun     Mon     Tue     Wed     Thu     Fri     Sat
                                                        1
        2       3       4       5       6       7       8
        9       10      11      12      13      14      15
        16      17      18      19      20      21      22
        23      24      25      26      27      28      29
        30      31
2022-11
        Sun     Mon     Tue     Wed     Thu     Fri     Sat
                        1       2       3       4       5
        6       7       8       9       10      11      12
        13      14      15      16      17      18      19
        20      21      22      23      24      25      26
        27      28      29      30
2022-12
        Sun     Mon     Tue     Wed     Thu     Fri     Sat
                                        1       2       3
        4       5       6       7       8       9       10
        11      12      13      14      15      16      17
        18      19      20      21      22      23      24
        25      26      27      28      29      30      31

选择2时

*********************Please chose*************************
*************1.Print a year's calendar *******************
*************2.Print a month's calendar*******************
**********************************************************
your chose:>2
input(year-month)>2020-2
2020-2
        Sun     Mon     Tue     Wed     Thu     Fri     Sat
                                                        1
        2       3       4       5       6       7       8
        9       10      11      12      13      14      15
        16      17      18      19      20      21      22
        23      24      25      26      27      28      29

程序中所用到的函数:

1.参考公式:

C语言根据日期判断星期几(使用基姆拉尔森计算公式)
算法如下:
基姆拉尔森计算公式
W= (d+2m+3(m+1)/5+y+y/4-y/100+y/400)%7
在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方
把一月和二月看成是上一年的十三月和十四月,
例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
以公元元年为参考,公元元年1月1日为星期一
改进后代码如下:
iY=2022, iM=7, iD=17 iWeekDay=0
iY=2022, iM=7, iD=18 iWeekDay=1

iY=2022, iM=7, iD=23 iWeekDay=6文章来源地址https://www.toymoban.com/news/detail-509198.html

int getWeekdayByYearday(int iY, int iM, int iD)
{
	/*
	iY=2022, iM=7, iD=17  iWeekDay=0
	iY=2022, iM=7, iD=18  iWeekDay=1
	...
	iY=2022, iM=7, iD=23  iWeekDay=6
	*/
    int iWeekDay = -1;
    if (1 == iM || 2 == iM)
    {
        iM += 12;
        iY--;
    }
    iWeekDay = (iD + 1 + 2 * iM + 3 * (iM + 1) / 5 + iY + iY / 4 - iY / 100 + iY / 400) % 7;
    return iWeekDay;
}

2.得到某年某月有几天,并返回天数

int getmonthday(int year,int month)
{
    int day=0;
    switch(month)
    {
    	//当月是1,3,5,7,8,10,12时,天数返回31天
    	//当月是4,6,9,11时,天数返回30天
    	//当月是2月时,判断进行平闰年判断,
    	//如果是闰年返回29天,平年返回28天
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
        day=31;
        break;
        case 4:
        case 6:
        case 9:
        case 11:
        day=30;
        break;
        case 2:
        {
            if(year%400==0||(year%4==0&&year%100!=0))
            {
                day=29;
            }
            else
            {
                day=28;
            }
            break;
        }
    }
    return day;
}

3.通过传递的参数输出某年某一月的日历

int printfmonth(int year,int month)
{
	//week是某年某月的第一天的是星期几
    int i,j,week=getWeekdayByYearday(year, month, 1);
    printf("%d-%d\n",year,month);
    printf("\tSun\tMon\tTue\tWed\tThu\tFri\tSat\n");
    //当小于等于第一天时,输出tab键进
    for(i=0;i<=week;i++)
    {
        printf("\t");
    }
    //当小于等于月份天数时输出日历几号
    for(i=1,j=week;i<=getmonthday(year,month);i++)
    {	
    	//如果日期等于7时进行换行并输入tab键对齐
    	//j赋值为0
        if(j==7)
        {
            printf("\n");
            printf("\t");
            j=0;
        }
        printf("%d",i);//输入月份日期
        printf("\t");
        j++;
    }
    printf("\n");//当打完一个月份日历后进行换行
}

4.主函数

int main(int argc,const char * argv[])
{
    int chose=0;
    int ret=0;
    int year,month;
    int i;
    //打印表头
    printf("*********************Please chose*************************\n");
    printf("*************1.Print a year's calendar *******************\n");
    printf("*************2.Print a month's calendar*******************\n");
    printf("**********************************************************\n");
    printf("your chose:>");
    //判断输入的选项个数是否为一个,不是的话输出输入错误。
    ret=scanf("%d",&chose);
    if(ret!=1)
    {
        printf("input chose error\n");
        return -1;
    }
    while((getchar()!='\n'));//吃掉垃圾字符
    //chose one时执行目的1
    //chose two时执行目的2
    switch(chose)
    {
        case one:
        printf("input(year)>");
        ret=scanf("%d",&year);
        if(ret!=1)
        {
            printf("input error\n");
            return -1;
        }
        while((getchar()!='\n'));
        //判断输入的年份是否正确,不正确的话输出输入错误
        if(year<=0)
        {
            printf("input error\n");
            return -1;
        }
        //通过循环打印目的1的一年日历要求,12个月
        for(i=1;i<=12;i++)
        {
            printfmonth(year,i);
        }
        break;
        case two:
        printf("input(year-month)>");
        ret=scanf("%d-%d",&year,&month);
        if(ret!=2)
        {
            printf("input error\n");
            return -1;
        }
        while((getchar()!='\n'));
        //判断输入的年和月是否正确,不正确输出输入错误
        if(year<=0||month<0||month>12)
        {
            printf("input error\n");
            return -1;
        }
        //打印输入的年-月的日历
        printfmonth(year,month);
    }
    return 0;
}

源代码如下:

#include <stdio.h>

#define one 1
#define two 2

int getWeekdayByYearday(int iY, int iM, int iD)
{
    int iWeekDay = -1;
    if (1 == iM || 2 == iM)
    {
        iM += 12;
        iY--;
    }
    iWeekDay = (iD + 1 + 2 * iM + 3 * (iM + 1) / 5 + iY + iY / 4 - iY / 100 + iY / 400) % 7;
    return iWeekDay;
}
int getmonthday(int year,int month)
{
    int day=0;
    switch(month)
    {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
        day=31;
        break;
        case 4:
        case 6:
        case 9:
        case 11:
        day=30;
        break;
        case 2:
        {
            if(year%400==0||(year%4==0&&year%100!=0))
            {
                day=29;
            }
            else
            {
                day=28;
            }
            break;
        }
    }
    return day;
}

int printfmonth(int year,int month)
{
    int i,j,week=getWeekdayByYearday(year, month, 1);
    printf("%d-%d\n",year,month);
    printf("\tSun\tMon\tTue\tWed\tThu\tFri\tSat\n");
    for(i=0;i<=week;i++)
    {
        printf("\t");
    }
    for(i=1,j=week;i<=getmonthday(year,month);i++)
    {
        if(j==7)
        {
            printf("\n");
            printf("\t");
            j=0;
        }
        printf("%d",i);
        printf("\t");
        j++;
    }
    printf("\n");
}

int main(int argc,const char * argv[])
{
    int chose=0;
    int ret=0;
    int year,month;
    int i;
    //打印表头
    printf("*********************Please chose*************************\n");
    printf("*************1.Print a year's calendar *******************\n");
    printf("*************2.Print a month's calendar*******************\n");
    printf("**********************************************************\n");
    printf("your chose:>");
    ret=scanf("%d",&chose);
    if(ret!=1)
    {
        printf("input chose error\n");
        return -1;
    }
    while((getchar()!='\n'));
    switch(chose)
    {
        case one:
        printf("input(year)>");
        ret=scanf("%d",&year);
        if(ret!=1)
        {
            printf("input error\n");
            return -1;
        }
        while((getchar()!='\n'));
        if(year<=0)
        {
            printf("input error\n");
            return -1;
        }
        for(i=1;i<=12;i++)
        {
            printfmonth(year,i);
        }
        break;
        case two:
        printf("input(year-month)>");
        ret=scanf("%d-%d",&year,&month);
        if(ret!=2)
        {
            printf("input error\n");
            return -1;
        }
        while((getchar()!='\n'));
        if(year<=0||month<0||month>12)
        {
            printf("input error\n");
            return -1;
        }
        printfmonth(year,month);
    }
    return 0;
}

到了这里,关于用C语言实现万年历的代码及思路(详细教程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 51单片机实训项目之“万年历”代码原理详解

    读者若需要工程源码,可以私信我,收到后会第一时间回复。这是仿真效果  51单片机万年历程序设计(附源码+仿真分享)_哔哩哔哩_bilibili STC89C52 DS18B20(温度传感器) DS1302(时钟芯片) LCD1602液晶显示 独立按键 杜邦线 (一).子程序 EEPROM.h LCD1602.h DS1302时钟模块的三个引脚:

    2024年02月08日
    浏览(52)
  • 基于ego1开发板的万年历自动数字日历设计verilog代码

    名称:基于ego1开发板的万年历自动数字日历设计verilog代码 软件:VIVADO 语言:Verilog 代码功能: 自动数字日历设计  设计自动数字日历,用七段数字显示器显示年(后2位)、月、日和星期数,在计日脉冲的作用下,自动完成1-12月的月、日及星期的计数和显示。 FPGA代码Verilog/VHDL代码

    2024年02月03日
    浏览(44)
  • 6-6 万年历显示函数

    题主为武理的学生 网上没有对应答案 仅以学习用途上传 设计一个万年历,当用户输入年份和月份时,显示这个月的日历表。程序重点是这个月的第一天是星期几和这个月有几天,有了这两个值,只需通过排列,就可以显示这个日历。程序要求用户输入的年份是从1900年开始,

    2024年01月18日
    浏览(41)
  • STM32制作万年历

        STM32万年历制作指南 一、概述 STM32是一种常用的微控制器,具有强大的处理能力和低功耗特性,非常适合用于制作各种电子设备。本文将介绍如何使用STM32制作一款简易的万年历,帮助您轻松查看日期、时间和农历等信息。 二、所需材料 1. STM32微控制器(建议使用STM32F

    2024年02月03日
    浏览(40)
  • 基于Java的万年历(课设)

    资源链接:基于Java的万年历(课设) 摘 要 Java编程语言自诞生十几年来,已经成功地运用在网络计算及移动等各个领域。对于开发者来说,它具有简单、面向对象、健壮、安全、结构中立、可移植和高效能等众多优点。此次我们用JAVA来设计一个万年历程序,该程序以网页形

    2024年02月11日
    浏览(49)
  • 基于FPGA的电子万年历设计

    quartusii12.1 系统的整个结构框图:  然后,设置控制输入有5个脚,分析功能如下所示: i_Function_Controller=0 ;显示年月日 i_sel:选择需要调整的某位数字。 i_set:计数器,调整需要调整的位置的数字。 具体调整的时候,首先选择i_sel,按键按一下,需要调整的位置会移动一次,

    2024年02月03日
    浏览(89)
  • 万年历【小游戏】(Java课设)

    Java实现的小游戏 适合作为Java课设!!! jdk1.8+Idea或eclipse 本系统源码地址:https://download.csdn.net/download/qq_50954361/87801830 更多Java课设系统源码地址:更多Java课设系统源码地址 更多Java小游戏运行效果展示:更多Java小游戏运行效果展示 Java课设部署教程:Java课设部署教程 注意事

    2024年02月15日
    浏览(48)
  • 基于51单片机的万年历设计

    目  录 前言....................................................................... 1 1 绪论..................................................................... 3 1.1 课题研究的背景..................................................... 3 1.2课题的研究目的与意义................................................ 3 1.3课题解决的主要内

    2024年02月02日
    浏览(50)
  • PTA6-6 万年历显示函数

    设计一个万年历,当用户输入年份和月份时,显示这个月的日历表。程序重点是这个月的第一天是星期几和这个月有几天,有了这两个值,只需通过排列,就可以显示这个日历。程序要求用户输入的年份是从1900年开始,已知1900年1月1日是星期一。 日历中每个具体的日期占5个

    2024年01月16日
    浏览(41)
  • FPGA项目(12)——基于FPGA的万年历设计

            首先称述一下所实现的功能:可以显示年、月、日、时、分、秒,有闹钟设置功能,闹钟时间到时,蜂鸣器响,报警。用6位数码管进行显示,分三个显示页面,第一个页面显示年月日,第二个界面显示时分秒,第三个页面显示闹钟时间。可以用按键进行翻页,按键进

    2024年02月07日
    浏览(46)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包