简单的银行存款取款业务模拟程序

实验三 静态成员和友元函数

一、实验目的和任务

1) 熟练掌握友元函数设计的方法

2)掌握友元函数的含义,友元函数和成员函数的区别。

二、实验原理介绍

根据要求正确定义静态成员和友元函数。将别的模块声明为友元,使类中本隐藏的信息如私有和保护成员就可以被友元访问。



三、实验内容和步骤

【实验3-1】 静态成员

为账户类ACCOUNT增加静态成员count和 InterestRate表示账户数量和利率,

增加静态成员函数GetCount返回账户数目 GetInterestRate返回银行利率

class ACCOUNT {

public:

     ACCOUNT(string accno,string name,float balance);

     ~ACCOUNT();

     void Deposit(float amount);

     void Withdraw(float amount);

     float GetBalance();

     void Show(void);

     static int GetCount();

     static float GetInterestRate();

private:

     static int count;

     static float InterestRate;

     string _accno,_accname;

     float _balance;

};

【实验3-2】 友元函数

为账户类ACCOUNT增加一个友元函数,实现账户结息,要求输出结息后的余额(不计算利息税),并在main函数中调用进行测试。

friend void Update(ACCOUNT& a);

【实验3-3】(加分题)

在main函数中,设计一个ACCOUNT类型的数组,为数组中的10个对象初始化,并调用成员函数测试存款、取款、显示等函数,再调用友元函数测试进行结息。

n ACCOUNT accArray[10];  //静态数组的方法

n ACCOUNT * accArray= new ACCOUNT[10]; //动态数组的方法

cout<<"帐户数目:"<<ACCOUNT::GetCount()<<endl;

注:

1. 用以上方法时,会调用缺省构造函数,此时应将构造函数修改成缺省构造函数,例如:

ACCOUNT::ACCOUNT(string accno="0000",string accname="bank",float balance=0.0f) 

2. 对各对象再进行设置时,可增加一个setData函数,用于设置账号、姓名和余额。


【Account.h】

#include<iostream>
#include<cmath>
#include<string>
using namespace std;

class Limited_Account;
class Free_Account;

struct Date
{
	double year;
	double month;
	double day;
};

class Account 
{
public:
	 Account(){}
	 ~Account(){}
	 void inputData();
	 void input_Endingtime();
     double GetBalance();
	 double Gettime();
     void Show();
	 void Deposit();
	 void Withdraw(double,double);
private:
     string _accno;
	 string _accname;
     double _balance;

	 Date Beginning;
	 Date Ending;
	 friend Limited_Account;
	 friend Free_Account;
};
void Account::Deposit()
{
	double Deposit;
	cout<<"请输入存款金额:";
	for(;;)
	{
		cin>>Deposit;
		if(Deposit>=0) break;
		else cout<<"输入错误。\n请重新输入:\n";
	}
	_balance+=Deposit;
	cout<<"\n当前账户余额为:"<<_balance<<"元。\n";
	system("pause");
}

void Account::Withdraw(double x,double y)
{
	double withdraw;
	cout<<"\n请输入取款金额:";
	for(;;)
	{
		cin>>withdraw;
		if(withdraw<=(x-y)) break;
		else cout<<"\n无法透支。\n请重新输入:";
	}
	_balance=x-withdraw;
	cout<<"\n当前金额为:"<<_balance<<"元。\n";
	system("pause");
}

void Account::inputData()
{
	cout<<"\n开户时间\n年:";
	cin>>Beginning.year;
	cout<<"月:";
	cin>>Beginning.month;
	cout<<"日:";
	cin>>Beginning.day;
	cout<<"\n账号:";
	cin>>_accno;
	cout<<"姓名:";
	cin>>_accname;
	cout<<"账户余额(元):";
	cin>>_balance;
}

void Account::input_Endingtime()
{
	cout<<"\n取款时间\n年:";
	cin>>Ending.year;
	cout<<"月:";
	cin>>Ending.month;
	cout<<"日:";
	cin>>Ending.day;
}

