一、来源
本次分析与二次开发的超市零售系统项目名称为 "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
// 存储销售记录的容器
std::vector
// 添加商品函数
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.逆向软件工程的一些思考:通过对超市零售系统的逆向分析与二次开发,深刻体会到逆向工程是理解现有系统架构和功能的有效手段。在分析原代码时,需要梳理代码结构、函数调用关系等,这有助于准确找出系统的缺陷和可改进之处。在二次开发过程中,要充分尊重原有的设计思路,合理地进行功能扩展和优化,以保证系统的稳定性和可维护性。同时,引入新的技术和方法,如数据持久化,需要充分考虑与原系统的兼容性,避免出现冲突和错误。