急呀!!!三百分(没办法一次只能放100分,谁改对了马上就开贴放分)!! 帮忙修改一下程序(只想up的就不要进来了)

gsp397 2003-08-19 09:51:36
编译没问题,但运行出忽预料。大家看看算发描述和程序,再运行一下就知道了。




程序算法描述:
此程序为银行业务模拟系统,计算银行在规定时间内所有客户的停留时
间。银行有两个窗口(即有两个客户队列),但在同一时间内只有一个
窗口服务(即一次只能接待一个客户)。客户分为两类,一种为取钱,
一种为存钱。客户到达银行后先排在第一个队列的列尾,如果第一个队
列为空则银行会马上接待他,否则需要排队等待。银行在处理队头客户
时需要检查是否满足接待条件,如果客户是取钱而且超过银行现有的余
额,则将其排到第二个队列后,当然如果是存钱则会接待。再有银行每
处理一个存钱客户就要检查一遍第二个队列处理所有满足办理条件的客
户。到规定时间后所有客户必须马上离开。

再有客户到达,离开,办理时务所需时间都是随机产生的。
...全文
24 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
gsp397 2003-08-20
  • 打赏
  • 举报
回复
楼上的什么意思呀??
sharkhuang 2003-08-20
  • 打赏
  • 举报
回复
找个不是教材吗?
gsp397 2003-08-20
  • 打赏
  • 举报
回复
#include <queue>
#include <list>
#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

//事件类
class event
{
public:
event() { }
event(int a,bool b,int c,int d,int e,event *p=NULL)
:time(a),lable(b),durtime(c),intertime(d),money(e),next(p)
{ }
event(const event& e)
{
time=e.rtime();
lable=e.rlable();
durtime=e.rdurtime();
intertime=e.rintertime();
money=e.rmoney();
next=e.rnext();
}

~event()
{
delete next;
}

event& operator=(const event &e)//重载赋值操作符
{
time=e.rtime();
lable=e.rlable();
durtime=e.rdurtime();
intertime=e.rintertime();
money=e.rmoney();
next=e.rnext();
return *this;
}

void do_lable(bool x)
{
lable=x;
}

void do_time(int x)
{
time=x;
}

int rtime()const
{
return time;
}

bool rlable()const
{
return lable;
}
int rdurtime()const
{
return durtime;
}

int rintertime()const
{
return intertime;
}

int rmoney()const
{
return money;
}

event* rnext() const
{
return next;
}

bool operator==(const event &e)
{
return( (durtime==e.rdurtime())&&(intertime==e.rintertime())&&(money==e.rmoney()));
}

bool operator<=(const event &e)
{
return( (durtime<=e.rdurtime())&&(intertime<=e.rintertime())&&(money<=e.rmoney()));
}

private:
int time; //如果为到达事件则表示到达时间,如果为离开事件则表示离开时间
bool lable; //true表示客户到达事件,false表示客户离开事件
int durtime; //办理事务所需时间
int intertime; //下一客户即将到达的时间间隔
int money; //钱数:正数则为存钱,负数则为取钱
event *next;
};

void bank_simulation();

list<event> event_list;//事件表

list<event> q1,q2;//客户队列

int time1,durtime,intertime,money;

double bank_time=0, close_time=600, bank_money=10000, total_time=0;//银行的工作时间

double number=0;//所有进入银行的客户数量

event temp,data;//上一个产生的结点

list<event>::iterator p = event_list.begin();

int up_durtime,down_durtime,up_intertime,down_intertime,up_money,down_money;

event create_node()
{
time1 = temp.rtime() + temp.rintertime();
durtime=rand()%(up_durtime-down_durtime+1)+down_durtime;
intertime=rand()%(up_intertime-down_intertime+1)+down_intertime;
money=rand()%(up_money-down_money+1)+down_money;
event e(time1,1,durtime,intertime,money);
return e;
}

