数据结构与算法课程设计题目 医务室模拟

课程设计目的:

通过该实践环节的锻炼,加深对数据结构与算法基本知识的认识,初步掌握数据结构与算法的设计与实现,以及利用算法开发应用系统的方法,提高进行工程设计和系统分析的能力,为毕业设计和以后的工程实践打下良好的基础。

课程设计要求:

1、独立思考,态度认真、按时出勤、表现良好,按时完成各阶段实践设计任务。

2、通过需求分析、算法设计、编程调试,掌握数据结构与算法基本理论知识,以及算法的实现步骤,体会算法设计的思想,完成题目要求的功能,对数据结构的理解充分,程序设计合理科学,界面友好,设计工具使用熟练。

3、能够按要求编写课程设计报告书,能正确阐述设计和设计结果、正确绘制流程图、系统和程序框图,报告论述充分,内容齐全,格式规范,文字通顺,条理清楚。

进度安排及主要内容:

1、下达设计任务书:查阅文献资料,讨论理解题目,明确恰当的数据结构及存储结构,提出解决问题思路。

2、学生完成预设计:查阅资料,进行文献研究,完善解决思路;进一步分析题目中涉及的复杂问题,确定数学模型;讨论解决方案的可行性,特别针对算法复杂性、健壮性进行讨论;确定开发路线、实验平台等;配备实验环境等。

3、详细设计阶段:经教师审查通过预设计方案后,进行编程设计和系统运行调试。

4、设计总结阶段:完成课程设计报告书。

5、设计验收与答辩:完成设计的验收和答辩。

一、概述

1.问题描述

假设只有一位医生,在一段时间内随机地来几位病人;假设病人到达的时间

间隔为 0-14 分钟之间的某个随机值,每个病人所需处理时间为 1-9 分钟之间的

某个随机值。试用队列结构进行模拟。

2.功能要求

要求输出医生的总等待时间和病人的平均等待时间。

3.设计思路:

用计算机程序模拟时间处理,按模拟环境中的时间出现顺序逐一处理,在本

程序中体现为医生逐个为到达病人看病。当一个病人就诊结束,而下一位病人还

未到达时,中间时间为医生空闲时间。当一位病人还未结束,另一位病人到达,

则这位病人应依次排队,等候就诊

二、设计的基本概念和原理

计算机模拟事件处理时,程序按模拟环境中的事件出现顺序逐一处理,在本程序中体现为医生逐个

为到达病人看病。当一个病人就诊完毕而下一位还未到达时,时间立即推进为下一位病人服务,中间时间为医生空闲时间。当一个病人还未结束之前,另有一位病人到达,则这些病人应依次排队,等候就诊。

三、总体设计

前提,第一个病人不须等待。思路如下:

1。先随机产生(或者指定)病人人数N(N>1)。

2。构造一个最大下标为N-2的一维数组Arr。

3。产生N-2个0~14的随机数,依次放入Arr定义中间变量J=0

4。循环I从0到N-2

5。随即产生一个1-9的随机数T

6。如果I<J那么病人等待时间=病人等待时间+T*(J-I)

7。如果I>=J,那么执行8,9,10

8。取得Arr(I)赋予临时变量M

9。J=I

10。IF(T<M){医生等待时间=医生等待时间+(M-T)}Else{ while(T>M){病人等待时间=病人等待时间+(T-M)J++M=M+Arr(J)}}

10。I循环结束,最后把病人等待时间用N一平均。

四、详细设计

#include<stdio.h>

#include<stdlib.h>

#include<string>

#include<iostream>

#include <time.h>

using namespace std;

#define status int

#define ok 1

typedef struct patient

{

    double arrive;

    double treat;

}patient;

typedef struct Qnode

{

    patient data;

    struct Qnode* next;

}Qnode, * QueuePtr;

typedef struct

{

    QueuePtr front;

    QueuePtr rear;

}LinkQueue;

status InittQueue(LinkQueue& Q)

{

    Q.front = Q.rear = new Qnode;

    Q.front->next = NULL;

    return ok;

}

