C++ 超市零售系统二次开发

news/2025/2/27 0:04:25/文章来源:https://www.cnblogs.com/syy4001930/p/18740078

一、来源
本次分析与二次开发的超市零售系统项目名称为 "SimpleSupermarketManagement", 作者是 GitHub 用户 "CodeExplorer1995",项目地址为https://github.com/CodeExplorer1995/SimpleSupermarketManagement。该项目旨在为小型超市提供基础的业务管理能力,采用 C++ 语言编写,通过控制台进行交互操作,具备商品信息管理、销售记录管理等核心功能,为学习 C++ 编程和了解零售系统业务逻辑的开发者提供了一个不错的实践案例。通过研读该项目代码,能深入学习到 C++ 在数据结构定义、文件操作以及基本业务流程实现等方面的应用技巧 。
二、运行环境 + 运行结果的截图
运行环境:Windows 10 系统,Visual Studio 2022。

include

include

include

// 商品结构体
struct Product {
int id;
std::string name;
double price;
int quantity;
};

// 销售记录结构体
struct SaleRecord {
int productId;
int quantitySold;
double totalPrice;
};

// 存储商品信息的容器
std::vector products;
// 存储销售记录的容器
std::vector saleRecords;

// 添加商品函数
void addProduct() {
Product p;
std::cout << "请输入商品ID: ";
std::cin >> p.id;
std::cout << "请输入商品名称: ";
std::cin.ignore();
std::getline(std::cin, p.name);
std::cout << "请输入商品价格: ";
std::cin >> p.price;
std::cout << "请输入商品库存数量: ";
std::cin >> p.quantity;
products.push_back(p);
}

// 查询商品信息函数
void queryProduct() {
int id;
std::cout << "请输入要查询的商品ID: ";
std::cin >> id;
for (const auto& p : products) {
if (p.id == id) {
std::cout << "商品名称: " << p.name << ", 价格: " << p.price << ", 库存数量: " << p.quantity << std::endl;
return;
}
}
std::cout << "未找到该商品信息" << std::endl;
}

// 记录销售函数
void recordSale() {
SaleRecord record;
int productId, quantity;
std::cout << "请输入销售的商品ID: ";
std::cin >> productId;
std::cout << "请输入销售数量: ";
std::cin >> quantity;
for (auto& p : products) {
if (p.id == productId) {
if (p.quantity >= quantity) {
p.quantity -= quantity;
record.productId = productId;
record.quantitySold = quantity;
record.totalPrice = quantity * p.price;
saleRecords.push_back(record);
std::cout << "销售记录已保存" << std::endl;
} else {
std::cout << "库存不足" << std::endl;
}
return;
}
}
std::cout << "未找到该商品信息" << std::endl;
}

int main() {
int choice;
while (true) {
std::cout << "1. 添加商品" << endl;
std::cout << "2. 查询商品信息" << endl;
std::cout << "3. 记录销售" << endl;
std::cout << "4. 退出" << endl;
std::cout << "请选择: ";
std::cin >> choice;
if (choice == 1) {
addProduct();
} else if (choice == 2) {
queryProduct();
} else if (choice == 3) {
recordSale();
} else if (choice == 4) {
break;
} else {
std::cout << "无效选择,请重新输入" << std::endl;
}
}
return 0;
}

三、主要问题列表及改进措施
1.数据存储问题:原系统的数据仅存储在内存中,程序关闭后数据丢失。
改善措施:使用文件读写操作,将商品信息和销售记录存储到文件中,程序启动时读取文件数据。

2.功能不完善:缺乏库存预警功能,无法及时提醒管理人员补充商品库存。
改进:添加库存预警功能,当商品库存低于设定阈值时,给出提示信息。
四、新代码附上
数据持久化相关代码
// 保存商品信息到文件
void saveProductsToFile() {
FILE* file = fopen("products.txt", "w");
if (file) {
for (const auto& p : products) {
fprintf(file, "%d %s %.2f %d\n", p.id, p.name.c_str(), p.price, p.quantity);
}
fclose(file);
}
}

// 从文件读取商品信息
void loadProductsFromFile() {
FILE* file = fopen("products.txt", "r");
if (file) {
Product p;
while (fscanf(file, "%d %s %lf %d", &p.id, p.name.data(), &p.price, &p.quantity)!= EOF) {
products.push_back(p);
}
fclose(file);
}
}

// 保存销售记录到文件
void saveSaleRecordsToFile() {
FILE* file = fopen("sale_records.txt", "w");
if (file) {
for (const auto& r : saleRecords) {
fprintf(file, "%d %d %.2f\n", r.productId, r.quantitySold, r.totalPrice);
}
fclose(file);
}
}

// 从文件读取销售记录
void loadSaleRecordsFromFile() {
FILE* file = fopen("sale_records.txt", "r");
if (file) {
SaleRecord r;
while (fscanf(file, "%d %d %lf", &r.productId, &r.quantitySold, &r.totalPrice)!= EOF) {
saleRecords.push_back(r);
}
fclose(file);
}
}
库存预警相关代码
// 检查库存预警
void checkStockWarning() {
int warningThreshold = 10; // 设定库存预警阈值为10
for (const auto& p : products) {
if (p.quantity < warningThreshold) {
std::cout << "库存预警: 商品 " << p.name << " 的库存仅剩 " << p.quantity << " 件" << std::endl;
}
}
}
五、重构的软件的测试截图

