4.25test

R7-5 小黄与研究生会(20)

分数 12

 

全屏浏览

 

切换布局

作者 王秀

单位 福州大学

福州大学研究生院怡山的同学们为了在国家对抗新冠疫情期间献出自己的一份力量,他们决定为奋战在一线的医护人员送去了演出。小黄作为研究生协会的会长,他让每位男同学均带去了若干只猫或狗去表演节目,而小李是研究生会的副会长,她让每位女同学唱歌或者跳舞。去医院前,每位同学都事先预计了表演要持续的时间。不过,在献爱心时,他们都不愿意输给同学,一旦发现自己的节目预期持续时间短于已经表演过的同类节目的最长时间,则会临时延长表演时间,至同类节目的最长时间。

精彩的表演过程被全程录下来,每个节目一段,医护人员们会不断地点播重放这些节目,增添了不少欢乐。

现给出以下基类框架:

class Group

{

protected:

   int length; //时间长度

public:

 virtual void play()=0;//重放节目
     

};

以Group为基类(如果觉得有必要,可以向Group类中加入若干成员函数),构建出BoyGroup和GirlGroup两个类,分别描述生物组和艺术组的表演。

要求主函数中有一个基类Group指针数组,数组元素不超过20个。

Group *g[20];

主函数根据输入的信息,相应建立BoyGroup或GirlGroup类对象,对于BoyGroup类对象要能给出参与表演的动物(cat/dog)及其数量,和表演的时间(以秒为单位); 对于GirlGroup类对象要能给出表演的类型(dance/sing),和表演的时间。

输入格式:

首先输入表演信息

每一行为一位同学的表演信息:

其中第1项为组别, B为男同学组,A为女同学组,如果输入为E,则表示结束输入表演信息。

对于所有男同学来说,接下来依次输入参与表演的动物(C或D, C指cat,D指dog), 动物的数量(不小于1的正整数),预期表演的时间长度T(正整数)。

对于所有女同学来说,接下来输入表演的形式(S或D, S指sing, D指dance),预期表演的时间长度T(正整数)

第一行的表演节目编号为1,第二行为2,依此类推。

接着输入点播要求:

点播要求为一行以空格隔开的若干个数字,最后一个数字是0。除0以外的每个数字均为节目编号(假设所给的节目编号对应的表演肯定存在)。

输出格式:

点播节目的信息。每行一个。按点播次序给出。

输入样例:

B C 2 5
B C 1 3
B D 2 2
A S 2
A S 8
A S 4
A D 1
B C 2 7
E
1 6 2 7 4 0

输出样例:

2 cats, 5 seconds
sing, 8 minutes
1 cat, 5 seconds
dance, 1 minute
sing, 2 minutes

说明:

节目1:B C 2 5意味着2只cats表演5秒

节目2: B C 1 3意味着1只cat表演3秒,但是以前cat类节目的最长时间为5秒,大于3秒,所以此时实际节目为1只cat表演5秒

节目3:B D 2 2意味着2只dogs表演2秒

节目4:A S 2意味着sing2分钟

节目5:A S 8意味着sing8分钟

节目6:A S 4意味着sing4分钟,但是此前sing类节目的最长时间为8分钟,大于4分钟,所以此时实际节目为sing8分钟。

节目7:A D 1意味着dance1分钟

节目8:B C 2 7意味着2只cats表演7秒

E意味着结束输入节目信息

1 6 2 7 4 0

意味着依次输出1,6,2,7,4节目的具体信息,每行一个节目。

 

 

 

R6-1 表彰优秀学生(多态)

分数 15

 

全屏浏览

 

切换布局

作者 何振峰

单位 福州大学

学期结束,班主任决定表彰一批学生,已知该班学生数在6至50人之间,有三类学生:普通生,特招运动员,学科专长生,其中学科专长生不超过5人。

主函数根据输入的信息,相应建立GroupA, GroupB, GroupC类对象。

GroupA类是普通生,有2门课程的成绩(均为不超过100的非负整数);

GroupB类是特招运动员,有2门课程的成绩(均为不超过100的非负整数),1次运动会的表现分,表现分有:A、B、C、D共4等。

GroupC类是学科专长生,有5门课程的成绩(均为不超过100的非负整数)。

表彰人员至少符合以下3个条件中的一个:

(1)2门课程平均分在普通生和特招运动员中,名列第一者。

a.该平均分称为获奖线。

b.存在成绩并列时,则全部表彰,例如某次考试有2人并列第1,则他们全部表彰。

(2)5门课程平均分达到或超过获奖线90%的学科专长生,给予表彰。

(3)2门课程平均分达到或超过获奖线70%的特招运动员,如果其运动会表现分为A,给予表彰。

输入格式:每个测试用例占一行,第一项为类型,1为普通生,2为特招运动员,3为学科专长生, 输入0表示输入的结束。第二项是学号,第三项是姓名。对于普通生来说,共输入5项,第4、5项是课程成绩。对于特招运动员来说,共输入6项,第4、5项是课程成绩,第6项是运动会表现。对于学科专长生来说,共输入8项,第4、5、6、7、8项是课程成绩。

