公共用例库计划--个人版(六)典型Bug页面设计与开发

news2025/7/10 9:34:55

1、任务概述

  本次计划的核心任务是开发一个,个人版的公共用例库,旨在将各系统和各类测试场景下的通用、基础以及关键功能的测试用例进行系统性地归纳整理,并以提高用例的复用率为目标,力求最大限度地减少重复劳动,提升测试效率。
  计划内容:完成公共用例库的开发实施工作,包括需求分析、系统设计、开发、测试、打包、运行维护等工作。

1.1、 已完成:

  需求分析、数据库表的设计:公共用例库计划–个人版(一)
  主体界面与逻辑设计:公共用例库计划–个人版(二)
  导出Excel功能:公共用例库计划–个人版(三)
  模块选择功能改造与性能优化公共用例库计划–个人版(四)
  QtCharts制作首页饼图与柱状图公共用例库计划–个人版(五)

1.2、 本次待完成:

典型Bug:新增遇见的较典型的bug,进行复盘与经验总结。
  1. bug、图片的库表设计
  2. 典型Bug页面,界面设计
  3. 逻辑代码开发

2、bug、图片的库表设计

  计划创建两张表,一张表存放bug信息,一张表保存bug的图片。
在这里插入图片描述
建表语句:

			# 创建bug表
            self.cursor.execute("""  
                            CREATE TABLE IF NOT EXISTS bug (  
                                bugid INTEGER PRIMARY KEY AUTOINCREMENT,  --编号
                                title TEXT NOT NULL,  --标题
                                types INTEGER ,  --类型--对应码值表code40-49
                                difficulty INTEGER ,  --难度--对应码值表code30-36
                                moduleid INTEGER ,  --所属模块
                                describe TEXT , --描述
                                think TEXT , --思考
                                severity INTEGER  --严重程度--对应码值表code50-53
                            )""")
            # 创建图片表
            self.cursor.execute("""  
                            CREATE TABLE IF NOT EXISTS image (  
                                imageid INTEGER PRIMARY KEY AUTOINCREMENT,  --编号
                                name TEXT NOT NULL,  --名称
                                image_bytes BLOB ,  --图片
                                bugid INTEGER  --所属bug
                            )""")

3、典型Bug页面

主要功能设计介绍:
  左侧使用listWidget显示bug列表,有翻页功能。
在这里插入图片描述
  主体上面,把用例页面的查询条件copy过来改改,选择条件对左边列表的bug进行查询。
在这里插入图片描述
  主体中部,点击左侧列表中bug名称,显示对应bug的详细信息。有图片上传按钮,显示图片、翻页等功能按钮。

  最后建了一个窗口,放一个graphicsView控件,显示大图。(上面页面图片是label显示的,担心显示太小了)
在这里插入图片描述

4、bug新增代码开发

4.1 保存bug

  在设计页面时,对保存按钮增加信号槽,点击保存触发save_bug。
