C.Primer.Plus(第六版)第10章 编程练习

来源:互联网 发布:全国高校网络培训中心 编辑:程序博客网 时间:2024/06/02 17:17

// 10.1

// bank.h#ifndef BANK__H__#define BANK__H__class Bank{private:    enum{SIZE = 20 };    char bank_name[SIZE];    char account[SIZE];    double deposit;public:    Bank();    Bank(const char* _name ,const char* _account,double _deposit = 0);    ~Bank();    void showData() const;    void pushDeposit(double num);    void popDeposit(double num);};#endif
//Bank.cpp#include <iostream>#include <string>#include "bank.h" Bank::Bank(){    strncpy(bank_name,"no name",7);    bank_name[7] = '\0';    strncpy(account,"null",4);    account[4] = '\0';    deposit = 0;    std::cout<<"use default constructor\n";} Bank::Bank(const char* _name,const char* _account,double _deposit) {    strcpy(bank_name,_name);    strcpy(account,_account);    deposit = _deposit;    std::cout<<"use no_default constructor\n"; } Bank::~Bank() {    std::cout<<"Bye, "<<bank_name<<std::endl; } void Bank::showData() const {    std::cout<<"The user bank_name is: "<<bank_name<<std::endl;    std::cout<<"The user account is: "<<account<<std::endl;    std::cout<<"The user deposit is: "<<deposit<<std::endl; } void Bank::pushDeposit(double num) {    if(num>DBL_MAX)        std::cout<<"can't enter extra large number.\n";    else        deposit += num; } void Bank::popDeposit(double num) {    if(num>deposit)        std::cout<<"the num more than the deposit.\n";    else        deposit -= num; }
//main.cpp#include <iostream>#include "bank.h"int main(){    using namespace std;    Bank user_one = Bank("luopeng","mmdnxh",2000);    Bank user_two;    user_two.showData();    user_one.showData();    user_one.popDeposit(3000);    user_one.showData();    user_one.popDeposit(1999);    user_one.showData();    user_one.pushDeposit(200);    user_one.showData();}

//10.2

//person.h#ifndef PERSON__H__#define PERSON__H__class Person{private:    static const int LIMIT = 25;    std::string lname;    char fname[LIMIT];public:    Person(){lname = "",fname[0]= '\0';}    Person(const std::string & ln,const char* fn = "Heyyou");    void show() const;    void FormalShow() const;};#endif
//person.cpp#include <iostream>#include <string>#include "person.h"using std::cout;using std::cin;using std::endl;using std::string;Person::Person(const string & ln,const char* fn){    lname = ln;    strncpy(fname,fn,24);    fname[24]='\0';}void Person::show() const{    cout<<"the man firstname is:"<<fname<<" ,and the lastname is"<<lname<<endl;}void Person::FormalShow() const{    cout<<"the man lastname is:"<<lname<<" ,and the firstname is"<<fname<<endl;}
//main.cpp#include <iostream>#include "person.h"#include <string>int main(){    using namespace std;    Person one;    Person two("Smythecraft");    Person three("Dimwiddy","Sam");    one.show();    one.FormalShow();    two.show();    three.show();}

//10.3

//golf.h#ifndef GOLF__H__#define GOLF__H__class Golf{private:    static const int LEN = 40;    char fullname[LEN];    int handicap;public:    Golf();    Golf(const char* name,int hc);    void setGolf(const char* name,int hc);    void newHandicap(int hc);    void showGolf() const;};#endif
//golf.cpp#include <iostream>#include "golf.h"#include <string>Golf::Golf(){    strncpy(fullname,"null",4);    fullname[4]='\0';    handicap = 0;}Golf::Golf(const char* name,int hc){    strncpy(fullname,name,39);    fullname[39]='\0';    handicap = hc;}void Golf::setGolf(const char* name,int hc){    *this=Golf::Golf(name,hc);//将产生的临时对象赋给调用这个方法的对象}void Golf::newHandicap(int hc){    handicap = hc;}void Golf::showGolf() const {    std::cout<<"The fullname is: "<<fullname<<" , and the handicap is : "<<handicap<<std::endl;}
//main.cpp#include <iostream>#include "golf.h"#include <string>int main(){    using namespace std;    Golf golf_one;    golf_one.showGolf();    Golf golf_two = Golf("mmdnxh",20);    golf_two.newHandicap(10);    golf_two.showGolf();    golf_two.setGolf("xiaoming",10);    golf_two.showGolf();}

//10.4

