鱼C论坛

 找回密码
 立即注册
查看: 526|回复: 7

[已解决]急急急!为什么我的代码会出现 error C2065: 'destroyqueue1' : undeclared identi...

[复制链接]
发表于 2020-6-23 12:46:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题如下:
D:\数据结构课程设计\yhyw\yhyw.cpp(207) : error C2065: 'destroyqueue1' : undeclared identifier
D:\数据结构课程设计\yhyw\yhyw.cpp(208) : error C2065: 'destroyqueue2' : undeclared identifier
执行 cl.exe 时出错.


所有代码 如下:
//头文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<iostream.h>
#include<windows.h>


//宏定义
#define MONEY 5000//个人业务值,交易额上限
#define OK  1
#define ERROR  0
#define OVERFLOW  -2
typedef int status;

//定义的结构体
typedef struct
{
        int arrivetime;//到达时间
        int OccurTime;//事件发生时间
        int NType;//事件类型,0表示到达事件,1表示离开事件。同时用1表示存款,2表示取款。
        int duration;//办理业务时间
        long int money;//交易金额
}Event,ElemType1;
typedef struct
{
        //等待队列元素
        int arrivetime;//到达时间
        int duration;//办理业务时间
        long int money;//交易金额
}wait,ElemType2;
typedef struct QNode1
{
        ElemType1 data;
        struct QNode1 *next;
}QNode1,*Queue1;
typedef struct QNode2
{
        ElemType2 data;
        struct QNode2 *next;
}QNode2,*Queue2;
typedef struct
{
        Queue1 front;
        Queue1 rear;
}LinkQueue1;
typedef struct
{
        Queue2 front;
        Queue2 rear;
}LinkQueue2;

//全局变量
long int total_money;//银行现存资金总额
int total_time;//客户逗留总时间
int use_time;//每个客户所用时间
int money;//每个客户办理的金额
int closetime;//银行营业时间
int INTERTIME;//下一个用户到达的时间间隔
int DURATION;//办理业务所需时间
int number;//办理业务的次序
int time1;//系统当前时间
LinkQueue1 Q1;
LinkQueue2 Q2;
Event en;//事件
wait en1;//队列2元素

//初始化队列1
status InitQueue1()
{
        Q1.front=Q1.rear=(Queue1)malloc(sizeof(QNode1));
        if(!Q1.front)exit(OVERFLOW);
        Q1.front->next=NULL;
        return OK;
}

//初始化队列2
status InitQueue2()
{
        Q2.front=Q2.rear=(Queue2)malloc(sizeof(QNode2));
        if(!Q2.front)exit(OVERFLOW);
        Q2.front->next=NULL;
        return OK;
}

//销毁队列1
status destoryqueue1()
{
        while(Q1.front)
        {
                Q1.rear=Q1.front->next;
                free(Q1.front);
                Q1.front=Q1.rear;
        }
        return OK;
}

//销毁队列2
status destoryqueue2()
{
        while(Q2.front)
        {
                Q2.rear=Q2.front->next;
                free(Q2.front);
                Q2.front=Q2.rear;
        }
        return OK;
}

//队列1入队列
status EnQueue1()
{
        Queue1 p,r,r1;
        p=(Queue1)malloc(sizeof(QNode1));
        if(!p)exit(OVERFLOW);
        p->data.arrivetime=en.arrivetime;
        p->data.OccurTime=en.OccurTime;
        p->data.NType=en.NType;
        p->data.duration=en.duration;
        p->data.money=en.money;
        r=Q1.front->next;
        while(r)
        {
                if(p->data.arrivetime<r->data.arrivetime)
                {
                        if(r==Q1.front->next)
                        {
                                p->next=r;
                                Q1.front->next=p;
                        }
                        else
                        {
                                r1->next=p;
                                p->next=r;
                        }
                }
                r1=r;r=r->next;
        }
        if(!r)
        {
                if(Q1.front->next==NULL)
                {
                        Q1.front->next=p;
                        Q1.rear=p;
                        Q1.rear->next=NULL;
                }
                else
                {
                        p->next=NULL;
                        Q1.rear->next=p;
                        Q1.rear=p;
                }
        }
        return OK;
}

//队列2入队列
status EnQueue2()
{
        Queue2 p;
        p=(Queue2)malloc(sizeof(QNode2));
        if(!p)exit(OVERFLOW);
        p->data.arrivetime=en1.arrivetime;
        p->data.duration=en1.duration;
        p->data.money=en1.money;
        p->next=NULL;
        Q2.rear->next=p;
        Q2.rear=p;
        return OK;
}

//若队列1不空,则删除Q1的队头元素,并用en返回其值
status DeQueue1()
{
        Queue1 p;
        if(Q1.front=Q1.rear) return ERROR;
        p=Q1.front->next;
        en.arrivetime=p->data.arrivetime;
        en.OccurTime=p->data.OccurTime;
        en.NType=p->data.NType;
        en.duration=p->data.duration;
        en.money=p->data.money;
        Q1.front->next=p->next;
        if(Q1.rear==p) Q1.rear=Q1.front;//只有一个人时
        free(p);
        return OK;
}

//若队列2不空,则删除Q2的队头元素,并用en1返回其值
status DeQueue2()
{
        Queue2 p;
        if(Q2.front==Q2.rear)return ERROR;
        p=Q2.front->next;
        en1.arrivetime=p->data.arrivetime;
        en1.duration=p->data.duration;
        en1.money=p->data.money;
        Q2.front->next=p->next;
        if(Q2.rear==p) Q2.rear=Q2.front;//只有一个人时
        free(p);
        return OK;
}