status EnQueue(LinkQueue& Q, patient e)

{

    QueuePtr p;

    p = (QueuePtr)malloc(sizeof(Qnode));

    p->data = e;

    p->next = NULL;

    Q.rear->next = p;

    Q.rear = p;

    return ok;

}

int display(LinkQueue Q)

{

    QueuePtr p;

    p = Q.front;

    p->next;

    int n = 0;

    while (p != NULL)

    {

        n++;

        p = p->next;

    }

    return n;

}

void Input(LinkQueue Q)

{

    FILE* fp = fopen("病人模拟看病.txt", "w");

    QueuePtr p;

    p = Q.front;

    p = p->next;

    int m = 1;

    while (p != NULL)

    {

        fprintf(fp, "第%d位病人到达间隔时间%d分钟  医生看病时间%d分钟\n", m, (int)p->data.arrive, (int)p->data.treat);

        p = p->next;

        m++;

    }

    fclose(fp);

}

void jiuzhen(LinkQueue& Q)

{

    srand((unsigned)time(NULL));

    patient b;

    b.arrive = 0;

    b.treat = rand() % 9 + 1;

    EnQueue(Q, b);

    int n;

    n = rand() % 20;

    int i = 0;

    while (i != n)

    {
        patient b;

        b.arrive = rand() % 14 + 1;

        b.treat = rand() % 9 + 1;

        EnQueue(Q, b);

        i++;

    }

}

void showxinxi(LinkQueue& Q)

{

    QueuePtr p;

    p = Q.front;

    p = p->next;

    double parr = 0, sum=0, res=0;

    printf("到达病人人数:%d\n", display(Q) - 1);

    for (int m = 0; m < display(Q) - 1; m++)

    {

        cout << "第" << m + 1 << "位病人到达间隔时间" << p->data.arrive << "分钟    ";

        cout << "医生看病时间:" << p->data.treat << "分钟    ";

        if (p->data.arrive - parr > 0)

        {

            cout << "医生等待时间:" << p->data.arrive - parr << "分钟" << endl;


            sum += p->data.arrive - parr;

        }

        else

        {

            cout << "病人等待时间:" << parr - p->data.arrive << "分钟" << endl;
            
            res += parr - p->data.arrive;

        }

        parr = p->data.treat;

        p = p->next;

    }

}

void doctorwait(LinkQueue Q)

{

    QueuePtr p;

    p = Q.front;

    p = p->next;

    double parr = 0, sum = 0;

    for (int m = 0; m < display(Q) - 1; m++)

    {

        if (p->data.arrive - parr > 0)

            sum = sum + p->data.arrive - parr;

        parr = p->data.treat;

        p = p->next;

    }

    cout << "医生总等待时间" << sum << "分钟" << endl;

}

void patientwait(LinkQueue Q)

{

    QueuePtr p;

    p = Q.front;

    p = p->next;

    double parr = 0, sum = 0;

    for (int m = 0; m < display(Q) - 1; m++)

    {

        if (p->data.arrive - parr < 0)

            sum = sum + parr - p->data.arrive;

        parr = p->data.treat;

        p = p->next;

    }

    cout << "病人平均等待时间" << sum / (display(Q) - 1) << "分钟" << endl;

}

int main()

{



    LinkQueue a;

    InittQueue(a);

 
   int x;

    while (1)

    {

        scanf("%d", &x);

        switch (x)

        {


        case(1):

        {

            jiuzhen(a);

            cout << "就诊完成" << endl;

            break;

        }


        case(2):

        {

            showxinxi(a);

            break;

        }

        case(3):

        {

            patientwait(a);

            break;

        }

        case(4):

        {

            doctorwait(a);

            break;

        }
        }

    }

    Input(a);

}
  • 五、软件测试

输入1,完成就诊

输入2,显示病人到达时间以及就诊时间

输入3,显示病人等待的平均时间

输入4,显示医生的总使用时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焚琴煮鹤的熊熊野火

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值