资源描述
课程设计报告
课程设计报告题目:年历显示系统
姓 名:XXX
学 号:XXXX
专 业:XXXX
班 级: XXXX1
指导教师:XXX
职 称:XXX
2012年 6 月 20 日
目 录
1.摘要 3
2.设计要求 3
3.思想构架 4
4.程序 4
5.程序运行界面 9
6.总结 13
7.参考文献 ..........................................13
1.摘要
C语言是近年在国内外得到迅速推广应用的一种语言。C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。因此,C语言特别适合于编写各种软件。
目前流行的计算机日历程序,比较典型的是Windows各版本中的日历程序以及基础于该程序所开发的各种应用程序中的日历程序。然而,这些程序都千篇一律的局限在一个很短的时间范围内。(Windows各个版本一般都局限在1980年至2099年这一范围内),但是,在很多情况下,特别是在众多的科学研究领域中,一个时间跨度较大的日历程序是很有参考价值的。C程序设计语言充分发挥了其自身无与伦比的优越性,用极短的程序文本填补了这一领域的空白,同时用铁的事实强有力的告诉世人:C程序设计语言作为计算机语言家族的新生事物,其发展前景是极为广阔的。
【关键字】C语言 计算机日历程序
2.设计要求
输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间;
1、输入年,输出该年的日历。
2、输入年月,输出该月的日历。
3、输入年月日,输出距今天还有多少天,星期几,是否是公历节日。
3.思想构架
3.1闰年问题:
每400年整一闰,或每4年且不为百年的一闰。(原因:地球绕太阳一周的时间是365天5小时46秒,为了使一年的天数为整数,将一年的天数定为365天,余下的时间积累起来,四年就是23小时15分4秒,将近一天,把这一天加在某年的二月而成29天,该年称为闰年,其它年称为平年。但四年加一天又多用了44分56秒,这个数积满400年为三天。因此400年中只能有97个闰年,所以凡能被400整除,或不能被100整除但能被4整除的年份为闰年。)
所以百年%4=0闰或(年%4=0并且年<>0)闰。
每 4年(3个平年+1个闰年)共208周+5天 ——注意这个“5天”百年共100*(208周+5天)-1天=5217周+5天 ——注意这个“5天”(整百年暂设为平年)每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和“1天”(4个整百年只有一个闰年)即400年一个轮回!
4.程序
#include <stdio.h>
int monthdays[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int leapyearmonthdays[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int year=2011;
int month=4;
int day=22;
int isweekday(int y,int m,int d)
{
int weekday;
if(m<3)
{
m+=12;
y--;
}
return weekday=(2+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
}
int isleapyear(int y)
{
if (y%400==0 || y%100!=0 && y%4==0)
return 1;
return 0;
}
void print_month(int y,int m)
{
int i=0;
int startday=isweekday(y,m,1);
printf("\n%4d/%02d\n",y,m);
printf("*****************************\n");
for(i=0;i<startday;i++)
{
printf(" ");
}
if(isleapyear(y))
{
for(i=1;i<=leapyearmonthdays[m-1];i++)
{
printf("%3d ",i);
if((startday+i)%7==0)
printf("\n");
}
}
else
{
for(i=1;i<=monthdays[m-1];i++)
{
printf("%3d ",i);
if((startday+i)%7==0)
printf("\n");
}
}
printf("\n*****************************\n");
}
void print_year(int y)
{
int i;
for(i=1;i<=12;i++)
{
print_month(y,i);
}
}
int counterdays(int y,int m,int d)
{
int temp=0;
int days=0;
int i;
for(i=year+1;i<y;i++)
{
if(isleapyear(i))
temp++;
}
if(y-year>=1)
{
if(isleapyear(year) && month<=2)
temp++;
if(isleapyear(y) && m>2 ||(m==2 && d==29))
temp++;
for(i=month+1;i<=12;i++)
{
days+=monthdays[i-1];
}
for(i=1;i<m;i++)
{
days+=monthdays[i-1];
}
days+=(y-year-1)*365;
}
if(!(year==y && month==m))
{
days+=monthdays[month-1]-day+d;
}
else
{
days+=d-day;
}
days+=temp;
printf("\n今天距%d/%d/%d还有%d天\n",y,m,d,days);
return days;
}
void setday(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
void main()
{
int temp;
int y,m,d;
char ch;
do{
printf("请输入要查询的方式(1.查询年历2.查询月历3.计算日期4.设置当前日期(%d/%d/%d)):",year,month,day);
scanf("%d",&temp);
switch(temp)
{
case 1:
printf("请输入年份(ep:2011):");
scanf("%d",&y);
print_year(y);
break;
case 2:
printf("请输入年月(ep:2011/4):");
scanf("%d/%d",&y,&m);
print_month(y,m);
break;
case 3:
printf("请输入日期(ep:2011/4/22):");
scanf("%d/%d/%d",&y,&m,&d);
counterdays(y,m,d);
break;
case 4:
printf("请输入当天日期(ep:2011/4/22):");
scanf("%d/%d/%d",&y,&m,&d);
setday(y,m,d);
break;
default:
break;
}
printf("\n\n是否继续?(Y键继续,任意键退出)");
getchar();
scanf("%c",&ch);
}while(ch=='y' || ch=='Y');
}
5.程序运行界面
选择查询方式
输入年,查询该年的日历。
先设置当前日期,再计算日期。
输入年月,查询该月的日历。
6.总结
通过本项课程设计也培养了我独立思考、综合运用所学有关相应知识的能力,掌握工程软件设计的基本方法,强化上机动手编程能力,闯过理论与实践相结合的难关!
在这次课程设计中也知道了自己的动手能力不强有待进一部的提高!在设计过程中不能够把书本上的知识与实践相结合,这也就增加了设计不好该程序的想法!在设计过程中的一次次设计错误增加了我放弃的想法!不过经过我的努力终于完成了课程设计!完成该程序后想起自己以前的每一次对自己失去信心,就觉得并不是在知识掌握上打败了,而是自己对自己缺乏信心!只要自己对自己不失去信心相信就可以完成那些以前认为完成不了的事情!也让我懂得了要想成功首先就必须有很强的自信心!
7.参考文献
源程序参考网址:
东华理工大学
学年课程设计报告评分表
学生姓名: XX 学号: XXXX 班级: XXXX
课程设计题目:
项目内容
满分
实 评
选
题
能结合所学课程知识、有一定的能力训练。符合选题要求
(3人一题)
5
工作量适中,难易度合理
10
能
力
水
平
能熟练应用所学知识,有一定查阅文献及运用文献资料能力
10
理论依据充分,数据准确,公式推导正确
10
能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等
10
能体现创造性思维,或有独特见解
15
成
果
质
量
模型正确、合理,各项技术指标符合要求。
15
摘要叙述简练完整,假设合理、问题分析正确、数学用语准确、结论严谨合理;问题处理科学、条理分明、语言流畅、结构严谨、版面清晰
15
课程设计报告主要部分齐全、合理,符号统一、编号齐全。 格式、绘图、表格、插图等规范准确,符合课程设计报告要求
10
正文字数不少于2000字,不超过15000字
5
总 分
100
指导教师评语:
指导教师签名:
年 月 日
14
展开阅读全文