银行账户(静态成员与友元函数)

2023-07-30 09:51:37 浏览数 (2)

题目描述

银行账户类的基本描述如下:

要求如下:

实现该银行账户类

为账户类Account增加一个友元函数,实现账户结息,要求输出结息后的余额(结息余额=账户余额 账户余额*利率)。友元函数声明形式为 friend void Update(Account& a);

在main函数中,定义一个Account类型的指针数组,让每个指针指向动态分配的Account对象,并调用成员函数测试存款、取款、显示等函数,再调用友元函数测试进行结息。

大家可以根据实际需求在类内添加新的成员

要求所有和银行账户相关的数据都不能用全局变量形式,必须封装在类内。

输入

第1行:利率 第2行:账户数目n 第3行开始,每行依次输入一个账户的“账号”、“姓名”、“余额”、存款数,取款数。

输出

第1行开始,每行输出一个账户的相关信息,包括账号、姓名、存款后的余额、存款后结息余额、取款后余额。

最后一行输出所有账户的余额。

输入样例1 

0.01 3 201501 张三 10000 1000 2000 201502 李四 20000 2000 4000 201503 王二 80000 4000 6000

输出样例1

201501 张三 11000 11110 9110 201502 李四 22000 22220 18220 201503 王二 84000 84840 78840 106170

思路分析

首先一个问题就是,类已经声明了,给出来的不能再修改,但是它给出来的不一定要给它定义,就像析构函数,在这里好像并没有起到什么作用,所以我们就没有给它具体的定义。

可以看到这个类声明的函数和成员还是比较多的,但是我们还需要往里面添加成员函数。

由于它的三个静态数据成员被定义成了私有成员,我们只能通过成员函数去修改它,但原类声明中,并没有带与之对应参数的成员函数,于是我们需要添加成员函数,一般修改静态数据成员都通过静态成员函数来修改,当然非静态成员函数也可以修改。

有一个问题是之前从来没有考虑过的,注意到题目中说,在main函数中,定义一个Account类型的指针数组,让每个指针指向动态分配的Account对象,由于数组长度是未知的,于是我们需要new出来,这意味着我们需要先new一个二级指针,这没有什么问题,问题出现在delete的时候,由于之前二级指针都使用于二维数组,因此delete的时候很自然的写成这样:

    if(p)     {         for(i=0;i<n;i )         delete[] p[i];         delete[] p;     } 

有些编辑器还不会报错,我的Dev-C 就不会报错,提交的时候才运行异常,问题在于这里的指针数组的元素指向的不是一个数组,所以delete[] p[i]是不对的,要把[]去掉。

AC代码

代码语言:javascript复制
#include<iostream>
#include<string>
using namespace std;
class Account
{
	public:
		Account(string accno,string name,float balance);
		~Account();
		void Deposit(float amount);
		void Withdraw(float amount);
		float GetBalance();
		void Show();
		static int GetCount();
		static float GetInterestRate();
		static void setcount(int c);
		static void setrate(float rate);
		friend void Update(Account & a);
	private:
		static int count;
		static float InterestRate;
		string _accno,_accname;
		float _balance;
};
int Account::count;
float Account::InterestRate;
Account::Account(string accno,string name,float balance):_accno(accno),_accname(name),_balance(balance){}
Account::~Account(){}
void Account::Deposit(float amount)
{
	_balance =amount;
}
void Account::Withdraw(float amount)
{
	_balance-=amount;
}
float Account::GetBalance()
{
	return _balance;
}
void Account::Show()
{
	cout<<_accno<<' '<<_accname<<' ';
}
int Account::GetCount()
{
	return count;
}
float Account::GetInterestRate()
{
	return InterestRate;
}
void Account::setcount(int c)
{
	count=c;
}
void Account::setrate(float rate)
{
	InterestRate=rate;
}
void Update(Account & a)
{
	a._balance =a._balance*a.InterestRate;
	cout<<' '<<a._balance<<' ';
}
int main()
{
	int n,i;
	float rate,balance_sum=0,balance,amount;
	string accno,accname;
	cin>>rate;
	cin>>n;
	Account::setcount(n);
	Account::setrate(rate);
	Account ** p=new Account*[n];
	for(i=0;i<n;i  )
	{
		cin>>accno>>accname>>balance;
		p[i]=new Account(accno,accname,balance);
		p[i]->Show();
		cin>>amount;
		p[i]->Deposit(amount);
		cout<<p[i]->GetBalance();
		Update(*p[i]);
		cin>>amount;
		p[i]->Withdraw(amount);
		cout<<p[i]->GetBalance()<<endl;
		balance_sum =p[i]->GetBalance();
	}
	cout<<balance_sum;
	if(p)
	{
		for(i=0;i<n;i  )
		delete p[i];
		delete[] p;
	} 
}

0 人点赞