设计1题目:病人看病模拟程序
设计1目的
深入掌握队列应用的算法设计。
2、设计1正文
2.1 实验内容
编写一个程序,反映病人到医院排队看病的情况。在病人排队过程中,主要重复下面两件事。
⑴病人到达诊室,将病历本交给护士,排到等待队列中候诊。
⑵护士从等待队列中取出下一位病人的病例,该病人进入诊室就诊。
要求模拟病人等待就诊这一过程。程序采用菜单方式,其选项及功能说明如下。
⑴排队:输入排队病人的病历号,加入病人排队队列中。
⑵就诊:病人排队,队列中最前面的病人就诊,并将其从队列中删除。
⑶查看排队:从队头到队尾列出所有排队病人的病历号。
⑷不再排队,余下依次就诊:从队头到队尾列出所有排队病人的病例号,并退出运行。
⑸下班:退出运行
实验中设计的功能算法如下:
本实验采取链队列存放病人排队的情况。设计的功能算法如下。
SeeDoctor():模拟病人看病过程。病人排队看病要用到一个队列,可以设计了一个链队列。
Destroyqueue(QuType *&qu):释放病人排队所建立的就医队列。
exist(QuType *qu,int no):队列中是否有病历号no的病人在排队。
2.2 实验分析
(1)设计存储结构:病人排队看医生采用先到先看的方式,所以要用到一个队列。由于病人人数具有较大的不确定性,这里采用一个带头结点的单链表作为队列的存储结构。为了简单,病人通过其病历号来唯一标识。例如,有101、102和103三个病人依次排队的病人队列如图1.1所示。
图1.1 病人队列的链式结构队列
(2)设计流程图:
当用户选择排队时,需要输入病历号,该病历号将被加入到队列的末尾。如果用户选择就诊,程序会检查队列是否为空。如果不为空,则将队列头部的病人移出队列,并显示其病历号。
用户选择查看排队情况可以看到当前队列中所有病人的病历号。选择不再排队会使得队列中剩余的病人依次就诊,直到队列为空,然后程序退出。选择下班会销毁队列并退出程序。根据其病人看病流程,具体分析,画图。如图1.2所示
图1.2 病人看病流程图
- 设计运算算法:在病人队列设计好后,设计相关的基本运算算法,如队列初始化、进队和出队等
结构体定义:1.Patient 结构体代表队列中的病人,包含病历号(number)和指向下一个病人的指针(next)。2.Queue 结构体代表队列本身,包含指向队列头部和尾部的指针(front 和 rear)。
函数定义:1.initQueue:初始化一个空队列。2.enQueue:将一个病人加入到队列的末尾。3.deQueue:从队列的头部移除一个病人,并返回其病历号。4.displayQueue:打印出当前队列中所有病人的病历号。5.destroyQueue:销毁队列,释放所有已分配的内存。
main 函数流程:初始化队列。进入一个无限循环,提示用户进行操作选择,包括排队(入队)、就诊(出队)、查看排队情况、不再排队(清空队列并退出)、下班(销毁队列并退出)。根据用户输入执行相应的操作。
2.3 实验结果与测试
实验结果:如图1.3、1.4所示
图1.3 排队的实验结果截图
图1.4 病人的就诊情况实验结果截图
实验测试:调试如图1.5
图1.5 关于病历号输入的调试截图
- 设计1总结
首先明确解决这个问题的数据结构,是链式队列,由于医院看病是先到先看,所以可以使用队列来实现排队过程。模拟病人的排队看病主要完成以下几个操作:针对病人看病模拟程序,我做了(1)添加病例号的功能并且做了判读病历号是否重复的工作,来保证病历号的唯一性,保证就诊程序正常的进行下去,(2)就诊的操作通过出队列的操作来实现就诊的操作,如果没有排队的病历号+还会提示没有病人,(3)查看队列,可以实现正在排队病历号的操作,(4)停止就诊并且下班,该功能来实现停止就诊,并把正在排队的病人就诊完,准备下班,下班操作会实现销毁队列的操作。例如定义的SeeDoctor()函数,我需要将入队、出队、释放队列,以及主菜单的展示全部编写到函数之中,其中还应用了switch、while的选择语句。而我在编写判断队列中重复元素的时候用了较多的时间,这体现了我对队列知识的拓展理解还存在问题,我应该重新认真理解指针的用法,拓展思维。其次,在“医生下班”的函数中,我只是在case中简单添加了一句文字的输出,但是我并没有想到更好的展示方式,这也是我在以后学习中应该思考的问题,让程序面向用户时可以提供更便利、更容易理解的环境。
之后查看有关链式队列的知识点,具体分析这个问题的解决方案,画出此过程的流程图,具体分析每个过程的代码实现。经历了一段时间的算法与数据结构的学习,并没有很扎实的掌握具体问题代码的实现,仅是掌握了理论知识,并没有进行充分的实践;在画流程图的过程中,没有深入了解流程图每个图形代表的含义,没有画过真正的流程图,没有整体思考过程,只是片面的完成,在进行代码的实现时,出现些了问题。
深入链式队列的知识,完善了链式队列的代码实现解决方案,全面化,具体化,考虑问题,提高了算法能力,对画图工具应用更加熟练了,培养了模块化思维。