double Account::GetBalance()
{
   return _balance;
}

double Account::Gettime()
{
	double Time=0,a=0,b=0;

	if(Ending.month<Beginning.month && (Ending.year-Beginning.year)>=1) 
	{
		a=Ending.year-Beginning.year-1;
		b=(Ending.month+12-Beginning.month)/12;
		Time=a+b;
	}
	else if(Ending.month>=Beginning.month)
	{
		a=Ending.year-Beginning.year;
		b=(Ending.month-Beginning.month)/12;
		Time=a+b;
	}
	return Time;
}

void Account::Show()
{
  cout<<"\n帐号: "<<_accno<<endl
	  <<"姓名: "<<_accname<<endl
	  <<"余额: "<<_balance<<endl
	  <<"开户时间:"<<Beginning.year
	  <<"年"<<Beginning.month
	  <<"月"<<Beginning.day<<"日"<<endl;
}

【Free_Account.h】

#ifndef ACCOUNT
   #define ACCOUNT
   #include"Account.h"
#endif

class FreeAccount:public Account
{
private:
	double FInterestRate;
	double ManagingFee;
	double Interest;
public:
	FreeAccount(){}
	~FreeAccount(){}
	void FinputData();
	void Fshow();
	void Deposit();
	void Withdraw();
	double GetInterest();
	friend int main();
};
void FreeAccount::FinputData()
{
	cout<<"\n请输入账户信息:\n";
	Account::inputData();
	cout<<"年管理费(元):";
	cin>>ManagingFee;
}
void FreeAccount::Fshow()
{
	cout<<"\n账户信息:\n"
		<<"活期账户\n";
	Account::Show();
	FInterestRate=0.50;
	cout<<"\n年利率(%):"<<FInterestRate
		<<"\n年管理费(元):"<<ManagingFee<<endl;
	system("pause");
}
void FreeAccount::Deposit()
{
	Account::Deposit();
}
void FreeAccount::Withdraw()
{
	//Account::input_Endingtime();
	double t=Account::Gettime();
	double x=Account::GetBalance();
	double I=1+FInterestRate/100;
	x=x*pow(I,t);
	Account::Withdraw(x,ManagingFee);
}
double FreeAccount::GetInterest()
{
	double a=Account::GetBalance();
	Interest=a*FInterestRate;
	return Interest;
}


【Limited_Account.h】

#ifndef ACCOUNT
   #define ACCOUNT
   #include"Account.h"
#endif

class LimitedAccount:public Account
{
private:
	double LInterestRate;
	double ManagingFee;
	double Interest;
	double Ltime;
public:
	LimitedAccount(){}
	~LimitedAccount(){}
	void LinputData();
	void Lshow();
	void Deposit();
	void Withdraw();
	double GetInterest();
	friend int main();
};
void LimitedAccount::LinputData()
{
	cout<<"\n请输入账户信息\n";
	Account::inputData();
	cout<<"存储年限:";
	cin>>Ltime;
	cout<<"年管理费:";
	cin>>ManagingFee;
}
void LimitedAccount::Lshow()
{
	cout<<"账户信息:\n"
		<<"\n定期账户\n";
	Account::Show();
	if (Ltime<=0.25) LInterestRate=0;
	else if (Ltime<=0.5)  LInterestRate=2.85;
	else if (Ltime<=1) LInterestRate=3.05;
	else if (Ltime<=2) LInterestRate=3.25;
	else if (Ltime<=3) LInterestRate=4.15;
	else if (Ltime<=5) LInterestRate=4.75;
	else LInterestRate=5.25;

	cout<<"存储年限:"<<Ltime
		<<"\n年利率(%):"<<LInterestRate
		<<"\n年管理费(元):"<<ManagingFee<<endl;
	system("pause");
}
void LimitedAccount::Deposit()
{
	Account::Deposit();
}
void LimitedAccount::Withdraw()
{
	Account::input_Endingtime();
	double t=Account::Gettime();
	cout<<"已存时间为:"<<t<<"年"<<endl;
	double x=Account::GetBalance();
	if(t<Ltime)
	{
		char a;
		cout<<"存储时间不足"<<Ltime<<"年。\n若仍要取款将按活期利率进行结息!\n是否继续取款(y/n):";
		cin>>a;
		if(a=='y')
		{
			LInterestRate=0.5;
			double I=1+LInterestRate/100;
			x=x*pow(I,t);
			Account::Withdraw(x,ManagingFee);
		}
	}
	else if(t>=Ltime)
	{
		double I=1+LInterestRate/100;
		x=x*pow(I,Ltime);
		LInterestRate=0.5;
		I=1+LInterestRate/100;
		x=x*pow(I,t-Ltime);
		Account::Withdraw(x,ManagingFee);
	}
}
double LimitedAccount::GetInterest()
{
	double a=Account::GetBalance();
	Interest=a*LInterestRate;
	return Interest;
}

