用C语言实现简单的日历

用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、功能要求 :

1)输入任一年将显示出该年的所有月份日期,对应的星期

2)注意闰年情况

其显示格式要求如下:

1)份:中文英文都可以,

2)下一行显示星期,从周日到周六,中英文都可以

3)下一行开始显示日期从1号开始,并按其是周几实际情况与上面的星期数垂直对齐

2、例程:

#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} //每个月的天数,最后一个是闰年2月

printf("Please enter the year: ") 

scanf("%d",&year)                    //输入年份

while(Year_Start < year)             //计算从公元1年1月1日到你所查询年份前一年的天数,是为了以后确定这一年的第一天是星期几

if( IsLeapYear( Year_Start ) )      //确定一年的天数,闰年为366天,一般为365天

Per_Year_Days = 366 

else 

Per_Year_Days = 365 

Year_days = Year_days + Per_Year_Days 

Year_Start++ 

for( temp = 1 temp <=12 temp++ )    //循环输出每个月的日历

switch( temp ) 

case 1: 

printf(" January(%d)\n",year)       //如 January(2008)

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                                //计算这个月第一天是星期几

printf("Mon Tue Wed Thu Fri Sat Sun\n") 

if( i != 0 ) 

for( temp_i = 0 temp_i < i temp_i++)        //第一天不是星期一,在前面补空格,本来的空格少了,我加了两个

printf("    ") 

day = 1 

if( IsLeapYear(year) && temp == 2)          //闰年的2月

while( day <= month_day[12] ) 

if( day >1 )                  

if( Year_days % 7 == 0 )      //如果不是1号且昨天是星期天,输入回车, 换行 

printf("\n") 

if( day >= 10 )               //如果大于或等于10号则输出日期并加2个空格,小于10号输出日期并加3个空格

printf("%d  ",day)            //开始没想到这几行是干嘛用的,只要一个输出就好嘛,后来才想到是用来调整格式的

 

else                           //只是他并没有调整好,我做了下修改,现在很整齐了

printf("%d   ",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  ",day) 

else 

printf("%d   ",day) 

Year_days++ 

day++ 

printf("\n") 

if( getch() == 'q' )             //输入q退出程序

exit(0) 

getch()                         

int IsLeapYear( int year )      //判断是否为闰年

if ((year %4 == 0) && (year % 100 != 0) ||     //年份能被4整除且不能被100整除 或者 能被400整除的为闰年

(year % 400 == 0) ) 

return 1 

else 

return 0 

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/bake/11320101.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存