软件工程:结构化程序设计

📌目录



⚖️ 结构化程序设计:从混乱到有序

结构化程序设计是一种程序设计方法学,它通过限制程序的控制流结构,使程序具有清晰的结构和良好的可读性。本文将详细介绍结构化程序设计的概念、基本结构、原则、方法和工具。

🎯 一、结构化程序设计概述

(一)结构化程序设计的定义

结构化程序设计(Structured Programming)是一种程序设计方法学,它主张使用顺序、选择、循环三种基本控制结构来构造程序,禁止或限制使用goto语句,使程序具有清晰的结构。

结构化程序设计概念
#mermaid-svg-zDOVRFVpZhqZiuUZ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zDOVRFVpZhqZiuUZ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zDOVRFVpZhqZiuUZ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zDOVRFVpZhqZiuUZ .error-icon{fill:#552222;}#mermaid-svg-zDOVRFVpZhqZiuUZ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zDOVRFVpZhqZiuUZ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zDOVRFVpZhqZiuUZ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zDOVRFVpZhqZiuUZ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zDOVRFVpZhqZiuUZ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zDOVRFVpZhqZiuUZ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zDOVRFVpZhqZiuUZ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zDOVRFVpZhqZiuUZ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zDOVRFVpZhqZiuUZ .marker.cross{stroke:#333333;}#mermaid-svg-zDOVRFVpZhqZiuUZ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zDOVRFVpZhqZiuUZ p{margin:0;}#mermaid-svg-zDOVRFVpZhqZiuUZ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zDOVRFVpZhqZiuUZ .cluster-label text{fill:#333;}#mermaid-svg-zDOVRFVpZhqZiuUZ .cluster-label span{color:#333;}#mermaid-svg-zDOVRFVpZhqZiuUZ .cluster-label span p{background-color:transparent;}#mermaid-svg-zDOVRFVpZhqZiuUZ .label text,#mermaid-svg-zDOVRFVpZhqZiuUZ span{fill:#333;color:#333;}#mermaid-svg-zDOVRFVpZhqZiuUZ .node rect,#mermaid-svg-zDOVRFVpZhqZiuUZ .node circle,#mermaid-svg-zDOVRFVpZhqZiuUZ .node ellipse,#mermaid-svg-zDOVRFVpZhqZiuUZ .node polygon,#mermaid-svg-zDOVRFVpZhqZiuUZ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zDOVRFVpZhqZiuUZ .rough-node .label text,#mermaid-svg-zDOVRFVpZhqZiuUZ .node .label text,#mermaid-svg-zDOVRFVpZhqZiuUZ .image-shape .label,#mermaid-svg-zDOVRFVpZhqZiuUZ .icon-shape .label{text-anchor:middle;}#mermaid-svg-zDOVRFVpZhqZiuUZ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zDOVRFVpZhqZiuUZ .rough-node .label,#mermaid-svg-zDOVRFVpZhqZiuUZ .node .label,#mermaid-svg-zDOVRFVpZhqZiuUZ .image-shape .label,#mermaid-svg-zDOVRFVpZhqZiuUZ .icon-shape .label{text-align:center;}#mermaid-svg-zDOVRFVpZhqZiuUZ .node.clickable{cursor:pointer;}#mermaid-svg-zDOVRFVpZhqZiuUZ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zDOVRFVpZhqZiuUZ .arrowheadPath{fill:#333333;}#mermaid-svg-zDOVRFVpZhqZiuUZ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zDOVRFVpZhqZiuUZ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zDOVRFVpZhqZiuUZ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zDOVRFVpZhqZiuUZ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zDOVRFVpZhqZiuUZ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zDOVRFVpZhqZiuUZ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zDOVRFVpZhqZiuUZ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zDOVRFVpZhqZiuUZ .cluster text{fill:#333;}#mermaid-svg-zDOVRFVpZhqZiuUZ .cluster span{color:#333;}#mermaid-svg-zDOVRFVpZhqZiuUZ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zDOVRFVpZhqZiuUZ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zDOVRFVpZhqZiuUZ rect.text{fill:none;stroke-width:0;}#mermaid-svg-zDOVRFVpZhqZiuUZ .icon-shape,#mermaid-svg-zDOVRFVpZhqZiuUZ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zDOVRFVpZhqZiuUZ .icon-shape p,#mermaid-svg-zDOVRFVpZhqZiuUZ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zDOVRFVpZhqZiuUZ .icon-shape .label rect,#mermaid-svg-zDOVRFVpZhqZiuUZ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zDOVRFVpZhqZiuUZ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zDOVRFVpZhqZiuUZ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zDOVRFVpZhqZiuUZ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 结构化程序设计
顺序结构
选择结构
循环结构
顺序执行
条件判断
重复执行
自顶向下
逐步求精
模块化

(二)结构化程序设计的历史

结构化程序设计历史

时间 事件 意义
1966 Bohm-Jacopini定理 证明三种基本结构足够
1968 Dijkstra发表文章 反对goto语句
1970s 结构化方法流行 成为主流方法
1980s 面向对象兴起 结构化仍是基础

(三)结构化程序设计的特点

结构化程序设计特点

特点 说明
自顶向下 从整体到局部
逐步求精 逐步细化
模块化 功能分解
限制goto 避免无序跳转
单入口单出口 每个模块一个入口一个出口

📦 二、三种基本控制结构

(一)基本结构概述

三种基本控制结构
#mermaid-svg-gMlNbSVPppK7JSCQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-gMlNbSVPppK7JSCQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-gMlNbSVPppK7JSCQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-gMlNbSVPppK7JSCQ .error-icon{fill:#552222;}#mermaid-svg-gMlNbSVPppK7JSCQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gMlNbSVPppK7JSCQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-gMlNbSVPppK7JSCQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gMlNbSVPppK7JSCQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gMlNbSVPppK7JSCQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-gMlNbSVPppK7JSCQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gMlNbSVPppK7JSCQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gMlNbSVPppK7JSCQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gMlNbSVPppK7JSCQ .marker.cross{stroke:#333333;}#mermaid-svg-gMlNbSVPppK7JSCQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gMlNbSVPppK7JSCQ p{margin:0;}#mermaid-svg-gMlNbSVPppK7JSCQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-gMlNbSVPppK7JSCQ .cluster-label text{fill:#333;}#mermaid-svg-gMlNbSVPppK7JSCQ .cluster-label span{color:#333;}#mermaid-svg-gMlNbSVPppK7JSCQ .cluster-label span p{background-color:transparent;}#mermaid-svg-gMlNbSVPppK7JSCQ .label text,#mermaid-svg-gMlNbSVPppK7JSCQ span{fill:#333;color:#333;}#mermaid-svg-gMlNbSVPppK7JSCQ .node rect,#mermaid-svg-gMlNbSVPppK7JSCQ .node circle,#mermaid-svg-gMlNbSVPppK7JSCQ .node ellipse,#mermaid-svg-gMlNbSVPppK7JSCQ .node polygon,#mermaid-svg-gMlNbSVPppK7JSCQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gMlNbSVPppK7JSCQ .rough-node .label text,#mermaid-svg-gMlNbSVPppK7JSCQ .node .label text,#mermaid-svg-gMlNbSVPppK7JSCQ .image-shape .label,#mermaid-svg-gMlNbSVPppK7JSCQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-gMlNbSVPppK7JSCQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-gMlNbSVPppK7JSCQ .rough-node .label,#mermaid-svg-gMlNbSVPppK7JSCQ .node .label,#mermaid-svg-gMlNbSVPppK7JSCQ .image-shape .label,#mermaid-svg-gMlNbSVPppK7JSCQ .icon-shape .label{text-align:center;}#mermaid-svg-gMlNbSVPppK7JSCQ .node.clickable{cursor:pointer;}#mermaid-svg-gMlNbSVPppK7JSCQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-gMlNbSVPppK7JSCQ .arrowheadPath{fill:#333333;}#mermaid-svg-gMlNbSVPppK7JSCQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-gMlNbSVPppK7JSCQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-gMlNbSVPppK7JSCQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gMlNbSVPppK7JSCQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-gMlNbSVPppK7JSCQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gMlNbSVPppK7JSCQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-gMlNbSVPppK7JSCQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-gMlNbSVPppK7JSCQ .cluster text{fill:#333;}#mermaid-svg-gMlNbSVPppK7JSCQ .cluster span{color:#333;}#mermaid-svg-gMlNbSVPppK7JSCQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-gMlNbSVPppK7JSCQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-gMlNbSVPppK7JSCQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-gMlNbSVPppK7JSCQ .icon-shape,#mermaid-svg-gMlNbSVPppK7JSCQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gMlNbSVPppK7JSCQ .icon-shape p,#mermaid-svg-gMlNbSVPppK7JSCQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-gMlNbSVPppK7JSCQ .icon-shape .label rect,#mermaid-svg-gMlNbSVPppK7JSCQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gMlNbSVPppK7JSCQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-gMlNbSVPppK7JSCQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-gMlNbSVPppK7JSCQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 基本结构
顺序结构
选择结构
循环结构
顺序执行
if-then-else
while, for

