课程设计用C语言设计一个年历系统Word文档下载推荐.docx
- 文档编号:18528366
- 上传时间:2022-12-19
- 格式:DOCX
- 页数:11
- 大小:424.19KB
课程设计用C语言设计一个年历系统Word文档下载推荐.docx
《课程设计用C语言设计一个年历系统Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《课程设计用C语言设计一个年历系统Word文档下载推荐.docx(11页珍藏版)》请在冰豆网上搜索。
2122232425262718192021222324
28293031252627282930
功能要求:
⑴输入任一年将显示出该年的所有月份日期,对应的星期,输出的格式如上表要求(注意闰年情况);
⑵输入任意日期(包括年、月、日,格式有yyy/mm/dd、dd/mm/yyyy、mm/dd/yyyy、和yyyy,mm,dd、mm,dd,yyyy、dd,mm,yyyy六种基本情况),要求能够显示出该日期是本年的哪一周,是星期几。
2解决问题的主要思路和方法
2.1关键问题
1、输入任一年将显示出该年的所有月份日期,对应的星期,但是要并排月份,还要注意闰年情况。
2、一个月份中开始和最后对应的星期可能是上个月或下个月的天数,但是要空出来。
3、输入任意日期,然后要显示出该日期是本年的哪一周,星期几。
2.2拟采用解决问题的方法
1、先判断输入的年份是否是闰年。
2、用基姆拉尔森计算公式去计算某年第一天是星期几。
3、月份的日子可以用for语句去实现,特别的,一个月份中开始和最后对应的星期可能是上个月或下个月的天数,因此要用for语句去腾空。
4、根据输入的日期和基姆拉尔森公式的变换得出能计算出该日期是本年的哪一周,是星期几的公式。
5、熟悉运用一些没学过的函数,如strcat,sprintf,strlen函数。
2.3主要算法和处理流程图
3程序实现
3.1程序实现时应考虑的问题
3.2主要源代码及说明
intjudge(intyear,intmonth)//定义judge函数
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
return
(1);
//返回1时,表示天数为31天的月份
elseif(month==2)
{
if(year%4!
=0||year%100==0&
&
year%400!
=0)//判断闰年,真为平年
return
(2);
elsereturn(3);
}
elsereturn(4);
}
voidcalendar()
intyear,i,j,a,n,m,k,line;
//定义变量
constcharmonth[12][12]={"
January1"
"
February2"
March3"
April4"
May5"
June6"
July7"
August8"
September9"
October10"
November11"
December12"
};
chartempOut[2][6][40],temp[10];
//定义一个三维数组tempOut[左0右1][每月第几行][每行字符明细]。
printf("
pleaseintertheyear:
"
);
//输入所求年份
scanf("
%d"
&
year);
\n"
thecalendaroftheyear%d.\n"
year);
a=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;
//判断每年的第一天是周几当a值为0的时候,对应周日
for(i=0;
i<
12;
i+=1)//月份循环
{
memset(tempOut,0,sizeof(tempOut));
//memset函数的作用是在一段内存块中填充某个给定的值,它是对数组进行清零操作
%-33s%s\n"
month[i],month[i+1]);
//输出月份名,-33是先左对齐再留33个空格
============================================================\n"
SunMonTueWedThuFriSatSunMonTueWedThuFriSat\n"
AGAIN:
line=0;
n=judge(year,i+1);
//调用函数,n值为1234,代表每月为多少天
for(k=0;
k<
a;
k++)//a代表每年第一天,后为每月前空格天数
strcat(tempOut[i%2][0],"
"
//运用strcat函数把4个空格接到tempout[i%2][0]
for(m=1;
m<
32;
m++)//每月天数循环
{
sprintf(temp,"
%4d"
m);
//输出格式占4列,右端对齐
strcat(tempOut[i%2][line],temp);
//运用strcat函数把temp数组拷贝到tempout所指的末尾,且tempout有足够的空间存放temp的内容
if((a+m)%7==0)
line++;
if(n==1&
m==31)break;
//从此处至以下执行整月停止
elseif(n==2&
m==28)break;
elseif(n==3&
m==29)break;
elseif(n==4&
m==30)break;
a=(a+m)%7;
//a为每月末行天数
if(i%2==0)
{
i++;
gotoAGAIN;
elsefor(j=0;
j<
6;
j++)
if(strlen(tempOut[0][j])==0&
strlen(tempOut[1][j])==0)break;
//运用strlen函数判断检查左右列是否都没有第六行,如果是就可以省去空行的输出了。
tempOut[0][j],tempOut[1][j]);
}
============================================================\n\n"
//输出左边的字符串,长度33,使得右边字串对齐。
voidfind_day()
inta,day,month,year,sum,leap,S,k,W;
//定义变量
printf("
\n请输入年月日(格式如2004111):
);
scanf("
%d%*c%d%*c%d"
&
year,&
month,&
day);
switch(month)
case1:
sum=0;
break;
case2:
sum=31;
case3:
sum=59;
case4:
sum=90;
case5:
sum=120;
case6:
sum=151;
case7:
sum=181;
case8:
sum=212;
case9:
sum=243;
case10:
sum=273;
case11:
sum=304;
case12:
sum=334;
default:
printf("
dataerror"
sum=sum+day;
if(year%400==0||(year%4==0&
year%100!
=0))//判断闰年还是平年
leap=1;
elseleap=0;
if(leap==1&
month>
2)
sum++;
S=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+sum)%7;
//S/7的系数就是星期数
a=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;
k=(sum+a)%7;
//判断k能否被7整除,是否有余数,有余数则周数+1
if(k==0)
W=(sum+a)/7;
//W代表第几周,特别的是从星期日到星期一,而不是从星期一到星期日
第%d周"
W);
else
W=(sum+a)/7;
W=W+1;
printf("
switch(S)
星期一\n"
星期二\n"
星期三\n"
星期四\n"
星期五\n"
星期六\n"
case0:
星期日\n"
4测试
4.1测试结果及分析
5小结
5.1本问题解决方法及程序实现小结
1、用基姆拉尔森计算公式去计算某年第一天是星期几
a=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;
//在公式中year表示年数,公式由XX搜索得出
2、为了并排月份,定义了一个三维数组chartempOut[2][6][40],temp[10];
//tempOut[左0右1][每月第几行][每行字符明细]。
3、运用memset、strcat、sprintf函数:
memset(tempOut,0,sizeof(tempOut));
//memset函数的作用是在一段内存块中填充某个给定的值,它是对数组进行清零操作。
strcat(tempOut[i%2][0],"
//运用strcat函数把4个空格接到tempout[i%2][0]。
sprintf(temp,"
//输出格式占4列,右端对齐,特别注意,sprintf针对的是把一些内容放进字符数组,用法与printf有点相似。
5.2尚未解决的问题及下一步工作思路
本程序还是有缺点,当要选择数字时,若输入了字母等非数字类型,然后程序就不能运行。
还有goto语句使用太多,虽然goto语句很好用,但是却不太好。
6参考文献
[1]苏小红.C语言大学实用教程(第三版).电子工业出版社.2012.5
[2]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 语言 设计 一个 年历 系统