点击这里给我发消息 点击这里给我发消息

C/C++ 学习手札(三)

添加时间:2013-12-7
    相关阅读: 程序 C++
副标题#e#

    接着说说友员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];

 

#p#副标题#e#

    关于指针的使用,我还解释不清楚,久远的过去了能将就用了!

    看看整体的程序吧!

 #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

    完成了入栈,出栈操作!

相关C/C++&nbsp;学习手札(三)

咨询热线:020-85648757 85648755 85648616 0755-27912581 客服:020-85648756 0755-27912581 业务传真:020-32579052
广州市网景网络科技有限公司 Copyright◎2003-2008 Veelink.com. All Rights Reserved.
广州商务地址:广东省广州市黄埔大道中203号(海景园区)海景花园C栋501室
= 深圳商务地址:深圳市宝源路华丰宝源大厦606
研发中心:广东广州市天河软件园海景园区 粤ICP备05103322号 工商注册