【main.cpp】
#include"Limited_Account.h"
#include"Free_Account.h"

int main()
{
	FreeAccount F;
	LimitedAccount L;
	int a=3;
	while(1)
	{
		cout<<"主菜单\n"
			<<"(1)活期账户\n"
			<<"(2)定期账户\n"
			<<"(3)查询账户信息\n"
			<<"(4)存款\n"
			<<"(5)取款\n"
			<<"(6)退出系统\n";
		int userChoice;
		for(;;)
		{
			cin>>userChoice;
			if (a!=1 && a!=0  && userChoice!=1 && userChoice!=2 && userChoice!=6)
			{
				system("cls");
				cout<<"未创建帐户,请选择:\n(1)创建活期帐户\n(2)创建定期帐户。\n(6)退出程序。"<<endl;
			}
			else break;
		}
		system("cls");
		switch(userChoice)
		{
		case 1:F.FinputData();a=1;break;
		case 2:L.LinputData();a=0;break;
		case 3:
			{
				if(a==1) F.Fshow();
				else L.Lshow();
			}
			break;
		case 4:
			{
				if(a==1) F.Deposit();
				else L.Deposit();
			}
			break;
		case 5:
			{
				if(a==1) F.Withdraw();
				else L.Withdraw();
			}
			break;
		case 6:return 0;
		default:return 0;
		}
		system("cls");
	}
}



已标记关键词 清除标记
相关推荐
要求编写程序模拟银行账户的存、取款操作。按要求完成以下步骤: 步骤1:编写程序Account.java,其中定义银行账户类Account。该类中有账号、姓名、 存款余额等数据域,余额默认是0;有存款、取款、获取当前余额等方法。其中账号为长度 为12位数字的字符串,姓名为字符串,存款余额为double。 步骤2:编写名为CreditAccount类的信用卡账户类。该类继承自Account类,增加一 个透支限额(double)数据域,透支限额默认为1000。同时该类账户取款时允许透支,但不 能超过透支限额。 步骤3:编写名为SavingAccount的储蓄账户类SavingAccount。该类继承自Account 类。该类账户取款时不允许透支。 步骤4:编写名为Bank的模拟银行类,其中可以存储多个类型可能是信用卡账户或储 蓄账户的对象(可以用数组或ArrayList实现)。该类包含以下方法: <1>开户:即增加一个新的账户,注意:不允许两个账户的账号相同 <2>销户:即删除一个已有的账户 <3>查询账户:根据一个账号,查询有无该账号的账户 <4>统计目前银行的存款总余额的方法。 <5>统计目前银行的信用卡账户总透支金额的方法。 <6>统计目前总账户数。 <7>统计目前信用卡账户数 <8>统计目前储蓄卡账户数 步骤5:编写客户端类Client.java完成以下功能: <1> 编写一个静态方法,创建一个银行对象,并随机生成10个账号从1000 0000 0000 0000到1000 0000 0000 0009,类型不同的账户。 <2> main方法中模拟几次开户操作。 <3> main方法中模拟几次销户操作。 <4> 模拟几个对指定账号的存款和取款操作。 <5> 输出银行的总账户数、总余额、总透支数、各类具体账户数。
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页