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

📌目录



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

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

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

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

结构化程序设计(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语句;第五,根据项目规模选择合适的设计方法。记住:好的程序结构是软件质量的基础。


相关推荐
抓到一只狗1 小时前
系统分析师——统一建模语言
软件工程·uml·类图·用例图·系统分析师·顺序图·高级软考
guslegend1 天前
从需求分析到 Spec-Kit 落地:三种思维、施工方案与规格驱动开发
aigc·软件工程·需求分析·ai编程·spec-kit
llilian_161 天前
失真度校准装置有哪些重点指标?失真度测量仪校准
功能测试·嵌入式硬件·51单片机·软件工程
谢亮_vipxieliang2 天前
软件工程的全景地图:从知识体系到技术栈
软件工程
ggb喔2 天前
52pojie 的桌面工具:为什么它们总在高分屏上模糊、资源管理器重启后失效
windows·python·网络安全·软件工程·个人开发·用户界面·用户体验
seconp3 天前
AI 时代怎么做计算机毕业设计?
人工智能·毕业设计·软件工程·课程设计·毕设
郝学胜-神的一滴3 天前
C++ Templates 07:编译报错和调试手段与实战技巧
开发语言·c++·后端·软件工程·visual studio
小南知更鸟3 天前
飞利浦KeyLink软件分享下载
软件工程
RockHopper20254 天前
AI时代模型生命周期与软件资产重构:概要版
人工智能·系统架构·软件工程·ai编程·世界模型
記億揺晃着的那天5 天前
【Agent 架构实战】大模型长期项目开发:决策文档生命周期管理与 CI 门禁治理
软件工程·devops·架构设计·ai agent·文档管理