当前位置: 首页 > article >正文

别再死记硬背!用Python实战演练《软件工程导论》课后习题(详细设计篇)

用Python实战演练《软件工程导论》详细设计习题当翻开《软件工程导论》的详细设计章节那些抽象的控制结构转换题是否让你感到无从下手本文将带你用Python代码重新演绎经典课后习题让枯燥的理论在编程实践中变得生动可感。我们不仅会实现SEQUENCE、DO-WHILE等基础结构还会用matplotlib可视化流程图最后完成一个完整的交易手续费计算系统。1. 控制结构转换实战1.1 用SEQUENCE和DO-WHILE模拟IF-THEN-ELSE课本习题要求仅用顺序结构和do-while循环来实现if-else逻辑。让我们用Python类来模拟这个过程class ControlStructure: staticmethod def do_while_to_if(condition, block1, block2): k 1 while condition and k 1: block1() k 1 while (not condition) and k 1: block2() k 1 # 使用示例 def print_positive(): print(正数) def print_negative(): print(负数) ControlStructure.do_while_to_if( x 0, print_positive, print_negative )这个实现的关键点在于使用k作为控制变量确保只执行一个分支第一个循环处理条件为True的情况第二个循环处理条件为False的情况1.2 用SEQUENCE和IF-THEN-ELSE模拟DO-WHILE反向转换同样有趣我们用Python的label模拟和goto语句def if_to_do_while(condition, block): while True: if not condition: break block()虽然Python没有真正的goto但我们可以用循环和break实现相同效果。这个模式适用于需要至少执行一次循环体的场景。2. 流程图可视化实践2.1 使用graphviz绘制专业流程图课本中的流程图作业可以用Python的graphviz库实现自动化绘制from graphviz import Digraph def draw_flowchart(): dot Digraph(comment程序流程图) dot.node(A, 开始) dot.node(B, 条件p?) dot.node(C, 过程f) dot.node(D, 过程g和n) dot.node(E, 结束) dot.edges([AB, BE]) dot.edge(B, C, label是) dot.edge(C, B) dot.edge(B, D, label否) dot.edge(D, E) dot.render(flowchart.gv, viewTrue)这段代码会生成一个标准的流程图PDF文件比手绘更精确且易于修改。graphviz的优势在于自动处理节点布局支持多种输出格式可以嵌入到Jupyter Notebook中2.2 盒图生成技巧盒图(N-S图)虽然不如流程图常见但能更好体现结构化思想。我们可以用matplotlib绘制import matplotlib.pyplot as plt import matplotlib.patches as patches def draw_nassi_shneiderman(): fig, ax plt.subplots(figsize(6, 4)) # 主框 main_box patches.Rectangle((0.1, 0.1), 0.8, 0.8, linewidth2, edgecolorblack, facecolornone) ax.add_patch(main_box) # 条件判断框 cond_box patches.Rectangle((0.2, 0.6), 0.6, 0.2, linewidth1, edgecolorblue, facecolornone) ax.add_patch(cond_box) # 添加文本 plt.text(0.5, 0.7, 条件p?, hacenter) plt.text(0.3, 0.4, 过程f, hacenter) plt.text(0.7, 0.4, 过程g和n, hacenter) plt.axis(off) plt.show()3. 结构化程序改造实战3.1 非结构化程序识别与改造课本第4题给出了一个典型非结构化程序案例。让我们用Python实现改造前后的对比原始非结构化版本def unstructured(x): while x 10: if x 5: print(大于5) break # 非结构化出口 x 1 print(结束)结构化改造版本def structured(x): flag True while x 10 and flag: if x 5: print(大于5) flag False else: x 1 print(结束)关键改造技巧引入flag控制变量将多重出口合并为单一出口保持原有逻辑功能不变3.2 Ashcroft-Manna技术Python实现第6题提到的Ashcroft-Manna技术可以用Python类优雅实现class AshcroftManna: def __init__(self): self.i 1 self.max_case 3 # 假设有3个嵌套IF def execute(self): while self.i self.max_case: self.do_case() self.cleanup() def do_case(self): if self.i 1: # 外层IF逻辑 if condition1: self.i 2 # 跳转到内层 else: self.i self.max_case 1 elif self.i 2: # 中层IF逻辑 if condition2: self.i 3 else: self.i self.max_case 1 elif self.i 3: # 内层IF逻辑 if condition3: action() self.i self.max_case 1 def cleanup(self): # 后处理 pass4. 完整项目交易手续费计算系统4.1 用Python实现复杂判定逻辑课本第7题的手续费计算是个绝佳的OOP练习。我们设计一个CommissionCalculator类class CommissionCalculator: def __init__(self, total_amount, price_per_share, shares): self.total total_amount self.price price_per_share self.shares shares def calculate(self): base self._base_commission() extra self._extra_commission(base) return base extra def _base_commission(self): if self.total 1000: return self.total * 0.084 elif 1000 self.total 10000: return self.total * 0.05 34 else: return self.total * 0.04 134 def _extra_commission(self, base): if self.price 14: rate 0.09 if self.shares % 100 ! 0 else 0.05 elif 14 self.price 25: rate 0.06 if self.shares % 100 ! 0 else 0.02 else: rate 0.04 if self.shares % 100 ! 0 else 0.01 return base * rate4.2 判定表与判定树的Python实现我们可以用字典实现判定表用类继承实现判定树# 判定表实现 commission_table { base: [ {condition: lambda t: t 1000, calc: lambda t: t * 0.084}, {condition: lambda t: 1000 t 10000, calc: lambda t: t * 0.05 34}, {condition: lambda t: t 10000, calc: lambda t: t * 0.04 134} ], extra: [ {condition: lambda p, s: p 14 and s % 100 ! 0, rate: 0.09}, # 其他条件... ] } # 判定树实现 class CommissionNode: def evaluate(self, transaction): pass class PriceNode(CommissionNode): def __init__(self): self.branches { low: SharesNode(0.05, 0.09), medium: SharesNode(0.02, 0.06), high: SharesNode(0.01, 0.04) } def evaluate(self, transaction): if transaction.price 14: return self.branches[low].evaluate(transaction) # 其他分支...4.3 单元测试确保正确性为手续费计算编写pytest测试用例import pytest pytest.mark.parametrize(amount,price,shares,expected, [ (800, 10, 50, 800*0.084 800*0.084*0.09), # 小金额低价非整百 (5000, 20, 200, (5000*0.0534) (5000*0.0534)*0.02), # 中等金额 (20000, 30, 300, (20000*0.04134) (20000*0.04134)*0.01) # 大金额 ]) def test_commission(amount, price, shares, expected): calc CommissionCalculator(amount, price, shares) assert abs(calc.calculate() - expected) 0.001在实现这些习题解决方案时我发现最易出错的地方是边界条件处理。例如手续费计算中等于1000元和10000元的情况需要特别注意。建议在编写条件判断时总是先明确写出边界测试用例。

