罗玉萍实验报告三12147.docx

上传人:b****6 文档编号:6084109 上传时间:2023-01-03 格式:DOCX 页数:20 大小:94.97KB
下载 相关 举报
罗玉萍实验报告三12147.docx_第1页
第1页 / 共20页
罗玉萍实验报告三12147.docx_第2页
第2页 / 共20页
罗玉萍实验报告三12147.docx_第3页
第3页 / 共20页
罗玉萍实验报告三12147.docx_第4页
第4页 / 共20页
罗玉萍实验报告三12147.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

罗玉萍实验报告三12147.docx

《罗玉萍实验报告三12147.docx》由会员分享,可在线阅读,更多相关《罗玉萍实验报告三12147.docx(20页珍藏版)》请在冰豆网上搜索。

罗玉萍实验报告三12147.docx

罗玉萍实验报告三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的矩阵时,程序出现了很多问题,输出方法编写也出现错误,说明这方面还不太熟,要看书,多多练习。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1