Problem D: 儿童绘画游戏

Problem D: 儿童绘画游戏

Problem D: 儿童绘画游戏

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 427   Solved: 302
[ Submit][ Status]

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
#include<iostream>
#include<stdio.h>
#include<string.h>
#include <string>
#include <vector>

using namespace std;

class Shape{
  
public:
    int flag;
    static int count;
    Shape(){
        count++;
    }
    virtual double getArea() = 0;
    static int getCntOfShapes(){
        return count;
    }
    virtual void show() = 0;
};

class Rectangle:public Shape{
    
public:
    double c;
    double k;
    static int count;
    Rectangle(double a,double b):c(a),k(b){
        count++;
        flag = 1;
    }
    double getArea(){
        return c*k;
    }
    void show(){
        cout<<"rect("<<c<<","<<k<<")";
    }
   static  int getCntOfRects(){
        return count;
    }
};

class Circle:public Shape{
    
public:
    double r;
    static int count;
    Circle(double s):r(s){
        count++;
        flag = 2;
    }
    double getArea(){
        return r*r*3.14;
    }
    void show(){
        cout<<"circle("<<r<<")";
    }
    static int getCntOfCircles(){
        return count;
    }
};
class User{
public:
    string name;
    vector<Shape *> userlist;
    static int count;
    User(string n):name(n){
        count++;
    }
    static int getCntOfUsers(){
        return count;
    }
    void addAShape(int t, double a, double b =0){
        if(t==1){
            Shape *s = new Rectangle(a,b);
            userlist.push_back(s);
        }else if(t==2){
            Shape *s = new Circle(a);
            userlist.push_back(s);
        }
    }
    double getArea(){
        vector<Shape *>::iterator iter;
        double sum =0;
        for(iter = userlist.begin();iter!= userlist.end();iter++){
            sum+=(*iter)->getArea();
        }
        return sum;
    }
};

class UserList{
public:
    vector<User *> c;
    void showTotalArea(string s){
        int flag = 0;
        vector<User *>::iterator iter;
        for(iter = c.begin();iter!= c.end();iter++){
            if(s == (*iter)->name){
                cout<<(*iter)->getArea()<<endl;
                flag = 1;
            }
        }
        if(flag == 0){
            cout<<"The user "<<s<<" doesn't exist."<<endl;
        }
    }
    
    friend istream& operator >>(istream &is,UserList &u){
        
        int n;
        is >> n;
        
        for(int j =0;j<n;j++){
            string name;
            int coun;
            is>>name >> coun;
            User *s = new User(name);
            int t;
            
            for(int i =0;i<coun;i++){
                is >> t;
                if(t== 1){
                    double a,b;
                    is>> a >> b;
                    //s->userlist.push_back(new Rectangle(a,b));
                    s->addAShape(t,a,b);
                }else if (t == 2){
                    double a;
                    is>>a;
                    //s->userlist.push_back(new Circle(a));
                    s->addAShape(t,a);
                }
               
            }
            u.c.push_back(s);
        }
        return is;
        
    }
    
    friend ostream &operator<<(ostream &os,UserList &u){
        vector<User *>::iterator  iter;
        vector<Shape *>::iterator it;
        for(iter = u.c.begin();iter!= u.c.end();iter++){
            os << (*iter)->name<<" : ";
            for(it = (*iter)->userlist.begin();it!=(*iter)->userlist.end();it++){
                
                (*it)->show();
                if((it+1) != (*iter)->userlist.end()){
                    os<<",";
                }
            }
            os << endl;
        }
        return os;
    }
};

int Shape::count =0;
int Circle::count = 0;
int User::count = 0;
int Rectangle::count =0;