void customer_arrived()//处理客户到达事件
{
q1.push_back(event_list.front());//将新到达的客户插入到第一个队列里
cout << " 客户到达: 时间: " <<event_list.front().rtime()
<< " 办理所需时间: " <<event_list.front().rdurtime()
<< " 与下一个客户的时间间隔: " <<event_list.front().rintertime()
<< " 钱数"<<event_list.front().rmoney()
<< endl;

temp = create_node();
event_list.push_back(temp);
number += 1;//客户数量加1

int i = 0;//标记是否有客户正在处理
p = event_list.begin();
while (p != event_list.end())
{
if (p -> rlable()) {
p++;
} else {
i=1;
break;
}
}

if ( i == 0 ) {//如果没有要离开的客户说明银行时间已经停止,这时需要用新的客户到达时间来修改银行的时间
bank_time = event_list.front().rtime();//如果有客户正在处理,则不用做修改,因为在生成离开事件时会修改银行工作时间
}

if (!q1.empty() && 0 == i)//如果第一个队列不为空而且在时间表中没有找到离开事件说明队头客户是刚进入银行的则处理之
{
data = q1.front();
if (bank_money + data.rmoney() >= 0)//银行余额足够则处理
{
bank_money = bank_money + data.rmoney();
bank_time = bank_time+data.rdurtime();
data.do_time(bank_time);
data.do_lable(false);

p = event_list.begin();
while (p != event_list.end())
{
if (p->rtime() < data.rtime()) {
p++;
} else {
break;
}
}

event_list.insert(p, data);//生成离开事件并插入事件表
}
else
{
q2.push_back(q1.front());
q1.pop_front();
}
}
}
void customer_departure()//处理客户离开事件
{
if (!q1.empty() && q1.front() == event_list.front())//删除即将离开的客户,并计算其停留时间
{
cout << " 客户离开 时间:" << event_list.front().rtime()
<< " 办理所需时间:" << event_list.front().rdurtime()
<< " 与下一个客户的时间间隔:" << event_list.front().rintertime()
<< " 钱数" << event_list.front().rmoney()
<< endl;

total_time += event_list.front().rtime()-q1.front().rtime();
bank_time = event_list.front().rtime();

q1.pop_front();
}
else //if (!q2.empty())
{ //if (q2.empty()) cout << endl << endl << "aha" <<endl<<endl;
cout << " 客户离开 时间:" << event_list.front().rtime()
<< " 办理所需时间:" << event_list.front().rdurtime()
<< " 与下一个客户的时间间隔:" << event_list.front().rintertime()
<< " 钱数" << event_list.front().rmoney()
<< endl;

total_time += event_list.front().rtime()- q2.front().rtime();
bank_time = event_list.front().rtime();

q2.pop_front();
}


if (event_list.front().rmoney() > 0 && !q2.empty()) //每处理完一个存钱客户就要遍历第二个队列,处理所有满足办理条件的客户
{
p = q2.begin();
while (p != q2.end())//遍历第二个队列
{
if ((p->rmoney() + bank_money) > 0)
{
data = *p;
bank_time = bank_time + data.rdurtime();
data.do_time(bank_time);
data.do_lable(false);

list<event>::iterator q = event_list.begin();
while (q != event_list.end())
{
if (q->rtime() < data.rtime())
q++;
else
break;
}
event_list.insert(q, data);//生成离开事件,并插入事件表
}
p++;
}
}
}

void bank_simulation()//银行业务模拟函数
{
srand(time(0));//随机数发生器(用系统时间作为种子)
durtime=rand()%(up_durtime-down_durtime+1)+down_durtime;
intertime=rand()%(up_intertime-down_intertime+1)+down_intertime;
money=rand()%(up_money-down_money+1)+down_money;
event e(0,1,durtime,intertime,money,0);//生成第一个到达事件
event_list.push_back(e);//插入事件表
temp=e;

while(bank_time < close_time)
{
if(event_list.front().rlable())
customer_arrived();//处理到达事件
else
customer_departure();//处理离开事件

event_list.pop_front();
}

p=q1.begin();
while (p != q1.end())//处理到达银行关闭时间,在银行里没有被接待的客户所停留的时间
{
total_time += close_time - p->rtime();
p++;
}

p=q2.begin();
while (p != q2.end())
{
total_time += close_time - p->rtime();
p++;
}
}

