OOP图书促销(多态虚函数)

题目描述

某书店囤积了一批旧书,准备按照类别重新定价低价出售。

图书类别分为三种:历史类,科幻类,书法类。折扣方式为:

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值