本文作者:FiftyOne
本文链接:https://www.cnblogs.com/FiftyOne/p/17180498.html
版权声明:未经作者允许严禁转载
第2章 算法——程序的灵魂
一个程序主要包括以下两方面的信息:
-
对数据的描述:在程序中要指定哪些数据以及这些数据的类型和数据组织形式。这就是数据结构。
-
对操作的描述。即要求计算机进行操作的步骤,也就是算法。
程序=数据结构+算法
2.1 什么是算法
广义来说,为了解决一个问题而采取的方法和步骤,就称为算法。
计算机的算法分为两大类:
-
数值运算算法:
数值运算算法的目的是求数值解。例如一个函数的定积分等。
-
非数值运算算法:
非数值运算包括的面十分广泛,最常见的是用于事务管理领域,例如对一批职工姓名排序等。
2.2 算法的特性
-
有穷性:一个算法应包含有限的操作步骤,而不能是无限的。
-
确定性:算法中每一个步骤都应当是确定的,而不应是含糊的,模棱两可的。
-
有零个或多个输入:所谓的输入是在执行算法时需要从外界取得必要的信息。一个算法可以没有输入,也可以有多个输入。
-
有一个或多个输出:算法的目的就是为了求解,解就是输出。一个算法得到的结果就是输出,没有输出的算法是没有意义的。
-
有效性:算法中的每一个步骤都应当能有效的进行,并且得到确定的结果。
2.3 怎样表示一个算法
为了表示一个算法,可以用不同的方法。常用的方法有:自然语言,传统流程图,结构化流程图和伪代码等。
用自然语言表示算法
自然语言就是人们日常使用的语言,可以是汉语,英语或其他语言。用自然语言表示通俗易懂,但文字冗长,容易出现歧义。自然语言表示的含义往往不大严格,要根据上下文才能判断其正确的含义。
用流程图表示算法
流程图是一些图框来表示各种操作。用图形表示算法,直观形象,易于理解。
美国国家标准化协会ANSI规定了一些常用的流程图符号,已为世界各国程序工作者所采用。
流程图实例:
一共有50名学生,需输入50名学生的学号,成绩,要求输出成绩大于80分的同学的学号和成绩。
由此可以看出流程图是表示算法较好的工具,一个流程图包括一下几个部分:
- 表示相应操作的框。
- 带箭头的流程线。
- 框内外必要的文字说明。
需要提醒的是:流程线不要忘记画箭头,因为它是反映流程的先后的。如不画出箭头就难以判定各框的执行次序了。
流程图的缺点:
- 占用篇幅较多
- 当算法较为复杂时,画流程图既费时又不方便。
三种基本机构和改进的流程图
1.传统流程图的弊端
传统的流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制。因此使用者可以不受限制的使流程随意的转来转去,使流程图变得毫无逻辑,阅读需要花费很大精力去追踪流程。
为了提高算法的质量,使算法的设计和阅读方便,必须限制箭头的滥用,即不允许无规律得使流程随意转向,只能顺着顺序去进行。但是,算法上难免会包含一些分支和循环,不可能全部由一个个顺序框组成。为了解决这个问题,人们规定出了几种基本结构。
2.三种基本结构
- 顺序结构:虚线框内是一个顺序结构。其中A和B 两个框是顺序执行的。即在A框指定的操作后,必然接着执行B框的操作。顺序结构是最简单的一种结构。
2.选择结构:选择结构又称选取结构或分支结构。虚线框内是一个选择结构。此结构中必包含一个判断框。根据给定的条件p是否成立而选择执行A框或B框。
注意:无论p条件是否成立,只能执行A框或者B框之一,不能既执行A框又执行B框。无论走哪一条路径,在执行完A或者B之后,都经过b点,然后脱离本选择结构。A或B两个框中可以有一个是空的,即不执行任何操作。
3.循环结构:又称重复结构,即反复执行某一部分的操作。有两类循环结构。
- 当型(while型)循环结构:它的作用是:当给定的条件p1成立时,执行A框操作,执行完A后,在判断条件p1是否成立,如果任然成立,再执行A框,直到某一次p1的条件不再成立为止,此时不再执行A框,从而从b点脱离循环结构。
- 直到型(until型)循环结构:它的作用是:先执行A框,然后判断给定的p2条件是否成立,如果p2条件不成立,则再执行A,然后再对p2条件作判断,如果p2条件仍然不成立,又执行A........,如此反复执行A,直到给定的p2条件成立为止,此时不再执行A,从b点脱离本循环结构。
以上3种基本结构,都有以下特点:
-
只有一个入口:a点为结构的入口。
-
只有一个出口:b为出口点。注意:一个判断框有两个出口,而选择结构只有一个出口。不要将判断框的出口和选择结构的出口混淆。
-
结构内每一部分都有机会被执行到:对于每一个框来说,都应有一个从入口到出口的路径通过它。入口出口缺一不可,没有入口,则不会被执行。没有出口,就会产生死循环。
-
结构内不存在死循环(无终止的循环)
由以上3种基本结构组成的算法结构,可以解决任何复杂的问题。由基本结构所构成的算法属于“结构化”算法,它不存在无规律的转向,只在基本结构内才允许存在分支和向前或向后的跳转。
用N-S流程图表示算法
既然用基本结构的顺序组合可以表示任何复杂的算法结构,那么,基本结构之间的流程线就属于多余的了。
N-S流程图完全去掉了带箭头的流程线,全部算法写在一个矩形框内,在该框内还可以包含其他从属于它的框。这种流程图适合于结构化程序设计。
N-S流程图用以下的流程图符号表示:
- 顺序结构:如图1所示,A和B两个框组成一个顺序结构。
- 选择结构:如图2所示,当p条件成立时,执行A操作。p不成立时则执行B操作。
- 循环结构:
- 如图3所示,当型循环结构:当p1成立时反复执行A操作,直到p1条件不再成立为止。
- 如图4所示,直到型循环结构:先执行A操作,再判p2条件是否成立,直到p2条件成立为止。
用伪代码表示算法
伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。用伪代码写算法并无固定的,严格的语法规则,可以用英语,也可以中英文混用。只要把意思表达清楚,便于书写和阅读即可。书写的格式要写成清晰易读的形式。
例如求5!用伪代码表示的算法如下:
begin (算法开始)
1 => t
2 => i
while i<=5
{
t*i=>t
i+1=>i
}
print t
end(算法结束)
用计算机语言表示算法
要完成一项工作,包括设计算法和实现算法两个部分。设计算法目的是为了实现算法。因此,不仅要考虑如何设计一个算法,也要考虑如何实现一个算法。
计算机是无法识别流程图和伪代码的,只有用计算机语言编写的程序才能被计算机执行,因此在用流程图或伪代码描述一个算法后,还要将它转换成计算机语言程序。用计算机语言表示的算法是计算机能够执行的算法。
用计算机语言表示算法必须严格遵循所用语言的语法规则,这是和伪代码不同的。
例如求5!用计算机语言表示的算法如下:
#include<stdio.h>
int main(){
int i = 2;
int t = 1;
while(i<=5){
t=t*i;
i=i+1;
}
printf("%d \n",t);
return 0;
}
2.4 结构化程序设计方法
一个结构化程序就是用计算机语言表示的结构化算法,用3种基本机构组成的程序必然是结构化的程序。这种程序便于编写,阅读,修改和维护,这就减少了程序出错的机会,提高了程序的可靠性,保证了程序的质量。
结构化程序设计强调程序设计风格和程序结构的规范化,提倡清晰的结构。
结构化程序设计方法的基本思路:把一个复杂的问题的求解过程分阶段进行,每个阶段处理的问题控制在人们容易理解和处理的范围内。
具体来说,采取以下方法来保证得到结构化的程序:
- 自顶向下
- 逐步细化
- 模块化设计
- 结构化编码
在程序设计中常采用模块化设计的方法,尤其当程序比较复杂时,更有必要。
程序中的子模块在C语言中通常用函数来实现。C语言中没有子程序的概念
程序中子模块一般不超过50行(但计算机对子模块没有行数的限制,只是人们为了便于阅读),即把它打印输出时不超过一页,这样的规模便于组织,也便于阅读。划分子模块时,应注意模块的独立性,即使用一个模块完成一个功能,耦合性越少越好。
在设计好一个结构化的算法之后,还要善于进行结构化编码。所谓编码就是将已设计好的算法用计算机语言来表示,即根据已经细化的算法正确地写出计算机程序。结构化的语言(如Pascal,C,Visual Basic等)都有与3种基本结构对应的语句。
标签:流程图,计算机,灵魂,程序,算法,执行,结构 From: https://www.cnblogs.com/FiftyOne/p/17180498.html