小玩意 - 银行业务的模拟系统(C++)

简介: 小玩意 - 银行业务的模拟系统(C++)

题目描述:设计一个银行业务模拟系统,模拟银行的业务运行并计算一天中客户在银行逗留的平均时间。银行有N(N的取值自己定义)个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正空闲,则可上前办理业务;反之,若N个窗口均有客户所占,他便会排在人数最少的队伍后面。

基本要求:

(1)在界面上可以设定银行的对外营业时间(银行的开门时间以及银行的关门时间)。

(2)用人机交互的方式来输入客户的到达时间以及客户的业务处理时间,用队列来存储客户的到达事件和客户的离开事件。

(3)可以友好的显示出在某一天中整个银行系统中客户在银行逗留的平均时间。



解题思路:类似银行取号系统:比如:哪怕之前某个时刻看似排队在1号窗口(人数最少)最快,但是中途发现其他窗口更快,可以随时调离,取最优情况。

下载链接


代码

#include<bits/stdc++.h>
#include<cmath>
#define mem(a,b) memset(a,b,sizeof a)
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
struct P
{
    int sh,sm,ss; // * 进入时间
    int eh,em,es; // * 离开时间
    int ssum,esum; // 进入时间(s) 离开时间(s)
    int ds,ws; // 处理时间deal(s) 等候时间(s)
};
int cmp(P p1,P p2) // *
{
    return p1.ssum<p2.ssum;
}
int cmp2(P p1,P p2) // *
{
    return p1.esum<p2.esum;
}
struct pq_cmp // 根据先到达的人先处理业务
{
    bool operator()(P p1,P p2)
    {
        return p1.ssum>p2.ssum; // 进入的时间:从小到大
    }
};
struct dpq_cmp // 根据先离开的人先交接并计算结果
{
    bool operator()(P p1,P p2)
    {
        return p1.esum>p2.esum; // 离开的时间:从小到大
    }
};
// 优先队列
// dpq作用:主要用来与下一个交接窗口的人的时间差维护,方便下次加入dpq时,
// 判断谁先出来(即哪个窗口先为空),计算该人离开的逗留时间和。
priority_queue<P,vector<P>,pq_cmp> pq; // 存储入队的人优先到达银行的排在Top
priority_queue<P,vector<P>,dpq_cmp> dpq; // 存储入队的人优先离开银行的排在Top
int h1,m1,s1,h2,m2,s2,n; // 银行营业时间 窗口数
void init() // 初始化
{
    while(!pq.empty()) pq.pop();
    while(!dpq.empty()) dpq.pop();
}
void showBankTime()
{
    printf("Bank OpenTime:\n");
    printf("%02d:%02d A.M.\n",h1,m1);
    printf("%02d:%02d P.M.\n\n",h2,m2);
}
int main()
{
    printf("Please input Bank OpenTime (hh:mm:ss): ");
    while(~scanf("%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2))
    {
        printf("Please input Bank Windows Count: "); scanf("%d",&n);
        printf("\n-----------Start-----------\n");
        init();
        showBankTime();
        int sum,len; sum=len=0; // sum:所有客户逗留时间 len:客户总数
        int sh,sm,ss,ds; // 客户进入银行时间 客户处理业务所需时间
        P ps[1000]; // *
        printf("Ps: Button Ctrl + Z as input end!\n");
        printf("Please input People ArriveTime(hh:mm:ss) and DealTime(s):\n");
        while(~scanf("%d:%d:%d %d",&sh,&sm,&ss,&ds)) // Crtl + Z == break
        {
            P tp;
            tp.ds=ds;
            tp.esum=tp.ssum=sh*3600+sm*60+ss;
            tp.esum+=ds;
            tp.ws=0;
            tp.sh=sh; tp.sm=sm; tp.ss=ss; // *
            pq.push(tp);
            ps[len]=tp; // *
            len++;
            printf("Please input People ArriveTime(hh:mm:ss) and DealTime(s):\n");
        }
//        printf("-------PQueue------\n"); // *
//        for(int i=0;i<len;i++) // *
//        {
//            P tp=pq.top(); pq.pop();
//            printf("P%d:\n",i);
//            printf("SH:SM:SS : %d:%d:%d\n",tp.sh,tp.sm,tp.ss);
//            printf("SSUM : %d\n",tp.ssum);
//            printf("DS : %d\n\n",tp.ds);
//        }
//        printf("-------PQueue------\n"); // *
//        sort(ps,ps+len,cmp); // *
//        printf("-------------------\n"); // *
//        printf("\nPNum == %d\n\n",len); // *
//        for(int i=0;i<len;i++) // *
//        {
//            P tp=ps[i];
//            printf("P%d:\n",i);
//            printf("SH:SM:SS : %d:%d:%d\n",tp.sh,tp.sm,tp.ss);
//            printf("SSUM : %d\n",tp.ssum);
//            printf("WS : %d\n",tp.ws);
//            printf("DS : %d\n\n",tp.ds);
//        }
//        printf("-------------------\n"); // *
        for(int i=0;i<n;i++) // 补满第一批一开始空的窗口
        {
            dpq.push(pq.top());
            pq.pop();
        }
        int k=0; // *
        while(!pq.empty()) // 即将进入dpq的预备队列pq里如果没有客户,即可退出
        {
            P tdpq=dpq.top(); // 最早离开银行的客户
            // *
//            printf("%dth:\n",k);
//            P tp=tdpq;
//            printf("SH:SM:SS : %d:%d:%d\n",tp.sh,tp.sm,tp.ss);
//            printf("SSUM : %d\n",tp.ssum);
//            printf("DS : %d\n",tp.ds);
//            printf("WS : %d\n",tp.ws);
//            int tp_esum=tp.esum;
//            tp.eh=tp_esum/3600; tp.em=(tp_esum%3600)/60; tp.es=tp_esum%60;
//            printf("EH:EM:ES : %d:%d:%d\n",tp.eh,tp.em,tp.es);
//            printf("ESUM : %d\n\n",tp.esum);
            ps[k++]=tdpq; // *
            dpq.pop();
            P tpq=pq.top(); // 下一个最早进入银行的客户
            // 判断是否下个客户需要等待
            if(tdpq.esum>tpq.ssum) // 需等待
            {
                tpq.ws=tdpq.esum-tpq.ssum; // 即将进入窗口(下个客户)的等待时间
                tpq.esum+=tpq.ws; // 提前计算出即将进入窗口(下个客户)离开的时间
            }
//            else // 无需等待,此处else代码可以省略,因为初始化的时候就是默认该值
//            {
//                tpq.ws=0;
//                tpq.esum+=tpq.ws;
//            }
            sum+=tdpq.esum-tdpq.ssum; // 计算该离开客户的时间差
//            printf("sum == %d\n\n",sum); // *
            dpq.push(tpq); pq.pop();
        }
        while(!dpq.empty()) // 如果dpq里还有剩余的客户,进行最后计算处理
        {
            P tdpq=dpq.top();
            ps[k++]=tdpq; // *
            dpq.pop();
            sum+=tdpq.esum-tdpq.ssum;
                        // *
//            printf("%dth:\n",k);
//            P tp=tdpq;
//            printf("SH:SM:SS : %d:%d:%d\n",tp.sh,tp.sm,tp.ss);
//            printf("SSUM : %d\n",tp.ssum);
//            printf("DS : %d\n",tp.ds);
//            printf("WS : %d\n",tp.ws);
//            int tp_esum=tp.esum;
//            tp.eh=tp_esum/3600; tp.em=(tp_esum%3600)/60; tp.es=tp_esum%60;
//            printf("EH:EM:ES : %d:%d:%d\n",tp.eh,tp.em,tp.es);
//            printf("ESUM : %d\n\n",tp.esum);
//            printf("sum == %d\n\n",sum); // *
        }
//        sort(ps,ps+k,cmp2); // *
//        printf("-------------------\n"); // *
//        printf("\nOutNum == %d\n\n",k); // *
//        for(int i=0;i<k;i++) // *
//        {
//            P tp=ps[i];
//            printf("P%d:\n",i);
//            printf("SH:SM:SS : %d:%d:%d\n",tp.sh,tp.sm,tp.ss);
//            printf("SSUM : %d\n",tp.ssum);
//            printf("DS : %d\n",tp.ds);
//            printf("WS : %d\n",tp.ws);
//            int tp_esum=tp.esum;
//            tp.eh=tp_esum/3600; tp.em=(tp_esum%3600)/60; tp.es=tp_esum%60;
//            printf("EH:EM:ES : %d:%d:%d\n",tp.eh,tp.em,tp.es);
//            printf("ESUM : %d\n\n",tp.esum);
//        }
//        printf("-------------------\n"); // *
        printf("\nAll People Num: %d\n",len);
        printf("All time: %d s\n",sum);
        printf("Avg time: %.2lf s\n",sum*1.0/len);
        printf("\n-----------END-----------\n\n");
        printf("Please input Bank OpenTime: ");
    }
    return 0;
}
目录
相关文章
|
4月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
89 0
|
3月前
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
55 3
|
4月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
105 1
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
4月前
|
Rust 安全 C++
系统编程的未来之战:Rust能否撼动C++的王座?
【8月更文挑战第31天】Rust与C++:现代系统编程的新选择。C++长期主导系统编程,但内存安全问题频发。Rust以安全性为核心,通过所有权和生命周期概念避免内存泄漏和野指针等问题。Rust在编译时确保内存安全,简化并发编程,其生态系统虽不及C++成熟,但发展迅速,为现代系统编程提供了新选择。未来有望看到更多Rust驱动的系统级应用。
69 1
|
4月前
|
存储 算法 数据可视化
【C++】C++旅游管理系统(源码+论文)【独一无二】
【C++】C++旅游管理系统(源码+论文)【独一无二】
|
4月前
|
存储 数据挖掘 C语言
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
|
4月前
|
搜索推荐 数据处理 文件存储
【C++】C++ 培训报名系统 (源码+论文)【独一无二】
【C++】C++ 培训报名系统 (源码+论文)【独一无二】
|
4月前
|
存储 C++
【C++】C++公司人事管理系统(源码)【独一无二】
【C++】C++公司人事管理系统(源码)【独一无二】
140 2
|
4月前
|
存储 数据可视化 C++
【C++】C++-机房收费管理系统(源码+注释)【独一无二】
【C++】C++-机房收费管理系统(源码+注释)【独一无二】
|
4月前
|
数据可视化 C++
【C++】C++商店销售管理系统(源码+论文)【独一无二】
【C++】C++商店销售管理系统(源码+论文)【独一无二】
下一篇
DataWorks