山东科技大学的一道 OJ 题目

Problem D: 儿童绘画游戏
Time Limit: 1 Sec  Memory Limit: 128 MB

Description

现在要开发一个儿童绘画游戏。多名儿童可以在同一个软件中,绘制长方形和圆形。请至少定义如下类及其成员:
1.Shape类:图形类,包括一个静态成员函数getCntOfShapes()用于获得总共绘制了多少个图形。
2.Rectangle类:矩形类,是Shape类的子类,包括:
(1)两个double类型的属性,表示矩形的长、宽。
(2)静态成员函数getCntOfRects()用于获取绘制的矩形的个数。
3.Circle类:圆形类,是Shape类的子类,包括:
(1)一个double类型的属性,是圆形的半径。
(2)静态成员函数getCntOfCircles()用于获得圆形的个数。
4.User类:用户类,包括:
(1)一个string类型属性,是用户的名字。
(2)一个Shape的列表,表示该用户绘制的图形的列表。
(3)构造函数User(string s),参数s是用户名。
(4)静态成员函数getCntOfUsers()用于获取用户个数。
(5)addAShape(int t,double a,double b):如果t=1,则表示绘制了一个矩形,其长、宽即a和b;如果t=2,则表示绘制了一个圆形,半径为a。
(6)double getArea()方法:返回该用户绘制的所有图形的面积。
5.UserList类:用户列表类,包括:
(1)一个User的列表。
(2)showTotalArea(string s)方法:如果s指定的用户名存在,则输出相应用户的绘制的图形的面积之和;如果s指定的用户不存在,则输出:
The user $ doesn't exist.
其中$为s的值。
(3)重载的输入运算符,用于输入所有的用户及他们绘制的图形。输入格式为:
第1行整数N>0,表示有N个用户,后面的N行,每行对应一个用户。
每个用户的第1个字符串是该用户的名字。之后是一个正整数M,表示该用户绘制了M个图形。之后有M组输入,每组输入第1个整数t表示图形的类型,1和2分别表示矩形和圆形;如果t为1,则之后的2个实数是矩形的长、宽;如果t为2,则之后的1个实数为圆形的半径。
(4)重载的输出运算符,按照如下格式输出所有用户及其绘制的图形:
每个用户占一行,格式为:
$ : rect(a,b),circle(r),…
其中,$为用户名。冒号之后是该用户绘制的图形的列表,输出顺序与输入顺序相同。如果该图形是矩形,则输出”rect(a,b)”,其中a和b是矩形的长、宽;如果该图形是圆形,则输出”circle(r)”,其中r是半径。输出的图形信息两两之间用一个逗号隔开。

Input

输入分为2部分。
第1部分是按照UserList类的要求输入的用户及图形信息。
第2部分有多行,每行包括1个字符串,是一个用户名。
假定所有的用户名均不相同。

Output
见样例。

Sample Input

3
Tom 3 1 1.1 2.2 2 3.3 1 2.1 3.2
Jerry 2 2 3.1 2 4.4
Mary 4 1 1.3 1.4 1 2.5 3.1 2 3.5 2 5.6
CUI
Tom
Jerry
mary
Mary


Sample Output


In beginning, 0 users,0 shapes.
30.26
Now, 4 users,11 shapes, including 6 circles, and 5 rectangles.
Tom : rect(1.1,2.2),circle(3.3),rect(2.1,3.2)
Jerry : circle(3.1),circle(4.4)
Mary : rect(1.3,1.4),rect(2.5,3.1),circle(3.5),circle(5.6)
The user CUI doesn't exist.
43.3346
90.9658
The user mary doesn't exist.
146.505

Append Code:

int main()
{
    cout<<"In beginning, "<>lst;
    cout<<"Now, "<>s1)
    {
        lst.showTotalArea(s1);
    }
    return 0;
}

AC Code:

#include

using namespace std;
const double pi = 3.14;

class Shape {
public:
    friend class UserList;
    friend class User;
    static int cntOfShapes;
    Shape() {
        cntOfShapes += 1;
    }
    static int getCntOfShapes() {
        return cntOfShapes;
    }
    virtual double Rtrns() = 0;
    virtual void prnt() = 0;
};

class Rectangle :public Shape {
public:
    friend class UserList;
    friend class User;
    static int cntOfRects;
    static int getCntOfRects() {
        return cntOfRects;
    }
    double c, k;
    Rectangle(double a = 0,double b = 0):c(a),k(b) {
        cntOfRects += 1;
    }
    double Rtrns() {
        return (c * k);
    }
    void prnt() {
        cout << "rect(" << c << "," << k << ")";
    }
};