int main(int argc, char **argv)
{
cout<<"请输入初始时银行现存资金总额"<<endl;
cin>>bank_money;
cout<<"请输入银行总的工作时间"<<endl;
cin>>close_time;
cout<<"请分别输入客户交易时间,与下一个到达客户的时间间隔,钱数(正数代表存钱,负数代表取钱)的上下界"<<endl;
cin>>up_durtime>>down_durtime>>up_intertime>>down_intertime>>up_money>>down_money;
if((up_durtime<down_durtime)||(up_intertime<down_intertime)||(up_money<down_money))
cerr<<"输入错误"<<endl;
bank_simulation();
cout << "客户平局停留时间: " << total_time / number << endl;
system("PAUSE");
return 0;
}
gsp397 2003-08-20
  • 打赏
  • 举报
回复
非常感谢楼上!:)
(我大二)
按照你修改后程序运行。为什么客户停留时间会那么长????开始时,银行的余额足够用了,第二个队列根本没用上,用户不会等那么长时间吧。

以下是我稍加修改后的程序(随机变量的上下界和银行总额还有总的营业时间均由自己输入。但是运行后会出现超过银行营业时间的客户也被显示出来并参加客户停留时间的计算了。请帮忙再改一下!
比如规定银行的营业时间不能超过10分钟,但最后显示结果时(有的时候),有可能出现12分钟也有客户到达。
gsp397 2003-08-20
  • 打赏
  • 举报
回复
告诉大家一个好消息,我终于把程序改过来了。以下是修改后的程序,希望大家再帮我测试一下,看看还有什么不对的地方。


#include <queue>
#include <list>
#include <iostream>
#include <ctime>
#include <cstdlib>

using namespace std;

//事件类
class event
{
public:
event() { }
event(int a,bool b,int c,int d,int e,event *p=NULL)
:time(a),lable(b),durtime(c),intertime(d),money(e),next(p)
{ }
event(const event& e)
{
time=e.rtime();
lable=e.rlable();
durtime=e.rdurtime();
intertime=e.rintertime();
money=e.rmoney();
next=e.rnext();
}

~event()
{
delete next;
}

event& operator=(const event &e)//重载赋值操作符
{
time=e.rtime();
lable=e.rlable();
durtime=e.rdurtime();
intertime=e.rintertime();
money=e.rmoney();
next=e.rnext();
return *this;
}

void do_lable(bool x)
{
lable=x;
}

void do_time(int x)
{
time=x;
}

int rtime()const
{
return time;
}

bool rlable()const
{
return lable;
}
int rdurtime()const
{
return durtime;
}

int rintertime()const
{
return intertime;
}

int rmoney()const
{
return money;
}

event* rnext() const
{
return next;
}

bool operator==(const event &e)
{
return( (durtime==e.rdurtime())&&(intertime==e.rintertime())&&(money==e.rmoney()));
}

bool operator<=(const event &e)
{
return( (durtime<=e.rdurtime())&&(intertime<=e.rintertime())&&(money<=e.rmoney()));
}

private:
int time; //如果为到达事件则表示到达时间,如果为离开事件则表示离开时间
bool lable; //true表示客户到达事件,false表示客户离开事件
int durtime; //办理事务所需时间
int intertime; //下一客户即将到达的时间间隔
int money; //钱数:正数则为存钱,负数则为取钱
event *next;
};

void bank_simulation();

list<event> event_list;//事件表

list<event> q1,q2;//客户队列

int time1,durtime,intertime,money;

double bank_time=0, close_time=600, bank_money=10000, total_time=0;//银行的工作时间

double number=0;//所有进入银行的客户数量

event temp,data;//上一个产生的结点

list<event>::iterator p = event_list.begin();

int up_durtime,down_durtime,up_intertime,down_intertime,up_money,down_money;

event create_node()
{
time1 = temp.rtime() + temp.rintertime();
durtime=rand()%(up_durtime-down_durtime+1)+down_durtime;
intertime=rand()%(up_intertime-down_intertime+1)+down_intertime;
money=rand()%(up_money-down_money+1)+down_money;
event e(time1,1,durtime,intertime,money);
return e;
}

void customer_arrived()//处理客户到达事件
{
q1.push_back(event_list.front());//将新到达的客户插入到第一个队列里
cout << " 客户到达: 时间: " <<event_list.front().rtime()
<< " 办理所需时间: " <<event_list.front().rdurtime()
<< " 与下一个客户的时间间隔: " <<event_list.front().rintertime()
<< " 钱数"<<event_list.front().rmoney()
<< endl;

temp = create_node();
event_list.push_back(temp);
number += 1;//客户数量加1

int i = 0;//标记是否有客户正在处理
p = event_list.begin();
while (p != event_list.end())
{
if (p -> rlable()) {
p++;
} else {
i=1;
break;
}
}
bank_time = event_list.front().rtime();
if (!q1.empty() && (0 == i))//如果第一个队列不为空而且在时间表中没有找到离开事件说明队头客户是刚进入银行的则处理之
{
data = q1.front();
if (bank_money + data.rmoney() >= 0)//银行余额足够则处理
{
data.do_time(bank_time+data.rdurtime());
data.do_lable(false);

p = event_list.begin();
while (p != event_list.end())
{
if (p->rtime() < data.rtime()) {
p++;
} else {
break;
}
}

event_list.insert(p, data);//生成离开事件并插入事件表
}
else
{
q2.push_back(q1.front());
q1.pop_front();
}
}
}
void customer_departure()//处理客户离开事件
{
if (!q1.empty() && q1.front() == event_list.front())//删除即将离开的客户,并计算其停留时间
{
cout << " 客户离开 时间:" << event_list.front().rtime()
<< " 办理所需时间:" << event_list.front().rdurtime()
<< " 与下一个客户的时间间隔:" << event_list.front().rintertime()
<< " 钱数" << event_list.front().rmoney()
<< endl;
bank_money+=event_list.front().rmoney();
total_time += event_list.front().rtime()-q1.front().rtime();
bank_time = event_list.front().rtime();

q1.pop_front();
}
else //if (!q2.empty())
{ //if (q2.empty()) cout << endl << endl << "aha" <<endl<<endl;
cout << " 客户离开 时间:" << event_list.front().rtime()
<< " 办理所需时间:" << event_list.front().rdurtime()
<< " 与下一个客户的时间间隔:" << event_list.front().rintertime()
<< " 钱数" << event_list.front().rmoney()
<< endl;
bank_money+=event_list.front().rmoney();
total_time += event_list.front().rtime()- q2.front().rtime();
bank_time = event_list.front().rtime();

q2.pop_front();
}


if ((event_list.front().rmoney() > 0 )&& !q2.empty()) //每处理完一个存钱客户就要遍历第二个队列,处理所有满足办理条件的客户
{
p = q2.begin();
while (p != q2.end())//遍历第二个队列
{
if ((p->rmoney() + bank_money) > 0)
{
data = *p;
data.do_time(bank_time+data.rdurtime());
data.do_lable(false);

list<event>::iterator q = event_list.begin();
while (q != event_list.end())
{
if (q->rtime() < data.rtime())
q++;
else
break;
}
event_list.insert(q, data);//生成离开事件,并插入事件表
}
p++;
}
}
}

void bank_simulation()//银行业务模拟函数
{
srand(time(0));//随机数发生器(用系统时间作为种子)
durtime=rand()%(up_durtime-down_durtime+1)+down_durtime;
intertime=rand()%(up_intertime-down_intertime+1)+down_intertime;
money=rand()%(up_money-down_money+1)+down_money;
event e(0,1,durtime,intertime,money,0);//生成第一个到达事件
event_list.push_back(e);//插入事件表
temp=e;

while((bank_time < close_time)&&(event_list.front().rtime()<close_time))
{
if(event_list.front().rlable())
customer_arrived();//处理到达事件

else
customer_departure();//处理离开事件
event_list.pop_front();

}
p=q1.begin();
while (p != q1.end())//处理到达银行关闭时间,在银行里没有被接待的客户所停留的时间
{
total_time += close_time - p->rtime();
p++;
}

p=q2.begin();
while (p != q2.end())
{
total_time += close_time - p->rtime();
p++;
}
}

int main(int argc, char **argv)
{
cout<<"请输入初始时银行现存资金总额"<<endl;
cin>>bank_money;
cout<<"请输入银行总的工作时间"<<endl;
cin>>close_time;
cout<<"请分别输入客户交易时间,与下一个到达客户的时间间隔,钱数(正数代表存钱,负数代表取钱)的上下界"<<endl;
cin>>up_durtime>>down_durtime>>up_intertime>>down_intertime>>up_money>>down_money;
if((up_durtime<down_durtime)||(up_intertime<down_intertime)||(up_money<down_money))
cerr<<"输入错误: 上界一定要大于或等于下界"<<endl;
bank_simulation();
cout << "客户平局停留时间: " << total_time / number << endl;
system("PAUSE");
return 0;
}
snowman_pc 2003-08-20
  • 打赏
  • 举报
回复
太长,不过我心还好帮你顶一下,

还说UP的别进,

不进哪有人帮你UP呀?
5956 2003-08-20
  • 打赏
  • 举报
回复
太长,有空再慢慢看
gsp397 2003-08-20
  • 打赏
  • 举报
回复
自己顶一下!先
gsp397 2003-08-20
  • 打赏
  • 举报
回复
长点儿没关系,慢慢看嘛!:)


