面向对象程序设计实验指导.docx

上传人:b****7 文档编号:25278040 上传时间:2023-06-06 格式:DOCX 页数:35 大小:2.94MB
下载 相关 举报
面向对象程序设计实验指导.docx_第1页
第1页 / 共35页
面向对象程序设计实验指导.docx_第2页
第2页 / 共35页
面向对象程序设计实验指导.docx_第3页
第3页 / 共35页
面向对象程序设计实验指导.docx_第4页
第4页 / 共35页
面向对象程序设计实验指导.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

面向对象程序设计实验指导.docx

《面向对象程序设计实验指导.docx》由会员分享,可在线阅读,更多相关《面向对象程序设计实验指导.docx(35页珍藏版)》请在冰豆网上搜索。

面向对象程序设计实验指导.docx

面向对象程序设计实验指导

面向对象程序设计(C++)实验指导

一、实验环境

本实验基于当前主流的面向对象开发平台,编码规范遵循主流的参考规范。

二、编程语言和开发工具

C++语言,开发工具不限,建议使用VisualC++6.0版本

三、编码规范(编码规范的要求)

要求遵循良好的的程序设计习惯来设计实验和编写代码。

(注:

如果你将程序的很多功能全部放在一个长长的main()主函数中实现,这样的程序设计和编码风格会被扣分,请将不同的功能模块分别用函数来实现。

1.在实验过程中应注意培养规范的编码风格:

2.标识符的命名应要求达到顾名思义的程度,一看就知道用来做什么;

3.提供足够的注释,注释文字清晰明了;

4.程序排版的要求:

a)不同功能模块用空行分隔,使功能块一目了然;

b)基本上一条语句一行;

同一层次的语句统一缩进对齐。

四、实验

见后文……

五、注意事项

●所有实验要求独立完成,同学之间可以讨论,但严禁抄袭,若发现雷同,抄袭者和被抄袭者此次实验成绩均记零分。

●实验结束后书写实验报告,实验报告的内容包括实验目的、实验内容、结果分析以及本次实验的心得体会。

要求将程序源码和运行时的输入/输出数据情况写在实验内容部分,并对程序的输出结果进行分析(如对某组输入得不到预期的结果,则分析说明其原因)。

实验一简单C++程序的设计(2课时)

实验目的和要求:

1.掌握C++程序的基本格式与规范,学会编写简单的C++程序。

2.理解C++程序结构的特点。

3.熟悉C++程序的基本输入输出操作。

4.掌握函数的使用方法。

5.掌握VC6.0中程序调试的方法。

预习内容:

cin/cout的使用;分支和循环结构的使用;函数的定义和调用。

实验内容:

1.书写一个“Helloworld!

”的程序,熟悉VC6.0的运行环境。

2.编写程序Ex_Swap实现输入两个整数,并将最大的整数输出显示。

3.编写一个Max函数,实现求两个整数最大值的功能。

要求在main函数中进行数据的读取和结果的显示。

提示:

1.VC6.0中C++程序的编写步骤

(1)运行VC6.0;

 

(2)新建工程;

 

(3)选择工程类型“win32ConsoleApplication”,输入工程名和路径;

 

(4)创建一个空的工程;

(5)确认后工程创建完成;

 

(6)工程创建后的界面;

(7)新建一个C++源文件,加入到刚才创建的工程中,并为该源文件取名;

 

(8)编辑源程序;

(9)编译并创建可执行文件(F7)

 

(10)运行(Ctrl+F5)

(11)运行结果显示

 

2.调试程序

(1)将光标定位到需要设置断点的行,点击断点设置图标(或F9),则在对应的行出现断点标志;

(2)点击调试按钮(或F5),程序运行到断点处(注:

如果断点前有输入语句,则程序会等待用户的输入);

(3)可在watch窗口中输入变量名,观察其运行到当前步骤时的值(也可以将光标定位到变量上,观察其值),如果值与预想的不一致,说明当前的程序之前出现了错误,应仔细阅读前面的代码进行修改。

实验二C++基础(2课时)

实验目的和要求:

1.掌握一维数组和二维数组的定义和使用。

2.掌握for和while循环的用法。

