求C语言编日历源代码的详细说明

我们班开始C语言实训课了,要设计论文还要答辩。我选择的是用C语言编一个日历。输入年份后就可以查询该年每个月的日历。我在网上搜索到了这么一个程序,然而我对C语言不是很精通,里面有很多内容看不懂,这样是应付不了答辩的。
所以,我想有劳大家在这个C程序中的重点部分进行详细的分析注释,以便能让我看明白。最后还能给我一些关于用C语言编日历的必需知识,比如闰年怎么计算,某一天是星期几怎么计算,等等。
很快(还有两周)就要答辩了,请大家能否快速点,谢谢了!

这个C语言编日历的源代码是:

#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)
{
if( IsLeapYear( Year_Start ) )
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);
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)
while( day <= month_day[12] )
{
if( day >1 )
if( Year_days % 7 == 0 )
printf("\n");
if( day >= 10 )
printf("%d ",day);
else
printf("%d ",day);
Year_days++;
day++;
}

else
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' )
exit(0);
}
getch();
}

int IsLeapYear( int year )
{
if ((year %4 == 0) && (year % 100 != 0) ||
(year % 400 == 0) )
return 1;
else
return 0;
}
其实我给出的那个编日历的程序已可以运行了,关键是要在程序内容旁边加以说明注释,以便能让我看得懂。而不是叫大家再令给一个编日历的程序,(除非你真的有更好的程序,但一定要编译成功的,像zm3777给的那个就不能运行,而且最好还是要加上注释)。
所以呢,大家最好还是就我给的那个程序给出一些详细的注释,以便我能应付答辩。我悬赏50分,而且感激不尽啊!!

/* 稍微改了下对齐格式,加了注释 */
/*
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个回答  2008-07-09
上面改过的源代码可以根据用户输入的年份,自动产生每个月的日期列表并自定义显示日历的形式吗?
第2个回答  2008-06-28
费劲啊!
程序略有修改,运行时更加美观。

#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) /*循环:统计多少天*/
{
if( IsLeapYear( Year_Start ) ) /*是否闰年*/
Per_Year_Days = 366;
else
Per_Year_Days = 365;

Year_days = Year_days + Per_Year_Days;
Year_Start++;
}

for( temp = 1; temp <=12; temp++ ) /*for循环开始打印各个月份*/
{
switch( temp )
{
case 1:
printf(" January(%d)\n",year); /*temp标注几月份*/
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;
}
printf(" Mon Tue Wed Thu Fri Sat Sun\n"); /*第一行打印每月星期*/
i = Year_days % 7; /* i 表示第一个星期空几天*/
if( i != 0 )
for( temp_i = 0; temp_i < i; temp_i++)
printf(" ");

day = 1; /* day表示几号,从1号开始*/
if( IsLeapYear(year) && temp == 2)/*闰年的2月*/
while( day <= month_day[12] ) /* day<=29 */
{
if( day >1 )
if( Year_days % 7 == 0 ) /*一个星期结束换行*/
printf("\n");
printf("%4d",day); /*排版需要: %4d 表示 几号显示4字节*/

Year_days++;
day++;
}
else /*开始处理其他月份(包括非闰年2月)*/
while (day <= month_day[temp-1])
{
if( day > 1 )
if( Year_days % 7 == 0 ) /*一个星期结束换行*/
printf("\n");
printf("%4d",day); /*排版需要: %4d 表示 几号显示4字节*/

Year_days++;
day++;
}
printf("\n");
if( getch() == 'q' ) /*打印完一个月份,暂停一下*/
exit(0); /* 输入:q 退出日历,其他字符返回for循环*/
}
getch(); /*打印完12个月份,暂停一下*/
}

int IsLeapYear( int year ) /*子函数:判断是否闰年*/
{
if ((year %4 == 0) && (year % 100 != 0) ||
(year % 400 == 0) )
return 1;
else
return 0;
}
第3个回答  2008-06-28
#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);

// 这个循环的作用是计算从公元1年到当前年的总天数
// 也就是Year_days(总天数)的值
while(Year_Start < year)
{
if( IsLeapYear(Year_Start))
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);
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;
}
// 因为公元1年的1月1日为星期一,所以用总天数Year_days除以7所得的
// 余数就是该天的星期数,余数为0则为星期天
i = Year_days % 7;
printf("---------------------------\n");
printf("Mon Tue Wed Thu Fri Sat Sun\n");

//打印一定量的空格,以便对齐相应的星期
while(i>0)
{
printf(" ");
i = i - 1;
}

day = 1; // 每个月日期从 1 开始

// 如果该年是闰年,则二月有29天
if(IsLeapYear(year) && temp == 2)
{
while(day <= month_day[12])
{
if(Year_days % 7 == 0)
printf("\n"); // 每一周换一行

// %3d为格式化输出语句,%d表示输出的是十进制数
// 若在d的前面加上一个数字,则表示用该数字的宽度来
// 输出相应参数表示的内容,这样便于数字的对齐
printf("%3d ",day);

// 每输出一天,则总天数增加1
Year_days = Year_days + 1;

// 该月的天数增加1
day = day + 1;
}
}
else
{
while (day < month_day[temp-1])
{
if(Year_days % 7 == 0)
printf("\n");
printf("%3d ",day);
Year_days = Year_days + 1;
day = day + 1;
}
}
printf("\n\n");
}
getch();
}

// 判断闰年
// <常识> 如果某年能被4或400整除(能被4整除时要除开100)则该年为闰年
//
int IsLeapYear( int year )
{
if ((year %4 == 0) && (year % 100 != 0) || (year % 400 == 0) )
return 1;
else
return 0;
}
第4个回答  2008-06-25
楼上的厉害啊!!!佩服啊!!!
相似回答