【C語言】藥店藥品管理系統 -丨完整源碼與實現解析

?系統概述

這是一個功能完善的藥店藥品管理系統,使用C語言開發,基于鏈表數據結構實現。系統提供藥品信息的增刪改查、排序和持久化存儲功能,適用于藥店日常藥品管理工作。

數據結構設計

#define MAX_NAME_LEN 50
#define MAX_ID_LEN 20
#define FILENAME "medicine.dat"/* 藥品信息結構體 */
typedef struct Medicine {char id[MAX_ID_LEN];       // 藥品編號char name[MAX_NAME_LEN];   // 藥品名稱float price;               // 單價int stock;                 // 庫存數量struct Medicine *next;     // 鏈表指針
} Medicine;

系統核心函數

1. 鏈表初始化與持久化

/* 從文件加載數據 */
void loadFromFile() {FILE *file = fopen(FILENAME, "rb");if (!file) return;Medicine temp;while (fread(&temp, sizeof(Medicine), 1, file)) {Medicine *newMed = (Medicine*)malloc(sizeof(Medicine));*newMed = temp;newMed->next = head;head = newMed;medicineCount++;}fclose(file);
}/* 保存數據到文件 */
void saveToFile() {FILE *file = fopen(FILENAME, "wb");if (!file) {printf("無法打開文件進行保存!\n");return;}Medicine *current = head;while (current) {fwrite(current, sizeof(Medicine), 1, file);current = current->next;}fclose(file);printf("成功保存%d條藥品記錄!\n", medicineCount);
}

?

2. 藥品添加功能

void addMedicine() {Medicine *newMed = (Medicine*)malloc(sizeof(Medicine));printf("\n--- 添加新藥品 ---\n");// 輸入藥品編號并檢查重復printf("輸入藥品編號: ");scanf("%s", newMed->id);clearInputBuffer();Medicine *current = head;while (current) {if (strcmp(current->id, newMed->id) == 0) {printf("錯誤:藥品編號已存在!\n");free(newMed);return;}current = current->next;}// 輸入其他信息printf("輸入藥品名稱: ");fgets(newMed->name, MAX_NAME_LEN, stdin);newMed->name[strcspn(newMed->name, "\n")] = '\0';printf("輸入藥品單價: ");scanf("%f", &newMed->price);printf("輸入庫存數量: ");scanf("%d", &newMed->stock);clearInputBuffer();// 添加到鏈表頭部newMed->next = head;head = newMed;medicineCount++;printf("藥品添加成功!\n");
}

3. 藥品刪除功能

void deleteMedicine() {char id[MAX_ID_LEN];printf("\n--- 刪除藥品 ---\n");printf("輸入要刪除的藥品編號: ");scanf("%s", id);clearInputBuffer();Medicine *current = head;Medicine *prev = NULL;while (current) {if (strcmp(current->id, id) == 0) {if (prev) {prev->next = current->next;} else {head = current->next;}free(current);medicineCount--;printf("藥品刪除成功!\n");return;}prev = current;current = current->next;}printf("未找到該藥品!\n");
}

?

4. 藥品查詢功能

void searchMedicine() {char keyword[MAX_NAME_LEN];int found = 0;printf("\n--- 藥品查詢 ---\n");printf("輸入藥品編號或名稱: ");fgets(keyword, MAX_NAME_LEN, stdin);keyword[strcspn(keyword, "\n")] = '\0';Medicine *current = head;printf("\n%-15s %-20s %-10s %-10s\n", "編號", "名稱", "單價", "庫存");printf("------------------------------------------------\n");while (current) {if (strstr(current->id, keyword) || strstr(current->name, keyword)) {printf("%-15s %-20s %-10.2f %-10d\n", current->id, current->name, current->price, current->stock);found = 1;}current = current->next;}if (!found) {printf("未找到匹配的藥品!\n");}
}

?

5. 排序功能實現

