首页 > 编程语言 >杂货店排队模拟程序

杂货店排队模拟程序

时间:2024-07-06 17:57:21浏览次数:16  
标签:cout targetCashier int 排队 队伍 模拟程序 杂货店 cashiers customerId

该模拟程序中包含多个队列,可以使用队列数组来模拟这些队列。假设杂货店共5条收银线,顾客可随机进入支付。顾客会进入最短的队伍,如果队伍一样长,那么选择最靠近的一个队伍。每次交易完成所消耗的时间也是随机的。
完成一些额外工作,扩展杂货店排队程序,使得客户可以:
■如果等待超过了某个时间,可以离开队伍。
■在给定的时间间隔内,检查另一个队伍是否更短。
■如果另一个队伍更短,则切换队伍。
■如果有朋友正在排队,则可以插队。

问题描述

本项目是一个杂货店排队模拟程序,其中包含多个队列,顾客可以随机选择队伍,并具有以下功能:

1.如果等待超过了某个时间,可以离开队伍。

2.在给定的时间间隔内,检查另一个队伍是否更短。

3.如果另一个队伍更短,则切换队伍。

4如果有朋友正在排队,则可以插队

基本要求

1.使用队列数组模拟多个收银线

2.顾客随机选择最短的队伍,如果队伍一样长,选择最靠近的队伍

3.每次交易完成所消耗的时间是随机的

系统功能

1.顾客可以选择加入某一队伍

2.顾客可以等待一定时间后离开队伍

3.顾客可以检查其他队伍的长度

4.顾客可以切换队伍

5.顾客可以插队

方法概述

本程序使用队列数组来模拟多个收银线队列,每个队列中存储顾客结构体,包括顾客ID和朋友ID。程序实现了增加顾客到指定的收银线、添加顾客朋友、查找最短队伍的收银线、将顾客插入其他队伍、打印每条队伍的人数以及排队情况等功能。

流程图

代码实现(各模块)

//头文件

#include <iostream>

#include <queue>

#include <map>

using namespace std;

// 定义顾客结构体

struct Customer {

    int id;

    int friendId;

};

// 建立五条收银线队列

queue<Customer> cashiers[5];

// 增加顾客到指定的收银线

void addCustomer(int cashierIndex, int customerId) {

    Customer newCustomer = { customerId, -1 };

    cashiers[cashierIndex].push(newCustomer);

}                                           

// 添加顾客朋友

void addFriend(int friendId, int targetCashier, int customerId) {

    bool foundCustomer = false;                               

    queue<Customer> tempQueue;                                

    // 在目标队伍中查找顾客

    while (!cashiers[targetCashier].empty()) {

        Customer customerToMove = cashiers[targetCashier].front();

        cashiers[targetCashier].pop();

        if (customerToMove.id == customerId) {

            tempQueue.push(customerToMove);

            Customer newCustomer = { friendId, -1 };

            tempQueue.push(newCustomer);

            while (!cashiers[targetCashier].empty()) {

                tempQueue.push(cashiers[targetCashier].front());

                cashiers[targetCashier].pop();

            }

            while (!tempQueue.empty()) {

                cashiers[targetCashier].push(tempQueue.front());

                tempQueue.pop();

            }

            foundCustomer = true;

            break;

        }

        else {

            tempQueue.push(customerToMove);

        }

    }

    // 如果没有找到目标顾客,输出错误信息

    if (!foundCustomer) {

        cout << "未找到目标顾客" << endl;

    }

}

// 查找最短队伍的收银线

int findShortestQueue() {

    int shortestQueue = 0;

    int minLength = cashiers[0].size();

    for (int i = 1; i < 5; i++) {

        if (cashiers[i].size() < minLength) {

            shortestQueue = i;

            minLength = cashiers[i].size();

        }

    }

    return shortestQueue;

}

// 将顾客插入其他队伍

void insertCustomer(int sourceCashier, int targetCashier, int customerId) {

    if (sourceCashier == targetCashier) {

        cout << "顾客已在目标队伍中" << endl;

        return;

    }

    Customer customerToMove;

    bool foundCustomer = false;

    // 从源队伍中查找顾客

    queue<Customer>& sourceQueue = cashiers[sourceCashier];

    while (!sourceQueue.empty()) {

        customerToMove = sourceQueue.front();

        sourceQueue.pop();

        if (customerToMove.id == customerId) {

            foundCustomer = true;

            break;

        }

    }

    if (!foundCustomer) {

        cout << "未找到顾客" << endl;

        return;

    }

    // 将顾客插入到目标队伍

    cashiers[targetCashier].push(customerToMove);

    cout << "顾客已成功插入到第" << targetCashier + 1 << "条收银线" << endl;

}

// 打印每条队伍的人数

void printQueueStatus() {

    for (int i = 0; i < 5; i++) {

        cout << "第" << i + 1 << "条收银线的人数为:" << cashiers[i].size() << ", 排队情况为:";

        if (cashiers[i].empty()) {

            cout << "队列为空" << endl;

        }

        else {

            queue<Customer> tempQueue = cashiers[i];

            while (!tempQueue.empty()) {

                cout << tempQueue.front().id << " ";

                tempQueue.pop();

            }

            cout << endl;

        }

    }

}

主函数

