实验二 病人就医管理Word下载.docx
《实验二 病人就医管理Word下载.docx》由会员分享,可在线阅读,更多相关《实验二 病人就医管理Word下载.docx(24页珍藏版)》请在冰点文库上搜索。
![实验二 病人就医管理Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/2/25dbec16-a27a-4775-97d6-94a53fd89e0d/25dbec16-a27a-4775-97d6-94a53fd89e0d1.gif)
1号病人现在就医.
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.cpp
2.操作说明:
一、行医类的建立
定义私有数据和公有成员
二、行医类的实现
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<
string.h>
//标准串和操作
iostream.h>
//标准流操作
limits.h>
//极限
math.h>
//数学函数
fstream.h>
//文件输入输出
ctype.h>
//字符处理
time.h>
//日期和时间函数
stdlib.h>
//标准库
stdio.h>
//标准输入输出
iomanip.h>
//输入输出流格式设置
stdarg.h>
//支持变长函数参数
assert.h>
//支持断言
#else//其它版本的VC++
//ANSIC++标准库头文件
string>
iostream>
//标准流操作
limits>
cmath>
fstream>
//文件输入输出
cctype>
ctime>
cstdlib>
cstdio>
//标准输入输出
iomanip>
//输入输出流格式设置
cstdarg>
//支持变长函数参数
cassert>
usingnamespacestd;
//标准库包含在命名空间std中
#endif//_MSC_VER==1200
#else//非VC
//标准串操作
//数据函数
#endif//_MSC_VER
//自定义类型
enumStatusCode{SUCCESS,FAIL,UNDER_FLOW,OVER_FLOW,RANGE_ERROR,DUPLICATE_ERROR,
NOT_PRESENT,ENTRY_INSERTED,ENTRY_FOUND,VISITED,UNVISITED};
//宏定义
#defineDEFAULT_SIZE1000//缺省元素个数
#defineDEFAULT_INFINITY1000000//缺省无穷大
//实用函数(模板)声明
staticcharGetChar(istream&
inStream=cin);
//从输入流inStream中跳过空格及制表符获取一字符
staticboolUserSaysYes();
//当用户肯定回答(yes)时,返回true,用户否定回答(no)时,返回false
staticvoidSetRandSeed();
//设置当前时间为随机数种子
staticintGetRand(intn);
//生成0~n-1之间的随机数
staticintGetRand();
//生成随机数
staticintGetPoissionRand(doubleexpectValue);
//生成期望值为expectValue泊松随机数
template<
classElemType>
voidSwap(ElemType&
e1,ElemType&
e2);
//交换e1,e2之值
template<
classElemType>
voidDisplay(ElemTypeelem[],intn);
//显示数组elem的各数据元素值
voidWrite(constElemType&
e);
//显示数据元素
//实用类
classTimer;
//定时器类Timer
classError;
//通用异常类
inStream)
//操作结果:
从输入流inStream中跳过空格及制表符获取一字符
{
charch;
//临时变量
while((ch=(inStream).peek())!
=EOF//文件结束符(peek()函数从输入流中接受1
//字符,流的当前位置不变)
&
&
((ch=(inStream).get())=='
'
//空格(get()函数从输入流中接受1字符,流
//的当前位置向后移1个位置)
||ch=='
\t'
));
//制表符
returnch;
//返回字符
}
staticboolUserSaysYes()
//操作结果:
当用户肯定回答(yes)时,返回true,用户否定回答(no)时,返回false
//用户回答字符
boolinitialResponse=true;
//初始回答
do
{//循环直到用户输入恰当的回答为止
if(initialResponse)
{//初始回答
cout<
<
"
(y,n)?
"
;
}
else
{//非初始回答
用y或n回答:
while((ch=GetChar())=='
\n'
);
//跳过空格,制表符及换行符获取一字符
initialResponse=false;
}while(ch!
='
y'
&
ch!
Y'
n'
N'
while(GetChar()!
//跳过当前行后面的字符
if(ch=='
||ch=='
)returntrue;
elsereturnfalse;
//定时器类Timer
classTimer
private:
//数据成员
clock_tstartTime;
public:
//方法声明
Timer(){startTime=clock();
}//构造函数
~Timer(){};
//析构函数
doubleElapsedTime()//返回已过的时间
{
clock_tendTime=clock();
//结束时间
return(double)(endTime-startTime)/(double)CLK_TCK;
//返回从Timer对象启动或最后一次调用reset()后所使用的CPU时间
}
voidReset(){startTime=clock();
}//重置开始时间
};
#defineMAX_ERROR_MESSAGE_LEN100
//通用异常类
classError
charmessage[MAX_ERROR_MESSAGE_LEN];
//异常信息
Error(charmes[]="
一般性异常!
)//构造函数
strcpy(message,mes);
//复制异常信息
~Error(void){};
//析构函数
voidShow()const//显示异常信息
cout<
message<
endl;
//显示异常信息
staticvoidSetRandSeed()
设置当前时间为随机数种子
{
srand((unsigned)time(NULL));
staticintGetRand(intn)
生成0~n-1之间的随机数
returnrand()%(n);
staticintGetRand()
生成随机数
returnrand();
staticintGetPoissionRand(doubleexpectValue)
生成期望值为expectValue泊松随机数
doublex=rand()/(double)(RAND_MAX+1);
//x均匀分布于[0,1)
intk=0;
doublep=exp(-expectValue);
//pk为泊松分布值
doubles=0;
//sk用于求和p0+p1+...+pk-1
while(s<
=x)
{//当sk<
=x时循环,循环结束后sk-1<
=x<
sk
s+=p;
//求和
k++;
p=p*expectValue/k;
//求下一项pk
returnk-1;
//k-1的值服从期希值为expectValue的泊松分布
e2)
交换e1,e2之值
ElemTypetemp;
//临时变量
//循环赋值实现交换e1,e2
temp=e1;
e1=e2;
e2=temp;
voidDisplay(ElemTypeelem[],intn)
显示数组elem的各数据元素值
for(inti=0;
i<
n;
i++)
{//显示数组elem
elem[i]<
cout<
e)
显示数据元素
e<
#endif
node.h,
#ifndef__NODE_H__
#define__NODE_H__
//结点类模板
structNode
//数据成员:
ElemTypedata;
//数据域
Node<
ElemType>
*next;
//指针域
//构造函数模板:
Node();
//无参数的构造函数模板
Node(ElemTypeitem,Node<
*link=NULL);
//已知数据元素值和指针建立结构
//结点类模板的实现部分
Node<
:
Node()
构造指针域为空的结点
next=NULL;
Node(ElemTypeitem,Node<
*link)
构造一个数据域为item和指针域为link的结点
data=item;
next=link;
lk_queue.h
#ifndef__LK_QUEUE_H__
#define__LK_QUEUE_H__
#include"
utility.h"
//实用程序软件包
node.h"
//结点类模板
//链队列类模板
classLinkQueue
protected:
//链队列实现的数据成员:
*front,*rear;
//队头队尾指指
//辅助函数模板:
voidInit();
//初始化队列
//抽象数据类型方法声明及重载编译系统默认方法声明:
LinkQueue();
//无参数的构造函数模板
virtual~LinkQueue();
//析构函数模板
intLength()const;
//求队列长度
boolEmpty()const;
//判断队列是否为空
voidClear();
//将队列清空
voidTraverse(void(*visit)(constElemType&
))const;
//遍历队列
StatusCodeOutQueue(ElemType&
//出队操作
StatusCodeGetHead(ElemType&
e)const;
//取队头操作
StatusCodeInQueue(constElemType&
//入队操作
LinkQueue(constLinkQueue<
copy);
//复制构造函数模板
LinkQueue<
operator=(constLinkQueue<
//重载赋值运算符
//链队列类模板的实现部分
voidLinkQueue<
Init()
初始化队列
rear=front=newNode<
//生成头结点
LinkQueue<
LinkQueue()
构造一个空队列
Init();
~LinkQueue()
销毁队列
Clear();
intLinkQueue<
Length()const
返回队列长度
intcount=0;
//计数器
for(Node<
*tmpPtr=front->
next;
tmpPtr!
=NULL;
tmpPtr=tmpPtr->
next)
{//用tmpPtr依次指向每个元素
count++;
//对栈每个元素进行计数
returncount;
boolLinkQueue<
Empty()const
如队列为空,则返回true,否则返回false
returnrear==front;
Clear()
清空队列
ElemTypetmpElem;
//临时元素值
while