、电子万年历:用C语言设计一个年历系统,功能要求: (1)输入任一年将显示出该年的所有月份日期,对应的

电子万年历:用C语言设计一个年历系统,功能要求:
(1)输入任一年将显示出该年的所有月份日期,对应的星期
(2)注意闰年情况
其显示格式要求如下:
Input the year:2004
The calendar of the year 2004.
Januray 1 February 2
Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat
1 2 3 1 2 3 4 5 6 7
4 5 6 7 8 9 10 8 9 10 11 12 13 14
11 12 13 14 15 16 17 15 16 17 18 19 20 21
18 19 20 21 22 23 24 22 23 24 25 26 27 28
25 26 27 28 29 30 31 29
========================== =========================

/*
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个回答  2011-01-15
#include<stdio.h>
#include<stdlib.h>

int isLeap(int year);
int maxDay(int year,int month);
int eachYearTotal(int year,int month,int day);
int week(int year,int month,int day);
char *chineseWeek(int numb$r);
void output(int year,int month,int day);
void display(int year,int month);
int check(int year,int month,int day);
void display1(int year);
void display2(int year,int month);
void display3(int year,int month,int day);
void getMenu();

void main()
{
int year,month,day,flag,select; /*flag是标志,select是选择*/
while(1)
{
getMenu();
printf("请输入你的选择: ");
fflush(stdin); /*刷新缓冲区的函数*/
scanf("%d",&select);
fflush(stdin); /*刷新缓冲区的函数*/
switch(select)
{
case 1:
do
{
printf("请输入年: ");
scanf("%d",&year);
flag=check(year,1,1);
if(flag==0)
{
printf("输入无效\n");
}
}while(flag==0);
display1(year);
break;
case 2:
do
{
printf("请输入年月: ");
scanf("%d%d",&year,&month);
flag=check(year,month,1);
if(flag==0)
{
printf("输入无效\n");
}
}while(flag==0);
display2(year,month);
break;
case 3:
do
{
printf("请输入年月日: ");
scanf("%d%d%d",&year,&month,&day);
flag=check(year,month,day);
if(flag==0)
{
printf("输入无效\n");
}
}while(flag==0);
display3(year,month,day);
break;
case 4:
exit(0);
default:
printf("输入有误!\n\n");
}
}
}

int isLeap(int year) /*判断是否是闰年*/
{
if(year%4==0&&year%100!=0||year%400==0)
return 1;
else
return 0;
}

int maxDay(int year,int month) /*每月天数*/
{
int a[]={31,28,31,30,31,30,31,31,30,31,30,31};
if(isLeap(year))
a[1]=29;
return a[month-1];
}

int eachYearTotal(int year,int month,int day) /**/
{
int i,sum=0;
for(i=1;i<month;i++)
{
sum+=maxDay(year,i);
}
sum+=day;
return sum;
}

int week(int year,int month,int day)
{
int number=(year-1)+(year-1)/4-(year-1)/100+(year-1)/400+eachYearTotal(year,month,day);
number%=7;
return number;
}

char *chineseWeek(int number)
{
switch(number)
{
case 0:
return "星期日";
case 1:
return "星期一";
case 2:
return "星期二";
case 3:
return "星期三";
case 4:
return "星期四";
case 5:
return "星期五";
case 6:
return "星期六";
default:
return "error";
}
}

void output(int year,int month,int day)
{
int number=week(year,month,day);
printf(" 公元%d年%d月%d日%10s\n\n",year,month,day,chineseWeek(number));
}

void display(int year,int month)
{
int max,number,i,j=1;
max=maxDay(year,month);
number=week(year,month,1);
printf("%4s%4s%4s%4s%4s%4s%4s\n","日","一","二","三","四","五","六");
for(i=0;i<number;i++)
{
printf(" ");
}
while(j<=max)
{
printf("%4d",j);
if(i%7==6)
{
printf("\n");
}
i++;
j++;
}
printf("\n\n");
}

int check(int year,int month,int day)
{
if(year<0||month<1||month>12||day<1||day>maxDay(year,month))
return 0;
else
return 1;
}

void display1(int year)
{
int i;
printf("\n");
for(i=1;i<=12;i++)
{
printf(" 公元%d年%d月\n\n",year,i);
display(year,i);
}
}

void display2(int year,int month)
{
printf("\n 公元%d年%d月\n\n",year,month);
display(year,month);
}

void display3(int year,int month,int day)
{
printf("\n");
output(year,month,day);
display(year,month);
}

void getMenu()
{
printf("1.年历\t2.月历\t3.日历\t4.退出\n");
}
相似回答