课程设计目的:
通过该实践环节的锻炼,加深对数据结构与算法基本知识的认识,初步掌握数据结构与算法的设计与实现,以及利用算法开发应用系统的方法,提高进行工程设计和系统分析的能力,为毕业设计和以后的工程实践打下良好的基础。
课程设计要求:
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,显示医生的总使用时间