• C++Primer Plus习题记录-Chapter12


    12-1

    //hf
    #pragma once
    #ifndef COW_H_
    #define COW_H_
    class Cow {
    private:
        char name[20];
        char* hobby;
        double weight;
    public:
        Cow();
        Cow(const char* nm, const char* ho, double wt);
        Cow(const Cow& c);
        ~Cow();
        Cow& operator=(const Cow& c);
        void ShowCow() const;
    };
    #endif // !COW_H_
    //rf
    #include "pch.h"
    #include <iostream>
    #include <cstring>
    #include "cow.h"
    using namespace std;
    Cow::Cow() {
        name[0] = '';
        hobby = new char[1];
        hobby[0] = '';
        weight = 0;
    }
    Cow::Cow(const char* nm, const char* ho, double wt) {
        int len = strlen(nm);
        strcpy_s(name, len+1, nm);
        int len1 = strlen(ho);
        hobby = new char[len1+1];
        strcpy_s(hobby, len1+1, ho);
        weight = wt;
    }
    Cow::Cow(const Cow& c) {
        int len = strlen(c.hobby);
        int len1 = strlen(c.name);
        hobby = new char[len + 1];
        strcpy_s(hobby, len + 1, c.hobby);
        strcpy_s(name, len1 + 1, c.name);
        weight = c.weight;
    }
    Cow::~Cow() {
        delete[] hobby;
    }
    Cow& Cow::operator=(const Cow& c) {
        if (this == &c)
            return *this;
        delete[] hobby;
        int len = strlen(c.hobby);
        int len1 = strlen(c.name);
        hobby = new char[len + 1];
        strcpy_s(hobby, len + 1, c.hobby);
        strcpy_s(name, len1 + 1, c.name);
        weight = c.weight;
        return *this;
    }
    void Cow::ShowCow() const {
        cout << "name: " << name << endl;
        cout << "hobby: " << hobby << endl;
        cout << "weight: " << weight << endl;
    }
    //mf
    #include "pch.h" #include "cow.h" int main(void) { Cow cows("w", "eat", 150); cows.ShowCow(); return 0; }

    12-2

    #pragma once
    #ifndef STRING1_H_
    #define STRING1_H_
    #include <iostream>
    using namespace std;
    class String1 {
    private:
        char* str;
        int len;
        static int num_strings;
        static const int CINLIM = 80;
    public:
        String1(const char* s);
        String1();
        String1(const String1& s);
        ~String1();
        int length() const { return len; }
        void stringlow();
        void stringup();
        int has(char c);
        friend String1 operator+(const String1& st1, const String1& st2);
        String1 & operator=(const String1 & st);
        String1 & operator=(const char * s);
        char & operator[](int i);
        const char & operator[](int i) const;
    
    
        //友元运算符重载
        friend bool operator<(const String1 &st1, const String1 &st2);
        friend bool operator>(const String1 &st1, const String1 &st2);
        friend bool operator==(const String1 &st1, const String1 &st2);
        friend ostream & operator<<(ostream & os, const String1 &st);
        friend istream & operator>>(istream & is, String1 &st);
    
        static int HowMany();
    };
    #endif // !STRING1_H_
    
    
    #include <cstring>
    #include <cctype> 
    #include "string2.h"
    using std::cout;
    using std::cin;
    
    int String::num_strings = 0;//初始化为0,并且指出了类型
    //初始化应该在方法文件中,不在类声明文件 
    
    int String::HowMany()//静态方法 
    {
        return num_strings; 
    }
    
    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] = '';
        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 (std::strcmp(st1.str, st2.str) < 0); 
    }
    
    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<<(ostream & os, const String &st)
    {
        os << st.str;
        return os;
    }
    
    istream & 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;
    }
    
    //新增函数的实现 
    void String::stringlow()
    {
        for (int i = 0; i < len;i++)
        {
            if(isupper((str[i])))
                str[i]= tolower(str[i]);
        }   
    }
    
    void String::stringup()
    {
        for (int i = 0; i < len;i++)
        {
            if(islower((str[i])))
                str[i]= toupper(str[i]);
        }   
    }
    
    int String::has(char c)
    {
        int count = 0;
        for (int i = 0; i < len;i++)
        {
            if( str[i]== c)
                count++;
        }
        return count;   
    }
    String operator+(const String &st1, const String &st2)
    {
        String s;
        s.len = st1.len + st2.len;
        s.str = new char[s.len + 1];
        strcpy(s.str, st1.str);
        strcat(s.str, st2.str);
        return s;
    }
    #include <iostream>
    using namespace std;
    #include "String2.h"
    int main()
    {
        String s1(" and I am a C++ student.");
        String s2 = "Please enter your name: ";
        String s3;
        cout << s2;
        cin >> s3;
        s2 = "My name is " + s3;
        cout << s2 << ".
    ";
        s2 = s2 + s1;
        s2.stringup ();
        cout << "The string
    " << s2 << "
    contains " << s2.has('A')
            << " 'A' characters in it.
    ";
    
        s1 = "red";
        String rgb[3] = { String(s1), String("green"), String("blue")};
        cout << "Enter the name of a primary color for mixing light: ";
        String ans;
        bool success = false;
        while (cin >> ans)
        {
            ans.stringlow();
            for (int i = 0; i < 3; i++)
            {
                if (ans == rgb[i])
                {
                    cout << "That's right!
    ";
                    success = true;
                    break;
                }
            }
            if (success)
                break;
            else
                cout << "Try again!
    ";
        }
        cout << "Bye
    ";
        return 0;
    }

     12-3

    #pragma once
    #ifndef STOCK_H_
    #define STOCK_H_
    #include <string>
    using namespace std;
    class Stock {
    private:
        char* company;
        int shares;
        double share_val;
        double total_val;
        void set_tot() { total_val = shares * share_val; }
    public:
        Stock();
        Stock(const char* c0, long n = 0, double pr = 0.0);
        ~Stock();
        void buy(long num, double price);
        void sell(long num, double price);
        void update(double price);
        const Stock& topval(const Stock& s) const;
        
        friend std::ostream& operator<<(std::ostream& os, const Stock& st);
    };
    #endif // !STOCK_H_
    #include "pch.h"
    #include <iostream>
    #include <cstring>
    #include "stock.h"
    
    Stock::Stock() {
        company = new char[1];
        company = '';
        shares = 0;
        share_val = 0.0;
        total_val = 0.0;
    }
    Stock::Stock(const char* c0, long n, double pr) {
        int len = 0;
        len = strlen(c0);
        company = new char[len + 1];
        strcpy_s(company,len + 1, c0);
        if (n < 0) {
            cout << "Number of shares can't be negative;" << company << " shares set to 0.
    ";
            shares = 0;
        }
        else
            shares = n;
        share_val = pr;
        set_tot();
    }
    Stock::~Stock() {
        delete[] company;
    }
    void Stock::buy(long num, double price) {
        if (num < 0)
            cout << "Number of shares purchased can't be negative. "<< "Transaction is aborted.
    ";
        else {
            shares += num;
            share_val = price;
            set_tot();
        }
    }
    void Stock::sell(long num, double price) {
        if (num < 0)
        {
            cout << "Number of shares purchased can't be negative. "
                << "Transaction is aborted.
    ";
        }
        else if (num > shares)
        {
            cout << "You can't sell more than you have! "
                << "Transaction is aborted.
    ";
        }
        else
        {
            shares -= num;
            share_val = price;
            set_tot();
        }
    }
    void Stock::update(double price)
    {
        share_val = price;
        set_tot();
    }
    
    const Stock & Stock::topval(const Stock & s) const
    {
        if (s.total_val > total_val)
            return s;
        else
            return *this;
    }
    
    ostream & operator<<(ostream & os, const Stock & st)
    {
        //set format to #.###
        ios_base::fmtflags orig = os.setf(ios_base::fixed, ios_base::floatfield);
        streamsize prec = os.precision(3);
    
        os << "Company: " << st.company << "  Shares: " << st.shares << '
    ';
        os << "  Share Price: $" << st.share_val;
        //set format to #.##
        os.precision(2);
        os << "  Total Worth: $" << st.total_val << '
    ';
    
        //格式复原
        os.setf(orig, ios_base::floatfield);
        os.precision(prec);
        return os;
    }
    
    #include "pch.h"
    #include <iostream>
    #include <string>
    #include <cstring>
    #include <cctype>
    #include <cstdlib>
    #include <ctime>
    #include <fstream>
    #include "stock.h"
    const int STKS = 4;
    int main(void) {
        Stock stocks[STKS] = {
            Stock("NanoSmart", 12, 20.0),
            Stock("Boffo Objects", 200, 2.0),
            Stock("Monolithic Obelisks", 130, 3.25),
            Stock("Fleep Enterprises", 60, 6.5)
        };
    
        cout << "Stock holding:
    ";
        int i;
        for (i = 0; i < STKS; i++)
            cout << stocks[i];
    
        const Stock * top = &stocks[0];
        for (i = 1; i < STKS; i++)
            top = &top->topval(stocks[i]);
        cout << "
    Most valuable holding:
    ";
        cout << *top;
        return 0;
    }
    View Code

    12-4

    #pragma once
    #ifndef STACK_H_
    #define STACK_H_
    typedef unsigned long Item;
    class Stack {
    private:
        enum { MAX = 10 };
        Item* pt;
        int size;
        int top;
    public:
        Stack(int n = MAX);
        Stack(const Stack& st);
        ~Stack();
        bool isempty() const;
        bool isfull() const;
        bool push(const Item& item);
        bool pop(Item& item);
        Stack& operator=(const Stack& st);
    };
    #endif // !STACK_H_
    #include "pch.h"
    #include <cstring>
    #include "stack.h"
    Stack::Stack(int n) {
        size = n;
        pt = new Item[size];
        top = 0;
    }
    Stack::Stack(const Stack& st) {
        size = st.size;
        pt = new Item[size + 1];
        for (top = 0; top < size; top++)
            pt[top] = st.pt[top];
    }
    Stack::~Stack() {
        delete[] pt;
        size = top = 0;
    }
    bool Stack::isempty() const {
        return top == 0;
    }
    bool Stack::isfull() const {
        return top == MAX;
    }
    bool Stack::push(const Item& item) {
        if (top < MAX) {
            pt[top++] = item;
            return true;
        }
        else
            return false;
    }
    bool Stack::pop(Item& item) {
        if (top > 0) {
            item = pt[--top];
            return true;
        }
        else
            return false;
    }
    Stack& Stack::operator=(const Stack& st) {
        if (this == &st)
            return *this;
        delete[] pt;
        size = st.size;
        pt = new Item[size + 1];
        for (top = 0; top < size; top++)
            pt[top] = st.pt[top];
        return *this;
    }

    12-6

    #pragma once
    #ifndef ATM_H_
    #define ATM_H_
    using namespace std;
    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;
            Node* next;
        };
        enum { Q_SIZE = 10 };
        Node* front;
        Node* rear;
        int items;
        const int qsize;
        //防止copy其他Queue的操作
        Queue(const Queue& q) :qsize(0) {}
        Queue& operator=(const Queue& q) { return *this; }
    public:
        Queue(int qs = Q_SIZE);
        ~Queue();
        bool isempty() const { return items == 0; }
        bool isfull() const { return items == qsize; }
        int queuecount() const { return items; }
        bool enqueue(const Item& item);
        bool dequeue(Item& item);
        friend bool operator>(const Queue& item1, const Queue& item2);
    };
    #endif // !ATM_H_
    #include "pch.h"
    #include <cstdlib>
    #include "atm.h"
    Queue::Queue(int qs) :qsize(qs) {
        front = rear = nullptr;
        items = 0;
    }
    Queue::~Queue() {
        Node* temp;
        while (front!=nullptr)
        {
            temp = front;
            front = front->next;
            delete temp;
        }
    }
    bool Queue::enqueue(const Item& item) {
        if (isfull())
            return false;
        Node* add = new Node;
        add->item = item;
        add->next = nullptr;
        items++;
        if (front == nullptr)
            front = add;
        else
            rear->next = add;
        rear = add;
        return true;
    }bool Queue::dequeue(Item& item) {
        if (front == nullptr)
            return false;
        item = front->item;
        items--;
        Node* temp = front;
        front = front->next;
        delete temp;
        if (items == 0)
            rear = nullptr;
        return true;
    }
    void Customer::set(long when) {
        processtime = rand() % 3 + 1;
        arrive = when;
    }
    bool operator>(const Queue& item1, const Queue& item2) {
        return item1.items > item2.items;
    }
    #include "pch.h"
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include "atm.h"
    const int MIN_PER_HR = 60;
    bool newcustomer(double x);
    int main(void) {
        srand(time(0));//随机初始化
    
        cout << "Case Study: Bank of Heather Automatic Teller
    ";
        cout << "Enter maxmium size of queue: ";
        int qs;
        cin >> qs;
        Queue line1(qs);//设有qs个人的队伍 
        Queue line2(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 hours: ";
        double perhour;
        cin >> perhour;
        double min_per_cust;
        min_per_cust = MIN_PER_HR / perhour;
    
        //设置参数  
        Item temp;
        long turnaways = 0;
        long customers = 0;
        long served = 0;
        long sum_line = 0;
        int wait1_time = 0;
        int wait2_time = 0;
        long line1_wait = 0;
        long line2_wait = 0;
    
        for (int cycle = 0; cycle < cyclelimit; cycle++)
        {
            if (newcustomer(min_per_cust))
            {
                if (line1.isfull() && line2.isfull())
                    turnaways++;
                else if (line2 > line1 || line1.isfull())
                {
                    customers++;
                    temp.set(cycle);
                    line1.enqueue(temp);
                }
                else
                {
                    customers++;
                    temp.set(cycle);
                    line2.enqueue(temp);
                }
            }
            if (wait1_time <= 0 && !line1.isempty())
            {
                line1.dequeue(temp);
                wait1_time = temp.ptime();
                line1_wait += cycle - temp.when();
                served++;
            }
            if (wait2_time <= 0 && !line2.isempty())
            {
                line2.dequeue(temp);
                wait2_time = temp.ptime();
                line2_wait += cycle - temp.when();
                served++;
            }
            if (wait1_time > 0)
                wait1_time--;
            sum_line += line1.queuecount();
            if (wait2_time > 0)
                wait2_time--;
            sum_line += line2.queuecount();
        }
    
        //报告结果 
        if (customers > 0)
        {
            cout << "customers accepted: " << 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)(line1_wait + line2_wait) / served << " minutes
    ";
        }
        else
            cout << "No customers!
    ";
        cout << "Done!
    ";
        return 0;
    }
    bool newcustomer(double x)
    {
        return (std::rand() * x / RAND_MAX < 1);
    }
    View Code
  • 相关阅读:
    [2013-08-19] nohup的使用
    HttpParser 相关链接文章
    CKEditor禁用浏览服务器的功能
    (转载)MySQL删除所有表的外键约束、禁用外键约束
    js Object扩展自定义方法,jQuery抛出 Uncaught TypeError: matchExpr[type].exec is not a function
    Javascript 占位符替换
    Springboot 抛出Failed to determine a suitable driver class异常原因
    jpa CriteriaQueryNo explicit selection and an implicit one could not be determined
    Spring ModelAttribute注解失效原因
    Spring Data Jpa 更新操作
  • 原文地址:https://www.cnblogs.com/lightmonster/p/10452559.html
Copyright © 2020-2023  润新知