二次开发(第一周作业)

news/2025/2/26 20:09:08/文章来源:https://www.cnblogs.com/tqc135/p/18734869

(1) 来源

C++ 大作业 超市收银系统 - shugen - 博客园
该文章介绍了一个软件的实现过程,并提供了相关代码。通过对该软件的分析对其进行了改进和二次开发。

(2) 运行环境+运行结果的截图(伸缩代码附上)

操作系统:Windows 11
开发工具:Dev-c++
编程语言:C++
运行结果截图:


(3)主要问题列表,针对问题要了改善或者重构

  1. 代码结构优化:将代码拆分成更小的模块,增强可读性和可维护性。
  2. 数据存储改进:使用更高效的数据结构,如std::map或std::unordered_map,替代文件存储。
  3. 功能增强:增加错误处理机制,优化用户交互体验。
  4. 性能优化:减少不必要的文件读写操作,提升系统响应速度。
  5. 代码风格改进:统一代码风格,增强代码的可读性。

(4)新代码附上(只要你自己改进的地方)

  1. 商品信息存储和管理

class Product {
private:
double price;
string name;
long number;

public:
static unordered_map<long, Product> products;

void addproduct() {
long pnumber;
cout << "请输入商品条形码: ";
cin >> pnumber;

if (products.find(pnumber) != products.end()) {
cout << "该商品已存在,请重新选择!" << endl;
return;
}

cout << "请输入商品价格: ";
cin >> price;
cout << "请输入商品名: ";
cin >> name;

products[pnumber] = *this;
cout << "保存商品成功!" << endl;
}
};
unordered_map<long, Product> Product::products;

  1. 商品信息查找
    void Product::search() {
    long pnumber;
    cout << "请输入商品条形码: ";
    cin >> pnumber;

if (products.find(pnumber) == products.end()) {
cout << "未找到该商品,请核对!" << endl;
return;
}

cout << "该商品存在,详情如下:" << endl;
cout << "商品条形码: " << pnumber << endl;
cout << "商品名: " << products[pnumber].name << endl;
cout << "商品价格: " << products[pnumber].price << endl;
}

  1. 商品信息删除
    void Product::del() {
    long pnumber;
    cout << "请输入商品条形码: ";
    cin >> pnumber;

if (products.find(pnumber) == products.end()) {
cout << "该商品不存在,请核对!" << endl;
return;
}

products.erase(pnumber);
cout << "删除成功!" << endl;
}

  1. 性能优化:减少文件操作
    void loadProducts() {
    ifstream infile("products.txt");
    if (!infile) return;

long pnumber;
string name;
double price;

while (infile >> pnumber >> name >> price) {
Product product;
product.name = name;
product.price = price;
products[pnumber] = product;
}
}

void saveProducts() {
ofstream outfile("products.txt");
for (auto& [pnumber, product] : products) {
outfile << pnumber << " " << product.name << " " << product.price << endl;
}
}

(5)重构的软件的测试截图

(6)总结:难点、花时间比较久的、逆向软件工程的一些思考

  1. 难点
    数据结构的切换与适配:从文件存储改为基于内存的 unordered_map 存储,需要重新设计数据的加载、保存和访问逻辑。这不仅涉及到代码的重构,还需要确保数据的完整性和一致性,尤其是在程序启动和退出时。
    用户交互的统一性:原代码中用户交互提示信息格式不统一,改进时需要重新设计提示信息的风格和格式,同时确保其简洁性和易用性。这需要对用户交互设计有一定的理解。
    性能优化与内存管理:将数据存储在内存中可以显著提升性能,但也增加了内存管理的复杂性。如何在内存和磁盘之间高效地同步数据,同时避免数据丢失,是一个关键问题。
  2. 花时间比较久的
    代码重构:将原有的基于文件操作的代码逻辑重构为基于内存的数据结构,需要逐行分析原代码的功能,并重新设计新的实现方式。这一过程需要仔细测试,以确保功能的正确性。
    数据持久化机制的设计:改进后的代码需要在程序启动时加载数据,并在退出时保存数据。设计高效且可靠的加载和保存机制(如 loadProducts() 和 saveProducts())花费了较多时间,尤其是处理文件格式和异常情况。
    用户交互优化:统一用户交互提示信息看似简单,但需要考虑用户体验和国际化支持。重新设计提示信息并替换原有代码中的提示信息,需要对代码进行全局扫描和修改,这一过程较为繁琐。
  3. 逆向软件工程的思考
    理解原代码的逻辑和意图:在改进代码之前,需要深入理解原代码的设计思路和功能实现。通过逆向分析,找出原代码的不足之处(如频繁的文件操作、不统一的用户交互等),并确定改进方向。
    平衡功能与性能:改进过程中需要在功能完整性和性能优化之间找到平衡。例如,虽然内存存储提高了性能,但也需要考虑数据的持久化和内存占用问题。这种权衡需要根据实际需求进行设计。
    模块化与可维护性:通过将商品信息的存储、查找和删除等功能分离到不同的方法中,并引入 unordered_map 数据结构,代码的模块化和可维护性得到了显著提升。这种改进思路体现了逆向软件工程中对代码结构优化的重视。

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

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

