回 帖 发 新 帖 刷新版面

主题:[讨论]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;    
}

回复列表 (共2个回复)

沙发

大家帮帮忙啊!谢谢

板凳

貌似问错版了
建议用VC++来做,图形界面直接拖控件就行.如果自己写代码画界面太辛苦..

我来回复

您尚未登录,请登录后再回复。点此登录或注册