C++ Primer Plus 13章源码

C++ Primer Plus 第十三章书上源码

记录我看C++ Primer Plus(第六版)第十三章源代码

13.1

//13.1
#ifndef TABTENN0_H_
#define TABTENN0_H_
#include<string>
using std::string;
class TableTennisPlayer
{
private:
    string firstname;
    string lastname;
    bool hasTable;
public:
    TableTennisPlayer(const string & fn="none", const string & ln = "none", bool ht = false);
    void Name()const;
    bool HasTable()const {
        return hasTable;
    };
    void ResetTable(bool v) {
        hasTable = v;
    };
};
#endif

13.2

//13.2
#include"tabtenn0.h"
#include<iostream>
TableTennisPlayer::TableTennisPlayer(const string & fn,const string & ln,bool ht):firstname(fn),lastname(ln),hasTable(ht){}
void TableTennisPlayer::Name()const
{
    std::cout<<lastname<<", "<<firstname;
}

13.3

#include<iostream>
#include"tabtenn0.h"
int main(void)
{
    using std::cout;
    TableTennisPlayer player1("Chuck", "Blizzard", true);
    TableTennisPlayer player2("Tara", "Boomdea", false);
    player1.Name();
    if (player1.HasTable())
        cout<<": has a table.\n";
    else
        cout<<": hasn't a table.\n";
    player2.Name();
    if (player2.HasTable())
        cout<<": has a table";
    else
        cout<<": hasn't a table.\n";
    return 0;
}

13.4

//13.4
#ifndef TABTENN_H_
#define TABTENN_H_
#include<string>
using std::string;
class TableTennisPlayer
{
private:
    string firstname;
    string lastname;
    bool hasTable;
public:
    TableTennisPlayer(const string &fn="none", const string &ln="none", bool ht =false);
    void Name()const;
    bool HasTable()const {
        return hasTable;
    };
    void ResetTable(bool v) {
        hasTable=v;
    };
};
class RatedPlayer :public TableTennisPlayer
{
private:
    unsigned int rating;
public:
    RatedPlayer(unsigned int r=0, const string& fn="none", const string & ln="none", bool ht=false);
    RatedPlayer(unsigned int r, const TableTennisPlayer & tp);
    unsigned int Rating()const {
        return rating;
    };
    void ResetRating(unsigned int r) {
        rating =r;
    };
};
#endif

13.5

//13.5
#include"tabtenn1.h"
#include<iostream>
TableTennisPlayer::TableTennisPlayer(const string &fn,const string &ln,bool ht):firstname(fn),lastname(ln),hasTable(ht){}
void TableTennisPlayer::Name()const
{
    std::cout<<lastname<<", "<<firstname;
}
RatedPlayer::RatedPlayer(unsigned int r,const string & fn,const string & ln,bool ht):TableTennisPlayer(fn,ln,ht)
{
    rating=r;
}
RatedPlayer::RatedPlayer(unsigned int r,const TableTennisPlayer & tp):TableTennisPlayer(tp)
{
    rating=r;
}

13.6

#include<iostream>
#include"tabtenn1.h"
int main(void)
{
    using std::cout;
    using std::endl;
    TableTennisPlayer player1("Tara", "Boomdea", false);
    RatedPlayer rplayer1(1140, "Mallory", "Duck", true);
    rplayer1.Name();
    if (rplayer1.HasTable())
        cout<<": has a table.\n";
    else
        cout<<": hasn't a table.\n";
    player1.Name();
    if (player1.HasTable())
        cout<<": has a table";
    else
        cout<<": hasn't a table.\n";
    cout<<"Name: ";
    rplayer1.Name();
    cout<<"; Rating: "<<rplayer1.Rating()<<endl;
    RatedPlayer rplayer2(1212, player1);
    cout<<"Name: ";
    rplayer2.Name();
    cout<<"; Rating: "<<rplayer2.Rating()<<endl;
    return 0;
}

13.7

