c万年历系统课程设计报告.docx
《c万年历系统课程设计报告.docx》由会员分享,可在线阅读,更多相关《c万年历系统课程设计报告.docx(13页珍藏版)》请在冰豆网上搜索。
![c万年历系统课程设计报告.docx](https://file1.bdocx.com/fileroot1/2023-1/2/8289edfa-c140-4de0-935b-a463203f24a9/8289edfa-c140-4de0-935b-a463203f24a91.gif)
c万年历系统课程设计报告
学号
2016-2017学年第2学期
1608220203
《高级语言程序课程设计》
课程设计报告
题目:
万年历系统
专业:
网络工程(对口)
班级:
16(3)
姓名:
代应豪
指导教师:
代美丽
成绩:
计算机学院
2017年4月25日
目录
1.设计内容及要求2
1.1课程设计的内容2
1.2课程设计的要求2
2.概要设计3
2.1系统总体设计3
2.2功能模块设计3
3.设计过程或程序代码4
3.1算法提示:
4
3.2程序源代码5
4.设计结果与分析15
4.1设计结果15
4.2程序分析18
1.设计内容及要求
1.1课程设计的内容
设计编写一个C程序—“万年历”。
本程序是一个万年历程序,可以查询1901年到9999年中任意一天是星期几,只要在运行程序时按照要求输入年,月,日,程序就会把这一天是星期几显示在屏幕上;也可以输入一个年份和一个月份,程序就会把该月份的月历显示在屏幕上,使人一目了然。
1.2课程设计的要求
1:
程序的功能多样;
2:
输入日期能够判断该日期是星期几;
3:
输入一个年份能够显示出该年的全部月历;
4:
输入一个年月能够显示该月的月历;
5:
输入一个年份能够判断该年是闰年还是平年;
6:
能够退出。
2.概要设计
2.1系统总体设计
通过此次课程设计可以复习巩固C语言的基础知识的同时,进一步加深对C语言的理解和掌握。
主要的设计思想是通过不同的函数模块来实现并调用的,将不同的数据结构组成一个整体就是此次设计的系统概要。
2.2功能模块设计
本系统包括4个模块,分别是闰年判断模块、星期计算模块、月历查询模块和打印整年日历模块。
(1) 闰年判断模块。
该模块用于输入一个年份能够判断该年是闰年还是平年。
(2) 星期计算模块。
该模块主要是输入日期能够判断该日期是星期几。
(3) 月历查询模块。
该模块是系统的核心模块,是用来显示指定日期所在月份的月历,包括打印指定个数的空格、打印分隔线。
(4) 打印整年日历模块。
该模块用于输入一个年份能够显示出该年的全部月历
3.设计过程或程序代码
3.1算法提示:
1.功能结构框图:
2.闰年的判断:
计算所输入的年份是否可被4整除,若不能被整除,为平年。
若可被4整除,计算此年份能否被100整除,不能被100整除则为闰年。
既能被4整除,也能被100整除的年份,若也能被400整除,则为闰年,否则为平年。
闰年366天,平年365天
3.2程序源代码
#include
#include
char*NameOfMonth[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
char*WeekDay[7]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
intIsLeapYear(intyear)
{
if(year%4==0&&year%100!
=0||year%400==0)
{
return1;//闰年返回1
}else
{
return0;//平年返回0
}
}
intDateCheck(intuYear,intuMonth,intuDay)//合法返回true,非法或超出范围返回false
{
if(uYear<1901||uYear>9999||uMonth<1||uMonth>12||uDay<1||uDay>31)
{
return0;
}
if(uMonth==4||uMonth==6||uMonth==9||uMonth==11)
{
if(uDay>30)
{
return0;
}
}elseif(uMonth==2)
{
if(IsLeapYear(uYear))
{
if(uDay>29)
{
return0;
}
}else
{
if(uDay>28)
{
return0;
}
}
}
return1;
}
intGetDays(intyear,intmonth,intday)
{
intsum=0;
if(DateCheck(year,month,day)==0)
{
return-1;//日期有误
}
if(year>=1901)
{
intX=(int)(year/100);//世纪数
intY=X-(int)(X/4);//如果按4年一闰来算,Y指的是比实际上多算的天数,在下面需要减去
if(month<=2&&month>0)
{
year--;//把1月、2月视为上一年的13月、14月(纯粹为了计算需要)
month+=12;
}
sum=(int)(365.25*(year-1900))+(int)(30.6*(month+1))+day-Y-49;//以365.25(本来实际太阳年是365.2425天)来计算是为了计算按4年一闰的整数年总天数,加上月份天数再加上余下天数,减掉多闰天数,再减掉一个偏差值(多加的)
//月份以30.6天的平均值计算。
最后减去的49,是多加的一个月以及其余相差天数的和,可得到1900年1月1日的积日为0
}
returnsum;//返回距离1900年1月1日的总天数(积日)
}
intGetDayOfMonth(intmonth,intyear)
{
inttmp_days=GetDays(year,month,1);//本月积日
intDayOfMonth=0;
month++;//下个月
if(month>12)
{
month=1;//遇到月份为12月的情况,月份为1,年份加1
year++;
}
DayOfMonth=GetDays(year,month,1);//下个月的积日
DayOfMonth-=tmp_days;//下月1日的总天数(距离1900年1月1日的积日)减去当前月1日的总天数
returnDayOfMonth;//返回当前月总天数
}
intShowCalendar(intyear,intmonth,intday)
{
inti,j,count;
intjiri=0;//积日
intdayofweek=0;//星期
if(DateCheck(year,month,day)==0)
{
printf("输入日期有误!
\r\n");//日期不合法或超出范围,年历从1901年开始
return0;
}
printf("\t%d%s\r\n",year,NameOfMonth[month-1]);
printf("--------------------------------------\r\n");
printf("SunMonTueWedThuFriSat\r\n");
printf("--------------------------------------\r\n");
jiri=GetDays(year,month,1);//获取距离1900年1月1日的总天数
dayofweek=(1+jiri)%7;//月首星期,因为1900年1月1日星期一
count=GetDayOfMonth(month,year);
for(i=0;i{
printf("");//填充前面空格
}
for(i=1,j=dayofweek;i<=count;i++,j++)
{
if(i<10)
{
printf("%d",i);
}else
{
printf("%d",i);
}
if((j+1)%7==0)
{
if(i!
=count)
{
printf("\r\n");//满7天,换行
}
}
}
printf("\r\n--------------------------------------\r\n\r\n");
return1;
}
intmain()
{
intyear,month,day,nChoise=0;
inttotaldays=0;
while
(1)//主循环
{
printf("******************欢迎使用万年历********************\r\n");
printf("*菜单*\r\n");
printf("*1.闰年判断2.星期计算*\r\n");
printf("**\r\n");
printf("*3.月历查询4.打印整年日历*\r\n");
printf("**\r\n");
printf("****************************************************\r\n");
printf("输入对应的序号进行相关操作:
Choise>");
scanf("%d",&nChoise);
switch(nChoise)
{
case1:
printf("请输入要判断的年份:
Year>");
scanf("%d",&year);
if(year<1900||year>9999)
{
printf("输入年份超出范围!
");
break;
}
if(IsLeapYear(year)==1)
{
printf("%d年是闰年!
\r\n\r\n",year);
}else
{
printf("%d年不是闰年!
\r\n\r\n",year);
}
break;
case2:
printf("请输入要判断的日期:
YearMonthDay>");
scanf("%d%d%d",&year,&month,&day);
totaldays=GetDays(year,month,day);
printf("%d年%d月%d日是%s\r\n\r\n",year,month,day,WeekDay[(totaldays+1)%7]);
break;
case3:
printf("请输入要显示的月份:
YearMonth>");
scanf("%d%d",&year,&month);
ShowCalendar(year,month,1);
break;
case4:
printf("请输入要判断的年份:
Year>");
scanf("%d",&year);
for(month=1;month<=12;month++)
{
ShowCalendar(year,month,1);
}
break;
default:
printf("无效的菜单项!
\r\n");
break;
}
system("pause");
system("cls");
}
return0;
}
4.设计结果与分析
4.1设计结果
1.登陆界面
2.闰年判断
3.星期计算
4.月历查询
5.打印整年日历
4.2程序分析
程序首先根据用户输入的序号,进行相关的操作,首先根据year判断是否是闰年,如果是则需要将该年2月份的天数设置为29天,接着判断day是否超过month所在月份的最大天数,如果超过则显示提示信息。
然后进行星期的判断,如果输出的是该月的第一个星期,则判断该星期中还有几天在本月,输出空格。
输出完第一周后,接着输出第二到第五周,每周7天。
实现思路:
实现该程序一定要找准一个几点,比如找准2000年1月1日是星期几,然后在此基础上推出具体某天和这个几点之间相差多少天,然后推出该天是星期几,注意显示的时候格式要对齐。