IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++机考1反思】铁匠铺结构化设计问题 -> 正文阅读

[C++知识库]【C++机考1反思】铁匠铺结构化设计问题

考试时的代码:

#include <iostream>
using namespace std;
struct Weapon{
    int oid;
    int priority;
    int time;
    int type;

    Weapon *next;//这里就莫名其妙,兵器应该由铁匠铺管理
    int leftTime;
};
struct People{
    int uid;
    int type;

    Weapon *list;//这里也没必要!!!每个铁匠存对应的兵器是何苦呢
    Weapon *finish;
    int listNum;//这个相应的也没必要
    int workingonOid;
};

struct Shop{
    People *peopleType;//这里非常弱智!让People的管理很复杂,其实uid不需要,简单遍历即可
    People *peopleUid;
    int limit;
    int num;

    int total;
    int state[105];//武器状态反而应该由武器管理,定义在Weapon里面更好
    Weapon *minWeapon;//这里也莫名其妙,作为铁匠铺不存储Weapon的集合??即使不能用vector开个Weapon* w[105];不也行吗
};
void add(Shop *shop, Weapon *weapon){
    shop->total++;
    shop->state[weapon->oid] = 0;
    if(weapon->priority < shop->minWeapon->priority){
        shop->minWeapon = weapon;
    }
    if(shop->total > shop->limit){
        Weapon *min = shop->minWeapon;
        People *people = shop->peopleType + min->type;
        Weapon *curr = people->list->next;
        Weapon *prev = people->list;

        while(curr->oid != min->oid){
            prev = curr;
            curr = curr->next;
        }
        prev->next = curr->next;
        people->listNum--;
        shop->total--;
        shop->state[min->oid] = -2;
        min->priority = 10000;
        if(people->workingonOid == min->oid){
            people->workingonOid = 0;
        }
    }

    People *people = shop->peopleType + weapon->type;
    people->listNum++;
    People *same = shop->peopleUid + people->uid;
    same->listNum++;

    Weapon *prev = people->list;
    Weapon *curr = prev->next;
    while(curr != nullptr && curr->priority > weapon->priority){
        prev = curr;
        curr = curr->next;
    }
    prev->next = weapon;
    weapon->next = curr;
}
void searchPeople(Shop *shop, int uid){
    People *people = shop->peopleUid + uid;
    people = shop->peopleType + people->type;

    if(people->workingonOid == 0){
        cout << "worker " << people->uid << " resting" << endl;
    }else{
        cout << "worker " << people->uid << " doing order " << people->workingonOid << endl;
    }
}
void searchList(Shop *shop, int oid){
    if(shop->state[oid] == 1){
        cout << "order " << oid << " done" << endl;
    }else if(shop->state[oid] == 0){
        cout << "order " << oid << " pending" << endl;
    }else if(shop->state[oid] == -1){
        cout << "order " << oid << " doing" << endl;
    }else if(shop->state[oid] == -2){
        cout << "order " << oid << " discarded" << endl;
    }
}
void searchLists(Shop *shop, int uid){
    People *people = shop->peopleUid + uid;
    people = shop->peopleType + people->type;
    Weapon *prev = people->finish;
    Weapon *curr = prev->next;

    if(curr == nullptr){
        cout << endl;
        return;
    }else{
        while(curr != nullptr){
            if(shop->state[curr->oid] == 1){
                cout << curr->oid;
                if(curr->next != nullptr){
                    cout << " ";
                }

            }
            prev = curr;
            curr = curr->next;
        }
        cout << endl;
    }
}
void working(Shop *shop){
    People *peopleList = shop->peopleUid;

    for(int i = 1; i <= shop->num; i++){
        People *currPeople = peopleList + i;
        currPeople = shop->peopleType + currPeople->type;
        if(currPeople->workingonOid == 0){
            if(currPeople->listNum > 0){
                Weapon *ready = currPeople->list->next;
                currPeople->workingonOid = ready->oid;
                ready->leftTime -= 1;
                shop->state[ready->oid] = -1;
            }
        }else{
            Weapon *now = currPeople->list->next;
            while(now->oid != currPeople->workingonOid){
                now = now->next;
            }
            if(now->leftTime == 0){
                shop->state[now->oid] = 1;
                currPeople->listNum--;
                shop->total--;
                if(now->priority == shop->minWeapon->priority){
                    shop->minWeapon->priority = 10000;
                }

                Weapon *curr = currPeople->finish;
                while(curr->next != nullptr){
                    curr = curr->next;
                }
                curr->next = now;

                Weapon *prev = currPeople->list;
                curr = prev->next;
                while (curr != now){
                    prev = curr;
                    curr = curr->next;
                }
                prev->next = curr -> next;
                if(currPeople->listNum > 0){
                    curr = currPeople->list->next;
                    currPeople->workingonOid = curr->oid;
                    curr->leftTime -= 1;
                    shop->state[curr->oid] = -1;
                }else{
                    currPeople->workingonOid = 0;
                }

            }else{
                now->leftTime -= 1;
            }
        }
        Weapon *temp = currPeople->list->next;
        while(temp != nullptr){
            if(temp->priority < shop->minWeapon->priority){
                shop->minWeapon = temp;
            }
            temp = temp->next;

        }
    }
}
int main(){
    int num, limit;
    cin >> num >> limit;
    Shop *shop = new Shop;
    shop->num = num;
    shop->limit = limit;
    shop->peopleType = new People[105];
    shop->peopleUid = new People[num + 1];
    shop->total = 0;
//    鍒濆鍖杕inWeapon
    Weapon *min = new Weapon;
    min->next = nullptr;
    min->priority = 10000;
    shop->minWeapon = min;

    int uid, type;
    for(int i = 0; i < num; i++){
        cin >> uid >> type;
        People *curr = shop->peopleType + type;
        curr->uid = uid;
        curr->type = type;
        curr->listNum = 0;
        curr->workingonOid = 0;
        Weapon *dummy1 = new Weapon;
        dummy1->next = nullptr;
        dummy1->oid = -1;
        dummy1->type = type;
        curr->list = dummy1;
        Weapon *dummy2 = new Weapon;
        dummy2->next = nullptr;
        dummy2->oid = -1;
        dummy2->type = type;
        curr->finish = dummy2;

        curr = shop->peopleUid + uid;
        curr->uid = uid;
        curr->type = type;
        curr->listNum = 0;
        curr->workingonOid = 0;
        curr->list = nullptr;
        curr->finish = nullptr;
    }
    int N;
    cin >> N;
    string op;
    while(N > 0){
        working(shop);//璋冨害璇hop鐨勬墍鏈夊伐浜?
        cin >> op;
        if(op == "add"){
            Weapon *weapon = new Weapon;
            cin >> weapon->oid >> weapon->priority >> weapon->time >> weapon->type;
            weapon->next = nullptr;
            weapon->leftTime = weapon->time;
            add(shop, weapon);//娣诲姞璇eapon鍒板搴攑eople鐨刲ist閲岄潰
        }else if(op == "queryUser"){
            int uid;
            cin >> uid;
            searchPeople(shop, uid);//鏌ヨ瀵瑰簲people鐨勭姸鎬?
        }else if(op == "queryOrder"){
            int oid;
            cin >> oid;
            searchList(shop, oid);//鏌ヨ璁㈠崟鐘舵?
        }else if(op == "queryOrders"){
            int uid;
            cin >> uid;
            searchLists(shop, uid);//鏌ヨ瀵瑰簲people宸插畬鎴愮殑璁㈠崟
        }
        N--;
    }

    return 0;
}

