C++上机实验.doc_第1页
C++上机实验.doc_第2页
C++上机实验.doc_第3页
C++上机实验.doc_第4页
C++上机实验.doc_第5页
免费预览已结束,剩余36页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+实 验 指 导目 录1.绪言21.1上机实验的指导思想和要求21.2、关于程序的调试和测试32.实验内容与安排82.1 C+实验环境8A: Linux操作系统下编译运行C+程序的方法步骤:8B: Windows操作系统下编译运行C+程序的方法和步骤1322 实验项目1 C+运行环境及基础语法212.2.1 实验内容:最简单的C+程序运行调试212.2.2 实验内容. 结构化程序设计基础212.2.3实验内容 引用和函数222.2.4实验内容 函数的重载和默认参数222.3 实验项目2 运用类和对象进行程序设计232.3.1 实验内容 类基本语法练习232.3.2 实验内容 运算符重载252.3.3 实验内容 构造和析构函数262.3.4 实验内容 I/O流和文件操作2724 实验项目3 面向对象程序设计综合应用272.4.1 实验内容 多态与虚函数基本概念272.4.2实验内容 多态的综合应用302. 5实验项目4 小型综合程序设计(选做)31附录:32编辑器vi的使用:32使用g+编译c+程序35使用gdb调试程序36一个调试示例36Makefile介绍及简单Makefile文件的编写39关于程序的编译和链接39什么是Makefile39makefile的“语法”规则401.绪言1.1上机实验的指导思想和要求1.1.1上机实验的目的 学习C+程序设计不能满足于懂得了”,满足于了解了语法和能看懂书上的程序,而应当掌握程序设计的全过程,即能独立编写出源程序,独立上机调试程序,独立运行程序和分析结果。设计c+的初衷是为方便开发大型程序,虽然在学校中初学c+时还没有机会接触到大型程序,更不可能编写出能供实际应用的大型程序,而只能接触到比较简单的程序。但是应当通过学习C+课程,对C+有比较全面的、然而是初步的认识,为今后进一步学习和应用C+打下良好的基础。 程序设计是一门实践性很强的课程,必须十分重视实践环节。许多实际的知识不是靠听课和看书学到手的,而是通过长时间的实践积累的。要提倡通过实践去掌握知识的方法。必须保证有足够的上机实验时间。 上机实验的目的,绝不仅是为了验证教材和讲课的内容,或者验证自己所编的程序正确与否。学习程序设计,上机实验的目的是: 1加深对讲授内容的理解,尤其是一些语法规定,光靠课堂讲授,既枯燥无味又难以记住,但它们是很重要的,初学者的程序出错往往错在语法上。通过多次上机,就能自然地、熟练地掌握。通过上机来掌握语法规则是行之有效的方法。 2熟悉所用的计算机系统的操作方法,也就是了解和熟悉C+程序开发的环境。一个程序必须在一定的外部环境下才能运行,所谓“环境”,就是指所用的计算机系统的硬件和软件条件,或者说是工作平台。使用者应该了解为了运行一个C+程序需要哪些必要的外部条件(例如硬件配置、软件配置),可以利用哪些系统的功能来帮助自己开发程序。每一种计算机系统的功能和操作方法不完全相同,但只要熟练掌握一两种计算机系统的使用,再遇到其他系统时便会触类旁通,很快地学会。3学会上机调试程序。也就是善于发现程序中的错误,并且能很快地排除这些错误,使程序能正确运行。经验丰富的人,在编译连接过程中出现“出错信息”时,一般能很快地判断出错误所在,并改正之。而缺乏经验的人即使在明确的“出错提示”下也往往找不出错误而求助于别人。要真正掌握计算机应用技术,就不仅应当了解和熟悉有关理论和方法,还要求自己动手实现。对程序设计来说,则要求会编程序并上机调试通过。因此调试程序不仅是得到正确程序的一种手段,而且它本身就是程序设计课程的一个重要的内容和基本要求,应给予充分的重视。调试程序固然可以借鉴他人的现成经验,但更重要的是通过自己的直接实践来累积经验,而且有些经验是只能“会意”难以“言传”。别人的经验不能代替自己的经验。调试程序的能力是每个程序设计人员应当掌握的一项基本功。 因此,在做实验时千万不要在程序通过后就认为万事大吉、完成任务了,而应当在已通过的程序基础上作一些改动(例如修改一些参数、增加程序一些功能、改变某些语句等),再进行编译、连接和运行。甚至于“自设障碍”,即把正确的程序改为有错的(例如语句漏写分号;比较符“=”错写为赋值号“=”;使数组下标出界;使整数溢出等),观察和分析所出现的情况。这样的学习才会有真正的收获,是灵活主动的学习而不是呆板被动的学习。1.1.2上机实验前的准备工作 在上机实验前应事先做好准备工作,以提高上机实验的效率,准备工作至少应包括: 1.了解所用的计算机系统(包括C+编译系统和工作平台)的性能和使用方法; 2.复习和掌握与本实验有关的教学内容; 3.准备好上机所需的程序。手编程序应书写整齐,并经人工检查无误后才能上机,以提高上机效率。初学者切忌不编程序或抄别人程序去上机,应从一开始就养成严谨的科学作风; 4.对运行中可能出现的问题事先作出估计,对程序中自己有疑问的地方,应作出记号,以便在上机时给予注意;5.准备好调试和运行时所需的数据。1.1.3上机实验的步骤 上机实验时应该一人一组,独立上机。上机过程中出现的问题,除了是系统的问题以外,一般应自己独立处理,不要轻易举手问教师。尤其对“出错信息”,应善于自己分析判断。这是学习调试程序的良好机会。 上机实验一般应包括以下几个步骤: 1.进入C+工作环境(如Linux的终端)。 2.输入自己所编好的程序。 3.检查一遍已输入的程序是否有错(包括输入时打错的和编程中的错误),如发现有错,及时改正。 4.进行编译和连接。如果在编译和连接过程中发现错误,屏幕上会出现“出错信息”,根据提示找到出错位置和原因,加以改正。再进行编译,如此反复直到顺利通过编译和连接为止。 5.运行程序并分析运行结果是否合理和正确。在运行时要注意当输入不同数据时所得到的结果是否正确。6.输出程序清单和运行结果。1.1.4实验报告 实验后,应整理出实验报告,实验报告应包括以下内容: (1)题目: (2)程序清单(计算机打印出的程序清单); (3)运行结果(必须是上面程序清单所对应打印输出的结果); (4)对运行情况所作的分析以及本次调试程序所取得的经验。如果程序未能通过,应分析其原因。1.1.5 实验内容的安排 每个实验包括若干个题目,上机时间每次为2学时。各单位在组织上机实验时可以根据条件做必要的调整,增加或减少某些部分。在实验内容中有“*”的部分是选做的题目,如有时间可以选做这些部分。 学生应在实验前将教师指定的题目编好程序,然后上机输入和调试。1.2、关于程序的调试和测试1.2.1程序错误的类型 为了帮助读者调试程序和分析程序,下面简单介绍程序出错的种类。 1.语法错误。即不符合C+语言的语法规定,例如将main错写为naim,括号不匹配,语句最后漏了分号等,这些都会在编译时被发现并指出。这些都属于“致命错误”,不改正是不能通过编译的。对一些在语法上有轻微毛病但不影响程序运行的错误(如定义了变量但始终未使用),编译时会发出“警告”,虽然程序能通过编译,但不应当使程序“带病工作”,应该将程序中所有导致“错误(error)”和“警告(warning)”的因素都消除,再使程序投入运行。2.逻辑错误。这是指程序无语法错误,也能正常运行,但是结果不对。例如 求s=l+2+3+100,有人写出以下语句: for(s=0,i=l;iab: c=ab; coutcendl; return 0; 当输入的b为非零值时,运行无问题。当输入的b为零时,运行时出现“溢出(overflow)”的错误。如果在执行上面的cin语句时输入则输出C的值为2,显然是不对的。这是由于输入的数据类型与输入格式符不匹配而弓起的。1.2.2程序的测试 程序调试的任务是排除程序中的错误,使程序能顺利地运行并得到预期的效果。程序的调试阶段不仅要发现和消除语法上的错误,还要发现和消除逻辑错误和运行错误。除了可以利用编译时提示的“出错信息”来发现和改正语法错误外,还可以通过程序的测试来发现逻辑错误和运行错误。 程序的测试的任务是尽力寻找程序中可能存在的错误。在测试时要设想到程序运行时的各种情况,测试在各种情况下的运行结果是否正确。程序测试是程序调试的一个组成部分。 有时程序在某些情况下能正确运行,而在另外一些情况下不能正常运行或得不到正确的结果,因此,一个程序即使通过编译并正常运行而且结果正确,还不能认为程序没有问题了。要考虑是否在任何情况下都能正常运行并且得到正确的结果。测试的任务就是要找出那些不能正常运行的情况和原因。下面通过一个典型的和容易理解的例子来说明测试的概念。 求一元二次方程ax2+bx+c=0的根。 有人根据求根公式x1、2=,编写出以下程序:#include#includeusing namespace std;int main()float a,b,c,disc,xl,x2;cinabc;disc=b*b-4*a*c;xl=(-b+sqrt(disc)(2*a);x2=(-bsqrt(disc)(2*a);cout”xl=”x1”,x2=”x20 有两个不等的实根: x1,2=b-4ac=0 有两个相等的实根: x1=x2=-b-4ac0a0, b2一4ac=0a0, b2一4ac0a=O,b0a=O,b=O,c=Oa=O,b=O,c0 应当分别测试程序在以上6种情况下的运行情况,观察它们是否符合要求。为此,应准备6组数据。用这6组数据去测试程序的“健壮性”。在使用上面这个程序时,显然只有满足情况的数据才能使程序正确运行,而输入满足情况的数据时,程序出错。这说明程序不“健壮”。为此,应当修改程序,使之能适应以上6种情况。可将程序改为:#include#includeusing namespace std;int main()float a,b,c,disc,x1,x2,p,q; coutabc;if(a=0) if(b=0) if(c=0) cout”It iS trivial”endl: else cout”It is impossible”endl: else cout”It has one solution:”endl; cout”x=”-cb=O) if(discO) cout”It has two real solutions:”endl; x1=(-b+sqrt(disc)(2*a); x2=(-b-sqrt(disc)(2*a); cout”xl=”xl”,x2=”x2endl; else cout”It has two same real solutions:”endl; cout”xl=x2=”-b(2*a)endl; else cout”It has two complex solutions:”endl; P=-b(2*a); q=sqrt(-disc)(2*a); cout”xl=”p”+”q”i,x2=”p”-”q”i”endl; return 0:为了测试程序的“健壮性”,我们准备了6组数据:3,4,1 1,2,1 4,2,1 0,3,4 0,0,0 0,0,5分别用这6组数据作为输入的a,b,C的值,得到以下的运行结果: input a,b,c:3 4 1 It has two real solutions: xl=-0.33,x2=-1 input a,b,c:1 2 1 It has two same real solutions: x1=x2=-1 input a,b,c:4 2 1 It has two complex solutions: xl=-0.25+0.43i, x2=-0.250.43i input a,b,c:0 3 4 It has two one solution: x=1.33 input a,b,c:0 0 0 It is trivial input a,b,c:0 0 5 It is impossible 经过测试,可以看到程序对任何输入的数据都能正常运行并得到正确的结果。 以上是根据数学知识知道输入数据有6种方案。但在有些情况下,并没有现成的数学公式作为依据,例如一个商品管理程序,要求对各种不同的检索作出相应的反应。如果程序包含多条路径(如由if语句形成的分支),则应当设计多组测试数据,使程序中每一条路径都有机会执行,观察其运行是否正常。 以上就是程序测试的初步知识。测试的关键是正确地准备测试数据。如果只准备4组测试数据,程序都能正常运行,仍然不能认为此程序已无问题。只有将程序运行时所有的可能情况都作过测试,才能作出判断。 测试的目的是检查程序有无“漏洞”。对于一个简单的程序,要找出其运行时全部可能执行到的路径,并正确地准备数据并不困难。但是如果需要测试一个复杂的大程序,要找到全部可能的路径并准备出所需的测试数据并非易事。例如:有两个非嵌套的if语句,每个if语句有两个分支,它们所形成的路径数目为2x2=4。如果一个程序包含100个if语句,则可能的路径数目为2100=12676511030,要测试每一条路径几乎是不可能的。实际上进行测试的只是其中一部分(执行几率最高的部分)。因此,经过测试的程序一般还不能轻易宣布为“没有问题”,只能说“经过测试的部分无问题”。 学习者应当了解测试的目的,学会组织测试数据,并根据测试的结果修改完善程序。2.实验内容与安排2.1 C+实验环境A: Linux操作系统下编译运行C+程序的方法步骤:Linux操作系统使用简介:和Windows类似,Linux是多用户操作系统,但比Windows更安全,每个用户有自己的文件夹,自己的操作路径,只能操作自己的文件,不能访问或删除其他用户的文件或者系统文件,即一般情况下如果是普通用户登录,随便怎么操作对系统是没有影响的。Linux下有个最高权限的用户,称为“根用户”(root), 可以对系统做出更改,包括访问系统文件,访问其他用户的文件等,并执行系统的配置,如分配用户,更改用户的权限,更改文件的权限,设置日期时间,启动,安装软件等。开机启动后进入到登录界面,以指定用户和密码登录后,通常是启动到图形界面。在本课程中使用字符界面。可以使用CTRL+ALT+F1三个键切换到字符界面,再输入用户名和密码登录。CTRL+ALT+F7切换回图形界面。字符界面称为SHELL,和Dos提示符类似。用户在字符界面登录后直接进入到自己的主目录,比如是root用户,提示符类似于 /home/root,如果是zhang用户,则是/home/zhang,接下来输入命令进行操作。提示:Linux下没有Windows下的盘符概念,即没有C,D,E盘等;Linux下表示路径是/,而Windows下则是,注意不要输错了Linux下使用U盘:需要自己挂载:把U盘插上计算机后,系统已经识别到了设备,可以用命令ls查看:ls /dev/sd* 一般可以看到有 sda1,就是你的U盘了。要使用,需要把这个sda1设备挂载到某个目录下,即在Linux下U盘对应某个目录,而不是盘符。首先可以建立一个目录(或者使用一个存在的目录也可以),建的目录通常放在/mnt下,如:mkdir /mnt/udisk,然后使用mount命令挂载mount -t vfat /dev/sda1 /mnt/udisk o iocharset=utf8-t:指定U盘文件系统类型,通常是fat32格式,用vfat,命令指定把sda1设备挂在mnt目录下的udisk目录上,后面的-o iocharset=utf8选项是为了显示中文,如果你U盘上没有中文字符,或者你不需要看中文字符,可以不要这个选项现在 ls /mnt/udisk,可以看到U盘内容了。对U盘操作就像对目录操作一样。取出U盘使用umoun命令t, umount /mnt/udisk , 如果没提示就可以取下来了第一部分:Linux常用命令Linux下的命令和DOS类似,但有些命令拼写有区别,常用命令简介:提示:1关于命令的用法可以使用man命令查看,如 man cd 可以显示有关cd命令的详细帮助信息2曾经输入的命令可以使用键盘的“上下方向键”进行查找3Linux下输入命令有“自动补全”功能,方法是用TAB键,可以极大的提高输入速度。下面会有使用方法cd:改变和进入目录 用法: cd 空格 路径举例: cd /home/root/mycpp特殊用法:cd 直接回车,不管当前在什么位置,回到用户主目录.表示上一级目录, .表示当前目录自动补全举例:如果想进入到/home/root/mycpp目录,则可以如下操作输入 cd /h按TAB键如果 / 目录下只有一个以h 开头的目录,则会自动补全,显示 CD /home/如果 / 目录下有多个以h 开头的目录,则不会自动补全,可以按两下TAB,屏幕会显示所有以h开头的目录,则可以再输入路径名直到可以区别开,再按TAB键,自动补全。比如/ 目录下有 home, hkabc, hao, hp目录,那么,输入CD /ho 再按TAB键则可以自动补全为 /home所有的命令和路径都可以采用这种方法自动补全。ls: 显示文件和目录信息用法: ls 参数 路径举例: ls /home 常用参数: -l:显示详细信息 -d: 只显示目录mkdir: 创建目录用法举例: mkdir abc 在当前目录下创建abc,目录 mkdir /home/ex1 用绝对路径方式创建rm: 删除目录和文件rm *.obj 删除当前目录下的所有obj文件要删除目录,需要使用参数 rf rm rf /home/abc/ex1 删除ex1目录 使用rf参数要小心cp: 拷贝文件cp file1 file2 把file1拷贝成file2,原文件仍在mv:移动文件或文件改名mv file1 newf2 把file1改名为newf2 mv file1 ./把file1移动到上一级目录more: 查看文件内容more ex1.cpp 分屏显示文件内容,若显示不完回车键继续显示提示:按q键或者ctrl+c退出,在linux下可以使用ctrl+c终止当前程序运行第二部分:Linux下的编辑工具vi(vim)的使用在Linux下最常用的文本编辑工具是vi,vim是其升级版本,一般使用vim代替vi,是一个使用键盘操作的功能强大、高效编辑工具,熟练掌握vi的使用方法,可以大大提高编辑效率(比鼠标操作要快捷的多)首先通过编写一个hello.cpp实例来学习使用vi1. 在提示符下输入 vi hello.cpp 回车,如下图2. 之后出现vi的界面,如下图编辑区底部提示行,表示当前的文件及所在的位置等信息注意,刚进入时是不能进行编辑的。这时候vi的状态称为“命令模式”,即等待用户按某个键发出某命令,常用的命令比如编辑、查找、打开文件等(因为命令也是键盘输入的,这里又没有鼠标,如果不区分模式,输入的就成了文件内容,vi是无法识别的)我们想要做的是“输入hello.cpp文件内容,就是编辑文件”,所以要给vi发出“编辑”的命令,编辑有很多种方式,如插入,追加等,我们这里用插入(insert),其对应的命令是键盘的i 键(注意是小写)。即是说,进入vi后,按键盘i,就进入到“插入模式”,可以开始编辑了。按字母键i后,底部变为 插入提示,如下图:编辑模式,这里有提示插入3. 下面可以进行输入,录入如下内容4当我们输入完成后,需要保存并且退出,这时候又要给vi发出命令,但在插入模式下无法发出命令,只能到“命令模式”下,进入命令模式的方式是按键盘的“Esc”键。输入完成后,按ESC键回到命令模式,此时底部提示条的“插入”字样会消失5在命令模式下,输入命令的方法是先输入冒号:再输入命令,存盘退出的命令是wq,所以这时输入:wq,如下图命令模式下, :输入命令,会在这里显示6回到提示符下,用ls命令看看,会有hello.cpp文件提示:关于vi常用的其他操作,如如何在vi中复制、删除等,见附录Linux下可以使用CTRL+Z把当前任务切换至后台,即当你修改完程序要运行时,不一定要退出vi,可以用:w存盘,然后CTRL+Z把vi放到后台,到了shell提示符可以编译运行程序。要想再回到vi中,在shell中使用命令fg切换回去(fg就是foreground前台的意思)第三部分 编译运行C+程序有了源代码后,下面要做的事情就是编译运行。Linux下使用g+进行编译链接。我们直接输入命令:g+ hello.cpp 如果屏幕上没有提示,表示编译成功,若有提示,重新用vi进行编辑改正编译成功后,使用ls查看,会发现没有Windows下的exe文件,而多了个a.out,这个a.out就是可执行文件。(Linux和Windows的文件系统机制不一样,Windows下的exe文件无法在Linux上运行,包括病毒,即Windows下的病毒到Linux下就自然无用武之地了,目前Linux系统下基本上没有病毒存在,也很少感染病毒,所以,Linux中不用装杀毒软件,你的U盘也请放心使用),如何运行?使用下面方法,在提示符后输入 ./a.out.表示当前目录,意思是执行当前目录下的a.out,回车就可以看到运行结果了运行之所以可执行文件是a.out,因为我们没有指定输出文件名,系统采用默认的,通常编译时我们要指定可执行文件名,使用g+的 o 参数,如下g+ hello.cpp o hello这样,编译后生成的可执行文件是hello, 运行的时候输入./hello 执行程序提示: 附录中有更详细更高级的g+使用方法,包括“多个源文件如何生成可执行程序”,“如何使用gdb调试程序”,“g+的高级选项”等内容B: Windows操作系统下编译运行C+程序的方法和步骤在Windows下一般使用VC6,可以在”开始菜单”-“程序”-Microsoft Visual Studio 6.0 中找到. 实验室桌面上有时有快捷方式. 注意听老师的讲解也可以用其他的开发环境,如: MinGWStudio, 此安装程序22M左右,可以存放在U盘中,随时安装使用.二者的菜单和使用方式类似,下面都以VC6.0作为例子讲解. 2.在Visual c+环境下编译和运行c+程序在第一次上机时,有两种方式运行一个c+程序.方式1: 建立新工程方式VC有中文版和英文版,此处简要说明中文版所对应的英文菜单进入VC后,选文件(file)-新建(new),出现对话框存储位置工程名控制台应用程序工程注意:选择新建工程Projects时要选 Win32 Console Application然后选择位置(提示: 实验室有保护软件,重启后C,D盘会恢复原始状态,一般将自己的程序放在E盘,具体情况询问指导老师), 可以先建立一个自己的文件夹,以方便查找这里输入myhello,点ok ,出现向导提示如下:可以选择默认的”空工程”(An empty Project),然后 点Finish(完成)出现如下提示,点”ok”然后出现工程视图视图模式,目前在classView即类视图下刚才输入的工程名此时工程是空的,还需要给工程添加文件继续点菜单File-new-后,出现对话框321这时选C+ Source file, 注意右边的Add to project要选中, 然后在下面file处输入文件名, 扩展名可以省略,下面的位置(Location)一般不用管, 然后点ok,进入到编辑模式此处光标闪烁,可以输入程序了输入以下内容:#includeusing namespace std;int main()couthello world!endl;return 0;编译运行然后可以直接点运行按钮(!处)或Ctrl+F5,如果是第一次运行程序,或者程序修改过还没有编译,都会有提示, 选择”是”生成 myhello.exe 可执行程序接下来程序运行,观察运行结果后,按空格键或回车键关闭窗口注意处:1. 建立工程一定要选正确,否则会出错2. 如果要重新写一个程序,可以按照以上步骤重新建立Project(工程),不能在同一个工程中出现2个main()函数. 或者, 如果当前这个工程你不需要了,可以直接在当前源代码上修改3. 关闭当前工程,要选择文件菜单中的close workspace,如下4. 到你的目录下看看,可以看到除了first.cpp源代码外还有一些文件,如果要打开myhello工程, 要双击myhello.dsw,不用去双击first.cpp,如下: 5. 同样,如果在VC中打开某个工程,要选择File菜单中的Open Workspace, 然后选择某个目录中的dsw文件6. 在VC中,可以选择file view视图看到你的源代码文件,如下: 把前面的”+”展开,可以看到文件文件视图,显示工程中的文件方式2: 建立新文件,自动生成工程方式先自己建立一个目录, 这里在是d:workvcttt进入VC,文件,新建,c+ source file 如上,输入文件名,ttt.cpp,选择位置,点OK,出现编辑界面注意,这时”运行”按钮是灰色的.先输入源代码编译按钮 输入代码后,选择编译或构建,会询问是否自动生成工程,选择是如果没有错误,就可以继续点运行按钮运行说明: 在VC中,程序是以工程来管理文件的,所以,仅仅一个cpp文件是不能运行的.如果没有工程,VC会自动创建一个和cpp文件的名同名的工程. 22 实验项目1 C+运行环境及基础语法实验目的:1 熟悉C+的开发运行环境2 掌握C+的基本语法3 熟悉结构化程序设计2.2.1 实验内容:最简单的C+程序运行调试实验步骤:输入下面程序并运行,记录运行结果#includeusing namespace std;int main()cout”my first cpp program”endl;return 0;问题:1、main函数的返回值有什么含义?程序中main可以定义为void类型吗?可以去掉最后的return 0 语句吗?修改程序,并编译,注意屏幕提示,解释结果2、 程序中的 using namespace std; 有什么作用?如果不要计算机会有和提示?修改程序,删除 using namespace std; 并让程序能运行提示: 使用 std:cout2.2.2 实验内容. 结构化程序设计基础下面程序是从键盘输入一个数,并求其阶乘:注意:重新建一个工程,不要在一个工程中有多个main函数出现#includeusing namespace std;int main()int n,fact;cin”input a num:”n; /这条语句有错,应怎么改?注意cin和cout的区别for(int i=1;in;i+)fact=fact*i;coutn!=factendl;return 0;验证:输入5,应该是120, 那么20的阶乘呢? 怎么解释结果?注意初始化和变量的范围问题:修改程序,在程序最后输出循环变量i的值注意程序中的语句:for(int i=1;in;i+) ,和以前C程序的写法有什么区别?说明这种把变量定义在( )中的含义及其局限提示:从变量的作用域上考虑2.2.3实验内容 引用和函数修改如下程序,使其能调用swap函数对参数进行交换:#includeusing namespace std;void swap(int a, int b) int t; t=a; a=b; b=t;int main()int a=1,b=6;coutbefore swap:na is:a b is:bendl;swap(a,b);coutafter swap:na is:a b is:bendl;return 0;提示:使用引用2.2.4实验内容 函数的重载和默认参数从键盘上输入年龄(实数)和性别(用字符M和F表示),输出对应信息.要求如下键盘输入如: 18.6F ,则输出 19 years old, female19.4M,则输出 19 years old, male年龄采用四舍五入,如果不会,可以不实现,只取整即可编写print函数来处理(输出), 要求函数可以用任意顺序的参数调用,程序结构如下int main() float year; char sex; 输入 print( year,sex) print( sex,year) print( ); /这里输出0 years old, male,即默认是0岁,male return 0;程序不要改变main函数结构,编写printf函数(思考需要编写几个?)提示:如何实现四舍五入?可以采用 变量+0.5取整2.3 实验项目2 运用类和对象进行程序设计实验目的掌握类的定义掌握对象的成员变量,成员函数的使用掌握对象成员访问控制的设定2.3.1 实验内容 类基本语法练习#includeusing namespace std;class Time / 定义Time类public: / 数据成员为公用的 int hour; int minute; int sec;int main() Time t1; /定义t1为Time类对象 cint1.hour; /输入设定的时间 cint1.minute; cint1.sec; coutt1.hourl”:”t1.minute”:”t1.secendl; return 0:改写程序,要求:将数据成员改为私有的;将输入和输出的功能改为由成员函数实现;在类体内定义成员函数。然后编译和运行程序。请分析什么成员应指定为公用的?什么成员应指定为私有的? 什么函数最好放在类中定义? 什么函数最好在类外定义?下面程序设计了一个日期类如下,通过成员函数init来初始化,print输出class Dateint y,m,d;void init()y=year;m=month; d=day;void print()couty year m month d dayendl;int main()Date d;d.init();d.print();return 0;问题1:程序有3处错误,试改正提示: 类定义格式, 注意最后的分号 init函数是否要参数 注意成员函数的访问属性,公有还是私有问题2.根据上面修改的类,继续添加成员函数,要求能进行日期相减得到相差的天数,日期可以加上一个数,得到新的日期. 为简化程序,设每个月都是30天.提示: 增加成员函数 int subDate( Date d) Date addNum( int num) 在main函数中验证如下Date d1,d2,d3; d1.init(1900,2,1); d2.init(1900,1,1); coutd1.subDate(d2); /结果为30d3 = d1.add(5); d3.print(); /d1 是 1900,2,6思考: addNum( int num)函数的返回值是否可以定义为void?即这样使用:d1.add(5); d1.print( );d1自身的日期加5,如果要这么做, addNum函数要如何修改?提示:注意区分当前对象,如果需要返回当前对象自己,可以使用return *this;this 是指向当前对象的指针,*this 表示当前对象问题3. 修改前面的程序, 初始化一个错误的日期,如 Date d1; d1.init(1900,13,45); 程序可以运行么? 怎么修改程序保证程序不会输出一个错误的日期 提示: 如果初始化出错了后面的就没必要运行下去了,可以用函数exit(0)结束程序 通过这个例子程序思考对象的安全性,如何保证对象是正常的,能不能把日期的年月日开放给使用者等问题4: (选作) 使用下面公式增加求星期几的成员函数计算星期可以用蔡勒(Zeller)公式(只适合于1582年10月15日之后的情形)* w=y+y/4+c/4-2c+26(m+1)/10+d-1 * 公式中的符号含义如下: * c:世纪(年的高两位数); * y:年(年的低两位数); * m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2005年1月1日要看作2004年的13月1日来计算);* d:日; * 代表取整,即只要整数部分可以考虑增加如下一个weekDay()函数weekDay( ) /下面的y,m,d分别代表年月日y=y%100;if(m=1) m=13;y=y-1;else if(m=2) m=14;y=y-1;int week=(26*(m+1)/10+y+y/4-2*y/100+y/400+d-1)%7;/week是一个整数,1表示是星期一,2是星期二, 0 则是星期天算算今天星期几,看看公式是否准确问题5. 参照日期类,自己设计一个时间类, 能初始化,可以输出,进行时间相减等操作 说明:时间的表示可以自行拟定,一般是”时分秒”形式,可以增加毫秒,采用12或24小时制都可以。设计好了后大家可以互相交换“使用”一下,看看谁设计的类最好用2.3.2 实验内容 运算符重载问题1:以下有类Point,请添加适当成员函数以便Point对象可以进行运算class Pointint x,y;public:void init( int a, int b)x =a; y = b;void disp()coutx” “yendl;int main()Point a,b,c;a.init(1,2); b.init(3,4)c = a + b;c.disp();采用2种方式重载运算符:成员函数和全局函数方式提示:成员函数方式 Point operator+(const Point& a)全局函数方式 Point operator+(const Point& a,const Point& b)全局函数方式下要注意成员访问限制,可以使用友元或其他方式思考:这两种方式你更喜欢用哪一种?有什么优缺点?问题2:设计一个复数类Complex,能进行复数的减法和输出,在main函数中的应用如下 int main() Complex c1,c2,c3;int r,i; coutri; c1.init(r,i);coutrI; c2.init(r,i); c3 = c2-c1; coutc3; return 0;提示:重载运算符不能使用成员函数形式2.3.3 实验内容 构造和析构函数设计日期类Date, 满足如下要求生成对象可以不带参数. 如Date a, 默认日期是1900-1-1可以带亚洲日期格式参数. 如 Date a(1990,1,1) 可以带欧洲日期格式参数. 如 Date a(1,1,1990) 月,日,年格式可以输出,如 couta; 按年月日输出说明: 为简化程序,规定字符串的月日必须用2位表示提示: 欧洲亚洲日期格式可以使用if语句判断,比如年小于12则表示月 在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论