通过这个完整的超市管理系统,您将掌握C语言核心数据结构与文件操作技术

设计思路与核心数据结构

本系统使用动态数组管理商品数据,支持商品增删改查文件存储数据统计功能。系统采用模块化设计,分为商品管理、文件操作和用户界面三大模块。

// 商品结构体
typedef struct {int id;         // 商品ID(自动生成)char name[50];  // 商品名称float price;    // 商品单价int stock;      // 库存数量
} Product;// 商品列表(动态数组)
typedef struct {Product* data;  // 指向商品数组的指针int count;      // 当前商品数量
} ProductList;

完整源代码实现

1. 头文件定义 (product.h)

// product.h
#pragma once
#define NAME_LEN 50typedef struct {int id;char name[NAME_LEN];float price;int stock;
} Product;typedef struct {Product* data;int count;
} ProductList;// 函数声明
void init_products(ProductList* list);
void add_product(ProductList* list);
void display_products(ProductList* list);
void modify_product(ProductList* list);
void delete_product(ProductList* list);
void search_product(ProductList* list);
void save_to_file(const char* filename, ProductList* list);
int load_from_file(const char* filename, ProductList* list);

2. 核心功能实现 (product.c)

// product.c
#include "product.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 初始化商品列表
void init_products(ProductList* list) {list->data = NULL;list->count = 0;
}// 添加商品
void add_product(ProductList* list) {// 动态扩展内存Product* new_data = realloc(list->data, (list->count + 1) * sizeof(Product));if (!new_data) {printf("内存分配失败!\n");exit(EXIT_FAILURE);}list->data = new_data;list->count++;// 自动生成IDlist->data[list->count - 1].id = list->count;// 输入商品信息printf("\n商品ID: %d\n", list->count);printf("请输入商品名称: ");scanf("%49s", list->data[list->count - 1].name);printf("请输入单价: ");scanf("%f", &list->data[list->count - 1].price);printf("请输入库存数量: ");scanf("%d", &list->data[list->count - 1].stock);printf("商品添加成功!\n");
}// 显示所有商品
void display_products(ProductList* list) {if (list->count == 0) {printf("\n库存为空\n");return;}printf("\n%5s %-20s %10s %6s\n", "ID", "名称", "单价", "库存");printf("------------------------------------------------\n");for (int i = 0; i < list->count; i++) {printf("%5d %-20s %10.2f %6d\n", list->data[i].id,list->data[i].name,list->data[i].price,list->data[i].stock);}
}// 修改商品信息
void modify_product(ProductList* list) {if (list->count == 0) {printf("\n库存为空,无法修改\n");return;}int id;printf("\n请输入要修改的商品ID: ");scanf("%d", &id);if (id < 1 || id > list->count) {printf("无效的商品ID\n");return;}Product* product = &list->data[id - 1];printf("\n当前商品信息:\n");printf("名称: %s, 单价: %.2f, 库存: %d\n", product->name, product->price, product->stock);printf("\n输入新名称: ");scanf("%49s", product->name);printf("输入新单价: ");scanf("%f", &product->price);printf("输入新库存: ");scanf("%d", &product->stock);printf("\n商品信息更新成功!\n");
}// 删除商品
void delete_product(ProductList* list) {if (list->count == 0) {printf("\n库存为空,无法删除\n");return;}int id;printf("\n请输入要删除的商品ID: ");scanf("%d", &id);if (id < 1 || id > list->count) {printf("无效的商品ID\n");return;}// 将最后一个元素移到要删除的位置if (id < list->count) {list->data[id - 1] = list->data[list->count - 1];}// 减少内存空间Product* new_data = realloc(list->data, (list->count - 1) * sizeof(Product));if (list->count > 1 && !new_data) {printf("内存重新分配失败!\n");return;}list->data = new_data;list->count--;// 重新生成ID序列for (int i = 0; i < list->count; i++) {list->data[i].id = i + 1;}printf("\n商品删除成功!\n");
}// 搜索商品
void search_product(ProductList* list) {if (list->count == 0) {printf("\n库存为空\n");return;}char keyword[50];printf("\n请输入商品名称或ID: ");scanf("%49s", keyword);int found = 0;printf("\n搜索结果:\n");printf("%5s %-20s %10s %6s\n", "ID", "名称", "单价", "库存");printf("------------------------------------------------\n");for (int i = 0; i < list->count; i++) {if (strstr(list->data[i].name, keyword) || (atoi(keyword) > 0 && list->data[i].id == atoi(keyword))) {printf("%5d %-20s %10.2f %6d\n", list->data[i].id,list->data[i].name,list->data[i].price,list->data[i].stock);found = 1;}}if (!found) {printf("未找到匹配的商品\n");}
}// 保存到文件
void save_to_file(const char* filename, ProductList* list) {FILE* file = fopen(filename, "wb");if (!file) {printf("无法打开文件进行保存!\n");return;}// 写入商品数量fwrite(&list->count, sizeof(int), 1, file);// 写入所有商品数据for (int i = 0; i < list->count; i++) {fwrite(&list->data[i], sizeof(Product), 1, file);}fclose(file);printf("\n数据已保存到 %s\n", filename);
}// 从文件加载
int load_from_file(const char* filename, ProductList* list) {FILE* file = fopen(filename, "rb");if (!file) {printf("文件不存在,将创建新文件\n");return 0;}// 读取商品数量int count;fread(&count, sizeof(int), 1, file);if (count <= 0) {fclose(file);return 0;}// 分配内存Product* new_data = malloc(count * sizeof(Product));if (!new_data) {printf("内存分配失败!\n");fclose(file);exit(EXIT_FAILURE);}// 读取商品数据for (int i = 0; i < count; i++) {fread(&new_data[i], sizeof(Product), 1, file);}fclose(file);// 更新列表if (list->data) {free(list->data);}list->data = new_data;list->count = count;printf("\n从 %s 加载了 %d 个商品\n", filename, count);return 1;
}

3. 文件操作实现 (fileio.c)

// fileio.c
#include "product.h"
#include <stdio.h>
#include <stdlib.h>// 清屏函数(跨平台)
void clear_screen() {#ifdef _WIN32system("cls");#elsesystem("clear");#endif
}

4. 主程序与用户界面 (main.c)

// main.c
#include <stdio.h>
#include <stdlib.h>
#include "product.h"#define FILENAME "supermarket.dat"void display_menu() {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("请选择操作: ");
}int main() {ProductList inventory;init_products(&inventory);// 加载已有数据load_from_file(FILENAME, &inventory);int choice;while (1) {display_menu();scanf("%d", &choice);switch (choice) {case 1:add_product(&inventory);break;case 2:display_products(&inventory);break;case 3:modify_product(&inventory);break;case 4:delete_product(&inventory);break;case 5:search_product(&inventory);break;case 6:save_to_file(FILENAME, &inventory);break;case 7:save_to_file(FILENAME, &inventory);free(inventory.data);printf("\n系统已退出,数据已保存\n");return 0;default:printf("无效选项,请重新输入\n");}// 清除输入缓冲区while (getchar() != '\n');printf("\n按回车键继续...");getchar();clear_screen();}
}

系统功能详解

1. 数据管理功能

  • 动态内存管理​:使用realloc()动态调整内存大小
  • 自动ID生成​:商品ID根据添加顺序自动生成
  • 输入验证​:限制输入长度,防止缓冲区溢出
  • 高效删除​:通过移动最后一个元素实现O(1)复杂度删除

2. 文件操作功能

  • 二进制存储​:使用二进制格式保存数据,效率更高
  • 数据恢复​:启动时自动加载上次保存的数据
  • 错误处理​:文件操作包含错误检查,防止数据损坏

3. 用户界面设计

  • 菜单驱动​:直观的菜单导航系统
  • 跨平台清屏​:兼容Windows/Linux/macOS系统
  • 操作确认​:关键操作后提供成功反馈

编译与使用指南

编译方法(GCC)

gcc -c product.c fileio.c
gcc main.c product.o fileio.o -o supermarket
./supermarket

使用说明

  1. 首次运行会自动创建数据文件
  2. 添加商品时只需输入名称、价格和库存
  3. 可通过ID或名称关键字搜索商品
  4. 修改库存时直接输入新数值即可
  5. 退出系统前务必选择"保存数据"选项

扩展与优化建议

1.增加销售功能​:

// 添加销售函数
void sell_product(ProductList* list, int id, int quantity) {if (id < 1 || id > list->count) return;if (list->data[id-1].stock < quantity) {printf("库存不足!\n");return;}list->data[id-1].stock -= quantity;printf("已售出 %d 件 %s\n", quantity, list->data[id-1].name);
}

2.​增加统计功能​:

// 库存统计
void inventory_stats(ProductList* list) {float total_value = 0;printf("\n库存统计:\n");for (int i = 0; i < list->count; i++) {float value = list->data[i].price * list->data[i].stock;printf("%s: 数量=%d, 总价值=%.2f\n", list->data[i].name, list->data[i].stock, value);total_value += value;}printf("\n库存总价值: %.2f\n", total_value);
}

3.性能优化技巧​:

  • 使用哈希表加速搜索
  • 分批写入文件减少I/O操作
  • 添加内存缓存机制

这个超市管理系统实现了核心的商品管理功能,代码结构清晰,注释完整,适合学习和课程设计使用。通过动态内存管理和文件操作,系统可以高效地处理商品数据,为超市日常运营提供了便捷的管理工具

资源推荐:

C/C++学习交流君羊 << 点击加入

C/C++教程

C/C++学习路线,就业咨询,技术提升

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/89139.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/89139.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/89139.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RK3506开发板:多核异构架构赋能高可靠性工业应用

在工业4.0与物联网技术深度融合的当下&#xff0c;企业对嵌入式计算平台的需求正从单一性能向高能效、高可靠、高实时性方向演进。RK3506开发板凭借其创新的三核A7单核M0多核异构架构、紧凑型设计及丰富的外设资源&#xff0c;成为电力、工业网关、HMI&#xff08;人机界面&…

【AIOT 领域-拆解智能对话全生态需求】​​全双工对话-单工对话-半双工

在万物互联的物联网时代&#xff0c;设备间的"对话方式"直接决定了数据传输的效率与可靠性。今天带大家深入解析三种基础通信模式&#xff0c;从工业传感器到5G基站&#xff0c;一文看透数据传输的底层逻辑&#xff01; &#x1f50c; 单工通信&#xff1a;信息流的…

国产数据库华为高斯的GaussDB创建数据表和添加字段及注释

国产数据库华为高斯的GaussDB创建数据表和添加字段及注释 &#x1f538; 一、创建数据库&#x1f538; 二、修改数据库&#xff08;重命名&#xff09;&#x1f538; 三、创建数据表并加字段注释&#x1f538; 四、修改表结构1. 添加字段➕ 添加字段的注释2. 修改字段类型3. 修…

VSCode与Git交互

文章目录 VSCode与Git交互一、引言二、基础设施搭建**PS:在开始高效使用Git之前&#xff0c;首先需要搭建好基础设施&#xff0c;包括安装和配置Git以及VSCode&#xff0c;并初始化Git仓库。**2.1 安装和配置Git&#xff08;1&#xff09;Git的下载与安装&#xff08;2&#xf…

Java 中通信接口

Java 中通信接口 1、Java UDP 通信核心接口介绍1、DatagramSocket 类2、DatagramPacket 类3、UDP客户端与UDP服务器通信例子 2、Java TCP 通信核心接口介绍1、ServerSocket 类2、Socket 类3、输入输出流常见包装类4、TCP 客户端与 TCP 服务器通信例子 Java 网络通信基于 Socket…

树种识别与碳储量计算:基于多源遥感数据与深度学习的融合框架

树种识别与碳储量计算:基于多源遥感数据与深度学习的融合框架 1. 引言:背景与意义 森林作为陆地生态系统的主体,在全球碳循环中扮演着至关重要的角色。精准估算森林生物量及其蕴含的碳储量,是评估区域乃至全球碳收支、应对气候变化、制定森林管理策略的核心科学问题。传统…

如何高效地将照片从 Android 传输到计算机

“如何将图片从 Android 设备传输到笔记本电脑&#xff1f;”我们在 Quora 上发现了这个问题&#xff0c;这篇文章中有不同的答案。如果您对此感到好奇&#xff0c;请不要错过这篇文章&#xff0c;因为在检查所有答案和其他在线帖子并进行测试后&#xff0c;我们整理了 6 种经过…

httpget请求与获取返回值

首先需要在pom中添加对应包信息 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version> </dependency> <dependency><groupId>com.alibaba<…

Rust交互式编程环境Jupyter Lab搭建

windows 11wsl2Ubuntu 24.04.1 LTS Installer.exerust-1.88.0-x86_64-unknown-linux-gnu.tar.xzevcxr_jupyter-v0.20.0-x86_64-unknown-linux-gnu.tar.gzMiniconda3-py312_25.1.1-2-Linux-x86_64.sh /etc/apt/sources.list配置镜像源&#xff08;最好先删除sources.list.d的官…

理解WebGL中的顶点着色器和片元着色器

WebGL是一种基于OpenGL ES的JavaScript API&#xff0c;它允许我们在网页上直接渲染3D图形而无需任何插件。WebGL的核心是着色器编程&#xff0c;它主要包含两种着色器&#xff1a;顶点着色器(Vertex Shader)和片元着色器(Fragment Shader)。 顶点着色器负责处理每个顶点的位置…

从UI设计到数字孪生:构建智慧城市的数据可视化体系

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在城市化进程加速与数字化转型的双重驱动下&#xff0c;智慧城市正从概念走向落地 —— 据 ID…

OpenCV图像旋转:单点旋转与图片旋转

1. 引言 图像旋转是计算机视觉中最基础也是最重要的几何变换之一&#xff0c;在图像处理、计算机视觉、医学影像分析等领域有着广泛应用。OpenCV作为最流行的计算机视觉库&#xff0c;提供了强大的图像旋转功能。本文将深入探讨OpenCV中的两种旋转方式&#xff1a;基于单点的仿…

yolov11安装,训练模型,tensorrtx加速,Qt预测图像

文章目录 一. yolov11 python环境安装二. windows10下yolov11 tensorrtx推理加速三. windows10下qt调用tensorrtx加速的yolov11进行检测 一. yolov11 python环境安装 基础环境 CUDA&#xff1a;cuda_11.8.0_522.06_windows cudnn&#xff1a;cudnn-windows-x86_64-8.6.0.163_c…

生物化学 PCR(聚合酶链式反应)引物 制造(固相磷酰胺化学法) 购买 存储

引物&#xff08;Primer&#xff09; 引物&#xff08;Primer&#xff09;是一小段单链 DNA&#xff08;通常 18~25 个碱基&#xff09;&#xff0c;与模板 DNA 的特定位点互补。包括&#xff1a;Forward Primer&#xff08;正向引物&#xff09;和 Reverse Primer&#xff08…

SQL server 获取表中所有行的序号 不够四位数的前面补0

在 SQL Server 中&#xff0c;如果你想要为表中的行编号&#xff08;即序号&#xff09;添加前导零&#xff0c;以便它们总是呈现为四位数&#xff0c;你可以使用多种方法来实现这一点。以下是几种常用的方法&#xff1a; 方法1&#xff1a;使用 RIGHT 和 REPLICATE 函数 如果…

热门话题!网关模块解决AB机器人和电压控制器EtherCAT转Ethernet/IP难题

网关模块&#xff1a;解决AB机器人与电压控制器通讯难题 在现代工业自动化生产中&#xff0c;不同设备之间的通信与协同至关重要。然而&#xff0c;由于设备品牌、型号以及所采用的通信协议各异&#xff0c;常常会出现通信兼容性问题。本案例将详细介绍如何运用捷米特JM-ECTM-E…

将attribute数据动态写入到excel上

将attribute数据动态写入到excel上 显示效果&#xff1a; I 大体思路&#xff1a; excel range name就设置为attribute_数字_类型&#xff0c;在创建template的时候&#xff0c;通过API得到这个event有几个attribute&#xff0c;就创建几列&#xff0c;同时还要根据不同的类…

Stable Diffusion入门-ControlNet 深入理解 第一课:ControlNet,控制AI绘图的“大杀器”

大家好&#xff0c;欢迎来到Stable Diffusion入门-ControlNet深入理解系列的第一课&#xff01; 今天&#xff0c;我们要聊聊一个让AI绘画从“盲目生成”走向“精准控制”的神奇插件——ControlNet。 它就像一位无声的魔术师&#xff0c;把原本随意的AI生成图片变得有条不紊、…

新生代潜力股刘小北:演艺路上的璀璨新星

在娱乐圈新人辈出的当下&#xff0c;一位来自四川的年轻演员正凭借着自己独特的魅力和扎实的演技&#xff0c;悄然走进观众的视野&#xff0c;他就是刘小北。1998年出生的刘小北&#xff0c;毕业于四川电影电视学院&#xff0c;自踏入演艺圈以来&#xff0c;便以坚定的步伐在演…

强制IDEA始终使用Java 8

解决IDEA总是使用Java 21而非Java 8编译的问题 您遇到的问题是典型的IDE内置JDK与项目冲突的情况。即使系统只安装了Java 8&#xff0c;IntelliJ IDEA仍内置有最新的Java运行时&#xff0c;导致它使用Java 21来编译您的代码。 解决方案&#xff1a;强制IDEA始终使用Java 8 1…