struct之外的部分不说了,因为结构错乱,函数也很冗余。

用OO避免上述问题后的代码:

#include <iostream>
#include <vector>
using namespace std;
class Weapon{
public:
    explicit Weapon(int o, int p, int ti, int ty): oid(o), priority(p), time(ti), type(ty){
        leftTime = time;
        state = 0;
    };//构造函数
    int getType(){
        return type;
    }
    int getOid(){
        return oid;
    }
    int getState(){
        return state;
    }
    int getPriority(){
        return priority;
    }
    int getLeftTime(){
        return leftTime;
    }
    void setState(int i){
        state = i;
    }
    void decreaseLeftTime(){
        leftTime--;
    }
private:
    int oid;
    int priority;
    int time;
    int type;

    // 额外添加的数据
    int leftTime;
    int state;//记录订单状态
};
class People{
public:
    explicit People(int u, int t): uid(u), type(t){
        workingonOid = 0;
    };//构造函数
    int getUid(){
        return uid;
    }
    int getWorkingOnOid(){
        return workingonOid;
    }
    int getType(){
        return type;
    }
    void setWorkingOnOid(int w){
        workingonOid = w;
    }
private:
    int uid;
    int type;

    int workingonOid{0};//记录正在进行的订单
};

class Shop{
public:
    explicit Shop(int l, int n): limit(l), num(n){};//构造函数
    void addPeople(People *p){
        workers.push_back(p);
    }
    void addWeapon(Weapon *w){
        int now = getUnfinished();
        if(now >= limit){
            discardMin();
        }
        weapons.push_back(w);
    }
    int getUnfinished(){
        int n = 0;
        for(int i = 0; i < weapons.size(); i++){
            if(weapons[i]->getState() == 0){
                n++;
            }
        }
        return n;
    }
    Weapon* findCurr(int oid){
        for(int i = 0; i < weapons.size(); i++){
            if(weapons[i]->getOid() == oid){
                return weapons[i];
            }
        }
    }
    void discardMin(){
        Weapon *min = new Weapon(0,10000, 0, 0);
        for(int i = 0; i < weapons.size(); i++){
            if(weapons[i]->getState() == 0 && weapons[i]->getPriority() < min->getPriority()){
                min = weapons[i];
            }
        }
        min->setState(-2);
        return;
    }
    Weapon* maxReady(int type){
        Weapon *max = new Weapon(0,0,0,0);
        for(int i = 0; i < weapons.size(); i++){
            if(weapons[i]->getState() == 0 && weapons[i]->getType() == type){
                if(weapons[i]->getPriority() > max->getPriority()){
                    max = weapons[i];
                }
            }
        }
        return max;
    }
    void getWork(){
        People *curr;
        Weapon *current;
        for(int i = 0; i < workers.size(); i++){
            curr = workers[i];
            if(curr->getWorkingOnOid() == 0){
//             如果正在休息
                current = maxReady(curr->getType());
                if(current->getOid() != 0){
                    current->setState(-1);
                    curr->setWorkingOnOid(current->getOid());
                }
            }else{
                current = findCurr(curr->getWorkingOnOid());
                current->decreaseLeftTime();
                if(current->getLeftTime() == 0){
                    current->setState(1);
                    finished.push_back(current);
                    current = maxReady(curr->getType());
                    curr->setWorkingOnOid(current->getOid());//即使curr的oid为0,也可以set
                    current->setState(-1);//之前少了这句!记得修改状态!!
                }
            }
        }
    }

    void searchPeople(int uid){
        People *curr;
        for(int i = 0; i < workers.size(); i++){
            if(workers[i]->getUid() == uid){
                curr = workers[i];
                break;
            }
        }

        if(curr->getWorkingOnOid() == 0){
            cout << "worker " << uid << " resting" << endl;
        }else{
            cout << "worker " << uid << " doing order " << curr->getWorkingOnOid() << endl;
        }
    }
    void searchLists(int uid){
        int currType = 0;
        for(int i = 0; i < workers.size(); i++){
            if(workers[i]->getUid() == uid){
                currType = workers[i]->getType();
                break;
            }
        }

        for(int i = 0; i < finished.size(); i++){
            if(finished[i]->getType() == currType){
                cout << finished[i]->getOid() << " ";
            }
        }
        cout << endl;
    }
    void searchList(int oid){
        Weapon *curr;
        for(int i = 0; i < weapons.size(); i++){
            if(weapons[i]->getOid() == oid){
                curr = weapons[i];
            }
        }
        if(curr->getState() == 1){//1表示已完成
            cout << "order " << oid << " done" << endl;
        }else if(curr->getState() == 0){//0表示尚未开始处理
            cout << "order " << oid << " pending" << endl;
        }else if(curr->getState() == -1){//-1表示正在被处理
            cout << "order " << oid << " doing" << endl;
        }else if(curr->getState() == -2){//-2表示订单被丢弃
            cout << "order " << oid << " discarded" << endl;
        }
    }
private:
    vector<People *> workers;
    vector<Weapon *> weapons;//所有的weapons
    vector<Weapon *> finished;//已完成的weapons,按照完成的先后顺序排布
    Weapon* w[100];
    int limit;//上限
    int num;//铁匠数
};