预习内容:

数组;循环结构。

实验内容:

1、假设我们举行一次班长选举,对一个班(20名同学)中的5名候选人(分别用代号1~5表示)中进行投票选举,以得票最多者当选,请编程统计5名候选人的得票情况。

假设原始投票数据如下:

13244335215433521441。

2、A[3][4]是一个3行4列的整数矩阵,编写程序求出所有元素之和。

3、(选做)编写程序。

先读入10个整数,再把它们按从小到大排序;最后再读入一个整数k,并将k插入到该整数序列中,插入后的数任然从小到大排列。

例如,若输入6,3,42,23,35,71,98,67,56,38,最后输入待插入的数59,则输出结果应为:

36233538425659677198。

提示:

1、一维数组的定义为:

类型数组名[元素数量]。

例如要定义5个元素的一维整形数组,则为intA[5]。

注意:

数组的下标是从0开始,即这5个元素分别为a[0]、a[1]、a[2]、a[3]、a[4]。

二维数组的定义为:

类型数组名[元素行数量][元素列数量]。

例如要定义一个4行5列的整形数组,则为intA[4][5]。

通常数组的遍历可用for循环,对于二维数组则使用两重的for循环进行遍历,例如对A[4][5]中的元素进行遍历时,可如下进行:

for(inti=0;i<=3;i++)

for(intj=0;j<=4;j++)

{

//访问A[i][j]的代码

}

2、第一题:

用一个具有5个元素的一维数组A[5]记录五个候选人的得票情况,用一个具有20个元素的一维数组B[20]记录每个同学的投票情况,对B[20]进行遍历统计每个候选人的得票数。

3、第二题:

用一个二维数组A[3][4]保存数组,通过一个二重循环遍历数组中的每个元素。

4、第三题:

定义数组时要按照11个元素进行定义;在对10个元素进行排序,排序完成后,读入一个待插入的数,与排好序的10个元素进行比较,找到插入的位置。

之后的数组元素进行后移,数组元素后移的实现是将从下标j开始的单元整体后移,最后将待插入的数赋值到空位

实验三函数重载和引用(2课时)

实验目的和要求:

1.掌握函数重载的定义和使用方法。

2.理解引用的概念,掌握引用的使用方法。

3.掌握带有缺省参数的函数用法。

预习内容:

引用;函数重载;带缺省值的函数。

实验内容:

1、利用重载求两个整数、三个整数和四个整数的最小值。

2、程序Ex_Swap实现数据交换。

分别用指针和引用作为函数mySwap的形参,并通过重载int、double型变量值的交换。

3、编写一个具有5个参数的函数,其中三个具有默认值,然后在main函数中针对不同的设置情况进行调用,要求运行时显示参数的设置情况。

提示一:

重载

(1)实现函数重载的方法

C++允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同。这就是函数的重载(functionoverloading)。

写程序说明

intmax(inta,intb);//函数声明

doublemax(doublea,doubleb);//函数声明

longmax(longa,longb);//函数声明

强调一下:

重载函数并不要求函数体相同

(2)注意事项:

不能只有函数的返回值类型不同而参数的个数和类型相同,否则编译出错。

编译系统无法判别应该调用哪一个函数。重载函数的参数个数、参数类型或参数顺序3者中必须至少有一种不同(但是一般不会在参数顺序上做文章,从使用该系列函数的人中考虑),函数返回值类型可以相同也可以不同。

比如

intf(int);//函数返回值为整型

longf(int);//函数返回值为长整型

voidf(int);//函数无返回值

上面是错误的!

在编程时,有时我们要实现的是同一类的功能,只是有些细节不同。例如希望从3个数中找出其中的最大者,而每次求最大数时数据的类型不同,可能是3个整数、3个双精度数或3个长整数。程序设计者往往会分别设计出3个不同名的函数,其函数原型为:

intmax1(inta,intb,intc);//求3个整数中的最大者

doublemax2(doublea,doubleb,doublec);//求3个双精度数中最大者

longmax3(longa,longb,longc);//求3个长整数中的最大者

C++允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同。这就是函数的重载(functionoverloading)。即对一个函数名重新赋予它新的含义,使一个函数名可以多用。