对标题、描述进行 必填验证。如果有获取到bugid,就走编辑流程,没有就新增bug。

    def save_bug(self):
        """bug页面,保存"""
        if not self.lineEdit_4.text() or self.textEdit.toPlainText() == '[步骤]\n\n[结果]\n\n[期望]\n':
            self.ts.xinxi("标题或描述不能为空!")
            return

        self.save_bug_b.setEnabled(False)  # 保存按钮置灰
        parts=self.mk_2.currentText().split("—ID:")  # 模块编号
        if len(parts) == 2:
            self.mk_2.mkid=parts[1]
        else:
            self.mk_2.mkid=''
        if self.bugid != 0:  # 编辑
            vlue=(f'{self.lineEdit_4.text()}',
                  tc_sql.codes_dict['mk_types'][f'{self.lileixing_bug_2.currentText()}'],
                  tc_sql.codes_dict['difficulty'][f'{self.nandu_2.currentText()}'],
                  f'{self.mk_2.mkid}', f'{self.textEdit.toPlainText()}',
                  f'{self.textEdit_2.toPlainText()}',
                  tc_sql.codes_dict['severity'][f'{self.nandu_3.currentText()}'], f'{self.bugid}')
            self.savesql_bug(
                "update bug set title=? ,types=? ,difficulty=?, moduleid=? ,describe = ?,think = ?,severity=? where bugid=?",
                vlue)
        else:  # 新增
            vlue=(f'{self.lineEdit_4.text()}',
                  tc_sql.codes_dict['mk_types'][f'{self.lileixing_bug_2.currentText()}'],
                  tc_sql.codes_dict['difficulty'][f'{self.nandu_2.currentText()}'],
                  f'{self.mk_2.mkid}', f'{self.textEdit.toPlainText()}',
                  f'{self.textEdit_2.toPlainText()}',
                  tc_sql.codes_dict['severity'][f'{self.nandu_3.currentText()}'])
            self.savesql_bug("INSERT INTO bug VALUES (NULL,?,?,?,?,?,?,?)", vlue)

    def savesql_bug(self, sql, vlue):
        """bug保存sql"""
        self.case_db.connect()
        if self.case_db.operate_one(sql, vlue):
            self.case_db.over()
            self.chaxun_bug()  # 查询列表
            self.ts.xinxi("保存成功")
            logging.info('bug页面,保存')
        else:
            self.ts.xinxi("保存失败,请检查")
        self.save_bug_b.setEnabled(True)  # 保存按钮恢复

4.2 bug查询

  在设计页面时,对每一个查询条件设计信号槽,触发查询按钮,查询按钮触发chaxun_bug。
先获取查询条件的信息,然后通过拼接条件sql,查询出对应的bug,写入bug列表显示。

    def chaxun_bug(self, ye=1):
        """bug页面,查询"""
        parts=self.mk_1.currentText().split("—ID:")
        if len(parts) == 2:
            self.mk_1.mkid=parts[1]
        else:
            self.mk_1.mkid=''

        mk_types=tc_sql.codes_dict['mk_types'][
            f'{self.lileixing_bug.currentText()}'] if self.lileixing_bug.currentText() else ''
        difficulty=tc_sql.codes_dict['difficulty'][
            self.nandu.currentText()] if self.nandu.currentText() else ''

        dic={"bug.types": mk_types,
             "bug.difficulty": difficulty,
             "bug.moduleid": self.mk_1.mkid}
        dic_like={"bug.title": self.biaoti_bug.text()}
        sql1="select bugid || ':' || title from bug where"  # 拼接sql查询条件
        sql2="select count(*) from bug where"
        for k, v in dic.items():
            if v:
                sql1+=' ' + k + "= " + str(v) + " and"
                sql2+=' ' + k + "= " + str(v) + " and"
        for k, v in dic_like.items():
            if v:
                sql1+=' ' + k + " like '%" + v + "%' and"
                sql2+=' ' + k + " like '%" + v + "%' and"

        offset=20 * (ye - 1)  # 分页查询
        sql1=sql1.rstrip('where').rstrip('and') + " order by bug.bugid DESC " + f"LIMIT 20 OFFSET {offset}"
        sql2=sql2.rstrip('where').rstrip('and')

        self.case_db.connect()
        items=self.case_db.query_many(sql1)  # bug查询
        count=self.case_db.query_one(sql2)
        self.bugye_count=math.ceil(count[0] / 20)  # 页数计算
        self.case_db.over()
        self.listWidget.clear()  # 清空列表
        self.clear_bug()  # 清空页面
        if items:
            for i in range(len(items)):  # 数据写入列表
                item=QListWidgetItem(items[i][0])
                item.setToolTip(items[i][0])  # 写入提示
                self.listWidget.addItem(item)

            self.label_24.setText(f"总数: {count[0]}条 共: {self.bugye_count}页    ")
            self.lineEdit_3.setText(f"{ye}")
        else:
            self.listWidget.addItem("未查询到数据")  # 查询无数据,加空行
            self.label_24.setText(f"总数: 0条 共: 0页    ")
            self.lineEdit_3.setText("0")
        logging.info('bug页面,查询')

