系统概述

这是一个功能完善的药店药品管理系统,使用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# …