(二)顺序结构

顺序结构是最基本的结构,按顺序执行语句。

顺序结构特点

特点 说明
顺序执行 按书写顺序执行
单入口单出口 一个入口一个出口
无分支 没有条件判断

顺序结构示例

python 复制代码
# 顺序结构示例
# 计算圆的面积

# 1. 输入半径
radius = 5.0

# 2. 计算面积(顺序执行)
pi = 3.14159
area = pi * radius * radius

# 3. 输出结果
print(f"半径:{radius}")
print(f"面积:{area}")

顺序结构流程图
#mermaid-svg-4pdmbebokSrdAQZy{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4pdmbebokSrdAQZy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4pdmbebokSrdAQZy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4pdmbebokSrdAQZy .error-icon{fill:#552222;}#mermaid-svg-4pdmbebokSrdAQZy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4pdmbebokSrdAQZy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4pdmbebokSrdAQZy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4pdmbebokSrdAQZy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4pdmbebokSrdAQZy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4pdmbebokSrdAQZy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4pdmbebokSrdAQZy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4pdmbebokSrdAQZy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4pdmbebokSrdAQZy .marker.cross{stroke:#333333;}#mermaid-svg-4pdmbebokSrdAQZy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4pdmbebokSrdAQZy p{margin:0;}#mermaid-svg-4pdmbebokSrdAQZy .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-4pdmbebokSrdAQZy .cluster-label text{fill:#333;}#mermaid-svg-4pdmbebokSrdAQZy .cluster-label span{color:#333;}#mermaid-svg-4pdmbebokSrdAQZy .cluster-label span p{background-color:transparent;}#mermaid-svg-4pdmbebokSrdAQZy .label text,#mermaid-svg-4pdmbebokSrdAQZy span{fill:#333;color:#333;}#mermaid-svg-4pdmbebokSrdAQZy .node rect,#mermaid-svg-4pdmbebokSrdAQZy .node circle,#mermaid-svg-4pdmbebokSrdAQZy .node ellipse,#mermaid-svg-4pdmbebokSrdAQZy .node polygon,#mermaid-svg-4pdmbebokSrdAQZy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4pdmbebokSrdAQZy .rough-node .label text,#mermaid-svg-4pdmbebokSrdAQZy .node .label text,#mermaid-svg-4pdmbebokSrdAQZy .image-shape .label,#mermaid-svg-4pdmbebokSrdAQZy .icon-shape .label{text-anchor:middle;}#mermaid-svg-4pdmbebokSrdAQZy .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4pdmbebokSrdAQZy .rough-node .label,#mermaid-svg-4pdmbebokSrdAQZy .node .label,#mermaid-svg-4pdmbebokSrdAQZy .image-shape .label,#mermaid-svg-4pdmbebokSrdAQZy .icon-shape .label{text-align:center;}#mermaid-svg-4pdmbebokSrdAQZy .node.clickable{cursor:pointer;}#mermaid-svg-4pdmbebokSrdAQZy .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4pdmbebokSrdAQZy .arrowheadPath{fill:#333333;}#mermaid-svg-4pdmbebokSrdAQZy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4pdmbebokSrdAQZy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4pdmbebokSrdAQZy .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4pdmbebokSrdAQZy .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4pdmbebokSrdAQZy .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4pdmbebokSrdAQZy .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4pdmbebokSrdAQZy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4pdmbebokSrdAQZy .cluster text{fill:#333;}#mermaid-svg-4pdmbebokSrdAQZy .cluster span{color:#333;}#mermaid-svg-4pdmbebokSrdAQZy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4pdmbebokSrdAQZy .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4pdmbebokSrdAQZy rect.text{fill:none;stroke-width:0;}#mermaid-svg-4pdmbebokSrdAQZy .icon-shape,#mermaid-svg-4pdmbebokSrdAQZy .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4pdmbebokSrdAQZy .icon-shape p,#mermaid-svg-4pdmbebokSrdAQZy .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4pdmbebokSrdAQZy .icon-shape .label rect,#mermaid-svg-4pdmbebokSrdAQZy .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4pdmbebokSrdAQZy .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4pdmbebokSrdAQZy .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4pdmbebokSrdAQZy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 开始
输入radius
计算area
输出结果
结束

(三)选择结构

选择结构根据条件选择执行路径。

选择结构类型

类型 说明 语法
单分支 if if condition:
双分支 if-else if-else
多分支 if-elif-else if-elif-else

选择结构示例

python 复制代码
# 选择结构示例
# 判断成绩等级

score = 85

# 1. 单分支
if score >= 60:
    print("及格")

# 2. 双分支
if score >= 60:
    print("及格")
else:
    print("不及格")

# 3. 多分支
if score >= 90:
    grade = "A"
elif score >= 80:
    grade = "B"
elif score >= 70:
    grade = "C"
elif score >= 60:
    grade = "D"
else:
    grade = "F"

print(f"成绩等级:{grade}")

选择结构流程图
#mermaid-svg-SqTKF6UJ7bNrRk9K{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SqTKF6UJ7bNrRk9K .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SqTKF6UJ7bNrRk9K .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SqTKF6UJ7bNrRk9K .error-icon{fill:#552222;}#mermaid-svg-SqTKF6UJ7bNrRk9K .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SqTKF6UJ7bNrRk9K .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SqTKF6UJ7bNrRk9K .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SqTKF6UJ7bNrRk9K .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SqTKF6UJ7bNrRk9K .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SqTKF6UJ7bNrRk9K .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SqTKF6UJ7bNrRk9K .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SqTKF6UJ7bNrRk9K .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SqTKF6UJ7bNrRk9K .marker.cross{stroke:#333333;}#mermaid-svg-SqTKF6UJ7bNrRk9K svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SqTKF6UJ7bNrRk9K p{margin:0;}#mermaid-svg-SqTKF6UJ7bNrRk9K .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SqTKF6UJ7bNrRk9K .cluster-label text{fill:#333;}#mermaid-svg-SqTKF6UJ7bNrRk9K .cluster-label span{color:#333;}#mermaid-svg-SqTKF6UJ7bNrRk9K .cluster-label span p{background-color:transparent;}#mermaid-svg-SqTKF6UJ7bNrRk9K .label text,#mermaid-svg-SqTKF6UJ7bNrRk9K span{fill:#333;color:#333;}#mermaid-svg-SqTKF6UJ7bNrRk9K .node rect,#mermaid-svg-SqTKF6UJ7bNrRk9K .node circle,#mermaid-svg-SqTKF6UJ7bNrRk9K .node ellipse,#mermaid-svg-SqTKF6UJ7bNrRk9K .node polygon,#mermaid-svg-SqTKF6UJ7bNrRk9K .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SqTKF6UJ7bNrRk9K .rough-node .label text,#mermaid-svg-SqTKF6UJ7bNrRk9K .node .label text,#mermaid-svg-SqTKF6UJ7bNrRk9K .image-shape .label,#mermaid-svg-SqTKF6UJ7bNrRk9K .icon-shape .label{text-anchor:middle;}#mermaid-svg-SqTKF6UJ7bNrRk9K .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SqTKF6UJ7bNrRk9K .rough-node .label,#mermaid-svg-SqTKF6UJ7bNrRk9K .node .label,#mermaid-svg-SqTKF6UJ7bNrRk9K .image-shape .label,#mermaid-svg-SqTKF6UJ7bNrRk9K .icon-shape .label{text-align:center;}#mermaid-svg-SqTKF6UJ7bNrRk9K .node.clickable{cursor:pointer;}#mermaid-svg-SqTKF6UJ7bNrRk9K .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SqTKF6UJ7bNrRk9K .arrowheadPath{fill:#333333;}#mermaid-svg-SqTKF6UJ7bNrRk9K .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SqTKF6UJ7bNrRk9K .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SqTKF6UJ7bNrRk9K .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SqTKF6UJ7bNrRk9K .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SqTKF6UJ7bNrRk9K .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SqTKF6UJ7bNrRk9K .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SqTKF6UJ7bNrRk9K .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SqTKF6UJ7bNrRk9K .cluster text{fill:#333;}#mermaid-svg-SqTKF6UJ7bNrRk9K .cluster span{color:#333;}#mermaid-svg-SqTKF6UJ7bNrRk9K div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SqTKF6UJ7bNrRk9K .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SqTKF6UJ7bNrRk9K rect.text{fill:none;stroke-width:0;}#mermaid-svg-SqTKF6UJ7bNrRk9K .icon-shape,#mermaid-svg-SqTKF6UJ7bNrRk9K .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SqTKF6UJ7bNrRk9K .icon-shape p,#mermaid-svg-SqTKF6UJ7bNrRk9K .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SqTKF6UJ7bNrRk9K .icon-shape .label rect,#mermaid-svg-SqTKF6UJ7bNrRk9K .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SqTKF6UJ7bNrRk9K .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SqTKF6UJ7bNrRk9K .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SqTKF6UJ7bNrRk9K :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是







