罗玉萍实验报告三12147.docx
《罗玉萍实验报告三12147.docx》由会员分享,可在线阅读,更多相关《罗玉萍实验报告三12147.docx(20页珍藏版)》请在冰豆网上搜索。
![罗玉萍实验报告三12147.docx](https://file1.bdocx.com/fileroot1/2023-1/3/bef2e2cd-437d-4859-a9bc-5cc32efb4d9d/bef2e2cd-437d-4859-a9bc-5cc32efb4d9d1.gif)
罗玉萍实验报告三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的矩阵时,程序出现了很多问题,输出方法编写也出现错误,说明这方面还不太熟,要看书,多多练习。