//13.7
#ifndef BRASS_H_
#define BRASS_H_
#include<string>
class Brass
{

private:
    std::string fullName;
    long acctNum;
    double balance;
public:
    Brass(const std::string &s="Nullbody", long an=-1, double bal=0.0);
    void Deposit(double amt);
    virtual void Withdraw(double amt);
    double Balance()const;
    virtual void ViewAcct()const;
    virtual ~Brass() {};
};
class BrassPlus :public Brass
{
private:
    double maxLoan;
    double rate;
    double owesBank;
public:
    BrassPlus(const std::string &s="Nullbody", long an=-1, double bal=0.0, double ml=500, double r=0.11125);
    BrassPlus(const Brass& ba, double ml=500, double r=0.11125);
    virtual void ViewAcct()const;
    virtual void Withdraw(double amt);
    void ResetMax(double m) {
        maxLoan=m;
    };
    void ReseRate(double r) {
        rate=r;
    };
    void ResetOwes() {
        owesBank=0;
    };
};
#endif

13.8

//13.8
#include<iostream>
#include"brass.h"
using std::cout;
using std::endl;
using std::string;
typedef std::ios_base::fmtflags format;
typedef std::streamsize precis;
format setFormat();
void restore(format f, precis p);
Brass::Brass(const string &s ,long an,double bal)
{
    fullName=s;
    acctNum=an;
    balance=bal;
}
void Brass::Deposit(double amt)
{
    if (amt<0)
        cout<<"Negative deposit not allowed; "
        <<"deposit is cancelled.\n";
    else
        balance += amt;
}
void Brass::Withdraw(double amt)
{
    format initialState=setFormat();
    precis prec=cout.precision(2);
    if (amt<0)
        cout<<"Withdrawal amount must be positive; "
        <<"withdrawal canceled.\n";
    else if (amt<=balance)
        balance -= amt;
    else
        cout<<"Withdrawal amount of $"<<amt
        <<" exceeds youe balance.\n"
        <<"Withdrawal canceled.\n";
    restore(initialState, prec);

}
double Brass::Balance()const
{
    return balance;
}
void Brass::ViewAcct()const
{
    format initialState=setFormat();
    precis prec=cout.precision(2);
    cout<<"Client:"<<fullName<<endl;
    cout<<"Account Number: "<<acctNum<<endl;
    cout<<"Balance: $"<<balance<<endl;
    restore(initialState, prec);
}
//----------------------------------------------------------------
BrassPlus::BrassPlus(const string & s,long an,double bal,double ml,double r):Brass(s,an,bal)
{
    maxLoan=ml;
    owesBank=0.0;
    rate=r;
}
BrassPlus::BrassPlus(const Brass & ba,double ml,double r)
:Brass(ba)
{
    maxLoan=ml;
    owesBank=0.0;
    rate=r;
}
void BrassPlus::ViewAcct()const
{
    format initialState=setFormat();
    precis prec=cout.precision(2);
    Brass::ViewAcct();
    cout<<"Maximum loan: $"<<maxLoan<<endl;
    cout<<"Owed to bank: $"<<owesBank<<endl;
    cout.precision(3);
    cout<<"Loan Rate: "<<100*rate<<"%\n";
    restore(initialState, prec);
}
void BrassPlus::Withdraw(double amt)
{
    format initialState=setFormat();
    precis prec=cout.precision(2);
    double bal=Balance();
    if (amt<=bal)
        Brass::Withdraw(amt);
    else if (amt<=bal+maxLoan-owesBank)
    {
        double advance=amt-bal;
        owesBank += advance*(1.0+rate);
        cout<<"Bank advance: $"<<advance<<endl;
        cout<<"Finance charge: $"<<advance*rate<<endl;
        Deposit(advance);
        Brass::Withdraw(amt);
    }
    else
        cout<<"Credit limit exceeded. Transaction cancelled.\n";
    restore(initialState, prec);
}
format setFormat()
{
    return cout.setf(std::ios_base::fixed, std::ios_base::floatfield);

}
void restore(format f,precis p)
{
    cout.setf(f, std::ios_base::floatfield);
    cout.precision(p);
}

13.9

