2020-12-30 C++ Primer Plus 第十章 对象和类 编程练习

编程练习

1.为复习题5描述的类提供定义,并编写一个小程序来演示所有的特性

bank.h

#include <string>
class Bank
{
private:
    std::string name;
    std::string account;
    double money;
public:
    Bank(const std::string &name,const std::string &account,double m=0.0);
    void show() const;
    void deposit(double number);
    void withdraw(double number);

};

bank.cpp

#include "bank.h"
#include <iostream>
#include <string>
Bank::Bank(const std::string &user_name, const std::string &user_account, double m) {
    name=user_name;
    account=user_account;
    money=m;
}
void Bank::show() const
{
    std::cout << "name:" << name << std::endl;
    std::cout << "Bank account:" << account << std::endl;
    std::cout << "balance:" << money << std::endl;
}
void Bank::deposit(double number)
{
    money+=number;
}
void Bank::withdraw(double number)
{
    money-=number;
}

main.cpp

#include "bank.h"
#include <iostream>
int main()
{
    Bank b1=Bank("Reza","reza123",0.0);
    b1.show();
    std::cout << "add 30 yuan to my account"<< std::endl;
    b1.deposit(30);
    b1.show();
    std::cout << "withdraw 15 yuan from my account"<< std::endl;
    b1.withdraw(15);
    b1.show();
}

2.请提供未定义的方法的代码,以完成这个类的实现。再编写一个使用这个类的程序,它使用了三种可能的构造函数调用(没有参数、一个参数、两个参数)以及两种显示方法
person.h

#include <string>
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;
};

person.cpp

#include "person.h"
#include <iostream>
#include <cstring>
Person::Person(const std::string &ln, const char *fn) {
    lname=ln;
    strcpy(fname,fn);
}
void Person::Show() const {
    std::cout <<" lastname is: " << lname
    << " firstname is: " << fname << std::endl;
}
void Person::Formalshow() const {
    std::cout << " lastname is: " << fname
              << " firstname is: " << lname << std::endl;
}

main.cpp

#include "person.h"
#include <iostream>

int main()
{
    Person one;
    Person two("Smythecraft");
    Person three("Dimwiddy","sam");
    one.Show();
    one.Formalshow() ;

    two.Show();
    two.Formalshow();

    three.Show();
    three.Formalshow();
}

3.完成第9章的编程练习1,但要用正确的golf类声明替换那里的代码。

golf.h

class Golf{
private:
    static const int Len=40;
    char fullname[Len];
    int handicap;
public:
    Golf();
    Golf(const char *fn,int hd);
    const Golf & setglof(const Golf &g);
    void re_handicap(int re_value);
    void showgolf();
};

golf.cpp

#include "golf.h"
#include <iostream>
#include <cstring>
Golf::Golf() {
    strcpy(fullname,"noname");
    handicap=0;
}
Golf::Golf(const char *fn, int hd) {
    strcpy(fullname,fn);
    handicap=hd;
}
const Golf &Golf::setglof(const Golf &g) {
    strcpy(fullname,g.fullname);
    handicap=g.handicap;
    return *this;
}

void Golf::re_handicap(int re_value) {
    handicap=re_value;
}
void Golf::showgolf() {
    std::cout <<" fullname is: "<<fullname
    << " handicap is: "<<handicap << std::endl;
}

main.cpp

#include "golf.h"

int main()
{
    Golf g1=Golf("reza",60);
    g1.showgolf();
    g1.re_handicap(30);
    g1.showgolf();
    Golf g2;

    g2.setglof(g1);
    g2.showgolf();


}

4.完成第9章的编程练习4,但将Sales结构及相关的函数转换为一个类及其方法。

sales.h

#include <iostream>
namespace SALES {
    class Sales {
    private:
        static const int QUARTERS = 4;
                double sales[QUARTERS];
                double average;
                double max;
                double min;
    public:
        Sales();
        Sales(const double *s,int l);
        void setSales();
        void showSales();

    };

}

sales.cpp

#include "sales.h"
#include <iostream>
using namespace SALES;
Sales::Sales() {
    for (int i = 0; i < QUARTERS; ++i) {
        sales[i]=0;
    }
    max=0,min=0,average=0;
}
Sales::Sales(const double *s,int l) {
    double min_value=s[0],max_value=s[0],sum=0;
    for (int i=0;i<QUARTERS;i++) {
        sales[i] = s[i];
        sum+=s[i];
        if(sales[i]>max)
            max_value=sales[i];
        else if(sales[i]<min_value)
            min_value=sales[i];
    }
    max=max_value;
    min=min_value;
    average=sum/QUARTERS;
}
void Sales::setSales() {
    for(int i=0;i<QUARTERS;i++)
    {
        std::cout << "sales["<<i<<"] ";
        std::cin >> sales[i];
    }
    double min_value=sales[0],max_value=sales[0],sum=0;
    for (int i=0;i<QUARTERS;i++) {
        sum+=sales[i];
        if(sales[i]>max)
            max_value=sales[i];
        else if(sales[i]<min_value)
            min_value=sales[i];
    }
    max=max_value;
    min=min_value;
    average=sum/QUARTERS;

};
void Sales::showSales() {
    for(int i=0;i<QUARTERS;i++)
    {
        std::cout << " sales["<<i<<"]="<<sales[i];
    }
    std::cout << std::endl <<" average= "<< average <<
    " max value= "<< max << " min value= "<<
    min << std::endl;
}

main.cpp

#include "sales.h"
int main()
{
    using SALES::Sales;
    const double s[4]={1,2,3,4};
    Sales S1=Sales();
    S1.showSales();

    Sales S2=Sales(s,4);
    S2.showSales();

    S1.setSales();
    S1.showSales();

}

5.考虑下面的结构类声明:(略)

编写一个程序,它从栈中添加或删除customer结构(栈用Stack类声明表示)。每次customer结构被删除时,其payment的值被加入到总数中,并报告总数。
stack.h

typedef struct Customer{
    char fullname[35];
    double payment;
};
class Stack
{
private:
    enum {MAX=10};
    Customer items[MAX];
    int top;
    double payment_sum;
public:
    Stack();
    bool isempty() const;
    bool isfull() const;
    bool push(const Customer & item);
    bool pop(Customer & item);
};

stack.cpp

#include "stack.h"
#include <iostream>
Stack::Stack() {
    top=0;
}

bool Stack::isempty() const {
    return top == 0;
}

bool Stack::isfull() const {
    return top == MAX;
}

bool Stack::push(const Customer &item) {
    if(top <MAX)
    {
        items[top++]=item;
        return true;
    } else
        return false;
}
bool Stack::pop(Customer &item) {
    if(top > 0)
    {
        item = items[--top];
        payment_sum+=item.payment;
        std::cout <<" payment is: "<<payment_sum << std::endl;
        return true;
    } else
        return false;
}

main.cpp

#include <iostream>
#include "stock00.h"

const int STKS=4;
int main() {
    Stock stocks[STKS] = {
            Stock("NanoSmart", 12, 2.0),
            Stock("Boffo Object", 200, 2.0),
            Stock("Monolithic Obelisks", 130, 3.25),
            Stock("Fleep", 60, 6.5),
    };

    std::cout << "Stock holding:\n";
    int st;
    for (st = 0;st < STKS; st++)
        stocks[st].show();
    const Stock *top=&stocks[0];
    for(st=1;st<STKS;st++)
        top=&top->topval(stocks[st]);

    std::cout << "\nMost valuable holding:\n";
    top->show();
    return 0;
}

6.下面是一个类声明:(略)

请提供成员函数的定义和测试这个类的程序。
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);
};

move.cpp

#include "move.h"
#include <iostream>
Move::Move(double a, double b) {
    x=a;
    y=b;
}
void Move::showmove() const {
    std::cout << " x= "<< x
    <<" y= " << y << std::endl;
}
Move Move::add(const Move &m) const {
    Move n=Move(x+m.x,y+m.y);
    return n;
}
void Move::reset(double a, double b) {
    x=a;
    y=a;
}

main.cpp

#include "move.h"
int main()
{
    Move x=Move();
    x.showmove();

    Move y=Move(1,2);
    y.showmove();

    y.add(x);
    y.showmove();
    y.reset();
    y.showmove();

}

7.Betelgeusean plorg有这些特征。
plorg.h

class Plorg
{
private:
    char name[19];
    int satisfaction;
public:
    Plorg();
    Plorg(const char new_name[19]);
    void re_CI(const int st);
    void show();

};

plorg.cpp

#include "plorg.h"
#include <cstring>
#include <iostream>
Plorg::Plorg() {
    strcpy(name,"Plorga");
    satisfaction=0;
}
Plorg::Plorg(const char *new_name) {
    strcpy(name,new_name);
    satisfaction=50;
}
void Plorg::re_CI(const int st) {
    satisfaction=st;
}
void Plorg::show() {
    std::cout << " name: " << name << std::endl;
    std::cout << " satis: " << satisfaction << std::endl;
}

main.cpp

#include "plorg.h"
int main()
{
    Plorg p1;
    p1.show();

    char name[19]="p2";
    Plorg p2=Plorg(name);
    p2.show();

    p2.re_CI(66);
    p2.show();
}

8.可以将简单列表描述成下面这样:
list.h

const int MAX=10;
typedef struct list {
    char list_name[20];
    int list_num;
}Item;
class List
{
private:
    Item item[MAX];
    int cur;
public:
    List();
    void add_item(Item item);
    bool isempyt();
    bool isfull();
    void visit(void (*pf)(Item &));

};

list.cpp

#include "list.h"
#include <iostream>
#include <cstring>
List::List() {
    cur=0;
}
bool List::isempyt() {
    return cur==0;
}

bool List::isfull() {
    return cur==MAX;
}
void List::add_item(Item add_item) {
    if (List::isfull())
        std::cout << "List is full!" << std::endl;
    else if (!List::isfull())
    {
        strcpy(item->list_name,add_item.list_name);
        cur+=1;
    }
}
void List::visit(void (*pf)(Item &)) {
    for(int i = 0; i < cur; ++i)
        (*pf)(item[i]);
}

main.cpp

#include "list.h"
#include <iostream>
void zero_num(Item &item);
int main(){
    List l1;
    Item add_l1={
            "Reza",
            666,
    };
    std::cout <<"empty?: "<<l1.isempyt() << std::endl;
    l1.add_item(add_l1);
    std::cout << "empty?: "<<l1.isempyt() << std::endl;
    std::cout << "full?: "<<l1.isfull() << std::endl;

    l1.visit(zero_num);
}
void zero_num(Item &item)
{
    item.list_num=0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容