您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 课程设计用C语言设计一个年历系统
1课程设计课程程序设计基础题目用C语言设计一个年历系统1问题要求及任务描述1.1题目要求用C语言设计一个年历系统1.2主要任务年历系统首先对于输入的任一年,能够给出该年每月的日期及实际周几的对应情况,并与实际的星期数垂直对齐,如下表所示(当输入2004时显示如下):Inputtheyear:2004Thecalendaroftheyear2004.Januray1February2============================================================SunMonTueWedThuFriSatSunMonTueWedThuFriSat123123456745678910891011121314111213141516171516171819202118192021222324222324252627282526272829303129============================================================March3April4============================================================SunMonTueWedThuFriSatSunMonTueWedThuFriSat123456123789101112134567891021415161718192011121314151617212223242526271819202122232428293031252627282930============================================================功能要求:⑴输入任一年将显示出该年的所有月份日期,对应的星期,输出的格式如上表要求(注意闰年情况);⑵输入任意日期(包括年、月、日,格式有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主要算法和处理流程图3intjudge(intyear,intmonth)month==1或month==3或month==5或month==7或month==8或month==10或month==12?返回(1)year%4!=0或year%100==0且year%400不等于0?返回(4)month==2?返回(2)返回(3)NNNYYYvoidcalendar()定义整型year,i=1,j,a,n,m,k,line定义常量字符数组month[12][12](有十二个月的名字)定义字符数组tempOut[2][6][40],temp[10]输入所求年份a=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7i12?memset(tempOut,0,sizeof(tempOut))输出月份名,格式和星期AGAIN:line=0n=judge(year,i+1);k=0;m=1m32?输出m的数字strcat(tempOut[i%2][line],temp);(a+m)%7==0?line+1n==1且m==31?breakn==2且m==28?breakn==3且m==29?breakn==4且m==30?breakm+1a=(a+m)%7i%2==0?i+1gotoAGAINj=0j6?strlen(tempOut[0][j])==0且strlen(tempOut[1][j])==0?输出空格j+1break输出末尾格式结束YYYYYi+1NNNNNNNNYYYYYNN输出空格4voidfind_day()定义整型变量a,day,month,year,sum,leap,S,k,W;输入年月日switch(month)case1?sum=0;break;case2?sum=31;break;case3?sum=59;break;case4?sum=90;break;case5?sum=120;break;case6?case7?case8?case9?case10?case11?case12?default:printf(dataerror);breaksum=151;break;sum=181;break;sum=212;break;sum=243;break;sum=273;break;sum=304;break;sum=334;break;sum=sum+day判断是否闰年?leap=1leap=0month2?S=(year-1+(year-1)/4-(year-1)/100+(year-1)/400+sum)%7;a=(year+(year-1)/4-(year-1)/100+(year-1)/400)%7;k=(sum+a)%7;W=(sum+a)/7k==0?输出第几周W=W+1输出第几周通过switch(S)判断属于星期几输出星期几结束YYYYYYYYYYYYYYsum+1;YNNNNNNNNNNNNNNN53程序实现3.1程序实现时应考虑的问题3.2主要源代码及说明intjudge(intyear,intmonth)//定义judge函数{选择选择1时调用函数calendar();选择2时调用函数find_day();选择选择其他数字则输入错误6if(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;i12;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:7line=0;n=judge(year,i+1);//调用函数,n值为1234,代表每月为多少天for(k=0;ka;k++)//a代表每年第一天,后为每月前空格天数strcat(tempOut[i%2][0],);//运用strcat函数把4个空格接到tempout[i%2][0]for(m=1;m32;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;j6;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,使得右边字串对齐。}}8voidfind_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&&month2)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整除,是否有余数,有余数则周数+1if(k==0){W=(sum+a)/7;//W代表第几周,特别的是从星期日到星期一,而不是从
本文标题:课程设计用C语言设计一个年历系统
链接地址:https://www.777doc.com/doc-6015675 .html