//营业时间结束,全部客户离开银行
void free_system()
{
        destroyqueue1();
        destroyqueue2();
}

//产生随机数
status rand_ar(int *intertime,long int *money,int *duration,int *NType)
{
        *intertime=rand()%INTERTIME+1;//下个客户到达的时间间隔,不大于INTERTIME
        *money=rand()%MONEY+1;//每个顾客办理的金额,不大于MONEY
        *duration=rand()%DURATION+1;//客户办理业务所需时间,不大于DURATION
        *NType=rand()%2;//事件类型分为0和1两种
        return OK;
}

//初始化操作
void OpenForDay()
{
        printf("请输入银行的初始存款:");
        scanf("%d",&total_money);
        printf("请输入银行的营业时间(分钟):");
        scanf("%d",&closetime);
        printf("请输入最大到达时间间隔(分钟):");
        scanf("%d",&INTERTIME);
        printf("请输入最短处理时间(分钟):");
        scanf("%d",&DURATION);
        total_time=0;//客户逗留总时间(初始值)
        number=0;//办理业务的次序(初始值)
        InitQueue1();//初始化队列1
        InitQueue2();//初始化队列2
        en.arrivetime=0;//到达时间
        en.OccurTime=0;//事件发生时间
        en.NType=0;//事件类型,暂时值
        en.money=0;//交易金额,暂时值
        en.duration=0;//办理业务时间,暂时值
        EnQueue1();//事件进队列
}

//查找上一离开事件的发生时间
int find_leave()
{
        Queue1 p;
        int i=0;
        p=Q1.front->next;
        while(p!=NULL)
        {
                if(p->data.NType!=0)
                        i=p->data.OccurTime;
                p=p->next;
        }
        return i;
}

//处理客户到达事件
void CustomerArrived()
{
        int intertime;
        int i;
        time1=en.OccurTime;
        rand_ar(&intertime,&(en.money),&(en.duration),&(en.NType));
        //设置一离开事件插入事件表
        en.NType++;//0变1,1变2
        i=find_leave();//查找上一离开事件的发生时间
        if(i==0)//第一位顾客
                en.OccurTime=en.arrivetime+en.duration;
        else
                if(i>=en.arrivetime)//本事件到达时上一事件还未离开
                        en.OccurTime=i+en.duration;//则此事件的离开时间=上一事件的离开时间+本事件处理时间
                else//上一事件离开之后,本事件才到达
                        en.OccurTime=en.arrivetime+en.duration;//则此事件的离开时间=本事件到达时间+本事件处理时间
                EnQueue1();//设置下一用户到达事件插入队列1
                en.arrivetime=en.arrivetime+intertime;//下一用户到达时间
                en.OccurTime=en.arrivetime;
                en.NType=0;//暂时值
                en.money=0;//暂时值
                en.duration=0;//暂时值
                EnQueue1();
}

//返回队列2的长度
int getlong_q2()
{
        int i=0;
        Queue2 p;
        p=Q2.front->next;
        while(p)
        {
                i++;
                p=p->next;
        }
        return i;
}

//顺序检查队列2是否有满足条件者
status check_q2()
{
        int i,j,z=0;
        i=getlong_q2();//用i返回队列2长度
        for(j=1;j<=i;j++)
        {
                DeQueue2();//队列2出队,用en1返回其值
                if(en1.money<=total_money)//若队列2出队元素的需要交易的金额<=银行现存金额,则可以办理
                {
                        if(time1>closetime)
                        {
                                printf("--\t\t%d\t\t%d\t\t%d\t\t%d\t%d\n",z,use_time,number,z,
                                        (en1.arrivetime),en1.money);
                        }
                        else
                        {
                                time1=time1+en1.duration;//更新系统当前时间
                                use_time=time1-en1.arrivetime;
                                total_time+=use_time;//更新逗留时间
                                total_money-=en1.money;//更新资金总额
                                number++;//更新实现交易的用户数
                                printf("%1d\t\t%d\t\t%d\t\t%d\t\t%d\t-%d\n",total_money,use_time,number,time1,(en1.arrivetime),(en1.money));
                        }
                }
                else
                {//若队列2出队元素的要交易的金额>银行现存金额,不能办理
                        if(time1>closetime)
                        {
                                printf("--\t\t%d\t\t%d\t\t%d\t\t%d\t%d\n",z,use_time,
                                        number,z,(en1.arrivetime),en1.money);
                        }
                        else
                        {
                                EnQueue2();//继续插入队列的队尾,继续等待
                        }
                }
        }
        return OK;
}

//队列1离开时间减duraion(业务办理时间)
int cut_duration(int e)//e是形参,指代办理业务的时间
{
        Queue1 p,q,r;
        ElemType1 en;
        p=Q1.front->next;
        r=Q1.front;
        if(p)
        {
                if(p->data.NType!=0)
                {
                        q=p->next;
                        r->next=q;//删除结点
                        en.arrivetime=p->data.arrivetime;//到达时间
                        en.OccurTime=p->data.OccurTime-e;//事件发生时间
                        en.NType=p->data.NType;//事件类型
                        en.duration=p->data.duration;//办理业务时间
                        en.money=p->data.money;//数额
                        free(p);
                        EnQueue1();
                }
        }
        return OK;
}

