持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情。
题目描述
定义一个类CPeople,具有身份号码(id,char[20])和姓名(name,char[10])两个数据成员,从CPeople类中再派生出CInternetUser类和CBankCustomer类,然后再从CInternetUser和CBankCustomer多重继承派生出CInternetBankCustomer类。
CInternetUser类有登录密码(password,char[20])属性和注册register(设置id, name和password),登录login(判断输入的id与password是否与对象注册的相同)成员函数。
CBankCustomer类有余额(balance,double)属性和开户openAccount(设置客户姓名和id),存款deposit,取款withdraw以及缺省的构造函数。
CInternetBankCustomer类包括有余额, 前一日余额, 当日收益,今日万元收益和上一日万元收益等5个数据成员,成员函数有缺省构造函数,存款和取款,设置万元收益,计算当日收益,登陆login(判断输入的id和密码是否与互联网用户的相同,同时从CBankCustomer继承的用户姓名和id要与从CInternetUser继承的相同)。CInternetBankCustomer类对象当日存款不计算收益,第2天开始才能计算收益,当日取款部分无收益。
可参照如下所示的主函数来测试并设计输入数据:
int main() {
int t, no_of_days, i;
string i_xm, i_id, i_mm, b_xm, b_id, ib_id, ib_mm;
double money, interest;char op_code;//输入测试案例数t
cin >> t;
while (t--){//输入互联网用户注册时的用户名,id,登陆密码
cin >> i_xm >> i_id >> i_mm;//输入银行开户用户名,id
cin >> b_xm >> b_id;//输入互联网用户登陆时的id,登陆密码
cin >> ib_id >> ib_mm;
CInternetBankCustomer ib_user;
ib_user.registerUser(i_xm, i_id, i_mm);
ib_user.openAccount(b_xm, b_id);
if (!ib_user.login(ib_id, ib_mm)) //互联网用户登陆,若id与密码不符;以及银行开户姓名和id与互联网开户姓名和id不同
{ cout << "Password or ID incorrect" << endl;
continue;
}//输入天数
cin >> no_of_days;
for (i=0; i < no_of_days; i++){//输入操作代码, 金额, 当日万元收益
cin >> op_code >> money >> interest;
switch (op_code){
case 'S': //从银行向互联网金融帐户存入
case 's': if (!ib_user.deposit(money)){
cout << "Bank balance not enough" << endl;
continue;
}
break;
case 'T': //从互联网金融转入银行帐户
case 't':if (!ib_user.withdraw(money)){
cout << "Internet bank balance not enough" << endl;
continue;
}
break;
case 'D': //直接向银行帐户存款
case 'd':ib_user.CBankCustomer::deposit(money);
break;
case 'W': //直接从银行帐户取款
case 'w':if (!ib_user.CBankCustomer::withdraw(money)){
cout << "Bank balance not enough" << endl;
continue;
}
break;
default:cout << "Illegal input" << endl;
continue;
}
ib_user.setInterest(interest);
ib_user.calculateProfit();//输出用户名,id//输出银行余额 //输出互联网金融账户余额
ib_user.print();
cout << endl;
}
}
return 0;
}
输入
输入用户例数
输入第1个互联网用户注册时的用户名,id,登陆密码
输入第1个用户银行开户用户名,id
输入第1个互联网用户登陆时的id,登陆密码
输入第1个用户操作天数
循环输入操作代码(S,T,D,W) 金额 当日万元收益
......
输出
输出第1个用户名,id
输出第1个用户银行余额
输出第1个互联网金融账户余额
......
输入样例1
2
zhangsan 1234567890 222222
zhangsan 1234567890
1234567890 222222
4
D 15000 0
s 8000 1.5
T 3000 1.55
w 2000 0
lisi 2014150000 abcdef
lisi 2014150000
2014150000 123456
输出样例1
Name: zhangsan ID: 1234567890
Bank balance: 15000
Internet bank balance: 0
Name: zhangsan ID: 1234567890
Bank balance: 7000
Internet bank balance: 8000
Name: zhangsan ID: 1234567890
Bank balance: 10000
Internet bank balance: 5001.2
Name: zhangsan ID: 1234567890
Bank balance: 8000
Internet bank balance: 5001.98
Password or ID incorrect
思路分析
这道题不是一般的坑啊,我们先不去看怎么解决问题,单单看它给出的参考代码,虽然说是参考代码,但一般人都是直接copy过来当主函数用的,但是题目说的很明白,字符串要用char型解决,但主函数用的是string类,所以只有当你好不容易打完代码,满怀信心准备跑一下的时候才发现编译错误。
这也就算了,毕竟是参考嘛,password写成mm我还是看得懂的,但是name写成xm我一下子就懵了,毕竟俺写类的成员函数实现需要看主函数有没有传什么参数,还要注意参数的类型和顺序。
好了,吐槽完了,开始讲。
基类是CPeople,派生类是CInternetUser和CBankCustomer,由这两个共同派生的类是CInternetBankCustomer。
这里要注意之前我们碰到祖辈和孙辈的情况都是加上virtual修饰,因为想要它继承的属性只有一个,这里不能再加virtual了,因为题目讲明要我们判断输入的id和密码是否与互联网用户的相同,同时从CBankCustomer继承的用户姓名和id要与从CInternetUser继承的相同,这就需要我们继承两个姓名。
这里还需要注意收益的计算,你会发现有个万元收益,这玩意儿实际上就是利率。
我们在计算收益的时候,本金要用前一日余额,利率要用前一日万元收益。
算完之后要更新前一日余额和前一日万元收益。
还有就是,实际上一共有两个账户,一个银行账户,一个互联网账户,操作里面涉及到从互联网账户转账到银行账户。
祝你们好运。
AC代码
#include<iostream>
#include"cstring"
using namespace std;
class CPeople
{
protected:
char id[20],name[10];
public:
CPeople(){}
};
class CInternetUser:public CPeople
{
protected:
char password[20];
public:
CInternetUser(){}
void registerUser(char *name,char * id,char * password)
{
strcpy(this->id,id);
strcpy(this->name,name);
strcpy(this->password,password);
}
bool login(char *id,char *password)
{
return (!strcmp(this->id,id))&&(!strcmp(this->password,password));
}
};
class CBankCustomer:public CPeople
{
protected:
double balance=0;
public:
CBankCustomer(){}
void openAccount(char *name,char *id)
{
strcpy(this->name,name);
strcpy(this->id,id);
}
void deposit(double money){balance+=money;}
bool withdraw(double money)
{
if(money>balance)
return 0;
balance-=money;
return 1;
}
};
class CInternetBankCustomer:public CBankCustomer,public CInternetUser
{
protected:
double balance=0,lastbalance=0,todayprofit,interest,lastinterest=0;
public:
CInternetBankCustomer(){}
void setInterest(double interest)
{
lastinterest=this->interest;
this->interest=interest;
}
void calculateProfit()
{
todayprofit=lastbalance*lastinterest*0.0001;
balance+=todayprofit;
lastbalance=balance;
}
bool login(char * id,char *password)
{
return (!strcmp(id,CInternetUser::id))&&(!strcmp(password,this->password))&&(!strcmp(CBankCustomer::name,CInternetUser::name))&&(!strcmp(CBankCustomer::id,CInternetUser::id));
}
bool deposit(double money)
{
if(money>CBankCustomer::balance)
return 0;
balance+=money;
CBankCustomer::withdraw(money);
return 1;
}
bool withdraw(double money)
{
if(money>balance)
return 0;
balance-=money;
CBankCustomer::deposit(money);
return 1;
}
void print()
{
cout<<"Name: "<<CBankCustomer::name<<" ID: "<<CBankCustomer::id<<endl<<"Bank balance: "<<CBankCustomer::balance<<endl<<"Internet bank balance: "<<balance<<endl;
}
};
int main() {
int t, no_of_days, i;
char i_xm[10], i_id[20], i_mm[20], b_xm[10], b_id[20], ib_id[20], ib_mm[20];
double money, interest;char op_code;//输入测试案例数t
cin >> t;
while (t--){//输入互联网用户注册时的用户名,id,登陆密码
cin >> i_xm >> i_id >> i_mm;//输入银行开户用户名,id
cin >> b_xm >> b_id;//输入互联网用户登陆时的id,登陆密码
cin >> ib_id >> ib_mm;
CInternetBankCustomer ib_user;
ib_user.registerUser(i_xm, i_id, i_mm);
ib_user.openAccount(b_xm, b_id);
if (!ib_user.login(ib_id, ib_mm)) //互联网用户登陆,若id与密码不符;以及银行开户姓名和id与互联网开户姓名和id不同
{ cout << "Password or ID incorrect" << endl;
continue;
}//输入天数
cin >> no_of_days;
for (i=0; i < no_of_days; i++){//输入操作代码, 金额, 当日万元收益
cin >> op_code >> money >> interest;
switch (op_code){
case 'S': //从银行向互联网金融帐户存入
case 's': if (!ib_user.deposit(money)){
cout << "Bank balance not enough" << endl;
continue;
}
break;
case 'T': //从互联网金融转入银行帐户
case 't':if (!ib_user.withdraw(money)){
cout << "Internet bank balance not enough" << endl;
continue;
}
break;
case 'D': //直接向银行帐户存款
case 'd':ib_user.CBankCustomer::deposit(money);
break;
case 'W': //直接从银行帐户取款
case 'w':if (!ib_user.CBankCustomer::withdraw(money)){
cout << "Bank balance not enough" << endl;
continue;
}
break;
default:cout << "Illegal input" << endl;
continue;
}
ib_user.setInterest(interest);
ib_user.calculateProfit();//输出用户名,id//输出银行余额 //输出互联网金融账户余额
ib_user.print();
cout << endl;
}
}
return 0;
}