• 课程设计(物体类),图片可能没有加载出来,自己运行一下就行了


    一.课程设计题目与要求(包括题目与系统功能要求)

     

    A.<1>设计如下类,其功能和部分成员如下:

    Object:抽象类,所有的物体都有价值(profit)属性;

    Point:点的位置;

    Line(线段),Rectangle,Cuboid, Square,Cube,Circle,Cylinder.

     

    <2>功能:能够实现上述物体的移动(move),放大(zoomin),缩小(zoomout),大小比较(compare),打印物品信息(cout<<编号、面积、容积和价值)等操作,且所有物品的对象实现自动编号。

     

    <3>提示如下:

    1.移动: Line类对象移动其中点;

    Rectangle、Square和Circle:移动重心;

    Cubiod、Cube和Cylinder: 移动底面重心。

    2.放大和缩小:以倍数为参数,进行相应组件的放大和缩小。

    3.默认比较方式:

    Line:比较长度;

    Rectangle、Square和Circle:比较面积;

    Cubiod、Cube和Cylinder: 比较体积。

     

    注:同维度(或不同维度)空间内的不同类物体之间可进行大小比较。相等返回0,小于返回-1、大于返回1。

     

    B.再设计一个容器类(Container),容器具有最大容量属性。

     

    <1>功能:能容纳以上定义的各种物品(当然指的是Cylinder,Cube和Cuboid),实现添加一个物品(addItem),移除容器里的一个物品(removeItem),重载[]. 

     

    <2>附加功能:

    1.不改变物品在容器中的位置,把物品的id按照排序结果(根据物品某一关键字)返回 ;

    2.给定一定数量的物品(假设物品的总容量超过容器最大容量),挑选部分装入容器中,设计算法实现所装物品的总价值最大。

     

    二.需求分析 

     

    1.问题描述:

    ①——本次c++实践主要的目的是为了熟悉继承和派生,从设计的要求可知,要有一个最底层的抽象基类即Object类,然后就是多个类之间的关系,Point继承Object——然后Line继承Point,添加length新成员;Circle继承Point,添加新成员R;Square继承Point,添加L1新成员;Rectangle继承Point,添加L1,L2新成员;最后Cylinder继承Circle,添加height新成员;Cube继承Square,添加high新成员;Cuboid继承Rectangle,添加high新成员。这样就完成了继承与派生类的设计。

     

    ②——除了这些类,还必须有操作,否则就没有意义了,要实现上述物体的move,zoomin,zoomout,compare,打印物品信息(cout<<编号、面积、容积和价值)等操作,这里要用到运行时的多态,即需要基类的指针,将在下一条详细讲,这里要做的是函数成员的设计,这要求在每个类(包括基类)要有同名函数,即(overriding a virtual function),返回值类型,参数类型等都得一样,而且基类的要是virtual function。

     

    ③——再设计一个容器类(Container),所有物品的对象实现自动编号。这里的容器要用vector来做,我们在Container类中定义vector<Point *> Po数据成员(既可实现自动编号又可实现运行时的多态)。至于其它操作的设计与②相似,也可在Container类中实现。

     

    2.系统环境、运行要求:Visual Studio 2012/2013 等c++编译器。

     

    三.概要设计(包括系统流程设计、系统模块设计)

     

    系统主流程:

     

     

     

     

     

     

     

     

     

     

     

     

     

    系统分流程:

    1.添加物品:

     

     

     

     

     

     

     

     

     

     

    2.移动物品:

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    3.放大或缩小物品:

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    4.删除信息:

     

     

     

     

     

     

     

     

     

     

     

     

    5.比较大小:

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    6.打印信息:

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    继承与派生的关系:

     

     

     

     

     

     

     

     

     

     

     

     

    四.详细设计(包括类的函数成员和数据成员设计、界面设计(见问题提示)、及其它模块设计与实现)

        

    1.先来看继承与派生类的数据成员和函数成员的设计,首先是继承与派生的关系和添加新数据成员:

    //base class

    class Object{

    protected:

    double Profit;//价值属性,是每个物体都有的

    public:

    Object() :Profit(0){}

    Object(double a) :Profit(a){}

    virtual ~Object(){}//析构函数最好都用virtual

    virtual void print() = 0;//pure virtual function,you can not define an object

    };

    class Point :public Object{

    protected:

    double x, y, z;// 3D,作为Point继承了Object,坐标为新成员

    ......};

    class Line :virtual public Point{

    protected:

    double length;//Line继承Point,添加长度为新成员,派生类一定要有自己的新成员

    ......};

    class Circle :virtual public Point{

    protected:

    double R;//作为Circle继承了Object,添加半径为新成员

    ......};

    class Cylinder :public Circle{

    private:

    double height;//作为Cylinder继承了Circle,添加高度height为新成员

    ......};

    class Square :public Point{

    protected:

    double R;//Square继承Point,添加1条边R作为新成员

    ......};

    class Cube :public Square{

    protected:

    double High;//Cube继承Square,添加高High作为新成员

    ......};

    class Rectangle :public Point{

    protected:

    double R1, R2;//Rectangle继承Point,添加2条边R1,R2作为新成员

    ......};

    class Cuboid :public Rectangle{

    protected:

    double High;//Cuboid继承Rectangle,添加高High作为新成员

    ......};

     

    其次是函数成员的设计:这里以Point的为例:

    class Point :public Object{

    protected:

    double x, y, z;// 3D,作为Point继承了Object,坐标为新成员

    public:

    Point():Object(){

    x = y = z = 0;

    }//派生类的构造函数,注意基类成员的赋值问题

    Point(Point & c):Object(c){

    x = c.x;

    y = c.y;

    z = c.z;

    }//显示的复制构造函数

    Point(double a, double b, double c, double d);//重载的构造函数

    void getPoint();//得到点的坐标

    virtual double getlength(){ return 0; }//返回长度,没有为0,有就返回

    virtual double getarea(){ return 0; }//返回面积,没有为0,有就返回

    virtual double getvolume(){ return 0; }//返回体积,没有为0,有就返回

    virtual void movexyz();//移动坐标

    virtual void zoom();//放大或缩小

    virtual void print();//打印物品信息

    virtual ~Point(){}//类自己的析构函数

    };

    注意到这里的所有用于操作的成员函数都是virtual,因为这是用于派生的类,而我们要实现运行时的多态,故在所有派生类中都有同名函数,即(overriding a virtual function),返回值类型,参数类型等都得一样,当基类对象指针指向派生类对象时,实现运行时的多态完成要做的事。

     

    2.再来看容器类的设计:

    //operate class

    class Container{

    private:

    vector<Point*> Po;//指向基类指针类型的容器

    public:

    void Addobject();//添加物品

    void Moveposition();//移动物体的位置

    void Zoominorout();//放大或缩小物体

    void Compare();//比较物体的大小

    void Print();//打印物体的信息

    void Deleteobject();//删除容器里的具有体积的物品

    Point* & operator[](int i);//重载[]

    };

     

    部分成员函数如下:

    //删除函数:

     

    double a;//a是体积

    cin >> a;

    for (vector<Point*>::iterator iter = Po.begin(); iter != Po.end();) {

    if ((*iter)->getvolume() == a) {

    iter = Po.erase(iter);//使用了迭代器vector<Point*>::iterator iter

    }

    else {

    iter++;

    }

     

    //移动函数:

     

    void Container::Moveposition(){

    int a = 1;

    while (a){

    int b;

    cout << "请输入需要移动的序号:" << endl;

    cin >> b;

    Po[b]->print();

    Po[b]->movexyz();

    Po[b]->print();

    cout << "是否要继续?继续请按1,否请按0:" << endl;

    cin >> a;

    }

    }

     

    //打印函数:

     

    for (int i = 0; i<(int)Po.size(); i++){

    cout << i << " ";

    Po[i]->print();//用一个for循环即可打印全部的内容

    }

     

    //添加操作的部分代码:

    case 8:{

       cout << "请输入长方体的数据(单价,坐标,长,宽,高):" << endl;

       cin >> p >> x >> y >> z >> l >> l1 >> l2;

       Cuboid cub1(p, x, y, z, l, l1, l2);

       Point s(p, x, y, z), *S;

       S = &cub1;

       if (Vc + S->getvolume() <= 50){

       pi[b] = &s;

       Po.push_back(pi[b]);

       cub[b] = cub1;

           Po[i] = &cub[b];

           i++;

           b++;

     }

       else cout << "容器已满" << endl;

    }break;

     

    3.界面设计:

     

    void showmenu(){

    cout << "\t" << "\t" << "\t" << "0.退出此管理系统" << endl;

    cout << "\t" << "\t" << "\t" << "1.添加物体的信息" << endl;

    cout << "\t" << "\t" << "\t" << "2.移动物体的位置" << endl;

    cout << "\t" << "\t" << "\t" << "3.放大或缩小物体" << endl;

    cout << "\t" << "\t" << "\t" << "4.比较物体的大小" << endl;

    cout << "\t" << "\t" << "\t" << "5.打印物体的信息" << endl;

    cout << "\t" << "\t" << "\t" << "6.删除物体的信息" << endl;

    }

    Container ope;//定义类对象

    switch (x){

    case 0:quit = true; cout << "已退出!" << endl; break;

    case 1:ope.Addobject(); break;

    case 2:ope.Moveposition(); break;

    case 3:ope.Zoominorout(); break;

    case 4:ope.Compare(); break;

    case 5:ope.Print(); break;

    case 6:ope.Deleteobject(); break;

    }

     

    主函数显示功能菜单,供用户选择操作。每步操作之前,都要显示菜单,在主函数中调用类的方法,在主函数中定义类对象。

    首先:定义显示菜单(不是类的成员函数):void showmenu()//显示菜单

    其次:在while中调用showmenu()实现每步操作之前,都要显示菜单,这样就形成了主界面!!!

     

    五.测试(包括对各功能模块的测试)

     

    1.主界面设计:进入管理系统,按任意键继续,接下来是功能的选项,共7个,选择进行测试:

     

     

    2.键入1:添加物品信息,添加点(无体积,不占容器体积,只是有一个编号):

     

    3.键入2,添加一条线段(无体积,不占容器体积,只是有一个编号):

     

     

    4.继续添加circle,square,cuboid等,后面用这些添加的元素进行测试:

     

     

    (注意它们的单价,点为0,线为1,面为2,体积的为3):

     

     

    5.容器具有最大容量属性:

     

    6.键入2,测试移动物体位置的功能,只需重新输入中心坐标:

     

     

    7.键入3,测试放大或缩小物体的功能,以倍数为参数,进行相应组件的放大和缩小,如果是个点的话,会有相应的安全性判断,即"sorry,it's a point,you can't zoomin or zoomout it!":

     

     

    8.键入4,测试比较的功能,同维度(或不同维度)空间内的不同类物体之间可进行大小比较,若是同维度的,则比较相应的体积(或面积或长度):

     

     

    9.如若不是同维度的,则比较顺序为体积->面积->长度:

     

     

    10.键入5,测试print功能,可以选择<1>print all:

     

     

    11.<2>print single:

     

     

    12.键入6,测试删除物体信息的功能,由于考虑到container类最大容量的功能及容纳以上定义的各种物品(当然指的是Cylinder,Cube和Cuboid),实现添加一个物品(addItem),移除容器里的一个物品(removeItem)等,这里是按照物品的体积来删除,如下:

     

     

     

    13.删除后打印界面,3,4被删除,剩下0,1,2号:

     

     

    14.键入0,退出管理系统:

     

     

    六.结论(对系统开发的总结,设计的亮点,存在的不足,需要改进的地方)

     

    本学期较上学期来说做了更多的课程设计,有了更多的实践经验,对于此次的设计,我感觉知识的综合能力较强,毕竟c++已经学习了一个学期,对于类的设计也不能仅仅局限于一个或俩个,要学会从分散到集中,从少到多。本次上机的主要目的是熟悉继承与派生(inheritance and polymorphism),这是c++的核心内容,也是比较难掌握的,但总的来说,这次上机实践我的收获还是很大的,它找到了我的错误和不足之处。

    对于这个面向对象的程序设计,我个人认为这个程序的优点在于:1.在做的过程中使用了多文件的结构,这是我第一次比较完整和系统的在自己的探索下完成的多文件设计,便于编译和改错;2.类的设计,在程序中共有10个类,它们之间存在继承与派生的关系,每个类都有自己独立的数据成员和函数成员,声明和定义都是分开的,都是按照类的标准设计来做的,虽然不是很完善;3.还有就是实现了运行时的多态,在Container类中用了vector<Point*> Po,即指向基类的指针容器,这在程序中起到了至关重要的作用,也是我想了好久才想到的。

        在缺点方面,都有点不好意思说了:首先是在继承与派生时对概念弄得不是很清晰,逻辑上出现了一些错误,再加上理解题意出了问题,导致派生关系弄得不对或复杂了,比如Cylinder的派生,应用Circle再添一个height就行了,而我却弄成了Circle和Line,后来在老师你的提醒下课后才改正过来;还有就是关于继承类的构造函数没有写好,忽略了关键点,即基类成员和新增成员的使用和关系,不过也改正了过来;还有就是有功能没有实现,像给定一定数量的物品,假设物品的总容量超过容器最大容量,挑选部分装入容器中,设计算法实现所装物品的总价值最大。等等,总的来说,程序还存在很大的改进空间,我会在今后的学习中慢慢改进,让程序更完美。

    C++课本的教学知识已经教完了,但对于我来说还差得很远很远,光靠这一年的时间是远远不够的,需要更多的知识灌溉和实践,C++之路曼曼其修远兮,吾将上下而求索。要成为一名合格的程序员还有许多的路要走,我会一直坚持下去!谢谢老师一年来经常给予指导和教诲,收获颇多,并希望一直如此。

     

    七.附录(程序源代码)

     

    //头文件.h部分

    #ifndef Object_H

    #define Object_H

     

    #include<iostream>

    #include<vector>

     

    const double PI = 3.14;

     

    using namespace std;

     

    //base class

    class Object{

    protected:

    double Profit;

    public:

    Object() :Profit(0){}

    Object(double a) :Profit(a){}

    virtual ~Object(){}

    virtual void print() = 0;//pure virtual function,you can not define an object

    };

     

    #endif

    //******保存在Object.h

     

    #ifndef Point_H

    #define Point_H

     

    #include<iostream>

    #include<vector>

     

    #include"Object.h"

     

    using namespace std;

     

    class Point :public Object{

    protected:

    double x, y, z;// 3D

    public:

    Point():Object(){

    x = y = z = 0;

    }

    Point(Point & c):Object(c){

    x = c.x;

    y = c.y;

    z = c.z;

    }

    Point(double a, double b, double c, double d);

    void getPoint();

    virtual double getlength(){ return 0; }

    virtual double getarea(){ return 0; }

    virtual double getvolume(){ return 0; }

    virtual void movexyz();

    virtual void zoom();

    virtual void print();

    virtual ~Point(){}

    };

     

    #endif

    //******保存在Point.h

     

    #ifndef Line_H

    #define Line_H

     

    #include<iostream>

    #include<vector>

     

    #include"Point.h"

     

    using namespace std;

     

    class Line :virtual public Point{

    protected:

    double length;

    public:

    Line():Point(){

    length = 0;

    }

    Line(Line & c) :Point(c){

    length= c.length;

    }

    Line(double a, double b, double c, double d, double e);

    double getlength();

    double getvolume(){ return 0; }

    double getarea(){ return 0; }

    void movexyz();

    void zoom();

    void print();

    virtual ~Line(){}

    };

     

    #endif

    //******保存在Line.h

     

    #ifndef Circle_H

    #define Circle_H

     

    #include<iostream>

    #include<vector>

     

    #include"Point.h"

     

    using namespace std;

     

    class Circle :virtual public Point{

    protected:

    double R;

    public:

    Circle():Point(){

    R = 0;

    }

    Circle(Circle & c) :Point(c){

    R = c.R;

    }

    Circle(double a, double b, double c, double d, double e);

    double getarea();

    double getlength(){ return 0; }

    double getvolume(){ return 0; }

    void movexyz();

    void zoom();

    void print();

    virtual ~Circle(){}

    };

     

    #endif

    //******保存在Circle.h

     

    #ifndef Cylinder_H

    #define Cylinder_H

     

    #include<iostream>

    #include<vector>

     

    #include"Circle.h"

     

    using namespace std;

     

    class Cylinder :public Circle{

    private:

    double height;

    public:

    Cylinder():Circle(){

    height = 0;

    }

    Cylinder(Cylinder & c):Circle(c){

    height = c.height;

    }

    Cylinder(double a, double b, double c, double d, double e,double f);

    double getvolume();

    double getlength(){ return 0; }

    double getarea(){ return 0; }

    void movexyz();

    void zoom();

    void print();

    virtual~Cylinder(){}

    };

     

    #endif

    //******保存在Cylinder.h

     

    #ifndef Square_H

    #define Square_H

     

    #include<iostream>

    #include<vector>

     

    #include"Point.h"

     

    using namespace std;

     

    class Square :public Point{

    protected:

    double R;

    public:

    Square();

    Square(Square & c) :Point(c){

    R = c.R;

    }

    Square(double p, double x1, double x2, double x3, double r);

    double getarea();

    double getlength(){ return 0; }

    double getvolume(){ return 0; }

    void movexyz();

    void zoom();

    void print();

    virtual ~Square(){};

    };

     

    #endif

    //******保存在Square.h

     

    #ifndef Rectangle_H

    #define Rectangle_H

     

    #include<iostream>

    #include<vector>

     

    #include"Point.h"

     

    using namespace std;

     

    class Rectangle :public Point{

    protected:

    double R1, R2;

    public:

    Rectangle();

    Rectangle(Rectangle & c) :Point(c){

    R1 = c.R1;

    R2 = c.R2;

    }

    Rectangle(double p, double x1, double x2, double x3, double r1, double r2);

    double getarea();

    double getlength(){ return 0; }

    double getvolume(){ return 0; }

    void movexyz();

    void zoom();

    void print();

    virtual ~Rectangle(){};

    };

     

    #endif

    //******保存在Rectangle.h

     

    #ifndef Cube_H

    #define Cube_H

     

    #include<iostream>

    #include<vector>

     

    #include"Square.h"

     

    using namespace std;

     

    class Cube :public Square{

    protected:

    double High;

    public:

    Cube();

    Cube(double p, double x1, double x2, double x3, double r, double high);

    Cube(Cube & c) :Square(c){

    High = c.High;

    }

    double getarea(){ return 0; }

    double getlength(){ return 0; }

    double getvolume();

    void movexyz();

    void zoom();

    void print();

    virtual ~Cube(){};

    };

     

    #endif

    //******保存在Cube.h

     

    #ifndef Cuboid_H

    #define Cuboid_H

     

    #include<iostream>

    #include<vector>

     

    #include"Rectangle.h"

     

    using namespace std;

     

    class Cuboid :public Rectangle{

    protected:

    double High;

    public:

    Cuboid();

    Cuboid(Cuboid & c):Rectangle(c){

    High = c.High;

    }

    Cuboid(double p, double x1, double x2, double x3, double r1, double r2, double high);

    double getvolume();

    double getlength(){ return 0; }

    double getarea(){ return 0; }

    void movexyz();

    void zoom();

    void print();

    virtual ~Cuboid(){};

    };

     

    #endif

    //******保存在Cuboid.h

     

    #ifndef Container_H

    #define Container_H

     

    #include<iostream>

    #include<vector>

     

    #include"Line.h"

    #include"Cylinder.h"

    #include"Cube.h"

    #include"Cuboid.h"

     

    using namespace std;

     

    //operate class

    class Container{

    private:

    vector<Point*> Po;

    public:

    void Addobject();

    void Moveposition();

    void Zoominorout();

    void Compare();

    void Print();

    void Deleteobject();

    Point* & operator[](int i);

    };

     

    #endif

    //******保存在Container.h

    //.cpp部分

    #include"Point.h"

     

    Point::Point(double a, double b, double c, double d) :Object(a), x(b), y(c), z(d){

    }

    void Point::getPoint(){

    cout << "x坐标:" << x << " " << "y坐标:" << y << " " << "z坐标:" << z << endl;

    }

    void Point::movexyz(){

    double a, b, c;

    cout << "请重新输入坐标:" << endl;

    cin >> a >> b >> c;

    x = a;

    y = b;

    z = c;

    }

    void Point::zoom(){

    cout << "sorry,it's a point,you can't zoomin or zoomout it!" << endl;

    }

    void Point::print(){

    cout << "point:" << " " << "价值:" << Profit << " " << "坐标:" << "(" << x << "," << y << "," << z << ")" << endl;

    }

    //******保存在Point.cpp

     

    #include"Line.h"

     

    Line::Line(double a, double b, double c, double d, double e) :Point(a*e, b, c, d), length(e){

    };

    double Line::getlength(){

    return length;

    }

    void Line::movexyz(){

    double a, b, c;

    cout << "请重新输入中点坐标:" << endl;

    cin >> a >> b >> c;

    x = a;

    y = b;

    z = c;

    }

    void Line::zoom(){

    cout << "it's a line,please input the times  you want to zoominorout!" << endl;

    double a;

    cin >> a;

    length = a*length;

    }

    void Line::print(){

    cout << "line:" << " " << "价值:" << Profit << " " << "坐标:" << "(" << x << "," << y << "," << z << ")" << " " << "长度:" << length << endl;

    }

    //******保存在Line.cpp

     

    #include"Circle.h"

     

    Circle::Circle(double a, double b, double c, double d, double e) :Point(a*PI*e*e, b, c, d), R(e){

    };

    double Circle::getarea(){

    return(PI*R*R);

    }

    void Circle::movexyz(){

    double a, b, c;

    cout << "请重新输入圆心坐标:" << endl;

    cin >> a >> b >> c;

    x = a;

    y = b;

    z = c;

    }

    void Circle::zoom(){

    cout << "it's a circle,please input the times  you want to zoominorout!" << endl;

    double a;

    cin >> a;

    R = a*R;

    }

    void Circle::print(){

    cout << "circle:" << " " << "价值:" << Profit << " " << "坐标:" << "(" << x << "," << y << "," << z << ")" << " " << "面积:" << PI*R*R << endl;

    }

    //******保存在Circle.cpp

     

    #include"Cylinder.h"

     

    Cylinder::Cylinder(double a, double b, double c, double d, double e, double f) :Circle(a,b,c,d,e),height(f){

    Profit = 3 * getvolume();

    }

    double Cylinder::getvolume(){

    return(PI*R*R*height);

    }

    void Cylinder::movexyz(){

    double a, b, c;

    cout << "请重新输入底面圆心坐标:" << endl;

    cin >> a >> b >> c;

    x = a;

    y = b;

    z = c;

    }

    void Cylinder::zoom(){

    cout << "it's a cylinder,please input the times  you want to zoominorout!" << endl;

    double a, b;

    cin >> a >> b;

    height = a*height;

    R = b*R;

    }

    void Cylinder::print(){

    cout << "cylinder:" << " " << "价值:" << Profit << " " << "坐标:" << "(" << x << "," << y << "," << z << ")" << " " << "体积:" << getvolume() << endl;

    }

    //******保存在Cylinder.cpp

     

    #include"Square.h"

     

    Square::Square() :Point(){

    R = 0;

    }

    Square::Square(double p, double x1, double x2, double x3, double r) :Point(p*r*r, x1, x2, x3), R(r){

    }

    double Square::getarea(){

    return(R*R);

    }

    void Square::movexyz(){

    double a, b, c;

    cout << "请重新输入底面中心坐标:" << endl;

    cin >> a >> b >> c;

    x = a;

    y = b;

    z = c;

    }

    void Square::zoom(){

    cout << "it's a square,please input the times  you want to zoominorout!(side length)" << endl;

    double a;

    cin >> a;

    R = a*R;

    }

    void Square::print(){

    cout << "square:" << " " << "价值:" << Profit << " " << "坐标:" << "(" << x << "," << y << "," << z << ")" << " " << "面积:" << R*R << endl;

    }

    //******保存在Square.cpp

     

    #include"Rectangle.h"

     

    Rectangle::Rectangle() :Point(){

    R1 = R2 = 0;

    }

    Rectangle::Rectangle(double p, double x1, double x2, double x3, double r1, double r2) :Point(p*r1*r2, x1, x2, x3), R1(r1), R2(r2){

    }

    double Rectangle::getarea(){

    return(R1*R2);

    }

    void Rectangle::movexyz(){

    double a, b, c;

    cout << "请重新输入底面中心坐标:" << endl;

    cin >> a >> b >> c;

    x = a;

    y = b;

    z = c;

    }

    void Rectangle::zoom(){

    cout << "it's a Rectangle,please input the times  you want to zoominorout!(side length1,length2)" << endl;

    double a, b;

    cin >> a >> b;

    R1 = a*R1;

    R2 = b*R2;

    }

    void Rectangle::print(){

    cout << "rectangle:" << " " << "价值:" << Profit << " " << "坐标:" << "(" << x << "," << y << "," << z << ")" << " " << "面积:" << getarea() << endl;

    }

    //******保存在Rectangle.cpp

     

    #include"Cube.h"

     

    Cube::Cube():Square(){

    High = 0;

    }

    Cube::Cube(double p, double x1, double x2, double x3, double r, double high) :Square(p*high*high*high, x1, x2, x3, r), High(high){

    }

    double Cube::getvolume(){

    return(High*High*High);

    }

    void Cube::movexyz(){

    double a, b, c;

    cout << "请重新输入底面中心坐标:" << endl;

    cin >> a >> b >> c;

    x = a;

    y = b;

    z = c;

    }

    void Cube::zoom(){

    cout << "it's a Cube,please input the times  you want to zoominorout!(side length)" << endl;

    double a;

    cin >> a;

    R = a*R;

    High = a*High;

    }

    void Cube::print(){

    cout << "cube" << " " << "价值:" << Profit << " " << "坐标:" << "(" << x << "," << y << "," << z << ")" << " " << "体积:" << getvolume() << endl;

    }

    //******保存在Cube.cpp

     

    #include"Cuboid.h"

     

    Cuboid::Cuboid():Rectangle(){

    High = 0;

    }

    Cuboid::Cuboid(double p, double x1, double x2, double x3, double r1, double r2, double high) :Rectangle(p, x1, x2, x3, r1, r2), High(high){

    Profit = p*R1*R2*High;

    }

    double Cuboid::getvolume(){

    return(R1*R2*High);

    }

    void Cuboid::movexyz(){

    double a, b, c;

    cout << "请重新输入底面中心坐标:" << endl;

    cin >> a >> b >> c;

    x = a;

    y = b;

    z = c;

    }

    void Cuboid::zoom(){

    cout << "it's a Cuboid,please input the times  you want to zoominorout!(side length1,length2,High)" << endl;

    double a, b, c;

    cin >> a >> b >> c;

    R1 = a*R1;

    R2 = b*R2;

    High = c*High;

    }

    void Cuboid::print(){

    cout << "cuboid" << " " << " " << "价值:" << Profit << " " << "坐标:" << "(" << x << "," << y << "," << z << ")" << " " << "体积:" << getvolume() << endl;

    }

    //******保存在Cuboid.cpp

     

    #include"Container.h"

     

    Point *pi[20];

    Point po[20];

    Line li[20];

    Circle ci[20];

    Cylinder cy[20];

    Square sq[20];

    Rectangle re[20];

    Cuboid cub[20];

    Cube cu[20];

     

    const double V = 50;

    double Vc = 0;

     

    void Container::Addobject(){

    int a = 1, b = 0, i = 0;

    double p, x, y, z, l, l1, l2;

    while (a){

    for (int j = 0; j<(int)Po.size(); j++){

    Vc += Po[j]->getvolume();

    }

    if (Vc < 50){

    cout << "请选择要添加的物品,1-点,2-线,3-圆,4-圆柱,5-正方形,6-长方形,7-正方体,8-长方体:" << endl;

    int j;

    cin >> j;

    switch (j){

    case 1:{

       cout << "请输入点的数据(单价,坐标):" << endl;

       cin >> p >> x >> y >> z;

       Point po1(p, x, y, z);

       pi[b] = &po1;

       Po.push_back(pi[b]);

       po[b] = po1;

       Po[i] = &po[b];

       i++;

       b++;

    }break;

    case 2:{

       cout << "请输入线的数据(单价,中点坐标,长度):" << endl;

       cin >> p >> x >> y >> z >> l;

       Line li1(p, x, y, z, l);

       Point s(p, x, y, z);

       pi[b] = &s;

       Po.push_back(pi[b]);

       li[b] = li1;

       Po[i] = &li[b];

       i++;

       b++;

    }break;

    case 3:{

       cout << "请输入圆的数据(单价,圆心坐标,半径):" << endl;

       cin >> p >> x >> y >> z >> l;

       Circle ci1(p, x, y, z, l);

       Point s(p, x, y, z);

       pi[b] = &s;

       Po.push_back(pi[b]);

       ci[b] = ci1;

       Po[i] = &ci[b];

       i++;

       b++;

    }break;

    case 4:{

       cout << "请输入圆柱的数据(单价,底面圆心坐标,圆半径,高):" << endl;

       cin >> p >> x >> y >> z >> l >> l1;

       Cylinder cy1(p, x, y, z, l, l1);

       Point s(p, x, y, z),*S;

       S = &cy1;

       pi[b] = &s;

       if (Vc + S->getvolume() <= 50){

       Po.push_back(pi[b]);

       cy[b] = cy1;

       Po[i] = &cy[b];

       i++;

       b++;

       }

       else cout << "容器已满" << endl;

    }break;

    case 5:{

       cout << "请输入正方形的数据(单价,坐标,边):" << endl;

       cin >> p >> x >> y >> z >> l;

       Square sq1(p, x, y, z, l);

       Point s(p, x, y, z);

       pi[b] = &s;

       Po.push_back(pi[b]);

       sq[b] = sq1;

       Po[i] = &sq[b];

       i++;

       b++;

    }break;

    case 6:{

       cout << "请输入长方形的数据(单价,坐标,长,宽):" << endl;

       cin >> p >> x >> y >> z >> l >> l1;

       Rectangle re1(p, x, y, z, l, l1);

       Point s(p, x, y, z);

       pi[b] = &s;

       Po.push_back(pi[b]);

       re[b] = re1;

       Po[i] = &re[b];

       i++;

       b++;

    }break;

    case 7:{

       cout << "请输入正方体的数据(单价,坐标,底面边,高(与底面边相等)):" << endl;

       cin >> p >> x >> y >> z >> l >> l1;

       Cube cu1(p, x, y, z, l, l1);

       Point s(p, x, y, z), *S;

       S = &cu1;

       if (Vc + S->getvolume() <= 50){

       pi[b] = &s;

       Po.push_back(pi[b]);

       cu[b] = cu1;

       Po[i] = &cu[b];

       i++;

       b++;

       }

       else cout << "容器已满" << endl;

    }break;

    case 8:{

       cout << "请输入长方体的数据(单价,坐标,长,宽,高):" << endl;

       cin >> p >> x >> y >> z >> l >> l1 >> l2;

       Cuboid cub1(p, x, y, z, l, l1, l2);

       Point s(p, x, y, z), *S;

       S = &cub1;

       if (Vc + S->getvolume() <= 50){

       pi[b] = &s;

       Po.push_back(pi[b]);

       cub[b] = cub1;

       Po[i] = &cub[b];

       i++;

       b++;

       }

       else cout << "容器已满" << endl;

    }break;

    }

    cout << "是否要继续,继续请按1,否按0" << endl;

    cin >> a;

    }

    else { cout << "容器已满" << endl; break; }

    }

    }

     

    void Container::Moveposition(){

    int a = 1;

    while (a){

    int b;

    cout << "请输入需要移动的序号:" << endl;

    cin >> b;

    Po[b]->print();

    Po[b]->movexyz();

    Po[b]->print();

    cout << "是否要继续?继续请按1,否请按0:" << endl;

    cin >> a;

    }

    }

     

    void Container::Zoominorout(){

    int i = 1;

    while (i){

    cout << "请输入想要放大或缩小的物体序号:" << endl;

    int a;

    cin >> a;

    Po[a]->print();

    Po[a]->zoom();

    Po[a]->print();

    cout << "是否要继续?继续请按1,否请按0:" << endl;

    cin >> i;

    }

    }

     

    void Container::Compare(){

    cout << "请输入需要比较的2个物品的编号:" << endl;

    int a, b;

    cin >> a >> b;

    if (Po[a]->getvolume() != 0 && Po[b]->getvolume() != 0){

    if (Po[a]->getvolume()>Po[b]->getvolume())

    cout << a << "物体空间大小" << ">" << b << "物体空间大小" << endl;

    else if (Po[a]->getvolume() == Po[b]->getvolume())

    cout << a << "物体空间大小" << "=" << b << "物体空间大小" << endl;

    else cout << a << "物体空间大小" << "<" << b << "物体空间大小" << endl;

    }

    else if (Po[a]->getvolume() == 0 && Po[b]->getvolume() == 0){

    if (Po[a]->getarea() != 0 && Po[b]->getarea() != 0){

    if (Po[a]->getarea()>Po[b]->getarea())

    cout << a << "物体平面大小" << ">" << b << "物体平面大小" << endl;

    else if (Po[a]->getarea() == Po[b]->getarea())

    cout << a << "物体平面大小" << "=" << b << "物体平面大小" << endl;

    else cout << a << "物体平面大小" << "<" << b << "物体平面大小" << endl;

    }

    else if (Po[a]->getarea() == 0 && Po[b]->getarea() == 0){

    if (Po[a]->getlength()>Po[b]->getlength()) cout << a << "物体" << "长于" << b << "物体" << endl;

    else if (Po[a]->getlength() == Po[b]->getlength()) cout << a << "物体" << "等于" << b << "物体" << endl;

    else cout << a << "物体" << "小于" << b << "物体" << endl;

    }

    else{

    if (Po[b]->getarea() == 0) cout << a << "物体平面大小" << ">" << b << "物体大小" << endl;

    else cout << a << "物体大小" << "<" << b << "物体平面大小" << endl;

    }

    }

    else{

    if (Po[b]->getvolume() == 0) cout << a << "物体空间大小" << ">" << b << "物体空间大小" << endl;

    else cout << a << "物体空间大小" << "<" << b << "物体空间大小" << endl;

    }

    }

     

    void Container::Print(){

    cout << "print all or single,all-1,single-2" << endl;

    int a;

    cin >> a;

    if (a == 1){

    for (int i = 0; i<(int)Po.size(); i++){

    cout << i << " ";

    Po[i]->print();

    }

    }

    else if (a == 2){

    cout << "please input the number you want to print:" << endl;

    int b;

    cin >> b;

    cout << b << " ";

    Po[b]->print();

    }

    else cout << "input wrong" << endl;

    }

     

    void Container::Deleteobject(){

    int i = 1;

    while (i){

    cout << "the volume you want to delete" << endl;

    double a;

    cin >> a;

    for (vector<Point*>::iterator iter = Po.begin(); iter != Po.end();) {

    if ((*iter)->getvolume() == a) {

    iter = Po.erase(iter);

    }

    else {

    iter++;

    }

    }

    cout << "do you want to continue? 1-continue,0-end" << endl;

    cin >> i;

    }

    }

     

    Point* & Container::operator[](int i){

    if (i<0 || i >= (int)Po.size())

    cout << "下标出界" << endl;

    else return Po[i];

    }

    //******保存在Container.cpp

     

    #include<iostream>

    #include<vector>

    #include<algorithm>

     

    #include"Container.h"

     

    using namespace std;

     

    void showmenu(){

    cout << "\t" << "\t" << "\t" << "0.退出此管理系统" << endl;

    cout << "\t" << "\t" << "\t" << "1.添加物体的信息" << endl;

    cout << "\t" << "\t" << "\t" << "2.移动物体的位置" << endl;

    cout << "\t" << "\t" << "\t" << "3.放大或缩小物体" << endl;

    cout << "\t" << "\t" << "\t" << "4.比较物体的大小" << endl;

    cout << "\t" << "\t" << "\t" << "5.打印物体的信息" << endl;

    cout << "\t" << "\t" << "\t" << "6.删除物体的信息" << endl;

    }

     

    int main(){

    int x, i = 0;

    bool quit = false;

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

    cout << "\t" << "\t" << "\t" << "******************************" << endl;

    cout << "\t" << "\t" << "\t" << "【 欢迎进入物品信息管理系统】" << endl;

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

    cout << "\t" << "\t" << "\t" << "******************************" << endl;

    Container ope;

    system("pause");

    while (!quit){

    showmenu();

    cin >> x;

    switch (x){

    case 0:quit = true; cout << "已退出!" << endl; break;

    case 1:ope.Addobject(); break;

    case 2:ope.Moveposition(); break;

    case 3:ope.Zoominorout(); break;

    case 4:ope.Compare(); break;

    case 5:ope.Print(); break;

    case 6:ope.Deleteobject(); break;

    }

    }

    return 0;

    }

    //******保存在main.cpp

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    Codeforces Round #622 (Div. 2)
    Knapsack Cryptosystem 牛客团队赛
    HDU 2586(LCA欧拉序和st表)
    P3865 【模板】ST表
    P2023 [AHOI2009]维护序列 区间加乘模板
    P1558 色板游戏 线段树(区间修改,区间查询)
    Codeforces Round #621 (Div. 1 + Div. 2) D
    Codeforces Round #620 (Div. 2) E
    Educational Codeforces Round 82 (Rated for Div. 2)
    洛谷P1638 逛画展
  • 原文地址:https://www.cnblogs.com/caiyonghai/p/3900263.html
Copyright © 2020-2023  润新知