//处理客户离开事件
void CustomerDeparture()
{
        int i;
        i=en.NType;//业务类型,1表示存款,2表示取款
        time1=en.OccurTime-en.duration;
        if(i==OK)//是否是办理存款
        {
                if(en.OccurTime>closetime)//营业结束,全部客户离开银行
                        free_system();
                else//营业时间没有结束,继续办理
                {
                        use_time=en.OccurTime-en.arrivetime;
                        total_time+=use_time;//更新逗留的总时间
                        total_money=total_money+en.money;//更新资金总额
                        number++;//更新服务的客户数
                        time1=en.OccurTime;//更新系统当前时间
                        printf("%1d\t\t%d\t\t%d\t\t%d\t\t%d\t%d\n",total_money,use_time,number,en.OccurTime,en.arrivetime,en.money);
                                check_q2();//检查队列2是否有满足条件者
                }
        }
        else//办理取款
        {
                if(en.money>total_money)//办理取款,当申请金额不能满足时,离开队列1进入队列2等待
                {
                        cut_duration(en.duration);//从队列1中删除该结点
                        en1.arrivetime=en.arrivetime;
                        en1.duration=en.duration;
                        en1.money=en.money;
                        EnQueue2();//进入队列2继续等待
                }
                else//办理取款,当能满足所申请金额时进行队列1
                {
                        if(en.OccurTime>closetime)//营业结束,全部客户离开银行
                                free_system();
                        else
                        {
                                use_time=en.OccurTime-en.arrivetime;//顾客所用时间=事件发生时间-事件到达时间
                                total_time+=use_time;//更新逗留时间
                                total_money-=en.money;//更新资金总额
                                time1=en.OccurTime;//更新系统当前时间
                                number++;//更新客户总数
                                printf("%1d\t\t%d\t\t%d\t\t%d\t\t%d\t-%d\n",total_money,use_time,number,en.OccurTime,en.arrivetime,en.money);
                        }
                }
        }
}

//主函数
void main()
{
        int n;
        printf("========================================\n");
        printf("       欢迎使用银行业务模拟系统\n");
        printf("----------------------------------------");
        printf("          班级:测绘1703班 \n");
        printf("          姓名:陈 蕾      \n");
        printf("          学号:631701110304\n");
        printf("========================================\n");
        printf("请选择开始或结束:\n");
        printf("1.进入银行业务模拟系统\n");
        printf("0.退出程序\n");
        scanf("%d",&n);
        while(n==1)
        {
                OpenForDay();//初始化操作
                printf("----------------------------------------\n");
                printf("Total_money\tuse_time\tnumber\ten.OccurTime\ten.arrivetime\tmoney\n");
                {
                        while(Q1.front)
                        {
                                DeQueue1();//队列1出队列,并用en返回其值
                                if(en.NType==0)//en.NType等于0表示客户到达,1表示客户离开
                                        CustomerArrived();//处理客户到达事件
                                else
                                        CustomerDeparture();//处理客户离开事件,业务类型en.NType等于1表示存款,2表示取款
                        }
                        printf("1.营业结束后银行现存资金总额(元):%1d\n",total_money);
                        printf("2.营业时间内实现交易的客户数(人):%d\n",number);
                        printf("3.客户在银行逗留的总时间(分钟):%d\n",total_time);
                        printf("4.客户在银行的平均逗留时间(分钟):%f\n",(float)total_time/(float)number);
                        printf("----------------------------------------");
                }
                printf("以上为模拟结果!请选择继续或退出:\n");
                printf("1.继续模拟\n");
                printf("0.退出程序\n");
                scanf("%d",&n);
                if(n==0)
                {
                        printf("谢谢使用本系统,再见!");
                        break;
                }
        }
}
最佳答案
2020-6-23 14:28:56
拼写错误。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>


//宏定义
#define MONEY 5000//个人业务值,交易额上限
#define OK  1
#define ERROR  0
#define OVERFLOW  -2
typedef int status;

//定义的结构体
typedef struct
{
    int arrivetime;//到达时间
    int OccurTime;//事件发生时间
    int NType;//事件类型,0表示到达事件,1表示离开事件。同时用1表示存款,2表示取款。
    int duration;//办理业务时间
    long int money;//交易金额
}Event, ElemType1;
typedef struct
{
    //等待队列元素
    int arrivetime;//到达时间
    int duration;//办理业务时间
    long int money;//交易金额
}wait, ElemType2;
typedef struct QNode1
{
    ElemType1 data;
    struct QNode1* next;
}QNode1, * Queue1;
typedef struct QNode2
{
    ElemType2 data;
    struct QNode2* next;
}QNode2, * Queue2;
typedef struct
{
    Queue1 front;
    Queue1 rear;
}LinkQueue1;
typedef struct
{
    Queue2 front;
    Queue2 rear;
}LinkQueue2;

//全局变量
long int total_money;//银行现存资金总额
int total_time;//客户逗留总时间
int use_time;//每个客户所用时间
int money;//每个客户办理的金额
int closetime;//银行营业时间
int INTERTIME;//下一个用户到达的时间间隔
int DURATION;//办理业务所需时间
int number;//办理业务的次序
int time1;//系统当前时间
LinkQueue1 Q1;
LinkQueue2 Q2;
Event en;//事件
wait en1;//队列2元素

//初始化队列1
status InitQueue1()
{
    Q1.front = Q1.rear = (Queue1)malloc(sizeof(QNode1));
    if (!Q1.front)exit(OVERFLOW);
    Q1.front->next = NULL;
    return OK;
}