4.3 bug详情

  查询出bug列表后,点击其中的bug,页面显示详情。对列表增加槽函数,点击触发show_bug。
获取点击的bugID,根据bugid查询出信息,回显到页面。

    def show_bug(self):
        """点击bug,显示bug详情"""
        a=self.listWidget.selectedItems()
        if a:
            parts=a[0].text().split(":")
            if len(parts) == 2:
                self.bugid=parts[0]
            else:
                self.bugid=0
                return
            sql26='''select bug.title,codes1.value as types,codes2.value as difficulty,
                    module.modulename || '—ID:' || module.moduleid,
                    bug.describe,bug.think,codes3.value as severity
                    from bug 
                INNER JOIN
                    codes AS codes1 ON bug.types = codes1.id AND codes1.id BETWEEN 40 AND 49 -- 关联类型码值表
                INNER JOIN
                    codes AS codes2 ON bug.difficulty = codes2.id AND codes2.id BETWEEN 30 AND 36 -- 关联难度码值表
                INNER JOIN
                    codes AS codes3 ON bug.severity = codes3.id AND codes3.id BETWEEN 50 AND 53
                LEFT JOIN
                    module  ON bug.moduleid = module.moduleid 
                where bug.bugid = ? '''
            self.case_db.connect()
            items=self.case_db.query_one(sql26, (self.bugid,))  # bug查询
            self.case_db.over()
            # bug详情回显
            self.lineEdit_4.setText(items[0])
            index=self.lileixing_bug_2.findText(items[1], Qt.MatchFlag.MatchFixedString)
            self.lileixing_bug_2.setCurrentIndex(index)  # 设置下拉框内容
            index2=self.nandu_2.findText(items[2], Qt.MatchFlag.MatchFixedString)
            self.nandu_2.setCurrentIndex(index2)
            self.mk_2.clear()  # 清空模块下拉
            self.mk_2.addItem(items[3])
            self.mk_2.setCurrentIndex(0)  # 设置模块下拉显示
            self.textEdit.setText(items[4])
            self.textEdit_2.setText(items[5])
            index3=self.nandu_3.findText(items[6], Qt.MatchFlag.MatchFixedString)
            self.nandu_3.setCurrentIndex(index3)
            logging.info('显示bug详情')

4.4 实现情况

  现在bug新增,查询修改没问题。
在这里插入图片描述

5、图片管理

bug保存后,上传图片。有删除、图片翻页、查看大图功能

5.1 图片上传

  上传图片按钮,触发函数up_image。
对图片大小、格式限制,然后将图片转成Base64格式存入数据库。

    def up_image(self):
        """上传bug图片"""
        if self.bugid == 0:
            self.ts.xinxi("未获取到bugID,请先选择或者保存bug")
            return

        MAX_IMAGE_SIZE=1.5 * 1024 * 1024  # 图片大小限制(例如:5MB)
        try:
            filename, _=QFileDialog.getOpenFileName(self, "选择图片", "",
                                                    "Image Files (*.jpg *.jpeg *.png *.bmp *.gif)")
            if not filename:        # 未选择图片,退出
                return
            name=filename.split('/')[-1]
            file_size=os.path.getsize(filename)  # 检查文件大小
            if file_size > MAX_IMAGE_SIZE:
                self.ts.xinxi(f'图片大小超过限制({MAX_IMAGE_SIZE / (1024 * 1024)}MB),请上传更小的图片!')
            else:
                img=Image.open(filename)
                img.save(f"_internal/{name}", quality=90)  # 压缩图片
                with open(f"_internal/{name}", 'rb') as image_file:
                    content=base64.b64encode(image_file.read())  # 转换成Base64格式
                os.remove(f"_internal/{name}")

                self.case_db.connect()
                sql=f"INSERT INTO main.image (name, image_bytes,bugid) VALUES (?, ?, ?);"
                if self.case_db.operate_one(sql, (name, content, self.bugid)):
                    self.case_db.over()
                    self.show_image(self.bugid)
                    logging.info('上传bug图片')
                else:
                    self.ts.xinxi("图片上传出错")
        except Exception as e:
            self.ts.xinxi(f"上传出错:{e}")
            logging.error(e)

  数据库中,存入的图片。