int main(){
    int num, limit;
    cin >> num >> limit;
    Shop *shop = new Shop(limit, num);

//    读入铁匠的属性
    int uid, type;
    for(int i = 0; i < num; i++){
        cin >> uid >> type;
        People *p = new People(uid, type);
        shop->addPeople(p);
    }
    int N;
    cin >> N;
    string op;
    while(N > 0){
        shop->getWork();
        cin >> op;
        if(op == "add"){
            int o, p, time, type;
            cin >> o >> p >> time >> type;
            Weapon *w = new Weapon(o, p, time, type);
            shop->addWeapon(w);
        }else if(op == "queryUser"){
            int uid;
            cin >> uid;
            shop->searchPeople(uid);
        }else if(op == "queryOrder"){
            int oid;
            cin >> oid;
            shop->searchList(oid);
        }else if(op == "queryOrders"){
            int uid;
            cin >> uid;
            shop->searchLists(uid);
        }
        N--;
    }

    return 0;
}

一些注意事项:

  • C++11 引入的 initializer_list不能进行私有变量初始化,所以注意在构造函数中做好初始化工作
  • 对于临时变量,如Weapon *max, *min;做好初始化工作,否则会有乱七八糟的数据
  • 不要害怕循环,你是在写考试,不是在降低复杂度
  • 好好读题,尤其是明显设置了区分度的部分。

两个bug:
1、记得时间为0选择另一个任务时,修改该任务的状态!
2、记得丢弃时是在已有的中选择,新加入的无论如何都会加!

记录一个还比较强的用例:
3 2
1 1
2 2
3 3
15
add 1 5 8 1
queryOrder 1
add 2 6 8 1
queryOrder 1
add 3 2 10 3
queryOrder 3
queryOrder 2
add 6 1 5 3
queryOrder 6
add 5 10 2 3
add 10 11 2 3
add 7 12 2 3
queryOrder 1
queryOrder 2
queryOrder 5

再更:
1、实际考试中全部写public:基本上就是构造函数,和manager里的逻辑实现函数。
2、有些方法可以写在类里面,耦合性更强。

#include <iostream>
#include <vector>
using namespace std;
class Weapon{
public:
    int oid;
    int priority;
    int time;
    int type;

    // 额外添加的数据
    int leftTime;
    int state;//记录订单状态
    explicit Weapon(int o, int p, int ti, int ty): oid(o), priority(p), time(ti), type(ty){
        leftTime = time;
        state = 0;
    };
    //可以考虑把output订单状态写在这里,因为只需要state变量 
};
class People{
public:
    int uid;
    int type;
    int workingonOid{0};//记录正在进行的订单
    explicit People(int u, int t): uid(u), type(t){
        workingonOid = 0;
    };
    //可以考虑把output员工的状态放在这里
    //也可以考虑增加int数组存储已完成的订单号 
};