//初始化队列2
status InitQueue2()
{
    Q2.front = Q2.rear = (Queue2)malloc(sizeof(QNode2));
    if (!Q2.front)exit(OVERFLOW);
    Q2.front->next = NULL;
    return OK;
}

//销毁队列1
status destroyqueue1()
{
    while (Q1.front)
    {
        Q1.rear = Q1.front->next;
        free(Q1.front);
        Q1.front = Q1.rear;
    }
    return OK;
}

//销毁队列2
status destroyqueue2()
{
    while (Q2.front)
    {
        Q2.rear = Q2.front->next;
        free(Q2.front);
        Q2.front = Q2.rear;
    }
    return OK;
}

//队列1入队列
status EnQueue1()
{
    Queue1 p, r, r1;
    p = (Queue1)malloc(sizeof(QNode1));
    if (!p)exit(OVERFLOW);
    p->data.arrivetime = en.arrivetime;
    p->data.OccurTime = en.OccurTime;
    p->data.NType = en.NType;
    p->data.duration = en.duration;
    p->data.money = en.money;
    r = Q1.front->next;
    while (r)
    {
        if (p->data.arrivetime < r->data.arrivetime)
        {
            if (r == Q1.front->next)
            {
                p->next = r;
                Q1.front->next = p;
            }
            else
            {
                r1->next = p;
                p->next = r;
            }
        }
        r1 = r; r = r->next;
    }
    if (!r)
    {
        if (Q1.front->next == NULL)
        {
            Q1.front->next = p;
            Q1.rear = p;
            Q1.rear->next = NULL;
        }
        else
        {
            p->next = NULL;
            Q1.rear->next = p;
            Q1.rear = p;
        }
    }
    return OK;
}

//队列2入队列
status EnQueue2()
{
    Queue2 p;
    p = (Queue2)malloc(sizeof(QNode2));
    if (!p)exit(OVERFLOW);
    p->data.arrivetime = en1.arrivetime;
    p->data.duration = en1.duration;
    p->data.money = en1.money;
    p->next = NULL;
    Q2.rear->next = p;
    Q2.rear = p;
    return OK;
}

//若队列1不空,则删除Q1的队头元素,并用en返回其值
status DeQueue1()
{
    Queue1 p;
    if (Q1.front = Q1.rear) return ERROR;
    p = Q1.front->next;
    en.arrivetime = p->data.arrivetime;
    en.OccurTime = p->data.OccurTime;
    en.NType = p->data.NType;
    en.duration = p->data.duration;
    en.money = p->data.money;
    Q1.front->next = p->next;
    if (Q1.rear == p) Q1.rear = Q1.front;//只有一个人时
    free(p);
    return OK;
}

//若队列2不空,则删除Q2的队头元素,并用en1返回其值
status DeQueue2()
{
    Queue2 p;
    if (Q2.front == Q2.rear)return ERROR;
    p = Q2.front->next;
    en1.arrivetime = p->data.arrivetime;
    en1.duration = p->data.duration;
    en1.money = p->data.money;
    Q2.front->next = p->next;
    if (Q2.rear == p) Q2.rear = Q2.front;//只有一个人时
    free(p);
    return OK;
}

//营业时间结束,全部客户离开银行
void free_system()
{
    destroyqueue1();
    destroyqueue2();
}

//产生随机数
status rand_ar(int* intertime, long int* money, int* duration, int* NType)
{
    *intertime = rand() % INTERTIME + 1;//下个客户到达的时间间隔,不大于INTERTIME
    *money = rand() % MONEY + 1;//每个顾客办理的金额,不大于MONEY
    *duration = rand() % DURATION + 1;//客户办理业务所需时间,不大于DURATION
    *NType = rand() % 2;//事件类型分为0和1两种
    return OK;
}

//初始化操作
void OpenForDay()
{
    printf("请输入银行的初始存款:");
    scanf("%d", &total_money);
    printf("请输入银行的营业时间(分钟):");
    scanf("%d", &closetime);
    printf("请输入最大到达时间间隔(分钟):");
    scanf("%d", &INTERTIME);
    printf("请输入最短处理时间(分钟):");
    scanf("%d", &DURATION);
    total_time = 0;//客户逗留总时间(初始值)
    number = 0;//办理业务的次序(初始值)
    InitQueue1();//初始化队列1
    InitQueue2();//初始化队列2
    en.arrivetime = 0;//到达时间
    en.OccurTime = 0;//事件发生时间
    en.NType = 0;//事件类型,暂时值
    en.money = 0;//交易金额,暂时值
    en.duration = 0;//办理业务时间,暂时值
    EnQueue1();//事件进队列
}

//查找上一离开事件的发生时间
int find_leave()
{
    Queue1 p;
    int i = 0;
    p = Q1.front->next;
    while (p != NULL)
    {
        if (p->data.NType != 0)
            i = p->data.OccurTime;
        p = p->next;
    }
    return i;
}

