snehalathaArakkonam/emergency-response-simulator-c
GitHub: snehalathaArakkonam/emergency-response-simulator-c
一个基于 C 语言的 911 应急调度控制台模拟程序,利用优先级队列和链表实现事件自动分级、响应者分配与全生命周期跟踪。
Stars: 0 | Forks: 0
# 🚨 基于 M-Simulator 的应急响应系统
### *C 语言实现的 911 调度模拟与事件管理*
[](https://en.wikipedia.org/wiki/C_(programming_language))
[](https://github.com)
[](./LICENSE)
[](https://github.com/snehalathaArakkonam/emergency-response-simulator-c)
[](https://github.com)
[](https://github.com)
[](https://github.com)
[](https://github.com)
[📌 项目概述](#-project-overview) • [🧠 工作原理](#-how-it-works) • [📐 架构](#-system-architecture) • [🚀 快速开始](#-getting-started) • [📊 模块](#-modules) • [🎮 输入输出示例](#-sample-io--demo) • [📁 文件结构](#-file-structure)
## 📌 项目概述
**基于 M-Simulator 的应急响应系统** 是一个 **基于控制台的 C 语言应用程序**,用于模拟真实的 911 应急调度中心。当接到事件报警时,系统会自动按优先级(Critical → High → Normal)进行分类,分配正确类型的响应者(Police / Ambulance / Fire),计算预计到达时间(ETA),并跟踪事件的整个生命周期 —— 从 Pending → Dispatched → Responding → Resolved。
本项目展示了对以下概念的掌握:
| 概念 | 实现 |
|---|---|
| **Priority Queues** | 三级调度队列:Critical (1) > High (2) > Normal (3) |
| **Linked Lists** | 包含 `next` 指针的 `Emergency*` 和 `Responder*` 节点 |
| **File Handling** | 使用二进制 `.dat` 文件保存所有持久化数据 |
| **Structures** | `Emergency`, `Responder`, `PriorityQueue`, `MSimulator` 结构体 |
| **Distance Algorithm** | ETA = (距离 / 速度)× 60 分钟 |
| **Sorting** | 基于优先级的事件调度排序 |
| **Simulation Engine** | M-Simulator 自动调度并解决事件 |
| **Modular C** | 9 个职责明确的独立 `.c` 模块 |
## 🧠 工作原理
### 全局概览
```
User Launches Program
│
▼
┌──────────────────────────────────────────┐
│ MAIN MENU (loop) │
│ 1. Report Emergency │
│ 2. View All Emergencies │
│ 3. M-Simulator Dispatch ────────────► │──► Priority Queue
│ 4. Responder Management │──► Auto Allocate
│ 5. Priority Queue Status │──► ETA Calculate
│ 6. Update Status │──► Binary File Write
│ 7. ETA Calculator │
│ 8. Emergency Statistics │
│ 9. Admin Dashboard │
│ 10. Exit + Save │
└──────────────────────────────────────────┘
│
▼
All data persists in .dat binary files
```
### 逐步生命周期
**步骤 1 — 报告紧急情况**
- 用户输入:事件类型、优先级、呼叫者信息、位置、描述
- 系统分配唯一的 `emergencyID`(自动递增)
- 设定优先级:`Critical=1`, `High=2`, `Normal=3`
- 状态设置为 `"Pending"`
- 紧急事件节点被插入到 `EmergencyList`(链表)的头部
- 紧急事件同时被 `enqueue` 到对应的优先级队列层级中
**步骤 2 — 优先级队列**
- 在 `PriorityQueue` 结构体中维护了三个独立的队列:
- `criticalQueue` → 心脏病发作、建筑火灾、持枪犯罪
- `highQueue` → 盗窃、交通事故、中度火灾
- `normalQueue` → 交通纠纷、轻微事件
- `dequeueEmergency()` 始终优先处理 Critical,然后是 High,最后是 Normal
**步骤 3 — M-Simulator 调度**
- 模拟器按优先级顺序扫描所有 `"Pending"` 的紧急事件
- 对于每个紧急事件,调用 `allocateResponder()`:
- 医疗/事故 → Ambulance
- 犯罪/交通 → Police
- 火灾 → Fire Brigade
- 寻找第一个状态为 `"Available"` 且类型匹配的响应者
- 将响应者状态更新为 `"Busy"`
- 计算 ETA:`rand()` 距离 (5–50 km) ÷ 速度 (50/60/70 km/h) × 60
- 将紧急事件状态更新为 `"Dispatched"`
- 记录 `responseTime = time(NULL)`
**步骤 4 — 状态生命周期**
```
Pending ──► Dispatched ──► Responding ──► Resolved
(1) (2) (3) (4)
```
- 在 `"Responding"` 状态时:捕获 `responseTime` 时间戳
- 在 `"Resolved"` 状态时:捕获 `resolvedTime`,并计算总时长
- 一旦解决,响应者状态将切回 `"Available"`
**步骤 5 — ETA 计算器**
```
distance = rand() % 46 + 5 // 5 to 50 km
speed = 60 km/h (Ambulance)
= 70 km/h (Police)
= 50 km/h (Fire)
ETA (min) = (distance / speed) × 60
```
**步骤 6 — 数据持久化**
- 所有结构体通过 `fwrite()` 以二进制形式保存到 `.dat` 文件中
- 启动时通过 `fread()` 加载
- `emergency.log` 通过 `fprintf()` 获取带有时间戳的文本条目
## 📐 系统架构
```
emergency-response-simulator-c/
│
├── emergency.c ← MAIN FILE (entry point + menu loop)
├── emergency_module.c ← Emergency CRUD + linked list
├── responder_module.c ← Responder CRUD + allocation
├── dispatcher_module.c ← M-Simulator dispatch engine
├── priority_module.c ← Priority queue (enqueue/dequeue)
├── eta_module.c ← ETA calculator (distance/speed)
├── status_module.c ← Status update + resolution
├── statistics_module.c ← Dashboard statistics
├── admin_module.c ← Admin summary view
│
├── emergencies.dat ← Binary: incident database
├── responders.dat ← Binary: responder database
├── dispatch.dat ← Binary: dispatch log
├── statistics.dat ← Binary: aggregated stats
├── emergency.log ← Text: timestamped activity log
│
├── Makefile ← Build automation
├── .gitignore
├── LICENSE
└── README.md
```
## 🔬 数据结构深入解析
### Emergency 节点(链表)
```
typedef struct Emergency {
int emergencyID;
char incidentType[50]; // Medical | Crime | Fire | Traffic | Accident
char priority[20]; // Critical | High | Normal
int priorityLevel; // 1=Critical, 2=High, 3=Normal
char callerName[50];
char callerPhone[15];
char location[200];
double latitude;
double longitude;
char description[500];
char status[20]; // Pending | Dispatched | Responding | Resolved
int responderID;
char responderType[20]; // Police | Ambulance | Fire
long dispatchTime; // Unix timestamp
long responseTime;
long resolvedTime;
int responseMin; // Actual response time in minutes
int etaseconds; // Estimated arrival in seconds
struct Emergency* next; // Linked list pointer
} Emergency;
```
### Responder 节点(链表)
```
typedef struct Responder {
int responderID;
char responderType[20]; // Police | Ambulance | Fire
char name[50];
char phone[15];
char vehicleNumber[15];
char location[200];
double latitude;
double longitude;
char status[20]; // Available | Busy | OffDuty
int totalDispatches;
int totalResolutions;
int avgResponseTime;
long lastDispatchTime;
struct Responder* next; // Linked list pointer
} Responder;
```
### 优先级队列
```
typedef struct PriorityQueue {
Emergency* criticalQueue; // Priority Level 1 — processed FIRST
Emergency* highQueue; // Priority Level 2 — processed SECOND
Emergency* normalQueue; // Priority Level 3 — processed LAST
int criticalCount;
int highCount;
int normalCount;
} PriorityQueue;
```
### M-Simulator 跟踪器
```
typedef struct MSimulator {
char simulatorName[50];
char version[10];
int totalSimulations;
int successfulSimulations;
int failedSimulations;
double avgResponseTime;
} MSimulator;
```
### 优先级入队 / 出队逻辑
```
// ENQUEUE — insert into correct tier
void enqueueEmergency(Emergency* e, PriorityQueue* q) {
if(e->priorityLevel == 1) {
e->next = q->criticalQueue;
q->criticalQueue = e;
q->criticalCount++;
} else if(e->priorityLevel == 2) {
e->next = q->highQueue;
q->highQueue = e;
q->highCount++;
} else {
e->next = q->normalQueue;
q->normalQueue = e;
q->normalCount++;
}
}
// DEQUEUE — always Critical first
Emergency* dequeueEmergency(PriorityQueue* q) {
if(q->criticalQueue != NULL) { ... return from criticalQueue; }
if(q->highQueue != NULL) { ... return from highQueue; }
if(q->normalQueue != NULL) { ... return from normalQueue; }
return NULL; // Queue empty
}
```
### 响应者自动分配逻辑
```
// Incident Type → Responder Type Mapping
Medical → Ambulance
Accident → Ambulance
Crime → Police
Traffic → Police
Fire → Fire
// Walks responder linked list, finds first AVAILABLE + MATCHING type
int allocateResponder(ResponderList* responders, char incidentType[]) {
Responder* current = responders->head;
while(current != NULL) {
if(typeMatch && strcmp(current->status, "Available") == 0) {
current->status = "Busy";
current->totalDispatches++;
return current->responderID;
}
current = current->next;
}
return 0; // No responder found
}
```
## 📊 模块
### 模块 1 — 紧急事件管理 (`emergency_module.c`)
| 函数 | 描述 |
|---|---|
| `addEmergency()` | 报告新事件,分配 ID + 优先级 |
| `displayAllEmergencies()` | 遍历链表,打印所有事件 |
| `searchEmergency()` | 按 ID 或事件类型搜索 |
| `updateEmergency()` | 编辑紧急事件详情 |
| `resolveEmergency()` | 标记为已解决,计算总时长 |
| `emergencyByType()` | 过滤:医疗 / 犯罪 / 火灾等 |
| `emergencyByPriority()` | 过滤:Critical / High / Normal |
| `emergencyReport()` | 汇总统计数据 |
### 模块 2 — M-Simulator 调度引擎 (`dispatcher_module.c`)
| 函数 | 描述 |
|---|---|
| `simulateDispatch()` | 扫描所有 Pending → 自动分配响应者 → 设置为 Dispatched |
| `simulateResolution()` | 扫描所有 Dispatched → 模拟 5–30 分钟解决时间 → Resolved |
### 模块 3 — 响应者管理 (`responder_module.c`)
| 函数 | 描述 |
|---|---|
| `addResponder()` | 注册 Police / Ambulance / Fire 单位 |
| `displayAllResponders()` | 列出所有单位及其状态指示器 🟢🔴🟡 |
| `searchResponder()` | 按 ID 或类型查找 |
| `updateResponderStatus()` | 切换 Available / Busy / OffDuty 状态 |
| `availableResponders()` | 仅列出状态为 Available 的单位 |
| `responderByType()` | 按响应者类别过滤 |
| `allocateResponder()` | 自动匹配并分配给紧急事件 |
### 模块 4 — 优先级队列 (`priority_module.c`)
| 函数 | 描述 |
|---|---|
| `enqueueEmergency()` | 插入到 Critical / High / Normal 队列 |
| `dequeueEmergency()` | 提取最高优先级的紧急事件 |
| `displayPriorityQueue()` | 显示每个层级的计数 |
### 模块 5 — ETA 计算器 (`eta_module.c`)
| 函数 | 描述 |
|---|---|
| `calculateETA()` | 根据模拟的距离 + 速度计算到达时间 |
| `displayAllETAs()` | 显示所有 Dispatched 紧急事件的 ETA |
### 模块 6 — 状态跟踪器 (`status_module.c`)
| 函数 | 描述 |
|---|---|
| `updateEmergencyStatus()` | 推动紧急事件流转生命周期 |
| `searchEmergencyByID()` | 通过紧急事件 ID 进行指针查找 |
### 模块 7 — 统计数据 (`statistics_module.c`)
| 函数 | 描述 |
|---|---|
| `emergencyStatistics()` | 按状态计数、平均响应时间、解决率 |
| `responderStatistics()` | 可用性百分比、总调度次数、解决次数 |
### 模块 8 — 管理员仪表板 (`admin_module.c`)
| 函数 | 描述 |
|---|---|
| `adminDashboard()` | 全局系统概览:总数、比率、可用性 |
## 🗄️ 文件处理
### 二进制文件 (`.dat`)
| 文件 | 内容 | 模式 |
|---|---|---|
| `emergencies.dat` | 所有 `Emergency` 结构体节点 | `rb+` / `wb+` |
| `responders.dat` | 所有 `Responder` 结构体节点 | `rb+` / `wb+` |
| `dispatch.dat` | 调度事件日志(谁去了哪里,何时去的) | `ab+` / `rb+` |
| `statistics.dat` | 聚合计数器和指标 | `rb+` / `wb+` |
### 文本日志
| 文件 | 内容 |
|---|---|
| `emergency.log` | 带有时间戳的文本:已报告、已调度、已解决、错误 |
### 使用的文件操作
```
fopen() // Open: rb+ read binary, wb+ write binary, ab+ append binary
fwrite() // Write struct to binary file
fread() // Read struct from binary file
fprintf() // Write timestamped line to emergency.log
fclose() // Always close — avoid data loss
// NULL check: if fopen() returns NULL → create file fresh
```
## 🚀 快速开始
### 前置条件
```
# Linux / macOS
gcc --version # GCC 9+ recommended
make --version # GNU Make
# Windows: 使用 MinGW 或 WSL
```
### 安装与构建
```
# 1. Clone 仓库
git clone https://github.com/snehalathaArakkonam/emergency-response-simulator-c.git
cd emergency-response-simulator-c
# 2. 使用 Makefile 构建
make
# 3. 运行
./emergency
```
### 手动编译(无 Make)
```
gcc -o emergency emergency.c emergency_module.c responder_module.c \
dispatcher_module.c priority_module.c eta_module.c \
status_module.c statistics_module.c admin_module.c -lm
./emergency
```
## 🎮 输入输出示例 — 演示
### ▶ 程序启动
```
========================================
EMERGENCY RESPONSE SYSTEM
911 Dispatch & M-Simulator
========================================
1. Report Emergency
2. View All Emergencies
3. M-Simulator Dispatch
4. Responder Management
5. Priority Queue
6. Update Status
7. ETA Calculator
8. Emergency Statistics
9. Admin Dashboard
10. Exit
========================================
Enter choice:
```
### ▶ 选项 1 — 报告紧急情况
**输入:**
```
Enter choice: 1
=== REPORT EMERGENCY ===
Incident Type: Medical
Priority: Critical
Caller Name: Rahul Kumar
Phone: 9876543210
Location: MG Road, Bangalore
Description: Heart attack patient
```
**输出:**
```
✅ Emergency reported successfully!
Emergency ID: 1
Type: Medical
Priority: Critical
Status: Pending
🚨 Critical emergency added to queue!
```
**输入(第二次紧急情况):**
```
Incident Type: Crime
Priority: High
Caller Name: Priya Singh
Phone: 9876543211
Location: Park Street, Delhi
Description: Theft incident
```
**输出:**
```
✅ Emergency reported successfully!
Emergency ID: 2
Type: Crime
Priority: High
Status: Pending
⚠️ High priority emergency added to queue!
```
### ▶ 选项 2 — 查看所有紧急情况
**输入:** `2`
**输出:**
```
========================================
ALL EMERGENCIES
========================================
1. Emergency ID: 1
Type: Medical
Priority: Critical
Caller: Rahul Kumar (9876543210)
Location: MG Road, Bangalore
Status: Pending
========================================
2. Emergency ID: 2
Type: Crime
Priority: High
Caller: Priya Singh (9876543211)
Location: Park Street, Delhi
Status: Pending
========================================
```
### ▶ 选项 3 — M-Simulator 调度
**输入:** `3`
**输出:**
```
=== M-SIMULATOR: 911 DISPATCH SIMULATION ===
Simulating emergency dispatch process...
🚨 EMERGENCY DETECTED:
ID: 1
Type: Medical
Priority: Critical
Location: MG Road, Bangalore
🔍 Searching for available responder...
✅ Found: Ambulance (ID: 101, Location: Central Hospital)
✅ Responder Allocated: ID 101
📍 Distance: 15 km
Speed: 60 km/h
ETA: 15 minutes
✅ Ambulance is ON ROUTE!
Emergency ID: 1 → Status: Dispatched
--------------------------------------------
🚨 EMERGENCY DETECTED:
ID: 2
Type: Crime
Priority: High
Location: Park Street, Delhi
🔍 Searching for available responder...
✅ Found: Police (ID: 201, Location: South Station)
✅ Responder Allocated: ID 201
📍 Distance: 8 km
Speed: 70 km/h
ETA: 6 minutes
✅ Police is ON ROUTE!
Emergency ID: 2 → Status: Dispatched
```
### ▶ 选项 4 — 响应者管理
**输入:** `4`
**输出:**
```
========================================
ALL RESPONDERS
========================================
1. Ambulance - ID: 101
Name: Dr. Amit Sharma
Phone: 9876543299
Vehicle: AMB-001
Location: Central Hospital
Status: Busy
Total Dispatches: 1
Total Resolutions: 0
🔴 BUSY
========================================
2. Police - ID: 201
Name: Inspector Raj
Phone: 9876543300
Vehicle: PCR-001
Location: South Station
Status: Busy
Total Dispatches: 1
Total Resolutions: 0
🔴 BUSY
========================================
3. Ambulance - ID: 102
Name: Nurse Kavitha
Vehicle: AMB-002
Status: Available
🟢 AVAILABLE
========================================
```
### ▶ 选项 5 — 优先级队列状态
**输入:** `5`
**输出:**
```
========================================
PRIORITY QUEUE STATUS
========================================
🚨 Critical Queue: 1 emergencies
⚠️ High Queue: 1 emergencies
ℹ️ Normal Queue: 0 emergencies
Total: 2 emergencies
========================================
```
### ▶ 选项 6 — 更新状态
**输入:**
```
Enter choice: 6
Enter Emergency ID: 1
Enter New Status: Responding
```
**输出:**
```
🔄 Updating Emergency: ID 1
Old Status: Dispatched
New Status: Responding
✅ Responder is now ON ROUTE!
```
**更新为已解决:**
```
Enter Emergency ID: 1
Enter New Status: Resolved
```
**输出:**
```
🔄 Updating Emergency: ID 1
Old Status: Responding
New Status: Resolved
✅ Emergency RESOLVED!
Total Time: 18 minutes
Responder ID 101 → Status: Available
```
### ▶ 选项 7 — ETA 计算器
**输入:** `7`
**输出:**
```
========================================
ALL EMERGENCY ETAS
========================================
Emergency ID: 2
Type: Crime
Location: Park Street, Delhi
Responder: Police (ID: 201)
📍 Distance: 8 km
Speed: 70 km/h
ETA: 6 minutes
========================================
```
### ▶ 选项 8 — 紧急情况统计
**输入:** `8`
**输出:**
```
========================================
EMERGENCY STATISTICS DASHBOARD
========================================
Total Emergencies: 5
Pending: 1
Dispatched: 1
Responding: 1
Resolved: 2
Average Response Time: 16 minutes
Resolution Rate: 40.00%
========================================
```
### ▶ 选项 9 — 管理员仪表板
**输入:** `9`
**输出:**
```
========================================
ADMIN DASHBOARD
========================================
Total Emergencies: 5
Pending Emergencies: 1
Resolved Emergencies: 2
Active Incidents: 2
Total Responders: 10
Available Responders: 8
Busy Responders: 2
Availability Rate: 80.00%
Total Dispatches: 5
Total Resolutions: 2
Average Response Time: 16 minutes
Resolution Rate: 40.00%
========================================
```
### ▶ 选项 10 — 退出
```
Emergency data saved successfully!
Thank you for using Emergency Response System!
```
## 🗺️ 系统流程图
```
flowchart TD
A[Program Start] --> B[Load .dat Binary Files]
B --> C[Initialize Linked Lists + Priority Queue]
C --> D{Main Menu Loop}
D -->|1| E[Report Emergency]
E --> E1[malloc Emergency node]
E1 --> E2[Set priorityLevel 1/2/3]
E2 --> E3[Insert at head of EmergencyList]
E3 --> E4[enqueueEmergency into PriorityQueue]
E4 --> D
D -->|3| F[M-Simulator Dispatch]
F --> F1[Scan Pending emergencies]
F1 --> F2{Any Pending?}
F2 -->|No| F3[Nothing to dispatch]
F2 -->|Yes| F4[allocateResponder by type]
F4 --> F5{Responder found?}
F5 -->|No| F6[❌ No responder available]
F5 -->|Yes| F7[calculateETA distance/speed]
F7 --> F8[Set status → Dispatched]
F8 --> F9[Responder status → Busy]
F9 --> F10[fwrite to dispatch.dat]
F10 --> D
D -->|6| G[Update Status]
G --> G1[searchEmergencyByID]
G1 --> G2{Status?}
G2 -->|Responding| G3[Capture responseTime]
G2 -->|Resolved| G4[Compute total time]
G4 --> G5[Responder → Available]
G5 --> G6[fwrite to emergencies.dat]
G6 --> D
D -->|10| H[Save All Data]
H --> H1[fwrite EmergencyList to emergencies.dat]
H1 --> H2[fwrite ResponderList to responders.dat]
H2 --> H3[fprintf to emergency.log]
H3 --> H4[✅ Exit]
```
## 🔢 使用的数学公式
```
ETA (minutes) = (distance / speed) × 60
distance = rand() % 46 + 5 // Simulated: 5 to 50 km
speed = 60 km/h (Ambulance)
= 70 km/h (Police)
= 50 km/h (Fire Brigade)
resolution time = resolvedTime - dispatchTime (in seconds → /60 for minutes)
resolution rate = (resolvedCount / totalCount) × 100
avg response = totalResponseMinutes / resolvedCount
availability % = (availableResponders / totalResponders) × 100
```
## ⚠️ 输入验证规则
| 输入 | 验证 |
|---|---|
| 事件类型 | 必须为 医疗 / 犯罪 / 火灾 / 交通 / 事故 |
| 优先级 | 必须为 Critical / High / Normal → 对应级别 1/2/3 |
| 呼叫者电话 | 非空字符串检查 |
| 位置 | 非空字符串检查 |
| 紧急事件 ID (更新) | 必须存在于链表中 |
| 出动数量 (响应者) | 必须为 Available 状态且类型匹配 |
| 文件打开 | 如果 `fopen()` 返回 NULL → 自动重新创建文件 |
| 菜单选择 | 仅限 1–10;无效输入会重新提示 |
## 🧩 展示的关键概念
```
✅ Priority Queue → Three-tier dispatch: Critical > High > Normal
✅ Linked Lists → Emergency* and Responder* nodes with next pointers
✅ Dynamic Memory → malloc() for every new Emergency / Responder node
✅ File Handling → fwrite/fread binary; fprintf text log
✅ Structures → Emergency, Responder, PriorityQueue, MSimulator
✅ Sorting Algorithm → Priority-based dequeue order
✅ Distance Algorithm → ETA = (distance / speed) × 60
✅ Status Lifecycle → Pending → Dispatched → Responding → Resolved
✅ Auto Allocation → Type-based responder matching engine
✅ Input Validation → All inputs validated before processing
✅ Statistics Dashboard → Resolution rate, avg response, availability %
✅ Modular C Design → 9 separate .c files, clean separation of concerns
✅ M-Simulator Engine → Batch dispatch + resolution simulation in one call
```
## 📁 文件结构
```
emergency-response-simulator-c/
│
├── 📄 emergency.c ← Main file (750+ lines)
├── 📄 emergency_module.c ← Emergency functions (180 lines)
├── 📄 responder_module.c ← Responder functions (180 lines)
├── 📄 dispatcher_module.c ← Dispatch simulation (160 lines)
├── 📄 priority_module.c ← Priority queue (140 lines)
├── 📄 eta_module.c ← ETA calculator (120 lines)
├── 📄 status_module.c ← Status updates (120 lines)
├── 📄 statistics_module.c ← Statistics (140 lines)
├── 📄 admin_module.c ← Dashboard (120 lines)
│
├── 🗄️ emergencies.dat ← Binary incident database
├── 🗄️ responders.dat ← Binary responder database
├── 🗄️ dispatch.dat ← Binary dispatch event log
├── 🗄️ statistics.dat ← Binary aggregated stats
├── 📝 emergency.log ← Text activity log
│
├── 🔧 Makefile ← Build automation
├── 📄 .gitignore
├── 📄 LICENSE
└── 📄 README.md
```
## 👩💻 作者
**Snehalatha Arakkonam**
*B.Tech CSE — AI & ML 方向*
[](https://github.com/snehalathaArakkonam)
*🚨 使用纯 C 语言构建 — 无 API。无 GUI。无真实紧急情况。只有干净的系统级编程。*
标签:CSV输出, Linux/Windows/macOS, 事件追踪, 急救调度系统, 数据结构模拟