还剩53页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
《面向对象程序设计》实验报告学院专业班级学号姓名学期教师实验一C++基础练习院(系)课程名称面向对象程序设计教师签名班级学号实验室姓名实验成绩所用软件Word文档、VC++软件实验目的和要求
1.掌握C++程序的基本格式与规范,学会编写简单的C++程序
2.理解C++程序结构的特点
3.熟悉C++程序基本的输入和输出操作
4.掌握C++数据类型常量和变量以及修饰符的使用方法
5.掌握函数定义、函数调用和函数说明的方法
6.熟悉作用域运算符的功能和基本使用方法
7.掌握C++内存的动态分配与释放方法
8.理解引用的概念,掌握引用的使用方法实验内容和步骤
1.调试如下的代码并回答问题#includeiostream.hvoidmain{//Firstc++programcharname
[10];coutpleaseinputyourname:;cinname;coutwelcomenameendl;}
(1)C++的注释和C有何不同?答C语言的注释有一种,用/*……….*/作为注释分界符号C++除保留了这种注释方式之外,还提供了一种更有效的注释方式,该注释以“//”开始,到行尾结束
(2)C++的输入和输出所使用的函数及其相应头文件与C有何不同?答在C中进行输入输出操作时,常使用函数scanf和printfC++除了可以照常使用这两个函数进行输入输出外,还增加了标准输入流对象cin和标准输出流对象cout来进行输入和输出Iostream是C++系统定义的一个头文件,在这个文件中声明了程序所需要的输入和输出操作的有关信息在C语言中头文件中用“.h”作为后缀,如stdio.h、math.h等
2.单步调试如下的代码并回答问题#includeiostream.hinlineintfintx{return2*x*x+4*x+5;}inlinedoublefdoublex{return2*x*x+4*x+5;}voidmain{intx=5;doubley=
5.2;coutfxendl;coutfyendl;}
(1)inline的含义和作用是什么?答含义在函数说明前冠以关键字“inline”,该函数就被声明为内联函数,每当程序中出现对该函数的调用时C++编译器使用函数体中的代码插入到调用该函数的语句处,同时用实参取代形参作用主要是为了消除函数调用时的系统开销,以提高运行速度
(2)C允许两个函数同名(函数重载)么,函数重载的作用是什么?答不允许,作用方便使用函数,只要函数参数的类型不同,或者参数的个数不同,或者二者兼而有之,两个或者两个以上的函数可以使用相同的函数名实现函数编译的多态性
(3)单步调试(F
10、F11),记录fx和fy会分别调用哪段代码,为什么?答fx会调用intfint5fy会调用doublefdouble
5.2因为虽然两个函数名是一样的,形参类型和返回值类型不同,根据所给的实参类型如int型就调用intfint
53.单步调试如下程序并回答问题#includeiostream.hinta[]={12345678910};intsum;voidmain{inti;intsum=0;fori=0;i10;i++{ifa[i]%2!=0sum=sum+a[i];::sum=::sum+a[i];}coutsumofallis:::sum;coutsumofoddis:sum;}
(1)什么是局部变量和全局变量,其作用域如何界定?答全局变量在函数外定义的变量,可以为本源文件的其他函数所公用,有效范围为从定义变量的位置开始到本源文件结束局部变量在一个函数内部定义的变量是内部变量,它只在本函数范围内有效
(2)在局部变量和全局变量作用域重叠区域,默认哪个变量起作用;如果一定要访问全局变量,怎么实现答默认局部变量起作用如果一定要访问全局变量,可以用::对所屏蔽的同名全局变量进行访问
(3)单步调试,查看并记录程序中循环体的两条语句的sum的变化情况,并说明它们是局部变量和全局变量答第一个sum为全局变量,第二个::sum为局部变量
4.调试如下程序并回答问题#includeiostream.hvoidmain{double*r;r=newdouble;cin*r;coutAreais:
3.14**r**r;deleter;}
(1)C语言的内存申请和释放使用哪个函数答内存申请malloc释放free
(2)C++的内存申请和释放使用哪个函数?简单比较答内存申请new释放delete使用malloc函数时必须使用sizeof函数来计算所需要的字节数,而new可以根据数据类型自动计算所要分配内存的大小,这就减小了发生错误的可能性new能够自动返回正确的指针类型,而不必像malloc函数那样,必须在程序中进行强制类型转换,才能使其返回正确的指针类型实验二C++简单程序设计练习院(系)课程名称面向对象程序设计教师签名班级学号实验室姓名实验成绩所用软件Word文档、VC++软件实验目的和要求
1.掌握if语句的用法
2.掌握switch语句的用法
3.掌握循环和多重循环的用法
4.掌握函数的定义和调用
5.掌握数组的定义和基本操作实验内容和步骤
1.根据输入的百分制按五分制的成绩输出,记录和分析实验结果(后续每个实验都有此要求,不再一一注明)百分制与五分制之间的关系见下表分别使用if分支结构和switch结构编写程序百分制五分制90~100580~89470~79360~6920~591#includeiostream.hintmain{inta;cout从键盘输入百分制:endl;//输入一个百分制的数cina;ifa0a60cout五分制为:1endl;//如果0a60,输出是五分制为1elseifa70cout五分制为:2endl;//同上以此类推2elseifa80cout五分制为:3endl;//3elseifa90cout五分制为:4endl;//4elseifa=100cout五分制为:5endl;//5}使用if嵌套语句实现某一范围内的输出具体看注释#includeiostream.hvoidmain{intab;cout从键盘输入百分制:endl;//输入一个百分制的数cina;b=a/10;//对a求商并赋值给bswitchb//确定b的值为什么值{case10:case9:cout五分制为:5endl;break;//为10或9执行此语句输出是五分制为5case8:cout五分制为:4endl;break;//同上case7:cout五分制为:3endl;break;case6:cout五分制为:2endl;break;default:cout五分制为:1endl;break;//不为以上的值就执行此语句}}用switch语句实现分析如上的注释
2.编程求3~100之间的所有素数,要求编写一个素数判断的函数,然后在主程序中调用#includeiostream.h#includemath.hintmain{inti;//定义变量iintfunint;//函数的声明fori=3;i=100;i++iffunicoutiendl;//根据fun(i)的真值,为1时表示为素数则输出}intfunintn//函数的定义{intit;//定义两个整型变量t=sqrtn;fori=2;i=t;i++//当有能被整除的数则返回0,后则返回1ifn%i==0return0;return1;}
3.编写程序列出斐波那契Fibonacci数列的前20项Fibonacci数列是指前两项为1,后面的每一项都为前两项之和要求用数组存储数列#includeiostream.hvoidmain{inta
[20]={11};//初始化数组aa
[0]=a
[1]=1inti;fori=2;i20;i++{a[i]=a[i-1]+a[i-2];//后面每一项都为前两项之和}fori=0;i20;i++//输出前20个斐波那契数列{couta[i]endl;}}
4.编程实现输入10个整数,从小到大排列输出#includeiostream.hintmain{inta
[10];//定义一个整型数组intijt;//定义三个整型变量ijtcout从键盘输入十个整数:endl;//提示性语句从键盘输入十个整数fori=0;i10;i++{cina[i];//输入数据}fori=0;i10;i++//采用冒泡排序法外部循环{forj=0;j10;j++//内部循环{ifa[j]a[j+1]//如果不是从小到大排列则交换位置关系{t=a[j];a[j]=a[j+1];a[j+1]=t;}}}fori=0;i10;i++//输出整理好后的数组{couta[i]endl;}}实验三类与对象
(一)院(系)课程名称面向对象程序设计教师签名班级学号实验室姓名实验成绩所用软件Word文档、VC++软件实验目的和要求
1.掌握类、类的数据成员、类的成员函数的定义方式
2.理解类成员的访问控制方式
3.掌握对象的定义和操作对象的方法
4.理解构造函数和析构函数的定义与执行过程
5.掌握重载构造函数的方式
6.了解拷贝构造函数的方法实验内容
1.声明一个时间类,时间类中有3个私有数据成员(Hour,Minute,Second)和两个公有成员函数(SetTime和PrintTime)SetTime根据传递的3个参数为对象设置时间;PrintTime负责将对象表示的时间显示输出在主函数中,建立一个时间类的对象,设置时间为9点20分30秒并显示时间#includeiostream.hclasstime{//声明的一个时间类timepublic://公共函数成员voidSetTimeintiintjintk{Hour=i;Minute=j;Second=k;}voidPrintTime{coutHour点;coutMinute分;coutSecond秒endl;}private://三个私有成员intHour;intMinute;intSecond;};intmain{times;//定义一个对象ss.SetTime92030;//调用对象s的成员函数SetTime,给s的数据成员赋值s.PrintTime;//输出显示出来}
2.使用构造函数代替上面的SetTime成员函数,并在主函数中使用构造函数设置时间为10点40分50秒,并显示该时间说明构造函数和SetTime成员函数在使用时的区别#includeiostream.hclasstime{public:timeintiintjintk//定义构造函数,其名与类名相同{Hour=i;//在构造函数中,对私有数据赋值Minute=j;Second=k;}voidPrintTime{coutHour点;coutMinute分;coutSecond秒endl;}private:intHour;intMinute;intSecond;};intmain{times104050;//定义类的对象时调用构造函数time//分别给数据成员Hour、Minute和Second赋初值
10、40和50s.PrintTime;}说明构造函数的作用主要是用来对对象进行初始化,定义对象时被系统自动调用而SetTime成员函数赋初值既不方便也容易忘记,甚至可能出错
3.重载时间类的构造函数(不带参数)使小时、分、秒均为0#includeiostream.hclasstime{public:time;voidPrintTime;private:intHour;intMinute;intSecond;};time::time{Hour=0;Minute=0;Second=0;}inlinevoidtime::PrintTime{coutHour点;coutMinute分;coutSecond秒endl;}intmain{times1;couts1output:endl;s
1.PrintTime;}
4.在时间类的析构函数中输出“Goodbye!”说明析构函数的特点和调用时机#includeiostream.hclasstime{public:timeintiintjintk;//构造函数的声明~time;//析构函数的声明voidPrintTime;private:intHour;intMinute;intSecond;};time::timeintiintjintk//构造函数的定义{Hour=i;Minute=j;Second=k;cout构造函数被调用endl;//显示构造函数被调用的信息}time::~time//定义析构函数{coutgoodbyeendl;}voidtime::PrintTime{coutHour点;coutMinute分;coutSecond秒endl;}intmain{times104050;s.PrintTime;}析构函数的特点析构函数名与类名相同,但它前面必须加一个波浪号(~),不返回任何值是不能说明它的类型的,析构函数没有参数,撤销对象时,编译系统会自动地调用析构函数主函数中的语句执行完后,对象的生命周期结束,在撤销时就要调用析构函数,释放分配给对象的存储空间对显示信息goodbye
5.定义拷贝构造函数并调用说明拷贝构造函数的作用特点#includeiostream.hclasstime{public:timeintiintjintk{Hour=i;Minute=j;Second=k;}timeconsttimep//拷贝构造函数{Hour=p.Hour+1;Minute=p.Minute-20;Second=p.Second-40;}voidPrintTime{coutHour点;coutMinute分;coutSecond秒endl;}private:intHour;intMinute;intSecond;};intmain{times1104050;//定义对象s1,调用了普通的构造函数times2s1;//调用拷贝构造函数,用对象s1初始化对象s2s
1.PrintTime;s
2.PrintTime;}拷贝构造函数的作用特点用于按照需要初始化新对象在建立一个新对象时,使用一个已经存在的对象去初始化这个新对象实验四类与对象
(二)院(系)课程名称面向对象程序设计教师签名班级学号实验室姓名实验成绩所用软件Word文档、VC++软件实验目的和要求
1.掌握对象数组的定义与使用方法
2.理解对象指针的概念,学会用指针引用对象
3.了解this指针的工作方式
4.掌握静态数据成员和静态成员函数的基本使用方法
5.理解友元与友元函数的作用,掌握其使用方法实验内容1定义一个学生(student)类,包含数据成员学号(sno)、姓名(name)、年龄(age)、分数(score),以及成员函数输入(input)和显示(print)然后定义一个具有10个学生的数组,实现对这些学生信息的输入和显示#includeiostreamusingnamespacestd;classMyArray{public:MyArrayintleng{length=leng;alist=newint[length];}~MyArray{deletealist;}voidinput{inti;fori=0;ilength;i++cinalist[i];}voiddisplay{intj;forj=0;jlength;j++coutalist[j]endl;}protected:int*alist;intlength;};intmain{intleng;cinleng;MyArrayAleng;A.input;A.display;return0;}
2.修改上一个程序中的main函数定义一个student类的指针p,使其指向上述数组的第0个元素,并通过该指针实现对10个学生信息的输入和显示最后简要说明对象数组、对象指针和普通数组和指针有何区别和联系#includeiostream#includestringusingnamespacestd;classstudent{private:intsno;stringname;intage;intscore;public:voidinput{cinsnonameagescore;}voidprint{cout学号snoendl;cout姓名nameendl;cout年龄ageendl;cout分数scoreendl;}};intmain{studentk
[10];student*p;inti;fori=0;i=9;i++{p=k[i];p-input;p-print;}}对象数组的元素是对象,不仅具有数据成员,而且还有函数成员,对象指针就是用于存放对象地址的变量,对象指针不仅能引用单个对象,也能访问对象数组普通数组是存放类型一样的数据,指针可以通过访问首地址一一访问存放的数值
3.通过单步调试第一个程序,查看并记录每个元素的地址及其this指针的值,通过对比说明this指针的作用#includeiostream#includestringusingnamespacestd;classstudent{private:intsno;stringname;intage;intscore;public:voidinput{cinsnonameagescore;}voidprint{coutthis=this学号snoendl;cout姓名nameendl;cout年龄ageendl;cout分数scoreendl;}};intmain{studentk
[10];inti;fori=0;i=9;i++{k[i].input;k[i].print;}}sno-858993460age-858993460name{ox00000000’’’’}score-858993460this指针指向的是对象的初始地址
4.将student类增加两个静态成员,人数(count)和平均分(average)注意构造函数、析构函数的编写以及静态成员的初始化,并说明这两个成员设置为静态成员的原因#includeiostream#includestringusingnamespacestd;classstudent{private:intsno;char*name;intage;intscore;staticintcount;staticfloataverage;staticfloatsum;public:voidinput{cinsnonameagescore;}voidprint{cout学号snoendl;cout姓名nameendl;cout年龄ageendl;cout分数scoreendl;}voidshow{cout学生人数:count;cout平均成绩:averageendl;}studentintsnolchar*namelintagelintscorel{sno=snol;name=newchar[strlennamel+1];strcpynamenamel;age=agel;score=scorel;++count;sum=sum+score;average=sum/count;}~student{deletename;--count;sum=sum-score;}};intstudent::count=0;floatstudent::sum=
0.0;floatstudent::average=
0.0;intmainstudenta11小小2099;a
1.print;a
1.show;studenta22小江12100;a
2.print;a
2.show;studenta33肖肖2189;a
2.print;a
2.show;return0;}count随着定义对象的增加而增加每定义一个对象,count加1,累计学生人数,average也应该随着定义对象的增加而改变着因此它们被声明为静态数据成员,被studengt类的对象所共享
5.定义一个友元函数output,实现和成员函数print相同的功能说明友元函数作用以及和成员函数的区别#includeiostream#includestringusingnamespacestd;classstudent{private:intsno;stringname;intage;intscore;public:voidinput{cinsnonameagescore;}friendvoidoutputstudent;voidprint{cout学号snoendl;cout姓名nameendl;cout年龄ageendl;cout分数scoreendl;}};voidoutputstudentp{cout学号p.sno姓名p.nameendl;cout年龄p.age分数p.scoreendl;}intmain{studentk
[10];inti;fori=0;i=9;i++{k[i].input;outputk[i];}}友员函数可以通过入口参数传递进来的对象名(或对象指针、对象引用)来访问该对象所有的的数据成员,提高了程序运行效率没有友员机制,外部函数访问类的私有数据,必须调用公有成员函数,在需要频繁调用私有数据时,会带来很大的开销,降低程序运行效率实验五派生类与继承院(系)课程名称面向对象程序设计教师签名班级学号实验室姓名实验成绩所用软件Word文档、VC++软件实验目的和要求1理解类的继承的概念,能够定义和使用类的继承关系
2.掌握派生类的声明和定义方法
3.熟悉公有派生和私有派生的访问特性
4.学习虚基类中解决二义性问题中的作用实验内容定义一个基类MyArray,基类中可以存放一组整数classMyArray{public:MyArrayintleng;~MyArray;voidInput;voidDisplay;protected:int*alist;//指向动态申请的一组空间intlength;//整数的个数};基类中有构造函数、析构函数、输入数据和输出数据的函数#includeiostream.hclassMyArray{public:MyArrayintleng;~MyArray;voidInput;voidDisplay;protected:int*alist;//指向动态申请的一组空间intlength;//整数的个数};MyArray::MyArrayintleng{alist=newint[leng];length=leng;}MyArray::~MyArray{delete[]alist;cout显示调用了析构函数endl;}voidMyArray::Input{inti;cout请输入数组元素endl;fori=0;ilength;i++{cinalist[i];}}voidMyArray::Display{intj;cout输出的数组元素为endl;forj=0;jlength;j++{coutalist[j]endl;}}intmain{MyArrays4;s.Input;s.Display;}定义一个类SortArray继承自MyArray,在该类中定义函数实现排序功能#includeiostreamusingnamespacestd;classMyArray{public:MyArrayintleng{length=leng;alist=newint[length];}~MyArray{deletealist;}voidinput{inti;fori=0;ilength;i++cinalist[i];}voiddisplay{intj;forj=0;jlength;j++coutalist[j]endl;}protected:int*alist;intlength;};classSortArray:publicMyArray{public:SortArrayintleng:MyArrayleng{}voidpai{inti;intj;intt;fori=0;ilength;i++{forj=i+1;jlength;j++{ifalist[i]alist[j]{t=alist[i];alist[i]=alist[j];alist[j]=t;}}}fori=0;ilength;i++coutalist[i];}};intmain{intleng;cinleng;SortArrayAleng;A.input;A.display;A.pai;return0;}定义一个类ReArray继承自MyArray,在该类中定义函数实现逆转功能#includeiostreamusingnamespacestd;classMyArray{public:MyArrayintleng{length=leng;alist=newint[length];}~MyArray{deletealist;}voidinput{inti;fori=0;ilength;i++cinalist[i];}voiddisplay{intj;forj=0;jlength;j++coutalist[j]endl;}protected:int*alist;intlength;};classReArray:publicMyArray{public:ReArrayintleng:MyArrayleng{}voidnizhuan{intj;intt;forj=0;jlength/2;j++{t=alist[j];alist[j]=alist[length-1-j];alist[length-j-1]=t;}forj=0;jlength;j++{coutalist[j];}}};intmain{intleng;cinleng;ReArrayAleng;A.input;A.display;A.nizhuan;return0;}定义一个类AverArray继承自MyArray,在该类中定义函数Aver求解整数的平均值#includeiostreamusingnamespacestd;classMyArray{public:MyArrayintleng{length=leng;alist=newint[length];}~MyArray{deletealist;}voidinput{inti;fori=0;ilength;i++cinalist[i];}voiddisplay{intj;forj=0;jlength;j++coutalist[j]endl;}protected:int*alist;intlength;};classAverArray:publicMyArray{public:AverArrayintleng:MyArrayleng{}voidpingjun{intj;floatsum;floatave;sum=
0.0;forj=0;jlength;j++{sum+=alist[j];}ave=sum/length;coutaveendl;}};intmain{intleng;cinleng;AverArrayAleng;A.input;A.display;A.pingjun;return0;}定义NewArray类,同时继承了SortArray、ReArray和AverArray,使得NewArray类的对象同时具有排序、逆转和求平均值的功能在继承的过程中声明为虚基类,体会虚基类在解决二义性问题中的作用#includeiostreamusingnamespacestd;classMyArray{public:MyArrayintleng{length=leng;alist=newint[length];}~MyArray{deletealist;}voidinput{inti;fori=0;ilength;i++cinalist[i];}voiddisplay{intj;forj=0;jlength;j++coutalist[j]endl;}protected:int*alist;intlength;};classSortArray:virtualpublicMyArray{public:SortArrayintleng:MyArrayleng{}voidpai{inti;intj;intt;fori=0;ilength;i++{forj=i+1;jlength;j++{ifalist[i]alist[j]{t=alist[i];alist[i]=alist[j];alist[j]=t;}}}fori=0;ilength;i++coutalist[i];}};classReArray:virtualpublicMyArray{public:ReArrayintleng:MyArrayleng{}voidnizhuan{intj;intt;forj=0;jlength/2;j++{t=alist[j];alist[j]=alist[length-1-j];alist[length-j-1]=t;}forj=0;jlength;j++{coutalist[j];}}};classAverArray:virtualpublicMyArray{public:AverArrayintleng:MyArrayleng{}voidpingjun{intj;floatsum;floatave;sum=
0.0;forj=0;jlength;j++{sum+=alist[j];}ave=sum/length;coutaveendl;}};classNewArray:publicSortArraypublicReArraypublicAverArray{public:NewArrayintleng:MyArraylengSortArraylengReArraylengAverArrayleng{}};intmain{intleng;cinleng;NewArrayAleng;A.input;A.display;A.pai;A.nizhuan;A.pingjun;return0;}实验六虚函数与多态性院(系)课程名称面向对象程序设计教师签名班级学号实验室姓名实验成绩所用软件Word文档、VC++软件实验目的和要求1理解编译时的多态性和运行时的多态性
2.掌握运算符重载的基本方法
3.掌握虚函数的定义与使用方法实验内容1定义一个有理数,并重载比较运算符、=、==、!=classRational{public:Rationalintnum=0intdenom=1;//构造函数intoperatorRationalrconst;intoperator=Rationalrconst;intoperator==Rationalrconst;intoperator!=Rationalrconst;private:longnumden;//定义一个有理数num为分子,den为分母};#includeiostream.h#includestdlib.hclassRational{public://构造函数Rationalintnum=0intdenom=1;//重载比较操作符intoperatorRationalrconst;intoperator=Rationalrconst;intoperator==Rationalrconst;intoperator!=Rationalrconst;private://定义一个有理数num为分母,den分子longnumden;};Rational::Rationalintpintq:numpdenq{ifden==0{cerrAZerodenominatorisinvalidendl;exit1;}}//重载“小于”intRational::operatorRationalrconst{returnnum*r.denr.num*den;}//重载“小于等于”intRational::operator=Rationalrconst{returnnum*r.den=r.num*den;}//重载“相等”intRational::operator==Rationalrconst{returnnum*r.den==r.num*den;}//重载“不等于”intRational::operator!=Rationalrconst{returnnum*r.den!=r.num*den;}voidmain{Rationala23b34;ifabcout\nab;elsecout\nab;}2定义一个类Animal,该类中可以存放动物的名字,并有一个Identify函数用于显示动物的种类#includeiostream.h#includestring.hclassAnimal{public:Animal{name=NULL;}Animalchar*n;~Animal{deletename;}virtualvoidIdentify;protected:char*name;};Animal::Animalchar*n{name=newchar[strlenn+1];strcpynamen;}voidAnimal::Identify{cout\ngenericanimal;}voidmain{Animala;a.Identify;}3定义两个类Cat和Dog,都继承于Animal,并重载Identify函数,不但要显示动物的种类,还要显示动物的名字#includeiostream.h#includestring.hclassAnimal{public:Animal{name=NULL;}Animalchar*n;~Animal{deletename;}virtualvoidIdentify;protected:char*name;};classCat:publicAnimal{public:Cat:Animal{}Catchar*n:Animaln{}voidIdentify;};classDog:publicAnimal{public:Dog:Animal{}Dogchar*n:Animaln{}voidIdentify;};Animal::Animalchar*n{name=newchar[strlenn+1];strcpynamen;}voidAnimal::Identify{cout\ngenericanimal;}voidCat::Identify{cout\nIamacatnamednameendl;}voidDog::Identify{cout\nIamaDognamednameendl;}voidmain{CatcatHerry;cat.Identify;DogdogJimmy;dog.Identify;}4定义Tiger类,继承于Cat,重载Identify函数,显示动物的种类和名字#includeiostream.h#includestring.hclassAnimal{public:Animal{name=NULL;}Animalchar*n;~Animal{deletename;}virtualvoidIdentify;protected:char*name;};classCat:publicAnimal{public:Cat:Animal{}Catchar*n:Animaln{}virtualvoidIdentify;};classTiger:publicCat{public:Tiger:Cat{}Tigerchar*n:Catn{}voidIdentify;};classDog:publicAnimal{public:Dog:Animal{}Dogchar*n:Animaln{}voidIdentify;};Animal::Animalchar*n{name=newchar[strlenn+1];strcpynamen;}voidAnimal::Identify{cout\ngenericanimal;}voidCat::Identify{cout\nIamacatnamednameendl;}voidTiger::Identify{cout\nIamatigernamednameendl;}voidDog::Identify{cout\nIamaDognamednameendl;}voidmain{CatcatHerry;cat.Identify;DogdogJimmy;dog.Identify;TigertigerRichard;tiger.Identify;}5定义一个动物园类Zoo,管理动物,根据下面的提示编写动物类及相关函数注意指针虚函数的用法classZoo{public:Zoounsignedintmax;//构造函数,max为最多能圈养的动物数~Zoo{deleteresidents;}//析构函数unsignedintAcceptAnimal*d;//接收动物voidListAnimals;//显示动物园所有的动物private:unsignedintmaxanimals;//动物园最多能圈养的动物数unsignedintnumanimals;//动物园当前圈养的动物数Animal**residents;//指向动物园圈养的动物对象的指针数组};#includeiostream.h#includestring.hclassAnimal{protected:char*name;public:Animal{name=NULL;}Animalchar*n;~Animal{deletename;}virtualvoidIdentify;};classCat:publicAnimal{public:Cat:Animal{}Catchar*n:Animaln{}virtualvoidIdentify;};classTiger:publicCat{public:Tiger:Cat{}Tigerchar*n:Catn{}voidIdentify;};classDog:publicAnimal{public:Dog:Animal{}Dogchar*n:Animaln{}voidIdentify;};classZoo{public:Zoounsignedintmax;//构造函数,max为最多能圈养的动物数~Zoo{deleteresidents;}//析构函数unsignedintAcceptAnimal*d;//接收动物voidListAnimals;//显示动物园所有的动物private:unsignedintmaxanimals;//动物园最多能圈养的动物数unsignedintnumanimals;//动物园当前圈养的动物数Animal**residents;//指向动物园圈养的动物对象的指针数组};Animal::Animalchar*n{name=newchar[strlenn+1];strcpynamen;}voidAnimal::Identify{cout\ngenericanimal;}voidCat::Identify{cout\nIamacatnamednameendl;}voidTiger::Identify{cout\nIamatigernamednameendl;}voidDog::Identify{cout\nIamaDognamednameendl;}Zoo::Zoounsignedintmax{maxanimals=max;numanimals=0;residents=newAnimal*[maxanimals];//分配空间forinti=0;imaxanimals;++i//指针清空residents[i]=NULL;}unsignedintZoo::AcceptAnimal*d{ifnumanimals==maxanimals//超过最大圈养数return0;++numanimals;//当前圈养数加1inti=0;whileresidents[i]!=NULL//用指针指向接收的动物对象++i;residents[i]=d;return++i;}voidZoo::ListAnimals{cout\n:Thereare;coutnumanimalsanimalsinZoo.\n;//显示动物园总的动物数ifnumanimals0forinti=0;imaxanimals;++iifresidents[i]!=NULLresidents[i]-Identify;//显示动物对象的名称和种类}voidmain{CatcatHerry*q;cat.Identify;DogdogJimmy*p;dog.Identify;TigertigerRichard*r;tiger.Identify;Zoobeijing20;q=cat;p=dog;r=tiger;unsignedi=beijing.Acceptp;beijing.ListAnimals;i=beijing.Acceptq;beijing.ListAnimals;i=beijing.Acceptr;beijing.ListAnimals;}实验七运算符重载院(系)课程名称面向对象程序设计教师签名班级学号实验室姓名实验成绩所用软件实验目的和要求1理解运算符重载的含义与作用
2.运用运算符重载技术实现构造类型变量的普通运算实验内容上机调试程序改正程序错误编写程序实验步骤第一步上机调试程序#includeiostream.hClassINT{public:INTinti:xii{};INT{xi=0;}FriendINToperator++INTa;FriendINToperator—INTa;Voidprint;Private:Intxi;};INToperator++INTa{++a.xi;returna;}INToperator--INTa{--a.xi;returna;}VoidINT::print{coutxiendl;}intmain{coutendl;INTI7;++I;I.print;--I;I.print;return0;}修改之后的代码#includeiostream.hclassINT{public:INTinti:xii{};INT{xi=0;}friendINToperator++INTa;friendINToperator--INTa;voidprint;private:intxi;};INToperator++INTa{++a.xi;returna;}INToperator--INTa{--a.xi;returna;}voidINT::print{coutxiendl;}intmain{coutendl;INTI7;++I;I.print;--I;I.print;return0;}第二步写出下列程序的运行结果#includeiostream.hclassArray{public:Arrayint;nodeoperatorint;//重载运算符private:int*m;intx;};Array::Arrayintx{this-x=x;m=newintx;forinti=0;ix;i++*m+i=I;}IntArray::operatorintx1{return*m+x1;}main{cout”\n\n”;Arraya10;couta5;return0;}修改之后#includeiostream.hclassArray{public:Arrayint;intoperatorint;//重载运算符private:int*m;intx;};Array::Arrayintx{this-x=x;m=newintx;forinti=0;ix;i++*m+i=i;}intArray::operatorintx1{return*m+x1;}main{cout\n\n;Arraya10;couta5;return0;}第三步指出下面程序中的错误原因#includeiostream.hclassCTest{private:intxy;public:CTestintn1intn2{x=n1;y=n2;};CTestCTest ::operator++intvoidprint{cout”x=”x”y=”yendl;}}voidmain{CTestd123;d
1.print;++d1;d
1.print;}在类里没有声明运载符重载函数修改之后#includeiostream.hclassCTest{private:intxy;public:CTestintn1intn2{x=n1;y=n2;}CTestoperator++int;voidprint;};CTestCTest::operator++int{CTesttemp*this;x++;y++;returntemp;}voidCTest::print{coutx=xy=yendl;}intmain{CTestd123;d
1.print;d1++;d
1.print;return0;}第四步编写一个程序,用成员函数重载运算符“+”和“-”将两个二维数组相加和相减,要求第一个二维数组的值由构造函数设置,另一个二维数组的值由键盘输入要求在空白处填入代码#includeiostream.h#includeiomanip.hconstintrow=2;constintcol=3;classarray{public:array{intijk=1;fori=0;irow;i++forj=0;jcol;j++{var[i][j]=k;k=k+1;}}voidget_array//由键盘输入数组的值{intij;cout”Pleaseinput2*3dimesiondata“endl;___________________________________}voiddisplay//显示数组的值{intij;___________________________________}friendarrayoperator++arrayXarrayY;//将两个数组相加friendarrayoperator++arrayXarrayY;//将两个数组相减private:intvar[row][col];};arrayoperator+arrayXarrayY{arraytemp;intij;fori=0;irow;i++forj=0;jcol;j++___________________________________returntemp;}arrayoperator-arrayXarrayY{arraytemp;intij;fori=0;irow;i++forj=0;jcol;j++___________________________________returntemp;}voidmain{arrayXYZ;Y.get_array;cout”DisplayobjectX”endl;X.display;cout”DisplayobjectY”endl;Y.display;cout”DisplayobjectZ”endl;Z=X+Y;cout”DisplayobjectZ=X+Y”endl;Z.display ;Z=X-Y ;cout”DisplayobjectZ=X-Y”endl;Z.display;}填空之后的#includeiostream.h#includeiomanip.hconstintrow=2;constintcol=3;classarray{public:array{intijk=1;fori=0;irow;i++forj=0;jcol;j++{var[i][j]=k;k=k+1;}}voidget_array//由键盘输入数组的值{intij;coutPleaseinput2*3dimesiondataendl;fori=0;irow;i++forj=0;jcol;j++{cinvar[i][j];}}voiddisplay//显示数组的值{intij;fori=0;irow;i++forj=0;jcol;j++{coutvar[i][j];}}friendarrayoperator+arrayXarrayY;//将两个数组相加friendarrayoperator-arrayXarrayY;//将两个数组相减private:intvar[row][col];};arrayoperator+arrayXarrayY{arraytemp;intij;fori=0;irow;i++forj=0;jcol;j++{temp.var[i][j]=X.var[i][j]+Y.var[i][j];}returntemp;}arrayoperator-arrayXarrayY{arraytemp;intij;fori=0;irow;i++forj=0;jcol;j++{temp.var[i][j]=X.var[i][j]-Y.var[i][j];}returntemp;}voidmain{arrayXYZ;Y.get_array;coutDisplayobjectXendl;X.display;coutDisplayobjectYendl;Y.display;coutDisplayobjectZendl;Z=X+Y;coutDisplayobjectZ=X+Yendl;Z.display;Z=X-Y;coutDisplayobjectZ=X-Yendl;Z.display;}实验八函数模板与类模板院(系)课程名称面向对象程序设计教师签名班级学号实验室姓名实验成绩所用软件Word文档、VC++软件实验目的和要求1掌握函数模板及其声明方法
2.掌握模板函数及其生成方法
3.学习类模板的声明与使用方法实验内容定义函数模板实现数组的冒泡排序定义类模板实现栈的基本操作,栈的数据结构用带表头节点的单向链表实现利用栈的类模板实现将输入的整数转换成八进制并输出实验步骤第一步函数模板实现冒泡排序#includeiostream.htemplatetypenameTvoidbubbleT*Arrayintsize{Ttemp;forinti=0;isize;i++forintj=0;jsize-i;j++if*Array+j*Array+j+1{temp=*Array+j;*Array+j=*Array+j+1;*Array+j+1=temp;}}voidmain{inta
[10]={2695-8999643812345-999966};doubled
[8]={
2.
695.698741-
89.
03.
1415932.
1456.
7891.0-
9999.123456789};bubblea10;//将整数数组排序fori=0;i10;i++{cout""<<a[i];}coutendl;bubbled8;//将double型数组排序fori=0;i8;i++{coutd[i];}coutendl;return;}第二步用类模板实现链式栈的操作#includeiostream.h#includeprocess.htemplateclassTypeclassnode{public:Typedata;nodeType*next;};templateclassTypeclassStacklink{private:nodeType*top;public:Stacklink;~Stacklink;voidpushTypevalue;Typepop;intisnull;};templateclassTypeStacklinkType::Stacklink{nodeType*T;T=newnodeType;T-next=NULL;top=T;}templateclassTypeStacklinkType::~Stacklink{nodeType*N*Temp;forN=top;N!=NULL;{Temp=N;N=N-next;deleteTemp;}}templateclassTypevoidStacklinkType::pushTypevalue{nodeType*T;T=newnodeType;ifT!=NULL{T-next=top;T-data=value;top=T;}else{coutassignedfailure!;exit1;}}templateclassTypeintStacklinkType::isnull{iftop-next==NULLreturn1;elsereturn0;}templateclassTypeTypeStacklinkType::pop{Typevalue;nodeType*Temp;iftop-next==NULL{cout\nThestackisNull!\n;return0;}value=top-data;Temp=top;top=top-next;deleteTemp;returnvalue;}第三步十进制数转换成八进制的主函数voidmain{intl=1octal=0;longdecimalj;cout\npleaseinputinteger:;cindecimal;j=decimal;Stacklinkintss;whilej!=0{ss.pushj%8*l;j=j/8;l=l*10;}coutendl;while!ss.isnull{j=ss.pop;octal=j+octal;}coutoctal;}。