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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容