C程序设计
第2章程序的灵魂-算法
—个程序包括以下两个方面的内容:
对数据的描述。在程序中要指定数据的类型和数据的 组织形式,即数据结构。
对操作的描述。即操作步骤,也就是算法。
数据是操作的对象,操作的目的是对数据进行加工 处理,以得到期望的结果。作为程序设计人员,必须认 真考虑和设计数据结构和操性步骤(即算法)。著名计 算机科学家沃思提出一个公烹:数据结构+算法二程序。
实际上,一个程序除了以上两个主要要素之外,还 应当采用结构化程序设计方法进行程序设计,并且用某 一种诂算机蚩言表示。因止乞算涛、哎攵据结构、程序设 计方袪和语書工具4个方面崑一苗呈帶设计人员所应具 备的知识。
2.1算法的概念
子。广义地说,为解决一个问题而采取的方法和步骤2 就称为算法(algorithm)。例如*苗迷天极睾动彳乍的囱鮑 就是太极拳的賢法。一首歌曲的乐谱,也可以称为该 ii窗——————…
子。
对同一个问题,可以有不同的解题方法和步骤。 计算机算法可分为两大类别:
数值迈昇昇法
非数值运算算法
2.2简单算法举例
[例 2.1]求 1X2X3X4X5
算法1:
步骤1:先求1*2,得到结果2。
步骤2:将步骤1得到的乘积2再乘以3,得到结果6。
步骤3:将6再乘以4,得24。
步骤4:将24再乘以5,得120。
算法2:
S y使卩二1
52:使上2
S3:使卩忆乘积仍放在变量p中,可表示为p*Z=>p
S4:使泊勺值加1,即z+l=>z
S5:如果7不大于5,返回重新执行步骤S3以及其后的步 骤S4和S5;否则,算法结束。最后得卩的值就是5!的 值。
[例2.2]有50个学生,要求将他们之中成绩在80 分以上的学号和成绩输出
弘代表第Z个学生学号。g,代表第Z个学生成绩,算法 如下:
5]: 1=>/ 52:如果£>80,则输出彼和&;否则不输出
S3: Z+lnZ
54:如果注50,返回S2,继续执行;否则,算法结束。
[例2.3]判定2000-2500年中的每一年是否是闰年
闰年的条件是:⑴能被4整除但不能被100整除的 年份是闰年,如1996年、2004年;(2)能被400整除的年 份是闰年,如1600年、2000年。
设y为被检测的年份。可采用以下步骤:
S]: 2000=>y
齐:若y不能被4整除,则输出、不是闰年” o然后转
员:若y能被4整除,不能被100整除,则输出、是闰 年” o然后转到S6
S4:若y能被400整除,输出“y是闰年”,然后转到S&
S5:输出“y不是闰年” ^6 ■ v+iny
S7:当庐2500时,转S?继续执行,否则算法停止。
[例 2.4]求 1-1/2+1/3-1/4+...+1/99-1/100
算法如下:
S]: sign=l
S2 - sum= 1
S3: deno=2
S4: sign=(-l^sign
S5: term=sign*(l/deno)
S6: sum=sum+term
S7: deno=deno+l
若deno<100返回S4;否则算法结束。
[例2.5]对一个大于或等于3的正整数,判断它 是不是-个素数丿yW
判断一个数n(n>3)是否素数的方法是将M乍为被除数, 将2到介1各个整数先后作为除数,如果都不能被整除, 则兀为素数。
算法如下:
S]:输入〃的值
52: i=2 G作为除数)
S3: 〃被i除,得余数厂
Sj:如果r=0,表示“能被z?整除,则输出 J不是素数”, 聲法结束;否则执行S5
J是素数乃,然后S5:
J是素数乃,然后
S宰如果i
2.3算法的特性
(1)有穷性。一个算法应包含有限的操作步骤,而不能 是无B艮的。
(2)确定性。算法中的每一个步骤都应当是确定的,而 不应当是含糊的、模棱两可的。
(3)有零个或多个输入。所谓输入是指在执行算法时需 要从外界取得必要的信息。
(4)有一个或多个输出。算法的目的是为了求解,“解” 就是输出。
(5)有效性。算法中的每一个步骤都应当能有效地执行, 并得到确定的结果。
2.4怎样表示一个算法
为了表示一个算法,可以用不同的方法。 常用的方法有:
自然语言 传统流程图 N-S流程图 伪代码 PAD图等。
O
O连接点
242用流程图表示算法
) 起止框
输入输出框
处理框 流程线
[例2.6]将例2.1求5啲算法用流程图表示
2=>z
門二”
汁1二>『
[例2.7]将例2.2的算用流程图表示。将50名学生 中成绩在80分以上者的学号和成绩输出
JY
JY
[例2.8]将例2.3判定闰年的算法用流程图表示
20003),
y不能被4整除
N
y二二y禾能被loo整矗二二二円
输出y是闰年输出y
输出y是闰年
输出y不是闰年
输出y是闰年
输出y不是闰年