当前位置: 首页 > news >正文

C语言实战系列二:简单超市收银系统

从一个简单的超市收银系统,我们来练习一个系统如何设计,然后如何实现的思路。

在Ubuntu环境下使用C语言编写一个简单的超市收银系统。以下是一个基本的示例,涵盖了商品管理、购物车、交易处理等功能。

代码

#include <stdio.h>
#include <stdlib.h>// 商品结构体
struct Product {int id;char name[50];float price;
};// 购物车项结构体
struct ShoppingCartItem {struct Product product;int quantity;
};// 交易结构体
struct Transaction {struct ShoppingCartItem *items;int itemCount;
};// 商品管理结构体
struct Inventory {struct Product *products;int productCount;
};// 初始化商品管理系统
struct Inventory initializeInventory() {struct Inventory inventory;inventory.products = NULL;inventory.productCount = 0;return inventory;
}// 添加商品到库存
void addProduct(struct Inventory *inventory, struct Product product) {inventory->products = realloc(inventory->products, (inventory->productCount + 1) * sizeof(struct Product));inventory->products[inventory->productCount++] = product;
}// 显示库存信息
void displayInventory(struct Inventory inventory) {printf("Inventory:\n");for (int i = 0; i < inventory.productCount; ++i) {printf("%d. %s - $%.2f\n", inventory.products[i].id, inventory.products[i].name, inventory.products[i].price);}
}// 获取商品信息
struct Product getProductInfo(struct Inventory inventory, int productId) {for (int i = 0; i < inventory.productCount; ++i) {if (inventory.products[i].id == productId) {return inventory.products[i];}}struct Product notFound;notFound.id = -1;return notFound;
}// 初始化交易
struct Transaction initializeTransaction() {struct Transaction transaction;transaction.items = NULL;transaction.itemCount = 0;return transaction;
}// 添加商品到购物车
void addToCart(struct Transaction *transaction, struct Product product, int quantity) {transaction->items = realloc(transaction->items, (transaction->itemCount + 1) * sizeof(struct ShoppingCartItem));transaction->items[transaction->itemCount].product = product;transaction->items[transaction->itemCount].quantity = quantity;++transaction->itemCount;printf("Added %d %s(s) to the cart.\n", quantity, product.name);
}// 显示购物车
void displayCart(struct Transaction transaction) {float total = 0.0;printf("Shopping Cart:\n");for (int i = 0; i < transaction.itemCount; ++i) {struct ShoppingCartItem item = transaction.items[i];printf("%s - Quantity: %d\n", item.product.name, item.quantity);total += item.product.price * item.quantity;}printf("Total Price: $%.2f\n", total);
}// 完成交易
void completeTransaction(struct Transaction transaction) {printf("Transaction completed. Thank you!\n");free(transaction.items);
}int main() {struct Inventory inventory = initializeInventory();// 添加一些商品addProduct(&inventory, (struct Product){1, "Milk", 2.5});addProduct(&inventory, (struct Product){2, "Bread", 1.0});addProduct(&inventory, (struct Product){3, "Eggs", 3.0});struct Transaction transaction = initializeTransaction();// 超市收银系统while (1) {displayInventory(inventory);int productId;printf("Enter product ID to add to cart (or 0 to finish): ");scanf("%d", &productId);if (productId == 0) {break;}struct Product product = getProductInfo(inventory, productId);if (product.id != -1) {int quantity;printf("Enter quantity: ");scanf("%d", &quantity);addToCart(&transaction, product, quantity);} else {printf("Product not found.\n");}}displayCart(transaction);completeTransaction(transaction);// 释放资源free(inventory.products);return 0;
}

编译:

gcc supermarket.c -o supermarket
./supermarket

程序设计的详细过程:

步骤 1: 定义数据模型

在程序设计的起始阶段,定义了程序需要用到的数据模型,包括商品、购物车项和交易。使用结构体表示这些概念,其中包括商品(Product)、购物车项(ShoppingCartItem)和交易(Transaction)。

struct Product {int id;char name[50];float price;
};struct ShoppingCartItem {struct Product product;int quantity;
};struct Transaction {struct ShoppingCartItem *items;int itemCount;
};

步骤 2: 商品管理

设计商品管理系统,包括添加商品到库存和获取商品信息的功能。使用结构体 Inventory 来保存商品信息,并定义相应的函数。

struct Inventory {struct Product *products;int productCount;
};// 添加商品到库存
void addProduct(struct Inventory *inventory, struct Product product) {// 通过realloc动态分配内存以保存商品inventory->products = realloc(inventory->products, (inventory->productCount + 1) * sizeof(struct Product));inventory->products[inventory->productCount++] = product;
}// 获取商品信息
struct Product getProductInfo(struct Inventory inventory, int productId) {for (int i = 0; i < inventory.productCount; ++i) {if (inventory.products[i].id == productId) {return inventory.products[i];}}struct Product notFound;notFound.id = -1;return notFound;
}

步骤 3: 用户界面

设计用户界面,实现基本的用户交互,允许用户选择商品并添加到购物车。使用结构体 CashierUI 和相应的函数。

