什么是分支程序设计?相关示例总结
扫描二维码
随时随地手机看文章
C语言中有三大结构,分别是顺序结构、选择结构和循环结构(分支结构):
顺序结构就是程序从头到尾的顺序依次执行每一条代码,不重复执行任何代码,也不跳过任何代码。
选择结构也称分支结构,就是让程序“拐弯”,有选择性的执行代码,即可以跳过没用的代码,只执行有用的代码。
循环结构就是让程序“杀个回马枪”,不断地重复执行同一段代码。
结构化程序设计思想
1976年,图灵奖获得者Niklaus Wirth出版了名为Algorithms+Data Structure=Programs的软件设计专著,书中提及了算法和数据结构的概念,并提出作为结构化程序设计的基础的著名论断:程序=算法+数据结构。
从书中我们可以了解到结构化程序设计的基本思想为:
自上而下、逐步细化、模块化设计、结构化程序编码
由此结构化程序具有以下特点:
程序由不同功能的模块构成,各模块又可以按照不同类型分成一个或者多个子模块。
每个子模块之间有一个或者多个程序单元构成,个子模块之间可以互相调用程序单元。
一个程序单元由顺序、分支、循环三种基本结构构成。
分支结构程序的指令执行顺序与指令在ROM中的存放顺序不同,其中某些具有判断功能的指令会根据判断结果改变接下来的指令执行顺序,从而使程序产生一个或多个分支流向。可用于分支结构程序设计的判断指令主要包括JZ、CJNE和JB等有条件转移指令。根据程序分支的数量,可以将分支程序分为三类:单分支、一般多分支和散转多分支。
1.单分支程序
单分支程序仅进行一个条件判断,程序流程相对简单。
【例3-58】判断单字节数的奇偶性。要求:单字节数X存放于片内RAM地址为55H的存储单元中,判断其奇偶性,若其为奇数则将PSW寄存器中的F0置1,否则将F0清0。
参考程序如下,运行结果是:(F0)=01。该程序的流程图如图3-6所示。
【例3-59】判断两个单字节型无符号数的大小。要求:单字节型无符号数X和Y分别存放于寄存器R0和R1中,比较两个数的大小,将其中较大的数存入R2中。
参考程序如下,运行结果是:(R2)=20H。该程序的流程图如图3-7所示。
2.一般多分支程序
一般多分支程序需要进行两次或两次以上的分支判断,而且一个判断可能需要两条(或以上)条件转移指令配合完成。
【例3-60】求三个无符号字节型数据X、Y和Z中的最大值。要求:X、Y和Z分别存放于片内RAM的30H、31H和32H单元,最大值存于33H单元。
以下参考程序的运行结果是:(33H)=57H,其流程图如图3-8所示。分析程序和流程图可知,大于等于的判断由CJNE和JNC两条指令配合实现,并且大于等于判断进行了两次,因此本程序属于多分支的程序结构。
3.散转多分支程序
与一般多分支程序相比,散转多分支程序具有更多分支,可以根据用户输入或之间的处理结果转向相应分支,并执行对应的处理程序。散转多分支程序所用的转移指令是散转指令“JMP@A+DPTR”。散转多分支程序的设计方法有三种:转移指令表法、分支地址表法和地址偏移量表法。其中,转移指令表法已经结合指令JMP进行了讲解(见例3-47),因此本小节仅介绍后两种方法。
(1)分支地址表法
分支地址表法将各分支程序的首条指令的地址存入一个表中,当执行某个分支时,通过索引在该表中查找分支地址,并送入程序指针寄存器(PC),从而实现程序的分支转移。
【例3-62】利用分支地址表法,实现与例3-47程序相同的功能。
解:参考程序如下: