7-3 宠物的生长 (10分)
现在要开发一个系统,对宠物的生长状态进行管理。
给出下面的一个基类框架
class Pet
{
protected:
string name;//姓名
int length;//身长
int weight;//体重
int current;//当前日期
public:
virtual void display(int day)=0;//输出目标日期的身长和体重
}
以Pet为基类,构建出Cat和Dog两个类:
Cat一天身长加1,体重加2。
Dog一天身长加2,体重加1。
生成上述类并编写主函数,要求主函数中有一个基类Pet指针数组,数组元素不超过10个。
Pet *pt[10];
主函数根据输入的信息,相应建立Cat类对象或Dog类对象,并给出目标日期宠物的身长和体重。
输入格式:每个测试用例占一行,每行给出宠物的基本信息,第一个为当前宠物的类型:1为Cat,2为Dog。接下来为它的名字,随后的两个数字为身长和体重,最后为测身长和体重的日期(不大于10的正整数)。最后一行为目标日期(大于10的正整数)。
要求输出目标日期宠物姓名、身长和体重
提示:应用虚函数实现多态
输入样例
1 Marry 22 12 5
2 Jack 10 9 9
1 Jim 11 8 6
11
输出样例
Marry 28 24
Jack 14 11
Jim 16 18
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
class Pet
{
protected:
string name;//姓名
int length;//身长
int weight;//体重
int current;//当前日期
public:
virtual void display(int day)=0;//输出目标日期的身长和体重
virtual ~Pet() {};
Pet(string na,int l,int w,int c)
{
name =na;
length =l;
weight=w;
current=c;
}
};
class Cat:public Pet
{
public:
Cat(string na,int l,int w,int c):Pet(na,l,w,c){}
virtual void display(int day)
{
day=day-current;
cout<<name<<" "<<length+day<<" "<<weight+day*2<<endl;
}
};
class Dog:public Pet
{
public:
Dog(string na,int l,int w,int c):Pet(na,l,w,c){}
virtual void display(int day)
{
day=day-current;
cout<<name<<" "<<length+day*2<<" "<<weight+day*1<<endl;
}
};
int main()
{
Pet *pd[10];
string str;
int t,num,i=0,l,w,c;
double kg;
cin>>t;
while(t<10){
cin>>str>>l>>w>>c;
if(t==1){
pd[i]=new Cat(str,l,w,c);
}else if(t==2){
pd[i]=new Dog(str,l,w,c);
}
i++;
cin>>t;
}
for(int j=0;j<i;j++){
pd[j]->display(t);
}
delete *pd;
return 0;
}
7-4 期刊收费 (10分)
邮局提供两种期刊的订阅:杂志和报纸。 给出下面基类的框架:
class Periodical {
protected:
string title; //名称
public:
virtual void display()=0;//打印收费
}
以Periodical为基类,构建Magazine和Newspaper类。
生成上述类并编写主函数,要求主函数中有一个基类Periodical指针数组,数组元素不超过10个。
Periodical *pp[10];
主函数根据输入的信息,相应建立Magazine, Newspaper类对象,对于Magazine给出订阅期数和每期价格,对于Newspaper给出订阅周数,每周出版次数和每份价格。
输入格式:每个测试用例占一行,第一项为类型,1为Magazine,2为Newspaper,第二项是名称,第三项是单价,Magazine的第四项是期数,Newspaper的第四项是订阅周数,第五项是每周出版次数。
输出时,依次打印各期刊的名称和收费(小数点后保留一位)。
输入样例:
1 AAA 12.8 6
1 BB 15 3
2 CCCC 2.1 16 3
2 DD 0.7 55 7
1 EEE 18 3
0
输出样例:
AAA 76.8
BB 45.0
CCCC 100.8
DD 269.5
EEE 54.0
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
class Periodical
{
protected:
string title; //名称
double price;
public:
virtual void display()=0;//打印收费
virtual ~Periodical() {};
Periodical(string t,double p)
{
title=t;
price=p;
}
};
class Magazine:public Periodical
{
double qs;
public:
Magazine(string t,double p,double q):Periodical(t,p)
{
qs=q;
}
virtual void display()
{
cout<<title<<" "<<setiosflags(ios::fixed)<<setprecision(1)<<price*qs<<endl;
}
};
class Newspaper:public Periodical
{
double zs,cs;
public:
Newspaper(string t,double p,double q,double c):Periodical(t,p)
{
zs=q;
cs=c;
}
virtual void display()
{
cout<<title<<" "<<setiosflags(ios::fixed)<<setprecision(1)<<price*zs*cs<<endl;
}
};
int main()
{
Periodical *pd[10];
string s;
int t,num,i=0;
double kg,p,q,c;
cin>>t;
while(t){
cin>>s>>p;
if(t==1){
cin>>q;
pd[i]=new Magazine(s,p,q);
}else if(t==2){
cin>>q>>c;
pd[i]=new Newspaper(s,p,q,c);
}
pd[i]->display();
i++;
cin>>t;
}
delete *pd;
return 0;
}
7-5 师生信息管理 (10分)
给出下面的一个基类框架
class Person
{
protected:
int NO;//编号
public:
virtual void display()=0;//输出相关信息
}
以Person为基类,构建出Student、Teacher两个类。
生成上述类并编写主函数,要求主函数中有一个基类Person指针数组,数组元素不超过10个。
Person *pp[10];
主函数根据输入的信息,相应建立Student, Teacher类对象,对于Student给出期末5门课的成绩(为整数,缺考的科目填-1), 对于Teacher则给出近3年,每年发表的论文数量。
输入格式:每个测试用例占一行,第一项为人员类型,1为Student,2为Teacher.接下来为编号(0-9999),接下来Student是5门课程成绩,Teacher是3年的论文数。最后一行为0,表示输入的结束。
要求输出编号,以及Student缺考的科目数和已考科目的平均分(保留1位小数,已考科目数为0时,不输出平均分),Teacher的3年论文总数。
提示:应用虚函数实现多态
输入样例
1 19 -1 -1 -1 -1 -1
1 125 78 66 -1 95 88
2 68 3 0 7
2 52 0 0 0
1 6999 32 95 100 88 74
0
输出样例
19 5
125 1 81.8
68 10
52 0
6999 0 77.8
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
class Person
{
protected:
int NO;//编号
public:
virtual void display()=0;//输出相关信息
Person(int n){NO=n;}
virtual ~Person(){};
};
class Student:public Person
{
double pj;
int num=0;
public:
Student(int n,int n1,int n2,int n3,int n4,int n5):Person(n)
{
if(n1==-1) num++;
else pj+=n1;
if(n2==-1) num++;
else pj+=n2;
if(n3==-1) num++;
else pj+=n3;
if(n4==-1) num++;
else pj+=n4;
if(n5==-1) num++;
else pj+=n5;
pj=pj/(5-num);
}
virtual void display()
{
cout<<NO<<" "<<num;
if(num!=5){
cout<<" "<<setiosflags(ios::fixed)<<setprecision(1)<<pj;
}
cout<<endl;
}
};
class Teacher:public Person
{
int num;
public:
Teacher(int n,int n1,int n2,int n3):Person(n)
{
num=n1+n2+n3;
}
virtual void display()
{
cout<<NO<<" "<<num<<endl;
}
};
int main()
{
Person *pd[10];
string s;
int t,n,i=0,n1,n2,n3,n4,n5;
cin>>t;
while(t){
cin>>n;
if(t==1){
cin>>n1>>n2>>n3>>n4>>n5;
pd[i]=new Student(n,n1,n2,n3,n4,n5);
}else if(t==2){
cin>>n1>>n2>>n3;
pd[i]=new Teacher(n,n1,n2,n3);
}
pd[i]->display();
i++;
cin>>t;
}
delete *pd;
return 0;
}