//处理客户到达事件
void CustomerArrived()
{
    int intertime;
    int i;
    time1 = en.OccurTime;
    rand_ar(&intertime, &(en.money), &(en.duration), &(en.NType));
    //设置一离开事件插入事件表
    en.NType++;//0变1,1变2
    i = find_leave();//查找上一离开事件的发生时间
    if (i == 0)//第一位顾客
        en.OccurTime = en.arrivetime + en.duration;
    else
        if (i >= en.arrivetime)//本事件到达时上一事件还未离开
            en.OccurTime = i + en.duration;//则此事件的离开时间=上一事件的离开时间+本事件处理时间
        else//上一事件离开之后,本事件才到达
            en.OccurTime = en.arrivetime + en.duration;//则此事件的离开时间=本事件到达时间+本事件处理时间
    EnQueue1();//设置下一用户到达事件插入队列1
    en.arrivetime = en.arrivetime + intertime;//下一用户到达时间
    en.OccurTime = en.arrivetime;
    en.NType = 0;//暂时值
    en.money = 0;//暂时值
    en.duration = 0;//暂时值
    EnQueue1();
}

//返回队列2的长度
int getlong_q2()
{
    int i = 0;
    Queue2 p;
    p = Q2.front->next;
    while (p)
    {
        i++;
        p = p->next;
    }
    return i;
}

//顺序检查队列2是否有满足条件者
status check_q2()
{
    int i, j, z = 0;
    i = getlong_q2();//用i返回队列2长度
    for (j = 1; j <= i; j++)
    {
        DeQueue2();//队列2出队,用en1返回其值
        if (en1.money <= total_money)//若队列2出队元素的需要交易的金额<=银行现存金额,则可以办理
        {
            if (time1 > closetime)
            {
                printf("--\t\t%d\t\t%d\t\t%d\t\t%d\t%d\n", z, use_time, number, z,
                    (en1.arrivetime), en1.money);
            }
            else
            {
                time1 = time1 + en1.duration;//更新系统当前时间
                use_time = time1 - en1.arrivetime;
                total_time += use_time;//更新逗留时间
                total_money -= en1.money;//更新资金总额
                number++;//更新实现交易的用户数
                printf("%1d\t\t%d\t\t%d\t\t%d\t\t%d\t-%d\n", total_money, use_time, number, time1, (en1.arrivetime), (en1.money));
            }
        }
        else
        {//若队列2出队元素的要交易的金额>银行现存金额,不能办理
            if (time1 > closetime)
            {
                printf("--\t\t%d\t\t%d\t\t%d\t\t%d\t%d\n", z, use_time,
                    number, z, (en1.arrivetime), en1.money);
            }
            else
            {
                EnQueue2();//继续插入队列的队尾,继续等待
            }
        }
    }
    return OK;
}

//队列1离开时间减duraion(业务办理时间)
int cut_duration(int e)//e是形参,指代办理业务的时间
{
    Queue1 p, q, r;
    ElemType1 en;
    p = Q1.front->next;
    r = Q1.front;
    if (p)
    {
        if (p->data.NType != 0)
        {
            q = p->next;
            r->next = q;//删除结点
            en.arrivetime = p->data.arrivetime;//到达时间
            en.OccurTime = p->data.OccurTime - e;//事件发生时间
            en.NType = p->data.NType;//事件类型
            en.duration = p->data.duration;//办理业务时间
            en.money = p->data.money;//数额
            free(p);
            EnQueue1();
        }
    }
    return OK;
}

//处理客户离开事件
void CustomerDeparture()
{
    int i;
    i = en.NType;//业务类型,1表示存款,2表示取款
    time1 = en.OccurTime - en.duration;
    if (i == OK)//是否是办理存款
    {
        if (en.OccurTime > closetime)//营业结束,全部客户离开银行
            free_system();
        else//营业时间没有结束,继续办理
        {
            use_time = en.OccurTime - en.arrivetime;
            total_time += use_time;//更新逗留的总时间
            total_money = total_money + en.money;//更新资金总额
            number++;//更新服务的客户数
            time1 = en.OccurTime;//更新系统当前时间
            printf("%1d\t\t%d\t\t%d\t\t%d\t\t%d\t%d\n", total_money, use_time, number, en.OccurTime, en.arrivetime, en.money);
            check_q2();//检查队列2是否有满足条件者
        }
    }
    else//办理取款
    {
        if (en.money > total_money)//办理取款,当申请金额不能满足时,离开队列1进入队列2等待
        {
            cut_duration(en.duration);//从队列1中删除该结点
            en1.arrivetime = en.arrivetime;
            en1.duration = en.duration;
            en1.money = en.money;
            EnQueue2();//进入队列2继续等待
        }
        else//办理取款,当能满足所申请金额时进行队列1
        {
            if (en.OccurTime > closetime)//营业结束,全部客户离开银行
                free_system();
            else
            {
                use_time = en.OccurTime - en.arrivetime;//顾客所用时间=事件发生时间-事件到达时间
                total_time += use_time;//更新逗留时间
                total_money -= en.money;//更新资金总额
                time1 = en.OccurTime;//更新系统当前时间
                number++;//更新客户总数
                printf("%1d\t\t%d\t\t%d\t\t%d\t\t%d\t-%d\n", total_money, use_time, number, en.OccurTime, en.arrivetime, en.money);
            }
        }
    }
}

