m0_74882001 2023-11-26 10:30 采纳率: 25%
浏览 28
已结题

用C语言编写银行业务活动的模拟

用C语言编写(需要写清楚注释)
银行业务活动的模拟
任务:假设某银行有4个窗口对外接待客户,从早晨银行开门起不断有客户进入银行,由于每个窗口在某个时刻只能接待一个客户。因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进入银行的客户。如果某个窗口的业务员正空闲,则可上前输业务。反之,若个窗口均有客户所占,他便会排在为数最少的队伍后面。编制一个程序模拟银行的这种业务活动并计算一天中客户在银行的平均逗留时间。
功能要求:
1).实现数据的输入;
2).各个窗口数据的访问和输出;
3)当前窗口的人员分布情况动态显示。
界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:学生自己根据系统功能要求自己设计。请在最后的上交资料中指明你用到的存储结构;
测试数据:要求使用1、全部合法数据;2、整体非法数据;3、局部非法数据。进行程序测试,以保证程序的稳定。测试数据及测试结果请在上交的资料中写明;

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-11-26 10:30
    关注

    引自强大而免费的微信小程序:皆我百晓生

    以下是一个简单的C语言程序,用于模拟银行窗口的业务活动,并计算客户在银行的平均逗留时间。程序使用队列(链表实现)作为存储结构。

    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct Node {
        int data;
        int serviceTime;
        struct Node* next;
    } Node;
    
    typedef struct Queue {
        Node* front;
        Node* rear;
        int size;
    } Queue;
    
    void initQueue(Queue* queue) {
        queue->front = NULL;
        queue->rear = NULL;
        queue->size = 0;
    }
    
    void enqueue(Queue* queue, int data, int serviceTime) {
        Node* newNode = (Node*)malloc(sizeof(Node));
        newNode->data = data;
        newNode->serviceTime = serviceTime;
        newNode->next = NULL;
    
        if (queue->rear == NULL) {
            queue->front = newNode;
            queue->rear = newNode;
        } else {
            queue->rear->next = newNode;
            queue->rear = newNode;
        }
    
        queue->size++;
    }
    
    void dequeue(Queue* queue) {
        if (queue->front == NULL) {
            printf("队列为空\n");
            return;
        }
    
        Node* temp = queue->front;
    
        queue->front = queue->front->next;
        free(temp);
    
        if (queue->front == NULL) {
            queue->rear = NULL;
        }
    
        queue->size--;
    }
    
    int getSize(Queue* queue) {
        return queue->size;
    }
    
    void displayWindowData(Queue* windows, int windowCount) {
        for (int i = 0; i < windowCount; i++) {
            printf("窗口%d的人员分布为:%d人\n", i + 1, getSize(&windows[i]));
            
            Node* current = windows[i].front;
            while (current != NULL) {
                printf("客户%d 服务时长:%d分钟\n", current->data, current->serviceTime);
                current = current->next;
            }
    
            printf("\n");
        }
    }
    
    int main() {
        int windowCount = 4;
        Queue* windows = (Queue*)malloc(windowCount * sizeof(Queue));
        int totalTime = 0;
        int totalCustomers = 0;
        int maxQueueSize = 0;
        int totalQueueTime = 0;
    
        // 初始化窗口
        for (int i = 0; i < windowCount; i++) {
            initQueue(&windows[i]);
        }
    
        while (1) {
            int option;
            printf("------------------\n");
            printf("1. 输入客户数据\n");
            printf("2. 查看窗口状态\n");
            printf("0. 退出\n");
            printf("------------------\n");
            printf("请选择菜单项:");
            if (scanf("%d", &option) != 1) {
                printf("输入内容非法,请重新输入。\n");
                scanf("%*s");  // 清空输入缓冲区
                continue;
            }
    
            if (option == 0) {
                break;
            }
    
            switch (option) {
                case 1: {
                    int numCustomers;
                    printf("请输入进入银行的客户人数:");
                    if (scanf("%d", &numCustomers) != 1) {
                        printf("输入内容非法,请重新输入。\n");
                        scanf("%*s");  // 清空输入缓冲区
                        continue;
                    }
    
                    printf("请依次输入每位客户的业务所需时间:\n");
                    for (int i = 0; i < numCustomers; i++) {
                        int serviceTime;
                        printf("客户%d:", i + 1);
                        if (scanf("%d", &serviceTime) != 1) {
                            printf("输入内容非法,请重新输入。\n");
                            scanf("%*s");  // 清空输入缓冲区
                            i--;
                            continue;
                        }
    
                        totalCustomers++;
                        int minSizeWindow = 0;
                        for (int j = 1; j < windowCount; j++) {
                            if (getSize(&windows[j]) < getSize(&windows[minSizeWindow])) {
                                minSizeWindow = j;
                            }
                        }
    
                        enqueue(&windows[minSizeWindow], totalCustomers, serviceTime);
                    }
    
                    maxQueueSize = 0;
                    for (int i = 0; i < windowCount; i++) {
                        if (getSize(&windows[i]) > maxQueueSize) {
                            maxQueueSize = getSize(&windows[i]);
                        }
                    }
    
                    displayWindowData(windows, windowCount);
                    break;
                }
                case 2: {
                    int windowNumber;
                    printf("请输入窗口号:");
                    if (scanf("%d", &windowNumber) != 1) {
                        printf("输入内容非法,请重新输入。\n");
                        scanf("%*s");  // 清空输入缓冲区
                        continue;
                    }
    
                    if (windowNumber < 1 || windowNumber > windowCount) {
                        printf("窗口号不合法,请重新输入。\n");
                        continue;
                    }
    
                    printf("窗口%d的人员分布为:%d人\n", windowNumber, getSize(&windows[windowNumber - 1]));
                    Node* current = windows[windowNumber - 1].front;
                    while (current != NULL) {
                        printf("客户%d 服务时长:%d分钟\n", current->data, current->serviceTime);
                        current = current->next;
                    }
                    printf("\n");
                    break;
                }
                default:
                    printf("菜单项不存在,请重新选择。\n");
                    break;
            }
        }
    
        for (int i = 0; i < windowCount; i++) {
            while (getSize(&windows[i]) > 0) {
                int numCustomers = getSize(&windows[i]);
                for (int j = 0; j < numCustomers; j++) {
                    Node* current = windows[i].front;
                    totalTime += current->serviceTime;
                    totalQueueTime += current->serviceTime * j;
                    dequeue(&windows[i]);
                }
            }
        }
        
        double avgTime = (double)(totalTime + totalQueueTime) / totalCustomers;
        printf("客户在银行的平均逗留时间为:%.2f分钟\n", avgTime);
        printf("银行排队的最大长度为:%d人\n", maxQueueSize);
    
        free(windows);
    
        return 0;
    }
    

    上述代码中使用了一个包含四个队列的数组 Queue windows[4],每个队列表示一个窗口。每次有客户进入银行时,选择队列大小最小的窗口,将客户的业务所需时间入队。最后,遍历所有窗口的队列,将每个客户的业务所需时间累加,得到总的逗留时间,再根据窗口数量求平均值即可。

    请确保在运行程序时输入符合测试要求的数据,如合法数据、整体非法数据和局部非法数据,以保证程序的稳定性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月4日
  • 已采纳回答 11月26日
  • 创建了问题 11月26日

悬赏问题

  • ¥15 急,ubuntu安装后no caching mode page found等
  • ¥15 防火墙的混合模式配置
  • ¥15 Ubuntu不小心注销了要怎么恢复啊
  • ¥15 win10电脑安装完plcsim advanced4.0运行时为什么会提示找不到虚拟网卡
  • ¥15 安装powerbuilder10卡在安装程序正在运行这个页面 没有下一步任何指令
  • ¥15 关于mpi的问题:请问遇到这种情况需要怎么解决,出现这个问题后电脑不能进行mpi多核运行只能进行单核运行
  • ¥50 微信聊天记录备份到电脑提示成功了,但还是没同步到电脑微信
  • ¥15 python怎么在已有视频文件后添加新帧
  • ¥20 虚幻UE引擎如何让多个同一个蓝图的NPC执行一样的动画,
  • ¥15 fluent里模拟降膜反应的UDF编写