11《面向对象程序设计》(C++)实验指导书1
更新时间:2024-05-17 23:30:01 阅读量: 综合文库 文档下载
- Java面向对象程序设计推荐度:
- 相关推荐
实验 1 类和对象
1.1实验目的和要求
(1) 理解类和对象的概念,掌握声明类和定义对象的方法。 (2) 掌握构造函数和析构函数的实现方法。 (3) (4) (5) (6)
初步掌握使用类和对象编制C++程序。
掌握对象数组、对象指针和string类的使用方法。
掌握使用对象、对象指针和对象引用作为函数参数的方法。 掌握类对象作为成员的使用方法。
(7) 掌握静态数据成员和静态成员函数的使用方法。 (8) 理解友元的概念和掌握友元的使用方法。
1.2实验内容和步骤
1. 输入下列程序 //test4-1.cpp #include
Coordinate(int x1,int y1) { x=x1; y=y1;
}
Coordinate(Coordinate &p); ~Coordinate()
{ cout<<”Destructor is calleded\\n”;} int getx() {return x;} int gety() {return y;}
private: int x,y; };
Coordinate::Coordinate(Coordinate &p) { x=p.x; y=p.y;
cout<<”copy-initialization Constructou is called\\n”; }
int main()
{ Coordinate p1(3,4); Coordinate p2(p1);
Coordinate p3=p2;
cout<<”p3=(“<
(1) 写出程序的运行结果。
(2) 将Coordinate类中带有两个参数的构造函数进行修改,在函数体内增添下述语句: cout<<”Constructor is called.\\n”;
写出程序的运行结果,并解释输出结果。 (3)按下列要求进行调试: 在主函数体内,添加下列语句:
Coordinate p4; Coordinata p5(2);
调试程序时会出现什么错误?为什么?如何对已有的构造函数进行适当修改?
(4)经过以上第(2)步和第(3)步的修改后,结合运行结果分析:创建不同的对象时会调用不同的构造函数。
2.设计一个4*4魔方程序,让魔方的各行值的和等于各列值的和,并且等于两对角线值的和。例如一下魔方: 31 3 5 25 9 21 19 15 17 13 11 23
7 27 29 1
各行、各列以及对角线值的和都是64. 【提示】
求4*4魔方的一般步骤如下:
(1)设置初始魔方的起始值和相邻元素之间的差值。例如上述魔方的初始魔方的起始值(first)和相邻元素之间的差值(step)分别为: first=1
step=2
(2)设置初始魔方元素的值。例如上述魔方的初始魔方为: 1 3 5 7 9 11 13 15 17 19 21 23
25 27 29 31
(3)生成最终魔方。方法如下:
错误!未找到引用源。求最大元素值与最小元素值的和sum,该实例的sum是:
1+31=32
错误!未找到引用源。用32减去初始魔方所有对角线上元素的值,然后将结果放在原来的位置,这样就可求得最终魔方。本例最终魔方如下: 31 9 17 7
3 21 13 27
5 25 19 15 11 23 29 1
本题的魔方类magic的参考框架如下: class magic { public:
void getdata();
void setfirstmagic(); void generatemagic(); void printmagic();
private:
int m[4][4]; int step; int first; int sum;
};
3.设计一个用来表示直角坐标系的Location类,在主程序中创建类Location的两个对象A和B,要求A的坐标点在第3象限,B的坐标在第2象限,分别采用成员函数和友元函数计算给定两个坐标点之间的距离,要求按如下格式输出结果:
A(x1,y1),B(x2,y2) Distance1=d1 Distance1=d2
其中:x1、x2、y1、y2为指定的坐标值,d1和d2为两个坐标点之间的距离。 【提示】
类Location的参考框架如下: class Location { public:
Location(double,double); double Getx() double Gety()
double distance(Location &);
friend double distance (Location &,Location &); private:
double x,y; };
4.声明一个Student类,在该类中包括一个数据成员score(分数)、两个静态数据成员total_score(总分)和count(学生人数);还包括一个成员函数account()用于设置分数、累计学生成绩之和、累计学生人数,一个静态成员函数sum()用于返回学生的成绩之和,另一个静态成员函数average()用于求全班成绩的平均值。在main函数中,输入 某班同学的成绩,并调用上述函数求出全班学生的成绩之和和平均分。
5.使用C++的string类,将5个字符串按逆转后的顺序显示出来。例如,逆转前的5个字符串是:
Germany Japan America Britain France
按逆转后的顺序输出字符串是:
France Britain America Japan Germany
实验2 派生类与继承
2.1实验目的和要求
(1) 掌握派生类的声明方法和派生类构造函数的定义方法。
(2) 掌握不同继承方式下,基类成员在派生类中的访问属性。
(3) 掌握在继承方式下,构造函数与析构函数的执行顺序与构造规则。 (4) 学习虚基类在解决二义性问题中的作用。
2.2实验内容与步骤·
1.输入下列程序。 //test4_1.cpp
#include
public: void setx(int i) {x=i;} int getx() {return x;} public: int x; };
class Derived:public Base{ public: }
void sety(int i) {y=i;} int gety() {return y;} void show()
{cout<<\public: int y;
};
int main() {Derived bb; bb.setx(16); bb.sety(25);
bb.show();
cout<<\
}
cout<<\cout<<\cout<<\return 0;
(1) 写出程序的运行结果。
(2) 按以下要求,对程序进行修改后再调试,指出调试中出错的原因。
错误!未找到引用源。将基类Base中数据成员x的访问权限改为private时,会出现哪些错误?为什么?
错误!未找到引用源。将基类Base中数据成员x的访问权限改为protected时,会出现哪些错误?为什么?
错误!未找到引用源。在源程序的基础上,将派生类Derived的继承方式改为private时,会出现哪些错误?为什么?
错误!未找到引用源。在源程序的基础上,将派生类Derived的继承方式改为protected时,会出现哪些错误?为什么?
2.编写一个学生和教师的数据输入和显示程序。学生数据有编号、姓名、性别、年龄、系别和成绩,教师数据有编号、姓名、性别、年龄、职称和部门。要求将编号、姓名、性别、年龄的输入和显示设计成一个类Person,并作为学生类Student和教师类Teacher的基类。
供参考的类结构如下:
class Person{
...
};
class Student:public Person{
... };
class Teacher:public Person{
...
};
3.按要求阅读、编辑、编译、调试和运行以下程序。
(1) 阅读、编辑、编译、调试和运行以下程序,并写出程序的运行结果。 //test4_3_1.cpp #include
MyArray(int leng); ~MyArray{}; void Input(); void Display(string); protected:
int*alist; int length; };
MyArray::MyArray(int leng)
{if(leng<=0)
{cout<<”error length”; exit(1); }
alist=new int [leng]; length=leng; if(alist==NULL) {cout<<”assign failure”; exit(1);
}
cout<<”MyArray类对象已创建。”<
MyArray::~MyArray() {delete[] alist;
cout<<”MyArray类对象被撤销。”<
void MyArray::Display(string str) {int i;
int *p=alist;
cout<
cout<<*p<<””; cout<
void MyArray::Input{}
{cout<<”请键盘输入”<
int *p =alist;
for(i=0;i
int main()
{MyArray a(5);
a.Input();
a.Display(“显示已输入的”);
return 0;
}
(2) 声明一个类SortArray继承类MyArray,在该类中定义一个函数,具有将输入的整数从小到大进行排序的功能。
【提示】
在第(1)步的基础上可增加下面的参考框架: class SortArray : public MyArray { public: void Sort();
SortArray(int leng):MyArray(leng)
{cout<<”SortArray类对象已创建。”<
virtual ~SortArray(); };
SortArray::~SortArray()
{cout<<”SortArray类对象被撤销。”<
void SortArray::Sort() {
//请自行编写Sort函数的代码,将输入的整数从小到大排序。 }
//并将主函数修改为: int main()
{SortArray a(5);
s.Input();
s.Display(“显示排序以前的”); s.Sort();
s.Display(“显示排序以后的”); return 0;
}
声明一个类ReArray继承类MyArray,在该类中定义一个函数,具有将输入的整数进行倒置的功能。 【提示】
在第(1)步的基础上可增加下面的参考框架: Class ReArray:public MyArray{ Public: Void reverse();
ReArray(int leng); Virtual ~ReArray(); };
请读者自行编写构造函数、析构函数和倒置函数ReArray,以及修改主函数。
(3) 声明一个类AverArray继承类MyArray,在该类中定义一个函数,具有求输入的整数平均值的功能。 【提示】
在第(1)步的基础上增加下面的参考框架: class AverArray:public MyArray{ Public:
AverArray(int leng); ~AverArray(); Double Aver();
};
请读者自行编写构造函数、析构函数和求平均值函数Aver(求解整数的平均值),以及修改主函数。
(2) 声明一个NewArray类,同时继承了类SortArray,ReArray和AverArray,使得类
NewArray的对象同时具有排序、倒置和求平均值的功能。在继承的过程中声明
MyArray为虚基类,体会虚基类在解决二义性问题中的作用。
实验3 多态性
3.1实验目的和要求
(1) (2) (3) (4)
了解多态性的概念。
掌握运算符重载的基本方法。 掌握虚函数的定义和使用方法。
掌握纯虚函数和抽象类的概念和用法。
3.2实验内容与步骤
1.分析并调试下列程序,写出程序的输出结果,并解释输出结果。 //test5_1.cpp #include
public:
virtual void f1 (double x)
{cout<<”B::f1(double)”<
void f2(double x)
{cout<<”B::f2(double)”<<2*x<
void f3(double x)
{cout<<”B::f3(double)”<<3*x<
class D:public B{ public:
virtual void f1(double x)
{cout<<”D::f1(double)”<
void f2(double x)
{cout<<”D::f2(double)”<<2*x<
void f3(double x)
{cout<<”D::f3(double)”<<3*x<
B*pb=&d; D*pd=&d; pb->f1(1.23); pb->f1(1.23); pb->f2(1.23); pb->f3(1.23); pb->f3(3.14);
return 0; }
2.编写一个程序,其中设计一个时间类Time,用来保存时、分、秒等私有数据成员,通过重载操作符“+”实现两个时间的相加。要求将小时范围限制在大于等于0,分钟范围限制在0~59,秒钟范围限制在0~59秒。 【提示】 时间类Time{
public:
Time(int h=0,int m=0,int s=0); Time operator+(Time&); void disptime(string); private: int hourse; int minutes;
int seconds; };
3.给出下面的抽象基类container; class container {
protected:
double radius; public:
container(double radius1); virtual double surface_area()=0; virtual double volume()=0;
};
要求建立3个继承container的派生类cube、sphere与cylinder,让每一个派生类都包含虚函数surface_area()和volume(),分别用来计算正方体、球体和圆柱体的表面积及体积。要求写出主程序,应用C++的多态性,分别计算边长为6.0的正方体、半径为5.0的球体,以及半径为5.0和高为6.0的圆柱体的表面积和体积。
4.编写一个程序,用于进行集合的并、差和交运算。例如输入整数集合{9 5 4 3 6 7}和{2 4 6 9 },计算出它们进行集合的并、差和交运算后的结果。
【提示】 i. 可用以下表达式实现整数集合的基本运算:
s1+s2 两个整数集合的并运算 s1-s2 两个整数集合的差运算 s1*s2 两个整数集合的交运算 ii. 参考以下Set类的框架,用于完成集合基本运算所需的各项功能。
class set{
public: set::set();
void set::input(int d); int set::length(); int set::getd(int i); void set::disp(); set set::operator+(set s1); set set::operator-(set s1); set set::operator*(set s1); set set::operator=(set s1);
protected: int len;
int s[MAX]; };
实验 4 模板与异常处理
4.1 实验目的和要求
(1)正确理解模板的概念。
(2)掌握函数模板和类模板的声明和使用方法。 (3)学习简单的异常处理方法。
4.2 实验内容和步骤
1.分析并调试下列程序,写出运行结果并分析原因。 (1)
//test6_1_1.cpp #include
}
int max(int a,int b) {return a>b? a:b;
}
double max (double a,double b) {return a>b? a:b; }
int main()
{ cout<<”max(?3?,?7?) is “<
//test6_1_2.cpp
#include
using namespace std; int max(int a,int b)
{return a>b? a:b; }
double max (double a,double b) {return a>b? a:b; }
int main()
{ cout<<”max(?3?,?7?) is “<
return 0;
}
2. 编写一个求任意类型数组中最大元素和最小元素的程序,要求将求最大元素和最小元素
的函数设计成函数模板。
3. 编写一个程序,使用类模板对数组元素进行排序、倒置、查找和求和。 【提示】
设计一个类模板 template
};
具有对数组元素进行排序、倒置、查找和求和功能,然后产生类型实参分别为int型和double型的两个模板类,分别对整型数组与双精度数组完成所要求的操作。
4. 编写一个程序,求输入数的平方根。设置异常处理,对输入负数的情况给出提示。
实验 5 C++的流类库与输入输出
5.1 实验目的和要求
(1)掌握C++格式化的输入输出方法。 (2)掌握重载运算符“<<”和“>>”的方法。 (3)掌握磁盘文件的输入输出方法。
5.2 实验内容和步骤
1. 下面给出的test7_1_1.cpp程序用于打印九九乘法表,但程序中存在错误。请上机调试,使得此程序运行后,能够输出如下所示的九九乘法表。 * 1 2 3 4 5 6 7 8 9 1 1
2 2 4
3 3 6 9
4 4 8 12 16
5 5 10 15 20 25
6 6 12 18 24 30 36
7 7 14 21 28 35 42 49
8 8 16 24 32 40 48 56 64
9 9 18 27 36 45 54 63 72 81
//test7_1_1.cpp #include
int i,j;
cout<<”*”;
for(i=1;i<=9;i++)
cout<
for(j=1;j<=i;j++) Cout<
2.下面的程序用于统计文件xyz.txt中的字符个数,请填空完成程序。 //test7_2_1.cpp #include
int i=0;
ifstream file;
file.open(“xyz.txt”,ios::in); if( 错误!未找到引用源。 ) {
cout<<”xyz.txt cannot open”<
While (!file.eof()) {
错误!未找到引用源。 i++; }
cout<<”文件字符个数:”<
return 0; }
3.重载运算符“<<”和“>>”,使其能够输入一件商品的信息和输出这件商品的信息。商品的信息由编号、商品名和价格。假如商品类Merchandise的框架如下: class merchandise{
public:
Merchandiss();
~Merchandiss();
friend istream& operator>>(istream& in,Merchandiss& s); friend ostream&operator<<(ostream& out,Merchandiss& s); private:
int no;
char *name; double price; };
要求实现该类,并编写以下的main函数对该类进行操作。 int main()
{ Merchandise mer; cin>>mer; cout<
}
4.编写一个程序,将两个文本文件连接成一个文件,然后将此文件中所有小写字母转换成大写字母,并打印出来。
正在阅读:
小班完成版小班特色课程 - 图文04-22
简易三路抢答器 课程设计06-10
环保市容局科学发展观整改落实方案03-13
《扇形统计图》教学设计说明04-19
五指争功作文800字07-12
黑龙江地方课程人文与社会四年下册03-20
师德师风个人工作总结例文合集04-03
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- C++
- 指导书
- 程序设计
- 面向
- 对象
- 实验
- 学生宿舍管理系统的设计与实现毕业设计论文
- 冀教版小学六年级上册英语教案2
- 面对孩子青春期家长莫吝啬赞扬
- 2018高考百日冲刺发言稿欣赏
- 管道保温工程的意义
- 湖北科技学院最新创意毕业生求职个人简历模板封面+自荐书+简历+
- 某钢结构独立基础计算书J-1
- 四体系管理手册
- 看《建党伟业》影片的真实观后感
- 教案水调歌头·苏轼
- 人教部编版语文二年级下册第五单元测试题(二)(附答案)
- 2014电大《道路勘测设计》期末复习题
- 超微集成BMC - IPMI使用手册V1.0
- 肇庆市鼎湖区姓氏源流
- 《统计学概论》期末试题B卷
- 创意天空方案设计说明1130 - 图文
- 初中英语易混淆词组训练大全(附答案)
- 树立正确的恋爱观
- 创新与研发是中小套型住宅设计灵魂
- 免疫组织化学步骤详解