1. 程式人生 > >第十四章 程式設計練習(1)

第十四章 程式設計練習(1)

程式設計練習1

//winec.h
#ifndef WINEC_H_
#define WINEC_H_

#include <iostream>
#include <string>
#include <valarray>
#include <utility>

using namespace std;
typedef valarray<int> ArrayInt;
typedef pair<ArrayInt, ArrayInt> PairArray;
class Wine
{
private:
    string name;
    PairArray info;
public
: Wine() {} Wine(const string str, int y, const int yr[], const int bot[]); Wine(const string str, int y); void GetBottles(); const string &Label() const; int sum() const; void show() const; }; #endif
//winec.cpp
#include "winec.h"

Wine::Wine(const string str, int y, const
int yr[], const int bot[]) { name = str; ArrayInt a(y), b(y); for(int i = 0; i< y; i++) { a[i] = yr[i]; b[i] = bot[i]; } info = make_pair(a,b); } Wine::Wine(const string str, int y) { name = str; ArrayInt a(y), b(y); info = make_pair(a,b); } void
Wine::GetBottles() { ArrayInt a(info.first.size()); ArrayInt b(info.first.size()); cout << "Enter " << name << " for " << info.first.size() << " year(s):" << std::endl; for (int i = 0; i < (int)info.first.size(); ++i) { cout << "Enter year: "; cin >> a[i]; cout << "Enter bottles for that year: "; cin >> b[i]; } info = make_pair(a, b); } const string & Wine::Label() const { return name; } int Wine::sum() const { int num = 0; for (int i = 0; i < (int)info.first.size(); ++i) num += info.second[i]; return num; } void Wine::show() const { cout << "Wine: " << name << endl; cout << "\t\t" << "Year" << "\t" << "Bottles" << endl; for (int i = 0; i < (int)info.first.size(); ++i) cout << "\t\t" << info.first[i] << "\t" << info.second[i] << endl; }
#include <iostream>
#include "winec.h"

//main.cpp
int main()
{
    cout << "Enter name of wine: ";
    char lab[50];
    cin.getline(lab, 50);
    cout << "Enter number of years: ";
    int yrs;
    cin >> yrs;

    Wine holding(lab, yrs);
    holding.GetBottles();
    holding.show();

    const int YRS = 3;
    int y[YRS] = { 1993, 1995, 1998 };
    int b[YRS] = { 48, 60, 72 };

    Wine more("Gushing Grape Red", YRS, y, b);
    more.show();
    cout << "Total bottles for " << more.Label() << ": " << more.sum() << endl;
    cout << "Bye\n";

    system("pause");
    return 0;
}

程式設計練習2

//winec.h
#ifndef WINEC_H_
#define WINEC_H_

#include <iostream>
#include <string>
#include <valarray>
#include <utility>

using namespace std;
typedef valarray<int> ArrayInt;
typedef pair<ArrayInt, ArrayInt> PairArray;
class Wine : private string, private PairArray
{
public:
    Wine() {}
    Wine(const char *l, int y, const int yr[], const int bot[]);
    Wine(const char *l, int y);
    void GetBottles();
    const string &Label() const;
    int sum() const;
    void show() const;
};
#endif
//winec.cpp
#include "winec.h"

Wine::Wine(const char *l, int y, const int yr[], const int bot[]):string(l),PairArray(ArrayInt(yr,y),ArrayInt(bot,y))
{
}
Wine::Wine(const char *l, int y):string(l),PairArray(ArrayInt(y),ArrayInt(y))
{   
}
void Wine::GetBottles()
{
    ArrayInt a(PairArray::first.size());
    ArrayInt b(PairArray::first.size());
    cout << "Enter " << (const string &)*this << " for " << PairArray::first.size() << " year(s):" << std::endl;
    for (int i = 0; i < (int)PairArray::first.size(); ++i)
    {
        cout << "Enter year: ";
        cin >> a[i];

        cout << "Enter bottles for that year: ";
        cin >> b[i];
    }
    (PairArray &) *this = make_pair(a, b);
}
const string & Wine::Label() const
{
    return (const string &)*this;
}
int Wine::sum() const
{
    int num = 0;
    for (int i = 0; i < (int)PairArray::first.size(); ++i)
        num += PairArray::second[i];
    return num;
}
void Wine::show() const
{
    cout << "Wine: " << (const string &)*this << endl;
    cout << "\t\t" << "Year" << "\t" << "Bottles" << endl;
    for (int i = 0; i < (int)PairArray::first.size(); ++i)
        cout << "\t\t" << PairArray::first[i] << "\t" << PairArray::second[i] << endl;
}

main和上面一樣啦,這就不重複了

程式設計練習3

//queuetp.h
#ifndef QUEUETP_H_
#define QUEUETP_H_

template <class T>
class QueueTp
{
private:
    enum {LEN = 10};
    T *data;
    int top;
public:
    QueueTp() { top = 0; data = new T[LEN]; }
    QueueTp(int len) { top = 0; data = new T[2 * len]; }
    ~QueueTp() { delete[] data; }
    bool Push(T item);
    bool Pop();
    T & front() const;
    T & rear() const;
    bool isFull() const { return top == LEN; }
    bool isEmpty() const { return top == 0; }
};

template <class T>
bool QueueTp<T>::Push(T item)
{
    if (isFull())
        return false;

    for (int i = top; i > 0; --i)
        data[i] = data[i-1];
    data[0] = item;
    ++top;
    return true;
}

template <class T>
bool QueueTp<T>::Pop()
{
    if (isEmpty())
        return false;

    --top;
    return true;
}

template <class T>
T & QueueTp<T>::front() const
{
    return data[top-1];
}

template <class T>
T & QueueTp<T>::rear() const
{
    return data[0];
}