int main()
{
    cout<<"In beginning, "<<User::getCntOfUsers()<<" users,";
    cout<<Shape::getCntOfShapes()<<" shapes."<<endl;
    User tmp("C++");
    tmp.addAShape(1, 1, 2);
    tmp.addAShape(2, 3);
    cout<<tmp.getArea()<<endl;
    
    UserList lst;
    string s1;
    cin>>lst;
    cout<<"Now, "<<User::getCntOfUsers()<<" users,";
    cout<<Shape::getCntOfShapes()<<" shapes, including ";
    cout<<Circle::getCntOfCircles()<<" circles, and ";
    cout<<Rectangle::getCntOfRects()<<" rectangles."<<endl;
    cout<<lst;
    while(cin>>s1)
    {
        lst.showTotalArea(s1);
    }
    return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 题目描述: 定义一个结构体,包含学生的姓名和成绩,输入多个学生的信息,按照成绩从高到低排序输出。 输入格式: 第一行输入一个整数n,表示学生的数量。 接下来n行,每行输入一个字符串和一个整数,表示学生的姓名和成绩。 输出格式: 按照成绩从高到低排序输出每个学生的姓名和成绩,每个学生的姓名和成绩之间用一个空格隔开。 如果有多个学生成绩相同,则按照姓名的字典序从小到大排序。 样例输入: 5 Tom 80 Jerry 90 Bob 80 Alice 85 John 90 样例输出: Jerry 90 John 90 Alice 85 Bob 80 Tom 80 解题思路: 本题需要用到结构体和排序,首先定义一个结构体,包含学生的姓名和成绩,然后输入多个学生的信息,将其存储在结构体数组中,最后按照成绩从高到低排序输出。 排序时需要自定义比较函数,先按照成绩从高到低排序,如果成绩相同,则按照姓名的字典序从小到大排序。 代码实现: ### 回答2: 这道题目要求我们按照学生的成绩从高到低排序,我们可以使用结构体来存储每个学生的信息,包括姓名、学号和成绩。然后我们使用冒泡排序算法来排序,要求按照成绩从高到低排列。 首先,我们需要定义一个结构体来存储学生的信息。假设我们需要存储的三个属性为name, id, score,那么我们可以这样定义结构体: ``` struct Student { char name[20]; char id[20]; int score; }; ``` 然后我们就可以定义一个数组用来存储多个学生的信息: ``` Student students[100]; ``` 接下来,我们需要读入每个学生的信息,存储到这个数组中。假设我们需要读入n个学生的信息,那么我们可以使用循环来读入每个学生的信息: ``` for (int i = 0; i < n; i++) { scanf("%s %s %d", students[i].name, students[i].id, &students[i].score); } ``` 接下来,我们使用冒泡排序算法来排序。对于每一次冒泡,我们将会通过比较相邻的两个元素,如果顺序不对就交换它们的位置。我们需要多次执行这个操作,直到所有元素都按照从大到小的顺序排序完毕。 ``` for (int i = 0; i < n - 1; i++) { for (int j = 0; j < n - i - 1; j++) { if (students[j].score < students[j + 1].score) { Student temp = students[j]; students[j] = students[j + 1]; students[j + 1] = temp; } } } ``` 在最后,我们需要输出排序后的结果。假设我们想要输出每个学生的信息,那么我们可以使用循环来输出: ``` for (int i = 0; i < n; i++) { printf("%s %s %d\n", students[i].name, students[i].id, students[i].score); } ``` 这样就完成了问题d:结构体按成绩排序的实现。 ### 回答3: 这道题的主要任务是将一个包含学生信息的结构体按照成绩从高到低进行排序。我们可以使用冒泡排序或快速排序等算法来实现。 首先我们需要定义一个结构体,包含学生姓名、学号和成绩。 ```c++ struct Student{ string name; string num; int score; }; ``` 接下来,我们定义一个函数,该函数接收一个指向结构体数组的指针,还需要一个整数类型的形参来表示数组的长度,函数的返回值为 void。该函数会根据成绩从高到低排序结构体数组。 ```c++ void sortStudents(Student* arr, int len){ for(int i = 0; i < len - 1; i++){ for(int j = i+1; j < len; j++){ if(arr[i].score < arr[j].score){ Student temp; temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } } ``` 接下来,我们先在主函数中定义一个结构体数组并填充数据。 ```c++ int main(){ Student s[5] = { {"Tom", "001", 85}, {"Lily", "002", 90}, {"Bob", "003", 76}, {"Lucy", "004", 92}, {"John", "005", 88} }; // 调用函数进行排序 sortStudents(s, 5); // 输出排序结果 for(int i = 0; i < 5; i++){ cout << s[i].name << " " << s[i].num << " " << s[i].score << endl; } return 0; } ``` 运行程序后,我们可以看到按照成绩从高到低排序的结果输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值