#include<iostream>
#include"brass.h"
int main()
{
    using std::cout;
    using std::endl;
    Brass Piggy("Porcelot Pigg", 381299, 4000.00);
    BrassPlus Hoggy("Horatio Hogg", 382288, 3000.00);
    Piggy.ViewAcct();
    cout<<endl;
    Hoggy.ViewAcct();
    cout<<endl;
    cout<<"Depositing $1000 into the Hogg Account:\n";
    Hoggy.Deposit(1000.00);
    cout<<"New Balance: $"<<Hoggy.Balance()<<endl;
    cout<<"Withdrawing $4200 from the Pigg Account:\n";
    Piggy.Withdraw(4200.00);
    cout<<"Pigg account balance: $"<<Piggy.Balance()<<endl;
    cout<<"Withdrawing $4200 from the Hogg Account:\n";
    Hoggy.Withdraw(4200.00);
    Hoggy.ViewAcct();
    return 0;
}

13.10

#include<iostream>
#include<string>
#include"brass.h"
const int CLIENTS = 4;
int main()
{
    using std::cin;
    using std::cout;
    using std::endl;

    Brass*p_clients[CLIENTS];
    std::string temp;
    long tempnum;
    double tempbal;
    char kind;
    for(int i=0;i<CLIENTS;i++)
    { 
        cout<<"Enter client's name: ";
        getline(cin, temp);
        cout<<"Enter client's account number: ";
        cin>>tempnum;
        cout<<"Enter opening balance: $";
        cin>>tempbal;
        cout<<"Enter 1 for Brass Account or "
            <<"2 for BrassPlus Account: ";
        while (cin>>kind&&(kind!='1'&&kind!='2'))
            cout<<"Enter either 1 or 2: ";
        if (kind=='1')
            p_clients[i]= new Brass(temp, tempnum, tempbal);
        else
        { 
            double tmax, trate;
            cout<<"Enter the overdraft limit: $";
            cin>>tmax;
            cout<<"Enter the interest rate "
                <<"as a decimal fraction: ";
            cin>>trate;
            p_clients[i]= new BrassPlus(temp, tempnum, tempbal,tmax,trate);
        }
        while(cin.get()!='\n')
        { 
            continue;
        }
    }
    cout<<endl;
    for(int i=0;i<CLIENTS;i++)
    {   
        p_clients[i]->ViewAcct();
        cout<<endl;
    }
    for(int i=0;i<CLIENTS;i++)
    { 
        delete p_clients[i];
    }
    cout<<"Done.\n";
    return 0;
}
   

13.11

//13.11
#ifndef ACCTABC_H_
#define ACCTABC_H_
#include<iostream>
#include<string>
class AcctABC
{
private:
     std::string fullName;
    long acctNum;
    double balance;
protected:
    struct Formatting
    {
        std::ios_base::fmtflags flag;
        std::streamsize pr;
    };
    const std::string & FullName()const {
        return fullName;
    }
    long AcctNum()const {
        return acctNum;
    }
    Formatting SetFormat()const;
    void Restore(Formatting & f)const;
public:
    AcctABC(const std::string & s="Nullbody", long an=-1, double bal=0.0);
    void Deposit(double amt);
    virtual void Withdraw(double amt)=0;
    double Balance()const {
        return balance;
    };
    virtual void ViewAcct()const=0;
    virtual ~AcctABC() {}
};
class Brass :public AcctABC
{
public:
    Brass(const std::string & s="Nullbody", long an=-1, double bal=0.0) :AcctABC(s, an, bal) {}
    virtual void Withdraw(double amt);
    virtual void ViewAcct()const;
    virtual ~Brass() {
    }
};
class BrassPlus :public AcctABC
{
private:
    double maxLoan;
    double rate;
    double owesBank;
public:
    BrassPlus(const std::string & s="Nullbody", long an=-1, double bal=0.0, double ml=500, double r=0.10);
    BrassPlus(const Brass&ba, double ml=500, double r=0.1);
    virtual void ViewAcct()const;
    virtual void Withdraw(double amt);
    void ResetMax(double m) {
        maxLoan=m;
    }
    void ResetRate(double r) {
        rate=r;
    };
    void ResetOwes()
    {
        owesBank=0;
    }

};
#endif

13.12

