南京理工大学计算机科学与工程学院第1页共18页1C++课程设计--日历的设计(良好组)专业:计算机科学与技术完成时间:2020年3月6日南京理工大学计算机科学与工程学院第2页共18页2目录前言....................................................................3正文....................................................................32.1设计程序的目的和思想................................................32.1.1设计程序的目的:..................................................32.1.2设计程序的思想:..................................................32.2设计环境............................................................32.3设计目的............................................................42.4设计流程............................................................42.5设计内容和设计思想...................................................42.5.1大月和小月的定义...................................................52.5.2闰年与非闰年二月的定义............................................62.5.3日历表的输出.......................................错误!未定义书签。2.6关键技术............................................................10总结...................................................................10效果图.................................................................10致谢...................................................................11参考文献...............................................................12附录A...................................................错误!未定义书签。南京理工大学计算机科学与工程学院第3页共18页3前言C++是美国AT&T贝尔实验室的本贾尼·斯特劳斯特卢普(BjarneStroustrup)博士在20世纪80年代初期发明并实现了C++(最初这种语言被称作“CwithClasses”)。一开始C++是作为C语言的增强版出现的,从给C语言增加类开始,不断的增加新特性。虚函数(virtualfunction)、运算符重载(operatoroverloading)、多重继承(multipleinheritance)、模板(template)、异常(exception)、RTTI、名字空间(namespace)逐渐被加入标准。日历在古代是为皇历。日历在日常生活中有着非常重要的作用。有了它,我们的生活更有节奏,有规律。认这个高级动物与低级动物的最大差别在于,认识会思考,会计划的。他们有着有规律的计划。而日历无疑是他们规律计划的媒介。现全世界都在用日历。而在中国,又分为国历和农历。我国始有历法大约在四千多年以前。根据甲骨文中的一页甲骨历,证明殷代的历法已具有相当的水平,这一页甲骨。历是全人类最古老的历书实物,这页甲骨历也就叫日历。但真正的日历产生,大约在一千一百多年前的唐顺宗永贞元年,皇宫中就已经使用皇历。最初一天一页,记载国家、宫廷大事和皇帝的言行。皇历分为十二册,每册的页数和每月的天数一样,每一页都注明了天数和日期。发展到后来,就把月日、于支、节令等内容事先写在上面,下部空白处留待记事,和现在的“台历”相似。那时,服侍皇帝的太监在日历空白处记下皇帝的言行,到了月终,皇帝审查证明无误后,送交史官存档,这在当时叫日历,这些日.历以后就作为史官编写《国史》的依据。后来,朝廷大臣们纷纷仿效,编制自家使用的日历。至于月历以后又发展成挂历、台历等各种形式,只是近一个世纪的事。随着时代的发展,尽管日历的品种增多、花样也不断翻新,但仍旧保持着古老日历的格局。日历在当今社会的影响也是毋庸置疑的!正文2.1设计程序的目的和思想2.1.1设计程序的目的:(1)加深对讲授内容的理解,尤其是一些语法规定。通过课程设计,自然地、熟练地掌握。(2)熟悉所用的计算机系统的操作方法,也就是熟悉语言程序开发的环境。(3)学会上机调试程序。2.1.2设计程序的思想:程序设计语言类课程的指导思想是:既能使学生通过学习高级编程语言的知识、编程技术和基本算法,又能掌握程序设计的思想和方法,更具备利用计算机求解实际问题的能力,能灵活运用高级语言进行程序设计。其实认真学习一门语言并不困难,关键要所追求的学习的方法和途径。一条好的途径便于快速掌握,熟悉运用语言。学习的目的在于应用,理论来源于实践,如果在学习中能够通过有效的途径如自己动手设计一个功能比较前大的开发系统,借鉴于各种工具书,善于总结。定可以很好的效果。正是如此,使我们在这几年中对语言学习有了很大提高。通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C++,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。2.2设计环境南京理工大学计算机科学与工程学院第4页共18页4对于本次设计的软硬件要求如下:操作系统Win9x/Me/NT/2000/XP/2003内存容量512MB显卡要求集成MX200以上交互工具鼠标CPU要求AMD2200+(赛扬2.4GHz)以上硬盘空间40GB显示器VGA以上显示器开发软件MicrosoftVisualC++6.02.3设计目的掌握一种编程工具和面向对象程序设计的基本思想和方法,培养我们学生综合利用某种语言进行程序设计的能力,培养我们学生利用系统提供的功能进行创新设计的能力,培养我们学生充分利用计算机的功能和特点分析实际问题及解决实际问题的能力。为我们提供一个综合运用所学知识解决实际问题的机会,增强我们学生的实践动手能力和工程实践能力,并培养和锻炼我们学生的自学创新能力。为了能更好地了解C++语言,因此开设了此次课程设计,程序设计教学课程的目的不是为了单独的课堂学习,而是要让我们学生掌握程序设计的基本思想及方法。一方面,在课程设计过程中,可以明确的指导为什么而学,还能对所学知识得到应用,更重要的是可以让我们学生掌握一些基本函数的用法,从而不在对编程序感到茫然,经过设计,可以让我们熟悉简单程序的设计方法和编写,对程序设计及该门课程设计语言的应用得到理解。2.4设计流程主要设计算法流程开始输入year判断闰年二月29天二月28天判断大小月判断大小月1,3,5,7,8,10,12大月,31天1,3,5,7,8,10,12大月,31天4,6,9,11小月30天4,6,9,11小月30天南京理工大学计算机科学与工程学院第5页共18页52.5设计内容2.5.1大月和小月的定义intmonthday(inti){if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)//1,3,5,7,810,12有31天为大月,4,6,9,11为小月30天,2月要判断是否为闰年return31;elseif(i==2){if(isleapyear())//判断闰年return29;//是的话返回29天elsereturn28;//不是闰年返回28天计算输入的年份和几点年份之间相差的天数计算输入年份的1月1号是星期几依次递增,按照每月的天数按照要求排列用两种方式输出日历居中竖向输出横向输出,每三月为一行主菜单选择,整合程序结束南京理工大学计算机科学与工程学院第6页共18页6}elsereturn30;}运用简单的if语句来设定大小月。If语句是c++中常用且简单的判断语句,用途相当广泛,使用起来简单易懂,易操作。2.5.2闰年与非闰年二月的定义intisleapyear(){if(year%4==0&&year%100!=0||year%400==0)return1;elsereturn0;}构造闰月的判断函数,用返回值1和0来表示是否为闰年,对于后来的函数调用起来简单不容易出错,如果出现bug,修改起来也简单。2.5.3两种不同的输出方法1.居中输出voiddisplay2(){intn=judgeweek();for(inti=1;i=12;i++)//总共12个月份{intt=1;coutendlsetw(40)setw(5)year年setw(5)i月份endl;coutsetw(30)****************************************endl;coutsetw(30);for(intj=0;j7;j++)coutsetw(5)weekday[j];coutendlsetw(30)****************************************endl;coutsetw(30);for(intk=1;kn;k++,t++)coutsetw(5);//输入每月第一天的起始位置,即该天为星期几,用空格补充for(intd=1;d=monthday(i);d++,t++){coutsetw(5)d;if(t==7){coutendlsetw(30);//控制每行只输出7个数字t=0;//控制一行输出到星期日,如果到星期日则重新计数}}n=t%7;if(n==0)//输出完一个月后,记录这个月的最后一天在哪里,寻找下个月第一天的起始位置n=7;coutendlsetw(30)****************************************endl;}}南京理工大学计算机科学与工程学院第7页共18页7设计这种输出方法主要运用for语句,多重循环,以每个月为单位循环,将一个月划分为7列,控制每行不超过7个数字,月头和月尾分别用空格补齐,如此循环而得。2.横向输出方法voiddisplay1(){coutsetw(35)””year”年日历”;print(1);print(2);print(3);print(4);}横向输出相对居中输出有难度,所以在设计横向输出时将其划分为两个函数,display1为横向总的输出函数,它的作用主要是输出日历的头和调用下面的print函数。voidprint(intx){char*a,*b,*c;intfm,sm,tm,modf,mods,modt,dof,dos,dot,i,j;inttotal=0;total=(year-2000)*365+(year-2001)/4-(year-2001)/100+(year-2001)/400;swtich(x){case1:a=”一月”,b=”二月”,c=”三月”;fm=31,tm=31;if(islearp