六、总结
1.花时间比较久的:数据持久化部分,文件读写格式的设计和异常处理花费了较多时间。要确保数据的正确存储和读取,同时处理文件不存在、读写错误等情况。此外,在实现库存预警功能时,如何合理设定预警阈值,并将预警功能融入到原有的业务逻辑中,也经过了多次测试和优化。
2.逆向软件工程的一些思考:通过对超市零售系统的逆向分析与二次开发,深刻体会到逆向工程是理解现有系统架构和功能的有效手段。在分析原代码时,需要梳理代码结构、函数调用关系等,这有助于准确找出系统的缺陷和可改进之处。在二次开发过程中,要充分尊重原有的设计思路,合理地进行功能扩展和优化,以保证系统的稳定性和可维护性。同时,引入新的技术和方法,如数据持久化,需要充分考虑与原系统的兼容性,避免出现冲突和错误。

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

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

相关文章

IOC 和 DI 详解及其简单用法

1. IOC 详解 1.1 Bean 的声明 IOC 控制反转,就是将对象的控制权交给 Spring 的 IOC 容器,由 IOC 容器创建及管理对象。IOC 容器创建的对象称为 bean 对象。 而 Spring 框架为了更好的标识 Web 应用程序开发当中,bean 对象到底归属于哪一层,又提供了 @Component 的衍生注解:…

开源一款DDS信号发生扩展板-FreakStudio多米诺系列

信号发生扩展板通过SPI接口生成可调频率和幅度的正弦波、方波和三角波,频率小于1MHz。支持幅度调节,提供原始和6倍放大输出接口。配备5阶低通滤波器、噪声抑制功能,优化信号稳定性。原文链接: FreakStudio的博客 摘要 信号发生扩展板通过SPI接口生成可调频率和幅度的正弦波…

Windows系统更改/迁移用户目录

Windows系统更改/迁移用户目录Windows系统更改/迁移用户目录 迁移的原因C盘空间不足 不想将我的文档等放在C盘,方便重做系统 其他原因迁移有什么风险么目前没发现有什么风险迁移过程 准备工作 更改/迁移用户目录之前先自行备份当前用户的资料(下载目录、桌面文件等),以免数…

[2025.2.26 JavaWeb学习]登录校验

流程图会话技术指浏览器与服务器的一次连接,直到某一方断开,某个浏览器的一次会话可以包含多次请求和响应会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据

cmcc_simplerop

打开ida查看,可以看到是静态编译,所以无法常规用ret2libc此时可以用最简单的方法系统调用 首先ida上面的偏移量是错误的,我们手动用gdb算一下距离ebp为0x1c因为要实现execve("/bin/sh",0,0)找int 0x80,eax,ebx,ecx,edx因为程序里面没有binsh或sh,所以我们得手动…

day4复健-字符串

题目练习:反转字符串 知识学习: StringBuilder:内容可变的字符串容器StringJoiner练习: 阿拉伯数字转换为罗马数字练习2:练习3:

软件开发与创新——万年历功能新增与代码优化

一、项目名称与来源 上海海洋大学C语言期末大作业 二、原项目运行 运行环境: 系统:Windows11 24H2 cpu:i7-10750H 编译器:Dev c++ 5.11 运行结果:点击查看代码 #include <stdio.h> #include <stdlib.h>// 定义每个月的天数,第一行为平年,第二行为闰年 int d…

逆向软件设计和开发---学生信息管理程序

一、来源 源代码来自同学大一上学期C语言大作业 二、运行环境 Dev-C++ 6.3 三、源代码及运行结果 1.源代码点击查看代码 #include <stdio.h> #include <stdlib.h> #include <string.h>#define MAX_NAME_LENGTH 20 #define MAX_SCORE_COUNT 5// 学生信息结构体…

在鹅厂做java开发是什么体验

离职已有好几个月,准备写一篇关于之前在腾讯做Java开发的经历,现在来谈谈在Java领域里,在腾讯做Java开发的体验。随便写写别较真。首先,介绍一下腾讯里与Java相关的部门。主要有CDG(云与智慧产业事业群)中的腾讯广告和FIT(金融科技事业群)理财通。其他部门则包括TEG中的…

软件二次开发

软件来源:舍友期末大作业 软件运行环境:dev C++ 软件运行图: 软件伸缩代码图: 问题:菜单只会出现一次,在多次操作之后菜单会被顶走,届时用户只能依照记忆操作系统 更改的代码: 在循环执行选项的代码部分增加了菜单的输出 更改后的代码运行:

换根dp

概念 换根 \(dp\) ,又被称为二次扫描,是属于树形 \(dp\) 的一类但比一般树形dp更难。 特点通常是没有指定根结点,且根结点的变化会对一些值产生影响。通常需要两次 \(dfs\) ,第一次 \(dfs\) 预处理信息,第二次 \(dfs\) 开始换根动态规划。求解的答案通常需要结合所有相连的…

千锋教育MyBatisPlus全套课程,简单快速一套精通MyBatisPlus框架(代码生成器_引入_使用)

https://www.bilibili.com/video/BV1aa4y1A7iN?spm_id_from=333.788.videopod.episodes&vd_source=0d7b1712ce42c1a2fa54bb4e1d601d78代码生成器_引入_使用 https://github.com/godmaybelieve