相关文章

iconfont本地引入

本地引入iconfont的好处 Butterfly主题自带的Font Awesome图标库免费版里有好多图标没有,而阿里巴巴的开源图标iconfont里的图标非常丰富,所以可以同时引入一下iconfont图标作为Font Awesome图标库的补充。 考虑到在线引入的icon图标大小都是16x16的,而Font Awesome图标一般…

powershell-alias配置方案

最近实在被git命令和poetry命令搞烦了,每次都要输入好长的命令,并且都差不太多,所以就搜索了怎么配置alias,下面是我的配置过程,主要资料来自[1]。配置 因为我用的是Windows Terminal,主要使用的Powershell环境,所以一下教程主要是以Powershell为例,配置的Alias主要是关…

leetcode hot 13

解题思路:本题思路主要是前缀和思想,涉及到子集和问题,前缀和思想有效,两个前缀和的差就等于对应一个子集和。本题可以用哈希表的方式记录每个前缀和的值,核心依靠k = pre[j]-pre[i]转化成pre[j]-k=pre[i],计算pre[i]这个值出现的个数加到res中,最后返回。 class Solutio…

redis - [10] 持久化

redis是一个内存数据库,断电即失。需要持久化到磁盘中。 001 || RDB 在执行的时间间隔内将内存中的数据集快照写入到磁盘(快照),恢复时是将快照文件直接读到内存中。 Redis会单独创建(fork)一个子进程进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了…

小红书独立开发大赛:让你的宝藏应用被更多人看到

无论你是业余在做一款 passion project 的 builder,还是试图 bootstrapping 自己造血的小团队。小红书发起的首届独立开发大赛都值得你关注。最近越来越多的社区开发者说,他们会选择在小红书冷启动自己的项目,因为这里能获取到友善的初期反馈和精准的早期用户。这些反馈和用…

博客作业:软件缺陷分析与二次开发实践(图书管理系统)

(1)来源 本次分析的代码来源于网络上的一个C++书籍购买系统项目。该项目模拟了不同用户类型(如会员、贵宾、学生等)购买书籍时的折扣计算和购买记录保存功能。原始代码虽能运行,但存在一些设计缺陷和潜在问题。 (2)运行环境+运行结果截图 运行环境: 环境:Windows 11 +…

博客添加看板娘

{% note info flat %} 本文转载自偷掉月亮的阿硕,本博客看板娘基于该教程搭建。 文章作者: 偷掉月亮的阿硕 文章链接: https://moonshuo.cn/posts/16544.html {% endnote %}

预祝2025省选嗨翻天

预祝2025省选嗨翻天\(T1\) A. 单峰序列 \(8pts\)部分分\(8pts\) :枚举每个数在单峰序列的左边还是右边,求次数做法同 luogu P3531 [POI 2012] LIT-Letters 。点击查看代码 int a[500010],b[500010],c[500010],ans[500010],id; vector<int>l,r; struct BIT {int c[50001…

配置github图床+picgo-core上传+jsdelivr

GitHub图床GitHub图床部分参考自教程Github图床+PicGo+JsDelivr+imgbot+automerge-action.imgbot图片压缩图片压缩部分参考自教程Github图床+PicGo+JsDelivr+imgbot+automerge-action.automerge-action最新版地址https://github.com/marketplace/actions/merge-pull-requests-a…

让博客在关键日子弹窗-变灰-放烟花

本文大体上参考自[1],新增了放烟花功能。前置教程 参见[1:1]。 {% note warning flat%}SweetAlert库应该在day.js和lunar.js前面引入!{% endnote %} 放烟花实现SweetAlert2库[2],支持弹窗含有图片,也就是可以弹窗一个放烟花的gif,当然你也可以使用html的visible属性来可视化…

2025中国十大HR SaaS厂商,企业应该如何选择最佳合作伙伴

人力资源软件供应商的价值已远超工具范畴——它们是组织能力的“放大器”、管理革命的“催化剂”。在数字化转型中,企业通过与其深度合作,不仅能实现运营效率的指数级提升,更将人力资本转化为战略资产,构建起适应AI时代的核心竞争力。选择与怎样的供应商同行,将直接决定企…