//13.12
#include<iostream>
#include"acctabc.h"
using std::cout;
using std::ios_base;
using std::endl;
using std::string;
AcctABC::AcctABC(const string & s,long an,double bal)
{
    fullName = s;
    acctNum = an;
    balance=bal;
}
void AcctABC::Deposit(double amt)
{
    if (amt<0)
        cout<<"Negative deposit not allowed; "
        <<"deposit is cancelled.\n";
    else
        balance+=amt;
}
void AcctABC::Withdraw(double amt)
{
    balance-=amt;
}
AcctABC::Formatting AcctABC::SetFormat() const
{
    Formatting f;
    f.flag=cout.setf(ios_base::fixed, ios_base::floatfield);
    f.pr=cout.precision(2);
    return f;
}
void AcctABC::Restore(Formatting & f) const
{
    cout.setf(f.flag, ios_base::floatfield);
    cout.precision(f.pr);
}
//---------------------------------
void Brass::Withdraw(double amt)
{
    if (amt<0)
        cout<<"Withdrawal amount must be positive; "
        <<"withdrawal canceled.\n";
    else if (amt<=Balance())
        AcctABC::Withdraw(amt);
    else
        cout<<"Withdrawal amount of $"<<amt
        <<" exceeds your balance.\n"
        <<"Withdrawal anceled.\n";
}
void Brass::ViewAcct()const
{
    Formatting f=SetFormat();
    cout<<"Brass Client: "<<FullName()<<endl;
    cout<<"Account Number: "<<AcctNum()<<endl;
    cout<<"Balance: $"<<Balance()<<endl;
    Restore(f);
}
BrassPlus::BrassPlus(const string & s,long an,double bal,double ml,double r):AcctABC(s,an,bal)
{
    maxLoan=ml;
    owesBank=0.0;
    rate=r;
}
BrassPlus::BrassPlus(const Brass & ba,double ml,double r):AcctABC(ba)
{
    maxLoan=ml;
    owesBank=0.0;
    rate=r;
}
void BrassPlus::ViewAcct()const 
{
    Formatting f=SetFormat();
    cout<<"BrassPlus Client: "<<FullName()<<endl;
    cout<<"Account Number: "<<AcctNum()<<endl;
    cout<<"Balance: $"<<Balance()<<endl;
    cout<<"Maximum loan: $"<<maxLoan<<endl;
    cout<<"Owed to bank: $"<<owesBank<<endl;
    cout.precision(3);
    cout<<"Loan Rate: "<<100*rate<<"%\n";
    Restore(f);
}
void BrassPlus::Withdraw(double amt)
{
    Formatting f=SetFormat();
    double bal=Balance();
    if (amt<=bal)
        AcctABC::Withdraw(amt);
    else if (amt<=bal+maxLoan-owesBank)
    {
        double advance = amt-bal;
        owesBank += advance *(1.0+rate);
        cout<<"Bank advance: $"<<advance<<endl;
        cout<<"Finance charge: $"<<advance*rate<<endl;
        Deposit(advance);
        AcctABC::Withdraw(amt);
    }
    else
        cout<<"Credit limit exceeded. Transaction cancelled.\n";
    Restore(f);
}

13.13

//13.13
#include"dma.h"
#include<cstring>
baseDMA::baseDMA(const char *l,int r)
{
    label = new char[std::strlen(l)+1];
    std::strcpy(label, l);
    rating = r;
}
baseDMA::baseDMA(const baseDMA & rs)
{
    label= new char[std::strlen(rs.label)+1];
    std::strcpy(label, rs.label);
    rating =rs.rating;
}
baseDMA::~baseDMA()
{
    delete[]label;
}
baseDMA & baseDMA::operator=(const baseDMA &rs)
{
    if (this == &rs)
        return *this;
    delete[] label;
    label = new char[std::strlen(rs.label)+1];
    std::strcpy(label, rs.label);
    rating=rs.rating;
    return *this;
}
std::ostream & operator<<(std::ostream & os ,const baseDMA & rs)
{
    os<<"Label: "<<rs.label<<std::endl;
    os<<"Rating: "<<rs.rating<<std::endl;
    return os;
}
//------------------------------
lacksDMA::lacksDMA(const char *c,const char * l ,int r):baseDMA(l,r)
{
    std::strncpy(color,c,39);
    color[39]='\0';
}
lacksDMA::lacksDMA(const char *c,const baseDMA &rs):baseDMA(rs)
{
    std::strncpy(color, c, COL_LEN-1);
    color[COL_LEN-1]='\0';
}
std::ostream& operator <<(std::ostream & os,const lacksDMA & ls)
{
    os<<(const baseDMA &)ls;
    os<<"Color: "<<ls.color<<std::endl;
    return os;
}
//----------------------------------------------
hasDMA::hasDMA(const char *s, const char *l ,int r) :baseDMA(l, r)
{
    style =new char[std::strlen(s)+1];
    std::strcpy(style, s);
}
hasDMA::hasDMA(const char *s,const baseDMA &rs):baseDMA(rs)
{
    style=new char[std::strlen(s)+1];
    std::strcpy(style, s);
}
hasDMA::hasDMA(const hasDMA & hs):baseDMA(hs)
{
    style =new char[std::strlen(hs.style)+1];
    std::strcpy(style, hs.style);
}
hasDMA::~hasDMA()
{
    delete[]style;
}
hasDMA & hasDMA::operator=(const hasDMA & hs)