开始
score >= 90?
grade = A
score >= 80?
grade = B
score >= 70?
grade = C
score >= 60?
grade = D
grade = F
输出grade
结束

(四)循环结构

循环结构重复执行语句块。

循环结构类型

类型 说明 语法
while循环 先判断后执行 while condition:
for循环 计数循环 for item in iterable:
do-while 先执行后判断 不直接支持

循环结构示例

python 复制代码
# 循环结构示例

# 1. while循环 - 计算1到100的和
total = 0
i = 1
while i <= 100:
    total += i
    i += 1
print(f"1到100的和:{total}")

# 2. for循环 - 遍历列表
fruits = ["apple", "banana", "cherry"]
for fruit in fruits:
    print(f"水果:{fruit}")

# 3. for循环 - 计算阶乘
n = 5
factorial = 1
for i in range(1, n + 1):
    factorial *= i
print(f"{n}的阶乘:{factorial}")

# 4. 嵌套循环 - 打印九九乘法表
for i in range(1, 10):
    for j in range(1, i + 1):
        print(f"{j}×{i}={i*j}", end="\t")
    print()

循环结构流程图
#mermaid-svg-rs5MML6IgI1LMh6l{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rs5MML6IgI1LMh6l .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rs5MML6IgI1LMh6l .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rs5MML6IgI1LMh6l .error-icon{fill:#552222;}#mermaid-svg-rs5MML6IgI1LMh6l .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rs5MML6IgI1LMh6l .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rs5MML6IgI1LMh6l .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rs5MML6IgI1LMh6l .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rs5MML6IgI1LMh6l .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rs5MML6IgI1LMh6l .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rs5MML6IgI1LMh6l .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rs5MML6IgI1LMh6l .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rs5MML6IgI1LMh6l .marker.cross{stroke:#333333;}#mermaid-svg-rs5MML6IgI1LMh6l svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rs5MML6IgI1LMh6l p{margin:0;}#mermaid-svg-rs5MML6IgI1LMh6l .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-rs5MML6IgI1LMh6l .cluster-label text{fill:#333;}#mermaid-svg-rs5MML6IgI1LMh6l .cluster-label span{color:#333;}#mermaid-svg-rs5MML6IgI1LMh6l .cluster-label span p{background-color:transparent;}#mermaid-svg-rs5MML6IgI1LMh6l .label text,#mermaid-svg-rs5MML6IgI1LMh6l span{fill:#333;color:#333;}#mermaid-svg-rs5MML6IgI1LMh6l .node rect,#mermaid-svg-rs5MML6IgI1LMh6l .node circle,#mermaid-svg-rs5MML6IgI1LMh6l .node ellipse,#mermaid-svg-rs5MML6IgI1LMh6l .node polygon,#mermaid-svg-rs5MML6IgI1LMh6l .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rs5MML6IgI1LMh6l .rough-node .label text,#mermaid-svg-rs5MML6IgI1LMh6l .node .label text,#mermaid-svg-rs5MML6IgI1LMh6l .image-shape .label,#mermaid-svg-rs5MML6IgI1LMh6l .icon-shape .label{text-anchor:middle;}#mermaid-svg-rs5MML6IgI1LMh6l .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rs5MML6IgI1LMh6l .rough-node .label,#mermaid-svg-rs5MML6IgI1LMh6l .node .label,#mermaid-svg-rs5MML6IgI1LMh6l .image-shape .label,#mermaid-svg-rs5MML6IgI1LMh6l .icon-shape .label{text-align:center;}#mermaid-svg-rs5MML6IgI1LMh6l .node.clickable{cursor:pointer;}#mermaid-svg-rs5MML6IgI1LMh6l .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rs5MML6IgI1LMh6l .arrowheadPath{fill:#333333;}#mermaid-svg-rs5MML6IgI1LMh6l .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rs5MML6IgI1LMh6l .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rs5MML6IgI1LMh6l .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rs5MML6IgI1LMh6l .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rs5MML6IgI1LMh6l .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rs5MML6IgI1LMh6l .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rs5MML6IgI1LMh6l .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rs5MML6IgI1LMh6l .cluster text{fill:#333;}#mermaid-svg-rs5MML6IgI1LMh6l .cluster span{color:#333;}#mermaid-svg-rs5MML6IgI1LMh6l div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rs5MML6IgI1LMh6l .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rs5MML6IgI1LMh6l rect.text{fill:none;stroke-width:0;}#mermaid-svg-rs5MML6IgI1LMh6l .icon-shape,#mermaid-svg-rs5MML6IgI1LMh6l .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rs5MML6IgI1LMh6l .icon-shape p,#mermaid-svg-rs5MML6IgI1LMh6l .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rs5MML6IgI1LMh6l .icon-shape .label rect,#mermaid-svg-rs5MML6IgI1LMh6l .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rs5MML6IgI1LMh6l .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rs5MML6IgI1LMh6l .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rs5MML6IgI1LMh6l :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是

开始
total=0, i=1
i <= 100?
total += i
i += 1
输出total
结束

🌐 三、结构化程序设计的原则

(一)原则概述

