如何设计一个C++程序来模拟超市收银系统?

🏆本文收录于「Bug调优」专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

问题描述

  设计c++程序模拟超市收银系统。要求由收银员输入顾客的会员卡卡号(若有卡)、 所购商品的货号等。从文件中取出有关价格信息,再把这些信息返回给收银台。同时把 该收银台的销售总量和有关种类商品的剩余量以及该持卡顾客的消费情况交文件存储以供查询。另外,对没有卡的消费情况不记录该顾客的消费情况等个人信息。如果一个 未持卡顾客一次性购物满 200 元,可为其发放一张会员卡,以后在该商场购物可获得 9 折优惠。

如上问题有来自我自身项目开发,有的收集网站,有的来自读者,如有侵权,立马删除。

解决方案

  如下是上述问题的解决方案,仅供参考:

  设计一个C++程序来模拟超市收银系统需要考虑多个组件和功能。以下是一个简化版本的设计概述和伪代码,以帮助你开始实现这个系统:

1. 数据结构设计

首先,定义所需的数据结构,如会员卡信息、商品信息、交易记录等。

struct Product {string id;double price;int stock;
};struct Member {string cardNumber;double discount;map<string, int> purchaseHistory;
};struct Transaction {string cardNumber;map<string, int> items; // 商品ID和数量double totalAmount;
};

2. 文件操作

实现从文件读取商品信息和保存交易记录的功能。

void loadProducts(vector<Product>& products, const string& filename);
void saveTransaction(const Transaction& transaction, const string& filename);

3. 收银流程

实现收银员输入流程,包括会员卡号输入、商品选择、价格计算等。

void checkout流程(/* 参数 */);

4. 会员卡管理

实现会员卡的发放和会员折扣计算。

void issueMemberCard(Member& member);
double calculateDiscountedPrice(double price, Member& member);

5. 主函数

实现程序的主入口,包括用户交互和调用上述函数。

int main() {// 初始化商品信息vector<Product> products;loadProducts(products, "products.txt");// 模拟收银流程checkout流程(/* 参数 */);// 保存交易记录// saveTransaction(/* 交易记录 */, "transactions.txt");return 0;
}

6. 伪代码实现

以下是一些关键函数的伪代码实现:

void loadProducts(vector<Product>& products, const string& filename) {// 从文件中读取商品信息并填充到products中
}void saveTransaction(const Transaction& transaction, const string& filename) {// 将交易记录写入文件
}void checkout流程(/* 参数 */) {string cardNumber;cout << "请输入会员卡号(若无则跳过):";getline(cin, cardNumber);Member member;if (!cardNumber.empty()) {// 检查会员卡号是否存在// 如果存在,加载会员信息}Transaction transaction;double totalAmount = 0;while (true) {string productId;int quantity;cout << "请输入商品ID(输入'end'结束):";cin >> productId;if (productId == "end") break;// 检查商品ID是否有效// 更新商品库存// 计算总价transaction.items[productId] = quantity;totalAmount += getProductPrice(productId) * quantity;}if (!cardNumber.empty()) {totalAmount = calculateDiscountedPrice(totalAmount, member);member.purchaseHistory[transaction.items]++; // 更新购买历史} else if (totalAmount >= 200) {issueMemberCard(member);totalAmount = calculateDiscountedPrice(totalAmount, member);}transaction.cardNumber = member.cardNumber;transaction.totalAmount = totalAmount;saveTransaction(transaction, "transactions.txt");// 更新商品库存信息到文件
}void issueMemberCard(Member& member) {// 发放会员卡并设置9折优惠
}double calculateDiscountedPrice(double price, Member& member) {return price * (1 - member.discount);
}

注意事项

  • 确保在实际代码中处理所有可能的异常情况,如文件读写错误、无效的输入等。
  • 为了简化,上述伪代码没有包括所有的功能实现,你需要根据具体需求进一步完善。
  • 考虑到性能和可扩展性,可能需要使用数据库来管理大量的商品和交易数据。

  这个设计提供了一个基本的框架,你可以根据自己的需求进行调整和扩展。

完整代码示例

#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>using namespace std;// 商品信息结构体
struct Product {int id;         // 商品货号string name;    // 商品名称double price;   // 商品价格int quantity;   // 商品库存
};// 会员信息结构体
struct Member {int cardNumber;     // 会员卡号double totalSpent; // 累计消费金额
};// 函数声明
void displayMenu();
void loadProducts(Product products[], int& productCount);
void saveProducts(Product products[], int productCount);
void loadMembers(Member members[], int& memberCount);
void saveMembers(Member members[], int memberCount);
int findProduct(Product products[], int productCount, int productId);
int findMember(Member members[], int memberCount, int cardNumber);
void checkout();
void generateCardNumber(int& cardNumber);// 全局变量
const int MAX_PRODUCTS = 100;  // 最大商品数量
const int MAX_MEMBERS = 100;   // 最大会员数量
const string PRODUCTS_FILE = "products.txt"; // 商品信息文件
const string MEMBERS_FILE = "members.txt";   // 会员信息文件int main() {Product products[MAX_PRODUCTS];int productCount = 0;Member members[MAX_MEMBERS];int memberCount = 0;// 加载商品和会员信息loadProducts(products, productCount);loadMembers(members, memberCount);int choice;do {displayMenu();cout << "请输入您的选择: ";cin >> choice;switch (choice) {case 1:checkout();break;case 2:// 其他功能,例如查询商品信息、会员信息等,可自行添加break;case 0:cout << "退出系统,谢谢使用!" << endl;break;default:cout << "输入错误,请重新输入!" << endl;}} while (choice != 0);// 保存商品和会员信息saveProducts(products, productCount);saveMembers(members, memberCount);return 0;
}// 显示菜单
void displayMenu() {cout << "\n-----------------------" << endl;cout << " 超市收银系统" << endl;cout << "-----------------------" << endl;cout << " 1. 开始收银" << endl;cout << " 2. 其他功能" << endl;cout << " 0. 退出系统" << endl;cout << "-----------------------" << endl;
}// 加载商品信息
void loadProducts(Product products[], int& productCount) {ifstream infile(PRODUCTS_FILE);if (infile.is_open()) {while (!infile.eof()) {infile >> products[productCount].id >> products[productCount].name >> products[productCount].price >> products[productCount].quantity;productCount++;}infile.close();}
}// 保存商品信息
void saveProducts(Product products[], int productCount) {ofstream outfile(PRODUCTS_FILE);if (outfile.is_open()) {for (int i = 0; i < productCount; i++) {outfile << products[i].id << " "<< products[i].name << " "<< products[i].price << " "<< products[i].quantity << endl;}outfile.close();}
}// 加载会员信息
void loadMembers(Member members[], int& memberCount) {ifstream infile(MEMBERS_FILE);if (infile.is_open()) {while (!infile.eof()) {infile >> members[memberCount].cardNumber>> members[memberCount].totalSpent;memberCount++;}infile.close();}
}// 保存会员信息
void saveMembers(Member members[], int memberCount) {ofstream outfile(MEMBERS_FILE);if (outfile.is_open()) {for (int i = 0; i < memberCount; i++) {outfile << members[i].cardNumber << " "<< members[i].totalSpent << endl;}outfile.close();}
}// 查找商品
int findProduct(Product products[], int productCount, int productId) {for (int i = 0; i < productCount; i++) {if (products[i].id == productId) {return i;}}return -1;
}// 查找会员
int findMember(Member members[], int memberCount, int cardNumber) {for (int i = 0; i < memberCount; i++) {if (members[i].cardNumber == cardNumber) {return i;}}return -1;
}// 收银
void checkout() {Product products[MAX_PRODUCTS];int productCount = 0;Member members[MAX_MEMBERS];int memberCount = 0;// 加载商品和会员信息loadProducts(products, productCount);loadMembers(members, memberCount);int cardNumber = 0;char hasCard;double totalAmount = 0;cout << "\n--- 开始收银 ---" << endl;cout << "是否有会员卡?(Y/N): ";cin >> hasCard;if (toupper(hasCard) == 'Y') {cout << "请输入会员卡号: ";cin >> cardNumber;}int productId, quantity;do {cout << "请输入商品货号 (输入 0 结束): ";cin >> productId;if (productId == 0) {break;}int productIndex = findProduct(products, productCount, productId);if (productIndex == -1) {cout << "商品不存在!" << endl;continue;}cout << "请输入商品数量: ";cin >> quantity;if (quantity > products[productIndex].quantity) {cout << "库存不足!" << endl;continue;}// 计算总价totalAmount += products[productIndex].price * quantity;// 更新库存products[productIndex].quantity -= quantity;cout << "已添加商品:" << products[productIndex].name << " x " << quantity << endl;} while (productId != 0);cout << fixed << setprecision(2);cout << "\n总计: ¥" << totalAmount << endl;// 处理会员if (cardNumber != 0) {int memberIndex = findMember(members, memberCount, cardNumber);if (memberIndex != -1) {// 会员享受折扣totalAmount *= 0.9;cout << "会员折扣: 10%" << endl;cout << "折后金额: ¥" << totalAmount << endl;// 更新会员累计消费金额members[memberIndex].totalSpent += totalAmount;} else {cout << "无效的会员卡号!" << endl;}} else if (totalAmount >= 200) {// 未持卡顾客满 200 元,发放会员卡char applyCard;cout << "您本次消费满 200 元,是否办理会员卡?(Y/N): ";cin >> applyCard;if (toupper(applyCard) == 'Y') {generateCardNumber(cardNumber);Member newMember;newMember.cardNumber = cardNumber;newMember.totalSpent = totalAmount;members[memberCount++] = newMember;cout << "恭喜您成为会员,您的会员卡号为: " << cardNumber << endl;}}// 保存商品和会员信息saveProducts(products, productCount);saveMembers(members, memberCount);cout << "\n--- 收银完成 ---" << endl;
}// 生成会员卡号
void generateCardNumber(int& cardNumber) {// 简单生成一个随机的 6 位数srand(time(0));cardNumber = rand() % 900000 + 100000;
}

  希望如上措施及解决方案能够帮到有需要的你。

  PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

  若有对当前Bug有与如下提供的方法不一致,有个不情之请,希望你能把你的新思路或新方法分享到评论区,一起学习,目的就是帮助更多所需要的同学,正所谓「赠人玫瑰,手留余香」。