数据库

5.2 图片显示

  图片上传后,就触发显示函数。将查询bug的图片,显示到label
首先对图像显示区域进行清理,如果查询到图片,将显示图片、名称、页数。

    def show_image(self, bugid, number=0):
        """根据bugID,查询bug图片"""
        self.label_image.setText('暂无图片')  # 清空bug图片区域数据
        self.pushButton_10.setVisible(False)  # 删除图片按钮,隐藏
        self.label_15.clear()
        self.label_34.clear()
        self.imageid=None

        self.case_db.connect()
        sql=f"SELECT image_bytes,imageid,name FROM image WHERE bugid=? LIMIT 1 OFFSET {number} "
        value=self.case_db.query_one(sql, (bugid,))
        count=self.case_db.query_one(f"SELECT count(*) FROM image WHERE bugid=? ", (bugid,))
        self.case_db.over()
        if value:                       # 显示图片、数量、名称
            self.imageid=value[1]
            str_encode=base64.b64decode(value[0])  # base64编码对应的解码(解码完字符串)
            pixmap=QPixmap()
            pixmap.loadFromData(str_encode)
            self.label_image.clear()
            scaled_pixmap=pixmap.scaled(self.label_image.size(), Qt.AspectRatioMode.KeepAspectRatio)
            self.label_image.setPixmap(scaled_pixmap)
            self.label_15.setText(f"{number + 1}/{count[0]}")  # 数量
            self.label_34.setText(f"{value[2]}")
            self.pushButton_10.setVisible(True)  # 删除图片按钮,显示
            logging.info('bug图片显示')

5.3 图片上传实现

在这里插入图片描述

5.4 大图窗口

  点击页面图片,触发大图窗口。

    def image_clicked(self, event):
        """点击图片,打开图片窗口"""
        if self.imageid:
            self.case_db.connect()
            sql=f"SELECT image_bytes FROM image WHERE imageid=?"
            value=self.case_db.query_one(sql, (self.imageid,))
            self.case_db.over()
            str_encode=base64.b64decode(value[0])
            if not self.child_windows:
                image_max=Image_bug(str_encode)
                self.child_windows.append(image_max)  # 将新打开的窗口添加到子窗口列表
            else:
                self.child_windows[0].update_image(str_encode)  # 已有窗口,更新图片

            logging.info('bug图片,大图窗口')

  大图窗口,继承界面设计好的窗口。
使用单例模式,只允许打开一个窗口,再次点击图片就更新窗口图片显示。
对鼠标滚轮进行重写,实现放大缩小图片。

class Image_bug(QWidget, Ui_imagemax):
    """图片页面"""
    _instance=None

    def __new__(cls, str_encode, parent=None):
        if cls._instance is None:
            instance=super().__new__(cls)
            instance.__init__(str_encode, parent)
            cls._instance=instance  # 保存到类变量以便后续使用
            return instance
        else:
            cls._instance.update_image(str_encode)  # 更新现有实例的图像数据
            return cls._instance

    def __init__(self, str_encode, parent=None):
        if self._instance:  # 避免多次初始化同一个实例
            return
        super().__init__(parent)
        self.str_encode=str_encode
        self.setupUi(self)
        self.init_image()

    def init_image(self):
        """窗口加载图片显示"""
        pixmap=QPixmap()
        pixmap.loadFromData(self.str_encode)
        scene=QGraphicsScene()# 创建图形视图、场景及图像项目
        item=QGraphicsPixmapItem(pixmap)
        scene.addItem(item)
        self.graphicsView.setScene(scene)# 设置视图与场景
        self.graphicsView.wheelEvent=self.wheelEvent_handler    # 重写滚轮事件处理函数
        self.show()

    def update_image(self, new_str_encode):
        """更新窗口图片"""
        self.str_encode=new_str_encode
        self.init_image()   # 重新加载图片数据
        self.activateWindow()  # 激活窗口
        self.raise_()       # 提升窗口至最前面

    def wheelEvent_handler(self, event):
        """滚轮放大缩小图片"""
        zoom_in_factor=1.25
        zoom_out_factor=1 / zoom_in_factor
        delta=event.angleDelta().y() / 120
        if delta > 0:
            factor=zoom_in_factor
        elif delta < 0:
            factor=zoom_out_factor
        else:
            return
        # 获取当前鼠标位置在视图坐标系中的位置
        mouse_pos_scene = self.graphicsView.mapToScene(QPoint(int(event.position().x()), int(event.position().y())))
        # 记录原始视图中心点
        old_center=self.graphicsView.viewport().rect().center()
        # 缩放视图
        self.graphicsView.scale(factor, factor)
        # 计算新的视图中心点,并确保鼠标下的内容不变
        new_center = self.graphicsView.mapFromScene(mouse_pos_scene).toPointF()
        self.graphicsView.centerOn(new_center)

