1183:病人排队

这是一个关于病人按照特定规则排队看病的问题。老年人优先,并按年龄从大到小排序;非老年人按登记顺序排序。输入包含病人的ID和年龄,输出是按照规则排序后的病人ID列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1183:病人排队

【题目描述】
病人登记看病,编写一个程序,将登记的病人按照以下原则排出看病的先后顺序:
1.老年人(年龄 >= 60岁)比非老年人优先看病。
2.老年人按年龄从大到小的顺序看病,年龄相同的按登记的先后顺序排序。
3.非老年人按登记的先后顺序看病。

【输入】
第1行,输入一个小于100的正整数,表示病人的个数;

后面按照病人登记的先后顺序,每行输入一个病人的信息,包括:一个长度小于10的字符串表示病人的ID(每个病人的ID各不相同且只含数字和字母),一个整数表示病人的年龄,中间用单个空格隔开。

【输出】
按排好的看病顺序输出病人的ID,每行一个。

【输入样例】
5
021075 40
004003 15
010158 67
021033 75
102012 30
【输出样例】
021033
010158
021075
004003
102012

代码:

#include <iostream>
using namespace std;

struct doc{
   
   
	string s;
	int ye;
};

const int LN=100;
doc a[LN
<think>我们正在设计一个医院病人排队模拟系统。根据引用[1]和引用[2],我们可以知道: 1. 系统需要包括排队、就诊、查询、退出等功能。 2. 需要注意当患者数量超出队列长度时的错误处理。 3. 需要对用户输入进行有效性检查。 设计思路: 我们将使用队列(queue)来模拟病人排队。由于队列是先进先出(FIFO)的数据结构,符合排队的基本规则。 系统功能菜单: 1. 排队(添加新病人) 2. 就诊(从队列中取出一个病人) 3. 查询(显示当前排队情况) 4. 退出 注意事项: 1. 设置队列的最大长度,当超出时给出提示。 2. 对用户输入进行验证,确保输入的是1-4的选项。 实现步骤: 1. 定义队列,并设置最大长度(例如100)。 2. 循环显示菜单,提示用户输入选项。 3. 根据用户选择执行相应操作。 具体操作: - 排队:输入病人信息(如姓名、病历号等),如果队列未满则加入队列,否则提示队列已满。 - 就诊:从队列前端取出病人,并显示该病人信息。如果队列为空,则提示没有病人。 - 查询:按顺序显示当前队列中的病人信息。 - 退出:退出程序。 另外,根据引用[2]的遗留问题,我们需要: 1. 在排队时检查队列是否已满,并给出警告。 2. 在功能选择时,只接受1-4的输入,否则提示重新输入。 代码结构: 使用一个循环,每次循环显示菜单并等待用户输入,然后根据输入执行操作。 由于我们使用C++,可以利用标准库中的`<queue>`和`<iostream>`等。 病人信息:为了简单,我们只使用病人的姓名作为标识。如果需要,可以扩展为结构体。 注意:队列没有直接提供遍历的功能,如果需要查询(即遍历队列),我们可以使用一个临时队列来复制内容,然后输出每个元素,同时恢复队列。或者,我们可以使用其他数据结构(如链表)来模拟队列,但标准库的queue不支持遍历。因此,我们可以考虑使用双端队列(deque)或者自己用链表实现,但为了简单,我们这里使用标准库的queue,并在查询时复制一个临时队列来输出。 但是,引用[2]中提到使用队列的基本操作,所以我们按照标准队列来操作,查询时我们只能按顺序输出,而且不能破坏原队列。 由于标准队列不支持遍历,我们可以用循环将队列元素逐个出队并输出,同时将元素入队到一个临时队列中,然后再将临时队列的元素重新入队到原队列。但这样效率较低,而且如果队列很大,可能会影响性能。不过,我们的模拟系统队列不会太长。 另一种方法是使用一个数组或链表来保存所有病人的信息,然后用一个队列来保存排队次序(比如保存索引)。这样查询时可以直接遍历数组。但为了简单,我们这里采用复制队列的方法。 我们也可以使用标准库中的`deque`(双端队列),它支持遍历。但题目要求使用队列,所以我们还是用`queue`,然后通过临时队列来查询。 设计选择:使用`queue`,并采用临时队列的方法来查询。 步骤: 1. 包含头文件:<iostream>, <queue>, <string> 2. 定义队列:`queue<string> patientQueue;` // 存储病人姓名 3. 设置最大队列长度,比如`const int MAX_SIZE = 100;` 代码实现: 注意:在就诊时,我们取出队首的病人,并显示他/她就诊。在排队时,我们要求输入病人姓名,然后加入队列。 菜单显示: 请选择操作: 1. 排队 2. 就诊 3. 查询 4. 退出 输入选项后,执行相应操作。 下面我们编写代码框架: 由于C++标准库的queue不支持遍历,我们按照以下方式实现查询: void showQueue(queue<string> q) { // 注意这里传值,不改变原队列 int position = 1; while (!q.empty()) { cout << position << ". " << q.front() << endl; q.pop(); position++; } } 但是,这样会破坏传入的队列,因为我们是传值,所以不会破坏原队列,因为传入的是副本。但是这样复制整个队列可能效率不高,但病人数量不多,可以接受。 另外,在排队时,我们需要检查当前队列大小是否已经达到MAX_SIZE。 现在开始编写代码:</think>### C++ 医院病人排队模拟系统实现 下面我将实现一个完整的医院病人排队模拟系统,包含排队、就诊、查询和退出功能,并解决引用中提到的遗留问题。 #### 系统设计思路 1. **队列数据结构**:使用 STL `queue` 实现先进先出(FIFO)排队逻辑 2. **错误处理**: - 队列满员时阻止新患者加入并提示 - 输入选项有效性验证 3. **核心功能**: - 排队:添加患者到队列 - 就诊:从队列取出患者 - 查询:显示当前排队情况 - 退出:终止程序 #### 完整代码实现 ```cpp #include <iostream> #include <queue> #include <string> #include <limits> using namespace std; const int MAX_QUEUE_SIZE = 5; // 队列最大容量 // 病人结构体 struct Patient { string name; int id; static int nextID; // 自动生成病历号 }; int Patient::nextID = 1; // 显示菜单 void displayMenu() { cout << "\n===== 医院排队系统 ====="; cout << "\n1. 排队挂号"; cout << "\n2. 就诊"; cout << "\n3. 查询队列"; cout << "\n4. 退出系统"; cout << "\n======================="; cout << "\n请选择操作 (1-4): "; } int main() { queue<Patient> patientQueue; int choice = 0; while (true) { displayMenu(); // 输入验证 while (!(cin >> choice) || choice < 1 || choice > 4) { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "输入无效! 请输入1-4的数字: "; } switch (choice) { case 1: { // 排队挂号 if (patientQueue.size() >= MAX_QUEUE_SIZE) { cout << "\n[警告] 排队已满! 请稍后再试。" << endl; break; } Patient p; cout << "\n请输入患者姓名: "; cin.ignore(); getline(cin, p.name); p.id = Patient::nextID++; patientQueue.push(p); cout << "\n挂号成功! 病历号: " << p.id << ", 姓名: " << p.name << ", 当前位置: " << patientQueue.size() << endl; break; } case 2: { // 就诊 if (patientQueue.empty()) { cout << "\n当前没有患者排队!" << endl; break; } Patient p = patientQueue.front(); patientQueue.pop(); cout << "\n请患者就诊: " << p.name << " (病历号: " << p.id << ")" << endl; break; } case 3: { // 查询队列 if (patientQueue.empty()) { cout << "\n当前没有患者排队!" << endl; break; } cout << "\n===== 当前排队情况 ====="; cout << "\n排队人数: " << patientQueue.size() << "/" << MAX_QUEUE_SIZE << endl; // 复制队列进行遍历(不破坏原队列) queue<Patient> temp = patientQueue; int position = 1; while (!temp.empty()) { Patient p = temp.front(); cout << position++ << ". " << p.name << " (病历号: " << p.id << ")" << endl; temp.pop(); } break; } case 4: // 退出系统 cout << "\n系统已退出,感谢使用!" << endl; return 0; } } } ``` #### 关键功能说明 1. **队列容量控制**: ```cpp const int MAX_QUEUE_SIZE = 5; // 可调整最大容量 if (patientQueue.size() >= MAX_QUEUE_SIZE) { cout << "\n[警告] 排队已满! 请稍后再试。" << endl; } ``` 当队列满员时阻止新患者加入并提示警告[^2] 2. **输入验证**: ```cpp while (!(cin >> choice) || choice < 1 || choice > 4) { cin.clear(); cin.ignore(numeric_limits<streamsize>::max(), '\n'); cout << "输入无效! 请输入1-4的数字: "; } ``` 确保用户只能输入有效选项(1-4)[^2] 3. **自动病历号生成**: ```cpp struct Patient { static int nextID; // 静态成员变量 }; int Patient::nextID = 1; ``` 每个新患者自动获得唯一递增病历号 4. **队列查询**: ```cpp queue<Patient> temp = patientQueue; // 复制队列 while (!temp.empty()) { // 显示患者信息 temp.pop(); } ``` 通过临时队列实现队列遍历,不影响实际排队顺序 #### 系统测试示例 ``` ===== 医院排队系统 ===== 1. 排队挂号 2. 就诊 3. 查询队列 4. 退出系统 ======================= 请选择操作 (1-4): 1 请输入患者姓名: 张三 挂号成功! 病历号: 1, 姓名: 张三, 当前位置: 1 ...(添加更多患者后) 请选择操作 (1-4): 3 ===== 当前排队情况 ===== 排队人数: 3/5 1. 张三 (病历号: 1) 2. 李四 (病历号: 2) 3. 王五 (病历号: 3) 请选择操作 (1-4): 2 请患者就诊: 张三 (病历号: 1) ``` #### 优化建议 1. 添加就诊科室分类(多队列管理) 2. 实现优先队列(急诊患者优先) 3. 增加数据持久化(文件存储) 4. 添加叫号系统(语音提示)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值