C++编程训练6


图形管理系统,根据图形类派生出多种图形,计算每种图形的周长和面积。

![2UR4(PXS1YTL9YT$A50%{J](F:\study\转专业\C++暑期补课\作业\shape\2UR4(PXS1YTL9YT$A50%{J.png)

头文件stdfax.h

#ifndef STDFAX__H__INCLUDED
#define STDFAX__H__INCLUDED
#pragma once
#include <iostream>
#include <cmath>

using namespace std;

#endif // !STDFAX__H__INCLUDED

头文件figure.h

#ifndef FIGURE__H__INCLUDE
#define FIGURE__H__INCLUDE
#pragma once
#include "stdfax.h"
#define pai 3.14159

//平面图形类
class shape
{
    //分别定义周长和面积的虚函数
    virtual double calZc() = 0;
    virtual double calArea() = 0;
};

//矩形类
class rectangle :public shape
{
public:
    double length, width;
    //获取矩形的长度与宽度
    void getData()
    {
        cout << "请分别输入矩形的长度和宽度:";
        cin >> length >> width;
    }
    //求矩形的周长
    double calZc()
    {
        double Zc;
        Zc = 2 * (length + width);
        return Zc;
    }
    //求矩形的面积
    double calArea()
    {
        double Area;
        Area = length * width;
        return Area;
    }
};

//圆形类
class circle :public shape
{
public:
    double r;
    //获取圆的半径
    void getData()
    {
        cout << "请输入圆的半径:";
        cin >> r;
    }
    //求圆的周长
    double calZc()
    {
        double Zc;
        Zc= 2 * pai * r;
        return Zc;
    }
    //求圆的面积
    double calArea()
    {
        double Area;
        Area = pai * r * r;
        return Area;
    }
};

//椭圆类
class oval :public shape
{
public:
    double a, b;
    //获取椭圆的长半轴与短半轴
    void getData()
    {
        cout << "请分别输入椭圆的长半轴长与短半轴长:";
        cin >> a >> b;
    }
    //求椭圆的周长
    double calZc()
    {
        double Zc;
        Zc = 2 * pai * b + 4 * (a - b);
        return Zc;
    }
    //求椭圆的面积
    double calArea()
    {
        double Area;
        Area = pai * a * b;
        return Area;
    }
};

//三角形类
class triangle :public shape
{
public:
    double a, b, c;
    void getData()
    {
        cout << "请分别输入三角形三条边的长: ";
        cin >> a >> b >> c;
    }
    //求三角形的周长
    double calZc()
    {
        double Zc;
        Zc = a + b + c;
        return Zc;
    }
    //求三角形的面积
    double calArea()
    {
        double Area, p;
        p = (a + b + c) / 2;
        Area = 1 / 4 * sqrt(p * (p - a) * (p - b) * (p - c));
        return Area;
    }
};

//正五边形类
class pentagon :public shape
{
public:
    double a;
    void getData()
    {
        cout << "请输入正五边形的边长: ";
        cin >> a;
    }
    //求正五边形的周长
    double calZc()
    {
        double Zc;
        Zc = 5 * a;
        return Zc;
    }
    //求正五边形的面积
    double calArea()
    {
        double Area;
        Area = 1.72048 * a * a;
        return Area;
    }
};

int N=100000;
string* ptr = new string[N];
double* ptrZc = new double[N];
double* ptrArea = new double[N];

//创建任意多个对象
void inputData()
{
    cout << "请输入图形的个数:";
    cin >> N;
    for (int i = 0;i < N;++i)
    {
        cout << "请输入这一个图形的名称(在rectangl,circle"<<
            ",oval,triangle和pentagon中选择): ";
        cin >> ptr[i];
    }
}

//算出每个对象的周长和面积以及所有图形的面积(周长)的和
void sum()
{
    double sumSz=0, sumArea=0;
    for (int i = 0; i < N; ++i)
    {
        if (ptr[i] == "rectangle")
        {
            rectangle obj;
            obj.getData();
            sumSz += obj.calZc();
            sumArea += obj.calArea();
            ptrZc[i] = obj.calZc();
            ptrArea[i] = obj.calArea();
            cout << "第" << i + 1 << "个图形的周长为" << obj.calZc() << endl;
            cout << "第" << i + 1 << "个图形的面积为" << obj.calArea() << endl;
            break;
        }
        if (ptr[i] == "circle")
        {
            circle obj;
            obj.getData();
            sumSz += obj.calZc();
            sumArea += obj.calArea();
            ptrZc[i] = obj.calZc();
            ptrArea[i] = obj.calArea();
            cout << "第" << i + 1 << "个图形的周长为" << obj.calZc() << endl;
            cout << "第" << i + 1 << "个图形的面积为" << obj.calArea() << endl;
        }
        if (ptr[i] == "oval")
        {
            oval obj;
            obj.getData();
            sumSz += obj.calZc();
            sumArea += obj.calArea();
            ptrZc[i] = obj.calZc();
            ptrArea[i] = obj.calArea();
            cout << "第" << i + 1 << "个图形的周长为" << obj.calZc() << endl;
            cout << "第" << i + 1 << "个图形的面积为" << obj.calArea() << endl;
        }
        if (ptr[i] == "triangle")
        {
            triangle obj;
            obj.getData();
            sumSz += obj.calZc();
            sumArea += obj.calArea();
            ptrZc[i] = obj.calZc();
            ptrArea[i] = obj.calArea();
            cout << "第" << i + 1 << "个图形的周长为" << obj.calZc() << endl;
            cout << "第" << i + 1 << "个图形的面积为" << obj.calArea() << endl;
        }
        if (ptr[i] == "pentagon")
        {
            pentagon obj;
            obj.getData();
            sumSz += obj.calZc();
            sumArea += obj.calArea();
            ptrZc[i] = obj.calZc();
            ptrArea[i] = obj.calArea();
            cout << "第" << i + 1 << "个图形的周长为" << obj.calZc() << endl;
            cout << "第" << i + 1 << "个图形的面积为" << obj.calArea() << endl;
        }
    }
    cout << "这" << N << "个图形的周长之和为:" << sumSz << endl;
    cout << "这" << N << "个图形的面积之和为:" << sumArea << endl;
}


//指出第n个图形算出周长和面积
void oneResult()
{
    int n;
    cout << "请问你想要第几个图形的周长和面积:" << endl;
    cin >> n;
    cout << "第" << n << "个图形的周长为" << ptrZc[n-1] << endl;
    cout << "第" << n << "个图形的面积为" << ptrArea[n-1] << endl;
}
//每当用户输入不同的图形时就执行不同的处理

void output()
{
    int n;
    cout << "请输入图形的总个数N:" << endl;
    for (int i = 0;i < n;++i)
    {
        int name;
        double sumZc = 0, sumArea = 0;
        cout << "1(矩形),2(圆形),3(椭圆),4(三角), 5(正五边形)" << endl;
        cout << "请输入第" << i + 1 << "个图形的名称:" << endl;
        cin >> name;
        switch (name)
        {
        case 5:
            pentagon obj;
            obj.getData();
            cout << "周长=" << obj.calZc() << "    面积=" << obj.calArea();
            sumZc += obj.calZc();
            sumArea += obj.calArea();
            break;
        case 4:
            triangle obj;
            obj.getData();
            cout << "周长=" << obj.calZc() << "    面积=" << obj.calArea();
            sumZc += obj.calZc();
            sumArea += obj.calArea();
            break;
        case 3:
            oval obj;
            obj.getData();
            cout << "周长=" << obj.calZc() << "    面积=" << obj.calArea();
            sumZc += obj.calZc();
            sumArea += obj.calArea();
            break;
        case 2:
            circle obj;
            obj.getData();
            cout << "周长=" << obj.calZc() << "    面积=" << obj.calArea();
            sumZc += obj.calZc();
            sumArea += obj.calArea();
            break;
        default:
            rectangle obj;
            obj.getData();
            cout << "周长=" << obj.calZc() << "    面积=" << obj.calArea();
            sumZc += obj.calZc();
            sumArea += obj.calArea();
            break;
        }
        cout << "这" << n << "个图形的周长之和为" << sumZc << endl;
        cout << "这" << n << "个图形的面积之和为" << sumArea << endl;
    }
}
#endif // !FIGURE__H__INCLUDE

源文件main.cpp

#include "stdfax.h"
#include "figure.h"

int main(){
    //获取用户输入
    inputData();
    //N个对象的总面积和总周长
    sum();
    //指定图形的面积和周长
    oneResult();
    return 0;
}

文章作者: 陈细利
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 陈细利 !
评论
 上一篇
C++编程训练7 C++编程训练7
学生信息管理 定义学生类,包含学号 姓名 年龄 绩点这些成员 要求: 通过键盘输入学生信息,保存到文件中(文本文件、二进制文件全都要) 能够读取要求 1 中的文件,在屏幕上显示学生信息; 根据学生的绩点、年龄、学号进行排序,排序完成后,
下一篇 
C++编程训练5 C++编程训练5
编写一个动态数组类, 要求如下: 1) 编写构造函数、拷贝构造函数、析构函数; 2) 获取任意一个位置的元素; 3) 能够实现数组动态扩容; 4) 删除任意指定位置的元素。 头文件stdafx.h #ifndef STDAFX__H__IN
  目录