版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《面向对象程序设计技能训练》实验指导书PAGE18PAGE90《面向对象程序设计技能训练》实验指导书实验1类与对象的概念一、实验目的:1.掌握类的定义方法,能合理指定类中成员的访问权限2.学习对象的说明和使用方法3.正确理解类与结构体的异同4.理解this指针的用途二、实验要求(1)调试程序要记录调试过程中出现的问题及解决办法;(2)给出每个问题的算法或画出流程图;(3)编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验;(4)做完实验后给出本实验的实验报告。三、实验设备、环境奔腾以上计算机,装有VC++软件四、实验步骤及内容定义一个描述学生通讯录的类,数据成员包括:姓名、学校、电话号码和邮编;成员函数包括:输出各个数据成员的值,分别设置和获取各个数据成员的值。⑴分析由于姓名、学校和电话号码的数据长度是可变的,可使用动态的数据结构。邮编的长度是固定的,可定义一个字符数组来存放邮编。将数据成员均定义为私有的。用一个成员函数输出所有的成员数据,用四个成员函数分别设置姓名、单位、电话号码和邮编,再用四个成员函数分别获取姓名、单位、电话号码和邮编。主函数完成简单的测试工作。一个完整的参考程序如下:#include<iostream.h>#include<string.h>classCOMMU{char*pName; //姓名,数据成员为私有的char*pSchool; //单位char*pNum; //电话号码charBox[10]; //邮编public: voidPrint(void) //输出数据成员 { cout<<"姓名:"<<pName<<'\t'; cout<<"单位:"<<pSchool<<'\t'; cout<<"电话号码:"<<pNum<<'\t'; cout<<"邮编:"<<Box<<'\n'; } voidInit(char*,char*,char*,char*); voidFreeSpace(void); //释放数据成员占用的空间 voidSetName(char*name) { if(pName)delete[]pName; //释放存储空间 pName=newchar[strlen(name)+1]; //申请存储空间 strcpy(pName,name); } voidSetScool(char*unit) //置学校名称 { if(pSchool)delete[]pSchool; pSchool=newchar[strlen(unit)+1]; strcpy(pSchool,unit); } voidSetNum(char*num) //置电话号码 { if(pNum)delete[]pNum; pNum=newchar[strlen(num)+1]; strcpy(pNum,num); } voidSetBox(char*mailnum) //置邮编 { strcpy(Box,mailnum); } char*GetName(void) //取姓名 {returnpName;} char*GetScool(void) //取学校 {returnpSchool;} char*GetNum(void) //取电话号码 {returnpNum;} char*GetBox(void) //取邮编 {returnBox;}};voidCOMMU::Init(char*name,char*unit,char*num,char*b){ //完成初始化 pName=newchar[strlen(name)+1]; strcpy(pName,name); pSchool=newchar[strlen(unit)+1]; strcpy(pSchool,unit); pNum=newchar[strlen(num)+1]; strcpy(pNum,num); strcpy(Box,b);}voidCOMMU::FreeSpace(void){ if(pName)delete[]pName; if(pSchool)delete[]pSchool; if(pNum)delete[]pNum;}voidmain(void){ COMMUc1,c2; c1.Init("张建国","南京大学",,"210024"); c2.Init("李国强","南京工业大学",,"210015"); c1.Print(); c2.Print(); c1.SetName("王国安"); cout<<c1.GetName()<<'\n'; c1.SetScool("南京理工大学"); cout<<c1.GetScool()<<'\n'; c1.SetNum(); cout<<c1.GetNum()<<"\n"; c1.SetBox("210090"); cout<<c1.GetBox()<<"\n"; c1.Print(); c1.FreeSpace(); c2.FreeSpace();}⑵上机要求用以下数据测试程序的正确性:对象的初始化数据为:李文明清华大学010—232345670123344名字改为“李明明”,并输出;学校改为“北京理工大学”并输出;电话改为“010—55667878”,并输出;邮编改为“150035”并输出。将成员函数的权限改为私有的,观察现象。将类改为结构体,重新执行程序,输出成员数据。增加数据成员:邮件地址,手机号码,并将电话号码分为住宅电话和办公电话。设计一个实现以上功能的源程序,并完成程序的测试。实验2构造函数与析构函数的用法一、实验目的:1.掌握定义构造函数、重载构造函数的方法2.理解构造函数的作用3.掌握定义析构函数的方法,理解析构函数的作用4.加深理解拷贝构造函数的作用和用途二、实验要求(1)调试程序要记录调试过程中出现的问题及解决办法;(2)给出每个问题的算法或画出流程图;(3)编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验;(4)做完实验后给出本实验的实验报告。三、实验设备、环境奔腾以上计算机,装有VC++软件四、实验步骤及内容构造函数用于初始化对象,通过重载构造函数可实现多种方法初始化对象。构造函数是系统产生对象时自动调用的。析构函数用于撤消对象时作收尾工作。当对象中的成员含有用new运算符申请的存储空间时,必须显式定义析构函数。将实验10的第一个上机实验题中的成员函数Init改为构造函数,将成员函数FreeSpace改为析构函数。增加一个缺省的构造函数,使指针pName,pSchool和pNum的初值为0,使Box包含空字符串。⑴分析缺省的构造函数完成数据成员的初始化,根据实验题的要求,该缺省的构造函数可以是:COMMU() //缺省的构造函数{ pName=pSchool=pNum=0; Box[0]=0;}用构造函数COMMU代替成员函数Init的功能,只要将函数名Init改为COMMU,即:COMMU(char*name,char*unit,char*num,char*b){ //重载构造函数 pName=newchar[strlen(name)+1]; strcpy(pName,name); pSchool=newchar[strlen(unit)+1]; strcpy(pSchool,unit); pNum=newchar[strlen(num)+1]; strcpy(pNum,num);strcpy(Box,b);}用析构函数~COMMU代替成员函数FreeSpace,该析构函数为:~COMMU() //析构函数{ if(pName)delete[]pName; if(pSchool)delete[]pSchool; if(pNum)delete[]pNum;}完整的参考程序为:#include<iostream.h>#include<string.h>classCOMMU{ char*pName; //姓名,数据成员为私有的 char*pSchool; //单位 char*pNum; //电话号码 charBox[10]; //邮编public: voidPrint(void) //输出数据成员 { cout<<"姓名:"<<pName<<'\t'; cout<<"单位:"<<pSchool<<'\t'; cout<<"电话号码:"<<pNum<<'\t'; cout<<"邮编:"<<Box<<'\n'; } COMMU(char*,char*,char*,char*); COMMU(); ~COMMU(); voidSetName(char*name) { if(pName)delete[]pName; //释放存储空间 pName=newchar[strlen(name)+1]; //申请存储空间 strcpy(pName,name); } voidSetScool(char*unit) //置学校名称 { if(pSchool)delete[]pSchool; pSchool=newchar[strlen(unit)+1]; strcpy(pSchool,unit); } voidSetNum(char*num) //置电话号码 { if(pNum)delete[]pNum; pNum=newchar[strlen(num)+1]; strcpy(pNum,num); } voidSetBox(char*mailnum) //置邮编 { strcpy(Box,mailnum); } char*GetName(void) /取姓名 { returnpName; } char*GetScool(void) //取学校 { returnpSchool; } char*GetNum(void) //取电话号码 { returnpNum; } char*GetBox(void) //取邮编 { returnBox; }};COMMU::COMMU() //缺省的构造函数{ pName=pSchool=pNum=0; Box[0]=0;}COMMU::COMMU(char*name,char*unit,char*num,char*b){ //重载构造函数 pName=newchar[strlen(name)+1]; strcpy(pName,name); pSchool=newchar[strlen(unit)+1]; strcpy(pSchool,unit); pNum=newchar[strlen(num)+1]; strcpy(pNum,num); strcpy(Box,b);}COMMU::~COMMU() //析构函数{ if(pName)delete[]pName; if(pSchool)delete[]pSchool; if(pNum)delete[]pNum;}voidmain(void){ COMMUc1("张建国","南京大学",,"210024"); COMMUc2("李国强","南京工业大学",,"210015"); c1.Print(); c2.Print(); c1.SetName("王国安"); cout<<c1.GetName()<<'\n'; c1.SetScool("南京理工大学"); cout<<c1.GetScool()<<'\n'; c1.SetNum(); cout<<c1.GetNum()<<"\n"; c1.SetBox("210090"); cout<<c1.GetBox()<<"\n"; c1.Print();}⑵上机要求在程序的基础上,增加E_mail地址和手机号码的数据成员。试定义一个对象数组COMMUstu[10],完成数组对象的初始化,并制表输出通讯录。输入九个同学组成的通讯录,测试程序的正确性。实验3继承和派生类的应用一、实验目的:1.掌握多重继承和派生类的方法2.掌握初始化基类成员的方法3.掌握定义虚基类的方法二、实验要求(1)调试程序要记录调试过程中出现的问题及解决办法;(2)给出每个问题的算法或画出流程图;(3)编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验;(4)做完实验后给出本实验的实验报告。三、实验设备、环境奔腾以上计算机,装有VC++软件四、实验步骤及内容1.上机实验题定义一个日期(年、月、日)的类和一个时间(时、分、秒)的类,并由这两个类派生出日期和时间类。主函数完成基类和派生类的测试工作。⑴分析定义一个描述日期的类,构造函数完成年、月、日的初始化,包含一个重新设置日期的成员函数,一个获取日期的成员函数。该类可定义为:classDate{ intYear,Month,Day;//分别存放年、月、日public: Date(inty=0,intm=0,intd=0){ Year=y;Month=m;Day=d;}voidSetDate(int,int,int);voidGetDate(char*);};函数SetDate完成数据成员的赋初值。函数GetDate要将整数年、月、日变换成字符串后,存放到参数所指向的字符串中。把一个整数变换成字符串可通过库函数:char*_itoa(inta,char*s,intb);来实现,参数a为要变换的整数,b为数制的基数(如10,表示将a转换为对应的十进制的字符串),转换的结果存放到s所指向的字符串中。函数返回变换后字符串的首指针。该成员函数可以是:voidDate::GetDate(char*s){ chart[20]; _itoa(Year,s,10); //将年变换为字符串表示 strcat(s,"/"); //年、月、日之间用“/”隔开 _itoa(Month,t,10); //将月变换为字符串表示 strcat(s,t); //将年、月字符串拼接 strcat(s,"/"); _itoa(Day,t,10); strcat(s,t); //将年、月、日拼接成一个字符串}定义描述时间的类与描述日期的类类同,然后用这二个类作为基类,公有派生出描述日期和时间的类。简化的参考程序如下:#include<iostream.h>#include<string.h>#include<stdlib.h>classDate{ intYear,Month,Day; //分别存放年、月、日public: Date(inty=0,intm=0,intd=0) {Year=y;Month=m;Day=d; } voidSetDate(int,int,int); voidGetDate(char*);};voidDate::SetDate(inty,intm,intd){ Year=y;Month=m;Day=d;}voidDate::GetDate(char*s){ chart[20]; _itoa(Year,s,10);strcat(s,"/"); _itoa(Month,t,10);strcat(s,t); strcat(s,"/"); _itoa(Day,t,10);strcat(s,t);}classTime{ intHours,Minutes,Seconds; //时、分、秒public: Time(inth=0,intm=0,ints=0) {Hours=h;Minutes=m;Seconds=s; } voidSetTime(inth,intm,ints) {Hours=h;Minutes=m; Seconds=s;} voidGetTime(char*);};voidTime::GetTime(char*s){ chart[20]; _itoa(Hours,s,10); strcat(s,":"); _itoa(Minutes,t,10);strcat(s,t); strcat(s,":");_itoa(Seconds,t,10);strcat(s,t);}classDateTime:publicDate,publicTime{ //公有派生public: DateTime():Date(),Time() {} DateTime(inty,intm,intd,inth,intmin,ints):Date(y,m,d),Time(h,min,s){ } voidGetDateTime(char*); voidSetDateTime(inty,intm,intd,inth,intmin,ints);};voidDateTime::GetDateTime(char*s){ chars1[100],s2[100]; GetDate(s1); GetTime(s2); strcpy(s,"日期和时间分别是:"); strcat(s,s1); strcat(s,";"); strcat(s,s2);}voidDateTime::SetDateTime(inty,intm,intd,inth,intmin,ints){ SetDate(y,m,d);SetTime(h,min,s);}voidmain(void){ Dated1(2003,1,30); chars[200]; d1.GetDate(s); cout<<"日期是:"<<s<<'\n'; Timet1(12,25,50); t1.GetTime(s); cout<<"时间是:"<<s<<'\n'; DateTimedt1(2003,2,4,8,20,15); dt1.GetDateTime(s); cout<<s<<'\n'; dt1.SetDateTime(2003,12,30,23,50,20); dt1.GetDateTime(s); cout<<s<<'\n';}⑵上机要求将类DateTime改为由基类Date和Time私有派生,程序能否正确编译和执行,为什么?
实验4友元函数及虚函数的应用一、实验目的:1.掌握友元函数的定义方法2.理解并掌握利用虚函数实现动态多态性和编写通用程序的方法3.掌握静态数据成员的特性二、实验要求(1)调试程序要记录调试过程中出现的问题及解决办法;(2)给出每个问题的算法或画出流程图;(3)编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验;(4)做完实验后给出本实验的实验报告。三、实验设备、环境奔腾以上计算机,装有VC++软件四、实验步骤及内容1.上机实验题利用虚函数实现的多态性来求四种几何图形的面积之和。这四种几何图形是:三角形、矩形、正方形和圆。几何图形的类型可以通过构造函数或通过成员函数来设置。⑴分析计算这四种几何图的面积公式分别是:三角形的边长为W,高为H时,则三角形的面积为W*H/2;矩形的边长为W,宽为H时,则其面积为W*H;正方形的边长为S,则正方形的面积为S*S;圆的半径为R,其面积为3.1415926*R*R。为设置几何图形的数据并求出几何图形的面积,需要定义一个包含两个虚函数的类:classShape{public: virtualfloatArea(void)=0; //求面积 virtualvoidSetdata(float,float=0)=0; //设置图形数据};因面积的计算依赖于几何图形,故在类中只能定义一个纯虚函数Area。同理,设置几何图形数据的函数Setdata也只能定义为虚函数。把这个基类派生出其它几何图形类。如派生出的三角形类为:classTriangle:publicShape{ floatW,H; //三角形边长为W,高为Hpublic: Triangle(floatw=0,floath=0){W=w;H=h;} floatArea(void){returnW*H/2;} voidSetdata(floatw,floath=0){W=w;H=h;}};在派生类中定义了基类中两个虚函数的实现。为了实现求面积和设置数据的多态性,必须定义一个类,该类中定义一个指向基类Shape的指针数组,其元素分别指向由基类Shape派生出的不同的几何图形类,并完成求出所有几何图形面积之和,以及设置参数的函数。一个完整的参考程序如下:#include<iostream.h>#include<string.h>classShape{public: virtualfloatArea(void)=0; //虚函数 virtualvoidSetdata(float,float=0)=0; //虚函数};classTriangle:publicShape{ floatW,H; //三角形边长为W,高为Hpublic: Triangle(floatw=0,floath=0) { W=w;H=h; } floatArea(void) //定义虚函数 { returnW*H/2; } voidSetdata(floatw,floath=0) //定义虚函数 { W=w;H=h; }};classRectangle:publicShape{ floatW,H; //矩形边长为W,高为Hpublic: Rectangle(floatw=0,floath=0){W=w;H=h;} floatArea(void) //定义虚函数 { returnW*H; } voidSetdata(floatw,floath=0) //定义虚函数 { W=w;H=h; }};classSquare:publicShape{ floatS; //正方形边长Spublic: Square(floata=0) { S=a; } floatArea(void) //定义虚函数 { returnS*S/2; } voidSetdata(floatw,floath=0) //定义虚函数 { S=w; }};classCircle:publicShape{ floatR; //圆的半径为Rpublic: Circle(floatr=0) { R=r; } floatArea(void) //定义虚函数 { return3.1415926*R*R; } voidSetdata(floatw,floath=0) //定义虚函数 { R=w; }};classCompute{ Shape**s; //指向基类的指针数组public:Compute() { //给几何图形设置参数 s=newShape*[4]; s[0]=newTriangle(3,4); s[1]=newRectangle(6,8); s[2]=newSquare(6.5); s[3]=newCircle(5.5); } floatSumArea(void); ~Compute(); voidSetdata(intn,floata,floatb=0) //A { s[n]->Setdata(a,b); } //B};Compute::~Compute() //释放动态分配的存储空间{ for(inti=0;i<4;i++) deletes[i]; delete[]s;}floatCompute::SumArea(void){ floatsum=0; for(inti=0;i<4;i++) sum+=s[i]->Area(); //通过基类指针实现多态性 returnsum;}voidmain(void){ Computea; cout<<"四种几何图形的面积="<<a.SumArea()<<'\n'; a.Setdata(2,10); //设置正方形的边长 cout<<"四种几何图形的面积="<<a.SumArea()<<'\n';a.Setdata(0,10,12); //设置三角形的边长和高 cout<<"四种几何图形的面积="<<a.SumArea()<<'\n'; a.Setdata(1,2,5); //设置正方形的长和宽 cout<<"四种几何图形的面积="<<a.SumArea()<<'\n'; a.Setdata(3,15.5); cout<<"四种几何图形的面积="<<a.SumArea()<<'\n';}程序中A行的Setdata函数属于函数重载,它不是虚函数。该函数中的B行通过基类指针实现多态性。⑵上机要求自己设计测试数据,测试程序的正确性。
实验5运算符重载的应用一、实验目的:1.掌握用成员函数重载运算符的方法2.掌握用友元函数重载运算符的方法二、实验要求(1)调试程序要记录调试过程中出现的问题及解决办法;(2)给出每个问题的算法或画出流程图;(3)编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验;(4)做完实验后给出本实验的实验报告。三、实验设备、环境奔腾以上计算机,装有VC++软件四、实验步骤及内容1.机实验题定义一个复数类,通过重载运算符:*,/,直接实现二个复数之间的乘除运算。编写一个完整的程序,测试重载运算符的正确性。要求乘法“*”用友元函数实现重载,除法“/”用成员函数实现重载。⑴分析两复数相乘的计算公式为:(a+bi)*(c+di)=(ac–bd)+(ad+bc)i两复数相除的计算公式为:(a+bi)/(c+di)=(ac+bd)/(c*c+d*d)+(bc-ad)/(c*c+d*d)i复数类及运算符重载函数可定义为:classComplex{ floatReal,Image;public: Complex(floatr=0,floati=0) {Real=r;Image=i;} voidShow() {cout<<"Real="<<Real<<'\t'<<"Image="<<Image<<'\n';} friendComplexoperator*(Complex&,Complex&); Complexoperator/(Complex&); //重载运算符+};Complexoperator*(Complex&c1,Complex&c2){ Complext; t.Real=c1.Real*c2.Real-c1.Image*c2.Image; t.Image=c1.Image*c2.Real+c1.Real*c2.Image; returnt;}ComplexComplex::operator/(Complex&c){ Complext; t.Real=(Real*c.Real+Image*c.Image)/(c.Real*c.Real+c.Image*c.Image); t.Image=(Image*c.Real-Real*c.Image)/(c.Real*c.Real+c.Image*c.Image); returnt;}⑵上机要求增加重载复数的加法和减法运算符的功能,实现两个复数的加法,一个复数与一个实数的加法;两个复数的减法,一个复数与一个实数的减法。用成员函数实现加法运算符的重载,用友元函数实现减法运算符的重载。自已设计主函数,完成程序的调试工作。
实验6标准设备与文件流的输入输出一、实验目的:1.掌握文件流的打开、关闭及使用的使用方法2.理解文本文件流与二进制文件流在操作上的区别二、实验要求(1)调试程序要记录调试过程中出现的问题及解决办法;(2)给出每个问题的算法或画出流程图;(3)编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验;(4)做完实验后给出本实验的实验报告。三、实验设备、环境奔腾以上计算机,装有VC++软件四、实验步骤及内容1.上机实验题设计一个管理图书目的简单程序,提供的基本功能包括:可连续将新书存入文件“book.dat”中,新书信息加入到文件的尾部;也可以根据输入的书名进行查找;把文件“book.dat”中同书名的所有书显示出来。为简单起见,描述一本书的信息包括:书号,书名,出版社和作者。⑴分析可以把描述一本书的信息定义为一个Book类,它包含必要的成员函数。把加入的新书总是加入到文件尾部,所以,以增补方式打开输出文件。从文件中查找书时,总是从文件开始位置查找,以读方式打开文件。用一个循环语句实现可连续地将新书加入文件或从文件中查找指定的书名。由于是以一个Book类的实例进行文件输入输出的,所以,这文件的类型应该是二进制文件。简化的参考程序如下:#include<iostream.h>#include<string.h>#include<fstream.h>classBook{ longintnum; //书号 charbookname[40]; //书名 charpublicname[40]; //出版社 charname[20]; //作者public: Book() {num=0;bookname[0]=0;publicname[0]=0;name[0]=0;} char*Getbookname(void) {returnbo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年碱锰电池合作协议书
- 小学一年级2025年秋季学期语文教学计划
- 2025年企业公转私借款合同(2篇)
- 2025年九年级第二学期思想品德教学工作总结(三篇)
- 2025年个人房屋买卖协议例文(五篇)
- 2025年买卖合同要式合同(2篇)
- 2025年代理委托贷款协议(2篇)
- 2025年九年级初三班主任的工作总结模版(二篇)
- 2025年二手房买卖购房合同样本(三篇)
- 2025年个人私人借款合同标准版本(2篇)
- 苏州2025年江苏苏州太仓市高新区(科教新城娄东街道陆渡街道)招聘司法协理员(编外用工)10人笔试历年参考题库附带答案详解
- 搞笑小品剧本《大城小事》台词完整版
- 2025至2031年中国助眠床垫行业投资前景及策略咨询研究报告
- 物业服务和后勤运输保障服务总体服务方案
- 2025四川中烟招聘高频重点提升(共500题)附带答案详解
- 2025年极兔速递有限公司招聘笔试参考题库含答案解析
- 2025年北京市文化和旅游局系统事业单位招聘101人笔试高频重点提升(共500题)附带答案详解
- 2024-2030年中国科技孵化器产业发展现状及投融资战略分析报告
- 中学学校2024-2025学年第二学期教学工作计划
- 《大模型原理与技术》全套教学课件
- 光伏发电项目试验检测计划
评论
0/150
提交评论