☀️写在最后

  ok,以上就是我这期的Bug修复内容啦,如果还想查找更多解决方案,你可以看看我专门收集Bug及提供解决方案的专栏「Bug调优」,都是实战中碰到的Bug,希望对你有所帮助。到此,咱们下期拜拜。

码字不易,如果这篇文章对你有所帮助,帮忙给bug菌来个一键三连(关注、点赞、收藏) ,您的支持就是我坚持写作分享知识点传播技术的最大动力。

同时也推荐大家关注我的硬核公众号:「猿圈奇妙屋」 ;以第一手学习bug菌的首发干货,不仅能学习更多技术硬货,还可白嫖最新BAT大厂面试真题、4000G Pdf技术书籍、万份简历/PPT模板、技术文章Markdown文档等海量资料,你想要的我都有!

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。


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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

vue 中 使用腾讯地图 (动态引用腾讯地图及使用签名验证)

在设置定位的时候使用 腾讯地图 选择地址 在 mounted中引入腾讯地图&#xff1a; this.website.mapKey 为地图的 key // 异步加载腾讯地图APIconst script document.createElement(script);script.type text/javascript;script.src https://map.qq.com/api/js?v2.exp&…

昇思25天学习打卡营第17天|GAN图像生成

模型简介 GAN模型的核心在于提出了通过对抗过程来估计生成模型这一全新框架。在这个框架中&#xff0c;将会同时训练两个模型——捕捉数据分布的生成模型G和估计样本是否来自训练数据的判别模型D 。 在训练过程中&#xff0c;生成器会不断尝试通过生成更好的假图像来骗过判别…

昇思25天学习打卡营第8天|MindSpore保存与加载(保存和加载MindIR)

在MindIR中&#xff0c;一个函数图&#xff08;FuncGraph&#xff09;表示一个普通函数的定义&#xff0c;函数图一般由ParameterNode、ValueNode和CNode组成有向无环图&#xff0c;可以清晰地表达出从参数到返回值的计算过程。在上图中可以看出&#xff0c;python代码中两个函…

Python面试宝典第6题:有效的括号

题目 给定一个只包括 (、)、{、}、[、] 这些字符的字符串&#xff0c;判断该字符串是否有效。有效字符串需要满足以下的条件。 1、左括号必须用相同类型的右括号闭合。 2、左括号必须以正确的顺序闭合。 3、每个右括号都有一个对应的相同类型的左括号。 注意&#xff1a;空字符…

搞了个 WEB 串口终端,简单分享下

每次换电脑总要找各种串口终端软件&#xff0c;很烦。 有的软件要付费&#xff0c;有的软件要注册&#xff0c;很烦。 找到免费的&#xff0c;还得先下载下来&#xff0c;很烦。 开源的软件下载速度不稳定&#xff0c;很烦。 公司电脑有监控还得让 IT 同事来安装&#xff0…

后端之路——最规范、便捷的spring boot工程配置

一、参数配置化 上一篇我们学了阿里云OSS的使用&#xff0c;那么我们为了方便使用OSS来上传文件&#xff0c;就创建了一个【util】类&#xff0c;里面有一个【AliOSSUtils】类&#xff0c;虽然本人觉得没啥不方便的&#xff0c;但是黑马视频又说这样还是存在不便维护和管理问题…

生态系统NPP及碳源、碳汇模拟技术教程

原文链接&#xff1a;生态系统NPP及碳源、碳汇模拟技术教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608293&idx3&sn2604c5c4e061b4f15bb8aa81cf6dadd1&chksmfa826602cdf5ef145c4d170bed2e803cd71266626d6a6818c167e8af0da93557c1288da21a71&a…

FPGA问题

