银行业务模拟 数据结构课程设计

niuniu317 2009-04-14 08:08:32
假设某银行有4个窗口对外接待客户,从早晨银行开门起不断有客户进入银行,由于每个窗口在某个时刻只能接待一个客户。因此在客户人数众多时需要在每个窗口前顺次排队,对于刚进和银行的客户。如果某个窗口的业务员正空闲,则可上前输业务。反之,若个窗口均有客户所占,他便会排在为数最少的队伍后面。编制一个程序模拟银行的这种业务活动并计算一天中客户在银行的平均逗留时间。
哪位高手指点一下银行业务模拟程序中涉及到的算法思想 谢谢!!!
...全文
1948 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsew2009 2009-06-25
  • 打赏
  • 举报
回复
学习..
shipeng_sunny 2009-04-22
  • 打赏
  • 举报
回复
你学过STL吧,向大牛学习!
li_il 2009-04-15
  • 打赏
  • 举报
回复

// BankWnd.h
#pragma once
#include <queue>
#include "Client.h"

class CBankWnd
{
public:
CBankWnd(void);
~CBankWnd(void);
public:
void push(const CClient&);
void pop(void);
void clear(void);
size_t size(void) const;
bool empty(void) const;


private:
std::queue<CClient> m_queueClients;
};



// BankWnd.cpp
#include "BankWnd.h"

CBankWnd::CBankWnd(void)
{
}

CBankWnd::~CBankWnd(void)
{
}

void CBankWnd::push( const CClient& client)
{
m_queueClients.push(client);
}

void CBankWnd::pop( void )
{
m_queueClients.pop();
}

bool CBankWnd::empty( void ) const
{
return m_queueClients.empty();
}

size_t CBankWnd::size( void ) const
{
return m_queueClients.size();
}

void CBankWnd::clear( void )
{
while(!m_queueClients.empty()){
m_queueClients.pop();
}
}



// Bank.h
#pragma once
#include <ctime>
#include "BankWnd.h"
#include "Client.h"

class CBank
{
public:
CBank(void);
~CBank(void);
public:
void onWork(void);
void offWork(void);
void inBank(const CClient& client);
void outBank(void);
size_t clientTotal(void) const;
size_t stayTimeTotal(void) const;
size_t aveStayTime(void) const;


private:
static const int UNIT_TIME = 20;
static const int NUM_WND = 3;
private:
CBankWnd m_bankWnds[NUM_WND];
size_t m_nClient; // current client number
size_t m_nStayTimeTotal;
size_t m_nClientTotal;
};




// Bank.cpp
#include "Bank.h"

CBank::CBank(void)
:m_nClient(0), m_nClientTotal(0), m_nStayTimeTotal(0)
{
srand((unsigned)time(NULL));
}

CBank::~CBank(void)
{
}

void CBank::inBank(const CClient& client)
{
size_t minLengthWnd(0);
for (size_t idx(0); idx != NUM_WND; ++idx){
if(m_bankWnds[idx].size() < m_bankWnds[minLengthWnd].size()){
minLengthWnd = idx;
}
}
m_bankWnds[minLengthWnd].push(client);

m_nStayTimeTotal += UNIT_TIME;
m_nClientTotal += 1;
m_nClient += 1;
}

void CBank::outBank( void )
{
switch(rand() % NUM_WND){
case 1:
if (!m_bankWnds[0].empty()){
m_bankWnds[0].pop();
m_nClient -= 1;
}
break;
case 2:
if (!m_bankWnds[1].empty()){
m_bankWnds[1].pop();
m_nClient -= 1;
}
break;
case 3:
if (!m_bankWnds[2].empty()){
m_bankWnds[2].pop();
m_nClient -= 1;
}
break;
}

m_nStayTimeTotal += m_nClient * UNIT_TIME;
}

size_t CBank::aveStayTime( void ) const
{
if (m_nClientTotal == 0){
return 0;
}
else{
return m_nStayTimeTotal / m_nClientTotal;
}
}

void CBank::onWork( void )
{
m_nClient = 0;
m_nClientTotal = 0;
m_nStayTimeTotal = 0;
}

void CBank::offWork( void )
{
for (size_t idx(0); idx != NUM_WND; ++idx){
m_bankWnds[idx].clear();
}
m_nClient = 0;
}