struct CashierUI {struct Inventory inventory;struct Transaction transaction;
};// 显示库存信息
void displayInventory(struct Inventory inventory) {// 输出商品列表
}// 添加商品到购物车
void addToCart(struct Transaction *transaction, struct Product product, int quantity) {// 将商品添加到购物车
}// 显示购物车信息
void displayCart(struct Transaction transaction) {// 输出购物车内容
}// 完成交易
void completeTransaction(struct Transaction transaction) {// 输出总价和完成交易信息
}

步骤 4: 交易处理

实现交易处理功能,计算购物车中商品的总价并完成交易。

// 初始化交易
struct Transaction initializeTransaction() {struct Transaction transaction;transaction.items = NULL;transaction.itemCount = 0;return transaction;
}// 完成交易
void completeTransaction(struct Transaction transaction) {// 输出总价和完成交易信息// 释放购物车内存free(transaction.items);
}

步骤 5: 主程序

在主程序中,创建超市收银系统实例,添加一些商品,然后启动收银系统。

int main() {// 初始化商品管理系统struct Inventory inventory = initializeInventory();// 添加一些商品addProduct(&inventory, (struct Product){1, "Milk", 2.5});addProduct(&inventory, (struct Product){2, "Bread", 1.0});addProduct(&inventory, (struct Product){3, "Eggs", 3.0});// 初始化交易struct Transaction transaction = initializeTransaction();// 超市收银系统while (1) {// 显示库存信息displayInventory(inventory);int productId;printf("Enter product ID to add to cart (or 0 to finish): ");scanf("%d", &productId);if (productId == 0) {break;}// 获取商品信息struct Product product = getProductInfo(inventory, productId);if (product.id != -1) {int quantity;printf("Enter quantity: ");scanf("%d", &quantity);// 添加商品到购物车addToCart(&transaction, product, quantity);} else {printf("Product not found.\n");}}// 显示购物车displayCart(transaction);// 完成交易completeTransaction(transaction);// 释放资源free(inventory.products);return 0;
}

这个设计过程包括了程序的整体结构、数据模型的定义、功能的实现以及用户界面的设计。当设计一个更大规模的系统时,可能需要考虑更多的功能,例如支付处理、库存管理、用户认证等。这个简化的例子提供了一个基本的框架,可以根据实际需求进行扩展。

相关文章:

C语言实战系列二:简单超市收银系统

从一个简单的超市收银系统&#xff0c;我们来练习一个系统如何设计&#xff0c;然后如何实现的思路。 在Ubuntu环境下使用C语言编写一个简单的超市收银系统。以下是一个基本的示例&#xff0c;涵盖了商品管理、购物车、交易处理等功能。 代码 #include <stdio.h> #inc…...

coding推送代码Jenkins自动构建部署

实现功能&#xff1a;我们向coding推送代码&#xff0c;通过webhook自动通知Jenkins&#xff0c;实现自动构建部署 coding 项目设置 / 开发者选项 / Service Hook 输入以下参数 发送POST请求服务 URL&#xff1a;htttp://xxx用户名&#xff1a;xxx密码&#xff1a;xxx Jen…...

Kettle-Docker部署+Sqlserver数据同步Mysql+Start定时任务

一. 背景介绍 1. ETL是什么 ETL&#xff08;Extract-Transform-Load&#xff09;&#xff0c;即数据抽取、转换、装载的过程。它是一种思想&#xff0c;主要是说&#xff0c;从不同的数据源获取数据&#xff0c;并通过对数据进行处理&#xff08;格式&#xff0c;协议等转换&a…...

《微信小程序开发从入门到实战》学习九十三

7.1 视图容器组件 7.1.3 swiper与swiper-item组件 swiper组件的显示效果如下图所示&#xff1a; indicator-dots、indicator-color和indicator-active-color三个属性用于设置swiper组件下方的指示点。设置指示点的颜色时&#xff0c;可以使用HexColor&#xff0c;也可以使用r…...

Java服务端使用freemarker+wkhtmltoimage生成Echart图片

目录 1.通过 freemarker 将ftl转成html 1.1 freemarker 手册: 1.2 添加freemarker maven依赖 1.3 添加 echart-test.ftl 模版文件 1.4 添加 FreemarkerTool 工具类 1.5 添加测试main方法 1.6 运行,生成echart-test-时间戳.html 文件 2. 通过wkhtmltoimage将html 转为p…...

一款颜值与实力并存的翻页时钟(免费)

FliTik是一款颜值与实力并存的翻页时钟&#xff0c;安卓端是完全免费的&#xff0c;无任何广告&#xff0c;极简风 &#xff0c;软件默认是12小时制&#xff0c;可以在设置中启用24小时制&#xff0c;并且还支持设置显示秒钟、日期、文案&#xff0c;滴答声和语音报时。 支持横…...

Objective-C方法的声明实现及调用

1.无参数的方法 1)声明 a.位置&#xff1a;在interface括弧的外面 b.语法&#xff1a; - (返回值类型)方法名称; interface Person : NSObject -(void) run; end 2)实现 a.位置&#xff1a;在implementation中实现 b.语法&#xff1a;加大括弧将方法实现的代码写在大括孤之中 …...

