SDUSTOJ:Problem D: 儿童绘画游戏
[TOC]
山东科技大学的一道 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;
}
一首诗,忆过往,敬未来 白日不到处,青春恰自来; 苔花如米小,也学牡丹开。