/* 按價格排序(冒泡排序) */
void sortByPrice() {if (!head || !head->next) return;int swapped;Medicine *ptr1;Medicine *lptr = NULL;do {swapped = 0;ptr1 = head;while (ptr1->next != lptr) {if (ptr1->price < ptr1->next->price) {// 交換節點數據Medicine temp = *ptr1;strcpy(ptr1->id, ptr1->next->id);strcpy(ptr1->name, ptr1->next->name);ptr1->price = ptr1->next->price;ptr1->stock = ptr1->next->stock;strcpy(ptr1->next->id, temp.id);strcpy(ptr1->next->name, temp.name);ptr1->next->price = temp.price;ptr1->next->stock = temp.stock;swapped = 1;}ptr1 = ptr1->next;}lptr = ptr1;} while (swapped);printf("\n已按價格降序排序!\n");displayAll();
}

完整系統源碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>#define MAX_NAME_LEN 50
#define MAX_ID_LEN 20
#define FILENAME "medicine.dat"typedef struct Medicine {char id[MAX_ID_LEN];char name[MAX_NAME_LEN];float price;int stock;struct Medicine *next;
} Medicine;Medicine *head = NULL;
int medicineCount = 0;// 所有函數聲明
void initSystem();
void saveToFile();
void loadFromFile();
void addMedicine();
void deleteMedicine();
void modifyMedicine();
void searchMedicine();
void displayAll();
void sortByPrice();
void sortByStock();
void clearInputBuffer();
void freeList();int main() {int choice;initSystem();while (1) {system("cls || clear");printf("\n===== 藥店藥品管理系統 =====\n");printf("1. 添加藥品信息\n");printf("2. 刪除藥品信息\n");printf("3. 修改藥品信息\n");printf("4. 查詢藥品信息\n");printf("5. 顯示所有藥品\n");printf("6. 按價格排序\n");printf("7. 按庫存排序\n");printf("8. 保存數據\n");printf("0. 退出系統\n");printf("============================\n");printf("請選擇操作: ");if (scanf("%d", &choice) != 1) {clearInputBuffer();printf("輸入無效,請重新輸入!\n");continue;}switch (choice) {case 1: addMedicine(); break;case 2: deleteMedicine(); break;case 3: modifyMedicine(); break;case 4: searchMedicine(); break;case 5: displayAll(); break;case 6: sortByPrice(); break;case 7: sortByStock(); break;case 8: saveToFile(); break;case 0: saveToFile();freeList();printf("系統已退出,數據已保存!\n");exit(0);default:printf("無效選擇,請重新輸入!\n");}printf("\n按回車鍵繼續...");clearInputBuffer();getchar();}return 0;
}// 此處為前文列出的所有函數實現...

?

數據文件

  • 所有藥品數據自動保存到?medicine.dat?文件中
  • 每次啟動程序時會自動加載之前保存的數據
  • 退出程序時自動保存當前數據

功能操作

  1. ?添加藥品?:輸入藥品編號、名稱、單價和庫存量
  2. ?刪除藥品?:根據藥品編號刪除指定藥品
  3. ?修改藥品?:更新藥品的名稱、單價和庫存
  4. ?查詢藥品?:支持按編號或名稱進行模糊查詢
  5. ?排序功能?:按價格或庫存進行降序排列
  6. ?數據保存?:手動保存當前數據到文件
  7. ?退出系統?:安全退出并保存數據

關鍵實現要點

  1. ?數據結構選擇?:

    • 使用單鏈表存儲藥品信息
    • 動態內存分配管理藥品節點
    • 全局頭指針和計數器簡化管理
  2. ?數據持久化?:

    • 使用二進制文件格式提高存儲效率
    • fread/fwrite實現結構體直接讀寫
    • 自動加載和保存機制確保數據安全
  3. ?用戶交互設計?:

    • 清晰的菜單導航系統
    • 表格化數據顯示
    • 輸入錯誤處理和緩沖區清理
  4. ?排序算法?:

    • 冒泡排序實現簡單高效
    • 僅交換節點數據,保持鏈表結構
    • 支持價格和庫存兩種排序方式

系統總結

這個藥店藥品管理系統展示了C語言在數據結構、文件操作和用戶界面設計方面的強大能力。通過本系統,您可以:

  1. 了解鏈表數據結構的實際應用
  2. 掌握C語言文件操作技巧
  3. 學習完整項目的基本架構設計
  4. 掌握用戶界面的基本設計原則
  5. 學習數據持久化存儲的實現方法

系統具有良好的擴展性,可以根據需要添加更多功能,如:

  • 按銷售日期管理藥品
  • 添加有效期管理
  • 實現采購和銷售模塊
  • 添加用戶登錄和權限控制

代碼已添加詳細注釋,便于理解和學習,是學習C語言編程和數據結構實現的優秀案例。

資源推薦:

C/C++學習交流君羊?<< 點擊加入

C/C++教程

C/C++學習路線,就業咨詢,技術提升

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85502.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85502.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85502.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sass-loader與webpack版本沖突解決方案

#npm i 錯誤解決記錄# 最開始錯誤 &#xff1a;拉取代碼&#xff0c;增加依賴時&#xff0c;報錯 問題&#xff1a; 在安裝sass-loader10.1.1時&#xff0c;發現與現有的webpack版本有沖突。 當前項目已經安裝了webpack4.28.4&#xff08;通過peer dependency requirements f…

常見誤區解讀之三:超融合只適合外圍/輕量業務場景,無法承載數據庫等關鍵業務?

作者&#xff1a;SmartX 金融團隊 祝志剛 在前兩期“超融合常見誤區解讀”中&#xff0c;我們分別解讀了如何以超融合建云并進行大規模部署。而對于生產業務場景&#xff0c;部分行業用戶和業界人士可能還會有這樣的認知&#xff1a; “超融合管理簡單、成本也低&#xff0c;…

Kafka重平衡機制深度解析:原理、觸發條件與應對策略

引言 在Kafka分布式消息系統中&#xff0c;重平衡&#xff08;Rebalance&#xff09;是一個至關重要的機制&#xff0c;它確保消費者組中的各個消費者實例能夠公平地分擔主題分區的消費任務。然而&#xff0c;重平衡過程也可能帶來短暫的消費停頓和性能波動&#xff0c;處理不…

使用 Docker Compose 安裝 Milvus(單機版)

1. 創建專用目錄并進入 mkdir milvus-standalone && cd milvus-standalone 2. 下載 docker-compose.yml 文件 使用官方提供的配置文件&#xff08;以 Milvus v2.3.3 為例&#xff09;&#xff1a; wget https://github.com/milvus-io/milvus/releases/download/v2.3…

【MySQL篇05】:事務的 ACID 性(數據庫原理篇)

文章目錄 一、事務的ACID特性二、數據庫原理例題與 ACID 特性判斷三、拓展&#xff08;undolog 與 redolog&#xff09; 一、事務的ACID特性 綜述&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事務是不可分割的最小操作單元&#xff0c;要么全部成功&…

crawl4ai 框架的入門講解和實戰指南——基于Python的智能爬蟲框架,集成AI(如NLP/OCR)實現自動化數據采集與處理

一、crawl4ai 框架簡介 1. 框架定位 核心功能&#xff1a;基于Python的智能爬蟲框架&#xff0c;集成AI&#xff08;如NLP/OCR&#xff09;實現自動化數據采集與處理 關鍵特性&#xff1a; 零配置快速啟動&#xff08;自動識別網頁結構&#xff09; 內置反反爬機制&#xff…

受夠垃圾翻譯!CodeBuddy 8 分鐘造神器,劃詞秒翻 + 自動適配所有網頁

本文所使用的 CodeBuddy 免費下載鏈接&#xff1a;騰訊云代碼助手 CodeBuddy - AI 時代的智能編程伙伴 前言 作為一個天天泡在 GitHub 上扒項目的人&#xff0c;翻譯問題簡直是我 “挖寶” 路上的頭號絆腳石&#xff01;想研究國外大神的優質開源項目&#xff0c;不是被機翻軟…

零基礎設計模式——總結與進階 - 2. 反模式

第五部分&#xff1a;總結與進階 - 2. 反模式 (Anti-Patterns) 在軟件開發中&#xff0c;我們追求良好的設計模式以構建健壯、可維護的系統。然而&#xff0c;同樣存在一些常見的、導致不良后果的解決方案&#xff0c;這些被稱為“反模式”。理解反模式&#xff0c;可以幫助我…

音視頻流媒體高級開發-學習路線

原文作者&#xff1a;Linux 原文鏈接&#xff1a;音視頻流媒體高級開發-學習路線 如果你想往音視頻方向發展&#xff0c;那么本文一定要認真閱讀~ 大家都知道音視頻開發薪資高、門檻高、發展空間大&#xff0c;心里蠢蠢欲動&#xff0c;卻不知道怎么入門&#xff0c;怎么進階…

LINUX 通過rsync同步 免密備份

1&#xff0c;增加免密碼用戶密碼 useradd backup echo "5566777" | passwd --stdin backup echo "backup ALL(ALL) ALL" >> /etc/sudoers # 源服務器操作 ssh client_usersource_server ssh-keygen -t rsa # 一路回車 ssh-copy-id serv…

在使用 HTML5 的 <video> 標簽嵌入視頻時,有時會遇到無法播放 MP4 文件的問題

原因分析&#xff1a; 只能播放聲音&#xff0c;卻無法播放視頻。這通常是由于視頻編碼格式不兼容導致的。雖然 MP4 是一種常見的視頻格式&#xff0c;但它包含多種編碼方式&#xff0c;并非所有編碼方式都受 HTML5 支持。 解決方案&#xff1a; 確認視頻編碼格式&#xff1a; …

【bugfix】記一次Spring Boot 配置層級錯誤導致數據庫連接失敗

前言&#xff1a;為什么你的數據庫配置讀不到&#xff1f; 在 Spring Boot 項目中&#xff0c;配置文件的層級&#xff08;prefix&#xff09; 是決定屬性能否被正確解析的核心因素。一個看似微小的縮進錯誤&#xff0c;可能導致整個應用的數據庫連接失敗、服務啟動異常&#…

wpf 隊列(Queue)在視覺樹迭代查找中的作用分析

文章目錄 隊列(Queue)在視覺樹迭代查找中的作用分析示例代碼一、隊列的核心作用1. 替代遞歸的迭代機制2. 實現廣度優先搜索(BFS) 二、隊列的工作流程1. 初始化階段2. 處理循環 三、隊列操作的詳細步驟查找過程分解&#xff1a; 四、為什么使用隊列而不是其他數據結構1. 與棧(St…

快手數據開發面試SQL題:取窗口內排名第一和排名倒數第一的作為兩個字段輸出

目錄 問題描述 樣例數據表 sales 解決方案 第三步:使用條件聚合將多行合并為單行輸出" 步驟1:計算排名的中間結果 中間結果輸出: 步驟2:最終查詢(處理并列情況) 最終輸出結果: 關鍵點解釋: RANK() OVER (PARTITION BY group_id ORDER BY amount DESC):…

第十六屆藍橋杯國賽(2025)C/C++B組 藍橋星數字 獨家解析

這題我中午是12點以后開始做的&#xff0c;只剩下1個小時了&#xff0c;12點50的時候完成了框架&#xff0c;但是細節總是實現不對&#xff0c;現在晚上來復盤的時候才把這題A出來了。 但是&#xff0c;就像高考的導數你整個思路都會&#xff0c;你死在了求導上。。。&#xf…

Google 的 Protocol Buffers 介紹

Protocol Buffers(簡稱 Protobuf)是由 Google 開發的一種高效、靈活、跨語言的數據序列化協議,廣泛用于網絡通信、分布式系統、持久化存儲等場景。 一、什么是 Protocol Buffers? Protocol Buffers 是一種結構化的數據交換格式,類似于 XML 和 JSON,但更小、更快、更簡單…

犀思云Fusion WAN與阿里云NIS深度融合,實現端到端智能可觀測

隨著“AI數智化”浪潮逐步深入行業&#xff0c;企業網絡的復雜與故障感知日漸凸顯。如何實現網絡的高效運維、智能診斷與全域可視化管理&#xff0c;已成為企業上云的核心挑戰。 近日&#xff0c;犀思云與阿里云達成深度產品級合作&#xff0c;將阿里云網絡智能服務&#xff0…

基于gec6818的環境監測系統設計

一、設計要求 將環境中溫濕度數值、環境的光照強度和煙霧的信息獲取到開發板&#xff0c;顯示在圖形界面上。當溫度值高于閾值時&#xff0c;溫度指示燈變紅、蜂鳴器告警并且啟動直流電機正轉降溫;當濕度值高于閾值時&#xff0c;濕度指示燈變紅、蜂鳴器告警并且繼電器吸合接通…

c++中std::transform詳解和應用代碼示例

std::transform 是 C 標準庫中非常常用的算法之一&#xff0c;屬于 <algorithm> 頭文件。它的作用是將一個&#xff08;或兩個&#xff09;序列中的元素通過某個函數進行變換&#xff0c;并將結果輸出到另一個序列中。 一、std::transform 作用總結 std::transform 支持…

Yolov5 使用

1.開發背景 在已有的 Conda 環境下實現目標檢測標定。 2.開發需求 實現演示例子的圖片標定。 3.開發環境 Ubuntu20.04 Conda Yolov5 4.實現步驟 4.1 安裝環境 # 創建環境 python 版本建議 3.9 以上 conda create -n yolov5 python3.9# 進入環境 conda activate yolov5# …