用C语言实现简单的日历

Python09

用C语言实现简单的日历,第1张

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

首先不仅仅是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

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

/*

稍微改了下对齐格式,加了注释

*/

/*

1、闰年的算法:

如果某年能被4整除但不能被100整除,

或者能被400整除,

则该年是闰年.

用表达式表示就是

(year

%4

==

0

&&

year%100

!=

0)

||

(year%400

==

0)

2、计算某一天是星期几:

已知1900年的1月1号为星期一,

然后就可以用某一天和1900年的1月1号相差的天数对7取余来求星期,

本题是用的公元1年的1月1号作为基准

*/

#include

<stdio.h>

#include<conio.h>

#include<stdlib.h>

int

IsLeapYear(int)

//函数定义

void

main()

{

int

i

int

day

int

year

int

temp

int

temp_i

long

int

Year_days

=

0

int

Year_Start

=

1

int

Per_Year_Days

int

month_day[]={31,28,31,30,31,30,31,31,30,31,30,31,29}

printf("Please

enter

the

year:

")

scanf("%d",&year)

//输入年份

while(Year_Start

<

year)

//从公元1年开始执行while循环,

该年的一月一号为星期一

{

if(

IsLeapYear(

Year_Start

)

)

Per_Year_Days

=

366

//如果是闰年,

则一年有366天

else

Per_Year_Days

=

365

//如果不是闰年,

则一年有365天

Year_days

=

Year_days

+

Per_Year_Days

//Year_days为从公元1年到输入年份的前一年的天数的总和

Year_Start++

}

for(

temp

=

1

temp

<=12

temp++

)

//temp从1到12,

对应一年内12个月

{

switch(

temp

)

//用switch语句将temp和12个月对应起来

{

case

1:

printf("

January(%d)\n",year)

//一月

break

case

2:

printf("

February(%d)\n",year)

//二月

break

case

3:

printf("

March(%d)\n",year)

//三月

break

case

4:

printf("

April(%d)\n",year)

//四月

break

case

5:

printf("

May(%d)\n",year)

//五月

break

case

6:

printf("

June(%d)\n",year)

//六月

break

case

7:

printf("

July(%d)\n",year)

//七月

break

case

8:

printf("

August(%d)\n",year)

//八月

break

case

9:

printf("

September(%d)\n",year)

//九月

break

case

10:

printf("

October(%d)\n",year)

//十月

break

case

11:

printf("

November(%d)\n",year)

//十一月

break

case

12:

printf("

December(%d)\n",year)

//十二月

break

}

i

=

Year_days

%

7

//每个星期有7天,

故用每年的天数对7取余

printf("Mon\tTue\tWed\tThu\tFri\tSat\tSun\n")

if(

i

!=

0

)

//如果余数不为零

for(

temp_i

=

0

temp_i

<

i

temp_i++)

printf("\t")

//则打印空格(这里用\t代替空格,

更加美观),

空格数为i

day

=

1

//初始化day为1,

为下面的while循环做准备

if(

IsLeapYear(year)

&&

temp

==

2)

//如果输入的年份是闰年,

并且月份为2

while(

day

<=

month_day[12]

)

//day为一循环变量,

取值为1-365(闰年的话为1-366)

{

if(

day

>1

)

//如果天数大于一

if(

Year_days

%

7

==

0

)

//如果是星期日,

则换行

printf("\n")

if(

day

>=

10

)

printf("%d\t",day)

//打印天数+空格

else

printf("%d\t",day)

Year_days++

day++

}

else

//如果不满足"输入的年份是闰年,

并且月份为2"

while

(day

<=

month_day[temp-1])

{

if(

day

>

1

)

if(

Year_days

%

7

==

0

)

printf("\n")

if(

day

>=10

)

printf("%d\t",day)

else

printf("%d\t",day)

Year_days++

day++

}

printf("\n")

if(

getch()

==

'q'

)

//如果输入为q,

则退出程序

exit(0)

}

getch()

//每按一次键,

打印一个月份

}

int

IsLeapYear(

int

year

)

{

//判断是否是闰年,

是则返回1,

否则返回0

if

((year

%4

==

0)

&&

(year

%

100

!=

0)

||

(year

%

400

==

0)

)

return

1

else

return

0

}