问题 A: 小明的水果店(多态)
【问题描述】
小明经营着一个不大的水果店(似曾相识哦~),只销售苹果、香蕉和桔子。为了促销,小明制定了如下定价策略:
1. 苹果:按斤论价,每斤P元,买W斤,则需支付W*P元。
2. 香蕉:半价,每斤P元,买W斤,则需支付W/2*P元。
3.桔子:按斤论价,每斤P元,买W斤。如果W>10,则打半价,即需支付W*P/2元;否则如果W>5,则打八折,即需支付W*P*0.8元;其他情况不打折,即需支付W*P元。
请用C++来计算某个顾客采购的水果的总价。该程序至少应有:
1. Fruit类:是个抽象类,是Apple、Banana和Orange的父类。支持重载的加法运算。
2. Apple、Banana和Orange类:分别对应于苹果、香蕉和桔子三种水果,每种水果执行不同的定价策略。
【输入形式】
输入为多行,每行格式为:
C W P
其中C是水果类型(a、b、o分别代表苹果、香蕉和桔子),W和P分别是顾客购买的相应水果的重量和每斤水果的单价。输入完成后输入字符q结束输入。
【样例输入】
【样例输出】
【题解】
#include<iostream>
#include<iomanip>
using namespace std;
class fruit
{
protected:
double w,p;
public:
fruit(double w1=0,double p1=0)
{
w=w1;
p=p1;
}
virtual double price()
{
return 0;
};
};
class apple:public fruit
{
public:
apple(double w,double p):fruit(w,p)
{
}
double price()
{
return w*p;
}
};
class banana:public fruit
{
public:
banana(double w,double p):fruit(w,p)
{
}
double price()
{
return w*p*0.5;
}
};
class orange:public fruit
{
public:
orange(double w,double p):fruit(w,p)
{
}
double price()
{
if(w>10)
{
return w*p*0.5;
}
else if(w>5)
{
return w*p*0.8;
}
else{
return w*p;
}
}
};
int main()
{
char c;
cin>>c;
double sum=0;
double w,p;
while(c!='q')
{
if(c=='a')
{
cin>>w>>p;
apple m(w,p);
sum+=m.price();
}
if(c=='b')
{
cin>>w>>p;
banana m1(w,p);
sum+=m1.price();
}
if(c=='o')
{
cin>>w>>p;
orange m2(w,p);
sum+=m2.price();
}
cin>>c;
}
cout<<sum;
return 0;
}
问题 B: 变化的形状多态
【问题描述】
运用多态编写程序,声明抽象基类Shape,由它派生出3个派生类: Circle(圆形)、Rectangle(矩形)、Triangle(三角形),用一个函数printArea()分别输出以上三者的面积(结果保留两位小数),3个图形的数据在定义对象时给定。
【输入形式】
圆的半径 矩形的边长 三角形的底与高
【输出形式】
圆的面积
矩形的面积
三角形的面积
注意:每一行后有回车符
【样例输入】
【样例输出】
【题解】
#include<iostream>
#include<iomanip>
using namespace std;
class shape
{
public:
virtual double area()
{
return 0;
};
};
class circle:public shape
{
private:
double r;
public:
circle(double r1)
{
r=r1;
}
double area()
{
return 3.1415926*r*r;
}
} ;
class juxing:public shape
{
private:
double x,y;
public:
juxing(double x1,double y1)
{
x=x1;y=y1;
}
double area()
{
return x*y;
}
};
class sanjiao:public shape
{
private:
double x,y;
public:
sanjiao(double x2,double y2)
{
x=x2;y=y2;
}
double area()
{
return x*y*0.5;
}
};
int main()
{
double r,x1,y1,x2,y2;
cin>>r>>x1>>y1>>x2>>y2;
circle p(r);
juxing p1(x1,y1);
sanjiao p2(x2,y2);
cout<<"area of circle="<<fixed<<setprecision(2)<<p.area()<<endl;
cout<<"area of rectangle="<<fixed<<setprecision(2)<<p1.area()<<endl;
cout<<"area of triangle="<<fixed<<setprecision(2)<<p2.area();
}