主题:[讨论]c/c++图形界面
银行业务活动模拟的一点问题
客户的业务分为两种:第一种是申请从银行得到一笔资金,即取款或借款;第二种是向银行中投入一笔资金,即存款或还款。银行有两个服务窗口,相应地有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个队等候,直至满足时才离开银行;否则业务处理完后立刻离开银行。每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立刻离开银行。
要求:
用图形界面实现上述银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的时间。
这个题目的程序我已经写了,但不知道怎么用图形实现?帮帮忙,教教我,或帮我写写啊,谢谢!
/*
[记录]
1.同时考虑顾客的到来和服务员的工作
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
#include <iostream>
using namespace std;
int TimeTotal;
int AverageTime;//平均逗留时间,单位:分钟
int ClientNum;
int TotalMoney;
int TempMoney;
//营业时间
typedef struct
{
int Hour;
int Minute;
}TypeTime;
typedef struct TypeClient
{
TypeTime ArriveTime;
TypeTime LeaveTime;
int WaitTime;
int LendOrReturn;// 0表示取款或借款,1 表示存款或还款
int HowMuchMoney; //单位:元
struct TypeClient *next;
}TypeClient;
typedef struct
{
TypeClient *head;
TypeClient *last;
int QueueClientNum;
}TypeQueue;
TypeQueue q1, q2;
void GetTime(int &hour, int &minute)
{
//获得系统当前时间
struct tm *local;
time_t t;
t=time(NULL);
local=localtime(&t);
hour = local->tm_hour;
minute = local->tm_min;
printf("%d:%d\n", hour, minute);
}
int rand01(int n)
{
//n == 0 随机产生0或1
//n == 1 随机产生一个10000以内的整数
srand((unsigned)time(NULL));
if(n == 0) return rand() % 2;
else if(n == 1) return rand() % 10000;
}
void Initiate()
{
//初始化数据
TimeTotal = 0;
ClientNum = 0;
TotalMoney = 0;
q1.head = (TypeClient *)malloc(sizeof(TypeClient));
q1.head->next = NULL;
q1.last = q1.head;
q1.QueueClientNum = 0;
q2.head = (TypeClient *)malloc(sizeof(TypeClient));
q2.last = q1.head;
q2.head->next = NULL;
q2.QueueClientNum = 0;
}
void NewClientCome()
{
//新客户到达后先排到第一个队
int hour, minute;
int m, n;
TypeClient *NewClient;
NewClient = (TypeClient *)malloc(sizeof(TypeClient));
GetTime(hour, minute);
NewClient->ArriveTime.Hour = hour;
NewClient->ArriveTime.Minute = minute;
// 0. 取款或借款
// 1. 存款或还款
//随机产生是取款还是还款
NewClient->LendOrReturn = rand01(0);
printf("%d\n", NewClient->LendOrReturn);
//if(NewClient->LendOrReturn == 0) printf("请输入取款或借款金额\n");
//else printf("请输入存款或还款金额\n");
//随机产生取款或借款金额
NewClient->HowMuchMoney = rand01(1);
printf("%d\n", NewClient->HowMuchMoney);
NewClient->next = NULL;
q1.last->next = NewClient;
q1.last = NewClient;
q1.QueueClientNum++;
ClientNum++;
}
void LeadMoney(TypeClient *p)
{
//出借
int hour, minute;
GetTime(hour, minute);
p->LeaveTime.Hour = hour;
p->LeaveTime.Minute = minute;
p->WaitTime = 0;
p->WaitTime += (p->LeaveTime.Hour - p->ArriveTime.Hour) * 60;
p->WaitTime += (p->LeaveTime.Minute - p->ArriveTime.Minute);
printf("WaitTime = %d\n", p->WaitTime);
TimeTotal += p->WaitTime;
TotalMoney -= p->HowMuchMoney;
}
void ServeQ2()
{
void ServeQ1();
TypeClient *p, *s;
int hour, minute;
int n = 0;
int m = q2.QueueClientNum;
if(q2.QueueClientNum <= 0){
printf("Q2中没有顾客\n");
}
else {
p = q2.head->next;
s = q2.head; //父节点
while(p != NULL){
if(TotalMoney <= TempMoney || n > m){
ServeQ1();
break;
}
else {
n++;
if(p->HowMuchMoney <= TotalMoney){
//可以出借
LeadMoney(p);
s->next = s->next->next;
free(p);
q2.QueueClientNum--;
p = s->next;
}
else {
s = p;
p = p->next;
}
}
}
}
}
void ServeQ1()
{
TypeClient *p;
int hour, minute;
if(q1.QueueClientNum <= 0){
printf("Q1中没有顾客\n");
}
else {
//有新顾客
p = q1.head->next;
if(p->LendOrReturn == 1){
//存款或还款
TempMoney = TotalMoney;
TotalMoney += p->HowMuchMoney;
GetTime(hour, minute);
p->LeaveTime.Hour = hour;
p->LeaveTime.Minute = minute;
p->WaitTime = 0;
p->WaitTime += (p->LeaveTime.Hour - p->ArriveTime.Hour) * 60;
p->WaitTime += (p->LeaveTime.Minute - p->ArriveTime.Minute);
printf("WaitTime = %d\n", p->WaitTime);
TimeTotal += p->WaitTime;
q1.QueueClientNum--;
q1.head->next = p->next;
ServeQ2(); //转去处理第一个队列
}
else {
if(TotalMoney < p->HowMuchMoney){
//银行现有钱少于此人需要借的钱,将其加到第二个队列中去
q2.last->next = p;
p->next = NULL;
q2.QueueClientNum++;
q1.head->next = p->next;
q1.QueueClientNum--;
}
else {
//可以出借
LeadMoney(p);
q1.head->next = p->next;//出队列
free(p);
q1.QueueClientNum--;
}
}
}
}
int main()
{
int hour = 8, minute = 0;
int n;
Initiate();
n = 0;
while(n < 50){
NewClientCome();
n++;
}
while(hour < 17){ //下班时间
if(ClientNum > 100) break;
n = rand01(0);
if(n == 0) ServeQ1();
else NewClientCome();
GetTime(hour, minute);
}
printf("今日平均逗留时间:\n");
printf("%d\n", TimeTotal / ClientNum);
while(1);
return 0;
}
客户的业务分为两种:第一种是申请从银行得到一笔资金,即取款或借款;第二种是向银行中投入一笔资金,即存款或还款。银行有两个服务窗口,相应地有两个队列。客户到达银行后先排第一个队。处理每个客户业务时,如果属于第一种,且申请额超出银行现存资金总额而得不到满足,则立刻排入第二个队等候,直至满足时才离开银行;否则业务处理完后立刻离开银行。每接待完一个第二种业务的客户,则顺序检查和处理(如果可能)第二个队列中的客户,对能满足的申请者予以满足,不能满足者重新排到第二个队列的队尾。注意,在此检查过程中,一旦银行资金总额少于或等于刚才第一个队列中最后一个客户(第二种业务)被接待之前的数额,或者本次已将第二个队列检查或处理了一遍,就停止检查(因为此时已不可能还有能满足者)转而继续接待第一个队列的客户。任何时刻都只开一个窗口。假设检查不需要时间。营业时间结束时所有客户立刻离开银行。
要求:
用图形界面实现上述银行业务的事件驱动模拟系统,通过模拟方法求出客户在银行内逗留的时间。
这个题目的程序我已经写了,但不知道怎么用图形实现?帮帮忙,教教我,或帮我写写啊,谢谢!
/*
[记录]
1.同时考虑顾客的到来和服务员的工作
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
#include <iostream>
using namespace std;
int TimeTotal;
int AverageTime;//平均逗留时间,单位:分钟
int ClientNum;
int TotalMoney;
int TempMoney;
//营业时间
typedef struct
{
int Hour;
int Minute;
}TypeTime;
typedef struct TypeClient
{
TypeTime ArriveTime;
TypeTime LeaveTime;
int WaitTime;
int LendOrReturn;// 0表示取款或借款,1 表示存款或还款
int HowMuchMoney; //单位:元
struct TypeClient *next;
}TypeClient;
typedef struct
{
TypeClient *head;
TypeClient *last;
int QueueClientNum;
}TypeQueue;
TypeQueue q1, q2;
void GetTime(int &hour, int &minute)
{
//获得系统当前时间
struct tm *local;
time_t t;
t=time(NULL);
local=localtime(&t);
hour = local->tm_hour;
minute = local->tm_min;
printf("%d:%d\n", hour, minute);
}
int rand01(int n)
{
//n == 0 随机产生0或1
//n == 1 随机产生一个10000以内的整数
srand((unsigned)time(NULL));
if(n == 0) return rand() % 2;
else if(n == 1) return rand() % 10000;
}
void Initiate()
{
//初始化数据
TimeTotal = 0;
ClientNum = 0;
TotalMoney = 0;
q1.head = (TypeClient *)malloc(sizeof(TypeClient));
q1.head->next = NULL;
q1.last = q1.head;
q1.QueueClientNum = 0;
q2.head = (TypeClient *)malloc(sizeof(TypeClient));
q2.last = q1.head;
q2.head->next = NULL;
q2.QueueClientNum = 0;
}
void NewClientCome()
{
//新客户到达后先排到第一个队
int hour, minute;
int m, n;
TypeClient *NewClient;
NewClient = (TypeClient *)malloc(sizeof(TypeClient));
GetTime(hour, minute);
NewClient->ArriveTime.Hour = hour;
NewClient->ArriveTime.Minute = minute;
// 0. 取款或借款
// 1. 存款或还款
//随机产生是取款还是还款
NewClient->LendOrReturn = rand01(0);
printf("%d\n", NewClient->LendOrReturn);
//if(NewClient->LendOrReturn == 0) printf("请输入取款或借款金额\n");
//else printf("请输入存款或还款金额\n");
//随机产生取款或借款金额
NewClient->HowMuchMoney = rand01(1);
printf("%d\n", NewClient->HowMuchMoney);
NewClient->next = NULL;
q1.last->next = NewClient;
q1.last = NewClient;
q1.QueueClientNum++;
ClientNum++;
}
void LeadMoney(TypeClient *p)
{
//出借
int hour, minute;
GetTime(hour, minute);
p->LeaveTime.Hour = hour;
p->LeaveTime.Minute = minute;
p->WaitTime = 0;
p->WaitTime += (p->LeaveTime.Hour - p->ArriveTime.Hour) * 60;
p->WaitTime += (p->LeaveTime.Minute - p->ArriveTime.Minute);
printf("WaitTime = %d\n", p->WaitTime);
TimeTotal += p->WaitTime;
TotalMoney -= p->HowMuchMoney;
}
void ServeQ2()
{
void ServeQ1();
TypeClient *p, *s;
int hour, minute;
int n = 0;
int m = q2.QueueClientNum;
if(q2.QueueClientNum <= 0){
printf("Q2中没有顾客\n");
}
else {
p = q2.head->next;
s = q2.head; //父节点
while(p != NULL){
if(TotalMoney <= TempMoney || n > m){
ServeQ1();
break;
}
else {
n++;
if(p->HowMuchMoney <= TotalMoney){
//可以出借
LeadMoney(p);
s->next = s->next->next;
free(p);
q2.QueueClientNum--;
p = s->next;
}
else {
s = p;
p = p->next;
}
}
}
}
}
void ServeQ1()
{
TypeClient *p;
int hour, minute;
if(q1.QueueClientNum <= 0){
printf("Q1中没有顾客\n");
}
else {
//有新顾客
p = q1.head->next;
if(p->LendOrReturn == 1){
//存款或还款
TempMoney = TotalMoney;
TotalMoney += p->HowMuchMoney;
GetTime(hour, minute);
p->LeaveTime.Hour = hour;
p->LeaveTime.Minute = minute;
p->WaitTime = 0;
p->WaitTime += (p->LeaveTime.Hour - p->ArriveTime.Hour) * 60;
p->WaitTime += (p->LeaveTime.Minute - p->ArriveTime.Minute);
printf("WaitTime = %d\n", p->WaitTime);
TimeTotal += p->WaitTime;
q1.QueueClientNum--;
q1.head->next = p->next;
ServeQ2(); //转去处理第一个队列
}
else {
if(TotalMoney < p->HowMuchMoney){
//银行现有钱少于此人需要借的钱,将其加到第二个队列中去
q2.last->next = p;
p->next = NULL;
q2.QueueClientNum++;
q1.head->next = p->next;
q1.QueueClientNum--;
}
else {
//可以出借
LeadMoney(p);
q1.head->next = p->next;//出队列
free(p);
q1.QueueClientNum--;
}
}
}
}
int main()
{
int hour = 8, minute = 0;
int n;
Initiate();
n = 0;
while(n < 50){
NewClientCome();
n++;
}
while(hour < 17){ //下班时间
if(ClientNum > 100) break;
n = rand01(0);
if(n == 0) ServeQ1();
else NewClientCome();
GetTime(hour, minute);
}
printf("今日平均逗留时间:\n");
printf("%d\n", TimeTotal / ClientNum);
while(1);
return 0;
}