{
    if (this ==&hs)
        return *this;
    baseDMA::operator=(hs);
    delete[]style;
    style= new char[std::strlen(hs.style)+1];
    std::strcpy(style, hs.style);
    return *this;
}
std::ostream & operator <<(std::ostream & os,const hasDMA & hs)
{
    os<<(const baseDMA &)hs;
    os<<"Style: "<<hs.style<<std::endl;
    return os;
}

13.14

//13.14
#ifndef DMA_H_
#define DMA_H_
#include<iostream>
class baseDMA
{
private:
    char * label;
    int rating;
public:
    baseDMA(const char * l="null", int r=0);
    baseDMA(const baseDMA & rs);
    virtual ~baseDMA();
    baseDMA & operator=(const baseDMA & rs);
    friend std::ostream & operator<<(std::ostream & os, const baseDMA & rs);

};
class lacksDMA :public baseDMA
{
private:
    enum {
        COL_LEN=40
    };
    char color[COL_LEN];
public:
    lacksDMA(const char * c="blank", const char * l="null", int r=0);
    lacksDMA(const char *c, const baseDMA & rs);
    friend std::ostream & operator<<(std::ostream &os, const lacksDMA & rs);
};
class hasDMA :public baseDMA
{
private:
    char *style;
public:
    hasDMA(const char *s ="none", const char *l="null", int r=0);
    hasDMA(const char *s, const baseDMA &rs);
    hasDMA(const hasDMA &hs);
    ~hasDMA();
    hasDMA & operator =(const hasDMA &rs);
    friend std::ostream&operator<<(std::ostream & os, const hasDMA & rs);
};
#endif

13.15

//13.5
#include"tabtenn1.h"
#include<iostream>
TableTennisPlayer::TableTennisPlayer(const string &fn,const string &ln,bool ht):firstname(fn),lastname(ln),hasTable(ht){}
void TableTennisPlayer::Name()const
{
    std::cout<<lastname<<", "<<firstname;
}
RatedPlayer::RatedPlayer(unsigned int r,const string & fn,const string & ln,bool ht):TableTennisPlayer(fn,ln,ht)
{
    rating=r;
}
RatedPlayer::RatedPlayer(unsigned int r,const TableTennisPlayer & tp):TableTennisPlayer(tp)
{
    rating=r;
}

13.16

#include<iostream>
#include"dma.cpp"

int main()
{
    using std::cout;
    using std::endl;
    baseDMA shirt("Portabelly", 8);
    lacksDMA balloon("red","Blimpo",4);
    hasDMA map("Mercator", "Buffalo Keys", 5);
    cout<<"Displaying baseDMA object:\n";
    cout<<shirt<<endl;
    cout<<"Displaying lacksDMA object:\n";
    cout<<balloon<<endl;
    cout<<"Displaying hsDMA object:\n";
    cout<<map<<endl;
    lacksDMA balloon2(balloon);
    cout<<"Result of lacksDMA copy:\n";
    cout<<balloon2<<endl;
    hasDMA map2;
    map2=map;
    cout<<"Result of hasDMA assignment:\n";
    cout<<map2<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/damowangsx/article/details/107913011