5.5 大图窗口,放大缩小图片实现

在这里插入图片描述

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

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

相关文章

数据结构-内部排序

简介 排序&#xff08;Sorting&#xff09;&#xff1a;将一个数据元素&#xff08;或记录&#xff09;的任意序列&#xff0c;重新排列成一个按关键字有序的序列 排序算法分为内部排序和外部排序 内部排序&#xff1a;在排序期间数据对象全部存放在内存的排序 外部排序&am…

【c++】取地址及const取地址操作符重载

1.const成员 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的任何成员进行修改 我们来看看下面的代码 class Date { public:Date(int year, int month,…

2024年美赛数学建模C题思路分析 - 网球的动量

# 1 赛题 问题C&#xff1a;网球的动量 在2023年温布尔登绅士队的决赛中&#xff0c;20岁的西班牙新星卡洛斯阿尔卡拉兹击败了36岁的诺瓦克德约科维奇。这是德约科维奇自2013年以来首次在温布尔登公开赛失利&#xff0c;并结束了他在大满贯赛事中历史上最伟大的球员之一的非凡…

2024年美赛数学建模思路 - 案例:退火算法

文章目录 1 退火算法原理1.1 物理背景1.2 背后的数学模型 2 退火算法实现2.1 算法流程2.2算法实现 建模资料 ## 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&a…

WordPress SMTP发信避坑指南

前言 Clip_2024-01-31_19-46-18803285 10.5 KB 目前不少主题已经内置了SMTP发信功能&#xff0c;这是因为WordPress自带的mail()函数发信时基本无法发送。 但是在之前&#xff08;约2021年末&#xff09;貌似可以通过WordPress自带的函数发信&#xff0c;并且收信方提示由xxx代…

༺༽༾ཊ—Unity之-04-原型模式—ཏ༿༼༻

首先创建一个项目&#xff0c; 在这个初始界面我们需要做一些准备工作&#xff0c; 建基础通用文件夹&#xff0c; 创建一个Plane 重置后 缩放100倍 加一个颜色&#xff0c; 任务1&#xff1a;使用 建造者模式 创建三种 金刚猿猴 零部件 拼接组合 首先资源商店下载 金刚猿猴 模…

从0开始搭建、上传npm包

从0开始搭建、上传npm包 1、上传一个简单获取水果价格的包创建 vite 项目在项目根目录 src 文件夹中创建 index.ts 文件&#xff0c;文件内容如下&#xff1a;在 main.ts 文件中导入、导出上面创建的方法创建 vite.config.ts 配置文件&#xff0c;文件内容如下配置 package.jso…

npm 包管理工具

简介 Node官网&#xff1a;https://nodejs.org/ Npm官网&#xff1a;https://www.npmjs.com/ 在现代的软件开发世界中&#xff0c;包管理工具起着至关重要的作用。它们为开发者社区提供了一种高效共享和使用代码的方式。在 JavaScript 的范畴内&#xff0c;npm&#xff08;Node…

EMQX 性能调优:TCP SYN 队列与 Accept 队列

在上一篇博客&#xff08;EMQX 性能调优&#xff1a;最大连接与文件描述符&#xff09;&#xff0c;我们深入研究了 MQTT 连接与文件描述符之间的关系&#xff0c;介绍了如何修改文件描述符相关的内核参数来突破默认的最大连接数量限制。 但你可能会发现&#xff0c;在某些情况…

9.1斐波那契数(LC509-E)

算法&#xff1a; 动态规划五部曲&#xff1a; 1.确定dp数组及下标含义 dp[i]的定义为&#xff1a;第i个数的斐波那契数值是dp[i] 2.确定递归公式 题目已给出&#xff1a;状态转移方程 dp[i] dp[i - 1] dp[i - 2]; 3.dp数组如何初始化 题目已给 dp[0] 0; dp[1] 1; …

SpringBoot使用Rabbit详解含完整代码

1. 摘要 本文将详细介绍如何在Spring Boot应用程序中集成和使用RabbitMQ消息队列。RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;用于通过轻量级和可靠的消息在应用程序或系统之间进行异步通信。本文将通过步骤说明、代码示例和详细注释&#xff0c;指导读者在Spring…

2023年上-未来几年我要做什么

1月份&#xff0c;离职。 2月份&#xff0c;春节休假回来&#xff0c;中旬去参加了一个月的瑜伽培训&#xff0c;学会了倒立、鹤蝉。。。。 3月份&#xff0c;瑜伽培训结束&#xff0c;开始收拾房子&#xff0c;并调研各类项目。 4月份&#xff0c;参与了朋友的区块链项目 …

web前端开发--------阴影与转换

1.阴影分为文本阴影和盒子阴影 我们使用text-shadow属性为文本添加阴影效果&#xff0c;使用结构伪类为第一个子元素p添加阴影效果&#xff1b; 水平偏移量为负值时&#xff0c;表示阴影向左偏移&#xff1b; &#xfeff;垂直偏移量为负值时&#xff0c;表示阴影向上偏移。 …

【Linux】初始进程地址空间

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 目录 一、再谈fork二、程序地址空间2.1代码验证 三、虚拟地址&am…

Error: Projects must list all files or use an ‘include‘ pattern.

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

【解决方案】在Vue、HTML项目中使用@spacechart/translate 插件实现在线实时翻译、自定义翻译

SpaceChart/Translate SpaceChart/Translate 是一个可配置的翻译插件&#xff0c;适用于任何环境&#xff0c;让开发者不再需要注重插件本身&#xff1b;插件支持自定义翻译引擎&#xff0c;快速生成对应的AI翻译模型客户端插件 Repository GitHubNPM Browser Support La…

计算机图形学 实验

题目要求 1.1 实验一&#xff1a;图元的生成&#xff1a;直线、圆椭区域填充 你需要完成基本的图元生成算法&#xff0c;包括直线和椭圆。 在区域填充中&#xff0c;要求你对一个封闭图形进行填充。你需要绘制一个封 闭图形&#xff08;例如多边形&#xff09;&#xff0c;并选…

计算机网络实验一

目录 实验一 使用PacketTracer组建简单局域网 1、实验目的 2、实验设备 &#xff08;1&#xff09;内容一&#xff08;组建简单局域网&#xff09;&#xff1a; &#xff08;2&#xff09;内容二&#xff08;使用交叉线直连两台机器&#xff09;&#xff1a; &#xff08…

Java知识点总结

数据类型强转&#xff1a;byte short int long float double &#xff1b; 数组定义 [ ]数组名 clone-复制数组equals-比较存储地址 toString sort-排序 length-长度 arraycopy([]a,s,[]b,ss,n)-数组复制 运算符及语句 instanceof双目运算符 –左对象右类 判断是否是该类创建…

【Linux】-多线程的知识都收尾(线程池,封装的线程,单例模式,自旋锁)

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …