![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=1739290260-N0ydOc7cXPgAaa7h40Ygu8UEKnvriH4l-0-c6fb0df3935d19999c4715d54264861d)
图2.1 流程图符号
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P45_125006.jpg?sign=1739290260-meGsKee29z97GmVyLz7yBLzHQmqD3ypT-0-c59c1a57257589efec6efba0f531fb8b)
图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=1739290260-AQwjnJMOLd5CUhxMVWczLCob2cDEBdVk-0-9cc2b2ef7a01a6c6162dffee13ecd4ca)
图2.3 输出数学、语文成绩
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P45_125011.jpg?sign=1739290260-3L71VLiR6ct1Cao3pMH10AhAQyS7Brf0-0-01bf96b3fa6350f1339899ba83359ae8)
图2.4 选择结构1
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P45_125009.jpg?sign=1739290260-8Ty3l1DDXbJLXd5AbpS6Uv3xaeBASikH-0-ab1bd4c39728b7ead633817c3a0b3e20)
图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=1739290260-oxyzTEIShqUJDYCbxx1pCcN4XpMztSPu-0-7f6917fcfe477123b7856bd5886e8489)
图2.6 判断一个数是否为偶数
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P46_125031.jpg?sign=1739290260-IQVCOuA1Q7t9AWB4r1uPD2yYxNovfp0U-0-0f0a5a1c35a0eb408dff7da185cff763)
图2.7 当型循环
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P46_125028.jpg?sign=1739290260-BICLRZKGoqYE7wpet2T0nCSqZ4NColXE-0-ca2364b51357563d446310723ea81c80)
图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=1739290260-JnSD4vlMkwsWK80r9yFyDJC0SxsKBeYv-0-cc40d1803702244aba4dcf569519eab0)
图2.9 当型循环结构求和
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P46_125030.jpg?sign=1739290260-UOgAKAmIx8AccjfUHqQgWACCYOKKYrka-0-a62d9dab3bfe968c29109a1d46b98c8c)
图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=1739290260-EGbTJKTy35dr7lXRJvTMd8PSeCKgYJQ5-0-7236dbc612aa2de54e9009d9ab3839a9)
图2.11 顺序结构
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P47_125043.jpg?sign=1739290260-xWs1AMe9pYDLjN9WAJZN6WJYPEhkqGTZ-0-760c4a99121f61e6549f9e1428175991)
图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=1739290260-7pDD6cLeTL8LjLLUPCsknlCqvozDgtsd-0-3b55d202179b4cab242a826df513b6c7)
图2.13 选择结构
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P47_125045.jpg?sign=1739290260-UPlVXWVKE0qqQMoQgaxtQw1kP9ceFNT3-0-4232131907dc517abdda06d388ad709a)
图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=1739290260-Uo45dzxTAeqEcCiOoBST8VQbwqwBgtkR-0-7e8e440583bdd522aca974997f27a6cc)
图2.15 当型循环
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P47_125047.jpg?sign=1739290260-iREYh9jfyKVVyfgTdEVU8Nr7XFVg4pyY-0-1718a461bc571b29e1801462cdf7cd7d)
图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=1739290260-S0y1brb4ZkQuMMYJG0KmbGjKMgEuPqja-0-f8c26cb3a27f88333b48afdb774a6d9a)
图2.17 直到型循环
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P48_125054.jpg?sign=1739290260-USAj0xgIapYVKaWRbj3RzluChuTwWZZy-0-6139ff3f98f2a4fc9484e2e91bd0a619)
图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=1739290260-B5AcgqXU62J3MG3YN7tMRd11dc298YNg-0-3adfdcc5acc652d207a84728072b7c45)
图2.19 求n!的流程图
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P48_125059.jpg?sign=1739290260-E083fS20tveFZHcOkrMTLTMPIjhPlAMt-0-163bd5a8c3fae2ba48da8f3799e0f540)
图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=1739290260-5XWn1JJ2NQPpE4XJl0SVpqZ1vAXjOT8B-0-83b3783779e53979138e69db36b31cec)
图2.21 求最大公约数的流程图
![](https://epubservercos.yuewen.com/626BE4/26581986809351706/epubprivate/OEBPS/Images/Figure-P49_125067.jpg?sign=1739290260-8uMkBk2yR7AnQW8fMMlGwywg3d9Jk4rm-0-e64b77af534a77b7b43416b62d4c3339)
图2.22 求最大公约数的N-S流程图