🏆本文收录于「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电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿哇。