




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
冰之龙设计实验二 病人就医管理姓名:xxx 座号:xx 09级本科_软件工程_专业 日期: 2010.10.14 【实验课程名称】数据结构【实验项目名称】病人就医管理【实验目的】1掌握练队列存储结构的基本操作;2 理解如何根据具体应用选择适当的数据结构解决问题;【实验仪器及环境】计算机,window xp操作系统,VC+6.0【实验内容及步骤】1.目标与要求编写一个程序,反映病人到医院看病,排队看医生的情况。在病人排队的过程中,主要发生两件事。(1) 病人到达诊室,将病历交给护士,拍到等待队列中候诊。(2) 护士从等待队列中取出一名病人的病历,该病人进入诊室就诊。要求程序采用菜单方式,其选项及功能说明如下。(1) 排队输入病人的病历号,加入到病人排队队列中。(2) 就诊病人排队队列中最前面的病人就诊,并将其从队列中删除。(3) 查看排队从队首到队尾列出所有的排队病人的病历号。(4) 下班退出运行。2.实验分析程序中定义了行医类Hospitalize,实现病人排队、就诊、查看、医生行医工作的功能。方法Work()用来进行医生行医工作。3.实验步骤(1)建立工程hospitalize。(2)将软件包中的utility.h复制到hospitalize文件夹中,并将utility.h加入到工程中。(3)将链队列需要的头文件node.h和li_queue.h复制到hospitalize文件夹中,并将node.h和lk_queue.h加入到工程中。(4)建立头文件hospitalize.h,声明并实现行医类Hospitalize。【测试与结论】1.排队输入排队病人的病历号,加入到病人队列中2.就诊病人排队队列中最前面的病人就诊,并将其从队列中删除3.查看排队从队首到队尾列出所有的排队病人的病历号4.下班退出运行请选择:1请输入病历号:11.排队输入排队病人的病历号,加入到病人队列中2.就诊病人排队队列中最前面的病人就诊,并将其从队列中删除3.查看排队从队首到队尾列出所有的排队病人的病历号4.下班退出运行请选择:1请输入病历号:21.排队输入排队病人的病历号,加入到病人队列中2.就诊病人排队队列中最前面的病人就诊,并将其从队列中删除3.查看排队从队首到队尾列出所有的排队病人的病历号4.下班退出运行请选择:1请输入病历号:31.排队输入排队病人的病历号,加入到病人队列中2.就诊病人排队队列中最前面的病人就诊,并将其从队列中删除3.查看排队从队首到队尾列出所有的排队病人的病历号4.下班退出运行请选择:31 2 31.排队输入排队病人的病历号,加入到病人队列中2.就诊病人排队队列中最前面的病人就诊,并将其从队列中删除3.查看排队从队首到队尾列出所有的排队病人的病历号4.下班退出运行请选择:21号病人现在就医.1.排队输入排队病人的病历号,加入到病人队列中2.就诊病人排队队列中最前面的病人就诊,并将其从队列中删除3.查看排队从队首到队尾列出所有的排队病人的病历号4.下班退出运行请选择:4请按任意键继续. . .【思考与感悟】思考:上周学习的数据结构中关于栈,有下面几点,我感觉引起我的重视。栈的基本操作中,基本上都是在栈顶进行的。比如在栈顶的插入,删除,栈的初始化,栈的判空(S.base = S.top),取栈顶元素等等。所以关于top指针要引起足够的重视和理解。理解栈和基本线性表的之间的关系。首先,栈就是线性表,栈是一种操作受限的线性表。可以想想就是带着镣铐跳舞的感觉,所以实现的时候必须严格按照栈的定义来执行栈的操作。栈不存在的条件:base = null;栈为空的条件:base = top;栈满的条件:top base = stacksize;感悟:行医类是为了实现病人的排队及就诊,这就是类似个实现栈功能。病人的排队相当于进栈,就诊相当于退栈。在判断之前,也类似与链表类,要对其进栈进行栈是否为满的操作。对退栈也要对其进行栈是否为空的操作。在实现过程中,因为对软件包的lk_queue.h的实现不熟悉,导致其功能的实现出现差错,还因对字母大小写输写有差错。感悟:在完成对实现一的实现后,发现实现实验二时难度有所减小,但是要写的准确,还是有些难度。最终看到成果的刹那真的很开心,因为付出终得收获,还有在这期间的代码编写有些都似懂非懂,不太明白,要花好大心思才能完成,也多亏了老师的指导。【源代码说明】1.文件名:utility.h,node.h,lk_queue.h,hpspitalize.h,main.cpp2.操作说明:一、行医类的建立定义私有数据和公有成员二、行医类的实现1.排队实现。输入病历号,将其加入到病人排队队列中。2.就诊实现。先判断队列中是否有病人排队,若无,则显示出来,若有,对其排在队列中最前面的病人就诊,并将其从队列中删除。3.查看队列实现。从队首到队尾列出所有的排队病人的病历号。4.实现行医工作。创建个选择键,从1到4中选择,分别对应不同的功能。医生通过这可实现对病人的治疗。源代码:文件名:utility.h#ifndef _UTILITY_H_/ 如果没有定义_UTILITY_H_#define _UTILITY_H_/ 那么定义_UTILITY_H_/ 实用程序软件包#ifdef _MSC_VER/ 表示是VC #if _MSC_VER = 1200/ 表示VC6.0/ 标准库头文件#include / 标准串和操作#include / 标准流操作#include / 极限#include / 数学函数#include / 文件输入输出#include / 字符处理#include / 日期和时间函数#include / 标准库#include / 标准输入输出#include / 输入输出流格式设置#include / 支持变长函数参数#include / 支持断言#else/ 其它版本的VC+/ ANSI C+标准库头文件#include / 标准串和操作#include / 标准流操作#include / 极限#include / 数学函数#include / 文件输入输出#include / 字符处理#include / 日期和时间函数#include / 标准库#include / 标准输入输出#include / 输入输出流格式设置#include / 支持变长函数参数#include / 支持断言using namespace std;/ 标准库包含在命名空间std中#endif/ _MSC_VER = 1200#else/ 非VC / ANSI C+标准库头文件#include / 标准串操作#include / 标准流操作#include / 极限#include / 数据函数#include / 文件输入输出#include / 字符处理#include / 日期和时间函数#include / 标准库#include / 标准输入输出#include / 输入输出流格式设置#include / 支持变长函数参数#include / 支持断言using namespace std;/ 标准库包含在命名空间std中#endif/ _MSC_VER/ 自定义类型enum StatusCode SUCCESS, FAIL, UNDER_FLOW, OVER_FLOW,RANGE_ERROR, DUPLICATE_ERROR,NOT_PRESENT, ENTRY_INSERTED, ENTRY_FOUND, VISITED, UNVISITED;/ 宏定义#define DEFAULT_SIZE 1000/ 缺省元素个数#define DEFAULT_INFINITY 1000000/ 缺省无穷大/ 实用函数(模板)声明static char GetChar(istream &inStream = cin); / 从输入流inStream中跳过空格及制表符获取一字符static bool UserSaysYes();/ 当用户肯定回答(yes)时, 返回true, 用户否定回答(no)时,返回falsestatic void SetRandSeed();/ 设置当前时间为随机数种子static int GetRand(int n);/ 生成0 n-1之间的随机数static int GetRand();/ 生成随机数static int GetPoissionRand(double expectValue);/ 生成期望值为expectValue泊松随机数 template void Swap(ElemType &e1, ElemType &e2);/ 交换e1, e2之值templatevoid Display(ElemType elem, int n);/ 显示数组elem的各数据元素值template void Write(const ElemType &e);/ 显示数据元素/ 实用类class Timer;/ 定时器类Timerclass Error;/ 通用异常类static char GetChar(istream &inStream)/ 操作结果:从输入流inStream中跳过空格及制表符获取一字符char ch;/ 临时变量while (ch = (inStream).peek() != EOF/ 文件结束符(peek()函数从输入流中接受1/ 字符,流的当前位置不变)& (ch = (inStream).get() = / 空格(get()函数从输入流中接受1字符,流/ 的当前位置向后移1个位置)| ch = t);/ 制表符return ch;/ 返回字符static bool UserSaysYes()/ 操作结果: 当用户肯定回答(yes)时, 返回true, 用户否定回答(no)时,返回falsechar ch;/ 用户回答字符bool initialResponse = true;/ 初始回答do/ 循环直到用户输入恰当的回答为止if (initialResponse)/ 初始回答cout (y, n)?; else/ 非初始回答cout 用y或n回答:;while (ch = GetChar() = n);/ 跳过空格,制表符及换行符获取一字符initialResponse = false; while (ch != y & ch != Y & ch != n & ch != N);while (GetChar() != n);/ 跳过当前行后面的字符if (ch = y | ch = Y) return true;else return false;/ 定时器类Timerclass Timerprivate:/ 数据成员clock_t startTime;public:/ 方法声明Timer() startTime = clock(); / 构造函数Timer() ;/ 析构函数double ElapsedTime()/ 返回已过的时间clock_t endTime = clock();/ 结束时间return (double)(endTime - startTime) / (double)CLK_TCK;/ 返回从Timer对象启动或最后一次调用reset()后所使用的CPU时间void Reset() startTime = clock(); / 重置开始时间;#define MAX_ERROR_MESSAGE_LEN 100/ 通用异常类 class Errorprivate:/ 数据成员char messageMAX_ERROR_MESSAGE_LEN;/ 异常信息public:/ 方法声明Error(char mes = 一般性异常!)/ 构造函数 strcpy(message, mes);/ 复制异常信息Error(void) ;/ 析构函数void Show() const/ 显示异常信息cout message endl;/ 显示异常信息;static void SetRandSeed()/ 操作结果:设置当前时间为随机数种子 srand(unsigned)time(NULL); static int GetRand(int n)/ 操作结果:生成0 n-1之间的随机数 return rand() % (n); static int GetRand()/ 操作结果:生成随机数 return rand(); static int GetPoissionRand(double expectValue)/ 操作结果:生成期望值为expectValue泊松随机数 double x = rand() / (double)(RAND_MAX + 1);/ x均匀分布于0, 1)int k = 0;double p = exp(-expectValue);/ pk为泊松分布值double s = 0;/ sk用于求和p0+p1+.+pk-1while (s = x)/ 当sk = x时循环, 循环结束后sk-1 = x sks += p;/ 求和k+;p = p * expectValue / k;/ 求下一项pkreturn k - 1;/ k-1的值服从期希值为expectValue的泊松分布template void Swap(ElemType &e1, ElemType &e2)/ 操作结果: 交换e1, e2之值ElemType temp;/ 临时变量/ 循环赋值实现交换e1, e2temp = e1;e1 = e2; e2 = temp;templatevoid Display(ElemType elem, int n)/ 操作结果: 显示数组elem的各数据元素值for (int i = 0; i n; i+)/ 显示数组elemcout elemi ;cout endl; template void Write(const ElemType &e)/ 操作结果: 显示数据元素 cout e ;#endif文件名: node.h,#ifndef _NODE_H_#define _NODE_H_/ 结点类模板template struct Node / 数据成员:ElemType data;/ 数据域Node *next;/ 指针域/ 构造函数模板:Node();/ 无参数的构造函数模板Node(ElemType item, Node *link = NULL);/ 已知数据元素值和指针建立结构;/ 结点类模板的实现部分templateNode:Node()/ 操作结果:构造指针域为空的结点next = NULL;templateNode:Node(ElemType item, Node *link)/ 操作结果:构造一个数据域为item和指针域为link的结点data = item;next = link;#endif文件名: lk_queue.h#ifndef _LK_QUEUE_H_#define _LK_QUEUE_H_#include utility.h/ 实用程序软件包#include node.h/ 结点类模板/ 链队列类模板templateclass LinkQueue protected:/ 链队列实现的数据成员:Node *front, *rear;/ 队头队尾指指/ 辅助函数模板:void Init();/ 初始化队列public:/ 抽象数据类型方法声明及重载编译系统默认方法声明:LinkQueue();/ 无参数的构造函数模板virtual LinkQueue();/ 析构函数模板int Length() const;/ 求队列长度 bool Empty() const;/ 判断队列是否为空void Clear();/ 将队列清空void Traverse(void (*visit)(const ElemType &) const ;/ 遍历队列StatusCode OutQueue(ElemType &e);/ 出队操作StatusCode GetHead(ElemType &e) const;/ 取队头操作StatusCode InQueue(const ElemType &e);/ 入队操作LinkQueue(const LinkQueue ©);/ 复制构造函数模板LinkQueue &operator =(const LinkQueue ©);/ 重载赋值运算符;/ 链队列类模板的实现部分template void LinkQueue:Init()/ 操作结果:初始化队列rear = front = new Node;/ 生成头结点templateLinkQueue:LinkQueue()/ 操作结果:构造一个空队列Init();templateLinkQueue:LinkQueue()/ 操作结果:销毁队列Clear();templateint LinkQueue:Length() const/ 操作结果:返回队列长度 int count = 0;/ 计数器 for (Node *tmpPtr = front-next; tmpPtr != NULL; tmpPtr = tmpPtr-next)/ 用tmpPtr依次指向每个元素count+;/ 对栈每个元素进行计数return count;templatebool LinkQueue:Empty() const/ 操作结果:如队列为空,则返回true,否则返回false return rear = front;templatevoid LinkQueue:Clear() / 操作结果:清空队列ElemType tmpElem;/ 临时元素值while (Length() 0)/ 队列非空,则出列OutQueue(tmpElem);template void LinkQueue:Traverse(void (*visit)(const ElemType &) const / 操作结果:依次对队列的每个元素调用函数(*visit)for (Node *tmpPtr = front-next; tmpPtr != NULL; tmpPtr = tmpPtr-next)/ 对队列每个元素调用函数(*visit)(*visit)(tmpPtr-data);templateStatusCode LinkQueue:OutQueue(ElemType &e)/ 操作结果:如果队列非空,那么删除队头元素,并用e返回其值,返回SUCCESS,/否则返回UNDER_FLOW,if (!Empty() / 队列非空Node *tmpPtr = front-next;/ 指向队列头素e = tmpPtr-data;/ 用e返回队头元素front-next = tmpPtr-next;/ front指向下一元素if (rear = tmpPtr)/ 表示出队前队列中只有一个元素,出队后为空队列rear = front;delete tmpPtr;/ 释放出队的结点return SUCCESS;else/ 队列为空return UNDER_FLOW;templateStatusCode LinkQueue:GetHead(ElemType &e) const/ 操作结果:如果队列非空,那么用e返回队头元素,返回SUCCESS,/否则返回UNDER_FLOW,if (!Empty() / 队列非空Node *tmpPtr = front-next;/ 指向队列头素e = tmpPtr-data;/ 用e返回队头元素return SUCCESS;else/ 队列为空return UNDER_FLOW;templateStatusCode LinkQueue:InQueue(const ElemType &e)/ 操作结果:插入元素e为新的队尾,返回SUCCESSNode *tmpPtr = new Node(e);/ 生成新结点rear-next = tmpPtr;/ 新结点追加在队尾rear = tmpPtr;/ rear指向新队尾return SUCCESS;templateLinkQueue:LinkQueue(const LinkQueue ©)/ 操作结果:由队列copy构造新队列复制构造函数模板Init();for (Node *tmpPtr = copy.front-next; tmpPtr != NULL; tmpPtr = tmpPtr-next)/ 对copy队列每个元素对当前队列作入队列操作InQueue(tmpPtr-data);templateLinkQueue &LinkQueue:operator =(const LinkQueue ©)/ 操作结果:将队列copy赋值给当前队列重载赋值运算符if (© != this)Clear();for (Node *tmpPtr = copy.front-next; tmpPtr != NULL; tmpPtr = tmpPtr-next)/ 对copy队列每个元素对当前队列作入队列
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年药店相关技能鉴定自我提分评估含答案详解(精练)
- 2025年电工职业资格考试试卷及答案
- 执业药师资格证之《西药学专业一》能力检测试卷及参考答案详解(达标题)
- 综合解析人教版8年级数学上册《 整式的乘法与因式分解》专项测试试卷(附答案详解)
- 2025金华市金东区编外招聘61人模拟试卷及答案详解(各地真题)
- 自考公共课试题附参考答案详解(巩固)
- 油田安全员考及答案
- 宁夏安全员考试及答案工资
- 临床执业医师考前冲刺练习题及完整答案详解(夺冠系列)
- 2025黑龙江省北安市中考物理模拟试题及完整答案详解(典优)
- 跨学科实践活动07 垃圾的分类与回收利用(活动设计)-2024-2025学年九年级化学跨学科实践活动教学说课稿+设计(人教版2024)
- 2025年职业培训学校建设项目可行性分析与初步设计方案报告
- 2025年亚马逊AWS云服务合同范本参考
- 班干部聘任仪式
- 2025年老年病学住院医师规培出科考试理论笔试答案及解析
- 激光武器物理课件
- 气瓶泄漏应急演练范文大全
- 2025年REACH 250项高度关注物质SVHC清单第34批
- 2025年软件架构师专业技术考核试题及答案解析
- 八上语文第9课《天上有颗南仁东星》课件
- 2025-2026学年苏教版(2024)小学科学三年级上册(全册)课时练习及答案(附目录P102)
评论
0/150
提交评论