//sale.h#include <iostream>#ifndef __SALE__H__#define __SALE__H__namespace SALES{    class Sales    {    private:        static const int QUARTERS = 4;        double sales[QUARTERS];        double average;        double max;        double min;    public:        Sales(const double ar[],int n);        Sales();        void showSales() const;    };}#endif
//sale.cpp#include <iostream>#include "sale.h"using std::cin;using std::cout;using std::endl;using std::string;namespace SALES{    static double calcAverage(double arr[], int arrsize)    {        double sum = 0;        for(int i = 0;i<arrsize;i++)            sum+=arr[i];        return (sum/arrsize);    }    static double calcMax(double arr[], int arrsize)    {        int idMax = 0;        for(int i =1;i<arrsize;i++)        {            if(arr[i]>arr[idMax])                idMax = i;        }        return arr[idMax];    }    static double calcMin(double arr[], int arrsize)    {        int idMin = 0;        for(int i =1;i<arrsize;i++)        {            if(arr[i]<arr[idMin])                idMin = i;        }        return arr[idMin];    }Sales::Sales(const double ar[],int n)    {        int times = n<QUARTERS?n:QUARTERS;        for(int i = 0;i<times;i++)            (*this).sales[i]=ar[i];        for(int i =times;i<QUARTERS;i++)            this->sales[i] = 0;        this->average = calcAverage(this->sales, times);          this->max = calcMax(this->sales, times);          this->min = calcMin(this->sales, times);     }Sales::Sales()    {        cout << "Please enter " << QUARTERS << " sale record:";          int times = QUARTERS;          double  arr[QUARTERS] = {0};          for (int i = 0;i < QUARTERS; i++) {              cin >> arr[i];              if (!cin) {                  times = i;  //表示输入异常                break;              }          }          *this = Sales::Sales(arr, QUARTERS);  //先得到初始数据在进行操作        this->average = calcAverage(this->sales, times);          this->max = calcMax(this->sales, times);         this->min = calcMin(this->sales, times);      }    void Sales::showSales() const    {        cout << "sales: ";          for(int i = 0;i<QUARTERS;i++)             cout<<this->sales[i]<<" ";        cout << endl;          cout << "average: " <<this->average << endl;          cout << "max: " << this->max << endl;          cout << "min: " << this->min << endl;      }}
//main.cpp#include <iostream>  #include "sale.h" using namespace std;int main ()   {           using namespace SALES;       const double salesList[] = {2.24,234,53,23.6,6.4};      Sales salesCar(salesList, (sizeof(salesList)/sizeof(salesList[0])));  ;     salesCar.showSales();      Sales salesBus;     salesBus.showSales();      }   

//10.5

//stack.h// class definition for the stack ADT#ifndef STACK__H__#define STACK__H__struct customer    {        char fullname[35];        double payment;    };typedef customer Item;class Stack{private:    enum{MAX = 10};    Item items[MAX];    int top;public:    Stack();    bool isempty() const;    bool isfull() const;    bool push();    bool pop();};#endif
//stack.cpp// stack.cpp Stack member functions#include "stack.h"#include <iostream>#include <string>Stack::Stack(){    top  = 0;}bool Stack::isempty() const{    return top == 0;}bool Stack::isfull() const{    return top == MAX;}bool Stack::push(){    if((*this).top<MAX)    {        std::cout<<"Please enter the fullname:";        std::string str;        std::cin>>str;        strncpy((*this).items[top].fullname,str.c_str(),sizeof(str)>34?34:sizeof(str));        (*this).items[top].fullname[34]='\0';        std::cout<<"Please enter the payment:";        while(!(std::cin>>(*this).items[top].payment))//判断是否输入数字        {            std::cin.clear();//将标志位从fail(1)改为0,再次打开输出检测            std::cout<<"Please enter the type of matching data:";            //while (std::cin.get() != '\n')//读取第一个字符后的多余的字符。检测到\n表示读取完毕,输入流为空。            //  continue;            std::cin.sync();//将输入流清空,与上面等价        }        top++;        return true;    }    else        return false;}bool Stack::pop() {    static double payment = 0.0;    if(top>0)    {        //*(this->items) = items[--top];        payment += (*this).items[--top].payment;        std::cout<<"the total quantity is "<<payment<<std::endl;        return true;    }    else        return false;}
//main.cpp//stacker.cpp -- testing the Stack class#include <iostream>#include "stack.h"int main(){    using namespace std;    Stack st;    char ch;    cout<<"Please enter A to add a purchase order.\n"        <<"P to process a PO , or Q to quit\n";    while(cin>>ch &&toupper(ch)!='Q')    {        while (cin.get() != '\n')//读取第一个字符后的多余的字符。检测到\n表示读取完毕,输入流为空。            continue;        if(!isalpha(ch))//判断第一个字符的合理性        {            cout<<'\a';            continue;        }        switch(ch)        {        case 'a':        case 'A':            if(st.isfull())                cout<<"stack already full\n";            else             {                cout<<"Enter a sturct member to add.\n ";                st.push();                cout<<"Add success!\n";            }            break;        case 'p':        case 'P':            if(st.isempty())                cout<<"stack already empty\n";            else{                st.pop();            }            break;//没有使用default        }        cout<<"Please enter A to add a purchase order.\n"            <<"P to process a PO , or Q to quit\n";    }    cout<<"Bye!\n";    return 0;}

