程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C/C++學習手札(三)

C/C++學習手札(三)

編輯:關於C++

接著說說友員friend和操作符重載operator,為了把這兩個搞清楚,費了大半天勁兒搞了一個堆棧,被一堆指針問題搞得頭都大了! 不過,最終還是OK了!

這次做這麼一件事,搞體育活動。每個團隊Team 有5個隊員Comperitor ,可以對隊員做入棧、出棧操作,每個隊員有編號、名字。對輸入隊員信息、輸出隊員信息做操作符重載,使得輸入的時候能夠給出相應提示。

構建一個隊員類Comperitor

C++代碼

/**
 * 隊員
 */
class Comperitor {
private:
    char name[20]; //姓名
    int id; //編號
public:

    /**
     * 取得ID
     */
    int getId() {
        return id;
    }

    /**
     * 設置ID
     */
    void setId(int id) {
        this->id = id;
    }

    /**
     * 取得名字
     */
    char* getName() {
        return name;
    }

    /**
     * 設置名字
     */
    void setName(char *name) {
        strcpy(this->name, name);
    }

    /**
     * 重載輸入操作符
     */
    friend istream & operator >>(istream & is, Comperitor & c) {
        cout << "請輸入您的編號: ";
        is >> c.id;
        cout << "請輸入您的姓名: ";
        is >> c.name;
        return is;
    }

    /**
     * 重載輸出操作符
     */
    friend ostream & operator <<(ostream & os, Comperitor & c) {
        os << "編號: " << c.id << endl;
        os << "姓名: " << c.name << endl;
        return os;
    }
};

為名字賦值的時候,name我們使用的是char數組,需要通過strcpy賦值。

/**
 * 設置名字
 */
void setName(char *name) {
    strcpy(this->name, name);
}

構建一個重載操作符,注意使用&符號,引用方式,且操作符重載必須是友員方法!

/**
 * 重載輸入操作符
 */
friend istream & operator >>(istream & is, Comperitor & c) {
    cout << "請輸入您的編號: ";
    is >> c.id;
    cout << "請輸入您的姓名: ";
    is >> c.name;
    return is;
}

構建一個團隊類,用來控制入棧、出棧。

/**
 * 團隊
 */
class Team {
private:

    /**
     * 隊員列表
     */
    Comperitor *c[5];

    /**
     * 當前隊列指針
     */
    int pointer;

    /**
     * 隊列上限
     */
    int MAX;

    /**
     * 隊列下限
     */
    int MIN;

    /**
     * 是否為空
     */
    bool empty;

    /**
     * 是否為滿
     */
    bool full;
public:

    /**
     * 空構造
     */
    Team() {
        MAX = 5;
        MIN = 0;
        pointer = MIN;
        empty = false;
        full = false;
    }

    /**
     * 取得當前指針
     */
    int getPointer() {
        return pointer;
    }

    /**
     * 隊員入隊
     */
    void push() {
        // 取得當前對象指針
        Comperitor *com = new Comperitor;

        // 輸入
        cin >> *com;

        // 指向置為當前輸入對象
        c[pointer] = com;

        // 當前指針自 加
        pointer++;

        // 指針復位
        if (pointer >= MAX) {

            // 將當前指針指向棧頂
            pointer = MAX - 1;

            // 置為棧滿
            full = true;
        }

    }

    /**
     * 隊員出隊
     */
    void pop() {
        // 取得當前對象指針
        Comperitor *com = c[pointer];

        // 輸出
        cout << *com;

        // 指向置為空
        c[pointer] = NULL;

        // 當前指針自減
        pointer--;

        // 指針復位
        if (pointer < MIN) {

            // 置為棧空
            empty = true;

            // 將當前指針指向棧底
            pointer = MIN;
        }
    }

    /**
     * 是否為空棧
     */
    bool isEmpty() {
        return empty;
    }

    /**
     * 是否為滿棧
     */
    bool isFull() {
        return full;
    }
};

這裡要用指針數組構建隊員列表

/**
 * 隊員列表
 */
Comperitor *c[5];

關於指針的使用,我還解釋不清楚,久遠的過去了能將就用了! 看看整體的程序吧!

#include <iostream>