int main() {

    // 从键盘输入每条线的人数和顾客id

    for (int i = 0; i < 5; i++) {

        int numCustomers;

        cout << "请输入第" << i + 1 << "条收银线的顾客人数:";

        cin >> numCustomers;

        for (int j = 0; j < numCustomers; j++) {

            int customerId;

            cout << "请输入顾客ID:";

            cin >> customerId;

            addCustomer(i, customerId);

        }

    }

    // 显示菜单

    int choice;

    do {

        cout << "菜单:" << endl;

        cout << "1. 增加顾客" << endl;

        cout << "2. 查找最短队伍" << endl;

        cout << "3. 将顾客插入其他队伍" << endl;

        cout << "4. 添加顾客朋友" << endl;

        cout << "5. 打印每条队伍的人数以及排队情况" << endl;

        cout << "0. 退出" << endl;

        cout << "请选择操作:" << endl;

        cin >> choice;

        switch (choice) {

        case 1: {

            int cashierIndex, customerId;

            cout << "请输入收银线编号和顾客ID:";

            cin >> cashierIndex >> customerId;

            addCustomer(cashierIndex - 1, customerId);

            break;

        }

        case 2: {

            int shortestQueue = findShortestQueue();

            cout << "最短队伍为第" << shortestQueue + 1 << "条收银线" << endl;

            break;

        }

        case 3: {

            int sourceCashier, targetCashier, customerId;

            cout << "请输入源收银线、目标收银线和顾客ID:";

            cin >> sourceCashier >> targetCashier >> customerId;

            insertCustomer(sourceCashier - 1, targetCashier - 1, customerId);

            break;

        }

        case 4: {

            int friendId, targetCashier, customerId;

            cout << "请输入朋友ID、目标收银线和顾客ID:";

            cin >> friendId >> targetCashier >> customerId;

            addFriend(friendId, targetCashier - 1, customerId);

            break;

        }

        case 5: {

            printQueueStatus();

            break;

        }

        case 0: {

            cout << "退出程序" << endl;

            break;

        }

        default: {

            cout << "无效操作" << endl;

            break;

        }

        }

    } while (choice != 0);

    return 0;

}

运行结果

  

标签:cout,targetCashier,int,排队,队伍,模拟程序,杂货店,cashiers,customerId
From: https://blog.csdn.net/jzybkse/article/details/140211512

相关文章

  • 知识不成体系?这篇Mysql数据库将成为你的解忧杂货店!(子查询)
     欢迎来到@一夜看尽长安花博客,您的点赞和收藏是我持续发文的动力对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论的问题可联系我:[email protected]。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。   专栏:java全栈C&C++PythonAIP......
  • 马尔可夫排队网络——Python分析
    马尔科夫排队网络(MarkovianQueueingNetworks)是一类特殊的排队网络,假设系统中的到达过程和服务时间均遵循指数分布,系统状态之间的转移遵循马尔可夫性质。这些假设使得马尔科夫排队网络可以通过解析方法进行分析,从而为实际系统的设计和性能优化提供理论依据。通过理论推导和模型构......
  • 答题判题程序终版与家居强电电路模拟程序两次迭代
    目录:一)前言二)设计与分析三)踩坑心得四)改进建议五)总结一.前言(1)答题判题程序-4:【1】知识点:正则表达式,判题的逻辑思维能力,数据形式转换。【2】题量:很大【3】难度:很难是前三次答题判题程序迭代优化的最终形态,难度较高,它对于类的种类的个数已经类与类之间的关系的理解要求更......
  • 银行排队问题之单队列多窗口服务
    1.题目7-5银行排队问题之单队列多窗口服务分数25全屏浏览切换布局作者DS课程组单位浙江大学假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选......
  • 【华为OD】D卷真题100分:高矮个子排队 python代码实现[思路+代码]
    【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客 JS、C、python、Java、C++代码实现:【华为OD】D卷真题100分:高矮个子排队JavaScript代码实现[思路+代码]......
  • 答题判题程序4,家居强电电路模拟程序1~2总结
    前言答题判题程序41.知识点总结先看主要新增内容:(1)输入选择题题目信息题目信息为独行输入,一行为一道题,多道题可分多行输入。新增约束:标准答案中如果包含多个正确答案(多选题),正确答案之间用英文空格分隔。输出格式与一般答卷题目的输出一致,判断结果除了true、false,增加一项”p......
  • 【华为OD】D卷真题100分:高矮个子排队 JavaScript代码实现[思路+代码]
    【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客JS、C、python、Java、C++代码实现:【华为OD】D卷真题100分:高矮个子排队JavaScript代码实现[思路+代码]-C......
  • 关于答题判题程序4和家居强电电路模拟程序-1与2的总结
    前言:前面3次作业相对来说比较简单,答题判题程序虽然又更新了,但是有以往的程序基础就比较简单了。这次就只是加上了几个多选选择题和多选填空题,就只要将正则表达式修改一下就可以了基本判断也是可以不用改变的。这次的家电强电电路模拟程序也是比较新颖,其中映入眼帘的就是它的题目要......
  • 家居强电电路模拟程序
    智能家居是在当下家庭中越来越流行的一种配置方案,它通过物联网技术将家中的各种设备(如音视频设备、照明系统、窗帘控制、空调控制、安防系统、数字影院系统、影音服务器、影柜系统、网络家电等)连接到一起,提供家电控制、照明控制、电话远程控制、室内外遥控、防盗报警、环境监测、......
  • 1319:【例6.1】排队接水
    题目网址:信息学奥赛一本通(C++版)在线评测系统题目介绍:1319:【例6.1】排队接水时间限制:1000ms      内存限制:65536KB提交数:45180   通过数: 22285【题目描述】有n�个人在一个水龙头前排队接水,假如每个人接水的时间为Ti��,请编程找出这n�个人排队的一种顺......