结构化程序设计原则
#mermaid-svg-TqdZcCsOdeh61DO3{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-TqdZcCsOdeh61DO3 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-TqdZcCsOdeh61DO3 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-TqdZcCsOdeh61DO3 .error-icon{fill:#552222;}#mermaid-svg-TqdZcCsOdeh61DO3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-TqdZcCsOdeh61DO3 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-TqdZcCsOdeh61DO3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-TqdZcCsOdeh61DO3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-TqdZcCsOdeh61DO3 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-TqdZcCsOdeh61DO3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-TqdZcCsOdeh61DO3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-TqdZcCsOdeh61DO3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-TqdZcCsOdeh61DO3 .marker.cross{stroke:#333333;}#mermaid-svg-TqdZcCsOdeh61DO3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-TqdZcCsOdeh61DO3 p{margin:0;}#mermaid-svg-TqdZcCsOdeh61DO3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-TqdZcCsOdeh61DO3 .cluster-label text{fill:#333;}#mermaid-svg-TqdZcCsOdeh61DO3 .cluster-label span{color:#333;}#mermaid-svg-TqdZcCsOdeh61DO3 .cluster-label span p{background-color:transparent;}#mermaid-svg-TqdZcCsOdeh61DO3 .label text,#mermaid-svg-TqdZcCsOdeh61DO3 span{fill:#333;color:#333;}#mermaid-svg-TqdZcCsOdeh61DO3 .node rect,#mermaid-svg-TqdZcCsOdeh61DO3 .node circle,#mermaid-svg-TqdZcCsOdeh61DO3 .node ellipse,#mermaid-svg-TqdZcCsOdeh61DO3 .node polygon,#mermaid-svg-TqdZcCsOdeh61DO3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-TqdZcCsOdeh61DO3 .rough-node .label text,#mermaid-svg-TqdZcCsOdeh61DO3 .node .label text,#mermaid-svg-TqdZcCsOdeh61DO3 .image-shape .label,#mermaid-svg-TqdZcCsOdeh61DO3 .icon-shape .label{text-anchor:middle;}#mermaid-svg-TqdZcCsOdeh61DO3 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-TqdZcCsOdeh61DO3 .rough-node .label,#mermaid-svg-TqdZcCsOdeh61DO3 .node .label,#mermaid-svg-TqdZcCsOdeh61DO3 .image-shape .label,#mermaid-svg-TqdZcCsOdeh61DO3 .icon-shape .label{text-align:center;}#mermaid-svg-TqdZcCsOdeh61DO3 .node.clickable{cursor:pointer;}#mermaid-svg-TqdZcCsOdeh61DO3 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-TqdZcCsOdeh61DO3 .arrowheadPath{fill:#333333;}#mermaid-svg-TqdZcCsOdeh61DO3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-TqdZcCsOdeh61DO3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-TqdZcCsOdeh61DO3 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TqdZcCsOdeh61DO3 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-TqdZcCsOdeh61DO3 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TqdZcCsOdeh61DO3 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-TqdZcCsOdeh61DO3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-TqdZcCsOdeh61DO3 .cluster text{fill:#333;}#mermaid-svg-TqdZcCsOdeh61DO3 .cluster span{color:#333;}#mermaid-svg-TqdZcCsOdeh61DO3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-TqdZcCsOdeh61DO3 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-TqdZcCsOdeh61DO3 rect.text{fill:none;stroke-width:0;}#mermaid-svg-TqdZcCsOdeh61DO3 .icon-shape,#mermaid-svg-TqdZcCsOdeh61DO3 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-TqdZcCsOdeh61DO3 .icon-shape p,#mermaid-svg-TqdZcCsOdeh61DO3 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-TqdZcCsOdeh61DO3 .icon-shape .label rect,#mermaid-svg-TqdZcCsOdeh61DO3 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-TqdZcCsOdeh61DO3 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-TqdZcCsOdeh61DO3 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-TqdZcCsOdeh61DO3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 设计原则
自顶向下
逐步求精
模块化
限制goto
从整体到局部
逐步细化
功能分解
避免无序跳转

(二)自顶向下原则

自顶向下是从整体到局部的设计方法。

自顶向下过程
#mermaid-svg-IYXPpHPOz2aPee39{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IYXPpHPOz2aPee39 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IYXPpHPOz2aPee39 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IYXPpHPOz2aPee39 .error-icon{fill:#552222;}#mermaid-svg-IYXPpHPOz2aPee39 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IYXPpHPOz2aPee39 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IYXPpHPOz2aPee39 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IYXPpHPOz2aPee39 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IYXPpHPOz2aPee39 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IYXPpHPOz2aPee39 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IYXPpHPOz2aPee39 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IYXPpHPOz2aPee39 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IYXPpHPOz2aPee39 .marker.cross{stroke:#333333;}#mermaid-svg-IYXPpHPOz2aPee39 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IYXPpHPOz2aPee39 p{margin:0;}#mermaid-svg-IYXPpHPOz2aPee39 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IYXPpHPOz2aPee39 .cluster-label text{fill:#333;}#mermaid-svg-IYXPpHPOz2aPee39 .cluster-label span{color:#333;}#mermaid-svg-IYXPpHPOz2aPee39 .cluster-label span p{background-color:transparent;}#mermaid-svg-IYXPpHPOz2aPee39 .label text,#mermaid-svg-IYXPpHPOz2aPee39 span{fill:#333;color:#333;}#mermaid-svg-IYXPpHPOz2aPee39 .node rect,#mermaid-svg-IYXPpHPOz2aPee39 .node circle,#mermaid-svg-IYXPpHPOz2aPee39 .node ellipse,#mermaid-svg-IYXPpHPOz2aPee39 .node polygon,#mermaid-svg-IYXPpHPOz2aPee39 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IYXPpHPOz2aPee39 .rough-node .label text,#mermaid-svg-IYXPpHPOz2aPee39 .node .label text,#mermaid-svg-IYXPpHPOz2aPee39 .image-shape .label,#mermaid-svg-IYXPpHPOz2aPee39 .icon-shape .label{text-anchor:middle;}#mermaid-svg-IYXPpHPOz2aPee39 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IYXPpHPOz2aPee39 .rough-node .label,#mermaid-svg-IYXPpHPOz2aPee39 .node .label,#mermaid-svg-IYXPpHPOz2aPee39 .image-shape .label,#mermaid-svg-IYXPpHPOz2aPee39 .icon-shape .label{text-align:center;}#mermaid-svg-IYXPpHPOz2aPee39 .node.clickable{cursor:pointer;}#mermaid-svg-IYXPpHPOz2aPee39 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IYXPpHPOz2aPee39 .arrowheadPath{fill:#333333;}#mermaid-svg-IYXPpHPOz2aPee39 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IYXPpHPOz2aPee39 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IYXPpHPOz2aPee39 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IYXPpHPOz2aPee39 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IYXPpHPOz2aPee39 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IYXPpHPOz2aPee39 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IYXPpHPOz2aPee39 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IYXPpHPOz2aPee39 .cluster text{fill:#333;}#mermaid-svg-IYXPpHPOz2aPee39 .cluster span{color:#333;}#mermaid-svg-IYXPpHPOz2aPee39 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IYXPpHPOz2aPee39 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IYXPpHPOz2aPee39 rect.text{fill:none;stroke-width:0;}#mermaid-svg-IYXPpHPOz2aPee39 .icon-shape,#mermaid-svg-IYXPpHPOz2aPee39 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IYXPpHPOz2aPee39 .icon-shape p,#mermaid-svg-IYXPpHPOz2aPee39 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IYXPpHPOz2aPee39 .icon-shape .label rect,#mermaid-svg-IYXPpHPOz2aPee39 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IYXPpHPOz2aPee39 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IYXPpHPOz2aPee39 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IYXPpHPOz2aPee39 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 顶层模块
第二层模块
第二层模块
第三层模块
第三层模块
第三层模块

自顶向下示例

python 复制代码
# 自顶向下设计示例
# 学生成绩管理系统

# 顶层模块
def student_management_system():
    """学生成绩管理系统 - 顶层"""
    print("=== 学生成绩管理系统 ===")
    
    while True:
        show_menu()
        choice = get_user_choice()
        
        if choice == 1:
            input_scores()
        elif choice == 2:
            calculate_statistics()
        elif choice == 3:
            display_results()
        elif choice == 0:
            print("退出系统")
            break

# 第二层模块
def show_menu():
    """显示菜单"""
    print("\n1. 输入成绩")
    print("2. 计算统计")
    print("3. 显示结果")
    print("0. 退出")

def get_user_choice():
    """获取用户选择"""
    while True:
        try:
            choice = int(input("请选择:"))
            if 0 <= choice <= 3:
                return choice
            print("无效选择,请重新输入")
        except ValueError:
            print("请输入数字")

def input_scores():
    """输入成绩 - 第二层"""
    print("\n--- 输入成绩 ---")
    # 调用第三层模块
    scores = collect_scores()
    validate_scores(scores)
    return scores

def calculate_statistics():
    """计算统计 - 第二层"""
    print("\n--- 计算统计 ---")
    # 调用第三层模块
    scores = get_saved_scores()
    stats = compute_statistics(scores)
    display_statistics(stats)

def display_results():
    """显示结果 - 第二层"""
    print("\n--- 显示结果 ---")
    # 调用第三层模块
    scores = get_saved_scores()
    format_output(scores)

# 第三层模块
def collect_scores():
    """收集成绩"""
    scores = []
    while True:
        score = input("输入成绩(空行结束):")
        if score == "":
            break
        scores.append(float(score))
    return scores

def validate_scores(scores):
    """验证成绩"""
    for score in scores:
        if not 0 <= score <= 100:
            print(f"警告:成绩{score}超出范围")

def compute_statistics(scores):
    """计算统计数据"""
    if not scores:
        return None
    return {
        "count": len(scores),
        "sum": sum(scores),
        "avg": sum(scores) / len(scores),
        "max": max(scores),
        "min": min(scores)
    }

