编程语言
首页 > 编程语言> > 武汉理工大学 面向对象程序设计课内实验

武汉理工大学 面向对象程序设计课内实验

作者:互联网

文章目录


主要仪器设备及耗材

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