Account类:
#ifndef HEADER_ACCOUNT
#define HEADER_ACCOUNT

#include <string>
using std::string;

class Account


{
protected:
string acntNumber;
double balance;
public:

Account()
{}
Account(string acntNo,double balan=0.0);
virtual void display()const;

double getBalan()const
{return balance;}

void deposit(double amount)
{balance += amount; display();}

bool operator==(const Account&a)
{return acntNumber==a.acntNumber;}

virtual void withdrawal(double amount)
{return;}
};

#endif
#include "StdAfx.h"
#include "Account.h"
#include <iostream>

using namespace std;


Account::Account(string acntNo, double balan):acntNumber(acntNo),balance(balan)
{}


void Account::display() const
{
cout<<"Account:"<<acntNumber<<" = "<<balance<<endl;
}
Checking类:
#ifndef HEADER_CHECKING
#define HEADER_CHECKING

#include <string>
#include "account.h"
using std::string;

//汇款方式:信汇,电汇,其他

enum REMIT
{remitByPost,remitByCable,Other};


class Checking : public Account
{
REMIT remittance;
public:

Checking()
{}
Checking(string acntNo,double balan=0.0);
void display()const;
void withdrawal(double amount);

void setRemit(REMIT re)
{remittance = re;}
};

#endif

#include "StdAfx.h"
#include "Checking.h"
#include <iostream>
using namespace std;

Checking::Checking(string acntNo, double balan)

:remittance(REMIT::Other)
{
Account::acntNumber = acntNo;
Account::balance = balan;
}


void Checking::display() const
{
cout<<"Checking ";
Account::display();
}


void Checking::withdrawal(double amount)
{
if(remittance == REMIT::remitByPost)
amount +=30;
if(remittance == REMIT::remitByCable)
amount +=60;
if(balance<amount)
cout<<"Insufficient funds withdrawal: "<<amount<<endl;

else
{
balance -= amount;
Account::display();
}
}
Savings类:
#ifndef HEADER_SAVINGS
#define HEADER_SAVINGS

#include "account.h"
#include <string>
using std::string;


class Savings:public Account
{
static double minBalance;
public:

Savings()
{}
Savings(string acntNo,double balan=0.0);
void display()const;
void withdrawal(double amount);
};

#endif
#include "StdAfx.h"
#include "Savings.h"
#include <iostream>
using namespace std;

double Savings::minBalance =0;


Savings::Savings(string acntNo,double balan)
{
Account::acntNumber = acntNo;
Account::balance =balan;
}


void Savings::display() const
{
cout<<"Savings ";
Account::display();
}

void Savings::withdrawal(double amount)
{
if(balance+minBalance < amount)
cout<<"Insufficient funds withdrawal:"<<amount<<endl;

else
{
balance -=amount;
Account::display();
}
}
AccountList类:
#ifndef HEADER_ACCOUNTLIST
#define HEADER_ACCOUNTLIST

#include "account.h"

// ---------------------//

class Node
{
public:
Account& acnt;
Node *next,*prev;

Node(Account &a):acnt(a),next(0),prev(0)
{}

bool operator==(const Node& n)
{ return acnt == n.acnt;}//最终比较acntNumber

~Node()
{}
};
// ---------------------//
class AccountList


{
int size;
Node *first;
public:

AccountList():first(0),size(0)
{};

Node* getFirst()const
{ return first;}

int getSize()const
{ return size;}
void add(Account &a);
void remove(string acntNo);
Account* find(string acntNo)const;

bool isEmpty()const
{return !size;}
void display()const;
~AccountList();
};

#endif
#include "StdAfx.h"
#include "AccountList.h"

#include <iostream>
using namespace std;


void AccountList::add(Account &a)
{
//自动把新元素放在栈首
Node* pN=new Node(a);

if(first)
{
pN->next = first;
first->prev = pN;
}
first = pN;
size ++;
}//--------------------

void AccountList::remove(string acntNo)
{
Account a(acntNo);
for(Node *p = first;p;p=p->next)

if(*p==Node(a))
{ //compare调用Account的==方法
if(p->prev) p->prev->next = p->next;
if(p->next) p->next->prev = p->prev;
if(p==first) first = p->next;
delete p;
size--;
break;
}
}//--------------------

Account* AccountList::find(std::string acntNo) const
{
Account a(acntNo);
for(Node* p=first;p;p = p->next)
if(*p==Node(a))
return &(p->acnt);
return 0;
}//--------------------

void AccountList::display()const
{
cout<<"There are "<<size<<" accounts."<<endl;
for(Node* p=first;p;p=p->next)
(p->acnt).display();
}//--------------------

AccountList::~AccountList()
{

for(Node* p=first;p=first;delete p)
{
first = first->next;
}
}
题目:
使用Account类、Savings类、Checking类及AccountList类,编写一个应用程序,它从文件account.txt中读入一些帐户号和对应的存款额,创建若干个Savings和Checking帐户,直到遇到一个结束标志“x 0”,并输出所有帐户号的存款数据。
account.txt内容如下:
savings 123 70000
checking 661 20000
savings 128 2000
savings 131 5000
checking 681 200000
checking 688 10000
x 0
程序如下:
#include "stdafx.h"
#include "savings.h"
#include "checking.h"
#include "accountlist.h"
#include<iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
//习题12.1
ifstream in("account.txt");
string accType,accNo;
double balance;
AccountList list;
for(string s;getline(in,s);)
{
istringstream sin(s);
sin>>accType;
if(accType!="x"){
sin>>accNo;
sin>>balance;
if(accType== "savings"){
Savings *s1 = new Savings(accNo,balance);
list.add(*s1);
}
else if (accType=="checking"){
Checking*c1 = new Checking(accNo,balance);
list.add(*c1);
}
}
}
if(list.getSize()>0)
list.display();
system("pause");
return 0;
}