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

// 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值