前言
要求
项目名称:医院排队系统
项目内容:编写一个程序模拟患者到医院看病排队挂号就诊的情况。在患者排队过程中:
(1)患者到达诊室,将病历本交给护士,排到等待队列中候诊。
(2)护士从等待队列中取出下一位患者的病历,该患者进入诊室就诊。
(3)医生下班,提醒余下患者明日就诊。
结果
实验文档
源.cpp 介绍
这段代码是一个简单的排队系统,主要功能如下:
- 包含头文件、和自定义的队列类LinkQueue.h。
- 定义了一个函数menu()用于显示菜单。
- 定义了一个函数main()作为程序的主函数。
- 在main()函数中,创建了一个队列指针p,用于存储患者的姓名。
- 定义了一个布尔变量f,用于判断程序是否继续运行。
- 定义了一个医院对象hp,用于处理患者的排队、就诊等操作。
- 使用一个do-while循环来显示菜单,直到用户选择退出程序。
- 在循环中,根据用户输入的选项,调用相应的函数进行操作。
- 如果用户选择退出程序,将f设置为false,退出循环。
- 最后,输出成功退出系统的提示信息。
总结:这是一个简单的排队系统,实现了基本的排队、就诊和查询排队人数等功能
Queue.cpp 介绍
这是一个C++语言的模板类定义,定义了一个名为LinkQueue的队列类,以及一个名为Hospital的医院类。这两个类都使用了模板参数T,表示队列中元素的类型。
LinkQueue类定义了一个单链表作为队列的数据结构,包含头节点和尾节点指针。该类提供了以下方法:
- 构造函数:初始化头节点和尾节点指针。
- 析构函数:释放队列中的所有节点。
- empty():检查队列是否为空。
- push(T e):将元素e入队。
- pop(T &e):将队列头部的元素赋值给e,并将其出队。
- gethead(T &e):将队列头部的元素赋值给e,不将其出队。
Hospital类定义了一个名为enQueue()的方法,用于将一个名为p的队列指针入队。该方法调用LinkQueue类的push()方法将p入队。Hospital类还定义了一个名为visit()的方法,用于访问队列p中的病人。该方法调用LinkQueue类的gethead()方法将队列头部的元素赋值给一个名为e的临时变量,然后调用Hospital类的timer()方法判断e是否需要离开医院。最后,Hospital类定义了一个名为total()的方法,用于计算队列p中的病人总数。
这个文档主要是针对LinkQueue和Hospital两个类进行说明,没有涉及到具体的实现细节
Queue.cpp 源码
#include <iostream>
#include <ctime>
#include <string>
#include "Queue.h"
using namespace std;
template <class T>
LinkQueue<T>::~LinkQueue()
{
//~ 销毁队列时,将队列中的元素全部释放
while (front != NULL)
{
rear = front->next;
delete front;
front = rear;
}
}
template <class T>
bool LinkQueue<T>::empty()
{
//~ 判断队列是否为空
if (front == rear)
{
return true;
}
return false;
}
template <class T>
bool LinkQueue<T>::push(T e)
{
//~ 向队列中添加元素
if (empty())
{
rear = new LinkNode<T>();
rear->data = e;
front = rear;
rear = new LinkNode<T>();
front->next = rear;
return true;
}
rear->data = e;
LinkNode<T> *p = rear;
rear = new LinkNode<T>();
p->next = rear;
return true;
}
template <class T>
bool LinkQueue<T>::pop(T &e)
{
//~ 从队列中取出元素
if (empty())
{
return false;
}
LinkNode<T> *p;
p = front;
e = front->data;
front = front->next;
delete p;
return true;
}
template <class T>
bool LinkQueue<T>::gethead(T &e)
{
//~ 获取队列中的第一个元素
if (empty())
{
return false;
}
e = front->data;
return true;
}
bool Hospital::timer()
{
//~ 判断是否在就诊时间内
time_t now = time(0);
tm ntime;
gmtime_s(&ntime, &now);
if (ntime.tm_hour >= 20 || ntime.tm_hour <= 8)
{
cout << "医生也需要休息哦!" << endl;
cout << "就诊时间:上午八点--十二点" << endl;
cout << " 下午一点到下午八点" << endl;
return false;
}
return true;
}
bool Hospital::enQueue(LinkQueue<string> *p)
{
//~ 排队
if (!timer())
{
cout << "请在就诊时间内排队" << endl;
return false;
}
string name;
cout << "请输入你的姓名:";
cin >> name;
if (p->push(name))
{
cout << "排队成功!请耐心等待" << endl;
return true;
}
cout << "系统繁忙,请稍后再试(如果多次失败,请询问护士)" << endl;
return false;
}
bool Hospital::visit(LinkQueue<string> *p)
{
//~ 就诊
string name;
if (!timer())
{
cout << "请下午一点或明天再来" << endl;
return false;
}
if (p->pop(name))
{
cout << name << "患者请进室就诊" << endl;
if (p->gethead(name))
{
cout << name << "患者请准备" << endl;
}
return true;
}
cout << "空闲" << endl;
return true;
}
int Hospital::total(LinkQueue<string> *p)
{
//~ 计算队列中的元素个数
int i = 0;
LinkNode<string> *a = p->front;
while (a != p->rear)
{
a = a->next;
i++;
}
return i;
}
收尾
声明
注意:以上文档皆由 vscode上的codegeex插件根据相应代码生成(真的好用啊!)
可以防止以后自己都看不懂自己的代码
全部源码
如果需要全部源码,
我的github仓库
我的gitee仓库https://gitee.com/aa2255/smalltask