《C++面向对象程序设计实验指导手册.doc》由会员分享,可在线阅读,更多相关《C++面向对象程序设计实验指导手册.doc(26页珍藏版)》请在三一办公上搜索。
1、C+面向对象程序设计实验指导手册班级:_学号:_姓名:_电子与信息工程学院计算机科学系第一部分 上机实验的指导思想和要求一、上机实验的目的学习C+程序设计不能满足于“懂得了”,满足于了解了语法和能看懂书上的程序,而应当掌握程序设计的全过程,即能独立编写出源程序,独立上机调试程序,独立运行程序和分析结果。设计C+的初衷是为方便开发大型程序,虽然在学校中初学C+时还没有机会接触到大型程序,更不可能编写出能供实际应用的大型程序,而只能接触到比较简单的程序。但是应当通过学习C+课程,对C+有比较全面的、然而是初步的认识,为今后进一步学习和应用C+打下良好的基础。程序设计是一门实践性很强的课程,必须十分
2、重视实践环节。许多实际的知识不是靠听课和看书学到手的,而是通过长时间的实践积累的。要提倡通过实践去掌握知识的方法。必须保证有足够的上机实验时间,学习本课程应该至少有30 小时的上机时间,最好能做到与授课时间之比为1:1 。除了学校规定的上机实验以外,应当提倡学生自己课余抽时间多上机实践。上机实验的目的,绝不仅是为了验证教材和讲课的内容,或者验证自己所编的程序正确与否。学习程序设计,上机实验的目的是:(1)加深对讲授内容的理解,尤其是一些语法规定,光靠课堂讲授,既枯燥无味又难以记住,但它们是很重要的,初学者的程序出错往往错在语法上。通过多次上机,就能自然地、熟练地掌握。通过上机来掌握语法规则是行
3、之有效的方法。(2)熟悉所用的计算机系统的操作方法,也就是了解和熟悉C+程序开发的环境。一个程序必须在一定的外部环境下才能运行,所谓“环境”,就是指所用的计算机系统的硬件和软件条件,或者说是工作平台。使用者应该了解为了运行一个C+程序需要哪些必要的外部条件(例如硬件配置、软件配置),可以利用哪些系统的功能来帮助自己开发程序。每一种计算机系统的功能和操作方法不完全相同,但只要熟练掌握一两种计算机系统的使用,再遇到其他系统时便会触类旁通,很快地学会。(3)学会上机调试程序。也就是善于发现程序中的错误,并且能很快地排除这些错误,使程序能正确运行。经验丰富的人,在编译连接过程中出现“出错信息”时,一般
4、能很快地判断出错误所在,并改正之。而缺乏经验的人即使在明确的“出错提示”下也往往找不出错误而求助于别人。要真正掌握计算机应用技术,就不仅应当了解和熟悉有关理论和方法,还要求自己动手实现。对程序设计来说,则要求会编程序并上机调试通过。因此调试程序不仅是得到正确程序的一种手段,而且它本身就是程序设计课程的一个重要的内容和基本要求,应给予充分的重视。调试程序固然可以借鉴他人的现成经验,但更重要的是通过自己的直接实践来累积经验,而且有些经验是只能“会意”难以“言传”。别人的经验不能代替自己的经验。调试程序的能力是每个程序设计人员应当掌握的一项基本功。因此,在做实验时千万不要在程序通过后就认为万事大吉、
5、完成任务了,而应当在己通过的程序基础上作一些改动(例如修改一些参数、增加程序一些功能、改变某些语句等),再进行编译、连接和运行。甚至于“自设障碍”,即把正确的程序改为有错的(例如语句漏写分号;比较符“= =”错写为赋值号“=”;使数组下标出界;使整数溢出等),观察和分析所出现的情况。这样的学习才会有真正的收获,是灵活主动的学习而不是呆板被动的学习。二、上机实验前的准备工作在上机实验前应事先做好准备工作,以提高上机实验的效率,准备工作至少应包括:(1)了解所用的计算机系统(包括C+编译系统和工作平台)的性能和使用方法;(2)复习和掌握与本实验有关的教学内容;(3)准备好上机所需的程序。手编程序应
6、书写整齐,并经人工检查无误后才能上机,以提高上机效率。初学者切忌不编程序或抄别人程序去上机,应从一开始就养成严谨的科学作风;(4)对运行中可能出现的问题事先作出估计,对程序中自己有疑问的地方,应作出记号,以便在上机时给予注意;(5)准备好调试和运行时所需的数据。三、上机实验的步骤上机实验时应该一人一组,独立上机。上机过程中出现的问题,除了是系统的问题以外,一般应自己独立处理,不要轻易举手问教师。尤其对“出错信息”,应善于自己分析判断。这是学习调试程序的良好机会。上机实验一般应包括以下几个步骤:(1)进入C+工作环境(例如Visual C+6.0)。(2)输入自己所编好的程序。(3)检查一遍已输
7、入的程序是否有错(包括输入时打错的和编程中的错误),如发现有错,及时改正。(4)进行编译和连接。如果在编译和连接过程中发现错误,屏幕上会出现“出错信息”,根据提示找到出错位置和原因,加以改正。再进行编译,如此反复直到顺利通过编译和连接为止。(5)运行程序并分析运行结果是否合理和正确。在运行时要注意当输入不同数据时所得到的结果是否正确。(6)输出程序清单和运行结果。四、实验报告实验后,应整理出实验报告,实验报告应包括以下内容:(1)题目;(2)程序清单(计算机打印出的程序清单);(3)运行结果(必须是上面程序清单所对应打印输出的结果);(4)对运行情况所作的分析以及本次调试程序所取得的经验。如果
8、程序末能通过,应分析其原因。第二部分 关于程序的调试和测试一、程序错误的类型为了帮助各位同学调试程序和分析程序,下面简单介绍程序出错的种类。(1)语法错误即不符合C+语言的语法规定,例如将main 错写为naim ,括号不匹配,语句最后漏了分号等,这些都会在编译时被发现并指出。这些都属于“致命错误”, 不改正是不能通过编译的。对一些在语法上有轻微毛病但不影响程序运行的错误(如定义了变量但始终未使用),编译时会发出“警告”,虽然程序能通过编译,但不应当使程序“带病工作”,应该将程序中所有导致“错误(error)”和“警告(warning)”的因素都消除,再使程序投入运行。(2)逻辑错误这是指程序
9、无语法错误,也能正常运行,但是结果不对。例如求s=l+2+3+100,有人写出以下语句:for(s=0, i=1; iab;c=a/b;coutcendl;return 0;当输入的b为非零值时,运行无问题。当输入的b为零时,运行时出现“溢出(overflow)”的错误。如果在执行上面的cin语句时输入456.78 34.56,则输出c的值为2,显然是不对的。这是由一于输入的数据类型与输入格式符不匹配而引起的。二、程序的测试程序调试的任务是排除程序中的错误,使程序能顺利地运行并得到预期的效果。程序的调试阶段不仅要发现和消除语法上的错误,还要发现和消除逻辑错误和运行错误。除了可以利用编译时提示的
10、“出错信息”来发现和改正语法错误外,还可以通过程序的测试来发现逻辑错误和运行错误。程序测试的任务是尽力寻找程序中可能存在的错误。在测试时要设想到程序运行时的各种情况,测试在各种情况下的运行结果是否正确。程序测试是程序调试的一个组成部分。有时程序在某些情况下能正常运行,而在另外一些情况下不能正常运行或得不到正确的结果,因此,一个程序即使通过编译并正常运行而且结果正确,还不能认为程序没有问题了。要考虑是否在任何情况下都能正常运行并且得到正确的结果。测试的任务就是要找出那些不能正常运行的情况和原因。下而通过一个典型的和容易理解的例子来说明测试的概念。求一元二次方程ax2+bx+c=0的根。有人根据求
11、根公式x1, 2=(-bsqrt(b2-4ac)/2a编写出以下程序:# include # includeusing namespace std;int main( ) float a, b, c, disc, x1, x2; cinabc; disc=b*b-4*a*c; x1=(-b + sqrt(disc)/(2*a); x2=(-b - sqrt(disc)/(2*a); cout”x1=”x1”x2=”x20有两个不等的实根:x1, 2=(-bsqrt(b2-4ac)/2a b2-4ac=0有两个相等的实根:x1= x 2=-b/2a b2-4ac0 a0,b2-4ac=0 a0,
12、 b2-4ac0 a=0,b0 a=0,b= 0,c = 0 a=0,b= 0,c0应当分别测试程序在以上6 种情况下的运行情况,观察它们是否符合要求。为此,应准备6 组数据。用这6 组数据去测试程序的“健壮性”。在使用上面这个程序时,显然只有满足情况的数据才能使程序正确运行,而输入满足情况的数据时,程序出错。这说明程序不“健壮”。为此,应当修改程序,使之能适应以上6 种情况。可将程序改为:#include#includeusing namespace std;int main( ) float a, b, c, disc, x1, x2, p, q; coutabc; if(a= =0) i
13、f(b= =0) if(c= =0) coutIt is trivial.endl; else coutIt is impossible.endl; else coutIt has one solution:endl; coutx=-c/b=0) if(disc0) coutIt has two real solutions:endl; x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); coutx1=x1,x2=x2endl; else coutIt has two same real solutions:endl; coutx1=x2=-b/
14、(2*a)endl; else coutIt has two complex solutions:endl; p=-b/(2*a); q=sqrt(-disc)/(2*a); coutx1=p+qi, x2=p-qi“a + b =” a + b ; 选择BuildCompile test.cpp命令,对此源程序进行编译。观察和分析编译信息。 根据编译信息指出的错误,修改程序。再进行编译,如果还有错,再重复此过程,直到编译不出错为止。 选择BuildBuild test.exe命令,对程序进行连接,如果不出错,就会生成可执行程序test.exe 。 选择BuildExecute test.ex
15、e 命令,执行可执行程序test.exe观察屏幕的变化。在输出窗口应显示程序运行结果。 分析结果是否正确,如果不正确或认为输出格式不理想,可以修改程序,然后重新执行以上至步骤。此外,还可利用已有的源程序建立一个新程序。由于刚才已建立了一个名为test.cpp 的源程序,可以以它为基础建立一个新程序,这样更方便些。按以下步骤: 通过“资源管理器”或“我的电脑”,按文件路径找到已有源程序test.cpp。 双击“test.cpp”图标,进入Visual C+集成环境,打开test.cpp。 在test.cpp基础上将源程序修改为以下内容(第1章第9题):# include using namesp
16、ace std ; int main ( ) int a , b ; c = add ( a , b ) cout a + b = cendl ; return 0 ; int add ( int x , int y ) ; z = x + y ; return (z); 选择FileSave as命令,用新的文件名other.cpp保存。此时,other.cpp与test.cpp 在同一子目录下。 对新文件other.cpp进行编译、连接和运行。步骤与前相同。3 预习内容C +面向对象程序设计第1章。这是第一个实验,写得比较详细。希望大家能在实验中多思考,多给自己提问题,多设想几种可能性。做
17、实验时不要满足于验证书本知识。在以后的实验中,请大家自己设计具体的实验步骤,尽可能自己补充增加一些内容,以提高自己的实践能力。实验二 C+对C的扩充1实验目的(1)了解在面向过程程序设计中C+对C功能的扩充与增强,并善于在编写程序过程中应用这些新的功能。(2)进一步熟悉在所用的系统上编辑、编译、连接和运行C+程序的方法。(3)进一步熟悉C+程序的结构和编程方法。2实验内容和步骤要求事先编好解决下面问题的程序,然后上机输入程序并调试运行。(1)输入以下程序,进行编译,观察编译情况,如果有错误,请修改程序,再进行编译,直到没有错误,然后进行连接和运行,分析运行结果(本题是C+面向对象程序设计第1章
18、习题第9题)。# include using namespace std ; int main ( ) int a , b ; c = add ( a , b ) cout a + b = cendl ; return 0 ; int add ( int x , int y ) ; z = x + y ; return (z);(2)编一个程序,用来求2个或3个正整数中的最大数。 用不带默认参数的函数实现。 用带有默认参数的函数实现。(本题是C+面向对象程序设计第1章习题第11题)对比两种方法,分析用带有默认参数的函数的优点和应用的场合。总结如何选择默认参数的值。请分析本题中默认参数的值应该在
19、什么范围。(3)输入两个整数,将它们按由大到小的顺序输出(本题是C+面向对象程序设 计第1章习题第12题)。 使用指针方法。 使用变量的引用。比较这两种方法的特点和使用方法。(4)对3个变量按由小到大顺序排序,要求使用变量的引用(本题是C+面向对象程序设计第1章习题第13题)。 使用指针方法。 使用变量的引用。请总结使用引用时要注意什么问题。(5)有5个字符串,要求对它们按由小到大顺序排列,用string方法(本题是C+ 面向对象程序设计第1章习题第16题)。(6)编一个程序,用同一个函数名对n个数据进行从小到大排序,数据类型可以是整型、单精度型、双精度型(本题是C+面向对象程序设计第1章习题
20、第17题和18题)。 用重载函数实现。 用函数模板实现。比较这两种方法各有什么特点,什么情况下可以用函数模板代替重载函数?什么情况下不可以用函数模板代替重载函数?3预习内容C+面向对象程序设计第l章。实验三 类和对象(一)1实验目的(1)掌握声明类的方法,类和类的成员的概念以及定义对象的方法。(2)初步掌握用类和对象编制基于对象的程序。(3)学习检查和调试基于对象的程序。2实验内容(1)有以下程序:# include using namespace std ; class Time /定义Time类 public: /数据成员为公用的int hour ; int minute ; int se
21、c ; ;int main ( ) Time tl ; /定义t1为Time类对象cintl.hour ;/输入设定的时间cin tl.minute ;cintl.sec ; coutt1.hour”:”t1.minutetl.secendl; /输出时间return 0; 改写程序,要求: 将数据成员改为私有的; 将输入和输出的功能改为由成员函数实现; 在类体内定义成员函数。然后编译和运行程序。请分析什么成员应指定为公用的?什么成员应指定为私有的?什么函数最好放在类中定义?什么函数最好在类外定义?本题是C+面向对象程序设计第2章第2题。(2)分别给出如下的3个文件: 含类定义的头文件stud
22、ent.h 。/student.h (这是头文件,在此文件中进行类的声明)class Student /类声明 public : void display ( ) ; /公用成员函数原型声明private : int num ; char name20 ; char sex ; ; 包含成员函数定义的源文件student.cpp。/student.cpp (在此文件中进行函数的定义)# include # include “student.h” /不要漏写此行,否则编译通不过void Student : : display ( ) /在类外定义display类函数 cout”num:”nume
23、ndl; cout”name:”nameendl;cout”sex:”sexendl; 包含主函数的源文件main.cpp。为了组成一个完整的源程序,应当有包括主函数的源文件:/main.cpp (主函数模块)# include # include ”student.h” /将类声明头文件包含进来int main ( ) Student stud ; /定义对象stud.display( ); /执行stud对象的display函数return 0; 请完善该程序,在类中增加一个对数据成员赋初值的成员函数set_value。上机调试并运行。本题是C+面向对象程序设计第2章第4题。(3)需要求3
24、个长方柱的体积,请编一个基于对象的程序。数据成员包括length(长)、width(宽)、height(高)。要求用成员函数实现以下功能: 由键盘分别输入3 个长方柱的长、宽、高; 计算长方柱的体积; 输出3个长方柱的体积。请编程序,上机调试并运行。本题是C+面向对象程序设计第2章第6题。3预习内容C+面向对象程序设计第2章。实验四 类和对象(二)1实验目的(1)进一步加深对类和对象的理解。(2)掌握类的构造函数和析构函数的概念和使用方法。(3)掌握对象数组、对象的指针及其使用方法。(4)掌握友元的概念和使用。(5)了解类模板的使用方法。2实验内容(1)有以下程序:# include clas
25、s Student public:Student ( int n, float s ) : num(n) , score(s) void change ( int n , float s ) num=n; score=s; void display ( ) cout num ” ”scoreendl; private : int num ;float score ; ; void main ( ) Student stud (101, 78.5); stud. display ( )stud. change (101, 80.5 ) ; stud . display( ); 阅读此程序,分析其
26、执行过程,然后上机运行,对比输出结果。本题是C+面向对象程序设计第3章第6题。 修改上面的程序,增加一个fun函数,改写main函数。在main函数中调用fun函数,在fun函数中调用change和display函数。在fun函数中使用对象的引用(Student &)作为形参。本题是C+面向对象程序设计第3章第8题。(2)商店销售某一商品,商店每天公布统一的折扣(discount)。同时允许销售人员在销售时灵活掌握售价(price),在此基础上,对一次购10件以上者,还可以享受9.8折优惠。现己知当天3个销货员销售情况为:销货员号(num)销货件数(quantity)销货单价(price )
27、101 5 23.5 102 12 24.56103 100 21.5 请编程序,计算出当日此商品的总销售款sum以及每件商品的平均售价。要求用静态数据成员和静态成员函数。本题是C+面向对象程序设计第3章第9题。提示:将折扣discount,总销售款sum和商品销售总件数n声明为静态数据成员,再定义静态成员函数average(求平均售价)和display(输出结果)。(3)有以下程序(这是C+面向对象程序设计第3章例3.13的程序):#include using namespace std;class Date;class Time public: Time(int, int, int); v
28、oid display(Date&); private: int hour; int minute; int sec; ;class Date public: Date(int, int, int); friend void Time: display(Date &); private: int month; int day; int year; ; Time: Time (int h, int m, int s) hour=h; minute=m; sec=s; void Time: display(Date &da) coutda.month/da.day/da.yearendl; cou
29、thour:minute:secendl; Date: Date(int m, int d, int y) month=m; day=d; year=y; int main()Time t1(10,13,56); Date d1(12,25,2004); t1.display(d1); return 0;请读者分析和运行此程序,注意友元函数Time : : display 的作用。将程序中的display 函数不放在Time类中,而作为类外的普通函数,然后分别在Time和Date类中将display声明为友元函数。在主函数中调用display函数,display函数分别引用Time和Date两
30、个类的对象的私有数据,输出年、月、日和时、分、秒。本题是C+面向对象程序设计 第3章第10题。修改后上机调试和运行。(4)有以下使用类模板程序(这是C+面向对象程序设计第3章例3.14的程序):#include using namespace std;templateclass Compare public: Compare(numtype a,numtype b) x=a;y=b; numtype max() return (xy)?x:y; numtype min() return (xy)?x:y; private: numtype x,y; ;int main()Compare cmp
31、1(3,7); coutcmp1.max() is the Maximum of two inteder numbers.endl; coutcmp1.min() is the Minimum of two inteder numbers.endlendl; Compare cmp2(45.78,93.6); coutcmp2.max() is the Maximum of two float numbers.endl; coutcmp2.min() is the Minimum of two float numbers.endlendl; Compare cmp3(a,A); coutcmp
32、3.max() is the Maximum of two characters.endl; coutcmp3.min() is the Minimum of two characters.endl; return 0; 运行此程序,体会类模板的作用。 将它改写为在类模板外定义各成员函数。3预习内容C+面向对象程序设计第3章。实验五 运算符重载1实验目的(1)进一步了解运算符重载的概念和使用方法。(2)掌握几种常用的运算符重载的方法。(3)了解转换构造函数的使用方法。(4)了解在Visual C+6.0环境下进行运算符重载要注意的问题。2实验内容事先编写好程序,上机调试和运行程序,分析结果。(1)声明一个复数类Complex,重载运算符“+”,“-”,“*”,“/”,使之能用于复数的加、减、乘、除,运算符重载函数作为Complex 类的成员函数。编程序,分别求两个复数之和、差、积和商。本题是C+面向对象程序设计第4章第2题。请思考:你编的程序能否用于一个整数与一个复数的算术运算?如4 + ( 5 - 2i )。(2)声明一个复数类Co