C语言开发基础教程(Dev-C++)(第2版)
上QQ阅读APP看书,第一时间看更新

1.2 程序设计与算法

算法在计算机科学领域是非常重要的概念,有着举足轻重的地位。算法将要解决的实际问题和解决实际问题的计算机程序联系起来。在编写程序的过程中,不可避免地要考虑到算法设计方案。本节内容介绍算法的基本概念和特征,引领读者了解算法在程序设计中的重要性。

1.2.1 算法——程序的灵魂

生活中算法随处可见,同样计算机程序设计也离不开算法,在计算机学科中算法是独立课程,开始编程之前了解算法的基本知识,对后续学习编程有着重要的意义。

1. 什么是算法

从广义上讲算法就是解决问题的方法和过程,在计算机领域,算法是从输入到输出的有穷序列,是一系列解决问题的清晰指令。

计算机程序通常具备两个方面的描述:一是对数据的描述;二是对程序中操作数据流程的描述。对数据的描述指的是数据类型和数据组织形式。数据类型有整型、浮点型、字符型、组合类型等,数据的组织形式有链表、队列等;对程序操作流程的描述即算法,是程序执行的步骤,类比我们生活中要解决一个问题的具体流程。

算法在程序中是不可缺少的一部分,比如使用百度搜索资料时,用到排序算法;淘宝购物时使用推荐算法等。若把一个运行的程序比喻成有生命的人,数据的结构就是人的躯体,算法就是这个人的灵魂。正如计算机科学家尼基劳斯·沃思(Nikiklaus Wirth)将程序描述为:

程序=数据结构+算法

举一个简单的例子,比如数学中关于素数的定义:素数是在大于1的自然数中,除了1和它自身外,不能被其他自然数整除的数。这是素数的求解思路,也是一个算法的描述。

2. 算法特征

算法应具有以下5项特征。

(1)有穷性。算法的有穷性是指算法必须能在执行有限个步骤之后结束,在具体的算法中指的是在当前解决问题的合理范围之内,如果一个算法解决问题历时一年,算法尽管有穷也不会被考虑使用。

(2)确定性。算法的每一个步骤必须有确切的定义,计算机处理问题的步骤是确定的,算法设计过程中不能出现二义性、选择不确定的情况。

(3)输入项。一个算法有0个或多个输入,以获取程序处理的必要信息。输入项可以由程序中其他功能模块传递,也可以从键盘输入获取。

(4)输出项。一个算法有1个或多个输出,输出是对输入数据加工后产生的结果,没有输出结果的算法是没有意义的。

(5)可行性。算法中执行的计算步骤都应可被分解为基本的、可执行的操作步骤。

1.2.2 算法的表示

遇到需要解决的问题通过思考得出解决的办法,结合编程思想,将解决问题时的方案用算法表示出来,称之为算法的表示。算法一般有4种表示方法:自然语言、流程图、N-S流程图和伪代码,下面我们分别对这4种表示方法进行介绍。

(1)自然语言描述

使用自然语言描述法表示算法,就是使用自然语言描述问题的求解思路与过程。可以用这样的自然语言描述法判断一个数是否为素数的算法:大于1的自然数中,除了1和它本身不再有其他因数的数就是素数。

在一些大型的开源项目中,说明文档会用自然语言粗略地表述算法,但因为自然语言容易产生二义性,一般不使用自然语言描述算法的具体实现。

(2)流程图表示

流程图简单直观并且易于理解,是使用最广泛的算法表示方法。流程图的表示方式如图1-1所示。

图1-1 常见的流程图结构

图1-1中所示的各个框图结构表示的含义如下。

• 开始或结束。使用圆角矩形表示,用于标识流程的开始或结束。

• 输入/输出。使用平行四边形表示,其中可以写明输入或输出的内容。

• 条件判断。使用菱形表示,它的作用是对条件进行判断,根据条件是否成立来决定如何执行后续的操作。

• 程序处理。使用矩形表示,它代表程序中的处理功能,如算术运算和赋值等。

• 流程线。使用实心单向箭头表示,可以连接不同位置的图框。

• 连接点。使用圆形表示,用于流程图的延续。

以判断一个数是否为素数的算法为例,使用流程图来表示算法的具体方法如图1-2所示。

图1-2 素数判断流程图

(3)N-S流程图表示

1973年美国学者艾克·纳西(Ike Nassi)和本·施奈德曼(Ben Shneiderman)提出了一种新的流程图形式,这种流程图完全去掉了流程线,算法的每一步都用一个矩形框来描述,把一个个矩形框按执行的次序连接起来就是一个完整的算法描述。这种流程图用两位学者名字的第一个字母来命名,称为N-S流程图,如图1-3所示。

图1-3 N-S流程图

(4)伪代码表示法

使用伪代码的目的是使被描述的算法可以容易地以任何一种编程语言实现,此种表示类似自然语言,但结构清晰、可读性好。伪代码没有固定格式,不用拘泥于具体实现,使用接近自然语言的形式将整个算法运行过程的结构表述出来即可。判断素数的伪代码如下所示:

If i<2 
Then  i不是素数,程序结束 
Else 
t=2 
Repeat: 
         If i mod t=0 
              Then i不是素数,程序结束 
         Else t=t+1 
Until t>=i 
i是素数,程序结束