snehalathaArakkonam/emergency-response-simulator-c

GitHub: snehalathaArakkonam/emergency-response-simulator-c

一个基于 C 语言的 911 应急调度控制台模拟程序,利用优先级队列和链表实现事件自动分级、响应者分配与全生命周期跟踪。

Stars: 0 | Forks: 0

# 🚨 基于 M-Simulator 的应急响应系统 ### *C 语言实现的 911 调度模拟与事件管理* [![语言](https://img.shields.io/badge/Language-C-blue?style=for-the-badge&logo=c&logoColor=white)](https://en.wikipedia.org/wiki/C_(programming_language)) [![平台](https://img.shields.io/badge/Platform-Linux%20%7C%20Windows%20%7C%20macOS-lightgrey?style=for-the-badge&logo=linux&logoColor=white)](https://github.com) [![许可证](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)](./LICENSE) [![状态](https://img.shields.io/badge/Status-Active-brightgreen?style=for-the-badge)](https://github.com/snehalathaArakkonam/emergency-response-simulator-c) [![领域](https://img.shields.io/badge/Domain-Safety%20Tech-red?style=for-the-badge&logo=firefighters&logoColor=white)](https://github.com) [![构建](https://img.shields.io/badge/Build-GCC%20%7C%20Makefile-yellow?style=for-the-badge&logo=gnu&logoColor=white)](https://github.com) [![DS](https://img.shields.io/badge/DS-Priority%20Queue%20%7C%20Linked%20List-purple?style=for-the-badge)](https://github.com) [![文件 IO](https://img.shields.io/badge/Storage-Binary%20Files-orange?style=for-the-badge&logo=databricks&logoColor=white)](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 方向* [![GitHub](https://img.shields.io/badge/GitHub-snehalathaArakkonam-black?style=for-the-badge&logo=github)](https://github.com/snehalathaArakkonam)
*🚨 使用纯 C 语言构建 — 无 API。无 GUI。无真实紧急情况。只有干净的系统级编程。*
标签:CSV输出, Linux/Windows/macOS, 事件追踪, 急救调度系统, 数据结构模拟