1、病人就医管理系统一、设计题目 编写一个程序定义行医类,反映病人到医院看病,排队看医生的情况,在病人排队过程中,主要发生两件事:(1) 病人到达诊室,将病历本交给护士,排到等待队列中候诊。(2) 护士从等待队列中取出一位病人的病历,该病人进入诊室就诊。要求程序采用菜单方式,其选项及功能说明如下:(1) 排队-输入病人的病历号,加入到病人排队队列中(2) 就诊-病人排队队列中最前面的病人就诊,并将其从队列中删除。(3) 查看排队-从队首到队尾列出所有的排队病人的病历号。(4) 下班-退出运行。二、需求分析1)运行环境(软、硬件环境)软件:Microsoft Visual Studio/Micros
2、oft Visual C+6.0; 硬件:计算机硬件系统(包括键盘等)2)输入的形式和输入值的范围输入形式:通过键盘键入测试数据输入值范围:字符型(char) 医生,护士 字符数组 病人病历号3)输出的形式描述 输入通过显示计算机屏显示,医生选择相应功能之后,显示屏会显示出各种对应信息。4)功能描述 病人到诊室,交给护士自己的病历表之后,护士登记病人的病历号,同时纳入队列中进行排队等待。当等到该病历号的病人进入诊室进行就诊时,系统删除前一位病人的病历号,同时下一位病人进入等待就诊阶段。如此反复,当时间到达下班时间之后,系统停止运行,医生操作退出系统!此过程中,医生可以随时调动系统数据,查看需要
3、就诊的病人病历号及病人人数,此过程使用队列的遍历函数予以实现。5)测试数据分别选择验证相应功能的数据进行实验数据测试。测试排队功能数据:(选择1)病历号:100,101,102,103测试输入错误时,系统显示:(选择12)测试就诊功能数据:(选择2)测试查看队列功能数据:(选择3)测试下班功能数据:(选择4)三、概要设计1)抽象数据类型定义描述(对各类的成员及成员函数进行抽象描述,参见书或ppt 及实验) template class Nodepublic: T data; /数据域 Node *next; /指针域;template class LinkQueuepublic: LinkQu
4、eue(); /构造函数,初始化一个空的链队列 LinkQueue(); /析构函数,释放链队中各结点的存储空间 void InQueue(T x); /将元素x入队 T OutQueue(); /将队头元素出队 T GetQueue(); /取链队列的队头元素 int Empty() if(front=NULL) return 1; return 0; /判断链队列是否为空void Traverse(); /遍历函数private: Node *front, *rear; /队头和队尾指针;2)功能模块设计(如主程序模块设计)头文件类: 第一,结点类; 第二,链队列类;第三,行医类:主函数3
5、)模块层次调用关系图四、详细设计实现概要设计中定义的所有的类的定义及类中成员函数,并对主要的模块写出伪码算法。结点类:template class Nodepublic: T data; /数据域 Node *next; /指针域;链队列类:template class LinkQueuepublic: LinkQueue(); /构造函数,初始化一个空的链队列 LinkQueue(); /析构函数,释放链队中各结点的存储空间 void InQueue(T x); /将元素x入队 T OutQueue(); /将队头元素出队 T GetQueue(); /取链队列的队头元素 int Empty
6、() if(front=NULL) return 1; return 0; ; /判断链队列是否为空 void Traverse(); /遍历函数private: Node *front, *rear; /队头和队尾指针;template LinkQueue:LinkQueue() front=rear=NULL;template void LinkQueue:InQueue(T x) Node *s; s=new Node; s-data=x; /申请一个数据域为x的结点s s-next=NULL; if(front=NULL)/空队列,新结点既是队头,又是队尾 front=rear=s;
7、else rear-next=s; /将结点s插入到队尾 rear=s; template T LinkQueue:OutQueue() Node *p; T x; if (front=NULL) cout队空data; /暂存队头元素 front=front-next; /将队头元素所在结点摘链 if (front=NULL) rear=front; delete p; return x;template void LinkQueue:Traverse() Node *p; p=front; cout正在排队的病人显示:endl; while(p!=NULL) coutdatanext; c
8、outendl;行医类:class Hospitalizeprivate: LinkQueue queue; / 病人队列public: Hospitalize(); / 无参数的构造函数 Hospitalize(); / 析构函数 void StandInALine(); / 排队 void Cure(); / 就诊 void Display(); / 查看排队;void Hospitalize:StandInALine() int num; / 病历号 coutnum; / 输入排队病人 queue.InQueue(num); / 将病历号加入到病人排队队列中void Hospitaliz
9、e:Cure() if(queue.Empty() cout现已没有病人在排队了!endl; else int a; a=queue.OutQueue(); / 病人排队队列中最前面的病人就诊,并将其从队列中删除 couta号病人现在就医!endl; void Hospitalize:Display() queue.Traverse(); / 从队首到队尾列出所有的排队病人的病历号 coutendl;五、调试分析包括调试过程中遇到的问题及解决的方法、算法的时间空间复杂性分析、经验体会。本实验中遇到问题:Q1:结点类中的成员设为私有导致后面的链队列类不可使用结点类的相关寒暑;A1:将结点类中的成
10、员变量或成员函数全部设为公有;或者是将结点类设置为链队列的友元类。本实验的时间复杂度为0(n),空间复杂度为0(1);本实验经验体会:一个良好的开端对于程序的成功运行具有至关重要的作用。第一节课上,老师说,“有的同学如果想直接在VC上编写程序,而未经过之前的算法等相关准备的话是很难写成功的!”的确,想想自己平时编写程序的时候,如果直接就在VC上编写的话,程序写得很慢,效率会很低!所以,这个实验中,我尝试着按照老师讲的,首先分析了程序的相关要求,联系自己平时所学知识,很快把程序主体架构写出来了,这大大方便了后续的相关工作。在第二节课上,按照要求把相关函数详细代码写出,所以程序第二节课就写好了。所
11、以,这个实验之后,我逐渐明白了在程序编写之前,做好适当的准备是至关重要的。本实验中,通过上网查找和和同学讨论等方式,这个实验增强了自学能力,有助于提高自己的实践能力,运用知识的能力。六、用户使用说明详细列出每一步的操作说明。 第一,病人进入诊室,护士收集病历号并输入至本系统。即选择菜单栏中的“1”,从而实现将病人纳入到队列中去。 第二,当轮到某病历号的病人就诊时,医生可以通过查看未就诊,依然在队列中的病人的病历号,然后选择“2”,实现对该病人的就诊。 第三,该病人就诊完毕,系统删除该病人的信息,即病人出队,下一位病人可以进入就诊阶段。同时,医生可以通过功能键“3”,选择查看病人队列。 第四,当
12、病人队列已无元素,医生下班了,就可以通过选择功能键“4”,从而实现对系统的关闭,系统停止运行。七、测试结果 菜单显示: 排队: 就诊: 查看队列: 下班退出系统:八、附录:程序设计源代码#include#include#includeusing namespace std;template class Nodepublic: T data; /数据域 Node *next; /指针域;template class LinkQueuepublic: LinkQueue(); /构造函数,初始化一个空的链队列 LinkQueue(); /析构函数,释放链队中各结点的存储空间 void InQueu
13、e(T x); /将元素x入队 T OutQueue(); /将队头元素出队 T GetQueue(); /取链队列的队头元素 int Empty() if(front=NULL) return 1; return 0; ; /判断链队列是否为空 void Traverse(); /遍历函数private: Node *front, *rear; /队列头指针,尾指针;template LinkQueue:LinkQueue() front=rear=NULL; /初始化为空template void LinkQueue:InQueue(T x) Node *s; s=new Node; s-
14、data=x; /申请一个数据域为x的结点s s-next=NULL; if(front=NULL)/空队列,新结点既是队头,又是队尾 front=rear=s; else rear-next=s; /将结点s插入到队尾 rear=s; template T LinkQueue:OutQueue() Node *p; T x; if (front=NULL) cout队空data; /暂存队头元素 front=front-next; /将队头元素所在结点摘链 if (front=NULL) rear=front; delete p; return x;template void LinkQue
15、ue:Traverse() Node *p; p=front; cout*正在排队的病人显示(按照病历号):endl; while(p!=NULL) coutdatanext; coutendl;/医生工作class Hospitalizeprivate: LinkQueue queue; / 病人队列public: Hospitalize(); / 无参数的构造函数 Hospitalize(); / 析构函数 void StandInALine(); / 排队 void Cure(); / 就诊 void Display(); / 查看排队;void Hospitalize:StandInA
16、Line() int num; / 病历号 coutnum; / 输入排队病人 queue.InQueue(num); / 将病历号加入到病人排队队列中void Hospitalize:Cure() if(queue.Empty() cout现已没有病人在排队了!endl; else int a; a=queue.OutQueue(); / 病人排队队列中最前面的病人就诊,并将其从队列中删除 couta号病人现在就医!endl; void Hospitalize:Display() queue.Traverse(); / 从队首到队尾列出所有的排队病人的病历号 coutendl;/主函数voi
17、d main() Hospitalize a; int n; while (n!= 4) cout*endl; cout*你好!欢迎进入病人就医管理系统!endl; cout 1. 排队-输入病人的病历号,加入到病人队列中! endl; cout 2. 就诊-病人排队队列中最前面的病人就诊,并将其从队列中删除! endl; cout 3. 查看排队-从队首到队尾列出所有的排队病人的病历号! endl; cout 4. 下班-退出运行! endl; cout*endl; cout n; if(n4) cout*输入错误!请重新选择-endl; coutendl; / 选择功能 switch(n) case 1: a.StandInALine(); / 排队-输入病人的病历号,加入到病人队列中 break; case 2: a.Cure(); / 就诊-病人排队队列中最前面的病人就诊,并将其从队列中删除 break; case 3: a.Display(); / 查看排队-从队首到队尾列出所有的排队病人的病历号 break; system(pause);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1