size_t CBank::clientTotal( void ) const
{
return m_nClientTotal;
}

size_t CBank::stayTimeTotal( void ) const
{
return m_nStayTimeTotal;
}



// client.h

#pragma once

class CClient
{
public:
CClient(void);
~CClient(void);
};

bool operator<(const CClient& lClient,const CClient& rClient);
bool operator==(const CClient& lClient,const CClient& rClient);
bool operator!=(const CClient& lClient,const CClient& rClient);



// client.cpp
#include "Client.h"

CClient::CClient(void)
{
}

CClient::~CClient(void)
{
}


bool operator<(const CClient& lClient,const CClient& rClient)
{
return false;
}

bool operator==( const CClient& lClient,const CClient& rClient )
{
return false;
}

bool operator!=( const CClient& lClient,const CClient& rClient )
{
return true;
}



#include "Bank.h"
#include "Client.h"
#include <iostream>


int _tmain(int argc, _TCHAR* argv[])
{
CBank myBank;
CClient client;

myBank.onWork();

for (size_t i(0); i != 10; ++i){
for (size_t j(0); j != 5; ++j){
if (rand() % 100 > 50){
myBank.inBank(client);
}
}
for (size_t j(0); j != 5; ++j){
myBank.outBank();
}
}

myBank.offWork();

std::cout <<myBank.clientTotal() << '\n';
std::cout << myBank.stayTimeTotal() << '\n';
std::cout << myBank.aveStayTime() << '\n';

return 0;
}


有些地方写的不好。
niuniu317 2009-04-15
  • 打赏
  • 举报
回复
谢谢各位指点
li_il 2009-04-14
  • 打赏
  • 举报
回复
class CBank
{
public:
CBank(void);
~CBank(void);
public:
void inBank(CClient*);
void outBank(void);
size_t aveStayTime(void) const;


private:
std::queue<CClient*> m_bankWnds[3]; //三个窗口
size_t m_nClient; // 当前银行人数
size_t m_nStayTimeTotal; // 逗留的总时间
size_t m_nClientTotal; // 全天总人数
};
每次调用inBank的时候,加合适时间。
每一次调用outBank的时候,如果客户出去以后银行还有人,那么总时间加上合适的时间。

仓促写的,可能有很多没考虑。
li_il 2009-04-14
  • 打赏
  • 举报
回复
我觉得你说的够清楚了,你都把整个过程描述出来了,你肯定就知道该如何编程了吧?

我说一下我的想法:

1.一个银行有3个窗口。

2.一个客户去银行办理金融业务。

银行是一个类,窗口是一个类,客户也是一个类。

客户进入银行。。。。(我具体一点说)银行.in客户(客户)。

客户选择哪个窗口是一个问题,你要明白客户是不太想自己数现在哪个窗口有多少人排队,如果银行知道那个窗口有多少人排队,或者更精确一点,哪个窗口知道自己
这个窗口前面有多少人,那是不是就可以找个LCD屏幕,显示一下现在有多少人排队?这样客户就很方便的知道该排哪个队了?

一个客户办完当前业务,就离开银行,银行.out客户()。

银行知道客户进来了,那么就知道一天进来了多少人,客户出去了,那银行肯定知道现在整个银行剩下多少人。
剩下超过0人,计时,没人,不记时。

最后,你想知道平均逗留时间,银行.平均逗留时间(),就行了。

很简单吧?
dbianbian 2009-04-14
  • 打赏
  • 举报
回复
貌似这是严蔚敏那本数据结构的一道例题
wxc0077 2009-04-14
  • 打赏
  • 举报
回复
四个队列
class CQueue
{
pubilc:
pop();//表示处理完业务,脱离队伍
push();//排入队伍中,等待
getCount(int& count);//得到队列现有数量
private:
int m_Count; //队列现有数量
}
你只要去判断m_Count,然后调用push()方法就好了
lean_NB 2009-04-14
  • 打赏
  • 举报
回复
呵呵 前几天研究了一阵子的算法。
其实主要是用链表记录事件,队列记录4个排队
na2650945 2009-04-14
  • 打赏
  • 举报
回复
友情up。
等待大牛。
t1397018 2009-04-14
  • 打赏
  • 举报