对上面求最大数的问题可以编写如下的C++程序。

例求3个数中最大的数(分别考虑整数、双精度数、长整数的情况)。

#include

usingnamespacestd;

intmain()

{intmax(inta,intb,intc);//函数声明

doublemax(doublea,doubleb,doublec);//函数声明

longmax(longa,longb,longc);//函数声明

inti1,i2,i3,i;

cin>>i1>>i2>>i3;//输入3个整数

i=max(i1,i2,i3);//求3个整数中的最大者

cout<<″i_max=″<

doubled1,d2,d3,d;

cin>>d1>>d2>>d3;//输入3个双精度数

d=max(d1,d2,d3);//求3个双精度数中的最大者

cout<<″d_max=″<

longg1,g2,g3,g;

cin>>g1>>g2>>g3;//输入3个长整数

g=max(g1,g2,g3);//求3个长整数中的最大者

cout<<″g_max=″<

}

intmax(inta,intb,intc)//定义求3个整数中的最大者的函数

{if(b>a)a=b;

if(c>a)a=c;

returna;

}

doublemax(doublea,doubleb,doublec)//定义求3个双精度数中的最大者的函数

{if(b>a)a=b;

if(c>a)a=c;

returna;

}

longmax(longa,longb,longc)//定义求3个长整数中的最大者的函数

{if(b>a)a=b;

if(c>a)a=c;

returna;

}

运行情况如下:

185-76567↙(输入3个整数)

56.8790.23-3214.78↙(输入3个实数)

67854-912456673456↙(输入3个长整数)

i_max=567(输出3个整数的最大值)

d_max=90.23(输出3个双精度数的最大值)

g_max=673456(输出3个长整数的最大值)

上例3个max函数的函数体是相同的,其实重载函数并不要求函数体相同。重载函数除了允许参数类型不同以外,还允许参数的个数不同。

参数的个数和类型可以都不同。但不能只有函数的返回值类型不同而参数的个数和类型相同。例如:

intf(int);//函数返回值为整型

longf(int);//函数返回值为长整型

voidf(int);//函数无返回值

在函数调用时都是同一形式,如“f(10)”。编译系统无法判别应该调用哪一个函数。重载函数的参数个数、参数类型或参数顺序3者中必须至少有一种不同,函数返回值类型可以相同也可以不同。

在使用重载函数时,同名函数的功能应当相同或相近,不要用同一函数名去实现完全不相干的功能,虽然程序也能运行,但可读性不好,使人莫名其妙。

提示二:

引用

讲解:

(1)引用是c++中一种新的变量类型,其作用是给变量起一个别名。

例如:

inta;//定义a是整型变量

int&b=a;//声明b是a的引用

这样声明后,a和b都代表同一变量。

注意:

A、在上述声明中,&是引用声明符,并不代表地址。

B、声明变量b为引用类型,并不需要另外开辟内存单元来存放b的值。b和a占内存中的同一个存储单元,它们具有同一地址。

C、在声明一个引用类型变量时,必须同时使之初始化,即声明它代表哪一个变量。以后不能改变再作为其他变量的引用(别名)。

(2)引用的主要使用地方:

用于函数参数传递

C++之所以增加引用类型,主要是把它作为函数参数,以扩充函数传递数据的功能。

(3)实例讲解引用作为参数传递

函数参数传递:

传递变量名,传递指向变量的指针(指针形参),传递变量的别名(引用形参)

例子,编写程序通过引用方式,要求将变量i和j的值互换。

#include

usingnamespacestd;

intmain()

{voidswap(int&,int&);

inti=3,j=5;

//调用swap函数时,实参不必用变量的地址(在变量名的前面加&),而直接用变量名。

swap(i,j);

cout<<″i=″<

return0;

}

voidswap(int&a,int&b)//形参是引用类型

{inttemp;

temp=a;

a=b;

b=temp;

}

可以看到使用引用作为形参,在函数编写的时候很方便,调用函数的时候也很方便。

(4)引用作为函数参数传递与指针相比的优势:

指针变量要另外开辟内存单元,其内容是地址。而引用变量不是一个独立的变量,不单独占内存单元

