版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Fiverya/article/details/88884714
利用C++的多态性,设计一快递运费计算软件。 货物由北京可通过快递公司运往天津、上海、太原、广州、昆明、新疆六个城市,分别用1、2、3、4、5、6作为它们编号。运送货物的重量分为1、2、3公斤。快递公司有四家:E通宝、顺风、EMS和圆通,编号为1、2、3、4。不同城市、不同重量、不同的快递公司所费用由表1给出。当输入快递公司编号、城市编号和货物重量时,屏幕输出货物运送快递公司名称、到达的城市及费用。编程要求如下:
1.定义一基类为快递公司,类中定义“城市编号”、货物个数、重量等成员,成员函数有基本成员输出函数及两个纯虚函数:求运输费用函数和输出信息函数。
2.分别定义各快递公司的派生类,在类中参照表中提供的数据,根据自己的实际,编写各自的运输费用函数和输出信息函数。
3.用实例测试。在主函数中定义一基类的指针数组,使这些指针分别指向不同的快递公司。
测试用例说明: 第一位:快递公司编号;第二位:城市编号;第三位:货物个数;第四位:货物重量。
基类定义参考:
class Expresscom
{
protected:
int No,Num;//城市编号、货物个数
double zh;//货物重量
public:
Expresscom(int no,int num,double zhong);
virtual double Feiyong()=0;//计算运费函数
virtual void Disp()=0;//输出全部信息
void Edisp();//输出货物个数、货物重量信息
};
天津 | 上海 | 太原 | 广州 | 昆明 | 新疆 | |||||||||||||
1 | 2 | 3 | 1 | 2 | 3 | 1 | 2 | 3 | 1 | 2 | 3 | 1 | 2 | 3 | 1 | 2 | 3 | |
E邮宝 | 10 | 14 | 18 | 15 | 19 | 23 | 15 | 19 | 23 | 15 | 21 | 27 | 15 | 21 | 27 | 15 | 25 | 35 |
顺风 | 12 | 14 | 16 | 20 | 30 | 40 | 20 | 28 | 36 | 20 | 34 | 46 | 20 | 32 | 44 | 20 | 34 | 48 |
EMS | 26 | 38 | 50 | 26 | 38 | 50 | 26 | 38 | 50 | 29 | 47 | 65 | 35 | 65 | 95 | 38 | 66 | 95 |
圆通 | 10 | 18 | 26 | 10 | 18 | 26 | 12 | 24 | 36 | 12 | 22 | 32 | 15 | 27 | 39 | 18 | 33 | 48 |
#include<iostream>
using namespace std;
class Expresscom
{
protected:
int No,Num;
double zh;
public:
Expresscom(int no,int num,double zhong){No=no;Num=num;zh=zhong;}
virtual double Feiyong()=0;
virtual void Disp()=0;
void Edisp()
{ cout<<endl<<"目的地:";
switch(No)
{case 1:cout<< "天津";break;
case 2:cout<< "上海";break;
case 3:cout<< "太原";break;
case 4:cout<< "广州";break;
case 5:cout<< "昆明";break;
case 6:cout<< "新疆";break;
}
cout<<endl<<"重量:"<<zh<<"KG"<<endl<<"货物个数:"<<Num<<endl<<"单价:"<<Feiyong()<<endl<<"总运费:"<<Num*Feiyong()<<endl;
}
};
class ShunF:virtual public Expresscom
{
public:
ShunF(int no,int num,double zhong):Expresscom(no,num,zhong){}
double Feiyong()
{int z=(int)zh;
if(No==1) return 2*z+10;
else if(No==2) return 10*z+10;
else if(No==3) return 8*z+12;
else if(No==4) return 17*z+4-z*z;
else if(No==5) return 12*z+8;
else if(No==6) return 14*z+6;
}
void Disp()
{ cout<<"公司名称:顺风"; }
};
class Etb:virtual public Expresscom
{
public:
Etb(int no,int num,double zhong):Expresscom(no,num,zhong){}
double Feiyong()
{int z=(int)zh;
if(No==1) return 4*z+6;
else if(No==2||No==3) return 4*z+11;
else if(No==4) return 6*z+9;
else if(No==5) return 6*z+9;
else if(No==6) return 10*z+5;
}
void Disp()
{ cout<<"公司名称:E通宝"; }
};
class Ems:virtual public Expresscom
{
public:
Ems(int no,int num,double zhong):Expresscom(no,num,zhong){}
double Feiyong()
{int z=(int)zh;
if(No==1) return 12*z+14;
else if(No==2||No==3) return 12*z+14;
else if(No==4) return 18*z+11;
else if(No==5) return 30*z+5;
else if(No==6) return 26.5*z+0.5*z*z+11;
}
void Disp()
{ cout<<"公司名称:EMS"; }
};
class YT:virtual public Expresscom
{
public:
YT(int no,int num,double zhong):Expresscom(no,num,zhong){}
double Feiyong()
{int z=(int)zh;
if(No==1||No==2) return 8*z+2;
else if(No==3) return 12*z;
else if(No==4) return 10*z+2;
else if(No==5) return 12*z+3;
else if(No==6) return 15*z+3;
}
void Disp()
{ cout<<"公司名称:圆通"; }
};
int main()
{
int a,b,c;
double d;
cin>>a>>b>>c>>d;
Etb etb(b,c,d);
ShunF shunf(b,c,d);
Ems ems(b,c,d);
YT yt(b,c,d);
Expresscom *p[4]={&etb,&shunf,&ems,&yt};
p[a-1]->Disp();
p[a-1]->Edisp();
}