![C语言从入门到精通(第5版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/457/47217457/b_47217457.jpg)
2.2 算法描述
算法包含算法设计和算法分析两个方面。算法设计主要研究怎样针对某一特定类型的问题设计出求解步骤,算法分析则要讨论所设计出来的算法步骤的正确性和复杂性。
对于一些问题的求解步骤,需要一种表达方式,即算法描述。他人可以通过算法描述来了解算法设计者的思路。表示一个算法,可以用不同的方法,常用的有自然语言法、流程图法、N-S流程图法等。
2.2.1 自然语言
自然语言就是人们日常所用的语言,这种表述方式通俗易懂,下面通过实例具体介绍。
【例2.1】求n!。
算法描述步骤如下:
(1)定义3个变量i、n及mul,为i和mul均赋初值为1。
(2)从键盘中输入一个数,赋给n。
(3)将mul乘以i的结果赋给mul。
(4)i的值加1,判断i的值是否大于n,如果大于n,则执行步骤(5),否则执行步骤(3)。
(5)将mul的结果输出。
【例2.2】农夫、羊、狼及白菜过河。
一名农夫要将一只狼、一只羊和一袋白菜运到河对岸。农夫的船很小,每次只能载下农夫本人以及狼、羊、白菜中的一个。但是,他不能把羊和白菜留在岸边,因为羊会把白菜吃掉;也不能把狼和羊留在岸边,因为狼会吃掉羊。那么,农夫该怎样将这3样东西送过河呢?
算法描述步骤如下:
(1)先把羊运过去。
(2)回来运狼。
(3)把狼运到对岸后,把羊装上船运回来。
(4)把羊放到开始的地方,把白菜运过去。
(5)再把羊运过去。
例2.1和例2.2的算法实现过程就是采用自然语言来描述的。从上面的描述中可以发现,自然语言描述的好处就是易懂,弊端是容易产生歧义。例如,将例2.1步骤(3)中的“将mul乘以i的结果赋给mul”改为“mul等于i乘以mul”,这样就产生了歧义。并且,用自然语言来描述较为复杂的算法时,会显得不是很方便,因此一般情况下不采用自然语言来描述。
2.2.2 流程图
流程图是一种传统的算法表示法,它用一些图框来代表各种不同性质的操作,用流程线来指示算法的执行方向。由于它直观形象,易于理解,所以应用广泛。特别是在语言发展的早期阶段,只有通过流程图才能简明地表述算法。
1.流程图符号
流程图使用一些图框来表示各种操作。如图2.1所示为一些常见的流程图符号,其中,起止框用来标识算法的开始和结束;判断框用于对一个给定的条件进行判断,根据条件成立与否来决定如何执行后续操作;输入/输出框用来表示输入/输出;处理框用来表示变量的计算或赋值;流程线用于表示算法的流向;注释框用于表示算法的注释;连接点用于将画在不同地方的流程线连接起来。
2.3种基本结构
Bohra和Jacopini为了提高算法的质量,提出了3种基本结构,即顺序结构、选择结构和循环结构,因为任何一个算法都可由这3种基本结构组成。这3种基本结构之间可以并列,可以相互包含,但不允许交叉,不允许从一个结构直接转到另一个结构的内部去。
任何算法都是由3种基本结构组成的,所以只要规定好3种基本结构的流程图的画法,就可以画出任何算法的流程图。
1)顺序结构
顺序结构是最简单的线性结构。在顺序结构的程序中,各操作按照它们出现的先后顺序执行。如图2.2所示,在执行完A框所指定的操作后,接着执行B框所指定的操作。这个结构中只有一个入口点A和一个出口点B。
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P45_125005.jpg?sign=1739029949-bT4u6drE7sUuRjlkfxwuK2rApgoOx0rS-0-091fc0f563a1dcf75449d134973618d8)
图2.1 流程图符号
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P45_125006.jpg?sign=1739029949-EmPJxA2OUbf6lp0MOVRH6UvilPEzblZq-0-9c358cba97eac69193caa170f113dd8e)
图2.2 顺序结构
【例2.3】输出数学、语文成绩。
输入两个数,分别代表数学、语文成绩,并分别赋给变量math和chinese,再将这两个数分别输出。
本实例的流程图可以采用顺序结构来实现,如图2.3所示。
2)选择结构
选择结构也称为分支结构,其常见形式有两种,如图2.4和图2.5所示。
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P45_125007.jpg?sign=1739029949-OBPhLEHgt8IdNtF2rbpPCIdAdGliI2AR-0-e0e8cb1aa0f150bd8f7bb689dbd343bc)
图2.3 输出数学、语文成绩
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P45_125011.jpg?sign=1739029949-ozXbbJImLHkbLZXqKto6bNqSxLlNRDmL-0-af17101c18ab7f52f7a5e2814677e152)
图2.4 选择结构1
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P45_125009.jpg?sign=1739029949-yPDkMk5osfC17AEvhCozXVKieZ18BfHx-0-57393f78a5f545a53838fe02ecdef09c)
图2.5 选择结构2
选择结构中必须包含一个判断框。图2.4所代表的含义是根据给定的条件P是否成立选择执行A框还是B框。图2.5所代表的含义是根据给定的条件P进行判断,如果条件成立则执行A框,否则什么也不做。
【例2.4】判断是否为偶数。
输入一个数,判断该数是否为偶数,并给出相应提示。
本实例的流程图可以采用选择结构来实现,如图2.6所示。
3)循环结构
在循环结构中,反复地执行一系列操作,直到条件不成立时才终止循环。按照判断条件出现的位置,可将循环结构分为当型循环结构和直到型循环结构。
当型循环的流程结构如图2.7所示。先判断条件P是否成立,如果成立,则执行A框;执行完A框后,再判断条件P是否成立,如果成立,接着再执行A框;如此反复,直到条件P不成立为止,此时不执行A框,跳出循环。
直到型循环的流程结构如图2.8所示。先执行A框,然后判断条件P是否成立,如果条件P成立则再执行A;然后判断条件P是否成立,如果成立,接着再执行A框;如此反复,直到条件P不成立,此时不执行A框,跳出循环。
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P46_125026.jpg?sign=1739029949-fS84sL8avWC0yi0OQIeKTLFrZrWAZiDO-0-1a94ce697f74aa56026b7f6c669dd134)
图2.6 判断一个数是否为偶数
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P46_125031.jpg?sign=1739029949-FdcM38r3UNPm7ThKSk76ELcCivDU3XQY-0-398f987f5fee3e5169f4493e12ccbc6c)
图2.7 当型循环
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P46_125028.jpg?sign=1739029949-VwBUKUOGfVgZGOrdiTOqKPs6NXjGXLh3-0-24e2fe5177d300ede278d8bc7121c8b1)
图2.8 直到型循环
【例2.5】计算1+2+3+…+100的结果。
求1和100之间(包括1和100)所有整数之和。
本实例的流程图可以用当型循环结构来表示,如图2.9所示。也可以用直到型循环结构来表示,如图2.10所示。
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P46_125029.jpg?sign=1739029949-Adbq8iQq1Ea1H1WI6zWsdNn4DAI9t48k-0-594fdb7788264dc5abafa3a1f3888336)
图2.9 当型循环结构求和
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P46_125030.jpg?sign=1739029949-9Oc5Aw32ytL30w766saO1i6eSUJuPjxP-0-7d6817bc8b7ccaf0e2c10ca6ea6109f4)
图2.10 直到型循环结构求和
2.2.3 N-S流程图
N-S流程图是另一种算法表示法,是由美国人I.Nassi和B.Shneiderman提出的。其根据是:既然任何算法都可以由顺序、选择和循环3种结构组成,则各基本结构之间的流程线就是多余的,因此可以去掉所有流程线,将全部的算法写在一个矩形框内。N-S图也是算法的一种结构化描述方法,同样也有3种基本结构,下面分别进行介绍。
1.顺序结构
顺序结构的N-S流程图如图2.11所示。例2.3的N-S流程图如图2.12所示。
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P47_125042.jpg?sign=1739029949-BuusWndJZJNAs5fCULiHeDrmN31vDVOQ-0-86f71f7bd38f1af90428032da5b9d2c0)
图2.11 顺序结构
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P47_125043.jpg?sign=1739029949-rWJovuZko6tgEA7hYfyNbEq62LSYrKwn-0-ac309faa6d3b42fac78476c8369ec530)
图2.12 输出数学、语文成绩
2.选择结构
选择结构的N-S流程图如图2.13所示。例2.4的N-S流程图如图2.14所示。
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P47_125044.jpg?sign=1739029949-KQXLgRxwKMtqZCr8QXd1qBvEgW1e2QSF-0-b5b637cd0c1b05dcc08f9c822549630a)
图2.13 选择结构
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P47_125045.jpg?sign=1739029949-u2KqW7dUPOAMz4jJgUhyCKZP5QgewIRm-0-6980d83f5e9ca6ef0c2bc57091bd9733)
图2.14 判断一个数是否为偶数
3.循环结构
当型循环的N-S流程图如图2.15所示。例2.5的当型循环的N-S流程图如图2.16所示。
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P47_125046.jpg?sign=1739029949-kTZ7y3yDTgpR6Up25VnQzIT5z5IBENZV-0-1ad9d389366460cb435a0b7ccc7a1378)
图2.15 当型循环
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P47_125047.jpg?sign=1739029949-cRzOstyuntoRKvOjplJIwhgTgwbYh2VV-0-1dcd78b37090db37edd10f92f096b917)
图2.16 当型循环求和
直到型循环的N-S图如图2.17所示。例2.5的直到型循环的N-S流程图如图2.18所示。
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P48_125053.jpg?sign=1739029949-5nX8ilA93pfqSDGNNmaYhUtRwIAiIjJy-0-3b39e20a7acbe8e9b889a91eb1b3e82d)
图2.17 直到型循环
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P48_125054.jpg?sign=1739029949-PUZN5WxiVVxdo9Tn0h5UHNLI9tBTWs9R-0-0d96a787e2eb0d4c71613543530e38ce)
图2.18 直到型循环求和
说明
顺序、选择、循环3种基本结构都只有一个入口和一个出口,结构内的每一部分都有可能被执行,且不会出现无终止循环的情况。
【例2.6】计算n!。
从键盘中输入一个数n,求n!(提示:n!=1*2*3*4*….n)。分别用流程图和N-S图绘制其算法描述。
本实例的流程图如图2.19所示,N-S流程图如图2.20所示。
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P48_125061.jpg?sign=1739029949-8WjFFfY6h8tGGQFdQ7mG7p6jLCGexaMC-0-ef74eeaac34b96319deb319c821276c8)
图2.19 求n!的流程图
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P48_125059.jpg?sign=1739029949-Id8xGLnUjHtO9cJvLzieKmUC4PqUv1hm-0-3baa6f670401b590f9dbba56ecca08f7)
图2.20 求n!的N-S流程图
【例2.7】求a和b的最大公约数。
任意输入a、b值,利用顺序结构、选择结构、循环结构求解a、b的最大公约数。分别用流程图和N-S图绘制其算法描述。
本实例的流程图如图2.21所示,N-S流程图如图2.22所示。
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P49_125069.jpg?sign=1739029949-DwSPff2LxSxwcQzmRyy8apm1K3nXSesm-0-bfa36c8aee82defb7b496138a7e684ee)
图2.21 求最大公约数的流程图
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P49_125067.jpg?sign=1739029949-wNlU3fwJApIHb69lxaCfZB4UOmGYh7yi-0-ee52000cafc8789a6c69150c90129e17)
图2.22 求最大公约数的N-S流程图