当前位置:文档之家› C语言实训题目设计报告 万年历

C语言实训题目设计报告 万年历

C语言实训题目设计报告:万年历系统
1、题目设计:
设计一个万年历系统
功能要求:
(1)从2000年开始,用户输入年份与月份,将显示出该年该月份的日历,对应的星期。

(2)用户输入年份,将显示该年的日历
(3)注意闰年情况
显示格式要求如下:
(1)第一行显示月份(中英文都可以)
(2)下一行显示星期,从周日到周六,中英文都可以
(3)下一行开始显示日期从1号开始,并按其是星期几实际情况与上面的星期数垂直对齐
(4)程序输出菜单,用户按照提示操作,最终得到计算结果。

2、问题分析:
该程序可大致分成主菜单、年历、月历3个部分,并且还有判断是否为闰年、月份的天数、该月第一天为周几三个小模块,并可由年历、月历调用,年历、月历可由主菜单调用。

最后可以考虑一下界面的优化和输入错误等小问题。

3、算法设计:
主菜单部分:用户输入选项,用一个switch语句来进行接下来的任务,其中有一个选项是用来退出的。

在进行到程序结尾的时候用goto语句来实现回到函数最开始的目的。

月历部分:从键盘接收年份和月份,通过小函数来获得本月的天数和本月一号是周几,从而在屏幕上输出月历。

在到周末的时候换行。

年历部分:大体思路和月历相似,只是多用了一个for循环,使得月份从一月一直到十二月(其实这部分我是复制的月历部分的)。

判断闰年部分:输入年份,输出1或0。

判断天数部分:输入年份,月份,输出天数。

其中有调用闰年的函数。

判断周几部分:输入年,月,日,输出是周几的信息。

4、程序源代码:
#include<stdio.h>
#include<color.h>
#include<conio.h>
int ifren(int year)//判断是否是闰年
{
if(year%4==0&&year%100!=0||year%400==0)
return 1;
else
return 0;
}
int monthday(int month,int year)//判断这个月有多少天
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12) return 31;
if(month==4||month==6||month==9||month==11)
return 30;
if(month==2&&ifren(year)==1) return 29;
else return 28;
}
int firstday(int month,int year)//判断本月一日是周几
{
int w;
if(month==1||month==2)
{
month+=12;
year=year-1;
}
w=(1+2*month+3*(month+1)/5+year+year/4+year/400-year/100)%7+1; //蔡勒公式return w;
}
void yueli()
{ int i,k=1,startday,monthdays,month,year;//k是第几周的标志
system("cls");
printf("=======================================================\n输入年份:");
scanf("%d",&year);
printf("输入月份:");
scanf("%d",&month);
monthdays=monthday(month,year);
startday=firstday(month,year);
printf("\t\t\t%d月\n",month);
printf(" Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");
if(startday==7)
{
for(i=1;i<=monthdays;i++)
{
printf("%d\t",i);
if(i%7==0)
{
printf("\n");
}
}
}
if(startday!=7)
{
for(i=1;i<=startday;i++)
{
printf("\t");//把每月1日之前的空格打出来
}
for(i=1;i<=monthdays;i++)
{
printf("%d\t",i);
if(i==7*k-startday)
{
printf("\n");
k++;
}
}
}
printf("\n\n");
}
void nianli()
{
int i,j,k,startday,monthdays,month,year;
system("cls");
printf("=======================================================\n输入年份:");
scanf("%d",&year);
for(month=1;month<=12;month++)
{
k=1;
monthdays=monthday(month,year);
startday=firstday(month,year);
printf("\t\t\t%d月\n",month);
printf(" Sun\tMon\tTue\tWed\tThu\tFri\tSat\n");
if(startday==7)
{
for(i=1;i<=monthdays;i++)
{
printf("%d\t",i);
if(i%7==0)
{
printf("\n");
}
}
}
if(startday!=7)
{
for(j=1;j<=startday;j++)
{
printf("\t");
}
for(i=1;i<=monthdays;i++)
{
printf("%d\t",i);
if(i==7*k-startday)
{
printf("\n");
k++;
}
}
}
printf("\n\n");
}
}
int main()
{
restart:
printf("\n\n\n\n");
printf("=======================================================\n\n");//主菜单
printf("== 万年历==\n\n");
printf("== 1、月历==\n\n");
printf("== 2、年历==\n\n");
printf("== 3、退出==\n\n");
printf("=======================================================\n\n");
printf("输入数字,来执行相应的功能\n");
int select;
scanf("%d",&select);
switch (select)
{
case 1:yueli();break;
case 2:nianli();break;
case 3:system("cls");exit(0);break;
default:printf("输入错误!\n祖さま、すごいですね!\n");
}
system("pause");//弄成可以在windows下人性化运行
system("cls");
goto restart;
return 0;
}
截图:
主菜单:
月历:年历:
5、使用说明:
打开程序后,依照主菜单的提示输入数字选择功能,进行万年历的查阅。

6、遇到的问题及解决方法:
我认为通过输入年份、月份来判断本月一号是周几是一个难点。

我是上网找了一个公式才解决的这个问题。

而通过自己的方法则需要很长的代码,而且还会出错。

7、小结:
万年历的设计其实不是一个非常难的问题。

它的关键问题在于怎样通过日期来判断周几,另外就是几个函数之间的调用不能出现问题,其它的也不会涉及到链表的使用或者文件的读写方面的问题,总之不是特别难。

另外,主菜单部分也可以用while(scanf()!=EOF)的方式来写。

相关主题