C语言年历显示程序设计

C语言年历显示程序设计,第1张

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

char* month[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nev","Dec"}

char* week[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}

int j_leapyear(int year) //定义函数检测输入年份是否为闰年

{

if((/*year%400==0*/year%4==0&&year%100!=0)||(year%400==0))

return (1)

// else if(year%4==0&&year%100!=0)

// return (1)

else return 0

}

int month_day(int year,int month) //检测该年月份有多少天

{

int mon_day[]={31,28,31,30,31,30,31,31,30,31,30,31}

if(j_leapyear(year)&&month==2)

return 29

else return (mon_day[month-1])

}

int j_week(int year,int month,int day) //检测该天是星期

{

int d=0,i //d表示该天在该年份的累计天数

int w

/* int month_day[]={31,28,31,30,31,30,31,31,30,31,30,31}

if(j_leapyear(year)==1)

month_day[1]=29

for(i=0i<monthi++)

d+=month_day[i]

d=d+day*/

for(i=1i<monthi++)

d+=month_day(year,i)

d+=day

w=(year-1)+(int)(year-1)/4-(int)(year-1)/100+(int)(year-1)/400+d//网上公式

return ((int)w%7)

}

int allyear(int year) //输出全年日历

{

int i,j,b

printf("\n%d 日历",year)

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

{

printf("\n\n\t%s\n",month[i-1])

// printf(" 7 1 2 3 4 5 6 \n")

printf(" S M T W T F S \n")

b=j_week(year,i,1)

for(j=1j<=month_day(year,i)+bj++)

{

if(j<=b)

printf(" ")

else if(j-b<10)

printf("%2d ",j-b)

else printf("%2d ",j-b)

//else printf("%2d ",j-b)

if(j%7==0)

putchar('\n')

}

putchar('\n')

}

return 0

}

void month_print(int year,int month) //输入一个年月,输出这个月的日历

{

int i,c,d

c=month_day(year,month)

printf("\n\n%d年%d月日历\n",year,month)

printf(" S M T W T F S \n")

d=j_week(year,month,1)

for(i=1i<=c+di++)

{

if(i<=d)

printf(" ")

else printf("%2d ",i-d)

if(i%7==0)

putchar('\n')

}

putchar('\n')

}

int jisuan_day(int year,int month,int day,int x,int y,int z) //输入年月日,输出距x年y月z日有多少天,星期几,以及是否是公历节日

{

int i,a,b,c=0,d=0,days=0,m=0,n=0,t

a=year>=x?year:x

b=year<x?year:x

if(a>b)

{

for(i=b+1i<ai++)

c+=j_leapyear(i)

}

else c=0

if(year!=x)

d=a-b-1

else d=0

m=365*d+c

if(year<x)

{

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

n+=month_day(year,i)

days=m+n+z-day

}

else if(year>x)

{

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

n+=month_day(x,i)

for(i=1i<monthi++)

n+=month_day(year,i)

days=m+n+day-z

}

else

{

for(i=month>=y?y:monthi<(month>=y?month:y)i++)

n+=month_day(x,i)

days=abs(day-z)+n //输出距离y月z日有多少天

}

printf("这天离%d年%d月%d号有%d天\n",x,y,z,days)

t=j_week(year,month,day)

if(t==0)//输出星期几

printf("这天星期日")

else if(t==1)

printf("这天星期一")

else if(t==2)

printf("这天星期二")

else if(t==3)

printf("这天星期三")

else if(t==4)

printf("这天星期四")

else if(t==5)

printf("这天星期五")

else if(t==6)

printf("这天星期六")

putchar('\n')

if(month==1&&day==1)

printf("这天是元旦节")

else if(month==2&&day==14)

printf("这天是情人节")

else if(month==3&&day==8)

printf("这天是妇女节")

else if(month==3&&day==12)

printf("这天是植树节")

else if(month==4&&day==1)

printf("这天是愚人节")

else if(month==4&&day==4)

printf("这天是清明节")

else if(month==5&&day==1)

printf("这天是劳动节")

else if(month==6&&day==1)

printf("这天是儿童节")

else if(month==8&&day==1)

printf("这天是建军节")

else if(month==9&&day==10)

printf("这天是教师节")

else if(month==10&&day==1)

printf("这天是国庆节")

else if(month==12&&day==25)

printf("这天是圣诞节")

else printf("这天不是特殊节日")

putchar('\n')

return days

}

void fish_or_net(int year,int month,int day) //判断是打鱼还是晒网

{

int q

int i,a,b,c=0,d=0,days=0,m=0,n=0

a=year>=1990?year:1990

b=year<1990?year:1990

if(a>b)

{

for(i=b+1i<ai++)

c+=j_leapyear(i)

}

else c=0

if(year!=1990)

d=a-b-1

else d=0

m=365*d+c

if(year<1990)

{

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

n+=month_day(year,i)

days=m+n+1-day

}

else if(year>1990)

{

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

n+=month_day(1990,i)

for(i=1i<monthi++)

n+=month_day(year,i)

days=m+n+day-1

}

else

{

for(i=month>=1?1:monthi<(month>=1?month:1)i++)

n+=month_day(1990,i)

days=abs(day-1)+n//先确定这天离1990年1月1日有多少天

}

q=days%5+1

if(q==1||q==2||q==3) //判断打鱼还是晒网

printf("渔人今天打鱼")

else printf("渔人今天晒网")

putchar('\n')

}

/*int main() //这部分内容用来校检

{

int j_leapyear(int year)

int month_day(int year,int month)

int j_week(int year,int month,int day)

int allyear(int year)

void month_print(int year,int month)

int jisuan_day(int year,int month,int day,int x,int y,int z)

void fish_or_net(int year,int month,int day)

int x,y,z,year,month,day

// allyear(2015)

//month_print(2016,12)

printf("请输入今天的日期(按年,月,日输入,如2016,1,14表示2016年1月14日):")

scanf("%d,%d,%d",&x,&y,&z)

printf("\n请随便输入一个日期,格式同上:")

scanf("%d,%d,%d",&year,&month,&day)

jisuan_day(year,month,day,x,y,z)

// fish_or_net(x,y,z)

return 0

} // 这部分内容是用来检测上述函数是否出错的

*/

int main()

{

int j_leapyear(int year)

int month_day(int year,int month)

int j_week(int year,int month,int day)

int allyear(int year)

void month_print(int year,int month)

int jisuan_day(int year,int month,int day,int x,int y,int z)

void fish_or_net(int year,int month,int day)//函数声明

int option,year,month,day,x,y,z

char ny

system("color 1f")

while (1)

{

printf("\n\n\t 欢迎来到由...编写的程序\n\n")

printf(" 请选择您需要的服务,输入编号回车结束\n")

printf(" 1.输入一个年份,输出该年的日历\n")

printf(" 2.输入年月,输出这个月的日历。\n")

printf(" 3.输入年月日,输出据今天还有多久,星期几,是否是公历节日。\n")

printf(" 4.某人自1990年1月1日开始打鱼,“三天打鱼,两天晒网”,输入一个1990年以后的日期,输出他这一天是打鱼还是晒网。\n")

printf(" 5.退出\n")

scanf("%d",&option)

switch(option) //switch分支结构

{

case 1:

while(1) //while循环,后面的1是常数,表示一直到break才结束循环

{

printf("请输入一个年份:")

scanf("%d",&year)

allyear(year)

printf("你想继续查询日历么?(y表示继续,n表示结束)")

scanf("%c",&ny)

if(ny=='n')

break

}

break

case 2:

while (1)

{

printf("输入年月:")

scanf("%d,%d",&year,&month)

month_print(year,month)

printf("你想继续查询日历么?(y表示继续,n表示结束):")

scanf("%c",&ny)

if(ny=='n')

break

}

break

case 3:

while (1)

{

printf("输入年月日:")

scanf("%d,%d,%d",&year,&month,&day)

printf("请输入今天的日期:")

scanf("%d,%d,%d",&x,&y,&z)

jisuan_day(year,month,day,x,y,z)

printf("你想继续查询么?(y表示继续,n表示结束):")

scanf("%c",&ny)

if(ny=='n')

break

}

break

case 4:

while (1)

{

printf("输入1990年1月1日以后的一个日期:")

scanf("%d,%d,%d",&year,&month,&day)

fish_or_net(year,month,day)

printf("你想继续查询渔人是打鱼还是晒网么?(y表示继续,n表示结束):")

scanf("%c",&ny)

if(ny=='n')

break

}

break

case 5:

while (1)

{

printf("确认么?y表示是的,n表示不是")

scanf("%c",&ny)

if(ny=='y')

exit(1) //表示退出程序

else if(ny=='n')

break

}

break

default:printf("对不起,暂时没有这个服务")

break

}

}

return 0

}

C语言程序如下:

#include<stdio.h>

#define YES   1           /* 定义符号常数“是” */

#define NO    0           /* 定义符号常数“否” */

/* 函数 isleap(): 判断某年是否闰年 */

int isleap(int year)

{

int leap = NO

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

leap = YES

return leap

}

/* 函数 week_of_newyears_day(): 求元旦是星期几 */

int week_of_newyears_day(int year)

{

int n = year-1900

n = n+(n-1)/4+1

n = n%7

return n

}

int main(int argc,char *argv[])

{

int year, month, day, weekday, len_of_month, i

printf("\n请输入某年年份: ")

scanf("%d",&year)

printf("\n请输入某年1月1日:")

scanf("%d",&weekday)

/*因为你的要求是已知2000年1月1日是星期六,所以这里不用week_of_newyears_day去求星期六了*/

/*weekday = week_of_newyears_day(year)    求元旦是星期几 */

printf("\n\n\n               %d年\n",year) /* 打印年份     */

for(month=1 month<=12month=month+1) /* 打印12个月的月历 */

{

printf("\n%d月份\n",month)

printf("------------------------------------------------------\n")

printf("星期日  星期一  星期二  星期三  星期四  星期五  星期六\n")

printf("------------------------------------------------------\n")

for(i=0i<weekdayi=i+1)       /* 找当月1日的打印位置 */

printf("        ")

if(month==4 || month== 6 || month==9 || month==11)

len_of_month = 30

else if(month==2)

{

if(isleap(year))

len_of_month = 29

else

len_of_month = 28

}

else

len_of_month = 31

for(day=1day<=len_of_monthday=day+1)/* 打印当月日期 */

{

printf("   %2d   ",day)

weekday = weekday+1

if(weekday==7)                /* 打满一星期应换行 */

{

weekday = 0

printf("\n")

}

}

printf("\n")                      /* 打完一月应换行  */

}

return 0

}

运行效果如图

/*不过除了没有查询某年某月某日是这一年的第几天。。和判断这一年的生肖外,都能满足你的要求。

加点金币帮你完善点!*/

#include<stdio.h>

int

Swiss(int

Years)

//判断是否是闰年

{

if(!(Years%100))

{

Years=Years/100

}

if(Years%4)

{

return

0

}

else

{

return

1

}

}

int

Number(int

Yearsa,int

Yearsb)

//已知两个年份,求出两个年份之间闰年的个数

{

int

i=Yearsa+1

int

mou=0

do{

if(Swiss(i))

{

mou++

}

i++

}while(i<Yearsb)

return

mou

}

int

Mvalue(int

Years,int

Month,int

Day)

//已知年月日,求出某年某月某日是星期几

{

int

M[12]={0,3,3,6,1,4,6,2,5,0,3,5}

//月值

int

N=6

//年值初始化

int

a

if(Years<2006)

//求年值,年值以2006年为基数

{

N=6-((2006-Years)%7)-Number(Years,2006)

if(Swiss(Years))

{

if(Month<3)

{

N--

}

}

}

else

if(Years>2006)

{

N=((Years-2006)%7)-1+Number(2006,Years)

if(Swiss(Years))

{

if(Month>2)

{

N++

}

}

}

a=(Day+M[Month-1]+N)%7

//某年某月某日是星期几=(日值+月值+年值)%7

return

a

}

int

Amonth(int

Month)

//已知月,求出这个月是大月还是小月

{

switch(Month)

{

case

1:

case

3:

case

5:

case

7:

case

8:

case

10:

//1,3,5,7,8,10,12是大月,没月31天

case

12:return

1

case

4:

case

6:

case

9:

case

11:return

0

//4,6,9,11是小月,每月30天

case

2:return

2

//二月份

}

return

-1

}

void

main

()

{

int

Dtable[7][7]

int

i,j

int

Years=9999

int

Month=12

int

Day=1

int

b

for(i=0i<7i++)

//初始化数组

{

Dtable[0][i]=i

}

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

{

for(j=0j<7j++)

{

Dtable[i][j]=0

}

}

i=Mvalue(Years,Month,Day)

switch(Amonth(Month))

{

case

0:b=30break

case

1:b=31break

case

2:if(Swiss(Years))b=29else

b=28break

//闰年2月29天,平年二月28天

default:b=-1break

}

for(i<7i++)

{

Dtable[1][i]=Day++

}

for(i=2i<7i++)

{

for(j=0j<7j++)

//建造日历表

{

if(Day<=b)

{

Dtable[i][j]=Day++

}

else

{

continue

}

}

}

printf("%d:%d\n",Years,Month)

for(i=0i<7i++)

//输出日历表

{

for(j=0j<7j++)

{

printf("%3d",Dtable[i][j])

}

printf("\n")

}

getch()

//完毕!

}


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

原文地址: http://outofmemory.cn/yw/11340356.html

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

发表评论

登录后才能评论

评论列表(0条)

保存