(5)引用不仅可以用于变量,也可以用于对象。

 

什么是变量的引用

对一个数据可以使用“引用”(reference),这是C++对C的一个重要扩充,引用是一种新的变量类型,它的作用是为一个变量起一个别名。假如有一个变量a,想给它起一个别名b,可以这样写:

inta;//定义a是整型变量

int&b=a;//声明b是a的引用

以上语句声明了b是a的引用,即b是a的别名。经过这样的声明后,a或b的作用相同,都代表同一变量。

注意:

在上述声明中,&是引用声明符,并不代表地址。不要理解为“把a的值赋给b的地址”。声明变量b为引用类型,并不需要另外开辟内存单元来存放b的值。b和a占内存中的同一个存储单元,它们具有同一地址。声明b是a的引用,可以理解为:

使变量b具有变量a的地址

在声明一个引用类型变量时,必须同时使之初始化,即声明它代表哪一个变量。在声明变量b是变量a的引用后,在它们所在函数执行期间,该引用类型变量b始终与其代表的变量a相联系,不能再作为其他变量的引用(别名)。下面的用法不对:

inta1,a2;

int&b=a1;

int&b=a2;//企图使b又变成a2的引用(别名)是不行的

引用的简单使用

例引用和变量的关系。

#include

#include

usingnamespacestd;

intmain()

{inta=10;

int&b=a;//声明b是a的引用

a=a*a;//a的值变化了,b的值也应一起变化

cout<

b=b/5;//b的值变化了,a的值也应一起变化

cout<

return0;

}

a的值开始为10,b是a的引用,它的值当然也应该是10,当a的值变为100(a*a的值)时,b的值也随之变为100。在输出a和b的值后,b的值变为20,显然a的值也应为20。

运行记录如下:

100100(a和b的值都是100)

2020(a和b的值都是20)

引用作为函数参数

有了变量名,为什么还需要一个别名呢?

C++之所以增加引用类型,主要是把它作为函数参数,以扩充函数传递数据的功能。

已经介绍过函数参数传递的两种情况。

(1)将变量名作为实参和形参。这时传给形参的是变量的值,传递是单向的。如果在执行函数期间形参的值发生变化,并不传回给实参。因为在调用函数时,形参和实参不是同一个存储单元。

例要求将变量i和j的值互换。下面的程序无法实现此要求。

#include

usingnamespacestd;

intmain()

{voidswap(int,int);//函数声明

inti=3,j=5;

swap(i,j);//调用函数swap

cout<

return0;

}

voidswap(inta,intb)//企图通过形参a和b的值互换,实现实参i和j的值互换

{inttemp;

temp=a;//以下3行用来实现a和b的值互换

a=b;

b=temp;

}

运行时输出35i和j的值并未互换。

(2)传递变量的指针。形参是指针变量,实参是一个变量的地址,调用函数时,形参(指针变量)指向实参变量单元。

#include

usingnamespacestd;

intmain()

{voidswap(int*,int*);

inti=3,j=5;

swap(&i,&j);//实参是变量的地址

cout<

return0;

}

voidswap(int*p1,int*p2)//形参是指针变量

{inttemp;

temp=*p1;//以下3行用来实现i和j的值互换

*p1=*p2;

*p2=temp;

}

这种虚实结合的方法仍然是“值传递”方式,只是实参的值是变量的地址而已。通过形参指针变量访问主函数中的变量(i和j),并改变它们的值。

C++提供了向函数传递数据的第(3)种方法,即传送变量的别名。

利用“引用形参”实现两个变量的值互换。

#include

usingnamespacestd;

intmain()

{voidswap(int&,int&);

inti=3,j=5;

swap(i,j);

cout<<″i=″<

return0;

}

voidswap(int&a,int&b)//形参是引用类型

{inttemp;

temp=a;

a=b;

b=temp;

}

输出结果为

i=5j=3

在swap函数的形参表列中声明a和b是整型变量的引用。

实际上,在虚实结合时是把实参i的地址传到形参a,使形参a的地址取实参i的地址,从而使a和i共享同一单元。同样,将实参j的地址传到形参b,使形参b的地址取实参j的地址,从而使b和j共享同一单元。这就是地址传递方式。为便于理解,可以通俗地说:

