用C语言编写一个日历

Python011

用C语言编写一个日历,第1张

# include <stdio.h>

# include <math.h>

void printmonth(int m)

void printhead(int m)

int daysofmonth(int m)

int firstday(int y)

int year,weekday

void main()

{

int i

printf("请输入年份:")

scanf("%d",&year)

weekday=firstday(year)

printf("\n\n")

printf(" %d年\n",year)

for(i=1i<=12i++)

{

printmonth(i)

printf("\n")

}

printf("\n\n")

}

void printmonth(int m) //打印每月日历

{

int i,days

printhead(m)

days=daysofmonth(m)

for(i=1i<=daysi++)

{

printf("%5d",i)

weekday=(weekday+1)%7

if (weekday==0) printf("\n ")

}

}

void printhead(int m) //打印每月的日历头(判定起始位置)

{

int i

printf("\n%d月 日 一 二 三 四 五 六\n",m)

printf(" ")

for(i=0i<weekdayi++)

printf(" ")

}

int daysofmonth(int m) //每月的天数

{

switch (m)

{

case 1:

case 3:

case 5:

case 7:

case 8:

case 10:

case 12:return 31

case 4:

case 6:

case 9:

case 11:return 30

case 2:if (((year%4==0 &&year%100!=0)||year%400==0))

return 29

else

return 28

default: return 0

}

}

int firstday(int y) //判断某年元旦是星期

{

double s

s=floor(year-1+(year-1)/4.0-(year-1)/100.0+(year-1)/400.0+1)

return (int)s%7

}

/*

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

*/

/*

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

}

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 

}