//主函数
void main()
{
    int n;
    printf("========================================\n");
    printf("       欢迎使用银行业务模拟系统\n");
    printf("----------------------------------------");
    printf("          班级:测绘1703班 \n");
    printf("          姓名:陈 蕾      \n");
    printf("          学号:631701110304\n");
    printf("========================================\n");
    printf("请选择开始或结束:\n");
    printf("1.进入银行业务模拟系统\n");
    printf("0.退出程序\n");
    scanf("%d", &n);
    while (n == 1)
    {
        OpenForDay();//初始化操作
        printf("----------------------------------------\n");
        printf("Total_money\tuse_time\tnumber\ten.OccurTime\ten.arrivetime\tmoney\n");
        {
            while (Q1.front)
            {
                DeQueue1();//队列1出队列,并用en返回其值
                if (en.NType == 0)//en.NType等于0表示客户到达,1表示客户离开
                    CustomerArrived();//处理客户到达事件
                else
                    CustomerDeparture();//处理客户离开事件,业务类型en.NType等于1表示存款,2表示取款
            }
            printf("1.营业结束后银行现存资金总额(元):%1d\n", total_money);
            printf("2.营业时间内实现交易的客户数(人):%d\n", number);
            printf("3.客户在银行逗留的总时间(分钟):%d\n", total_time);
            printf("4.客户在银行的平均逗留时间(分钟):%f\n", (float)total_time / (float)number);
            printf("----------------------------------------");
        }
        printf("以上为模拟结果!请选择继续或退出:\n");
        printf("1.继续模拟\n");
        printf("0.退出程序\n");
        scanf("%d", &n);
        if (n == 0)
        {
            printf("谢谢使用本系统,再见!");
            break;
        }
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-6-23 12:47:03 | 显示全部楼层
是一个动态模拟银行业务的系统
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-23 13:09:51 | 显示全部楼层
求一位大佬解救
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-23 14:28:56 | 显示全部楼层    本楼为最佳答案   
拼写错误。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>


//宏定义
#define MONEY 5000//个人业务值,交易额上限
#define OK  1
#define ERROR  0
#define OVERFLOW  -2
typedef int status;

//定义的结构体
typedef struct
{
    int arrivetime;//到达时间
    int OccurTime;//事件发生时间
    int NType;//事件类型,0表示到达事件,1表示离开事件。同时用1表示存款,2表示取款。
    int duration;//办理业务时间
    long int money;//交易金额
}Event, ElemType1;
typedef struct
{
    //等待队列元素
    int arrivetime;//到达时间
    int duration;//办理业务时间
    long int money;//交易金额
}wait, ElemType2;
typedef struct QNode1
{
    ElemType1 data;
    struct QNode1* next;
}QNode1, * Queue1;
typedef struct QNode2
{
    ElemType2 data;
    struct QNode2* next;
}QNode2, * Queue2;
typedef struct
{
    Queue1 front;
    Queue1 rear;
}LinkQueue1;
typedef struct
{
    Queue2 front;
    Queue2 rear;
}LinkQueue2;

//全局变量
long int total_money;//银行现存资金总额
int total_time;//客户逗留总时间
int use_time;//每个客户所用时间
int money;//每个客户办理的金额
int closetime;//银行营业时间
int INTERTIME;//下一个用户到达的时间间隔
int DURATION;//办理业务所需时间
int number;//办理业务的次序
int time1;//系统当前时间
LinkQueue1 Q1;
LinkQueue2 Q2;
Event en;//事件
wait en1;//队列2元素

//初始化队列1
status InitQueue1()
{
    Q1.front = Q1.rear = (Queue1)malloc(sizeof(QNode1));
    if (!Q1.front)exit(OVERFLOW);
    Q1.front->next = NULL;
    return OK;
}

//初始化队列2
status InitQueue2()
{
    Q2.front = Q2.rear = (Queue2)malloc(sizeof(QNode2));
    if (!Q2.front)exit(OVERFLOW);
    Q2.front->next = NULL;
    return OK;
}

//销毁队列1
status destroyqueue1()
{
    while (Q1.front)
    {
        Q1.rear = Q1.front->next;
        free(Q1.front);
        Q1.front = Q1.rear;
    }
    return OK;
}

//销毁队列2
status destroyqueue2()
{
    while (Q2.front)
    {
        Q2.rear = Q2.front->next;
        free(Q2.front);
        Q2.front = Q2.rear;
    }
    return OK;
}

//队列1入队列
status EnQueue1()
{
    Queue1 p, r, r1;
    p = (Queue1)malloc(sizeof(QNode1));
    if (!p)exit(OVERFLOW);
    p->data.arrivetime = en.arrivetime;
    p->data.OccurTime = en.OccurTime;
    p->data.NType = en.NType;
    p->data.duration = en.duration;
    p->data.money = en.money;
    r = Q1.front->next;
    while (r)
    {
        if (p->data.arrivetime < r->data.arrivetime)
        {
            if (r == Q1.front->next)
            {
                p->next = r;
                Q1.front->next = p;
            }
            else
            {
                r1->next = p;
                p->next = r;
            }
        }
        r1 = r; r = r->next;
    }
    if (!r)
    {
        if (Q1.front->next == NULL)
        {
            Q1.front->next = p;
            Q1.rear = p;
            Q1.rear->next = NULL;
        }
        else
        {
            p->next = NULL;
            Q1.rear->next = p;
            Q1.rear = p;
        }
    }
    return OK;
}

//队列2入队列
status EnQueue2()
{
    Queue2 p;
    p = (Queue2)malloc(sizeof(QNode2));
    if (!p)exit(OVERFLOW);
    p->data.arrivetime = en1.arrivetime;
    p->data.duration = en1.duration;
    p->data.money = en1.money;
    p->next = NULL;
    Q2.rear->next = p;
    Q2.rear = p;
    return OK;
}

//若队列1不空,则删除Q1的队头元素,并用en返回其值
status DeQueue1()
{
    Queue1 p;
    if (Q1.front = Q1.rear) return ERROR;
    p = Q1.front->next;
    en.arrivetime = p->data.arrivetime;
    en.OccurTime = p->data.OccurTime;
    en.NType = p->data.NType;
    en.duration = p->data.duration;
    en.money = p->data.money;
    Q1.front->next = p->next;
    if (Q1.rear == p) Q1.rear = Q1.front;//只有一个人时
    free(p);
    return OK;
}

//若队列2不空,则删除Q2的队头元素,并用en1返回其值
status DeQueue2()
{
    Queue2 p;
    if (Q2.front == Q2.rear)return ERROR;
    p = Q2.front->next;
    en1.arrivetime = p->data.arrivetime;
    en1.duration = p->data.duration;
    en1.money = p->data.money;
    Q2.front->next = p->next;
    if (Q2.rear == p) Q2.rear = Q2.front;//只有一个人时
    free(p);
    return OK;
}

//营业时间结束,全部客户离开银行
void free_system()
{
    destroyqueue1();
    destroyqueue2();
}

//产生随机数
status rand_ar(int* intertime, long int* money, int* duration, int* NType)
{
    *intertime = rand() % INTERTIME + 1;//下个客户到达的时间间隔,不大于INTERTIME
    *money = rand() % MONEY + 1;//每个顾客办理的金额,不大于MONEY
    *duration = rand() % DURATION + 1;//客户办理业务所需时间,不大于DURATION
    *NType = rand() % 2;//事件类型分为0和1两种
    return OK;
}

//初始化操作
void OpenForDay()
{
    printf("请输入银行的初始存款:");
    scanf("%d", &total_money);
    printf("请输入银行的营业时间(分钟):");
    scanf("%d", &closetime);
    printf("请输入最大到达时间间隔(分钟):");
    scanf("%d", &INTERTIME);
    printf("请输入最短处理时间(分钟):");
    scanf("%d", &DURATION);
    total_time = 0;//客户逗留总时间(初始值)
    number = 0;//办理业务的次序(初始值)
    InitQueue1();//初始化队列1
    InitQueue2();//初始化队列2
    en.arrivetime = 0;//到达时间
    en.OccurTime = 0;//事件发生时间
    en.NType = 0;//事件类型,暂时值
    en.money = 0;//交易金额,暂时值
    en.duration = 0;//办理业务时间,暂时值
    EnQueue1();//事件进队列
}

//查找上一离开事件的发生时间
int find_leave()
{
    Queue1 p;
    int i = 0;
    p = Q1.front->next;
    while (p != NULL)
    {
        if (p->data.NType != 0)
            i = p->data.OccurTime;
        p = p->next;
    }
    return i;
}

//处理客户到达事件
void CustomerArrived()
{
    int intertime;
    int i;
    time1 = en.OccurTime;
    rand_ar(&intertime, &(en.money), &(en.duration), &(en.NType));
    //设置一离开事件插入事件表
    en.NType++;//0变1,1变2
    i = find_leave();//查找上一离开事件的发生时间
    if (i == 0)//第一位顾客
        en.OccurTime = en.arrivetime + en.duration;
    else
        if (i >= en.arrivetime)//本事件到达时上一事件还未离开
            en.OccurTime = i + en.duration;//则此事件的离开时间=上一事件的离开时间+本事件处理时间
        else//上一事件离开之后,本事件才到达
            en.OccurTime = en.arrivetime + en.duration;//则此事件的离开时间=本事件到达时间+本事件处理时间
    EnQueue1();//设置下一用户到达事件插入队列1
    en.arrivetime = en.arrivetime + intertime;//下一用户到达时间
    en.OccurTime = en.arrivetime;
    en.NType = 0;//暂时值
    en.money = 0;//暂时值
    en.duration = 0;//暂时值
    EnQueue1();
}

//返回队列2的长度
int getlong_q2()
{
    int i = 0;
    Queue2 p;
    p = Q2.front->next;
    while (p)
    {
        i++;
        p = p->next;
    }
    return i;
}

//顺序检查队列2是否有满足条件者
status check_q2()
{
    int i, j, z = 0;
    i = getlong_q2();//用i返回队列2长度
    for (j = 1; j <= i; j++)
    {
        DeQueue2();//队列2出队,用en1返回其值
        if (en1.money <= total_money)//若队列2出队元素的需要交易的金额<=银行现存金额,则可以办理
        {
            if (time1 > closetime)
            {
                printf("--\t\t%d\t\t%d\t\t%d\t\t%d\t%d\n", z, use_time, number, z,
                    (en1.arrivetime), en1.money);
            }
            else
            {
                time1 = time1 + en1.duration;//更新系统当前时间
                use_time = time1 - en1.arrivetime;
                total_time += use_time;//更新逗留时间
                total_money -= en1.money;//更新资金总额
                number++;//更新实现交易的用户数
                printf("%1d\t\t%d\t\t%d\t\t%d\t\t%d\t-%d\n", total_money, use_time, number, time1, (en1.arrivetime), (en1.money));
            }
        }
        else
        {//若队列2出队元素的要交易的金额>银行现存金额,不能办理
            if (time1 > closetime)
            {
                printf("--\t\t%d\t\t%d\t\t%d\t\t%d\t%d\n", z, use_time,
                    number, z, (en1.arrivetime), en1.money);
            }
            else
            {
                EnQueue2();//继续插入队列的队尾,继续等待
            }
        }
    }
    return OK;
}

//队列1离开时间减duraion(业务办理时间)
int cut_duration(int e)//e是形参,指代办理业务的时间
{
    Queue1 p, q, r;
    ElemType1 en;
    p = Q1.front->next;
    r = Q1.front;
    if (p)
    {
        if (p->data.NType != 0)
        {
            q = p->next;
            r->next = q;//删除结点
            en.arrivetime = p->data.arrivetime;//到达时间
            en.OccurTime = p->data.OccurTime - e;//事件发生时间
            en.NType = p->data.NType;//事件类型
            en.duration = p->data.duration;//办理业务时间
            en.money = p->data.money;//数额
            free(p);
            EnQueue1();
        }
    }
    return OK;
}

//处理客户离开事件
void CustomerDeparture()
{
    int i;
    i = en.NType;//业务类型,1表示存款,2表示取款
    time1 = en.OccurTime - en.duration;
    if (i == OK)//是否是办理存款
    {
        if (en.OccurTime > closetime)//营业结束,全部客户离开银行
            free_system();
        else//营业时间没有结束,继续办理
        {
            use_time = en.OccurTime - en.arrivetime;
            total_time += use_time;//更新逗留的总时间
            total_money = total_money + en.money;//更新资金总额
            number++;//更新服务的客户数
            time1 = en.OccurTime;//更新系统当前时间
            printf("%1d\t\t%d\t\t%d\t\t%d\t\t%d\t%d\n", total_money, use_time, number, en.OccurTime, en.arrivetime, en.money);
            check_q2();//检查队列2是否有满足条件者
        }
    }
    else//办理取款
    {
        if (en.money > total_money)//办理取款,当申请金额不能满足时,离开队列1进入队列2等待
        {
            cut_duration(en.duration);//从队列1中删除该结点
            en1.arrivetime = en.arrivetime;
            en1.duration = en.duration;
            en1.money = en.money;
            EnQueue2();//进入队列2继续等待
        }
        else//办理取款,当能满足所申请金额时进行队列1
        {
            if (en.OccurTime > closetime)//营业结束,全部客户离开银行
                free_system();
            else
            {
                use_time = en.OccurTime - en.arrivetime;//顾客所用时间=事件发生时间-事件到达时间
                total_time += use_time;//更新逗留时间
                total_money -= en.money;//更新资金总额
                time1 = en.OccurTime;//更新系统当前时间
                number++;//更新客户总数
                printf("%1d\t\t%d\t\t%d\t\t%d\t\t%d\t-%d\n", total_money, use_time, number, en.OccurTime, en.arrivetime, en.money);
            }
        }
    }
}

//主函数
void main()
{
    int n;
    printf("========================================\n");
    printf("       欢迎使用银行业务模拟系统\n");
    printf("----------------------------------------");
    printf("          班级:测绘1703班 \n");
    printf("          姓名:陈 蕾      \n");
    printf("          学号:631701110304\n");
    printf("========================================\n");
    printf("请选择开始或结束:\n");
    printf("1.进入银行业务模拟系统\n");
    printf("0.退出程序\n");
    scanf("%d", &n);
    while (n == 1)
    {
        OpenForDay();//初始化操作
        printf("----------------------------------------\n");
        printf("Total_money\tuse_time\tnumber\ten.OccurTime\ten.arrivetime\tmoney\n");
        {
            while (Q1.front)
            {
                DeQueue1();//队列1出队列,并用en返回其值
                if (en.NType == 0)//en.NType等于0表示客户到达,1表示客户离开
                    CustomerArrived();//处理客户到达事件
                else
                    CustomerDeparture();//处理客户离开事件,业务类型en.NType等于1表示存款,2表示取款
            }
            printf("1.营业结束后银行现存资金总额(元):%1d\n", total_money);
            printf("2.营业时间内实现交易的客户数(人):%d\n", number);
            printf("3.客户在银行逗留的总时间(分钟):%d\n", total_time);
            printf("4.客户在银行的平均逗留时间(分钟):%f\n", (float)total_time / (float)number);
            printf("----------------------------------------");
        }
        printf("以上为模拟结果!请选择继续或退出:\n");
        printf("1.继续模拟\n");
        printf("0.退出程序\n");
        scanf("%d", &n);
        if (n == 0)
        {
            printf("谢谢使用本系统,再见!");
            break;
        }
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-23 15:29:06 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-23 15:30:28 | 显示全部楼层
问题如下:
D:\数据结构课程设计\yhyw\yhyw.cpp(207) : error C2065: 'destroyqueue1' : undeclared identifier
D:\数据结构课程设计\yhyw\yhyw.cpp(208) : error C2065: 'destroyqueue2' : undeclared identifier
执行 cl.exe 时出错.

对应的行是
//营业时间结束,全部客户离开银行
void free_system()
{
        destroyqueue1();
        destroyqueue2();
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-23 15:38:41 | 显示全部楼层

我对比代码看到了  现在的问题已经解决了 我调试一下功能 先谢谢你啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-23 16:39:22 | 显示全部楼层
printf("1.营业结束后银行现存资金总额(元):%1d\n", total_money);
            printf("2.营业时间内实现交易的客户数(人):%d\n", number);
            printf("3.客户在银行逗留的总时间(分钟):%d\n", total_time);
            printf("4.客户在银行的平均逗留时间(分钟):%f\n", (float)total_time / (float)number);
            printf("----------------------------------------");

这一部分代码怎么成功显示呀??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-13 13:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表