《2023年面向对象程序设计(C++) 实验指导书.docx》由会员分享,可在线阅读,更多相关《2023年面向对象程序设计(C++) 实验指导书.docx(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、实验1类和对象1.1实验目的和规定(1)理解类和对象的概念,掌握声明类和定义对象的方法。(2)掌握构造函数和析构函数的实现方法。(3)初步掌握使用类和对象编制C+程序。(4)掌握对象数组、对象指针和string类的使用方法。(5)掌握使用对象、对象指针和对象引用作为函数参数的方法。(6)掌握类对象作为成员的使用方法。(7)掌握静态数据成员和静态成员函数的使用方法。(8)理解友元的概念和掌握友元的使用方法。1. 2实验内容和环节1 .输入下列程序/ / t es t 4 l.cpp#inclu d e usi n g n a mespac e std;c lass Coo r di n ate
2、p u blic:Coor d inate(i n t x 1 , i nt y 1) x= x 1 ;y =yi;C oordinate(Coordinate &p);Coo r d i n a te() co u t MD e stru ctor i s c a 1 le d edn”; v oid M y A r ra y :Inputcout V”请键盘输入 V vie n gth V个整数:;int i;int * p =alist;f o r ( i =0;i 1 e n gt h ;i+,p+)c i n * p ;)int m a i n()MyAr ray a (5);a.I
3、 n put();a. D ispl a y(“显示已输入的);ret urn 0;(2)声明一个类Sor t Array继承类MyArray,在该类中定义一个函数,具有将输入的整 数从小到大进行排序的功能。【提醒】在第(1)步的基础上可增长下面的参考框架:c 1 as s SorlArray : public MyAr ray publ i c :void So r t ();S o rtA r r ay( i n t 1 e ng) :M y A r r a y(le ng)coutMSo r t Array 类对象已创建 ”vV e ndl;)v i r tual So Array ()
4、;:SortArray: S ortA r r a y()c o utJ,S o rtArr a y 类对象被撤消。”endl;)void S o rtArra y :So r t()(/ /请自行编写Sort函数的代码,将输入的整数从小到大排序。)/并将主函数修改为:in t m a in ()So r t A r r a y a(5);s.InputQ;s.D i s pl a y(显示排序以前的”);s.Sort();s.Di s play(显示排序以后的”);r e (urn 0;)声明一个类ReArray继承类M y Ar r a y,在该类中定义一个函数,具有将输入的整数进 行倒置
5、的功能。【提醒】在第(1)步的基础上可增长下面的参考框架:Class ReArray:pub 1 ic MyArr a yPu bl i c :V o id r ev e r s e ();ReArray( i nt I e ng);V i rtual -RcArr a y();请读者自行编写构造函数、析构函数和倒置函数ReArray,以及修改主函数。(3)声明一个类AverA r r a y继承类MyArray,在该类中定义一个函数,具有求输入 的整数平均值的功能。【提醒】在第(1)步的基础上增长下面的参考框架:c lass A v erA r ray:publi c My Ar ray P
6、ubli c :Av e rArra y ( i nt 1 e ng);-Ave r Array();D oubl e Aver();;请读者自行编写构造函数、析构函数和求平均值函数Ave r (求解整数的平均值),以及 修改主函数。(2)声明一个 NewArray 类,同时继承了 类 So r t A rray,RcAr r ay 和 Aver Ar ray,使得类 NewAiray的对象同时具有排序、倒置和求平均值的功能。在继承的过程中声明MyArr a y为虚基类,体会虚基类在解决二义性问题中的作用。实验3多态性3.1实验目的和规定(1 ) 了解多态性的概念。(2)掌握运算符重载的基本方
7、法。(3)掌握虚函数的定义和使用方法。(4)掌握纯虚函数和抽象类的概念和用法。3. 2实验内容与环节1 .分析并调试下列程序,写出程序的输出结果,并解释输出结果。/ / lest 5 _l.cp p# in c 1 u deusing namespace s t d ;cl a s s Bpublic:v i rtua 1 v oid fl (double x )cout”B:f 1 ( d ou b lc)xcn d 1;)voi d f2(do u b 1 e x)co ud o ubl e ) ,2*xen d 1;void f 3 (d o uble x)co u tv V”B: :
8、f 3( d ouble)n3* x e ndl;)c lass D: publ i c Bpubli c :v i r t ual void f 1 (d o ublc x)cou t D :: fl (do u ble),x e ndl;1void I2(doubl e x) c ou t D: :f2(d o u ble) v2* x cn d 1;)v o id f 3(d o u b le x )coutfl(l. 23);pb-fl(1.2 3);pb-f2 ( 1 . 23);pb-f3(1.2 3);pb- f 3 (3.1 4);rctu r n 0 ;)2.编写一个程序,其
9、中设计一个时间类Ti me,用来保存时、分、秒等私有数据成员, 通过重载操作符“ + ”实现两个时间的相加。规定将小时范围限制在大于等于0,分钟范围 限制在05 9 ,秒钟范围限制在059秒。【提醒】时间类Timepu b lie:Tim e (int h=0 int m=0, i nt s = 0 );Time o p erator+( T imc&);void dispt i m e (s t ring);private:i n t h ou r se;i nt min u t e s;int secon d s;3 .给出下面的抽象基类co n la i ner;class con t
10、ainer (pro t e cted:double ra d iu s ;p ub 1 i c :c onta i nc r (do u bl e rad iusl);virtu aldo u b 1 e surfac e _ a rea()=0;v i rt u al d o u b 1 e vo 1 ume()=0;;规定建立3个继承conta i nc r的派生类cub e、sphcr e与cylin d cr,让每一个派生 类都包含虚函数surf a ce_a rea()和volume。,分别用来计算正方体、球体和圆柱体的 表面积及体积。规定写出主程序,应用C+的多态性,分别计算边长
11、为6. 0的正方体、 半径为5.0的球体,以及半径为5.0和高为6. 0的圆柱体的表面积和体积。4 .编写一个程序用于进行集合的并、差和交运算。例如输入整数集合9543 6 7 ) 和2 4 6 9 ,计算出它们进行集合的并、差和交运算后的结果。【提醒】i. 可用以下表达式实现整数集合的基本运算:sl+s2两个整数集合的并运算sl-s2两个整数集合的差运算sl*s2两个整数集合的交运算ii. 参考以下Set类的框架,用于完毕集合基本运算所需的各项功能。c 1 ass setpu b lie:se t :: set ();v o id set:i n put( i nt d );i n t se
12、t: :lenglh();int set:ge t d (int i );voi d set: d i s p ();s e t set: o p erat o r+(se t si);s e t se t :: oper a tor-(set si);se t s et:: o per a tor* (set s 1 );s ct s e t :opcrator= (set s 1 );protected:int len;in t s MAX ;实验4模板与异常解决4. 1实验目的和规定(D对的理解模板的概念。(2)掌握函数模板和类模板的声明和使用方法。(3)学习简朴的异常解决方法。4.2实
13、验内容和环节【.分析并调试下列程序,写出运营结果并分析因素。(1) / / te s t 6 _1_1. c p p# includ e u sin g namespace std;templateTmax(T x, T y ) retur n xy? x: y ;i n i ma x (int a, i n t b)ret urn a b? a:b;)d oub 1 e max (double a , double b ) r e t u m a b ? a:b;ini m a in() coutVv”max(3,7)is“vVmax(3, 7) en d 1;return 0;)(2)/t
14、e s t6I_2.c p p#in c hide using n amespa c e s td;int m a x(int a jn t b)r e turn ab? a: b ;doub 1 e ma x (d ou b 1 e a,doub 1 e b)return ab? a: b ;)i n t m a in() cou tVv“max( 3 ,7) is ttmax(t3,7,)en d 1;ret u r n 0 ;)2 .编写一个求任意类型数组中最大元素和最小元素的程序,规定将求最大元素和最小元素 的函数设计成函数模板。3 .编写一个程序,使用类模板对数组元素进行排序、倒置、
15、查找和求和。【提醒】设计一个类模板tem p 1 ate c 1 as s A r ray 具有对数组元素进行排序、倒置、查找和求和功能,然后产生类型实参分别为int型和double型的两个模板类,分别对整型数组与双精度数组完毕所规定的操作。4 .编写一个程序,求输入数的平方根。设立异常解决,对输入负数的情况给出提醒。实验5 C+的流类库与输入输出5 . 1实验目的和规定(1)掌握C+格式化的输入输出方法。(2)掌握重载运算符和“:”的方法。(3 )掌握磁盘文献的输入输出方法。5.2实验内容和环节1.下面给出的cpp程序用于打印九九乘法表,但程序中存在错误。请上机调试,使得此程序运营后,可以输
16、出如下所示的九九乘法表。*12345678911 243692 48121651 0152051 0152025661 21824303677142 12835424 9881 6243240881 62432404 85 66491 8273 6455 463728 1/te s t7_l_1. cpp #i n c 1 u d e in t g e t x ()return x ; int g e t y()re t urn y;private:i nt x,y ;;C o or d in a te:: Coordinate( C oordi n ate &p) x = p .x;y= P
17、 .y;c o ut”co p y-in i t i ali z ation Con s t r u ct o u i s ca 1 1 edn”;)int main() Coo r di n at e p 1 (3, 4);Coo r d i n a te p2(pl);Coo r di n a t e p3=p 2 ;co u,p3=rp3. getx (),;,p3.g e ly ()n;re t u r n (0);(1)写出程序的运营结果。(2)将Coordinate类中带有两个参数的构造函数进行修改,在函数体内增添下述语句:c outMC o n stru c tor i s c
18、a 1 1 ed. n;写出程序的运营结果,并解释输出结果。(3 )按下列规定进行调试:在主函数体内,添加卜.列语句:C o o r dinate p4;# i nc 1 ude us i n g namespac e std;int mai n ()i nt i, j;cout“ * ;f or(i = l;i=9; i +)coutiv ;cout e n d 1;for (i=l; i= 9 ; i +) co u t i;f or( j =1; j= i ; j+)C o uti*j;)r e t u rn 0;)2 .下面的程序用于记录文献xyz. txt中的字符个数,请填空完毕程序
19、。/ /te s t 7_2_1. c p p# includ e #includeusi n g n amesp a ce std;int mainO char c h;i nt i=0;i fs t r earn file;f il e . open( xyz. txt”,i o s: : in);if()(c outw x yz. t xt cann o t open, e nd 1 ;abort ();)Wh i 1 e (! fi 1 e. eof0)(i + + ;)c ou t V”文献字符个数:V”,使其可以输入一件商品的信息和输出这件商品的信息。商品的信息由编号、商品名和价格
20、。假如商品类Me rchandise的框架如下:cl a ss mer c han d ise (public:M e r c ha n d i ss();Mer c handiss();f r i e n d i s tream& o perat o r (is t ream& i n,M e r chandi s s& s );f ri e nd os t ream&op e rator(ostreani& out,Merc h a ndi s s & s);pr i va t e :int no;char *name;dou b le price;);规定实现该类,并编写以下的main函
21、数对该类进行操作。int ma i n() Merc h a n d i s e m e r ;cinme r ;c o ut m e r ;rc t u r n 0;)4 .编写一个程序,将两个文本文献连接成一个文献,然后将此文献中所有小写字母转换 成大写字母,并打印出来。C o or d in a I a p 5 ( 2 );调试程序时会出现什么错误?为什么?如何对已有的构造函数进行适当修改?(4)通过以上第(2)步和第(3)步的修改后,结合运营结果分析:创建不同的对象时会调用 不同的构造函数。2.设计一个4*4魔方程序,让魔方的各行值的和等于各列值的和,并且等于两对角线值的和。例如一下魔
22、方:3135259211 7139211 7131 9151 123727291各行、各列以及对角线值的和都是64.【提醒】求4火4魔方的一般环节如下:(1 )设立初始魔方的起始值和相邻元素之间的差值。例如上述魔方的初始魔方的起始值(f i rst)和相邻元素之间的差值(step)分别为:first= 1s le p =2(2)设立初始魔方元素的值。例如上述魔方的初始魔方为:1357911131517192 1232527293 1(3)生成最终魔方。方法如下:求最大元素值与最小元素值的和sum,该实例的sum是:1+31=32用3 2减去初始魔方所有对角线上元素的值,然后将结果放在本来的位置
23、,这样就可求得最终魔方。本例最终魔方如下:3 1352592 119151 713 I 123727291本题的魔方类mag i c的参考框架如下: clas s ma g i c p u bli c :void g ctda t a ();v o id setfirsima g ic();void g e ne r a temagic();vo i d p rintmagic();p riv a te:int m44;int s i e p;i n t fir s t;in t s um;):3 .设计一个用来表达直角坐标系的Loca t ion类,在主程序中创建类Lo c a tion的
24、两个对象A和B,规定A的坐标点在第3象限,B的坐标在第2象限,分别采用成员函数和友元 函数计算给定两个坐标点之间的距离,规定按如下格式输出结果:A(xl , y !),B(x2,y2)D istanccl =dlDi s ta n c e 1= d 2其中:xl、x2、yl、y 2为指定的坐标值,d 1和d2为两个坐标点之间的距离。【提醒】 类Lo c ation的参考框架如下:cl a ss L o c ation p ublic:Loc a tio n (doubl e ,dou b Ie);d o uble Get x ()d ouhlc Gcty()dou b 1 e d istan
25、c e (Locat i on &);fr i en d d o uble d i st a nc e (Locati o n &,Location &);pri v a te:double x, y ;);4 .声明一个Student类,在该类中涉及一个数据成员score(分数)、两个静态数据成员total_sc orc(总分)和count(学生人数);还涉及一个成员函数a c c ount()用于设立分数、累计学生 成绩之和、累计学生人数,一个静态成员函数sum。用于返回学生的成绩之和,另一个静态 成员函数average。用于求全班成绩的平均值。在main函数中,输入某班同学的成绩,并 调
26、用上述函数求出全班学生的成绩之和和平均分。5 .使用C+的string类,将5个字符串按逆转后的顺序显示出来。例如,逆转前的5个字 符串是:Germ a ny J apan Am erica Brit a in F r a n ce按逆转后的顺序输;11字符串是:Franc e Brit a in A merica J a pa n Germany*实验2派生类与继承2. 1实验目的和规定(1)掌握派生类的声明方法和派生类构造函数的定义方法。(2)掌握不同继承方式下,基类成员在派生类中的访问属性。(3)掌握在继承方式下,构造函数与析构函数的执行顺序与构造规则。(4)学习虚基类在解决二义性问题中
27、的作用。2. 2实验内容与环节.输入下列程序。/test 4 _ 1 .c p p# includeusing n amespace s t d ;cla s s BaseP u bl i c:void s et x ( i nt i)x=i;Int ge t x()ret u rn x;public:i nt x ;c 1 as s Deri v e d:p u b 1 i c Basepublic:voi d s ety( i nt i )y=i;lint ge(y()(retur n y;)v o id s how()co utBase:x=vVxV e n dl;p ublic:in
28、t y ;):int in a i n()Der i ved b b ;bb,set x (1 6 );b b . s e t y (25);bb.sh o w();cou t vv B ase: x =,bb. x e ndl;c out D e rive d :: y=,bb.yendl;c o u t ,Base: x =bb.g e tx()endl;co u tV”D e rived:: y =bb. g ety() endl;rctur n 0:)(1)写出程序的运营结果。(2)按以下规定,对程序进行修改后再调试,指出调试中犯错的因素。将基类Bas e中数据成员x的访问权限改为p
29、riv a t e时,会出现哪些错误?为什么?将基类B a se中数据成员x的访问权限改为pro t e c led时,会出现哪些错误?为什 么?在源程序的基础上,将派生类Der i ved的继承方式改为priv a te时,会出现哪些错 误?为什么?在源程序的基础上,将派生类Derived的继承方式改为protected时,会出现哪些错 误?为什么?2.编写一个学生和教师的数据输入和显示程序。学生数据有编号、姓名、性别、年龄、系别和成绩,教师数据有编号、姓名、性别、年龄、职称和部门。规定将编号、姓名、性别、 年龄的输入和显示设计成一个类Per s on,并作为学生类Stu d e n t和教
30、师类Teach e r 的基类。供参考的类结构如下:ci a s s Per s o n ;c 1 ass S t ud e n t: p ublic Per s o n );cla s s Teacher:p u b 1 ic P e r son ;3.按规定阅读、编辑、编译、调试和运营以下程序。(1)阅读、编辑、编译、调试和运营以下程序,并写出程序的运营结果。/test4_3_ 1 .cp P# i n c lud e i o s t ream#i n c 1 udeu s ing nam e space st d ;cla s s My A r ra y public:MyArra y
31、(int le n g );-MyArra y ;v o id In p ut();v o id Display( s tring);p r o tc c t e d :i nt*al i s t;int length;M y Arra y :MyArray (int 1 e ng) i f(le n g=0)cout,error length,ex i t (1 );)al i st=new i n t 1 eng;length= 1 e ng;if ( alist=NULL) c outVv” a s si g n fai 1 u r e ”;exit ( 1 );)c o u t”MyArr a y 类对象己创建。Mend 1 ;MyArray:M y A r ra y ()del e te alist;c ou t Vv”M y A r ray 类对象被撤消。e n dl;)v o id MyArray: : D i spl a y (string str)(int i;i n t * p=a 1 ist;c o utst r vvlenglhvv”个整数:“;for (i=0; i leng t h ; i+, p +)c oc oute n d 1 ;