def display_statistics(stats):
    """显示统计结果"""
    if stats:
        print(f"人数:{stats['count']}")
        print(f"总分:{stats['sum']}")
        print(f"平均分:{stats['avg']:.2f}")
        print(f"最高分:{stats['max']}")
        print(f"最低分:{stats['min']}")

def format_output(scores):
    """格式化输出"""
    for i, score in enumerate(scores, 1):
        print(f"学生{i}: {score}")

# 辅助函数
def get_saved_scores():
    """获取保存的成绩"""
    return [85, 90, 78, 92, 88]

# 运行系统
# student_management_system()

(三)逐步求精原则

逐步求精是将复杂问题逐步分解为简单子问题。

逐步求精过程
#mermaid-svg-DGkeHWTtFGfaJIeo{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-DGkeHWTtFGfaJIeo .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-DGkeHWTtFGfaJIeo .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-DGkeHWTtFGfaJIeo .error-icon{fill:#552222;}#mermaid-svg-DGkeHWTtFGfaJIeo .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-DGkeHWTtFGfaJIeo .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-DGkeHWTtFGfaJIeo .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-DGkeHWTtFGfaJIeo .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-DGkeHWTtFGfaJIeo .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-DGkeHWTtFGfaJIeo .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-DGkeHWTtFGfaJIeo .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-DGkeHWTtFGfaJIeo .marker{fill:#333333;stroke:#333333;}#mermaid-svg-DGkeHWTtFGfaJIeo .marker.cross{stroke:#333333;}#mermaid-svg-DGkeHWTtFGfaJIeo svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-DGkeHWTtFGfaJIeo p{margin:0;}#mermaid-svg-DGkeHWTtFGfaJIeo .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-DGkeHWTtFGfaJIeo .cluster-label text{fill:#333;}#mermaid-svg-DGkeHWTtFGfaJIeo .cluster-label span{color:#333;}#mermaid-svg-DGkeHWTtFGfaJIeo .cluster-label span p{background-color:transparent;}#mermaid-svg-DGkeHWTtFGfaJIeo .label text,#mermaid-svg-DGkeHWTtFGfaJIeo span{fill:#333;color:#333;}#mermaid-svg-DGkeHWTtFGfaJIeo .node rect,#mermaid-svg-DGkeHWTtFGfaJIeo .node circle,#mermaid-svg-DGkeHWTtFGfaJIeo .node ellipse,#mermaid-svg-DGkeHWTtFGfaJIeo .node polygon,#mermaid-svg-DGkeHWTtFGfaJIeo .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-DGkeHWTtFGfaJIeo .rough-node .label text,#mermaid-svg-DGkeHWTtFGfaJIeo .node .label text,#mermaid-svg-DGkeHWTtFGfaJIeo .image-shape .label,#mermaid-svg-DGkeHWTtFGfaJIeo .icon-shape .label{text-anchor:middle;}#mermaid-svg-DGkeHWTtFGfaJIeo .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-DGkeHWTtFGfaJIeo .rough-node .label,#mermaid-svg-DGkeHWTtFGfaJIeo .node .label,#mermaid-svg-DGkeHWTtFGfaJIeo .image-shape .label,#mermaid-svg-DGkeHWTtFGfaJIeo .icon-shape .label{text-align:center;}#mermaid-svg-DGkeHWTtFGfaJIeo .node.clickable{cursor:pointer;}#mermaid-svg-DGkeHWTtFGfaJIeo .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-DGkeHWTtFGfaJIeo .arrowheadPath{fill:#333333;}#mermaid-svg-DGkeHWTtFGfaJIeo .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-DGkeHWTtFGfaJIeo .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-DGkeHWTtFGfaJIeo .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DGkeHWTtFGfaJIeo .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-DGkeHWTtFGfaJIeo .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DGkeHWTtFGfaJIeo .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-DGkeHWTtFGfaJIeo .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-DGkeHWTtFGfaJIeo .cluster text{fill:#333;}#mermaid-svg-DGkeHWTtFGfaJIeo .cluster span{color:#333;}#mermaid-svg-DGkeHWTtFGfaJIeo div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-DGkeHWTtFGfaJIeo .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-DGkeHWTtFGfaJIeo rect.text{fill:none;stroke-width:0;}#mermaid-svg-DGkeHWTtFGfaJIeo .icon-shape,#mermaid-svg-DGkeHWTtFGfaJIeo .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-DGkeHWTtFGfaJIeo .icon-shape p,#mermaid-svg-DGkeHWTtFGfaJIeo .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-DGkeHWTtFGfaJIeo .icon-shape .label rect,#mermaid-svg-DGkeHWTtFGfaJIeo .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-DGkeHWTtFGfaJIeo .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-DGkeHWTtFGfaJIeo .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-DGkeHWTtFGfaJIeo :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 问题
初步解
细化1
细化2
细化3
最终解

逐步求精示例

python 复制代码
# 逐步求精示例
# 问题:找出100以内的素数

# 第一步:初步解
def find_primes_v1():
    """找出100以内的素数 - 初步"""
    primes = []
    for n in range(2, 101):
        if is_prime(n):
            primes.append(n)
    return primes

# 第二步:细化is_prime函数
def is_prime_v1(n):
    """判断素数 - 细化1"""
    if n < 2:
        return False
    for i in range(2, n):
        if n % i == 0:
            return False
    return True

# 第三步:优化is_prime函数
def is_prime_v2(n):
    """判断素数 - 细化2"""
    if n < 2:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    # 只需检查到sqrt(n)
    for i in range(3, int(n**0.5) + 1, 2):
        if n % i == 0:
            return False
    return True

# 第四步:最终优化
def is_prime(n):
    """判断素数 - 最终版本"""
    if n < 2:
        return False
    if n in (2, 3):
        return True
    if n % 2 == 0 or n % 3 == 0:
        return False
    i = 5
    while i * i <= n:
        if n % i == 0 or n % (i + 2) == 0:
            return False
        i += 6
    return True

def find_primes():
    """找出100以内的素数 - 最终版本"""
    return [n for n in range(2, 101) if is_prime(n)]

# 测试
primes = find_primes()
print(f"100以内的素数:{primes}")
print(f"共{len(primes)}个素数")

(四)模块化原则

模块化是将程序分解为独立的模块。

模块化优点

优点 说明
可理解 模块功能单一
可测试 模块独立测试
可维护 模块独立维护
可复用 模块可以复用

模块化示例

python 复制代码
# 模块化示例
# 图书管理系统

# 模块1:数据模块
class BookData:
    """图书数据模块"""
    
    def __init__(self):
        self.books = {}
    
    def add_book(self, book_id, title, author):
        """添加图书"""
        self.books[book_id] = {
            "title": title,
            "author": author,
            "is_borrowed": False
        }
    
    def get_book(self, book_id):
        """获取图书"""
        return self.books.get(book_id)
    
    def get_all_books(self):
        """获取所有图书"""
        return self.books

# 模块2:业务模块
class BookService:
    """图书业务模块"""
    
    def __init__(self, data_module):
        self.data = data_module
    
    def borrow_book(self, book_id):
        """借阅图书"""
        book = self.data.get_book(book_id)
        if book and not book["is_borrowed"]:
            book["is_borrowed"] = True
            return True
        return False
    
    def return_book(self, book_id):
        """归还图书"""
        book = self.data.get_book(book_id)
        if book and book["is_borrowed"]:
            book["is_borrowed"] = False
            return True
        return False

# 模块3:界面模块
class BookView:
    """图书界面模块"""
    
    def __init__(self, service_module):
        self.service = service_module
    
    def display_books(self, books):
        """显示图书"""
        print("\n=== 图书列表 ===")
        for book_id, book in books.items():
            status = "已借出" if book["is_borrowed"] else "可借阅"
            print(f"{book_id}: 《{book['title']}》- {book['author']} [{status}]")
    
    def display_message(self, message):
        """显示消息"""
        print(f"\n{message}")

# 主程序
def main():
    """主程序"""
    # 创建模块
    data = BookData()
    service = BookService(data)
    view = BookView(service)
    
    # 添加图书
    data.add_book("B001", "Python编程", "张三")
    data.add_book("B002", "Java编程", "李四")
    data.add_book("B003", "C++编程", "王五")
    
    # 显示图书
    view.display_books(data.get_all_books())
    
    # 借阅图书
    if service.borrow_book("B001"):
        view.display_message("借阅成功")
    
    # 再次显示
    view.display_books(data.get_all_books())

