用C语言实现简单的日历

效果

用C语言实现简单的日历

实现日历的流程图

Calendar流程图

源码

#include<stdio.h>
#include<stdlib.h>
int monthDays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//存放每个月月份天数的数组,这是全局变量
//以下为声明各部分需要的函数
int isLeapYear(int);//声明检验是否闰年的函数
void printClenderTitle(int,int);//打印日历标题的函数
void printClenderBody(int,int);//打印日历主体的函数
int dayOftheWeekThisYear(int);//查询某年第一天是星期几
int dayOftheWeekThisYearQueryMonth(int,int);//查询某年某月的第一天星期几,需要调用上一个函数实现
int main()
{    

    int queryYear,queryMonth;//这两个变量用于存放查询的年和月
    XunHuan://循环标号,使用goto语句跳转到此处继续执行
    printf("Please enter the year you want to inqire(1584~9999):");
    scanf("%d",&queryYear);
    printf("Please enter the month you want to inquire(1~12):");
    scanf("%d",&queryMonth);
    printClenderTitle(queryYear,queryMonth);//调用打印日历标题函数,
    printClenderBody(queryYear,queryMonth);//调用打印日历主题函数
    printf("\n*******************Clender************************* \n\n");
    printf("Enter y/n to continue or exit:");
    char yn;
    scanf("%c",&yn);
    scanf("%c",&yn);//
    getchar();
    if(yn=='Y' || yn=='y')//判断语句,输入y则执行goto语句跳转执行
    goto XunHuan;//跳转到XunHuan处执行
    //test
    /*以下是程序书写过程中进行测试的代码
    printf("\n*********This is a test zone***********\n");
    printf("%d\n",isLeapYear(queryYear));
    printf("%d\n", dayOftheWeekThisYear(queryYear));
    printf("%d\n", dayOftheWeekThisYearQueryMonth(queryYear,queryMonth));
    printf("\n*********This is a test zone*********** \n");
    */
    system("pause");
    return 0;
}
void printClenderTitle(int year,int month)
{
   printf("\n*******************Clender************************* \n");
   printf("\n*****************公元%d年%d月********************* \n\n",year,month);//打印日历标题,用两个数据输出即可
}
void printClenderBody(int year,int month)
{
    printf("Sun\tMon\tTue\tWes\tThu\tFri\tSar\n");
    //打印日历上方的星期标题,用\t,输入制表符隔开
    if(isLeapYear(year)==1)monthDays[2]=29;
    else monthDays[2]=28;//修正数组,修正闰年2月的天数
    int i=0,b;//定义几个临时变量,i用于循环数组,b是这一年这一月第一天星期几
    b=dayOftheWeekThisYearQueryMonth(year,month);
    for(i;i<b;i++)
    {
        printf("\t");//打印b-1个\t
    }
    for(i=1;i<=monthDays[month];i++)
    {
        printf("%d\t",i);//打印日期从1开始到这个查询月的最大天数结束,
        if((b+i)%7==0/*&&i<monthDays[month]*/)printf("\n");
        //换行,条件是b+i是7的整数,意味着这个数据就是在周六下打印,后面需要换行
    }
}
int dayOftheWeekThisYear(int year)
{
    int i=((5*(year-1)/4-(year-1)/100+(year-1)/400)%7)+1;
    return i;
    //蔡勒公式,此处是计算这一年的第一天是星期几
}
int dayOftheWeekThisYearQueryMonth(int year,int month)
{
    int i,totalDays=0;
    if(isLeapYear(year)==1)monthDays[2]=29;
    else monthDays[2]=28;//同样的修正数组,修正二月的天数
    for(i;i<month;i++)
    {
        totalDays+=monthDays[i];//计算这一年从一月到查询月之前的所有月份的天数和
    }
    totalDays=totalDays+dayOftheWeekThisYear(year);
    return (totalDays%7);
    //把这个天数和加上之前计算的查询年的第一天的星期几在进行计算,即可求出查询月的第一天是星期几
}
int isLeapYear(int year)
{
    return((year%4==0&&year%100!=0)||year%400==0);
    //判断是否润年
}

蔡勒公式

0.png

原文:https://www.cnblogs.com/faterazer/p/11393521.html

使用蔡勒公式计算某年一月一日的星期

星期几=(5(year-1)/4-(year-1)/100+(year-1)/400)%7+1

公式推导

首先不仅仅是1990年1月1号是星期一,公元1年1月1日它也是星期一。
然后大家都知道求星期几使用总天数余7 也就是 days%7 为了方便理解可以对结果进行+1。
假如没有闰年一说那么 year年的第一天之前有多少天呢?答案就是
(year-1)365
总结一下公式变成了 星期几=(year-1)
365%7+1
有人这时候就要说了最关键的闰年哪去了?好我们先要知道,闰年有366天,也就是比平年多一天,所以只要在原有的基础上加上闰年的数量就好了
闰年的数量为
(year-1)/4-(year-1)/100+(year-1)/400
这个不难理解吧,因为有被100整除不能被400整除的不算闰年。
接下来公式就完成了
星期几=((year-1)365+(year-1)/4-(year-1)/100+(year-1)/400)%7+1
看着长长的公式我们可以优化一下
365=364+1
(year-1)
365=(year-1)*364+(year-1)
364/7=52 我们要求余所以前面364那部分可以直接扔了。
公式变为
星期几=(5(year-1)/4-(year-1)/100+(year-1)/400)%7+1

image

原文:如何计算某年第一天星期几? - 简书 (jianshu.com)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容