输出时,打印要表彰的学生的学号和姓名。(输出顺序与要表彰学生的输入前后次序一致)

函数接口定义:

 

以Student为基类,构建GroupA, GroupB和GroupC三个类

裁判测试程序样例:

 

#include<iostream> #include <string> using namespace std; /* 请在这里填写答案 */ int main() { const int Size=50; string num, name; int i,ty,s1,s2,s3,s4,s5; char gs; Student *pS[Size]; int count=0; for(i=0;i<Size;i++){ cin>>ty; if(ty==0) break; cin>>num>>name>>s1>>s2; switch(ty){ case 1:pS[count++]=new GroupA(num, name, s1, s2); break; case 2:cin>>gs; pS[count++]=new GroupB(num, name, s1,s2, gs); break; case 3:cin>>s3>>s4>>s5; pS[count++]=new GroupC(num, name, s1,s2,s3,s4,s5); break; } } for(i=0;i<count;i++) { pS[i]->display(); delete pS[i]; } return 0; }

输入样例:

1 001 AAAA 96 80
2 009 BBB 82 75 A
1 007 CC 100 99
3 012 CCCC 97 95 90 99 93
1 003 DDD 62 50
1 022 ABCE 78 92
2 010 FFF 45 40 A
3 019 AAA 93 97 94 82 80
0

输出样例:

 

 

009 BBB
007 CC
012 CCCC

 

 

 

 

 

 

 

R6-3 热心的动物饲养员

分数 15

 

全屏浏览

 

切换布局

作者 何振锋

单位 福州大学

小城动物收容所为被遗弃的老虎、狼和羊提供住所。以前的饲养员一直是一个笼子放一个动物,接任的饲养员不想继续这样。他觉得这样太浪费空间,因为一个笼子本来就是设计来放两只动物的,并且动物有一个伴也会不寂寞。决定把两只动物放进一个笼子饲养。已知同类动物不相食,老虎吃狼和羊,狼吃羊。现在有5个笼子,每个笼子有两个床位,已知按照0,1,2,3,4顺序依次找合适的笼子,床位安排顺序是先一号床位,再二号床位。床位安排完成后,不再调整,即使另一床位空出。

现实现程序完成动物床位的安排,程序将在有动物找不到合适床位时终止。

每行输入包括一个数字和一个字符串。数字是操作类型:1指安排老虎,2是安排羊,3是安排狼,4是动物搬离收容所。接下来的字符串是要操作的动物名字,假设每一个正被收容的动物和即将加入收容所的动物都有一个与众不同的名字。

对于每行输入可能是0行,1行或2行输出。

(1)当待安排的动物找不到合适的床位时,不输出,程序终止。
(2)当安排的动物找到床位时,输出一行,给出它所安排的笼子;如果同笼已经入住了伙伴,则在下一行输出伙伴的名字。
(3)在移除动物时,如果查不到指定的动物,则输出”NOT found!”,如果找到,则输出两行,第一行给出它当前所在的笼号,第二行说明它被”removed!”,这时该动物所在床位重置为空。

函数接口定义:

 

补齐4个类Cage, Tiger, Sheep, Wolf,可能包括类声明和成员函数。 实现普通函数:void remove(Cage*cage, string& name);

裁判测试程序样例:

 

#include <iostream> #include <string> using namespace std; #define C 5 class Animal{ public: string name; Animal(string name):name(name){ } virtual bool eat(Animal&)=0; virtual int getType()=0; }; class Cage{ Animal *a1, *a2; void setAnimal1(Animal&); void setAnimal2(Animal&); public: Cage(); bool arrange(Animal&); bool remove(string&); Animal* getRoommate(Animal&); }; bool Cage::arrange(Animal& a){ if(a1==NULL && a2==NULL) { setAnimal1(a); return true; } if(a1==NULL && a2!=NULL && !a2->eat(a) && !a.eat(*a2)){ setAnimal1(a); return true; } if(a1!=NULL && !a1->eat(a) && !a.eat(*a1) && a2==NULL){ setAnimal2(a); return true; } return false; } /* 请在这里填写答案 */ bool arrange(Cage* cage, Animal& a){ int i; Animal *p; for(i=0;i<C;i++){ if(!cage[i].arrange(a)) continue; cout<<"cage:"<<i<<endl; p=cage[i].getRoommate(a); if(p!=NULL) cout<<"roommate:"<<p->name<<endl; return true; } return false; } int main(){ Cage cage[C]; Wolf *pW; Tiger *pT; Sheep *pS; string name; bool state=true; int type; while(cin>>type){ cin>>name; switch(type){ case 1: pT= new Tiger(name); state=arrange(cage, *pT); break; case 2: pS= new Sheep(name); state=arrange(cage, *pS); break; case 3: pW= new Wolf(name); state=arrange(cage, *pW); break; case 4: remove(cage, name); break; } if(!state) break; } return 0; }

输入样例:

4 Alice
1 Alice
2 Jim
4 Alice
1 Kate
3 John
1 Mike
1 Tony
1 Karl
1 Marry
1 Linda
2 Joan
2 Abel

输出样例:

Alice NOT found!
cage:0
cage:1
cage:0
Alice removed!
cage:0
cage:2
cage:0
roommate:Kate
cage:3
cage:3
roommate:Tony
cage:4
cage:4
roommate:Marry
cage:1
roommate:Jim

输出说明,第一步要移除Alice,因为Alice不在收容所,所以输出NOT found!;第二步将Alice收容入第0笼;第三步将Jim收容入第1笼;第四步要移除Alice,这时找到了Alice,所以输出两行;第五步收容Kate,将它加入第0笼;第6步收容John,将它加入第2笼;第7步收容Mike,将它加入第0笼,接下来输出它的室友名字;第8步收容Tony,将其加入第3笼,第9步收容Karl;将其加入第3笼,同时输出其室友名;第10步收容Marry,将它加入第4笼;第11步收容Linda,将其加入第4笼,同时输出其室友名;第12步收容Joan,将其收容到第1笼,并输出室友名。第13步收容Abel,已经无法找到合适的笼子,程序不输出任何信息,直接结束。

 

 

 

 

 

R7-4 图书音像出租管理

分数 12

 

全屏浏览

 

切换布局

作者 east

单位 浙江大学

一个图书音像店出租图书和磁带。
给出下面一个基类的框架:
class Publication
{

protected:
string title;//名称
float price;//原价
int day;//租期
public:
virtual void display()=0;//打印价格清单
}
以Publication为基类,构建Book和Tape类。
生成上述类并编写主函数,要求主函数中有一个基类Publication指针数组,数组元素不超过10个。
Publication pp[10];
主函数根据输入的信息,相应建立Book, Tape类对象。
它们的原始租金为:租期
1.2。
另外,实际收取的租金不超过2倍的租品估价。
Book的估价为:新旧程度*原价。
Tape的估价为:原价/(1+已出租次数/3)。
输入格式:每个测试用例占一行,第一项为租品类型,1为Book,2为Tape.接下来为名称、原价、租期。最后一项Book是新旧程度(0.1至1),Tape是已出租次数。以0表示输入的结束。
要求输出名称,原始租金(小数点后保留1位小数),如果原始租金大于2倍租品估价,则同时给出实际应收取的租金(小数点后保留1位小数),并在最后标明R。

输入样例
1 AAA 19.5 3 0.5
1 BBB 9.5 2 0.1
2 AA 10 2 0
2 DDDD 12.5 2 38
1 FFF 42 3 0.1
0
输出样例
AAA 3.6
BBB 2.4 1.9 R
AA 2.4
DDDD 2.4 1.8 R
FFF 3.6

 

 

 

#include <iostream>
#include <string>
#include <sstream>

using namespace std;

class Ball {
protected:
    string opponent;
public:
    Ball(string opp) : opponent(opp) {}
    virtual void display() = 0;
};

class Basketball : public Ball {
private:
    int ourScore;
    int oppScore;
public:
    Basketball(string opp, string score) : Ball(opp) {
        stringstream ss(score);
        char colon;
        ss >> ourScore >> colon >> oppScore;
    }
    void display() {
        int points = (ourScore > oppScore)? 2 : 1;
        cout << opponent << " " << points << endl;
    }
};

class Football : public Ball {
private:
    int ourScore;
    int oppScore;
public:
    Football(string opp, string score) : Ball(opp) {
        stringstream ss(score);
        char colon;
        ss >> ourScore >> colon >> oppScore;
    }
    void display() {
        int points;
        if (ourScore > oppScore) {
            points = 3;
        } else if (ourScore == oppScore) {
            points = 1;
        } else {
            points = 0;
        }
        cout << opponent << " " << points << endl;
    }
};

class Volleyball : public Ball {
private:
    int ourScore;
    int oppScore;
public:
    Volleyball(string opp, string score) : Ball(opp) {
        stringstream ss(score);
        char colon;
        ss >> ourScore >> colon >> oppScore;
    }
    void display() {
        int points;
        if ((ourScore == 3 && (oppScore == 0 || oppScore == 1))) {
            points = 3;
        } else if (ourScore == 3 && oppScore == 2) {
            points = 2;
        } else if (ourScore == 2 && oppScore == 3) {
            points = 1;
        } else {
            points = 0;
        }
        cout << opponent << " " << points << endl;
    }
};

int main() {
    Ball *pb[20];
    int index = 0;
    int type;
    string opponent, score;
    while (cin >> type && type != 0) {
        cin >> opponent >> score;
        if (type == 1) {
            pb[index++] = new Basketball(opponent, score);
        } else if (type == 2) {
            pb[index++] = new Football(opponent, score);
        } else if (type == 3) {
            pb[index++] = new Volleyball(opponent, score);
        }
    }
    for (int i = 0; i < index; i++) {
        pb[i]->display();
        delete pb[i];
    }
    return 0;
}    

 

 

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容