using namespace std;

/**
 * 隊員
 */
class Comperitor {
private:
    char name[20]; //姓名
    int id; //編號
public:

    /**
     * 取得ID
     */
    int getId() {
        return id;
    }

    /**
     * 設置ID
     */
    void setId(int id) {
        this->id = id;
    }

    /**
     * 取得名字
     */
    char* getName() {
        return name;
    }

    /**
     * 設置名字
     */
    void setName(char *name) {
        strcpy(this->name, name);
    }

    /**
     * 重載輸入操作符
     */
    friend istream & operator >>(istream & is, Comperitor & c) {
        cout << "請輸入您的編號: ";
        is >> c.id;
        cout << "請輸入您的姓名: ";
        is >> c.name;
        return is;
    }

    /**
     * 重載輸出操作符
     */
    friend ostream & operator <<(ostream & os, Comperitor & c) {
        os << "編號: " << c.id << endl;
        os << "姓名: " << c.name << endl;
        return os;
    }
};

/**
 * 團隊
 */
class Team {
private:

    /**
     * 隊員列表
     */
    Comperitor *c[5];

    /**
     * 當前隊列指針
     */
    int pointer;

    /**
     * 隊列上限
     */
    int MAX;

    /**
     * 隊列下限
     */
    int MIN;

    /**
     * 是否為空
     */
    bool empty;

    /**
     * 是否為滿
     */
    bool full;
public:

    /**
     * 空構造
     */
    Team() {
        MAX = 5;
        MIN = 0;
        pointer = MIN;
        empty = false;
        full = false;
    }

    /**
     * 取得當前指針
     */
    int getPointer() {
        return pointer;
    }

    /**
     * 隊員入隊
     */
    void push() {
        // 取得當前對象指針
        Comperitor *com = new Comperitor;

        // 輸入
        cin >> *com;

        // 指向置為當前輸入對象
        c[pointer] = com;

        // 當前指針自 加
        pointer++;

        // 指針復位
        if (pointer >= MAX) {

            // 將當前指針指向棧頂
            pointer = MAX - 1;

            // 置為棧滿
            full = true;
        }

    }

    /**
     * 隊員出隊
     */
    void pop() {
        // 取得當前對象指針
        Comperitor *com = c[pointer];

        // 輸出
        cout << *com;

        // 指向置為空
        c[pointer] = NULL;

        // 當前指針自減
        pointer--;

        // 指針復位
        if (pointer < MIN) {

            // 置為棧空
            empty = true;

            // 將當前指針指向棧底
            pointer = MIN;
        }
    }

    /**
     * 是否為空棧
     */
    bool isEmpty() {
        return empty;
    }

    /**
     * 是否為滿棧
     */
    bool isFull() {
        return full;
    }
};

/**
 * 主函數
 */
int main() {

    Team t;

    cout << endl << "隊員數據輸入:" << endl;
    int i = 1;
    while (!t.isFull()) {
        cout << "請輸入第" << i << "位隊員的信息:" << endl;
        t.push();
        i++;
    };

    cout << endl << "隊員數據輸出:" << endl;
    int j = t.getPointer() + 1;
    while (!t.isEmpty()) {
        cout << "第" << j << "位隊員的信息:" << endl;
        t.pop();
        j--;
    };

    return 0;
}

看看操作結果:

隊員數據輸入:
請輸入第1位隊員的信息:
請輸入您的編號: 1
請輸入您的姓名: a
請輸入第2位隊員的信息:
請輸入您的編號: 2
請輸入您的姓名: b
請輸入第3位隊員的信息:
請輸入您的編號: 3
請輸入您的姓名: c
請輸入第4位隊員的信息:
請輸入您的編號: 4
請輸入您的姓名: d
請輸入第5位隊員的信息:
請輸入您的編號: 5
請輸入您的姓名: e

隊員數據輸出:
第5位隊員的信息:
編號: 5
姓名: e
第4位隊員的信息:
編號: 4
姓名: d
第3位隊員的信息:
編號: 3
姓名: c
第2位隊員的信息:
編號: 2
姓名: b
第1位隊員的信息:
編號: 1
姓名: a

完成了入棧,出棧操作!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved