【C語言】超市管理系統丨完整源碼與實現解析

通過這個完整的超市管理系統,您將掌握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…