第二章 算法——程序的灵魂
一个程序主要包括两方面的内容:
第一是数据结构。是对数据的描述,在程序中要指定哪些数据以及这些数据的类型和数据的组织形式
第二是算法。是对操作的描述,即要求计算机进行操作的步骤。
著名计算机科学家沃斯提出一个公式:算法+数据结构=程序
2.1 什么是算法:
广义的说,为解决一个问题而采取的方法和步骤就称为算法;
计算机算法分为数值运算算法和非数值运算算法,数值运算的目的是求数值的解;非数值运算的应用范围十分广泛;目前,计算机在非数值运算方面的应用远远超过了在数值运算方面的作用。
2.2 简单算法举例:
例题 2.1 求1x2x3x4x5.
可以用最原始的方法进行:
步骤1:先求1x2,得到结果2
步骤2:将步骤1中的结果2与3相乘得到结果6
步骤3:将6乘以4得到24
步骤4:将24乘以5,得到最终的结果120
可以看出这样计算的结果是正确的,但是计算过程过于复杂,当式子中的因数的个数有很多时,这样的算法是不可取的。
可以通过以下的计算方法来简化计算过程:
首先,令p=1,i=2
然后,使p与i 相乘,结果赋给p;
再令i的值加1后与p相乘,
如果i的值不大于5,则循环执行第二步,和第三步;否则。算法结束,最后得到的P值就是最终的结果;
例题 2.2 有50个学生,要求输出成绩在80分以上的学生的学号和成绩:
为描述方便,统一用n表示学生的学号,用下标i代表第几个学生,n1表示第一个学生,ni表示第i个学生,统一用g表示学生的成绩,
下面给出算法:
S1:i=1
S2:如果g1>=80,则输出n1和g1,否则不输出
S2:i=i+1
S4:如果i<=50;返回S2继续执行,否则算法结束
例题 2.3 判定2000-2500年中的每一年是否为闰年,并将结果输出:
首先需要明确闰年的条件:
(1)能被4整除,但是不能被100整除的年份都是闰年
(2)能被400整除的年份是闰年
设year为被检测的年份:
S1:year=2000
S2:若year不能被4整除,则输出year的值和“不是闰年”,然后转到S6,检查下一年份
S3:若year能被4整除,不能被100整除,则输出year的值和“是闰年”,然后转到S6
S4:若year能被400整除,输出year的值和“是闰年”,然后转到S6
S5:输出year的值和“不是闰年”
S6:year=year+1
S7:当year<=2500时,转到S2继续执行,否则算法结束
例题 2.4 给出一个或大于3的整数,判断它是不是素数:
首先要明确素数的概念:所谓素数是指除了1和该数本身,不能被其他任何整数整除的数。
判定一个数n是否为素数的方法:将n作为被除数,将2到n-1各个整数先后作为除数,如果都不能整除,则n为素数。
算法表述如下:
S1:输入n的值
S2:i=2
S3:n被i除,得到余数r
S4:如果r=0,表示n能被i整除,则输出n不是素数,否则执行S5
S5:i=i+1
S6:如果i<=n-1,返回S3;否则输出n的值及“n是素数”,算法结束
2.3 算法的特性
一个有效的算法应该具有以下的特点:
(1)有穷性:一个算法应具有有限的操作步骤,而不能是无限的。
(2)确定性:算法中的每一个步骤都应该是确定的,而不是含糊或摸棱两可的。
(3)有零或多个输入:所谓的输入,是指在执行算法时需要从外界取得必要的信息。
(4)有一个或多个输出:算法的目的是为了求“解”,“解”就是输出。
(5)有效性:算法中的每一个步骤都应当有效的执行,并得到确定的结果。
2.4 怎样表示一个算法:
算法的表示方法有很多种,最常用到的方法有:用自然语言表示算法;用流程图表示算法;用N-S流程图表示算法;用伪代码表示算法和用计算机语言表示算法等
算法有三种基本结构:分别是顺序结构,选择结构和循环结构(分为“当”型和“直到”型)
2.5 结构化程序设计的方法:
(1)自顶而下;
(2)逐步细化;
(3)模块化设计;
(4)结构化编码;