C++上机实验

更新时间:2024-06-25 07:48:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验项目名称:多态性实现 实验项目编号:实验3 学号: 组号:

上机实践日期:2017/6/4 上机实践时间:14:00

一、目的

(1) 掌握多态的概念。

(2) 理解静态多态性和动态动态性的含义。 (3) 掌握使用虚函数和继承实现动态多态性的方法。 (4) 掌握运算符重载的方法。 二、实验内容与设计思想

1.设有几何图形的派生关系如下图所示。

几何图形 geometric_shape)矩形 rectangle 圆 circle 三角形(triangle)长方体 box)圆柱 cylinder)圆锥 cone)三棱锥(t_pyramid)三棱柱(t_prism) 平面图形可求周长和面积,对立体图形可以求体积以及底面图形的周长和底面积。

设有主函数如下:

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<

{ gs[i]->Show(); cout<

}

cout<<\平面图形:\

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

{

cout<<\图形周长:\

cout<<\图形面积:\ cout<<\图形体积:\ }

cout<<\立体图形:\

for (i=3;i<8;i++)

{

cout<<\图形底周长:\

cout<<\图形底面积:\ cout<<\图形体积 :\ } }

return 0;

请编写各类的定义和实现代码,使给定的主函数main可以正确运行。 实验代码: #include #include using namespace std; const double pi = 3.14;

class Geometric_shape//几何图形 {

public: virtual void show() {}; virtual double perimeter() { return 0; };//周长 virtual double area(){ return 0; };//面积 virtual double volume(){ return 0; };//体积 };

class Circle:public Geometric_shape //圆 {

public: Circle(int r) :radius(r) {}; virtual void show() { cout << \圆的半径为:\ << radius << endl; } virtual double perimeter() { return 2 * pi*radius; } virtual double area() { return pi*radius*radius; } virtual double volume() { return 0; } protected: int radius; };

class Rectangle :public Geometric_shape //矩形 {

public: Rectangle(int lenth, int width) :Lenth(lenth), Width(width) {} virtual void show() { cout << \矩形长宽分别为:\ << Lenth << \ << Width << endl; } virtual double perimeter() { return 2 * (Lenth + Width); } virtual double area() { return Lenth*Width; } virtual double volume() { return 0; } protected: int Lenth; int Width; };

class Triangle :public Geometric_shape //三角形 { public: Triangle(int a, int b, int c) :A(a), B(b), C(c) {}; void show() { cout << \三角形三边分别为:\ << A << \ << B << \ << C << endl; } virtual double perimeter() { return A + B + C; } virtual double area() { double p=(A+B+C)/2; return sqrt(p*(p - A)*(p - B)*(p - C)); } virtual double volume() { return 0; } protected: int A, B, C; };

class Box : public Rectangle //长方形 {

public: Box(int a,int b, int c):Rectangle(a,b), Height(c){} void show() { cout << \长方体的长宽高分别为:\ << Lenth << \ << Width << \<< Height<

class Cylinder :public Circle //圆柱 {

public: Cylinder(int a, int b) :Circle(a), Height1(b) {} void show() { cout << \圆柱底面半径和高度分别为:\ << radius << \ << Height1 << endl; } double volume() { return area()*Height1; } private: int Height1; };

class Cone :public Circle //圆锥 {

public: Cone(int a, int b) :Circle(a), Height2(b) {} void show() { cout << \圆锥底面半径和高度分别为:\ << radius << \ << Height2 << endl; } double volume() { return area()*Height2/3; } private: int Height2; };

class T_pyramid :public Triangle //三棱锥 {

public: T_pyramid(int a, int b, int c, int d) :Triangle(a, b, c), Height3(d) {} void show() { cout << \三棱锥底边三角形三边和高度分别为:\ << A << \ << B << \ << C << \\ << Height3 << endl; } double volume() { return area()*Height3 / 3; } private: int Height3; };

class T_prism :public Triangle //三棱柱 {