相关文章:

别再死记硬背!用Python实战演练《软件工程导论》课后习题(详细设计篇)

用Python实战演练《软件工程导论》详细设计习题 当翻开《软件工程导论》的详细设计章节,那些抽象的控制结构转换题是否让你感到无从下手?本文将带你用Python代码重新演绎经典课后习题,让枯燥的理论在编程实践中变得生动可感。我们不仅会实现S…...

打卡信奥刷题(3144)用C++实现信奥题 P7646 [COCI 2012/2013 #5] HIPERCIJEVI

P7646 [COCI 2012/2013 #5] HIPERCIJEVI 题目描述 在遥远的星系中,最快的运输方式是超级管道,它们将 KKK 个站台连接在一起。从站台 111 到达站台 NNN 最少需要经过多少个站台? 输入格式 第一行,三个整数 N,K,MN,K,MN,K,M,分…...

为什么你的虚拟线程比线程池还慢?——反模式TOP 9曝光(第4种正在 silently 拖垮K8s Pod内存)

第一章:Java 25虚拟线程高并发实践面试综述Java 25正式将虚拟线程(Virtual Threads)从预览特性转为标准特性,标志着JVM高并发编程范式的重大演进。相比传统平台线程,虚拟线程由JVM轻量级调度,可轻松创建百万…...

Qwen3.5-9B-GGUF应用案例:研发团队API文档智能生成实测

Qwen3.5-9B-GGUF应用案例:研发团队API文档智能生成实测 1. 项目背景与技术特点 Qwen3.5-9B-GGUF是基于阿里云开源的Qwen3.5-9B模型经过GGUF格式量化后的轻量级版本。这个90亿参数的稠密模型采用了创新的Gated Delta Networks架构和混合注意力机制(75%线性…...

SQLite Viewer终极指南:在浏览器中直接查看和管理SQLite数据库的完整解决方案

SQLite Viewer终极指南:在浏览器中直接查看和管理SQLite数据库的完整解决方案 【免费下载链接】sqlite-viewer View SQLite file online 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-viewer 你是否曾为查看SQLite数据库文件而烦恼?需要安…...

如何快速搭建CSDN Bot

要建立一个功能完整的 CSDN Bot,通常有两种主要路径:一是使用官方或社区提供的集成工具(如 OpenClaw/WinClaw)进行快速对接,这属于应用层部署;二是从零开始进行底层开发,通过调用 CSDN 的开放 A…...

3步精准配置:解锁NVIDIA驱动隐藏性能层

3步精准配置:解锁NVIDIA驱动隐藏性能层 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 显卡性能调优工具NVIDIA Profile Inspector为技术爱好者提供了深度访问NVIDIA驱动内部数据库的能力&a…...

具身智能迎数据元年

每日AI新闻推送:近24小时科技前沿深度报告 时间范围:2026年4月19日 - 4月20日 核心领域:具身智能、机器人、芯片、大模型与应用 一、具身智能:数据基建成为新战场,行业迈入“数据元年” 1. 具身智能“数据元年”启幕…...

保姆级教程:用MQTTX和Node-RED搭建你的第一个物联网中控台(ESP32 + Blinker实战)

从零构建物联网中控台:MQTTXNode-REDESP32全链路实战 当你的智能家居设备超过5个时,是否经常遇到这些困扰?手机里装着七八个控制APP,温湿度传感器数据散落在不同平台,设备联动需要反复切换应用… 这正是我们需要构建本…...

如何高效获取全网热门资源:Res-Downloader资源嗅探下载器全面指南

如何高效获取全网热门资源:Res-Downloader资源嗅探下载器全面指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader …...

ComfyUI-SUPIR图像超分实战指南:从模糊到高清的完整解决方案

ComfyUI-SUPIR图像超分实战指南:从模糊到高清的完整解决方案 【免费下载链接】ComfyUI-SUPIR SUPIR upscaling wrapper for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-SUPIR ComfyUI-SUPIR是一款基于扩散模型的图像超分辨率插件&#xf…...

Python连接openGauss避坑实录:从Docker环境变量到psycopg2事务管理的完整流程

Python连接openGauss实战指南:从Docker部署到事务管理的全流程解析 当开发者决定在项目中采用openGauss这款企业级开源数据库时,Python作为最流行的编程语言之一,自然成为首选的交互工具。但在实际开发中,从环境搭建到代码实现&am…...

从Nginx Ingress迁移到Istio Gateway:一份避坑指南与完整YAML配置清单

从Nginx Ingress迁移到Istio Gateway:一份避坑指南与完整YAML配置清单 当业务发展到需要金丝雀发布、流量治理等高级功能时,许多团队会面临从Nginx Ingress迁移到Istio Gateway的挑战。本文将提供一份完整的迁移指南,帮助您规避常见陷阱&…...

告别Option键!在MacBook Pro 2015上,用rEFInd打造macOS与Ubuntu 20.04的无缝双系统切换

优雅双系统:用rEFInd为MacBook Pro 2015打造无缝切换体验 每次开机都要按住Option键选择系统?默认的启动菜单简陋又难用?作为同时需要macOS生产力与Ubuntu开发环境的用户,我花了三个月时间折腾出这套完美方案。本文将分享如何通过…...

从Qt信号槽的5种连接方式,聊聊Qt::QueuedConnection的设计哲学与适用场景

Qt信号槽的5种连接方式深度解析:从设计哲学到实战选择 在Qt框架中,信号与槽机制是其最引以为傲的核心特性之一。这种优雅的事件处理方式不仅简化了对象间的通信,更为多线程编程提供了安全可靠的解决方案。但你是否真正理解信号槽背后五种连接…...

智读造用|《一人企业》1 :OPC靠这四个特征在大公司的缝隙里活得更好

系列:《一人企业》读书笔记 第1篇 书名:《一人企业:一个人也能赚钱的商业新模式》 作者:保罗贾维斯(Paul Jarvis) 大公司有钱、有人、有品牌,为什么反而在某些市场里追不上OPC公司?…...

手把手教你用网线给imx6ull开发板共享网络(Windows 10/11保姆级教程)

从零搭建imx6ull开发板网络环境:Windows有线共享全攻略 刚拿到imx6ull开发板时,最让人头疼的问题莫过于网络连接。实验室没有现成的路由器?宿舍WiFi信号不稳定?别担心,一根网线就能解决所有问题。本文将带你用最经济的…...

ZTools(效率工具)

链接:https://pan.quark.cn/s/add40d5ba361ZTools 是一款高性能、可扩展的跨平台应用启动器和插件平台,是知名效率工具 uTools 的开源实现版本。它采用现代化的技术栈构建,旨在为用户提供极速的桌面应用启动体验和强大的插件扩展能力。快速启…...

使用Qwen3-14B-AWQ模型自动化处理Excel数据:模拟VLOOKUP与复杂公式生成

使用Qwen3-14B-AWQ模型自动化处理Excel数据:模拟VLOOKUP与复杂公式生成 1. 引言:Excel数据处理的新思路 每天面对成堆的Excel表格,你是不是也经常为VLOOKUP跨表匹配、复杂公式编写而头疼?业务人员最熟悉的场景莫过于&#xff1a…...

Qianfan-OCR效果实测:印刷体+手写体混合比例从10%到90%的识别稳定性验证

Qianfan-OCR效果实测:印刷体手写体混合比例从10%到90%的识别稳定性验证 1. 测试背景与目标 在现实文档处理场景中,印刷体与手写体混合的情况非常普遍。本次测试旨在验证Qianfan-OCR在不同混合比例下的识别稳定性,为实际应用提供数据参考。 …...

如何用Meshroom将普通照片变成专业3D模型:从零开始的完整指南

如何用Meshroom将普通照片变成专业3D模型:从零开始的完整指南 【免费下载链接】Meshroom Node-based Visual Programming Toolbox 项目地址: https://gitcode.com/gh_mirrors/me/Meshroom 你是否曾想过,用手机拍摄的日常照片就能创建出令人惊叹的…...

Harepacker-resurrected终极指南:深度解析MapleStory游戏资源编辑全流程

Harepacker-resurrected终极指南:深度解析MapleStory游戏资源编辑全流程 【免费下载链接】Harepacker-resurrected All in one .wz file/map editor for MapleStory game files 项目地址: https://gitcode.com/gh_mirrors/ha/Harepacker-resurrected Harepac…...

医学影像分割新宠UNet 3+:从论文到落地,我是如何用它提升肝脏分割Dice系数的

UNet 3在肝脏CT分割中的实战优化:从数据增强到模型轻量化的完整闭环 当我在三甲医院放射科第一次看到医生手动勾画肝脏肿瘤轮廓时,那个下午改变了我对医学影像分割的认知。主治医师需要花费40分钟在单张CT切片上精确标注病灶区域,而一个典型病…...

无人机LiDAR点云处理:用Python CSF库搞定复杂地形的地面点提取

无人机LiDAR点云处理实战:Python CSF库高效地面滤波全解析 当无人机搭载LiDAR设备飞越复杂地形时,每秒可捕获数十万个三维点。这些海量点云数据中,如何快速准确地分离地面点与非地面点,成为三维建模、数字高程模型生成的关键第一…...

从Android开发视角看微信小程序:真机调试、项目结构与APK的奇妙对应关系

从Android开发视角看微信小程序:真机调试、项目结构与APK的奇妙对应关系 作为一名Android开发者,初次接触微信小程序时总会有种似曾相识的感觉。那种通过USB连接手机调试的熟悉感,那些与Android项目结构惊人相似的文件组织方式,还…...

告别预编译库!手把手教你为C++ 3D可视化项目定制编译OpenCV+VTK开发环境

告别预编译库!手把手教你为C 3D可视化项目定制编译OpenCVVTK开发环境 在计算机视觉和三维重建领域,OpenCV的viz模块为开发者提供了强大的3D可视化能力。然而,许多开发者在使用预编译的OpenCV库时,常常会遇到一个令人头疼的问题——…...

1.4 大白菜磁盘分区扩容(C盘为例)

前置条件:启动盘制作完成,插入U盘,BIOS选择U盘启动1.选择“启动Win10 X64 PE”2.等待一会3.等待一会4.双击桌面“分区工具”5.可以看到C盘扩容前为41GB,D盘为19GB6.右键点击“本地磁盘(C:)”,选择“扩容分区”7.点击“…...

ptp4l实战:从零到一,在Linux上构建高精度PTP时钟同步网络

1. 为什么需要高精度时钟同步? 想象一下,你正在参加一场线上拍卖会,出价截止时间精确到毫秒级别。如果服务器之间的时间不同步,有人可能因为时间误差而错失竞拍机会。这就是高精度时钟同步的价值所在——在金融交易、5G通信、工业…...

避坑指南:ESP32搭配百度TTS时,采样率设置不对声音就‘哑巴’了

ESP32音频开发实战:精准匹配百度TTS采样率与硬件配置的避坑指南 当你在ESP32项目中使用百度语音合成(TTS)功能时,是否遇到过这样的场景——代码逻辑看似完美,但播放出来的声音却像被掐住脖子一样嘶哑断续?这…...

GRBL固件源码深度解析:如何为你的DIY CNC雕刻机定制专属配置文件(以限位与主轴为例)

GRBL固件源码深度解析:如何为你的DIY CNC雕刻机定制专属配置文件(以限位与主轴为例) 当你第一次听到GRBL这个名词时,可能会觉得它只是一个普通的开源CNC控制固件。但当你真正开始使用它,特别是当你需要为自己的DIY CN…...