class Circle :public Shape {
public:
    friend class User;
    friend class UserList;
    static int cntOfCircles;
    static int getCntOfCircles() {
        return cntOfCircles;
    }
    double r;
    Circle(double x = 0) :r(x) {
        cntOfCircles += 1;
    }
    double Rtrns() {
        return (pi * r * r);
    }
    void prnt() {
        cout << "circle(" << r << ")";
    }
};

class User {
public:
    friend class Shape;
    friend class Rectangle;
    friend class Circle;
    friend class UserList;
    Shape *S;
    vector shapevec;
    string name;
    static int cntOfUsers;
    static int getCntOfUsers() {
        return cntOfUsers;
    }
    User(string t) :name(t) {
        cntOfUsers += 1;
    };
    void addAShape(int t, double a, double b = 0) {
        if(t&1){
            S = new Rectangle(a, b);
            shapevec.push_back(S);
        }
        else {
            S = new Circle(a);
            shapevec.push_back(S);
        }
    }
    double getArea() {
        unsigned int l = shapevec.size();
        double ans = 0;
        for (unsigned int i = 0; i < l; i++) {
            S = shapevec[i];
            ans += S->Rtrns();
        }
        return ans;
    }
};

class UserList {
public:
    friend class User;
    friend class Circle;
    friend class Rectangle;
    friend class Shape;
    vector usrvec;
    Shape* S;
    static int cntOfUserLists;
    static int getCntOfUserList() {
        return cntOfUserLists;
    }
    User* U;
    unsigned int GetSize() {
        return usrvec.size();
    }
    void showTotalArea(string s) {
        unsigned int l = usrvec.size();
        int flag = -1;
        // 姓名匹配失败“Tom”
        for (unsigned int i = 0; i < l; i++) {
            U  = usrvec[i];
            string t = U->name;
            // cout << t << "++++++++++" << s << endl;// 正在匹配串
            if (s == t) {
                flag = i;
                break;
            }
        }
        if (flag == -1) {
            cout << "The user " << s << " doesn't exist." << endl;
        }
        else {
            U = usrvec[flag];
            cout << U->getArea() << endl;
        }
    }
    friend istream& operator >> (istream& in, UserList& usr) {
        int N;
        in >> N;
        for (int i = 0; i < N; i++) {// N 个用户
            string name;
            int M;
            in >> name >> M;
            usr.U = new User(name);
            for (int j = 0; j < M; j++) {
                int cmd;
                in >> cmd;
                if (cmd & 1) {
                    double a, b;
                    in >> a >> b;
                    usr.S = new Rectangle(a, b);
                }
                else {
                    double a;
                    in >> a;
                    usr.S = new Circle(a);
                }// 用户输入数据初始化完毕
                usr.U->shapevec.push_back(usr.S);// 用户自定义图形压入失败-》成功
            }
            usr.usrvec.push_back(usr.U);// 尝试压入用户类型@成功
        }
        return in;
    }

    // Loading-Waitting
    friend ostream& operator << (ostream& out, UserList usr) {
        // out << "Loading Writting--- --- --- --- --- --- --- ---" << endl;
        unsigned int l = usr.GetSize();// 用户表列长度
        // cout << l << " IS L " << endl;
        vector V = usr.usrvec;// 用户列表
        for (unsigned int i = 0; i < l; i++) {
            User* P = V[i]; // 取出某一个用户
            string name = P->name;// 获取用户姓名
            cout << name << " : ";
            vector T = P->shapevec;// 取出用户定义图形列表
            unsigned int ll = T.size();
            for (unsigned int k = 0; k < ll; k++) {
                Shape* SP = T[k];// 某一个图形
                //按类型调用函数@BUG:单值输出@修复
                if (k) {
                    cout << ",";
                    SP->prnt();
                }
                else{
                    SP->prnt();
                }
            }
            cout << endl;
        }
        return out;
    }
};

// 所有静态变量初始化开始
int Shape::cntOfShapes = 0;
int Rectangle::cntOfRects = 0;
int Circle::cntOfCircles = 0;
int User::cntOfUsers = 0;

int main()
{
    cout<<"In beginning, "<>lst;
    cout<<"Now, "<>s1)
    {
        lst.showTotalArea(s1);
    }
    return 0;
}

一首诗,忆过往,敬未来 白日不到处,青春恰自来; 苔花如米小,也学牡丹开。

标签: 笔记, SDUST

添加新评论