# 运行
# main()

(五)限制goto原则

限制goto是避免使用goto语句。

goto的问题

问题 说明
破坏结构 破坏程序结构
难以理解 难以理解程序流程
难以维护 难以维护和修改
难以测试 难以测试程序

goto替代方案

python 复制代码
# goto替代方案示例

# 问题:使用goto的代码(Python不支持goto,用注释说明)
"""
# 使用goto的代码(伪代码)
i = 0
loop:
    if i >= 10:
        goto end
    print(i)
    i += 1
    goto loop
end:
    print("结束")
"""

# 替代方案1:使用while循环
i = 0
while i < 10:
    print(i)
    i += 1
print("结束")

# 替代方案2:使用for循环
for i in range(10):
    print(i)
print("结束")

# 问题:使用goto跳出多层循环(伪代码)
"""
for i in range(10):
    for j in range(10):
        if condition:
            goto end
end:
"""

# 替代方案:使用标志变量
found = False
for i in range(10):
    for j in range(10):
        if i == 5 and j == 5:
            found = True
            break
    if found:
        break
print(f"找到:{i}, {j}")

# 替代方案:使用函数和return
def search():
    for i in range(10):
        for j in range(10):
            if i == 5 and j == 5:
                return i, j
    return None

result = search()
print(f"找到:{result}")

# 替代方案:使用异常
class FoundException(Exception):
    pass

try:
    for i in range(10):
        for j in range(10):
            if i == 5 and j == 5:
                raise FoundException()
except FoundException:
    print(f"找到:{i}, {j}")

💡 四、结构化程序设计的方法

(一)方法概述

结构化程序设计方法
#mermaid-svg-EzJ4nZu9JSYB8Snn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-EzJ4nZu9JSYB8Snn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-EzJ4nZu9JSYB8Snn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-EzJ4nZu9JSYB8Snn .error-icon{fill:#552222;}#mermaid-svg-EzJ4nZu9JSYB8Snn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-EzJ4nZu9JSYB8Snn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-EzJ4nZu9JSYB8Snn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-EzJ4nZu9JSYB8Snn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-EzJ4nZu9JSYB8Snn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-EzJ4nZu9JSYB8Snn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-EzJ4nZu9JSYB8Snn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-EzJ4nZu9JSYB8Snn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-EzJ4nZu9JSYB8Snn .marker.cross{stroke:#333333;}#mermaid-svg-EzJ4nZu9JSYB8Snn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-EzJ4nZu9JSYB8Snn p{margin:0;}#mermaid-svg-EzJ4nZu9JSYB8Snn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-EzJ4nZu9JSYB8Snn .cluster-label text{fill:#333;}#mermaid-svg-EzJ4nZu9JSYB8Snn .cluster-label span{color:#333;}#mermaid-svg-EzJ4nZu9JSYB8Snn .cluster-label span p{background-color:transparent;}#mermaid-svg-EzJ4nZu9JSYB8Snn .label text,#mermaid-svg-EzJ4nZu9JSYB8Snn span{fill:#333;color:#333;}#mermaid-svg-EzJ4nZu9JSYB8Snn .node rect,#mermaid-svg-EzJ4nZu9JSYB8Snn .node circle,#mermaid-svg-EzJ4nZu9JSYB8Snn .node ellipse,#mermaid-svg-EzJ4nZu9JSYB8Snn .node polygon,#mermaid-svg-EzJ4nZu9JSYB8Snn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-EzJ4nZu9JSYB8Snn .rough-node .label text,#mermaid-svg-EzJ4nZu9JSYB8Snn .node .label text,#mermaid-svg-EzJ4nZu9JSYB8Snn .image-shape .label,#mermaid-svg-EzJ4nZu9JSYB8Snn .icon-shape .label{text-anchor:middle;}#mermaid-svg-EzJ4nZu9JSYB8Snn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-EzJ4nZu9JSYB8Snn .rough-node .label,#mermaid-svg-EzJ4nZu9JSYB8Snn .node .label,#mermaid-svg-EzJ4nZu9JSYB8Snn .image-shape .label,#mermaid-svg-EzJ4nZu9JSYB8Snn .icon-shape .label{text-align:center;}#mermaid-svg-EzJ4nZu9JSYB8Snn .node.clickable{cursor:pointer;}#mermaid-svg-EzJ4nZu9JSYB8Snn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-EzJ4nZu9JSYB8Snn .arrowheadPath{fill:#333333;}#mermaid-svg-EzJ4nZu9JSYB8Snn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-EzJ4nZu9JSYB8Snn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-EzJ4nZu9JSYB8Snn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EzJ4nZu9JSYB8Snn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-EzJ4nZu9JSYB8Snn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EzJ4nZu9JSYB8Snn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-EzJ4nZu9JSYB8Snn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-EzJ4nZu9JSYB8Snn .cluster text{fill:#333;}#mermaid-svg-EzJ4nZu9JSYB8Snn .cluster span{color:#333;}#mermaid-svg-EzJ4nZu9JSYB8Snn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-EzJ4nZu9JSYB8Snn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-EzJ4nZu9JSYB8Snn rect.text{fill:none;stroke-width:0;}#mermaid-svg-EzJ4nZu9JSYB8Snn .icon-shape,#mermaid-svg-EzJ4nZu9JSYB8Snn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-EzJ4nZu9JSYB8Snn .icon-shape p,#mermaid-svg-EzJ4nZu9JSYB8Snn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-EzJ4nZu9JSYB8Snn .icon-shape .label rect,#mermaid-svg-EzJ4nZu9JSYB8Snn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-EzJ4nZu9JSYB8Snn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-EzJ4nZu9JSYB8Snn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-EzJ4nZu9JSYB8Snn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 设计方法
自顶向下
逐步求精
模块化设计
结构图
从整体到局部
逐步细化
功能分解
模块结构

(二)自顶向下设计

自顶向下设计是从整体到局部的设计过程。

自顶向下设计步骤

步骤 说明
确定顶层 确定系统顶层模块
分解功能 将功能分解为子功能
逐层细化 逐层细化每个模块
实现模块 实现底层模块

自顶向下设计示例

python 复制代码
# 自顶向下设计示例
# 计算器程序

# 顶层:主程序
def calculator():
    """计算器主程序"""
    print("=== 简单计算器 ===")
    
    while True:
        # 获取输入
        expression = get_input()
        
        if expression.lower() == 'q':
            break
        
        # 处理表达式
        result = process_expression(expression)
        
        # 显示结果
        display_result(result)

# 第二层:获取输入
def get_input():
    """获取用户输入"""
    return input("输入表达式(q退出):")

# 第二层:处理表达式
def process_expression(expression):
    """处理表达式"""
    try:
        # 解析表达式
        left, op, right = parse_expression(expression)
        
        # 计算结果
        result = calculate(left, op, right)
        
        return result
    except Exception as e:
        return f"错误:{e}"

# 第二层:显示结果
def display_result(result):
    """显示结果"""
    print(f"结果:{result}")

# 第三层:解析表达式
def parse_expression(expression):
    """解析表达式"""
    # 简单解析:数字 运算符 数字
    parts = expression.split()
    if len(parts) != 3:
        raise ValueError("格式错误,应为:数字 运算符 数字")
    
    left = float(parts[0])
    op = parts[1]
    right = float(parts[2])
    
    return left, op, right

# 第三层:计算
def calculate(left, op, right):
    """计算结果"""
    if op == '+':
        return left + right
    elif op == '-':
        return left - right
    elif op == '*':
        return left * right
    elif op == '/':
        if right == 0:
            raise ValueError("除数不能为零")
        return left / right
    else:
        raise ValueError(f"不支持的运算符:{op}")

# 运行计算器
# calculator()

(三)逐步求精方法

逐步求精是将抽象描述逐步具体化。

逐步求精过程
#mermaid-svg-sOmlbb6jwa0TQeZN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sOmlbb6jwa0TQeZN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sOmlbb6jwa0TQeZN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sOmlbb6jwa0TQeZN .error-icon{fill:#552222;}#mermaid-svg-sOmlbb6jwa0TQeZN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sOmlbb6jwa0TQeZN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sOmlbb6jwa0TQeZN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sOmlbb6jwa0TQeZN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sOmlbb6jwa0TQeZN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sOmlbb6jwa0TQeZN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sOmlbb6jwa0TQeZN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sOmlbb6jwa0TQeZN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sOmlbb6jwa0TQeZN .marker.cross{stroke:#333333;}#mermaid-svg-sOmlbb6jwa0TQeZN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sOmlbb6jwa0TQeZN p{margin:0;}#mermaid-svg-sOmlbb6jwa0TQeZN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sOmlbb6jwa0TQeZN .cluster-label text{fill:#333;}#mermaid-svg-sOmlbb6jwa0TQeZN .cluster-label span{color:#333;}#mermaid-svg-sOmlbb6jwa0TQeZN .cluster-label span p{background-color:transparent;}#mermaid-svg-sOmlbb6jwa0TQeZN .label text,#mermaid-svg-sOmlbb6jwa0TQeZN span{fill:#333;color:#333;}#mermaid-svg-sOmlbb6jwa0TQeZN .node rect,#mermaid-svg-sOmlbb6jwa0TQeZN .node circle,#mermaid-svg-sOmlbb6jwa0TQeZN .node ellipse,#mermaid-svg-sOmlbb6jwa0TQeZN .node polygon,#mermaid-svg-sOmlbb6jwa0TQeZN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sOmlbb6jwa0TQeZN .rough-node .label text,#mermaid-svg-sOmlbb6jwa0TQeZN .node .label text,#mermaid-svg-sOmlbb6jwa0TQeZN .image-shape .label,#mermaid-svg-sOmlbb6jwa0TQeZN .icon-shape .label{text-anchor:middle;}#mermaid-svg-sOmlbb6jwa0TQeZN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sOmlbb6jwa0TQeZN .rough-node .label,#mermaid-svg-sOmlbb6jwa0TQeZN .node .label,#mermaid-svg-sOmlbb6jwa0TQeZN .image-shape .label,#mermaid-svg-sOmlbb6jwa0TQeZN .icon-shape .label{text-align:center;}#mermaid-svg-sOmlbb6jwa0TQeZN .node.clickable{cursor:pointer;}#mermaid-svg-sOmlbb6jwa0TQeZN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sOmlbb6jwa0TQeZN .arrowheadPath{fill:#333333;}#mermaid-svg-sOmlbb6jwa0TQeZN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sOmlbb6jwa0TQeZN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sOmlbb6jwa0TQeZN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sOmlbb6jwa0TQeZN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sOmlbb6jwa0TQeZN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sOmlbb6jwa0TQeZN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sOmlbb6jwa0TQeZN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sOmlbb6jwa0TQeZN .cluster text{fill:#333;}#mermaid-svg-sOmlbb6jwa0TQeZN .cluster span{color:#333;}#mermaid-svg-sOmlbb6jwa0TQeZN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sOmlbb6jwa0TQeZN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sOmlbb6jwa0TQeZN rect.text{fill:none;stroke-width:0;}#mermaid-svg-sOmlbb6jwa0TQeZN .icon-shape,#mermaid-svg-sOmlbb6jwa0TQeZN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sOmlbb6jwa0TQeZN .icon-shape p,#mermaid-svg-sOmlbb6jwa0TQeZN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sOmlbb6jwa0TQeZN .icon-shape .label rect,#mermaid-svg-sOmlbb6jwa0TQeZN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sOmlbb6jwa0TQeZN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sOmlbb6jwa0TQeZN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sOmlbb6jwa0TQeZN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 抽象描述
初步细化
进一步细化
具体实现
问题描述
算法框架
详细算法
代码实现

逐步求精示例

python 复制代码
# 逐步求精示例
# 问题:对数组进行排序

# 第一步:抽象描述
"""
对数组进行排序,使元素按升序排列
"""

# 第二步:初步细化
"""
1. 遍历数组
2. 比较相邻元素
3. 如果前一个大于后一个,交换
4. 重复直到排序完成
"""

# 第三步:进一步细化
def sort_array_v1(arr):
    """排序数组 - 版本1"""
    n = len(arr)
    for i in range(n):
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                # 交换
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr

# 第四步:优化细化
def sort_array_v2(arr):
    """排序数组 - 版本2(优化)"""
    n = len(arr)
    for i in range(n):
        swapped = False
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                swapped = True
        # 如果没有交换,说明已经排序完成
        if not swapped:
            break
    return arr