把变量i的名字传给引用变量a,使a成为i的别名。

①使用引用类型就不必在swap函数中声明形参是指针变量。指针变量要另外开辟内存单元,其内容是地址。而引用变量不是一个独立的变量,不单独占内存单元,在例中引用变量a和b的值的数据类型与实参相同,都是整型。

②在main函数中调用swap函数时,实参不必用变量的地址(在变量名的前面加&),而直接用变量名。

引用不仅可以用于变量,也可以用于对象。例如实参可以是一个对象名,在虚实结合时传递对象的起始地址。

当看到&a这样的形式时,怎样区别是声明引用变量还是取地址的操作呢?

当&a的前面有类型符时(如int&a),它必然是对引用的声明;如果前面无类型符(如cout<<&a),则是取变量的地址。

实验四类与对象(2课时)

实验目的和要求:

1.掌握类、类的数据成员、类的成员函数的定义方式。

2.理解类成员的访问控制方式。

3.掌握对象的定义和操作对象的方法。

预习内容

类(数据成员和成员函数)的定义与访问权限设置。

实验内容:

1、定义一个Date类,包括year、month和day三个数据信息,它们的值通过Set_date成员函数设置year、month和day的值,并可通过disp_date函数将日期信息输出。

在主函数中编写相应的代码测试类的功能。

2、定义一个正方体类Cube,包含边长信息,其成员函数包括计算立方体的表面积和体积,并能够将相关的信息显示出来。

在主函数中编写相应的代码测试类的功能。

3、(选做)定义一个矩形类,数据成员包括长和宽,外部可以设置和读取长和宽的值,成员函数print_star()用于打印长乘以宽的星型矩形。

例如长为10,宽为4时,打印显示的矩阵如下:

**********

**********

**********

**********

提示:

1.类声明中的访问限定符private、public、protected没有先后次序之分。

2.在一个类中,访问限定符private、public、protected出现次数没有限制。

3.数据成员和成员函数都可以设置为public、private或protected属性。

出于信息隐藏的目的,常将数据成员设置为private权限,将需要让类的外部函数(非本类定义的函数)访问的成员函数设置为public权限。

4.数据成员可以是任何数据类型,如整型、浮点型、字符型、数组、指针、引用等,也可以是另外一个类的对象或指向对象的指针,还可以是指向自身类的指针或引用,但不能是自身类的对象。

此外,数据成员不能指定为自动(auto)、寄存器(register)和外部(extern)存储类型。

例如:

classA{……};

classB{

private:

inta;

Aobja1;//正确

A*obja2;//正确

B*objb,&objr;//正确

Bb1;//错误

autointb;//错误

externintc;//错误

public:

……

};

5.在声明(或定义)类时,不能为数据成员赋初值。

例如:

classA{

private:

inta=0;//错误

intb[3]={1,2,3};//错误

public:

……

};

实验五构造函数和析构函数(2课时)

实验目的和要求:

1.掌握类的构造函数的定义方法。

2.掌握构造函数的重载,并利用构造函数进行数据成员初始化。

3.理解析构函数的定义和作用。

4.掌握构造函数和析构函数的调用时机。

预习内容:

构造函数;析构函数

实验内容:

1.定义一个类,并对它的构造函数和析构函数进行定义,以能反映构造函数和析构函数被调用了,在主函数中设计相应的代码测试构造函数和析构函数被调用的情况。

2.定义两个类A和B,其中B类中至少包含A类的对象作为其数据成员,同样定义两个类的构造函数和析构函数以反映它们被调用的时机,并编写相应的主函数运行显示结果。

3.以下是一个产品(product)类的定义,但没有类的实现部分,请根据类的定义说明编写成员函数的实现代码,并编写相应的主函数代码进行测试。

classproduct

{

private:

char*name;//产品名称

intprice;//产品单价

intquantity;//产品库存量

public:

product(char*a,intb,intc);//构造函数,初始化产品对象

//的三个属性

Voidpurchase(int

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

当前位置:首页 > 经管营销 > 经济市场

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

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