//10.6

//move.h#ifndef MOVE__H__#define MOVE__H__class Move{private:    double x;    double y;public:    Move(double a = 0,double b = 0);    void showmove() const;    Move add(const Move & m) const;    void reset(double a = 0,double b =0);};#endif
//move.cpp#include <iostream>#include "move.h"Move::Move(double a,double b){    this->x = a;    this->y = b;}void Move::showmove() const{    std::cout<<"the x is "<<x<<" ,and the y is: "<<y<<std::endl;}Move Move::add(const Move & m) const{    return  Move::Move(m.x,m.y);}void Move::reset(double a , double b){    this->x = a;    this->y = b;}
//main.cpp#include <iostream>#include "move.h"int main(){    using namespace std;    Move move_one(12,11);    move_one.showmove();    Move move_two(110.1,312);    Move move_three = move_one.add(move_two);    move_three.showmove();    move_three.reset();    move_three.showmove();    move_three.reset(123,121);    move_three.showmove();}

//10.7

//plorg.h#ifndef PLORG__H__#define PLORG__H__class Plorg{private:    char fullname[20];    int ci;public:    Plorg(const char* name ="Plorga",int _ci =50);    void resetCi(int _ci);    void showPlorg();};#endif
//plorg.cpp#include <iostream>#include "plorg.h"#include <string>Plorg::Plorg(const char* name ,int _ci){    int len =(strlen(name)>19?19:strlen(name));    strncpy((*this).fullname,name,len);    (*this).fullname[len] = '\0';    (*this).ci = _ci;}void Plorg::resetCi(int _ci){    (*this).ci = _ci;}void Plorg::showPlorg(){    std::cout<<"the fullname is: "<<(*this).fullname<<" ,and the ci is : "<<ci<<std::endl;}
//main.cpp#include <iostream>#include "plorg.h"#include <string>int main(){    Plorg plorg_one = Plorg();    Plorg plorg_two = Plorg("mmdnxh",20);    plorg_one.showPlorg();    plorg_two.showPlorg();    plorg_two.resetCi(12);    plorg_two.showPlorg();}

//10.8

//list.h#ifndef LIST__H__#define LIST__H__#include<iostream>typedef double Item;void showList(Item & l);class List{private:    enum{MAX = 10};    Item items;    int top;public:    List();    bool isempty() const;    bool isfull() const;    bool push();    void visit(void (*pf)(Item &));};#endif
list.cpp// stack.cpp Stack member functions#include "list.h"#include <iostream>#include <string>void showList(Item & l) {    std::cout<<"The list payment is:"<<l<<std::endl;}List::List(){    top  = 0;}bool List::isempty() const{    return top == 0;}bool List::isfull() const{    return top == MAX;}bool List::push(){    if((*this).top<MAX)    {        std::cout<<"Please enter the payment:";        while(!(std::cin>>items))//判断是否输入数字        {            std::cin.clear();//将标志位从fail(1)改为0,再次打开输出检测            std::cout<<"Please enter the type of matching data:";            //while (std::cin.get() != '\n')//读取第一个字符后的多余的字符。检测到\n表示读取完毕,输入流为空。            //  continue;            std::cin.sync();//将输入流清空,与上面等价        }        top++;        return true;    }    else        return false;}void List::visit(void (*pf)(Item &)){    pf((*this).items);}
//main.cpp//stacker.cpp -- testing the Stack class#include <iostream>#include "list.h"int main(){    using namespace std;    List list;    char ch;    cout<<"Please enter A to add a purchase order.\n"        <<"v to show a PO , or Q to quit\n";    while(cin>>ch &&toupper(ch)!='Q')    {        while (cin.get() != '\n')//读取第一个字符后的多余的字符。检测到\n表示读取完毕,输入流为空。            continue;        if(!isalpha(ch))//判断第一个字符的合理性        {            cout<<'\a';            continue;        }        switch(ch)        {        case 'a':        case 'A':            if(list.isfull())                cout<<"list already full\n";            else             {                cout<<"Enter a sturct member to add.\n ";                list.push();                cout<<"Add success!\n";            }            break;        case 'v':        case 'V':            if(list.isempty())                cout<<"list already empty\n";            else{                double x = 20;                //pf = showList;                list.visit(showList);            }            break;//没有使用default        }        cout<<"Please enter A to add a purchase order.\n"            <<"v to show a PO , or Q to quit\n";    }    cout<<"Bye!\n";    return 0;}