罗玉萍实验报告三12147.docx
- 文档编号:6084109
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:20
- 大小:94.97KB
罗玉萍实验报告三12147.docx
《罗玉萍实验报告三12147.docx》由会员分享,可在线阅读,更多相关《罗玉萍实验报告三12147.docx(20页珍藏版)》请在冰豆网上搜索。
罗玉萍实验报告三12147
池州学院数学计算机科学系实验报告
专业:
计算机科学与技术班级:
12级计本实验课程:
类和对象
姓名:
罗玉萍学号:
120312147实验室:
__博采北101
实验时间:
2013/4/26指导教师签字:
彭秀芳成绩:
实验三类和对象
一、实验目的与要求
1.学习类、成员函数、对象的定义方法。
2.学习使用构造函数和析构函数。
3.学习使用静态成员、内联成员函数。
4.掌握this指针的使用方法。
5.掌握对象成员的使用方法。
6.掌握多文件结构的程序设计方法。
7.进一步熟悉VC++6.0的编译连接过程,掌握VC++6.0的调试方法。
二、实验环境
PC机、XP操作系统、VisualC++6.0
三、实验内容
1.阅读程序,预测功能,再上机编辑、运行该程序,以验证自己的预测。
(1)理解拷贝构造函数的目的和调用。
在三种情况下,系统自动调用拷贝构造函数
第一种情况:
当用类的一个对象去初始化该类的另一个对象时;
第二种情况:
如果函数的形参是类的对象,调用函数时,进行形参和实参结合时;
第三种情况:
如果函数的返回值是类的对象,函数执行完成返回调用者时。
以下程序都是定义一个屏幕上的点类,该类具有x,y坐标属性。
【程序1】
#include
usingnamespacestd;
classPoint
{
public:
Point(intxx=0,intyy=0)
{
X=xx;Y=yy;
cout<<"调用构造函数\n";
}
Point(Point&p);
intGetX(){returnX;}
intGetY(){returnY;}
private:
intX,Y;
};
Point:
:
Point(Point&p)
{
X=p.X;
Y=p.Y;
cout<<"调用拷贝构造函数\n";
}
voidmain()
{
PointA(3,4);//a行
PointB(A);//b行
cout< } 思考: (a)将b行改写为PointB=A;程序输出结果会有变化吗? (b)将b行改写为PointB;B=A;程序输出结果会有变化吗? 【程序2】 #include usingnamespacestd; classPoint { public: Point(intxx=0,intyy=0) { X=xx;Y=yy; cout<<"调用构造函数\n"; } Point(Point&p); intGetX(){returnX;} intGetY(){returnY;} private: intX,Y; }; Point: : Point(Point&p) { X=p.X; Y=p.Y; cout<<"调用拷贝构造函数\n"; } voidfun1(Pointp) { cout< } voidmain() { PointA(4,5);//a行 PointB(A);//b行 cout< fun1(B);//调用拷贝构造函数,实现形参和实参结合 } 【程序3】 #include usingnamespacestd; classPoint { public: Point(intxx=0,intyy=0) { X=xx;Y=yy; cout<<"调用构造函数\n"; } Point(Point&p); intGetX(){returnX;} intGetY(){returnY;} private: intX,Y; }; Point: : Point(Point&p) { X=p.X; Y=p.Y; cout<<"调用拷贝构造函数\n"; } Pointfun2() { PointTemp(10,20);//调用构造函数 returnTemp; } voidmain() { PointA(4,5);//a行 PointB(A);//b行 cout< B=fun2(); cout< } (2)创建一个雇员类,该类中数据成员有姓名、家庭住址和邮政编码等,其功能有修改姓名、显示数据信息,要求其功能函数的原型放在类定义体中。 #include usingnamespacestd; classEmployee { public: Employee(char*pName="",char*pAddress="",char*pPostalcode="") { name=newchar(strlen(pName)+1); strcpy(name,pName); address=newchar(strlen(pAddress)+1); strcpy(address,pAddress); strcpy(postalcode,pPostalcode); } voidmodifyName(char*pName) { strcpy(name,pName); } voidmodifyAddress(char*pAddress) { strcpy(address,pAddress); } voidmodifyPostalcode(char*pPostalcode) { strcpy(postalcode,pPostalcode); } voiddisplay() { cout<<"姓名: "< <<"地址: "< <<"邮编: "< } private: char*name; char*address; charpostalcode[7]; }; intmain() { Employeeem[3]={Employee("李琳","张家口","075000"), Employee("张强","北京","100011"), Employee("王明","天津","300232")}; for(inti=0;i<3;i++) em[i].display(); em[1].modifyName("张晓强"); cout<<"张强改名为张晓强,第二个雇员的信息为: "< em[1].display(); return0; } 思考: 为什么将姓名、家庭住址设计为指针类型? 邮政编码设计为数组类型? 2.编写程序 建立一个矩阵类Array,存储一个4*4的矩阵并能在矩阵中查找数据。 要求如下: (a)私有数据成员 ·intpx[4][4]: 存储一个4*4矩阵的值。 ·intn: 矩阵的行数。 (b)公有数据成员 ·intx: 存储根据查找要求在矩阵中要找到的某数。 ·intim,jm: 存储该数所在的行、列值。 (c)公有成员函数 ·构造函数: 初始化n的值为4,x、im、jm为0。 ·voidinput(inta[][4]): 将一个矩阵赋给该对象中的数组。 ·voidfind(): 在该对象存储的矩阵中查找值最小的数,保存该数及该数所在的行、列值到x,im,jm中。 ·voidprint(): 按行输出矩阵的值 (d)编写一个程序测试该类,使用以下测试数据,输出矩阵的值,查找值最小的数并输出x、im、jm的值。 3.熟悉多文件程序 (1)在实际程序设计中,一个源程序按照结构可以划分为3个文件: 类声明文件(*.h文件)、类实现文件(*.cpp)和类的使用文件(*.cpp,主函数文件)。 *类声明文件(*.h文件): 将类的声明部分放在类声明文件(头文件)中,这就形成了类的public接口,向用户提供调用类成员函数所需的函数原型。 *类实现文件(*.cpp): 将类成员函数的定义放在类实现文件中,这就形成了类的实现方法。 *类的使用文件(*.cpp,主函数文件): 将类的使用部分(通常是主程序)放在类使用文件中,这样可以清晰地表示出本程序所要完成的工作。 (2)尝试完成一个C++多文件程序的开发过程。 先依据之前学习的内容创建一个新的空工程,然后依次在该工程中添加下列文件: //文件1student.h(类的声明部分) #include usingnamespacestd; classStudent{ public: //类的外部接口 Student(char*name1,char*stu_no1,floatscore1); //声明构造函数 ~Student();//声明析构函数 voidmodify(floatscore1);//声明数据修改函数 voidshow();//声明数据输出函数 private: char*name;//学生姓名 char*stu_no;//学生学号 floatscore;//学生成绩 }; //文件2student.cpp(类的实现部分) #include"student.h"//包含类的声明文件 Student: : Student(char*name1,char*stu_no1,floatscore1){ name=newchar[strlen(name1)+1];//构造函数的实现 strcpy(name,name1); stu_no=newchar[strlen(stu_no1)+1]; strcpy(stu_no,stu_no1);score=score1; } Student: : ~Student()//析构函数的实现 {delete[]name;delete[]stu_no;} voidStudent: : modify(floatscore1)//数据修改函数的实现 {score=score1;} voidStudent: : show()//数据输出函数的实现 {cout<<"name: "< cout<<"stu_no: "< cout<<"score: "< } //文件3studentmain.cpp(类的使用部分) #include"student.h"//包含类的声明文件 intmain() {Studentstu1("Liming","20080201",90); //定义类Student的对象stu1,调用stu1的构造函数,初始化对象stu1 stu1.show(); //调用stu1的成员函数show,显示stu1的数据 stu1.modify(88); //调用stu1的成员函数modify,修改stu1的数据 stu1.show(); //调用stu1的成员函数show,显示stu1修改后的数据 return0; } 四、实验步骤 1.【程序1】 #include usingnamespacestd; classPoint { public: Point(intxx=0,intyy=0) { X=xx;Y=yy; cout<<"调用构造函数\n"; } Point(Point&p); intGetX(){returnX;} intGetY(){returnY;} private: intX,Y; }; Point: : Point(Point&p) { X=p.X; Y=p.Y; cout<<"调用拷贝构造函数\n"; } voidmain() { PointA(3,4);//a行 PointB(A);//b行 cout< } (a) #include usingnamespacestd; classPoint { public: Point(intxx=0,intyy=0) { X=xx;Y=yy; cout<<"调用构造函数\n"; } Point(Point&p); intGetX(){returnX;} intGetY(){returnY;} private: intX,Y; }; Point: : Point(Point&p) { X=p.X; Y=p.Y; cout<<"调用拷贝构造函数\n"; } voidmain() { PointA(3,4);//a行 PointB=A;//b行 cout< } (b) #include usingnamespacestd; classPoint { public: Point(intxx=0,intyy=0) { X=xx;Y=yy; cout<<"调用构造函数\n"; } Point(Point&p); intGetX(){returnX;} intGetY(){returnY;} private: intX,Y; }; Point: : Point(Point&p) { X=p.X; Y=p.Y; cout<<"调用拷贝构造函数\n"; } voidmain() { PointA(3,4);//a行 PointB;B=A ;//b行 cout< } 【程序2】 #include usingnamespacestd; classPoint { public: Point(intxx=0,intyy=0) { X=xx;Y=yy; cout<<"调用构造函数\n"; } Point(Point&p); intGetX(){returnX;} intGetY(){returnY;} private: intX,Y; }; Point: : Point(Point&p) { X=p.X; Y=p.Y; cout<<"调用拷贝构造函数\n"; } voidfun1(Pointp) { cout< } voidmain() { PointA(4,5);//a行 PointB(A);//b行 cout< fun1(B);//调用拷贝构造函数,实现形参和实参结合 } 【程序3】 #include usingnamespacestd; classPoint { public: Point(intxx=0,intyy=0) { X=xx;Y=yy; cout<<"调用构造函数\n"; } Point(Point&p); intGetX(){returnX;} intGetY(){returnY;} private: intX,Y; }; Point: : Point(Point&p) { X=p.X; Y=p.Y; cout<<"调用拷贝构造函数\n"; } Pointfun2() { PointTemp(10,20);//调用构造函数 returnTemp; } voidmain() { PointA(4,5);//a行 PointB(A);//b行 cout< B=fun2(); cout< } #include usingnamespacestd; classEmployee { public: Employee(char*pName="",char*pAddress="",char*pPostalcode="") { name=newchar(strlen(pName)+1); strcpy(name,pName); address=newchar(strlen(pAddress)+1); strcpy(address,pAddress); strcpy(postalcode,pPostalcode); } voidmodifyName(char*pName) { strcpy(name,pName); } voidmodifyAddress(char*pAddress) { strcpy(address,pAddress); } voidmodifyPostalcode(char*pPostalcode) { strcpy(postalcode,pPostalcode); } voiddisplay() { cout<<"姓名: "< <<"地址: "< <<"邮编: "< } private: char*name; char*address; charpostalcode[7]; }; intmain() { Employeeem[3]={Employee("李琳","张家口","075000"), Employee("张强","北京","100011"), Employee("王明","天津","300232")}; for(inti=0;i<3;i++) em[i].display(); em[1].modifyName("张晓强"); cout<<"张强改名为张晓强,第二个雇员的信息为: "< em[1].display(); return0; } 2 #include #include usingnamespacestd; classArray { public: intx;//存储根据查找要求在矩阵中要找到的某数 intim,jm;//存储该数所在的行、列值 Array(); voidinput(inta[][4]);//将一个矩阵赋给该对象中的数组 voidfind();//在该对象存储的矩阵中查找值最小的数 voidprint(); private: intpx[4][4];//存储一个4*4矩阵的值。 intn;//矩阵的行数 }arr; Array: : Array() { x=0; n=4; im=0; jm=0; } voidArray: : input(inta[][4]) { for(inti=0;i<4;i++) { for(intj=0;j<4;j++) px[i][j]=a[i][j]; } } voidArray: : print() { cout<<"矩阵信息为: "< for(inti=0;i<4;i++) { for(intj=0;j<4;j++) cout< cout< } cout< cout<<"其中最小的数为: "< cout<<"该数所在行数为: "< <<"该数所在列数为: "< } voidArray: : find() { x=px[0][0]; for(inti=0;i<4;i++) for(intj=0;j<4;j++) if(px[i][j] { x=px[i][j]; im=i+1; jm=j+1; } } voidmain() { inta[4][4]; cout<<"请输入(4*4)矩阵信息: "< for(inti=0;i<4;i++) for(intj=0;j<4;j++) { cin>>a[i][j]; } arr.input(a); arr.find(); arr.print(); } 五、实验结果 1.【程序1】 (a)程序结果不会有变化 (b)程序结果会发生变化 【程序2】 【程序3】 (2) 答: 姓名和地址设为指针类型是因为指针传递时双向的,使得调用的函数也能使内容改变。 邮政编码设为数组类型是因为邮政编码的第一个数可能是0,这样就能避免0不被显示出来。 2. 六、实验心得 预测时,出现错误,与调试的结果不同。 找出自己哪里出错了。 在编写4*4的矩阵时,程序出现了很多问题,输出方法编写也出现错误,说明这方面还不太熟,要看书,多多练习。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 罗玉萍 实验 报告 12147
![提示](https://static.bdocx.com/images/bang_tan.gif)