下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、目的(要求)日 历 程序(日 历 需包含以下三种 功能):1. 输出某年份的12个月2. 输出某年某月3. 输出某年某月某日是星期几2、 概 要 设计1. 程序运行的流程:开 始 运 行的菜 单 可 选择 :(1) 输出某年份的12个月(2) 输出某年某月(3) 输出某年某月某日是星期几当 程序 执 行完成之后,可通过 用 户 自己的意愿来选择 是否再 执行一次程序。2. 所包含的函数如下:打印日 历的函数: void printmonth( int m)构造日 历的函数: void printheed(int m)int daysofmonth( int m)int isleep()in
2、t firstday( int m)void rese() tvoid printweek( int d)int isleep (int s)(重载函数)打印 开关 的函 数 : void choose( int c)3、 设计 要点1. 每个函数的功能:void printmonth (int m)作用:实现对 日历的打印。void printheed (int m) 作用: 构造出日 历的头 月曰一二 三 四 五 六 ”。int daysofmonth (int m)作用:计算m月份的天数。int isleep ()作用:判断当前年份是否为闰年。int firstday (int m)作用
3、:判断 m月的第一天是星期几。void reset ()作用:全局 变量归初始值。void printweek (int d)作用:将变量转化为用户可视的“星期一,星期二”等可 视 符 号 。int isleep (int s)作用:计算从N年到2012年中有多少个闰 年, 并 且 当 N<2012 时 不包含 2012 年, 当 N>2012 时 包含 2 012 年。void choose (int c)作用:构造程序内部菜单,面对计算 机。2. 关键代码分析:4755:(此标 注 为 代 码 行 标 , 见 四、源程序,下同)int k=firstday( m)If( k=7
4、) k=0;for( int i=0; i<k; i+)cout<<” ”;for( int i=1; i<=daysofmonth( m);i+)cout<<” ” <<setw( 2) <<i;if( k+=6) k=0; cout<< n <<”; 此代码中k (作用于为printmonth的局部变量)充当星期几 的角色,由k 控制 当 前 输 出的日期是星期几。6482:switch( m)case 1:case 3:case 5:case 7:case 8:case 10:case 12: retur
5、n 31;case 4:case 6:case 9:case 11: return 30;case:if( isleep()return 29;else return 28;由此代 码 判 断 m 月 份 有多少天,然后输 出, 构 造日 历 。 2 月份通过isleep ()函数判断是否为闰年。89119:If( m=1)If( year<N)ynn=isleep( 0) *366+(N-year) isleep( 0)*365;weekday=7-7nn%7;elseynn=( isleep( 0)*366+(year-N) -isleep( 0)*365;weekday=7+ynn
6、%7;if( weekday>7) weekday-=7;elseif( year>=N)ynn+=daysofmonth( m-1);weekday=7+ynn%7;if( weekday>7) weekday-=7;elseynn-=daysofmonth( m-1);weekday=7-ynn%7; return weekday;通 过计 算公式( 总 天 数 %7=距离2012 年 1 月 1 日有几 个 星期 单 元)而算出m 月的第一天是星期几。Isleep( 0)通 过计 算之 间 有多少 个闰 年。通 过对 全局 变 量 weekday 的 return (可
7、省略)输出m月的第一天是星期几。121123:ynn=0;对全局变量ynn归初始值,对第二遍的运行程序进行准备。138153:int sum=0;if( N<year)for( int i=N; i<=year; i+)if(i%4=0&&i&100! =0) | ( i%400=0)sum+=1;return sum;else if( N>year)for( int i=N-1; i>=year; i-)if(i%4=0&&i%100! =0) | ( i%400=0)sum+=1; return sum;else return
8、 0;计算并返回sum (作用域为isleep (int s)的值(从N年到 2012 年不包括2012 年( 2012 年到 N 年)有多少个闰年)。155200:switch( c)case 1:160165case 2:168175case 3:179196default: cout<<” ERROR” !;通过开关switch制造构建三个菜单(case 1, case 2, case3)以便程序能够清 晰且分工明确地运 行三 个 功能。3. 重点代码注释:5354:cout<<” ” <<setw( 2) <<i;if( k+=6) k=
9、0; cout<< n <<”; /用空格(” ")和setw函数对日历进行塑形6061:cout<<setw( 2) <<m<<” 月 日 一 二 三 四 五 六 n”;cout<<”;/用空格(” ")和setw函数对日历进行塑形8586:if(year%4=0&&year%100! =0) | ( year%400=0)return 1;else ruturn0;/ 用 条 件表 达 式 与逻辑 表 达 式 进 行 闰 年判 断9495:ynn=isleep( 0) *366+(N
10、-year) -isleep( 0)*365; weekday=7-ynn%7;99101:ynn=isleep( 0) *366+(N-year) -isleep( 0)*365;weekday=7+ynn%7;if( weekday>7) weekday-=7;/ 当 月 份为 1 月 份时 ,用isleep( 0) 计 算 并结 合 实际经验得出相差基准(2012 年 1 月 1 日) 总 天 数 ,由于年 份 大于基准和小于基准都会对计 算 产 生影 响 ,所以 会 有 两个语 句体。108110:ynn+=daysofmonth( m-1);weekday=7+ynn%7;if
11、( weekday>7) weekday-=7;114115:ynn-=daysofmonth( m-1);weekday=7-ynn%7;/当月份大于1月份时,直接用daysofmonth函数进行累加(注:函数 的 实参为 m-1 ,因 为 需要包含1 月 份 的 31天),得出相差基准(2012 年 1 月 1 日) 总 天 数 ,由于年份 大于基准和小于基准都会对计 算 产 生影 响 ,所以 会 有 两个语 句体。142144:for( int i=N; i<=year; i+)if(i%4=0&&i&100! =0) | ( i%400=0)sum+
12、=1;return sum;148150:for( int i=N-1; i>year; i-)if(i%4=0&&i&100! =0) | ( i%400=0)sum+=1;return sum;152:else ruturn0;/定义sum (作用域为isleep (int s)的局部变量)来记录N 与 基年( 2012 年)之 间闰 年的 个数 ,由于小于基年的时候不 应该 算 2012 年的 366 天和大于基年的时 候 应该 算 2012年的 366 天的不同 还 有 当 2012 年 时 不加不 减 ,所以 会 出 现三 个语 句体。172173:fo
13、r( int i=1; i<=( month-1);i+)int k=firstday( i);183184:for( int i=1; i<=( month-1);i+)int k=firstday( i);/ 模 拟运 行:由于日历 的形成是建立在累加的基础 上的( 详见daysofmonthi (int m)所以当需要计算n月的值的时候,必 须 先累加 1n-1 所有月所含的天数 ,所以需要进 行一个 模 拟 的 运 行。189193:for( int i=1; i<=day; i+)If( k+=6) k=0;k-=1;/由于第191行的k+所以k的值会比实际需要输出
14、的值大1,所以需要进 行一 个 逆向操作k-=1。4. 全局变量注释:int year:用于记录年份int month:用于记录月份int weekday:用于记录 m 月的第一天int day:用于记录m月的第几日int ynn:用于记录距离基点(2012年1月1日)的距离(日子)5. 程序实现步骤:(1)先通过运行main ()(主调函数)来显示可视字符,说明程序的功能和教程。( 2) 再 通过用户输入的1、 2、 3(实参)运行choose( intc) 函数 , 计算机内部选择需要执行的功能( 1、 2、 3)。3) 当 执行功能1的时候, 用户输入year( 实参 ) 之后 ,便调用
15、 printmonth (int m)函数。printmonth (int m) 函数内部- 通过printheed (int m)打印m月份的头。- 通过isleep ()判断是否为闰年。- 通过isleep (int s)判断基年与year之间差了多少闰年、- 通过firstday (int m)判断且打印m月份第一天是星期几。- 通过daysofmonth(int m)打印剩余天 数。(4)当执行功能2的时候,用户输入year、month (实参)之后 , 便进行模拟运行, 然后调用printmonth( intm)函数。5) 当 执行功能3的时候, 用户输入year、 month、 d
16、ay(实参)之后,便进行模拟运行,通过定义k (定义域为choose勺局部变量)来获取当前月的第一天是星 期几,然后通过循环得到yea年month月day日是星期 几,调用printweek (int d)进行打印。6) 当 用户输入的实参不正确时( 不等于1、 2、 3) , 会输出” ERROR” !。(7)最后通过while循环判断是否需要再次使用该程序(输入'y'或者'n')。(8)当输入'y'的时候再次运行程序。(9)当输入'n'的时候结束改程序,返回值0四、源程序1. #include<iostream>2
17、. #include <stdlib.h>3. #include <iomanip>4. #define N 2012/编译预处理:相当于const5. #defineT 条件编译:与couL起禾I用,用于检查并修改程序错误6. using namespace std;7. void printmonth(int m);8. void printheed(int m);9. int daysofmonth(int m);10. int isleep();11. intfirstday(intm);12. void reset();13. void printweek(i
18、ntd);14. intisleep(ints);15. void choose(int c);16. intyear;全局变量:年份17. intmonth;全局变量:月份18. intweekday;全局变量:月的第一天19. intday;全局变量:日20. intynn;全局变量:距离2012.1.1的日子21. int main()22. 23. int i;24. char a='y'26.27.28.29.30.31.32.33.34.35.36.37.25. while(a='y')实现结束的时候 again cout<<"
19、*n"coutvvF输出某年的12个月的日历n"coutvv'N输出某年某月的日历n"cout<<"3输出某年某月某日的星期几n"cout<<" *n"coutvv请/&入(123):n”; cin>>i reset();choose(i);a='n'cout<<"*again?*n"38. coutvv"青卒&入(y)或者(n)”;39. cin>>a;40. 41. system("
20、PAUSE"); /Microsoft Visual Studio 203 system(”PAUSE")暂 停控制台界面42. return 0;43. 44. void printmonth(int m)45. 46. printheed(m);47. int k=firstday(m);48. if(k=7)k=0;49. for(int i=0;i<k;i+)50. cout<<""51. for(int i=1;i<=daysofmonth(m);i+)52. 53. cout<<" "&
21、lt;<setw(2)<<i;54. if(k+=6)k=0;cout<<'n'<<"”;55. 56. cout<<endl;57. 58. void printheed(int m)59. 60. cout<<setw(2)<<m<<"月 日 二三四五六n"61. cout<<""62. 63. int daysofmonth(int m)64. 65. switch(m)66. 67. case 1:68. case 3:
22、69. case 5:70. case 7:71. case 8:72. case 10:73. case 12:return 31;74. case 4:75. case 6:76. case 9:77. case 11:return 30;78. case 2:79. if(isleep()return 29;80. else return 28;81. 82. 83. int isleep()/重载函数84. 85. if(year%4=0&&year%100!=0川(year%400=0) return 1;86. else return 0;87. 88. int f
23、irstday(int m)89. 90. if(m=1)91. 92. if(year<N)93. 94. ynn=isleep(0)*366+(N-year)-isleep(0)*365;95. weekday=7-ynn%7;96. 97. else98. 99. ynn=(isleep(0)*366+(year-N)-isleep(0)*365;100. weekday=7+ynn%7;101. if(weekday>7)weekday-=7;102. 103. 104. else105. 106. if(year>=N)107. 108. ynn+=daysofmo
24、nth(m-1);109. weekday=7+ynn%7;110. if(weekday>7)weekday-=7;111. 112. else113.114.115.116.117.118.119.120.121.122.123.124.ynn-=daysofmonth(m-1);weekday=7-ynn%7;return weekday; void reset()ynn=0;void printweek(int d)125. (126. switch(d)127. 128. case 1:cout<<year<守''"month&quo
25、t;'月"<<day<<旧是星期一哦,亲爱 的! "break;129. case 2:cout<<year<<",<<month<<,月“<<day<<旧是星期二哦,亲爱 的! "break;130. case 3:cout<<year<<",<<month<<,月“<<day<<旧是星期三哦,亲爱 的! "break;131. case 4:cout<
26、<year<<""<<month<<明"<<day<<旧是星期四哦,亲爱 的! "break;132. case 5:cout<<year<<",<<month<<,月“<<day<<旧是星期五哦,亲爱 的! ,;break;133. case 6:cout<<year<<",<<month<<,月''<<day<&l
27、t;旧是星期六哦,亲爱 的! ,;break;134. case Oicoutvvyearvc'vvmonthvv明 ”<<day<<旧是星期日哦,亲爱 的! ,;break;135. )136. )137. int isleep(int s)/®载函数138. 139. int sum=0;140. if(N<year)141. 142. for(int i=N;i<=year;i+)143. if(i%4=0&&i%100!=0)|(i%400=0)sum+=1;144. return sum;145. )146. el
28、se if(N>year) /不能包含 2012147. 148. for(int i=N-1;i>=year;i-)149. if(i%4=0&&i%100!=0)|(i%400=0)sum+=1;150. return sum;151. 152. else return 0;153. )154. void choose(int c)155. 156. switch (c)157. 158. case 1:159. 160. cout"1入想要查询的年份:";161. cin>>year;162. for(int i=1;i<
29、=12;i+)163. printmonth(i);164. break;165. 166. case 2:167. 168. cout<<"俞入想要查询的(年)份:”;169. cin>>year;170. cout<<"俞入想要查询的(月)份:“;171. cin>>month;172. for(int i=1;i<=(month-1);i+) /模拟运行173. int k=firstday(i);174. printmonth(month);175. break;176. 177. case 3:178. 179
30、. cout<<"俞入想要查询的(年)份:”;180. cin>>year;181. cout<<"俞入想要查询的(月)份:";182. cin>>month;183. for(int i=1;i<=(month-1);i+) /模拟运行184. int k=firstday(i);185. cout<<"俞入想要查询的(日)子:“;186. cin>>day;187. int k=firstday(month);188. if(k=7)k=0;189. for(int i=1
31、;i<=day;i+)190. 191. if(k+=6)k=0;192. 193. k-=1;194. printweek(k);195. cout<<endl;196. break;197. 198. default:cout<<"ERROR!”;199. 200. 五、测试当 c=1, year=1 时:I想要查询的年份月 日一二12青输入1,2,3):五 512 1926五 2 916 23五 2 916 23四 4111825四181522四181522灌舞3三30几 历期 日星 的器3c:userstemp.as.005documentsvi
32、sual studio 2012ProjectsProject6De.一口Xc:userstemp.as,005documentsvisual studio 2012ProjectsProject6De.23459 10 11 1216 17 18 19 23 24 25 2630 31 xMKKKagain?xxx km 请输入3戢者轴.当 c=1, year=2012 时:几 历期 日星 的器 月日日c:userstemp.as.005documentsvisual studio 2012ProjectsProject6De.青输入殖人想要查询的年份:2里21 角日一二二四 5121926
33、四291623四1815223c:userstemp.as.005documentsvisual studio 2012ProjectsProject6De.当 c=1, year=2100 时:几 历期 日星 的器 月日日c:userstemp.as.005documentsvisual studio 2012ProjectsProject6De.请输入3,2,3:篇人想要查询的年份:21001一日一二四五六12345678910 11 12131415 1617 18 19202122 2324 25 26272829 30312月日一二四五六123456789101112 1314 15
34、 16171819 2021 22 23242526 27283月0 -四五六123456789101112 1314 15 161?1819 20当 c=2, year=1, month=5 时:当 c=2, year=2012, month=10 时:i领出裹至的12个月用日历常 电舞茎鹘1窿则一清输入门W3N摘人想要查询咆(年):2012皤人想要查询的(月)1。局B 一 一二四五K7 B 9 14 15 1621 22 2329 30M W WMMag 1al in ? XM M 彳 请输入3考5当 c=2, year=2100, month=12 时:c:userstemp.as,00
35、5documentsvisuat studio 2012ProjectsPreject6Der.甄出某年电12个月留日历 .扁上某年臬月的日历.输出某年某月(年)(月):2100:12四毕74五3741请输入"W,3X 氤季要拿闸的 播人想要查询的 月曰M W WMMftgain? MM M WM 请输入3跳恚2当 c=3, year=1, month=3, day=5 时:当 c=3, year=2012, month=5, day=3 时:当 c=3, year=2015, month=5, day=1 时:十:5亲爱的!201253亲爱的!请输入(1.2.3):请输入323:c;user5temp.as,005d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论