C++Primer Plus 12章ソースコード

16687 ワード

#C++Primer Plus第12章本上ソース
記録は私がC++Primer Plus(第6版)の第12章のソースコードを見ることを見ます
12.1
//12.1
#include
#ifndef STRNGBAD_H_
#define STRNGBAD_H_
class StringBad
{
    private:
        char *str;
        int len;
        static int num_strings;
    public:
        StringBad(const char *s);
        StringBad();
        ~StringBad();
        friend std::ostream &operator<

12.2
#include
#include"strngbad.h"
using std::cout;
int StringBad::num_strings = 0;
StringBad::StringBad(const char *s)
{
    len = std::strlen(s);
    str = new char[len + 1];
    std::strcpy(str, s);
    num_strings++;
    cout << num_strings << ": \"" << str << "\"object created
"; } StringBad::StringBad() { len = 4; str = new char[4]; std::strcpy(str, "C++"); num_strings++; cout << num_strings << ": \"" << str << "\" default object created
"; } StringBad::~StringBad() { cout << "\"" << str << "\" objecy deleted, "; --num_strings; cout << num_strings << " left
"; delete[] str; } std::ostream & operator<

12.3
#include
using std::cout;
#include"strngbad.cpp"

void  callme1(StringBad &);
void callme2(StringBad);
int main()
{
    using std::endl;
    {
        cout << "Starting an inner bllock.
"; StringBad headline1("Celery Stalks at Midnight"); StringBad headline2("Lettuce Prey"); StringBad sports("Spinach Leaves Bow1 for Dollars"); cout << "headline1: " << headline1 << endl; cout << "headline2: " << headline2 << endl; cout << "sports: " << sports << endl; callme1(headline1); cout << "headline1: " << headline1 << endl; callme2(headline2); cout << "headline2: " << headline2 << endl; cout << "Initialize one object to another:
"; StringBad sailor = sports; cout << "sailor: " << sailor << endl; cout << "Assign one object to another:
"; StringBad knot; knot = headline1; cout << "Knot: " << knot << endl; cout << "Exiting the block.
"; } cout << "End of main()
"; return 0; } void callme1(StringBad &rsb) { cout << "String passed by reference:
"; cout << " \"" << rsb << "\"
"; } void callme2(StringBad sb) { cout << "String passed by value:
"; cout<

12.4
//12.4
#ifndef STRING1_H_
#define STRING1_H_
#include
using std::ostream;
using std::istream;
class String
{
    private:
        char *str;
        int len;
        static int num_strings;
        static const int CINLIM = 80;
    public:
        String(const char *s);
        String();
        String(const String &);
        ~String();
        int length() const { return len; }
        String &operator=(const String &);
        String &operator=(const char *);
        char &operator[](int i);
        const char &operator[](int i) const;

        friend bool operator(const String &st1, const String &st2);
        friend bool operator==(const String &st, const String &st2);
        friend ostream &operator<>(istream &is, String &st);

        static int HowMany();
};
#endif

12.5
//12.5
#include
#include"string1.h"
using std::cin;
using std::cout;
int String::num_strings = 0;
String::String(const char *s)
{
    len = std::strlen(s);
    str = new char[len + 1];
    std::strcpy(str, s);
    num_strings++;
}
String::String()
{
    len = 4;
    str = new char[1];
    str[0] = '\0';
    num_strings++;
}
String::String(const String &st)
{
    num_strings++;
    len=st.len;
    str = new char[len + 1];
    std::strcpy(str, st.str);
}
String::~String()
{
    --num_strings;
    delete[] str;
}
String &String::operator=(const String &st)
{
    if(this==&st)
        return *this;
    delete[] str;
    len = st.len;
    str = new char[len + 1];
    std::strcpy(str, st.str);
    return *this;
}
String &String::operator=(const char *s)
{
    delete[] str;
    len = std::strlen(s);
    str = new char[len + 1];
    std::strcpy(str, s);
    return *this;
}
char &String::operator[](int i)
{
    return str[i];
}
const char &String::operator[](int i) const
{
    return str[i];
}

bool operator(const String &st1, const String &st2)
{
    return st2 > st1;
}
bool operator==(const String &st1, const String &st2)
{
    return (std::strcmp(st1.str, st2.str) == 0);
}
ostream &operator<>(istream &is, String &st)
{
    char temp[String::CINLIM];
    is.get(temp, String::CINLIM);
    if(is)
        st = temp;
    while(is&&is.get()!='
') continue; return is; } int String::HowMany() { return num_strings; }

12.6
#include
#include"string1.cpp"
const int ArSize = 10;
const int MaxLen = 81;
int main()
{
    using std::cin;
    using std::cout;
    using std::endl;
    String name;
    cout << "Hi what's your name?
>>"; cin >> name; cout <:
"; String sayings[ArSize]; char temp[MaxLen]; int i; for (i = 0; i < ArSize;i++) { cout << i+1<< ": "; cin.get(temp, MaxLen); while(cin&&cin.get()!='
') continue; if(!cin||temp[0]=='\0') break; else sayings[i] = temp; } int total = i; if(total>0) { cout << "Here are your sayings:
"; for (i = 0; i < total;i++) cout << sayings[i][0] << ": " << sayings[i] << endl; int shortest = 0; int first = 0; for (i = 1; i < total;i++) { if(sayings[i].length()

12.7
#include
#include
#include
#include"string1.cpp"
const int ArSize = 10;
const int MaxLen = 81;
int main()
{
    using namespace std;
    String name;
    cout << "Hi, what's your name?
>>"; cin >> name; cout << name << ", please enter up to " << ArSize << " short sayings :
"; String sayings[ArSize]; char temp[MaxLen]; int i; for (i = 0; i < ArSize;i++) { cout << i + 1 << ": "; cin.get(temp, MaxLen); while(cin&&cin.get()!='
') continue; if(!cin||temp[0]=='\0') break; else sayings[i] = temp; } int total = i; if(total>0) { cout << "Here are your sayings:
"; for (i = 0; i < total;i++) cout << sayings[i] << "
"; String *shortest = &sayings[0]; String *first = &sayings[0]; for (i = 1; i < total;i++) { if(sayings[i].length()length()) shortest = &sayings[i]; if(sayings[i]

12.8
#include
#include
#include
using namespace std;
const int BUF = 512;
class JustTesting
{
    private:
        string words;
        int number;
    public:
        JustTesting(const string &s="Just Testing",int n=0)
        {
            words = s;
            number = n;
            cout << words << " constructed
"; } ~JustTesting() { cout << words << " destroyed
"; } void Show() const { cout << words << "," << number << endl; } }; int main() { char *buffer = new char[BUF]; JustTesting *pc1, *pc2; pc1 = new (buffer) JustTesting; pc2 = new JustTesting("Heap1", 20); cout << "Meory block addresses:
" << "Buffer: " << (void *)buffer << " heap:" << pc2 << endl; cout << "Memory contents:
"; cout << pc1 << ": "; pc1->Show(); cout << pc2 << ": "; pc2->Show(); JustTesting *pc3, *pc4; pc3 = new (buffer) JustTesting("Bad Idea", 6); pc4 = new JustTesting("Heap2", 10); cout << "Memory contents:
"; cout << pc3 << ": "; pc3->Show(); cout << pc4 << ": "; pc4->Show(); delete pc2; delete pc4; delete[] buffer; cout << "Done
"; return 0; }

12.9
#include
#include
#include
using namespace std;
const int BUF = 512;
class JustTesting
{
    private:
        string words;
        int number;
    public:
        JustTesting(const string &s="Just Testing",int n=0)
        {
            words = s;
            number = n;
            cout << words << " constructed
"; } ~JustTesting() { cout << words << " destroyed
"; } void Show() const { cout << words << "," << number << endl; } }; int main() { char *buffer = new char[BUF]; JustTesting *pc1, *pc2; pc1 = new (buffer) JustTesting; pc2 = new JustTesting("Heap1", 20); cout << "Meory block addresses:
" << "Buffer: " << (void *)buffer << " heap:" << pc2 << endl; cout << "Memory contents:
"; cout << pc1 << ": "; pc1->Show(); cout << pc2 << ": "; pc2->Show(); JustTesting *pc3, *pc4; pc3 = new (buffer+sizeof(JustTesting)) JustTesting("Better Idea", 6); pc4 = new JustTesting("Heap2", 10); cout << "Memory contents:
"; cout << pc3 << ": "; pc3->Show(); cout << pc4 << ": "; pc4->Show(); delete pc2; delete pc4; pc3->~JustTesting(); pc1->~JustTesting(); delete[] buffer; cout << "Done
"; return 0; }

12.10
//12.10
#ifndef QUEUE_H_
#define QUEUE_H_
class Customer
{
    private:
        long arrive;
        int processtime;
    public:
        Customer() { arrive = processtime = 0; }
        void set(long when);
        long when() const { return arrive; }
        int ptime() const { return processtime;}
};
typedef Customer Item;
class Queue
{
    private:
        struct Node{
            Item item;
            struct Node *next;
        };
        enum
        {
            Q_SIZE = 10
        };
        Node *front;
        Node *rear;
        int items;
        const int qsize;
        Queue(const Queue &q):qsize(0){
        }
        Queue &operator=(const Queue &q) { return *this;}
    public:
        Queue(int qs = Q_SIZE);
        ~Queue();
        bool isempty() const;
        bool isfull() const;
        int queuecount() const;
        bool enqueue(const Item &item);
        bool dequeue(Item &item);
};
#endif


12.11
//12.11
#include"queue.h"
#include


        Queue::Queue(int qs):qsize(qs)
            {
                front = rear = NULL;
                items = 0;
            }
        Queue::~Queue()
        {
            Node * temp;
            while(front!=NULL)
            {
                temp = front;
                front = front->next;
                delete temp;
            }

        }
        bool Queue::isempty() const
        {
            return items == 0;
        }
        bool Queue::isfull() const
        {
            return items == qsize;
        }
        int Queue::queuecount() const
        {
            return items;
        }
        bool Queue::enqueue(const Item &item)
        {
            if(isfull())
            {
                return false;
            }
            Node *add = new Node;
            add->item = item;
            add->next = NULL;
            items++;
            if(front==NULL)
                front = add;
            else
                rear->next = add;
            rear = add;
            return true;
        }
        bool Queue::dequeue(Item &item)
        {
            if(front==NULL)
                return false;
            item = front->item;
            items--;
            Node *temp = front;
            front = front->next;
            delete temp;
            if(items==0)
                rear = NULL;
            return true;
        }
        void Customer::set(long when)
        {
            processtime = std::rand() % 3 + 1;
            arrive = when;
        }

12.12
#include
#include
#include
#include"queue.cpp"
const int MIN_PER_HR = 60;
bool newcustomer(double x);
int main()
{
    using std::cin;
    using std::cout;
    using std::endl;
    using std::ios_base;
    std::srand(std::time(0));

    cout << "Case Study: Bank of Heather Automatic Teller
"; cout << "Enter maximum size of queue: "; int qs; cin >> qs; Queue line(qs); cout << "Enter the number of simulation hours: "; int hours; cin >> hours; long cyclelimit = MIN_PER_HR * hours; cout << "Enter the average number of customers per hour: "; double perhour; cin >> perhour; double min_per_cust; min_per_cust = MIN_PER_HR; Item temp; long turnaways = 0; long customers = 0; long served = 0; long sum_line = 0; int wait_time = 0; long line_wait = 0; for (int cycle = 0; cycle < cyclelimit;cycle++) { if(newcustomer(min_per_cust)) { if(line.isfull()) turnaways++; else { customers++; temp.set(cycle); line.enqueue(temp); } } if(wait_time<=0&&!line.isempty()) { line.dequeue(temp); wait_time = temp.ptime(); line_wait += cycle - temp.when(); served++; } if(wait_time>0) wait_time--; sum_line += line.queuecount(); } if(customers>0) { cout << "customers acccepted: " << customers << endl; cout << " customers served: " << served << endl; cout << " turnaways: " << turnaways << endl; cout << "average queue size: "; cout.precision(2); cout .setf(ios_base::fixed, ios_base::floatfield); cout << (double)sum_line / cyclelimit << endl; cout << " average wait time: " << (double)line_wait / served << " minutes
"; } else cout << "No customers!
"; cout << "Done!
"; return 0; } bool newcustomer(double x) { return (std::rand() * x / RAND_MAX < 1); }