fpga 问题 ep2c5t144 开发板 第一道坎&#xff0c;安装软件&#xff1b;没有注册&#xff0c;无法产生sop文件&#xff0c;无法下载 没有相应的库的quartus ii版本&#xff0c;需要另下载 第二道坎&#xff0c;模拟器的下载&#xff0c;安装&#xff1b; 第三道&#xff0c;v…

在window上搭建docker

1、打开Hyper-V安装 在地址栏输入控制面板&#xff0c;然后回车 勾选Hyper-V安装&#xff0c;如果没有找到Hyper-V&#xff0c;那么请走第2步 2、如果没有Hyper-V(可选&#xff09;第一步无法打开 家庭版本需要开启Hyper-V 创建一个文本文档&#xff0c;后缀名称为.bat.名称…

油猴Safari浏览器插件:Tampermonkey for Mac 下载

Tampermonkey 是一个强大的浏览器扩展&#xff0c;用于运行用户脚本&#xff0c;这些脚本可以自定义和增强网页的功能。它允许用户在网页上执行各种自动化任务&#xff0c;比如自动填写表单、移除广告、改变页面布局等。适用浏览器&#xff1a; Tampermonkey 适用于多数主流浏览…

第二周:计算机网络概述(下)

一、计算机网络性能指标&#xff08;速率、带宽、延迟&#xff09; 1、速率 2、带宽 3、延迟/时延 前面讲分组交换的时候介绍了&#xff0c;有一种延迟叫“传输延迟”&#xff0c;即发送一个报文&#xff0c;从第一个分组的发送&#xff0c;到最后一个分组的发送完成的这段时…

PyQT: 开发一款ROI绘制小程序

在一些基于图像或者视频流的应用中&#xff0c;比如电子围栏/客流统计等&#xff0c;我们需要手动绘制一些感兴趣&#xff08;Region of Interest&#xff0c;简称ROI&#xff09;区域。 在这里&#xff0c;我们基于Python和PyQt5框架开发了一款桌面应用程序&#xff0c;允许用…

Renesas R7FA8D1BH (Cortex®-M85)串口应用总结

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 FSP和KEIL配置串口 2.1 配置参数 2.2 生成基于Keil的软件架构 3 FSP代码 3.1 FSP中UART接口函数 3.2 案例代码介绍 3.3 案例代码存在的问题 4 UART代码实现 4.1 功能函数介绍 4.2 完整…

如何在Qt使用uchardet库

如何在 Qt 中使用 uchardet 库 文章目录 如何在 Qt 中使用 uchardet 库一、简介二、uchardet库的下载三、在Qt中直接调用四、编译成库文件后调用4.1 编译工具下载4.2 uchardet源码编译4.3 测试编译文件4.4 Qt中使用 五、一些小问题5.1 测试文件存在的问题5.2 uchardet库相关 六…

嵌入式学习——硬件(UART)——day55

1. UART 1.1 定义 UART&#xff08;Universal Asynchronous Receiver/Transmitter&#xff0c;通用异步收发器&#xff09;是一种用于串行通信的硬件设备或模块。它的主要功能是将数据在串行和并行格式之间进行转换。UART通常用于计算机与外围设备或嵌入式系统之间的数据传输。…

【Linux系统编程】深入剖析:四大IO模型机制与应用(阻塞、非阻塞、多路复用、信号驱动IO 全解读)

目录 概述&#xff1a; 1. 阻塞IO (Blocking IO) 2. 非阻塞IO (Non-blocking IO) 3. IO多路复用 (I/O Multiplexing) 4. 信号驱动IO (Signal-driven IO) 阻塞式IO 非阻塞式IO 信号驱动IO&#xff08;Signal-driven IO&#xff09; 信号IO实例&#xff1a; IO多路复用…

nginx 搭理禅道

1.安装nginx。 2.安装禅道。 3.nginx 配置文件 location /zentao/ { proxy_pass http://192.168.100.66/zentao/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-F…

Labview_Workers5.0 学习笔记

1.Local Request 个人理解该类型的请求针对自身的&#xff0c;由EHL或者MHL到该vi的MHL中。 使用快速放置快捷键"Ctrl9"创建方法如下&#xff1a; 创建后的API接口命名均为rql开头&#xff0c;并且在所选main.vi中的MHL创建对应的条件分支。 此时使用该API函数就…

巴图自动化PN转Modbus RTU协议转换网关模块快速配置

工业领域中常用的通讯协议有&#xff1a;Profinet协议&#xff0c;Modbus协议&#xff0c;ModbusTCP协议&#xff0c;Profibus协议&#xff0c;Profibus DP协议&#xff0c;EtherCAT协议&#xff0c;EtherNET协议&#xff0c;CAN&#xff0c;CanOpen等&#xff0c;它们在自动化…