题目:
支付宝AliPay和余额宝AliFund是一对好兄弟,他们来自同一个父类Account。
已知类Account是支付宝AliPay和余额宝AliFund的虚基类,包括两个protected成员数据:
long ID;//账号
string name;//用户名
支付宝AliPay是类Account的保护派生类,包括两个新增protected成员数据:
double amount;//支付宝账户中的金额
int out-limit;//支付宝转账上限,资金转出不得超出账户中金额也不能超出上限
//当转账要求超出上述限制时,自动转出最大允许金额
余额宝AliFund是类Account的保护派生类,包括三个新增protected成员数据:
double amount;//余额宝账户中的金额
double rate;//余额宝账户中资金年利率
int in-limit;//余额宝转账下限,资金转入余额宝时不得少于该下限,上不封顶
//当转入资金不足下限金额时,自动忽略该资金转入操作,资金退回
为了实现支付宝账户和余额宝账户间的资金收集和转账等功能,现以AliPay和AliFund为基类,创建一个淘宝账户类My_Ali,包括以下新增数据成员:
bool auto_collect_flag;//资金自动收集标志
int threshold;//资金自动收集阈值
/**/若资金自动收集标志为true,当用户支付宝账户金额超过资金自动收集阈值threshold时,超过且符合支付宝账户资金转出限制和余额宝资金转入下限的部分资金将自动转入余额宝中*/*/
增加合适的成员函数,可以实现支付宝账户和余额宝账户之间的资金转账和支付宝账户向余额宝账户的资金自动收集功能。
生成以上各类并编写主函数,根据输入的初始账户信息,建立用户对象,根据用户的账户操作信息,输出用户最后的资金信息。
测试输入包含一个测试用例:
第一行为初始账户信息,第一个数据是账号,第二个字符串是用户名,第三个数据是支付宝初始金额,第四个数据是支付宝转账上限,第五个数据是余额宝初始金额,第六个数据是余额宝资金年利率,第七个数据是余额宝转账下限,第八个数据是资金自动收集标志,字符Y代表设置资金自动收集,字符N代表不设置资金自动收集。若设置资金自动收集,第九个数据是资金自动收集阈值,否则,第九个数据不存在。
随后每一行代表用户资金账户的一次操作,第一个数字代表当前操作的账户类型,1代表支付宝账户,2代表余额宝账户,第二个数字代表具体操作,1代表账户资金增加,2代表账户金额减少,3代表支付宝和余额宝之间的资金转移,第三个数字代表操作金额。
最后输入0 0 0时结束。
注意:当设置资金自动收集为真时,支付宝账户资金每次增加时会自动触发资金自动收集。
输入样例:
100001 Zhangsan 1000 30000 50000 0.047 5000 Y 3000
1 1 1500
1 2 500
1 3 500
1 1 7000
2 3 500
0 0 0
输出样例:
Account for Zhangsan
Total: 59000
AliPay: 3500
AliFund: 55500 with rate 4.7%
代码长度限制
1000 KB
时间限制
400 ms
内存限制
64 MB
错误代码:
无数据点无法Debug,已过样例
#include <bits/stdc++.h>
using namespace std;
class Account{
protected:
long ID;
string name;
public:
Account(long i,string n){
ID=i;name=n;
}
};
class My_Ali;
class Alipay:public Account{
public:
double payamount;
int out_limit;
Alipay(double a,double o,long i,string n):Account(i,n){
payamount=a;out_limit=o;
}
void payadd(double change){
payamount+=change;
}
void payjian(double change){
if(change>payamount) change=payamount;
if(change>=out_limit) change=out_limit;
payamount-=change;
}
friend void check(My_Ali &a);
};
class Alifund:public Account{
public:
double fundamount;
double rate;
int in_limit;
Alifund(double a,int in,double r,long i,string n):Account(i,n){
fundamount=a;rate=r;in_limit=in;
}
void fundadd(double change){
if(change>in_limit) fundamount+=change;
}
void fundjian(double change){
if(change>fundamount) change=fundamount;
fundamount-=change;
}
};
class My_Ali:public Alifund,public Alipay{
private:
string name;
bool auto_collect_flag;
int threshold;
public:
My_Ali(long i,string n,double a1,int o,double a2,double r,int in,char a,int t):Alipay(a1,o,i,n),Alifund(a2,in,r,i,n){
name=n;
if(a=='Y'){
threshold=t;
auto_collect_flag=true;
}
else{
threshold=0;
auto_collect_flag=false;
}
}
void display(){
cout<<"Account for "<<name<<endl;
cout<<"Total: "<<fundamount+payamount<<endl;
cout<<"AliPay: "<<payamount<<endl;
cout<<"AliFund: "<<fundamount<<" with rate "<<rate*100<<"%"<<endl;
}
bool getacf(){
return auto_collect_flag;
}
int getthreshold(){
return threshold;
}
friend void check(My_Ali &a);
friend void paytofund(My_Ali &a,double change);
friend void fundtopay(My_Ali &a,double change);
};
void check(My_Ali &a){
if(a.getacf()==true){
if(a.payamount>a.getthreshold()) paytofund(a,a.payamount-a.getthreshold());
}
}
void paytofund(My_Ali &a,double change){
a.payjian(change);
if(change>=a.in_limit) a.fundadd(change);
else a.payadd(change);
}
void fundtopay(My_Ali &a,double change){
a.fundjian(change);
a.payadd(change);
}
int main(){
long ID;
string name;
double a1,a2,rate;
int outlimit,inlimit;
char acf;
int t=0;
cin>>ID>>name>>a1>>outlimit>>a2>>rate>>inlimit>>acf;
if(acf=='Y') cin>>t;
My_Ali ans(ID,name,a1,outlimit,a2,rate,inlimit,acf,t);
int n,m;
double change;
while(cin){
cin>>n>>m>>change;
if(n==m&&m==change&&n==0) break;
if(n==1){//Alipay
if(m==1) ans.payadd(change);
if(m==2) ans.payjian(change);
if(m==3) paytofund(ans,change);
}
if(n==2){//Alifund
if(m==1) ans.fundadd(change);
if(m==2) ans.fundjian(change);
if(m==3) fundtopay(ans,change);
}
check(ans);
}
ans.display();
return 0;
}
虽然博主解释的很明白,但我还是看的一愣一愣的