class Shop{
public:
    vector<People *> workers;
    vector<Weapon *> weapons;//所有的weapons
    vector<Weapon *> finished;//已完成的weapons,按照完成的先后顺序排布
    Weapon* w[100];
    int limit;//上限
    int num;//铁匠数
    explicit Shop(int l, int n): limit(l), num(n){};//构造函数
    void addPeople(People *p){
        workers.push_back(p);
    }
    void addWeapon(Weapon *w){
        int now = getUnfinished();
        if(now >= limit){
            discardMin();
        }
        weapons.push_back(w);
    }
    int getUnfinished(){
        int n = 0;
        for(int i = 0; i < weapons.size(); i++){
            if(weapons[i]->state == 0){
                n++;
            }
        }
        return n;
    }
    Weapon* findCurr(int oid){
        for(int i = 0; i < weapons.size(); i++){
            if(weapons[i]->oid == oid){
                return weapons[i];
            }
        }
    }
    void discardMin(){
        Weapon *min = new Weapon(0,10000, 0, 0);
        for(int i = 0; i < weapons.size(); i++){
            if(weapons[i]->state == 0 && weapons[i]->priority < min->priority){
                min = weapons[i];
            }
        }
        min->state = -2;
        return;
    }
    Weapon* maxReady(int type){
        Weapon *max = new Weapon(0,0,0,0);
        for(int i = 0; i < weapons.size(); i++){
            if(weapons[i]->state == 0 && weapons[i]->type == type){
                if(weapons[i]->priority > max->priority){
                    max = weapons[i];
                }
            }
        }
        return max;
    }
    void getWork(){
        People *curr;
        Weapon *current;
        for(int i = 0; i < workers.size(); i++){
            curr = workers[i];
            if(curr->workingonOid == 0){
//             如果正在休息
                current = maxReady(curr->type);
                if(current->oid != 0){
                    current->state = -1;
                    curr->workingonOid = current->oid;
                }
            }else{
                current = findCurr(curr->workingonOid);
                current->leftTime--;
                if(current->leftTime == 0){
                    current->state = 1;
                    finished.push_back(current);
                    current = maxReady(curr->type);
                    curr->workingonOid = current->oid;//即使curr的oid为0,也可以set
                    current->state = -1;
                }
            }
        }
    }

    void searchPeople(int uid){
        People *curr;
        for(int i = 0; i < workers.size(); i++){
            if(workers[i]->uid == uid){
                curr = workers[i];
                break;
            }
        }

        if(curr->workingonOid == 0){
            cout << "worker " << uid << " resting" << endl;
        }else{
            cout << "worker " << uid << " doing order " << curr->workingonOid<< endl;
        }
    }
    void searchLists(int uid){
        int currType = 0;
        for(int i = 0; i < workers.size(); i++){
            if(workers[i]->uid== uid){
                currType = workers[i]->type;
                break;
            }
        }

        for(int i = 0; i < finished.size(); i++){
            if(finished[i]->type == currType){
                cout << finished[i]->oid<< " ";
            }
        }
        cout << endl;
    }
    void searchList(int oid){
        Weapon *curr;
        for(int i = 0; i < weapons.size(); i++){
            if(weapons[i]->oid == oid){
                curr = weapons[i];
            }
        }
        if(curr->state == 1){//1表示已完成
            cout << "order " << oid << " done" << endl;
        }else if(curr->state == 0){//0表示尚未开始处理
            cout << "order " << oid << " pending" << endl;
        }else if(curr->state == -1){//-1表示正在被处理
            cout << "order " << oid << " doing" << endl;
        }else if(curr->state == -2){//-2表示订单被丢弃
            cout << "order " << oid << " discarded" << endl;
        }
    }
};

int main(){
    int num, limit;
    cin >> num >> limit;
    Shop *shop = new Shop(limit, num);

//    读入铁匠的属性
    int uid, type;
    for(int i = 0; i < num; i++){
        cin >> uid >> type;
        People *p = new People(uid, type);
        shop->addPeople(p);
    }
    int N;
    cin >> N;
    string op;
    while(N > 0){
        shop->getWork();
        cin >> op;
        if(op == "add"){
            int o, p, time, type;
            cin >> o >> p >> time >> type;
            Weapon *w = new Weapon(o, p, time, type);
            shop->addWeapon(w);
        }else if(op == "queryUser"){
            int uid;
            cin >> uid;
            shop->searchPeople(uid);
        }else if(op == "queryOrder"){
            int oid;
            cin >> oid;
            shop->searchList(oid);
        }else if(op == "queryOrders"){
            int uid;
            cin >> uid;
            shop->searchLists(uid);
        }
        N--;
    }

    return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-24 17:55:54  更:2022-05-24 17:58:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/13 1:52:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码