题目描述
某书店囤积了一批旧书,准备按照类别重新定价低价出售。
图书类别分为三种:历史类,科幻类,书法类。折扣方式为:
1. 历史类:原价*0.75-5;
2. 科幻类:原价*0.8+5;
3. 课本类:原价*0.5;
如果书有破损(有破损用Y表示,未破损用N表示),在上述折扣后的基础上再打八折;如果按上述折扣后售价低于5元且原价超过5元的,按5元出售;如果按上述折扣后售价超过原价的或售价小于等于0的,按原价出售。
要求:定义CBook为基类,历史,科幻和课本类继承基类,程序中只能使用基类指针指向对象与调用对象的方法。
输入
测试案例的个数 t
每行输入一本图书的信息:包括类别、名称、原价、是否破损
输出
输出相应图书的信息以及打折后的售价(保留两位小数)
输入样例1:
3
Textbook 语文书 13.8 N
Science 三体 32.0 Y
History 明朝那些事儿第壹部 28.8 Y
输出样例1:
Textbook 语文书 6.90
Science 三体 24.48
History 明朝那些事儿第壹部 13.28
以下为AC代码:
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
using namespace std;
class book{
protected:
string name;
double price;
char state;
public:
book(string a,double b,char c)
{
name=a;
price=b;
state=c;
}
virtual void display()
{
cout<<name<<" "<<price<<" "<<state<<endl;
}
};
class text:virtual public book{
protected:
double sale;
public:
text(string a,double b,char c):book(a,b,c)
{
if(c=='Y')
sale=0.8*b*0.5;
else
sale=0.5*b;
if(sale<5&&b>5)
{
sale=5;
}
else if(sale>b)
{
sale=b;
}
}
virtual void display()
{
cout<<"Textbook "<<name<<" "<<fixed<<setprecision(2)<<sale<<endl;
}
};
class science:virtual public book{
protected:
double sale;
public:
science(string a,double b,char c):book(a,b,c)
{
if(c=='Y')
sale=0.8*(b*0.8+5);
else
sale=0.8*b+5;
if(sale<5&&b>5)
{
sale=5;
}
else if(sale>b)
{
sale=b;
}
}
virtual void display()
{
cout<<"Science "<<name<<" "<<fixed<<setprecision(2)<<sale<<endl;
}
};
class history:virtual public book{
protected:
double sale;
public:
history(string a,double b,char c):book(a,b,c)
{
if(c=='Y')
sale=0.8*(b*0.75-5);
else
sale=0.75*b-5;
if(sale<5&&b>5)
{
sale=5;
}
else if(sale>b||sale<=0)
{
sale=b;
}
}
virtual void display()
{
cout<<"History "<<name<<" "<<fixed<<setprecision(2)<<sale<<endl;
}
};
int main()
{
int t;
cin>>t;
string name;
string type;
double price;
char state;
while(t--)
{
cin>>type>>name>>price>>state;
if(type=="Textbook")
{
book *ans=new text(name,price,state);
ans->display();
}
else if(type=="Science")
{
book *ans=new science(name,price,state);
ans->display();
}
else if(type=="History")
{
book *ans=new history(name,price,state);
ans->display();
}
}
return 0;
}