等待帮忙者的出现。。。。。。。。。。。。。。。。。。。。。。。。






























来了吗?? 没来?????????????









:)



希望今天晚上会有人改出来!!
SurmountLi 2003-08-20
  • 打赏
  • 举报
回复
高程课本上好象讲过这个!代码好长,我先去休息一下。By the way佩服!
vsfan 2003-08-20
  • 打赏
  • 举报
回复
太长了!ft
gsp397 2003-08-20
  • 打赏
  • 举报
回复
怎么没人帮忙呀??
gsp397 2003-08-20
  • 打赏
  • 举报
回复
大家也可以帮忙解决一下我上面说的问题,分不够我会再开帖的!:)
rainbowhq 2003-08-20
  • 打赏
  • 举报
回复
我记得这个好象是解决资源争用的问题
你到操作系统一类的书中去找找,肯定有详细的理论介绍,这是个很经典的问题。
gsp397 2003-08-20
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/2167/2167417.xml?temp=.6321222
http://expert.csdn.net/Expert/topic/2167/2167412.xml?temp=.539715

请Wendydd(温迪)一定要光顾上面两个帖子,因为在发此帖时已经说过了,要给300分
Wendydd 2003-08-20
  • 打赏
  • 举报
回复

错了
不是这个原因

是离开事件的插入算法有误
不过现在得去上课了,晚上再看吧 :(
Wendydd 2003-08-20
  • 打赏
  • 举报
回复
我试了一下
停留时间过长是因为随机数不好,总是 durtime > intertime
如果你把这两个时间固定成 5,而不用随机数的话
可以看到结果在 10 左右

你可以自己重写个随机数的函数
Wendydd 2003-08-19
  • 打赏
  • 举报
回复
不合理的地方啊,挺多的 :)
说几个吧

customer_arrived 函数里面
变量 i 在逻辑上是多余的

iterator的遍历改用 for 循环
清楚一点

变量名改地有意义一点,不要用全局变量,顺便把几个函数也封装了。。。。。。

:)
其实还是写的不错的
大几了?
GhostAdz 2003-08-19
  • 打赏
  • 举报
回复
恭喜两位
得尝所望!
Wendydd 2003-08-19
  • 打赏
  • 举报
回复
运行得不错
告诉你一个结果
平均停留时间在100左右
哈哈 :)
加载更多回复(5)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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