第十四届蓝桥杯国赛 C++ B 组 C 题——班级活动(AC)

目录 1. 班级活动1. 问题描述2. 输入格式3. 输出格式4. 样例输入5. 样例输出6. 样例说明7. 评测用例规模与约定8. 原题链接 2. 解题思路3. AC_Code 1. 班级活动 前置知识点&#xff1a;思维&#xff0c;分类讨论 1. 问题描述 小明的老师准备组织一次班级活动。班上一共有 n…...

GraphQL的力量:简化复杂数据查询

1. GraphQL GraphQL 是一种由 Facebook 开发并于 2015 年公开发布的数据查询和操作语言&#xff0c;也是运行在服务端的运行时&#xff08;runtime&#xff09;用于处理 API 查询的一种规范。不同于传统的 REST API&#xff0c;GraphQL 允许客户端明确指定它们需要哪些数据&am…...

python环境安装sklearn及报错解决

安装 如刚开始安装&#xff0c;还未遇到问题请直接从重新安装库开始看&#xff0c;如果遇到报错&#xff0c;从问题开始看 问题 python安装sklearn报错 &#xff0c;报错信息如下 File "<stdin>", line 1pip install scikit-learn^ SyntaxError: invalid s…...

log4j:WARN Please initialize the log4j system properly的解决办法

背景&#xff1a;很多次创建新项目log4j都出现以下2个警告&#xff1a; log4j:WARN No appenders could be found for logger (org.springframework.boot.ApplicationServletEnvironment).log4j:WARN Please initialize the log4j system properly 网上查询都是在说缺少以下jar…...

虹科分享丨汽车技术的未来:Netropy如何测试和确保汽车以太网的性能

来源&#xff1a;艾特保IT 虹科分享丨汽车技术的未来&#xff1a;Netropy如何测试和确保汽车以太网的性能 原文链接&#xff1a;https://mp.weixin.qq.com/s/G8wihrzqpJJOx5i0o63fkA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #汽车以太网 #车载网络 #Netropy …...

代码CE:reference to ‘XX‘ is ambiguous

代码CE:reference to ‘XX’ is ambiguous 今天提交代码的时候一直错误&#xff0c;CE&#xff0c;搞不明白明明在dev上成功&#xff0c;为什么提交失败。 现在懂了&#xff0c;因为定义的变量和C内部函数或变量重名了。修改之后即可AC。 int data[21][21]{0}; int maxsum[21…...

如果想将企业微信的组织架构同步到内部知识库咋搞?方法来也!

在现代企业的运营中&#xff0c;内部知识库不仅储存了公司的宝贵知识资产&#xff0c;还充当着员工信息共享和协作的核心平台。为了保障知识库的效能最大化&#xff0c;使其成为支持决策、创新和培训的强大工具&#xff0c;企业必须拥有一套周到的权限管理机制。对此&#xff0…...

【c语言】扫雷

前言&#xff1a; 扫雷是一款经典的单人益智游戏&#xff0c;它的目标是在一个方格矩阵中找出所有的地雷&#xff0c;而不触碰到任何一颗地雷。在计算机编程领域&#xff0c;扫雷也是一个非常受欢迎的项目&#xff0c;因为它涉及到许多重要的编程概念&#xff0c;如数组、循环…...

自然语言处理的崛起:从初步分析到深度理解

自然语言处理&#xff08;NLP&#xff09;是计算机科学、人工智能和语言学的交叉领域&#xff0c;旨在让计算机能够理解和生成人类语言。随着时间的推移&#xff0c;NLP 经历了一系列革命性的变化&#xff0c;从简单的规则和模式匹配到如今的深度学习模型&#xff0c;它们使计算…...

Git学习笔记:版本回滚

文章目录 回到过去&#xff1a;开启新时间线&#xff0c;时间分叉路口1. 回溯开发2. 临时恢复特性3. 实验性开发4. 分支维护和发布5. 调试历史问题类比推理&#xff1a; 方法&#xff1a;1. 临时查看旧版本2. 永久回滚到旧版本3. 创建新的分支指向旧版本 回到过去&#xff1a;开…...

OpenCV图像的基本操作

图像的基本操作&#xff08;Python&#xff09; 素材图 P1&#xff1a;die.jpg P2&#xff1a;cool.jpg V&#xff1a;rabbit.mp4&#xff0c; 下载地址 读取展示-图像 import cv2img_1 cv2.imread(./die.jpg) # default cv2.IMREAD_COLOR print("die.jpg shape(imre…...

小白水平理解面试经典题目LeetCode 594 Longest Harmonious Subsequence(最大和谐字符串)

594 最大和谐字符串 这道题属于字符串类型题目&#xff0c;解决的办法还是有很多的&#xff0c;暴力算法&#xff0c;二分法&#xff0c;双指针等等。 题目描述 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在&#xff0c;给你一个整数数组 nums …...

Vue-35、Vue中使用ref属性

1、ref属性 2、代码 <template><div id"app"> <!-- <img alt"Vue logo" src"./assets/logo.png">--><h1 v-text"msg" ref"title"></h1><button click"showDOM" ref&…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...