2.病人就医管理
1.目标与要求
编写一个程序,反应病人到医院看病,排队看医生的情况。在病人排队的过程中,主要发生两件事。
(1) 病人到达诊室,将病历本交给护士,拍到等待队列中候诊。
(2) 护士从等待队列中取出以为病人的病历,该病人进入诊室就诊。
要求程序采用菜单方式,其选项及功能说明如下。
(1) 排队—输入病人的病历号,加入到病人排队队列中。
(2) 就诊—病人排列队列中最前面的病人就诊,并将其从队列中删除。
(3) 查看排队—从队首到队尾列出所有的排队病人的病历号。
(4) 下班—退出运行。
2.工具、准备工作
在实验开始前,应回顾或复习相关内容。
需要一台计算机,其中安装有Visual C++ 6.0、Visual c++ 2005、Visual C++ 2005
Express Dev-c++或MinGW Developer Studio等集成开发环境软件
3.实验分析
4.代码如下:
//头文件:hospitalize.h
#ifndef __HOSPITALIZE_H__
#define __HOSPITALIZE_H__
#include \"lk_queue.h\" // 链队列// 行医类
class Hospitalize
{
private:
// 行医类的数据成员:
LinkQueue  // 辅助函数 void StandInALine();       // 排队 void Cure();         // 就诊 void Display();         // 查看排队 public: //  方法声明及重载编译系统默认方法声明: Hospitalize(){};        // 无参数的构造函数 ~Hospitalize(){};        // 析构函数 void Work();         // 医生工作 }; // 行医类的实现部分 void Hospitalize::StandInALine() // 操作结果: 输入排队病人的病历号,加入到病人排队队列中 { unsigned int num;        // 病历号 cout << \"请输入病历号:\"; cin >> num;          // 输入排队病人 queue.InQueue(num);        // 将病历号加入到病人排队队列中 } void Hospitalize::Cure() // 操作结果: 病人排队队列中最前面的病人就诊,并将其从队列中删除 { if (queue.Empty()) { // 无病人 cout << \"现已没有病人在排队了!\" << endl; } else { unsigned int num;       // 病历号 queue.OutQueue(num);  并将其从队列中删除 // 病人排队队列中最前面的病人就诊, cout << num << \"号病人现在就医.\" << endl; } } void Hospitalize::Display() // 操作结果: 从队首到队尾列出所有的排队病人的病历号 { queue.Traverse(Write); 人的病历号 // 从队首到队尾列出所有的排队病 cout << endl; } void Hospitalize::Work() // 操作结果: 医生工作 { int select = 0; while (select != 4) { cout << \"1. 排队--输入病人的病历号,加入到病人队列中\" << endl; cout << \"2. 就诊--病人排队队列中最前面的病人就诊,并将其从队列中删除\" endl; cout << \"3. 查看排队--从队首到队尾列出所有的排队病人的病历号\" << endl; cout << \"4. 下班--退出运行\" << endl; cout << \"请选择:\"; cin >> select;        // 选择功能 << switch(select) { case 1: StandInALine(); break; case 2: Cure();   除 break; case 3: Display();  break; } } // 排队--输入病人的病历号,加入到病人队列中 // 就诊--病人排队队列中最前面的病人就诊,并将其从队列中删 // 查看排队--从队首到队尾列出所有的排队病人的病历号 } #endif //头文件:lk_queue.h #ifndef __LK_QUEUE_H__ #define __LK_QUEUE_H__ #include \"utility.h\"   // 实用程序软件包 #include \"node.h\"    // 结点类模板 // 链队列类模板 template class LinkQueue { protected: //  链队列实现的数据成员: Node // 辅助函数模板: 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 }; // 链队列类模板的实现部分 template  void LinkQueue // 操作结果:初始化队列 { rear = front = new Node } template LinkQueue // 操作结果:构造一个空队列 { Init(); } template LinkQueue // 操作结果:销毁队列 { Clear(); } template int LinkQueue // 操作结果:返回队列长度 { int count = 0;  // 计数器 for (Node { // 用tmpPtr依次指向每个元素 count++;  // 对栈每个元素进行计数 } return count; } template bool LinkQueue // 操作结果:如队列为空,则返回true,否则返回false { return rear == front; } template void LinkQueue // 操作结果:清空队列 { ElemType tmpElem; // 临时元素值 while (Length() > 0) { // 队列非空,则出列 OutQueue(tmpElem); } } template  void LinkQueue // 操作结果:依次对队列的每个元素调用函数(*visit) { for (Node tmpPtr = tmpPtr->next) { // 对队列每个元素调用函数(*visit) (*visit)(tmpPtr->data); } } template StatusCode LinkQueue // 操作结果:如果队列非空,那么删除队头元素,并用e返回其值,返回SUCCESS, // 否则返回UNDER_FLOW, { if (!Empty()) { // 队列非空 Node e = tmpPtr->data;      // 用e返回队头元素 front->next = tmpPtr->next;    // front指向下一元素 if (rear == tmpPtr) { // 表示出队前队列中只有一个元素,出队后为空队列 rear = front; } delete tmpPtr;       // 释放出队的结点 return SUCCESS; } else { // 队列为空 return UNDER_FLOW; } } template StatusCode LinkQueue // 操作结果:如果队列非空,那么用e返回队头元素,返回SUCCESS, // 否则返回UNDER_FLOW, { if (!Empty()) { // 队列非空 Node e = tmpPtr->data;      // 用e返回队头元素 return SUCCESS; } else { // 队列为空 return UNDER_FLOW; } } template StatusCode LinkQueue // 操作结果:插入元素e为新的队尾,返回SUCCESS { Node rear->next = tmpPtr;       // 新结点追加在队尾 rear = tmpPtr;         // rear指向新队尾 return SUCCESS; } template LinkQueue // 操作结果:由队列copy构造新队列——复制构造函数模板 { Init(); for (Node tmpPtr = tmpPtr->next) { // 对copy队列每个元素对当前队列作入队列操作 InQueue(tmpPtr->data); } } template LinkQueue &LinkQueue // 操作结果:将队列copy赋值给当前队列——重载赋值运算符 { if (© != this) { Clear(); for (Node tmpPtr = tmpPtr->next) { // 对copy队列每个元素对当前队列作入队列操作 InQueue(tmpPtr->data); } } return *this; } #endif //头文件: node.h #ifndef __NODE_H__ #define __NODE_H__ // 结点类模板 template  struct Node { // 数据成员: ElemType data;    // 数据域 Node // 构造函数模板: Node();      // 无参数的构造函数模板 Node(ElemType item, Node }; // 结点类模板的实现部分 template Node // 操作结果:构造指针域为空的结点 { next = NULL; } template // 已知数据元素值和 Node // 操作结果:构造一个数据域为item和指针域为link的结点 { data = item; next = link; } #endif //头文件:utility.h #ifndef __UTILITY_H__    #define __UTILITY_H__   // 实用程序软件包 #ifdef _MSC_VER     #if _MSC_VER == 1200   // 如果没有定义__UTILITY_H__ // 那么定义__UTILITY_H__ // 表示是VC // 表示VC6.0 // 标准库头文件 #include  // 标准串和操作 // 标准流操作 // 极限 // 数学函数 // 文件输入输出 // 字符处理 // 日期和时间函数 // 标准库 // 标准输入输出 // 输入输出流格式设置 // 支持变长函数参数 // 支持断言 #else        // ANSI C++标准库头文件 #include  // 标准串和操作 // 标准流操作 // 极限 // 数学函数 // 文件输入输出 // 字符处理 // 日期和时间函数 // 标准库 // 标准输入输出 // 输入输出流格式设置   // 支持变长函数参数 #include  using namespace std;    // 标准库包含在命名空间std中 #endif // _MSC_VER == 1200 #else        // ANSI C++标准库头文件 #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(); 回答(no)时,返回false // 当用户肯定回答(yes)时, 返回true, 用户否定 static 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之值 template void Display(ElemType elem[], int n); // 显示数组elem的各数据元素值 template  void Write(const ElemType &e);   // 显示数据元素 // 实用类 class Timer;   // 定时器类Timer class Error;   // 通用异常类 static char GetChar(istream &inStream) // 操作结果:从输入流inStream中跳过空格及制表符获取一字符 { char ch;        // 临时变量 while ((ch = (inStream).peek()) != EOF // 文件结束符(peek()函数从输入流中接受1 // 字符,流的当前位置不变) && ((ch = (inStream).get()) == ' ' // 空格(get()函数从输入流中接受1字符,流 // 的当前位置向后移1个位置) || ch == '\'));     // 制表符 return ch;        // 返回字符 } static bool UserSaysYes() // 操作结果: 当用户肯定回答(yes)时, 返回true, 用户否定回答(no)时,返回false { char 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; } // 定时器类Timer class Timer { private: // 数据成员 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 Error { private: // 数据成员 char message[MAX_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-1 while (s <= x) { // 当sk <= x时循环, 循环结束后sk-1 <= x < sk s += p;        // 求和 k++; p = p * expectValue / k;   // 求下一项pk } return k - 1;       // k-1的值服从期希值为expectValue的泊松分布 } template  void Swap(ElemType &e1, ElemType &e2) // 操作结果: 交换e1, e2之值 { ElemType temp;  // 临时变量 // 循环赋值实现交换e1, e2 temp = e1; e1 = e2;  e2 = temp; } template void Display(ElemType elem[], int n) // 操作结果: 显示数组elem的各数据元素值 { for (int i = 0; i < n; i++) { // 显示数组elem cout << elem[i] << \"  \"; } cout << endl; } template  void Write(const ElemType &e) // 操作结果: 显示数据元素 { cout << e << \"  \"; } #endif //主函数main().cpp #include \"utility.h\"    // 实用程序软件包 #include \"hospitalize.h\"   // 行医类的头文件 int main(void) { Hospitalize obj; obj.Work();   system(\"PAUSE\"); return 0;    } // 行医类对象 // 医生工作 // 调用库函数system() // 返回值0, 返回操作系统              
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务
