1. 从抽象到具象为什么我们需要PAD图和N-S图很多刚接触软件工程或者准备相关考试的朋友一看到“PAD图”、“N-S图”这些词就有点发怵觉得又是两个枯燥难懂的“理论图”。我刚开始学的时候也这么想总觉得写代码不就行了吗干嘛还要费劲画图直到后来自己参与的项目越来越大代码写到后面自己都看不懂了才明白这些图的价值。它们根本不是用来应付考试的“花架子”而是我们理清复杂逻辑、高效沟通设计的“神器”。简单来说PDL语言过程设计语言就像你用文字写的“菜谱”它描述了做菜的步骤先放油再放菜炒三分钟但不够直观。而PAD图和N-S图就是把这份文字菜谱变成了一张清晰的“烹饪流程图”。谁先谁后哪里需要判断火候哪里需要循环翻炒一目了然。尤其是在团队协作时你不可能拉着每个人一行行读你的伪代码来解释逻辑一张结构清晰的图能让后端、前端、测试同学在几分钟内就理解你的核心设计思路避免大量的沟通误解。所以这篇文章的目的很实在我们不空谈理论就解决一个具体问题——当老师或项目经理扔给你一段PDL语言描述时你如何一步步把它变成标准的PAD图和N-S图。我会用我踩过坑、总结出的方法手把手带你走完从分析到绘制的全过程。你会发现一旦掌握了核心的“翻译”逻辑这其实就像搭积木一样有规律可循远没有想象中那么难。2. 绘制前的“破译”理解PDL语言的五种核心结构想把PDL“翻译”成图第一步不是急着动笔而是当好一个“翻译官”准确理解PDL在说什么。PDL虽然像高级语言但它只关注控制结构不关心具体语法细节。无论题目给出的描述看起来多复杂都逃不出以下五种基本结构的组合。这是我们所有绘图工作的基石必须吃透。1. 顺序型结构这是最简单的一种就是“做完A再做B然后做C”。在PDL里通常就是一系列语句按顺序排列用分号隔开。例如处理用户输入验证数据保存到数据库。在图形中它表现为几个处理框从上到下依次排列。2. 选择型结构IF-THEN-ELSE这就是我们常说的“如果...那么...否则...”。PDL中典型的写法是IF 条件 THEN 处理A ELSE 处理B ENDIF;。关键在于它一定会有一个判断条件并且有两条明确的分支路径即使ELSE分支什么也不做在逻辑上也是存在的。绘图时我们需要用一个判断框来引出两个分支。3. WHILE型循环先判断后执行这种循环的特点是“先问再做”。只要条件成立就重复执行循环体。PDL写法WHILE 条件 DO 处理 ENDWHILE;。比如WHILE 文件未读完 DO 读取一行数据 ENDWHILE;。在画图时我们需要把判断条件放在循环体的入口处。4. UNTIL型循环先执行后判断它和WHILE相反是“先做一次再问”。至少执行一次循环体然后再判断条件如果条件不成立则继续循环。PDL写法REPEAT 处理 UNTIL 条件;。例如REPEAT 弹出登录框 UNTIL 密码验证成功;。绘图时循环体在前判断条件在后。5. 多情况选择型CASE型当判断条件有多种可能取值并且每个值对应不同的处理时使用。PDL中可能写为CASE OF 变量: 值1: 处理1; 值2: 处理2; ... ENDCASE;。这就像是多个IF-THEN-ELSE的简化组合绘图时需要表达出多个并列的分支选择。我个人的经验是拿到一段PDL后先用笔把这五种结构标记出来。把一层套一层的复杂结构像剥洋葱一样从最外层开始识别。比如最外层是一个顺序结构里面第三步是个循环循环体里又嵌套了一个选择结构……先理清这个层次关系绘图时就不会乱。3. N-S图实战像拼“乐高”一样构建矩形盒图N-S图最大的特点就是“盒子套盒子”所有结构都封装在矩形框内没有流程线结构非常紧凑能强制性地体现结构化程序设计的思想。下面我们就用原始文章里的那个例子来完整走一遍绘制流程。假设我们有一段PDL描述如下这是经典考题结构A; REPEAT B; IF x0 THEN x1; ELSE x2; ENDIF; C; IF y0 THEN y1; IF z0 THEN z1; ELSE z2; ENDIF; S2; ELSE y2; ENDIF; UNTIL 条件; D;### 3.1 第一步划分代码块与确定最外层结构不要一上来就钻到细节里。首先通读整段代码找出最大的、顶层的结构。很明显这段代码以A;开始以D;结束中间是一个REPEAT ... UNTIL循环。所以最外层是一个顺序结构包含三个部分A、循环、D。在N-S图中我们首先画一个大的矩形框代表这个顺序结构。然后在这个大框内部从上到下划分出三个并列的“子框”分别对应A、循环和D。此时循环部分我们先用一个框表示里面写上“REPEAT-UNTIL循环”细节稍后展开。### 3.2 第二步分解循环结构REPEAT-UNTIL现在我们聚焦中间那个最复杂的循环块。REPEAT-UNTIL是后判断循环在N-S图中有其固定画法一个矩形框内部先画循环体然后在循环体的下方画一个条件判断框通常用菱形或带条件描述的框条件框外会标注“UNTIL 条件”。所以我们在这个循环框内先画循环体的内容。循环体是什么呢就是从第一个B;到ENDIF;第二个IF的结束的所有内容。仔细看循环体本身又是一个顺序结构包含了B、第一个IF、C、第二个IF这四步。因此我们在循环框内再画一个代表顺序结构的子框并把它分成四个小格。### 3.3 第三步处理选择结构IF-THEN-ELSE现在处理循环体顺序结构中的两个IF。第一个IF (IF x0 ...)这是一个简单的选择结构。在它所属的那个小格内我们画一个选择结构框。N-S图的选择结构像一个“凹”字形上面是条件x0然后左边分支THEN画一个框写x1右边分支ELSE画一个框写x2。第二个IF (IF y0 ...)这个就复杂了因为它内部又嵌套了一个IF。处理方法是一样的先画外层选择结构框条件为y0。THEN分支y1;...S2;不是一个简单语句它包含y1、一个内层IF、S2这又是一个顺序结构。所以我们在THEN分支的框内再画一个顺序结构框分成三格分别放入y1、内层IF、S2。然后再在这个顺序结构的第二格里去画内层IF (IF z0)的选择结构框。ELSE分支y2则直接写入对应的框。### 3.4 第四步整合与收尾将循环体内部的所有结构都绘制清楚后别忘了在循环体顺序框的下方加上UNTIL的条件判断框。最后回到最外层的顺序结构完善第一个框A和最后一个框D的具体内容如果A和D是简单操作就直接写如果是复杂结构则继续分解。至此一个层次分明、结构清晰的N-S图就诞生了。整个过程就像拼乐高先搭好主体框架最外层顺序再拼装核心模块循环最后完善模块内部的细节零件选择结构。多练习几次你就能一眼看穿PDL的结构层次。4. PAD图实战绘制程序的“纵向生长树”PAD图的感觉和N-S图完全不同它更像一棵从左向右生长的树程序的主干线是左侧的一条竖线。这种图在描述复杂程序时尤其是存在多层嵌套时比N-S图更直观不容易产生“盒子套盒子”的拥挤感。我们用同一段PDL来演示PAD的画法。### 4.1 第一步确立主干线与根节点在PAD图中最左侧的一条竖线就是程序的主干线。我们从主干线上引出的第一个节点就是程序的入口也就是第一个语句A。对于顺序结构处理起来非常简单每个顺序执行的处理框都像树叶一样依次挂在主干线的右侧。所以我们先在主干线右侧画一个处理框里面写上A。接下来按照顺序应该是REPEAT-UNTIL循环。在PAD图中循环结构有特定的符号。UNTIL循环后判断的画法是先画一个向右开口的矩形框代表循环体在这个矩形框的底部连接一个条件判断框小三角形或菱形条件框的出口箭头向左回指到循环体矩形框的入口处表示条件为假时继续循环。我们把这个UNTIL循环结构作为一个整体“挂”在主干线A的下方。### 4.2 第二步展开循环体这颗“子树”现在我们需要展开UNTIL循环这个“大树杈”。这个循环体本身是一个顺序结构B - IF1 - C - IF2。在PAD图中描述顺序结构就是在当前结构循环体矩形框的右侧垂直向下排列各个子处理框。在循环体框的右侧我们先画第一个子框B。接着在B的下方画第一个IF选择结构。PAD的选择结构画法很形象先画一个顶点在左的等腰三角形判断框然后从三角形右侧引出两条或多条斜向下的分支线分别对应THEN和ELSE每条分支线末端连接一个处理框。这里我们画出条件x0THEN分支连x1框ELSE分支连x2框。在选择结构的下方画顺序结构中的C。在C的下方画第二个、也是更复杂的嵌套IF结构。方法同上先画外层判断框y0引出两个分支。关键点来了THEN分支y1; 内层IF; S2;不是一个单一操作而是一个顺序结构。所以我们在THEN分支的处理框位置实际上需要先画一个定义符一个矩形框里面可以写个名字如“THEN-PART”然后这个定义符可以引出一条垂直的次级主干线在这条线上我们再依次挂上y1、内层IFz0、S2这三个子框。这就体现了PAD图“树形分解”的优势嵌套再深也能清晰展开。ELSE分支则直接连接y2框。### 4.3 第三步处理复杂嵌套与子图对于特别复杂的循环体像我们例子中这个画在一张图上可能横向空间会拉得很长。这时PAD图提供了“子图”的利器。我们可以把“UNTIL循环体”这个部分单独定义为一个子图。在主图上我们只画一个简单的循环符号旁边标注“详见子图X”。然后另起一个图专门详细绘制这个循环体内部的所有逻辑。子图画法完全独立有自己的主干线代表子图入口从循环体的第一条语句B开始画起直到循环体结束。这样主图非常简洁而细节又可以在子图中一览无余。这是PAD图应对复杂逻辑的一大法宝。最后别忘了在循环体子树画完后加上回指的箭头和UNTIL条件。循环结构结束后回到主干的顺序流在主干线上继续挂上最后一个处理框D。5. 避坑指南与高效绘制技巧画了这么多年图也看过很多新手画的图我总结了一些常见的“坑”和能提升效率的技巧希望能帮你少走弯路。### 5.1 新手常见错误辨析混淆循环判断位置这是最高发的错误。一定要死死记住WHILE循环的条件框画在循环体之前先判断UNTIL循环的条件框画在循环体之后后判断。在N-S图中WHILE的条件框在循环体框的顶部UNTIL的在底部。在PAD图中WHILE的回指箭头指向条件框条件框在循环体前UNTIL的回指箭头从条件框指向循环体入口。遗漏ELSE分支即使PDL描述中ELSE后面没有语句可能只写了个ELSE NULL;在逻辑上这个分支也是存在的。在图中你必须把这个分支画出来可以里面写“空操作”或“NOP”但不能省略。省略意味着逻辑不完整。嵌套层次混乱在分解多层嵌套的IF或者循环时很容易把内层结构的归属搞错。一个有效的检查方法是给每个IF、WHILE、UNTIL、CASE都找到它对应的ENDIF、ENDWHILE等结束符。用缩进或者高亮笔在PDL原文上标记出来明确每一对开始/结束符之间的范围这个范围就是一个完整的结构体在图中就应该被封装在一个独立的图形单元内。PAD图主干线断裂PAD图的主干线象征着程序的执行流必须保持连贯。当遇到选择结构时各分支执行完后应该汇合到同一个点再回到主干线向下执行。不要画成每个分支直接散开收不回来了。### 5.2 工具推荐与绘制心法早期我们都是用Visio、PPT甚至手画现在有了更多高效工具。Draw.io / Diagrams.net免费、开源、在线可用图形库丰富非常适合绘制这类结构化图表。你可以搜索“N-S Diagram”或“Flowchart”的模板里面有很多现成的形状。Visual Paradigm功能更专业的UML和图表工具对软件工程的各种图支持非常好但部分高级功能收费。甚至可以是文本工具对于追求极简或快速草稿你可以用纯文本符号来示意例如用--表示分支|表示主干这能帮你快速理清思路。无论用什么工具我的核心心法是先分析后动笔先框架后细节。永远先花时间把PDL的结构层次用树形大纲的形式写在草稿纸上明确哪里是顺序哪里是分支哪里是循环嵌套了几层。这个分析阶段的工作量会占整个绘图过程的70%。一旦结构树清晰了剩下的只是选择正确的图形符号把它“翻译”出来而已。多找几段复杂的PDL练习题反复进行“分析-绘制”的训练很快你就能做到一眼看穿结构下笔如有神助了。