版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课程设计课程 程序设计基础 题目 用C语言设计一个年历系统 1 问题要求及任务描述1.1 题目要求用C语言设计一个年历系统1.2 主要任务年历系统首先对于输入的任一年,能够给出该年每月的日期及实际周几的对应情况,并与实际的星期数垂直对齐,如下表所示(当输入2004时显示如下):Input the year:2004The calendar of the year 2004. Januray 1 February 2= = Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat 1 2 3 1 2 3 4 5 6 7 4 5 6 7 8 9
2、 10 8 9 10 11 12 13 14 11 12 13 14 15 16 17 15 16 17 18 19 20 21 18 19 20 21 22 23 24 22 23 24 25 26 27 28 25 26 27 28 29 30 31 29= = March 3 April 4= = Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat 1 2 3 4 5 6 1 2 3 7 8 9 10 11 12 13 4 5 6 7 8 9 10 14 15 16 17 18 19 20 11 12 13 14 15 16 1
3、7 21 22 23 24 25 26 27 18 19 20 21 22 23 24 28 29 30 31 25 26 27 28 29 30= =功能要求 : 输入任一年将显示出该年的所有月份日期,对应的星期,输出的格式如上表要求(注意闰年情况); 输入任意日期(包括年、月、日,格式有yyy/mm/dd、dd/mm/yyyy、mm/dd/yyyy、和yyyy,mm,dd、mm,dd,yyyy、dd,mm,yyyy六种基本情况),要求能够显示出该日期是本年的哪一周,是星期几。2 解决问题的主要思路和方法2.1 关键问题1、输入任一年将显示出该年的所有月份日期,对应的星期,但是要并排月份,还
4、要注意闰年情况。2、一个月份中开始和最后对应的星期可能是上个月或下个月的天数,但是要空出来。3、输入任意日期,然后要显示出该日期是本年的哪一周,星期几。2.2 拟采用解决问题的方法1、先判断输入的年份是否是闰年。2、用基姆拉尔森计算公式去计算某年第一天是星期几。3、月份的日子可以用for语句去实现,特别的,一个月份中开始和最后对应的星期可能是上个月或下个月的天数,因此要用for语句去腾空。4、根据输入的日期和基姆拉尔森公式的变换得出能计算出该日期是本年的哪一周,是星期几的公式。5、熟悉运用一些没学过的函数,如strcat,sprintf,strlen函数。2.3 主要算法和处理流程图3 程序实
5、现3.1 程序实现时应考虑的问题选择选择其他数字则输入错误选择2时调用函数find_day();选择1时调用函数calendar();选择 3.2 主要源代码及说明int judge( int year, int month ) /定义judge函数 if( month = 1 | month = 3 | month = 5 | month = 7 | month = 8 | month = 10 | month = 12 ) return( 1 );/返回1时,表示天数为31天的月份 else if( month = 2 ) if( year % 4 != 0 | year % 100 =
6、0 && year % 400 != 0 ) /判断闰年,真为平年 return( 2 ); else return( 3 ); else return( 4 );void calendar()int year, i, j, a, n, m, k, line; /定义变量 const char month 12 12 = "January 1", "February 2", "March 3", "April 4", "May 5", "June 6", &q
7、uot;July 7", "August 8", "September 9", "October 10", "November 11", "December 12" ; char tempOut 2 6 40 , temp 10 ;/定义一个三维数组 tempOut左0右1每月第几行每行字符明细。 printf( "please inter the year:" ); /输入所求年份 scanf( "%d", &year ); print
8、f( "n" ); printf( "the calendar of the year%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%sn"
9、;, monthi, monthi + 1 ); /输出月份名,-33是先左对齐再留33个空格 printf( "= =n" ); printf( " Sun Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Satn" ); AGAIN: line = 0; n = judge( year, i + 1 ); / 调用函数,n值为1234,代表每月为多少天 for( k = 0; k < a; k + ) / a代表每年第一天,后为每月前空格天数 strcat( tempOut i % 2 0 , &
10、quot; " );/运用strcat函数把4个空格接到tempouti%20 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; /从此处至以
11、下执行整月停止 else if( n = 2 && m = 28 ) break; else if( n = 3 && m = 29 ) break; else if( n = 4 && m = 30 ) break; a = ( a + m ) % 7; / a为每月末行天数 if( i % 2 = 0 ) i +; goto AGAIN; else for( j = 0; j < 6; j + ) if( strlen( tempOut 0 j ) = 0 && strlen( tempOut 1 j ) = 0 ) b
12、reak;/运用strlen函数判断检查左右列是否都没有第六行,如果是就可以省去空行的输出了。 printf( "%-33s%sn", tempOut 0 j , tempOut 1 j ); printf( "= =nn" );/输出左边的字符串,长度33,使得右边字串对齐。 void find_day()int a,day,month,year,sum,leap,S,k,W;/定义变量printf("n请输入年月日(格式如2004 11 1):n");scanf("%d%*c%d%*c%d",&year
13、,&month,&day);switch(month)case 1:sum=0;break;case 2:sum=31;break;case 3:sum=59;break;case 4:sum=90;break;case 5:sum=120;break;case 6:sum=151;break;case 7:sum=181;break;case 8:sum=212;break;case 9:sum=243;break;case 10:sum=273;break;case 11:sum=304;break;case 12:sum=334;break;default:printf(
14、"data error");break; sum=sum+day; if(year%400=0|(year%4=0&&year%100!=0)/判断闰年还是平年 leap=1; else leap=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整除,是否有余数
15、,有余数则周数+1if(k=0) W=(sum+a)/7;/W代表第几周,特别的是从星期日到星期一,而不是从星期一到星期日 printf("第%d周",W);elseW=(sum+a)/7;W=W+1;printf("第%d周",W); switch(S) case 1:printf("星期一n");break; case 2:printf("星期二n");break; case 3:printf("星期三n");break; case 4:printf("星期四n");br
16、eak; case 5:printf("星期五n");break; case 6:printf("星期六n");break; case 0: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、为了并排月份,定义了一个三维数组char tempOut 2 6 40 , temp 10 ;/ tempOut左0右1每月第几行每行字符明细。3、运用memset、strcat、sprintf函数:memset( tempOut, 0, sizeof( tempOut ) );/memset函数的作用是在一段内存块中填充某个给定的值,它是对数组进行清零操作。strcat( tempOut i % 2 0 , " "
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 石河子大学《食品机械与设备》2023-2024学年第一学期期末试卷
- 石河子大学《教育影视赏析》2021-2022学年第一学期期末试卷
- 石河子大学《家畜育种学》2023-2024学年第一学期期末试卷
- 石河子大学《饭店管理》2023-2024学年第一学期期末试卷
- 沈阳理工大学《商业品牌整体策划》2023-2024学年第一学期期末试卷
- 沈阳理工大学《建筑设计》2022-2023学年第一学期期末试卷
- 2018年四川内江中考满分作文《我心中的英雄》8
- 沈阳理工大学《化工安全与环保》2022-2023学年第一学期期末试卷
- 沈阳理工大学《电力变压器设计》2023-2024学年期末试卷
- 沈阳理工大学《产品仿生学应用设计》2021-2022学年第一学期期末试卷
- 军队文职聘用合同管理规定
- 2024年贵州省安顺市西秀区小升初语文试卷
- 2024-2029年中国儿童牙冠行业市场现状分析及竞争格局与投资发展研究报告
- 新时代铁路发展面对面全文内容
- 人工智能与语文阅读理解教学
- 科学素养培育及提升-知到答案、智慧树答案
- 快递主管岗位职责
- 医疗差错、纠纷、事故登记表
- 七年级第一次期中家长会课件
- 2024下半年四川省广元市直属事业单位招聘104人历年公开引进高层次人才和急需紧缺人才笔试参考题库(共500题)答案详解版
- 市政道路施工工程重难点分析及对策
评论
0/150
提交评论