public: T_prism(int a, int b, int c, int d) :Triangle(a, b, c), Height4(d) {} void show() { cout<<\三棱柱底边三角形三边和高度分别为:\ << A << \ << B << \ << C << \ << Height4 << endl; } double volume() { return area()*Height4; }

private: int Height4; };

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) }; int i; 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;

}

2. 为复数重载+、-运算符,编程实现(6+7i)+(7+8i)和(6+7i)-(7+8i)的运算。

实验代码:

#include using namespace std; class Complex {

public: Complex(double r = 0.0, double i = 0.0):real(r),imag(i) {} Complex operator+ (Complex &c2);// 运算符“+”重载为成员函数 Complex operator- (Complex &c2);// 运算符“-”重载为成员函数 //friend Complex operator+ (Complex &c1, Complex &c2);// 运算符“+”重载为友元函数 //friend Complex operator- (Complex &c1, Complex &c2);// 运算符“-”重载为友元函数 void display(); // 复数输出 private: double real; double imag; };

Complex Complex::operator+(Complex &c2) { Complex c; c.real = real + c2.real; c.imag = imag + c2.imag; return c; }

Complex Complex::operator-(Complex &c2) { Complex c; c.real = real - c2.real; c.imag = imag - c2.imag; return c; }

void Complex::display() { cout << real; if (imag >= 0) cout << \; cout << imag << \ << endl; }

/* 友元函数定义

Complex operator+ (Complex &c1, Complex &c2) { Complex c; c.real = c1.real + c2.real; c.imag = c1.imag + c2.imag; return c; }

Complex operator- (Complex &c1, Complex &c2) { Complex c; c.real = c1.real - c2.real; c.imag = c1.imag - c2.imag; return c; } */

int main() { Complex c1(6, 7), c2(7, 8); cout << \; c1.display();

}

cout << \; c2.display();

cout << \; (c1 + c2).display(); cout << \; (c1 - c2).display(); return 0;

三、实验使用环境

Windows 10 vs2017 四、实验小结

1)题(1)用虚函数来实现主程序中的动态联编。即在Geometric_shape类中分别将计算面积、周长、体积等函数声明为虚函数后,再在该类的派生类中定义与其基类虚函数原型相同的函数。当用基类指针指向这些派生类的对象时,系统会自动用派生类中的同名函数来代替基类中的虚函数,从而实现运行时的多态。学习使用虚函数实现动态多态性。而虚函数就是在基类中被关键字virtual说明,并在派生类中重新定义的函数,且在派生类中重工业新定义时,函数原型,包括返回类型、函数名、参数个数与参数类型的顺序,都必须与基类中的完全相同。此外,构造函数不能是虚函数,但析构函数可以是虚函数。

2)题(2)用成员函数和友元函数两种方式实现。友元函数函数实现时,在类体内声明为该类的友元函数,然后再重载运算符

}

cout << \; c2.display();

cout << \; (c1 + c2).display(); cout << \; (c1 - c2).display(); return 0;

三、实验使用环境

Windows 10 vs2017 四、实验小结

1)题(1)用虚函数来实现主程序中的动态联编。即在Geometric_shape类中分别将计算面积、周长、体积等函数声明为虚函数后,再在该类的派生类中定义与其基类虚函数原型相同的函数。当用基类指针指向这些派生类的对象时,系统会自动用派生类中的同名函数来代替基类中的虚函数,从而实现运行时的多态。学习使用虚函数实现动态多态性。而虚函数就是在基类中被关键字virtual说明,并在派生类中重新定义的函数,且在派生类中重工业新定义时,函数原型,包括返回类型、函数名、参数个数与参数类型的顺序,都必须与基类中的完全相同。此外,构造函数不能是虚函数,但析构函数可以是虚函数。

2)题(2)用成员函数和友元函数两种方式实现。友元函数函数实现时,在类体内声明为该类的友元函数,然后再重载运算符

本文来源:https://www.bwwdw.com/article/9ax3.html

Top