课程设计用C语言设计一个年历系统.doc

上传人:zf 文档编号:30813255 上传时间:2024-01-30 格式:DOC 页数:12 大小:943.04KB
下载 相关 举报
课程设计用C语言设计一个年历系统.doc_第1页
第1页 / 共12页
课程设计用C语言设计一个年历系统.doc_第2页
第2页 / 共12页
课程设计用C语言设计一个年历系统.doc_第3页
第3页 / 共12页
课程设计用C语言设计一个年历系统.doc_第4页
第4页 / 共12页
课程设计用C语言设计一个年历系统.doc_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

课程设计用C语言设计一个年历系统.doc

《课程设计用C语言设计一个年历系统.doc》由会员分享,可在线阅读,更多相关《课程设计用C语言设计一个年历系统.doc(12页珍藏版)》请在冰豆网上搜索。

课程设计用C语言设计一个年历系统.doc

课程设计

课程程序设计基础

题目用C语言设计一个年历系统

1问题要求及任务描述

1.1题目要求

用C语言设计一个年历系统

1.2主要任务

年历系统首先对于输入的任一年,能够给出该年每月的日期及实际周几的对应情况,并与实际的星期数垂直对齐,如下表所示(当输入2004时显示如下):

Inputtheyear:

2004

Thecalendaroftheyear2004.

Januray1February2

============================================================

SunMonTueWedThuFriSatSunMonTueWedThuFriSat

1231234567

45678910891011121314

1112131415161715161718192021

1819202122232422232425262728

2526272829303129

============================================================

March3April4

============================================================

SunMonTueWedThuFriSatSunMonTueWedThuFriSat

123456123

7891011121345678910

1415161718192011121314151617

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程序实现时应考虑的问题

选择

选择其他数字则输入错误

选择2时调用函数find_day();

选择1时调用函数calendar();

选择

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);

printf("\n");

printf("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函数的作用是在一段内存块中填充某个给定的值,它是对数组进行清零操作

printf("%-33s%s\n",month[i],month[i+1]);//输出月份名,-33是先左对齐再留33个空格

printf("============================================================\n");

printf("SunMonTueWedThuFriSatSunMonTueWedThuFriSat\n");

AGAIN:

line=0;

n=judge(year,i+1);//调用函数,n值为1234,代表每月为多少天

for(k=0;k

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函数判断检查左右列是否都没有第六行,如果是就可以省去空行的输出了。

printf("%-33s%s\n",tempOut[0][j],tempOut[1][j]);

}

printf("============================================================\n\n");//输出左边的字符串,长度33,使得右边字串对齐。

}

}

voidfind_day()

{

inta,day,month,year,sum,leap,S,k,W;//定义变量

printf("\n请输入年月日(格式如2004111):

\n");

scanf("%d%*c%d%*c%d",&year,&month,&day);

switch(month)

{

case1:

sum=0;break;

case2:

sum=31;break;

case3:

sum=59;break;

case4:

sum=90;break;

case5:

sum=120;break;

case6:

sum=151;break;

case7:

sum=181;break;

case8:

sum=212;break;

case9:

sum=243;break;

case10:

sum=273;break;

case11:

sum=304;break;

case12:

sum=334;break;

default:

printf("dataerror");break;

}

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代表第几周,特别的是从星期日到星期一,而不是从星期一到星期日

printf("第%d周",W);

}

else

{

W=(sum+a)/7;

W=W+1;

printf("第%d周",W);

}

switch(S)

{

case1:

printf("星期一\n");break;

case2:

printf("星期二\n");break;

case3:

printf("星期三\n");break;

case4:

printf("星期四\n");break;

case5:

printf("星期五\n");break;

case6:

printf("星期六\n");break;

case0:

printf("星期日\n");break;

}

printf("\n");

}

4测试

4.1测试结果及分析

5小结

5.1本问题解决方法及程序实现小结

1、用基姆拉尔森计算公式去计算某年第一天是星期几

a=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;//在公式中year表示年数,公式由百度搜索得出

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,"%4d",m);//输出格式占4列,右端对齐,特别注意,sprintf针对的是把一些内容放进字符数组,用法与printf有点相似。

5.2尚未解决的问题及下一步工作思路

本程序还是有缺点,当要选择数字时,若输入了字母等非数字类型,然后程序就不能运行。

还有goto语句使用太多,虽然goto语句很好用,但是却不太好。

6参考文献

[1]苏小红.C语言大学实用教程(第三版).电子工业出版社.2012.5

[2]

12

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 唐诗宋词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1