回复
~用一个数组存放每个窗口上的人数
每个客户进来到人最少的地方就行了
~~
随着元宇宙概念兴起与虚拟数字人技术快速发展,虚拟主播、在线教育虚拟助教、元宇宙社交等应用场景对实时动作表情驱动系统提出更高需求。当前主流动作捕捉方案多依赖专业光学动捕设备或深度相机,设备成本高昂、部署复杂,难以在普通用户场景普及。本研究设计并实现一套基于普通单目摄像头的虚拟数字人实时动作表情驱动系统,旨在降低数字人内容生产门槛。系统采用Unity作为主开发引擎,结合Blender进行数字人模型构建与BlendShape表情系统制作,使用MediaPipe框架实现人脸关键点检测与人体姿态估计,通过C#脚本完成实时数据处理与渲染控制。系统包含五个关键模块:人脸关键点检测(MediaPipe Face Mesh提取468个关键点)、人体姿态估计(MediaPipe Pose识别33个骨骼关键点)、表情迁移映射、动作平滑优化(卡尔曼滤波与贝塞尔曲线插值消除抖动)、实时渲染(60fps流畅渲染,支持直播推流与视频录制)。实验结果表明,系统在普通笔记本上可实现60fps实时驱动,人脸关键点检测准确率达98.7%,人体姿态估计平均误差小于5像素,表情迁移相似度达92.3%。 【课程报告内容】 摘要 第1章 绪论 第2章 相关技术与理论基础 第3章 系统架构设计 第4章 关键模块设计与实现 第5章 实验与结果分析 第6章 总结与展望 参考文献
内容概要:本文提出了一种基于蒙特卡洛模拟与拉格朗日松弛法的分散式优化策略,用于解决电动汽车充电站在分时电价机制下的有序充电调度问题。通过蒙特卡洛方法模拟电动汽车充电行为的随机性,生成多样化负荷场景,构建以降低电网负荷波动和用户充电成本为目标的优化模型;采用拉格朗日松弛法对耦合约束进行解耦,实现分布式求解,在保障用户隐私的同时提升计算效率。文中设计了详细的仿真场景,系统分析了该调度策略对电网负荷特性和用户经济性的影响,验证了所提方法在实际应用中的有效性与可行性。; 适合人群:具备电力系统运行、优化算法理论及Matlab编程能力的研究生、科研人员以及从事智能电网与电动汽车相关领域的工程技术人员。; 使用场景及目标:①应用于城市规模化充电站集群的有序充电管理,实现电网“削峰填谷”;②为电力公司制定科学合理的分时电价政策提供量化分析工具;③支撑智能电网中需求侧资源的分布式协同优化调度研究与系统设计。; 阅读建议:建议结合提供的Matlab代码深入理解算法实现流程,重点掌握蒙特卡洛场景生成机制与拉格朗日松弛迭代求解过程,可通过调整参数设置复现不同工况下的仿真结果,以深化对分散式优化机制与调度效果之间关系的理解。
内容概要:本文研究了基于阶跃响应的V-Tiger自动增益调整PID控制器优化方法,并提供了完整的Matlab代码实现。通过深入分析PID控制的核心性能指标与V-Tiger控制器的动态特性,提出了一种融合阶跃响应特征提取与多目标协同优化的自动整定方案,设计了具备自适应迭代校正能力的优化机制,有效提升了控制系统的响应速度、稳定性和抗干扰能力。文中系统阐述了整定原理、算法架构设计及性能验证流程,通过仿真实验充分验证了该方法在复杂工业控制场景下实现高精度参数自整定的可行性与优越性,为智能PID控制提供了可复现、可拓展的技术路径。; 适合人群:具备自动控制理论基础和Matlab编程能力,从事控制工程、自动化、电气工程等领域研究的研发人员及高校研究生。; 使用场景及目标:①应用于需要高精度PID参数整定的工业控制系统中,如电机驱动、温度控制、电力电子变换器等;②为科研人员提供一种可复现、可扩展的智能PID整定方法,用于提升系统动态性能与鲁棒性;③作为教学案例帮助学生理解PID整定原理与现代优化算法的融合应用。; 阅读建议:建议读者结合文中的Matlab代码逐模块运行与调试,重点关注阶跃响应特征提取与增益优化策略的实现逻辑,同时可尝试将其应用于实际控制系统中进行对比验证,以深化对自动整定机制的理解。

65,212

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