武汉理工大学 面向对象程序设计课内实验
作者:互联网
文章目录
主要仪器设备及耗材
1.安装了Windows 10操作系统的PC机1台
2.PC机系统上安装了Microsoft Visual Studio 2019开发环境
以下是本篇文章正文内容,下面案例可供参考
一、类的设计与对象使用
问题描述
1.下面的程序在编译时会出错,请修改程序,使之能正确运行。然后得到的正确程序分成3个文件。文件MyClass.h包括类的定义,文件MyClass.cpp包括类成员函数的实现,文件App.cpp包括类的使用。调试、运行该程序,使之获得正确结果。
#include<iostream>
using namespace std;
class MyClass
{
public:
MyClass() { x=0;y=0; }
MyClass(int a = 0, b = 0);
Print();
private:
int x, y;
};
MyClass::MyClass(int a = 0, int b =0)
{
x = a;
y = b;
}
void MyClass::Print()
{
cout << "x = " << x << endl;
cout << "y = " << y << endl;
}
int main()
{
MyClass obj1,obj2(5,8);
obj1.x =1;
obj1.y =3;
obj1.Print();
obj2.Print();
return 0;
}
2.已知两个矩形的长和宽,用面向对象的概念编程求它们的面积和周长。假设矩形 1 的长和宽分别为 20 和 50;矩形 2 的长和宽分别为 3.6 和 4.5。(先定义矩形类再实例化两个对象)
3.下面程序中定义了一个整型动态数组,编写了3个构造函数。
#include<iostream>
using namespace std;
class IntArray {
public:
IntArray(int sz); // 数组初始化为sz个元素,初值全为0
IntArray( int *array, int sz ) ; // 用静态数组array的前sz个元素初始化新数组
IntArray( const IntArray &rhs ) ; // 拷贝构造函数
void printAll();
private:
int *ia;
int size;
};
IntArray::IntArray( int sz ) {
size = sz; // 设置数据成员
ia = new int[ size ];
for ( int ix=0; ix < size; ++ix )
ia[ix] = 0; // 初始化数组元素
}
IntArray:: IntArray( int *array, int sz ) {
size = sz; // 设置数据成员
ia = new int[ size ];
for ( int ix=0; ix < size; ++ix )
ia[ix ] = array[ ix ]; // 拷贝数据成员
}
IntArray:: IntArray( const IntArray &rhs )
{
size = rhs.size;
ia = new int[ size ];
for (int ix = 0; ix < size; ix++ )
ia[ ix ] = rhs.ia[ ix ];
}
void IntArray::printAll()
{
for ( int ix=0; ix < size; ++ix )
cout<<ia[ix]<<" ";
cout<<endl;
}
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
IntArray arr1(10), arr2(a,5),arr3(arr2);
arr1.printAll();
arr2.printAll();
arr3.printAll();
return 0;
}
(1)为IntArray加上析构函数并编译运行程序,体会类的构造函数和析构函数的作用。
(2)程序中,类IntArray的三个构造函数都是以相似的方式来实现的。一般来说,当两个或多个函数重复相同的代码时,可将这部分代码抽取出来,形成独立的函数,以便共享。以后如果需要改变这些实现,则只需改变一次,而且这种实现的共享本质更容易为大家所理解。怎样把构造函数中的代码抽取出来形成独立的共享函数呢?请给出一种可能的实现。按你给出的实现方法修改程序并重新编译运行。
4.设有一个点myPoint类的定义如下:
class myPoint {
public:
myPoint(double x0=0.0,double y0=0.0):x(x0),y(y0) {}
myPoint(myPoint &np):x(np.x),y(np.y) {}
double GetX() { return x;}
double GetY() {return y;}
void SetX(double x0) {x=x0;}
void SetY(double y0) {y=y0;}
void SetPoint(double x0,double y0) {x=x0;y=y0;}
void SetPoint(myPoint &np) { x=np.x; y=np.y;}
double GetLength(myPoint p) {
return sqrt((x-p.x)*(x-p.x) +(y-p.y)*(y-p.y));
}
void Printit() { cout<<" ("<<x<<","<<y<<") ";}
private:
double x ,y;
};
试定义一个三角形Triangle类,在Triangle类中以点myPoint类的3个对象p1、p2、p3作为数据成员,表示三角形的三个顶点。Triangle类具有计算三角形的周长和面积的功能。请编写程序上机调试并运行。
运行结果
二、继承性实现
问题描述
1.有如下的程序:
#include <iostream>
using namespace std;
class Base
{
public :
Base(int p1, int p2) { data1 = p1; data2 = p2; }
int Inc1( ) { return ++data1; }
int Inc2( ) { return ++data2; }
void Display()
{ cout<<"data1 = "<< data1 << " data2 = " << data2 << endl; }
protected:
int data1, data2;
};
class D1 : public Base {
public :
D1(int p1, int p2, int p3) : Base(p1, p2) { data3 = p3; }
int Inc1( ) { return Base::Inc1( ); }
int Inc3( ) { return ++data3; }
void Display( )
{
cout<<"data1 = "<< data1 << " data2 = " << data2 << " data3 = " << data3 <<endl;
cout<<"Base::Display() ----";
Base::Display( );
}
protected:
int data3;
};
class D2 : public Base {
public :
D2(int p1, int p2, int p4) : Base(p1, p2) { data4 = p4; }
int Inc1()
{
Base::Inc1( );
Base::Inc2( );
return Base::Inc1( );
}
int Inc4( ) { return ++data4; }
void Display( )
{
cout<<"data1 = "<< data1 << " data2 = " << data2 << " data4 = " << data4 <<endl;
cout<<"Base::Display() ----";
Base::Display( );
}
protected:
int data4;
};
class D12 : public D1, public D2 {
public :
D12(int p11,int p12,int p13,int p21,int p22,int p23,int p)
: D1(p11, p12, p13), D2(p21, p22, p23) { data5 = p; }
int Inc1( )
{ D1::Inc1(); D2::Inc1( );
return D1::Inc1( );
}
int Inc5( ) { return ++data5; }
void Display( )
{
cout<<"data1 = "<< data1 << " data2 = " << data2 <<endl; // ①
cout <<" data3 = " << data3 <<"data4 = "<< data4 << " data5 = " << data5 <<endl;
cout << "D1::Display( )----";
D1::Display( );
cout << "D2::Display( )----";
D2::Display( );
}
private:
int data5;
};
int main()
{
D12 d(1, 2, 3, 4, 5, 6, 7);
d.Display( );
cout << endl;
d.Inc1();
d.Inc2(); // ②
d.Inc3();
d.Inc4();
d.Inc5();
d.D12::Inc1();
d.Display();
return 0;
}
(1)这个程序在编译时会出现错误,请根据出错提示信息找出出错的原因。
(2)修改程序中的错误,使之能正确运行。
2.设有一个点类Point的定义如下:
Point {
public:
Point() {x = 0; y = 0; }
Point(double xv,double yv) {x = xv;y = yv;}
Point(Point& pt) { x = pt.x; y = pt.y; }
double getx() { return x; }
double gety() { return y; }
double Area() { return 0; }
void Show() { cout<<"x="<<x<<' '<<"y="<<y<<endl; }
private:
double x,y;
};
编写程序,以点point类为基类,派生出矩形类Rectangle和圆类Circle。矩形由左上角的顶点和长、宽定义。圆由圆心和半径定义。派生类中新增的成员函数position(Point &pt)用于判断任一坐标点是在图形内、还是在图形的边缘上,还是在图形外。
运行结果
三、多态性实现
问题描述
1.设有几何图形的派生关系如下图所示。
对平面图形可求周长和面积,对立体图形可以求体积以及底面图形的周长和底面积。
设有主函数如下:
int main()
{
Geometric_shape *gs[]= {
new Circle(10),
new Rectangle(6,8),
new Triangle(3,4,5),
new Box(6,8,3),
new Cylinder(10,3),
new Cone(10,3),
new T_pyramid(3,4,5,3),
new T_prism(3,4,5,3) };
for (int i=0;i<8;i++)
{
gs[i]->Show();
cout<<endl;
}
for (i=0;i<8;i++)
{
gs[i]->Show();
cout<<endl;
}
cout<<"平面图形:"<<endl;
for (i=0;i<3;i++)
{
cout<<"图形周长:"<<gs[i]->perimeter()<<'\t';
cout<<"图形面积:"<<gs[i]->area()<<'\t';
cout<<"图形体积:"<<gs[i]->volume()<<endl;
}
cout<<"立体图形:"<<endl;
for (i=3;i<8;i++)
{
cout<<"图形底周长:"<<gs[i]->perimeter()<<'\t';
cout<<"图形底面积:"<<gs[i]->area()<<'\t';
cout<<"图形体积 :"<<gs[i]->volume()<<endl;
}
return 0;
}
请编写各类的定义和实现代码,使给定的主函数main可以正确运行。
2.为复数重载+、-运算符,编程实现(6+7i)+7和(6+7i)-7,7+(6+7i)和7-(6+7i)的运算。
运行结果
四、模板及I/O管理
问题描述
1.栈是一种重要的数据结构,它是一种只允许在表的一端进行插入或删除操作 的线性表。表中允许进行插入、删除操作的一端称为栈顶。表的另一端称为栈底。 栈顶的当前位置是动态的,对栈顶当前位置的标记称为栈顶指针。当栈中没有数 据元素时,称之为空栈。栈的插入操作通常称为进栈或入栈,栈的删除操作通常 称为退栈或出栈。
下面是一个整型栈类的定义:
const int MaxSize = 100; // 栈中能保存的最多元素个数
class IStack { public: IStack(); // 栈的构造函数
void Push(int &n); // 往栈顶增加元素
void Pop(); // 从非空栈的栈顶删除一个元素
int GetTop(); // 返回非空栈的栈顶元素
bool Empty(); // 判断栈是否为空
int Size(); // 返回栈中元素的个数
void ClearStack(); // 将栈清空
~IStack(); // 栈的析构函数
private: int elem[MaxSize]; // 保存栈中各元素的数组
int Top; // 保存栈顶的当前位置 }
试编写栈的类模板(包括其成员函数的实现),以便为任何类型的对象提供栈结构的数据操作。然后在 main()中实现整数栈和字符栈的各种操作。
2.编写程序,重载运算符“<>”,使用户能直接输入和输出固定电话的 号码。电话号码以如下形式输入和输出: (027)xxxxxxxx
3.编写一个程序,实现以下功能:
(1)输入一系列的学生成绩(包括学号、姓名、成绩等数据)存放在文件 stud.dat 中。
(2)从 stud.dat 文件中读出这些数据并显示出来。
(3)在 stud.dat 文件中按姓名进行查询,如输入“李”,则将所有姓李的学生的数据都显示出来。
所编写的程序运行结果示例如下:
选择(1:输入数据 2:输出数据 3:按姓名查找数据 其他退出):1
输入数据 学生人数:5
第 1 个学生(学号 姓名 成绩):1001 张三 89
第 2 个学生(学号 姓名 成绩):1002 李四 78
第 3 个学生(学号 姓名 成绩):1003 王五 92
第 4 个学生(学号 姓名 成绩):1004 李沅芷 88
第 5 个学生(学号 姓名 成绩):1005 赵六 56
选择(1:输入数据 2:输出数据 3:按姓名查找数据 其他退出):2
输出数据
学号 姓名 成绩
1001 张三 89
1002 李四 78
1003 王五 92
1004 李沅芷 88
1005 赵六 56
选择(1:输入数据 2:输出数据 3:按姓名查找数据 其他退出):3
输入姓名:李 输出匹配的结果:
学号 姓名 成绩
1002 李四 78
1004 李沅芷 88
选择(1:输入数据 2:输出数据 3:按姓名查找数据 其他退出):3
输入姓名:李四
输出匹配的结果:
学号 姓名 成绩
1002 李四 78
选择(1:输入数据 2:输出数据 3:按姓名查找数据 其他退出):0
运行结果
总结
疫情在家上的这个课,怎么说呢。
详情可参考以下链接
链接:冲冲冲~
提取码:5zne
复制这段内容后打开百度网盘手机App,操作更方便哦
标签:ix,return,int,double,void,面向对象,武汉理工大学,IntArray,课内 来源: https://blog.csdn.net/mo_zhe/article/details/112803056