# 第五步:最终实现
def sort_array(arr):
    """排序数组 - 最终版本"""
    if not arr:
        return arr
    
    arr = arr.copy()  # 不修改原数组
    n = len(arr)
    
    for i in range(n):
        swapped = False
        for j in range(0, n - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                swapped = True
        if not swapped:
            break
    
    return arr

# 测试
test_array = [64, 34, 25, 12, 22, 11, 90]
sorted_array = sort_array(test_array)
print(f"原数组:{test_array}")
print(f"排序后:{sorted_array}")

📊 五、结构化程序设计的工具

(一)工具概述

结构化程序设计工具

工具 说明
流程图 传统图形工具
N-S图 盒图
PAD图 问题分析图
结构图 模块结构图

(二)N-S图

N-S图(Nassi-Shneiderman图)又称盒图,是结构化程序设计的图形工具。

N-S图特点

特点 说明
无箭头 没有流程线
嵌套清晰 结构清晰可见
强制结构化 只能表示结构化程序

N-S图示例

复制代码
顺序结构:
┌─────────────┐
│   语句A     │
├─────────────┤
│   语句B     │
└─────────────┘

选择结构:
┌────────┬────────┐
│ 条件P  │        │
│   T    │   F    │
│ 语句A  │ 语句B  │
└────────┴────────┘

循环结构:
┌─────────────────┐
│ while 条件P     │
│   语句A         │
└─────────────────┘

N-S图代码示例

python 复制代码
# N-S图对应的代码
# 问题:计算1到100的偶数和

# N-S图表示:
"""
┌─────────────────────────┐
│ total = 0               │
│ i = 2                   │
├─────────────────────────┤
│ while i <= 100          │
│ ┌─────────────────────┐ │
│ │ total = total + i   │ │
│ │ i = i + 2           │ │
│ └─────────────────────┘ │
├─────────────────────────┤
│ print(total)            │
└─────────────────────────┘
"""

# 对应代码
total = 0
i = 2
while i <= 100:
    total = total + i
    i = i + 2
print(f"1到100的偶数和:{total}")

(三)PAD图

PAD图(Problem Analysis Diagram)是问题分析图。

PAD图特点

特点 说明
树形结构 从左到右展开
层次清晰 层次关系明确
易于转换 易于转换为代码

PAD图示例

复制代码
PAD图表示:
          ┌─ total=0
          ├─ i=2
     ┌────┤
     │    └─ while i<=100 ─┬─ total=total+i
     │                     └─ i=i+2
程序─┤
     │
     └──── print(total)

PAD图代码示例

python 复制代码
# PAD图对应的代码
# 问题:判断一个数是否为素数

# PAD图表示:
"""
          ┌─ 输入n
     ┌────┤
     │    └─ if n<2 ──── 输出"不是素数"
     │
     │         ┌─ i=2
     │    ┌────┤
程序─┤    │    └─ while i*i<=n ─┬─ if n%i==0 ── 输出"不是素数"
     │    │                     └─ i=i+1
     │    │
     └────┴──── 输出"是素数"
"""

# 对应代码
def is_prime_pad():
    n = int(input("输入一个数:"))
    
    if n < 2:
        print("不是素数")
        return
    
    i = 2
    while i * i <= n:
        if n % i == 0:
            print("不是素数")
            return
        i = i + 1
    
    print("是素数")

# is_prime_pad()

(四)结构图

结构图描述系统的模块结构。

结构图示例
#mermaid-svg-b6QV9v52sIbU9nVg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-b6QV9v52sIbU9nVg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-b6QV9v52sIbU9nVg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-b6QV9v52sIbU9nVg .error-icon{fill:#552222;}#mermaid-svg-b6QV9v52sIbU9nVg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-b6QV9v52sIbU9nVg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-b6QV9v52sIbU9nVg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-b6QV9v52sIbU9nVg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-b6QV9v52sIbU9nVg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-b6QV9v52sIbU9nVg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-b6QV9v52sIbU9nVg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-b6QV9v52sIbU9nVg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-b6QV9v52sIbU9nVg .marker.cross{stroke:#333333;}#mermaid-svg-b6QV9v52sIbU9nVg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-b6QV9v52sIbU9nVg p{margin:0;}#mermaid-svg-b6QV9v52sIbU9nVg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-b6QV9v52sIbU9nVg .cluster-label text{fill:#333;}#mermaid-svg-b6QV9v52sIbU9nVg .cluster-label span{color:#333;}#mermaid-svg-b6QV9v52sIbU9nVg .cluster-label span p{background-color:transparent;}#mermaid-svg-b6QV9v52sIbU9nVg .label text,#mermaid-svg-b6QV9v52sIbU9nVg span{fill:#333;color:#333;}#mermaid-svg-b6QV9v52sIbU9nVg .node rect,#mermaid-svg-b6QV9v52sIbU9nVg .node circle,#mermaid-svg-b6QV9v52sIbU9nVg .node ellipse,#mermaid-svg-b6QV9v52sIbU9nVg .node polygon,#mermaid-svg-b6QV9v52sIbU9nVg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-b6QV9v52sIbU9nVg .rough-node .label text,#mermaid-svg-b6QV9v52sIbU9nVg .node .label text,#mermaid-svg-b6QV9v52sIbU9nVg .image-shape .label,#mermaid-svg-b6QV9v52sIbU9nVg .icon-shape .label{text-anchor:middle;}#mermaid-svg-b6QV9v52sIbU9nVg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-b6QV9v52sIbU9nVg .rough-node .label,#mermaid-svg-b6QV9v52sIbU9nVg .node .label,#mermaid-svg-b6QV9v52sIbU9nVg .image-shape .label,#mermaid-svg-b6QV9v52sIbU9nVg .icon-shape .label{text-align:center;}#mermaid-svg-b6QV9v52sIbU9nVg .node.clickable{cursor:pointer;}#mermaid-svg-b6QV9v52sIbU9nVg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-b6QV9v52sIbU9nVg .arrowheadPath{fill:#333333;}#mermaid-svg-b6QV9v52sIbU9nVg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-b6QV9v52sIbU9nVg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-b6QV9v52sIbU9nVg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-b6QV9v52sIbU9nVg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-b6QV9v52sIbU9nVg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-b6QV9v52sIbU9nVg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-b6QV9v52sIbU9nVg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-b6QV9v52sIbU9nVg .cluster text{fill:#333;}#mermaid-svg-b6QV9v52sIbU9nVg .cluster span{color:#333;}#mermaid-svg-b6QV9v52sIbU9nVg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-b6QV9v52sIbU9nVg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-b6QV9v52sIbU9nVg rect.text{fill:none;stroke-width:0;}#mermaid-svg-b6QV9v52sIbU9nVg .icon-shape,#mermaid-svg-b6QV9v52sIbU9nVg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-b6QV9v52sIbU9nVg .icon-shape p,#mermaid-svg-b6QV9v52sIbU9nVg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-b6QV9v52sIbU9nVg .icon-shape .label rect,#mermaid-svg-b6QV9v52sIbU9nVg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-b6QV9v52sIbU9nVg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-b6QV9v52sIbU9nVg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-b6QV9v52sIbU9nVg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 主程序
输入模块
处理模块
输出模块
解析模块
计算模块
获取输入
显示结果

结构图代码示例

python 复制代码
# 结构图对应的代码
# 学生成绩管理系统

# 主程序
def main():
    """主程序"""
    scores = input_module()
    results = process_module(scores)
    output_module(results)

# 输入模块
def input_module():
    """输入模块"""
    return get_input()

def get_input():
    """获取输入"""
    scores = []
    while True:
        score = input("输入成绩(空行结束):")
        if score == "":
            break
        scores.append(float(score))
    return scores

# 处理模块
def process_module(scores):
    """处理模块"""
    parsed = parse_module(scores)
    calculated = calculate_module(parsed)
    return calculated

def parse_module(scores):
    """解析模块"""
    return [s for s in scores if 0 <= s <= 100]

def calculate_module(scores):
    """计算模块"""
    if not scores:
        return None
    return {
        "count": len(scores),
        "sum": sum(scores),
        "avg": sum(scores) / len(scores),
        "max": max(scores),
        "min": min(scores)
    }

# 输出模块
def output_module(results):
    """输出模块"""
    display_results(results)

def display_results(results):
    """显示结果"""
    if results:
        print(f"人数:{results['count']}")
        print(f"总分:{results['sum']}")
        print(f"平均分:{results['avg']:.2f}")
        print(f"最高分:{results['max']}")
        print(f"最低分:{results['min']}")
    else:
        print("没有有效成绩")

# 运行
# main()

📝 六、结构化程序设计的优缺点

(一)优点

结构化程序设计优点

优点 说明
结构清晰 程序结构清晰
易于理解 易于理解和阅读
易于维护 易于维护和修改
易于测试 易于测试和调试
可靠性高 程序可靠性高

(二)缺点

结构化程序设计缺点

缺点 说明
数据与操作分离 数据和操作分离
不适合大型系统 不适合大型复杂系统
复用性有限 代码复用性有限
开发效率低 开发效率相对较低

(三)与面向对象的比较

结构化与面向对象比较

方面 结构化 面向对象
核心 功能 对象
基本单位 函数
数据与操作 分离 封装
复用方式 函数复用 继承复用
适用规模 中小型 大型

📝 总结

结构化程序设计是一种重要的程序设计方法学。

🎯 结构化程序设计概述

  • 定义:使用顺序、选择、循环三种基本结构
  • 历史:1966年Bohm-Jacopini定理,1968年Dijkstra反对goto
  • 特点:自顶向下、逐步求精、模块化、限制goto

💡 三种基本结构

  • 顺序结构:按顺序执行
  • 选择结构:if、if-else、if-elif-else
  • 循环结构:while、for

📦 设计原则

  • 自顶向下:从整体到局部
  • 逐步求精:逐步细化
  • 模块化:功能分解
  • 限制goto:避免无序跳转

🌐 设计方法

  • 自顶向下设计:从顶层开始
  • 逐步求精方法:逐步具体化

📊 设计工具

  • N-S图:盒图,无箭头
  • PAD图:问题分析图,树形结构
  • 结构图:模块结构图

核心启示:结构化程序设计是程序设计的基础方法,它通过限制程序的控制流结构,使程序具有清晰的结构和良好的可读性。虽然面向对象方法已经成为主流,但结构化程序设计的思想仍然是程序设计的基础。在实际工作中,我们需要注意:第一,掌握三种基本控制结构;第二,遵循自顶向下、逐步求精的设计方法;第三,合理划分模块,提高代码的可维护性;第四,避免使用goto语句;第五,根据项目规模选择合适的设计方法。记住:好的程序结构是软件质量的基础。


相关推荐
梁辰兴4 小时前
软件工程:程序设计风格
软件工程·代码重构·命名规范·程序设计风格·代码格式·注释规范·良好习惯
xierui12312317 小时前
OpenAI 拟停止向 Cursor供模:如何设计不绑供应商的AIAgent架构
人工智能·系统架构·软件工程
智造ERP规划1 天前
装备制造 ERP↔WMS 集成深度拆解:大型物料、项目专属库与齐套管理的 6 个核心场景
系统架构·软件工程·制造
郝学胜-神的一滴2 天前
Effective Python 条款4:字符串格式化大乱斗
开发语言·网络·python·程序人生·软件工程
xierui1231232 天前
长时间运行的AI Agent 如何安全停机:预算、熔断、人工接管与状态回读
人工智能·软件工程
老郑聊AI业财智造2 天前
从“思考-行动”到“知行合一”:ReActAgent的架构原理与工程实践全景剖析
人工智能·架构·系统架构·软件工程·软件构建
梁辰兴3 天前
软件工程:程序设计语言的分类
软件工程·梁辰兴·按发展历史分类·程序设计语言的分类·按编程范式分类·按执行方式分类·按应用领域分类
老郑聊AI业财智造3 天前
数据不搬家,也能做检索:Milvus的“湖原生”架构革命
人工智能·ai·架构·软件工程·软件构建·milvus
梁辰兴3 天前
软件工程:系统设计
软件工程·设计原则·系统设计·设计工具·设计方法·梁辰兴·设计阶段