#endif
//Workers.h
#ifndef WORKERS_H_
#define WORKERS_H_

#include <string>

class Worker
{
private:
    std::string fullname;
    long id;
protected:
    virtual void Data() const;
    virtual void Get();
public:
    Worker() : fullname("no one"), id(0L) {}
    Worker(const std::string &s, long n) :fullname(s), id(n) {}
    virtual ~Worker() = 0;
    virtual void Set() = 0;
    virtual void Show() const = 0;
};

class Waiter : virtual public Worker
{
private:
    int panache;
protected:
    void Data() const;
    void Get();
public:
    Waiter() : Worker(), panache(0) {}
    Waiter(const std::string &s, long n, int p = 0) : Worker(s, n), panache(p) {}
    Waiter(const Worker &wk, int p = 0) : Worker(wk), panache(p) {}
    void Set();
    void Show() const;
};

class Singer : virtual public Worker
{
protected:
    enum { other, alto, contralto, soprano, bass, baritone, tenor };
    enum { Vtypes = 7 };
    void Data() const;
    void Get();
private:
    static char *pv[Vtypes];
    int voice;
public:
    Singer() : Worker(), voice(other) {}
    Singer(const std::string &s, long n, int v = other) : Worker(s, n), voice(v) {}
    Singer(const Worker &wk, int v = other) : Worker(wk), voice(v) {}
    void Set();
    void Show() const;
};

class SingingWaiter : public Singer, public Waiter
{
protected:
    void Data() const;
    void Get();
public:
    SingingWaiter() {}
    SingingWaiter(const std::string &s, long n, int p = 0, int v = other) : Worker(s, n), Waiter(s, n, p), Singer(s, n, v) {}
    SingingWaiter(const Worker &wk, int p = 0, int v = other) : Worker(wk), Waiter(wk, p), Singer(wk, v) {}
    SingingWaiter(const Waiter &wt, int v = other) : Worker(wt), Waiter(wt), Singer(wt, v) {}
    SingingWaiter(const Singer &wt, int p = 0) : Worker(wt), Waiter(wt, p), Singer(wt) {}
    void Set();
    void Show() const;
};

#endif
//Workers.cpp
#include "Workers.h"
#include <iostream>
using std::cout;
using std::cin;
using std::endl;

Worker::~Worker() {}

void Worker::Data() const
{
    cout << "Name: " << fullname << endl;
    cout << "Emplyee ID: " << id << endl;
}

void Worker::Get()
{
    getline(cin, fullname);
    cout << "Enter worker's ID: ";
    cin >> id;
    while (cin.get() != '\n')
        continue;
}

void Waiter::Set()
{
    cout << "Enter waiter's name: ";
    Worker::Get();
    Get();
}

void Waiter::Show() const
{
    cout << "Category: waiter\n";
    Worker::Data();
    Data();
}

void Waiter::Data() const
{
    cout << "Panache rating: " << panache << endl;
}

void Waiter::Get()
{
    cout << "Enter waiter's panache rating: ";
    cin >> panache;
    while (cin.get() != '\n')
        continue;
}

char *Singer::pv[Singer::Vtypes] = { "other", "alto", "contralto", "soprano", "bass", "baritone", "tenor" };

void Singer::Set()
{
    cout << "Enter singer's name: ";
    Worker::Get();
    Get();
}

void Singer::Show() const
{
    cout << "Category: singer\n";
    Worker::Data();
    Data();
}

void Singer::Data() const
{
    cout << "Vocal range: " << pv[voice] << endl;
}

void Singer::Get()
{
    cout << "Enter number for singer's vocal range:\n";
    int i;
    for (i = 0; i < Vtypes; ++i)
    {
        cout << i << ": " << pv[i] << "   ";
        if (i % 4 == 3)
            cout << endl;
    }
    if (i % 4 != 0)
        cout << '\n';
    cin >> voice;
    while (cin.get() != '\n')
        continue;
}

void SingingWaiter :: Data() const
{
    Singer::Data();
    Waiter::Data();
}

void SingingWaiter::Get()
{
    Waiter::Get();
    Singer::Get();
}

void SingingWaiter::Set()
{
    cout << "Enter singing waiter's name: ";
    Worker::Get();
    Get();
}

void SingingWaiter::Show() const
{
    cout << "Category: singing waiter\n";
    Worker::Data();
    Data();
}
//main.cpp
#include <iostream>
#include <cstring>
#include "Workers.h"
#include "QueueTp.h"
const int SIZE = 5;

int main()
{
    using std::cin;
    using std::cout;
    using std::endl;
    using std::strchr;
    QueueTp<Worker *> lolas(SIZE);

    int ct;
    for (ct = 0; ct < SIZE; ++ct)
    {
        char choice;
        cout << "Enter the employee category: \n"
            << "w: waiter s: singer "
            << "t: singing waiter q: quiter\n";
        cin >> choice;
        while (strchr("wstq", choice) == NULL)
        {
            cout << "Please enter a w, s, t, or q: ";
            cin >> choice;
        }
        if (choice == 'q')
            break;
        switch (choice)
        {
        case 'w': lolas.Push(new Waiter);
            break;
        case 's': lolas.Push(new Singer);
            break;
        case 't': lolas.Push(new SingingWaiter);
            break;
        }
        cin.get();
        lolas.rear()->Set();
    }

    cout << "\nHere is your staff:\n";
    int i;
    for (i = 0; i < ct; ++i)
    {
        cout << endl;
        lolas.front()->Show();
        lolas.Push(lolas.front());
        lolas.Pop();
    }

    for (i = 0; i < ct; ++i)
    {
        delete lolas.front();
        lolas.Pop();
    }
    cout << "Bye";

    return 0;
}