a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 89|回复: 1

[C语言] 计算机等级考试二级C语言常用的算法(1)

[复制链接]
发表于 2012-7-31 21:48:08 | 显示全部楼层 |阅读模式
  什么是程序?程序= 数据结构+ 算法。
# g/ K- o0 g+ c; E( ]3 x  对于面向对象程序设计,强调的是数据结构,而对于面向过程的程序设计语言如C、P a s c a l、F O RT R A N等语言,主要关注的是算法。掌握算法,也是为面向对象程序设计打下一个扎实的基础。那么,什么是算法呢?' a( E  C& q' B8 V+ G. M" d; \" J
  人们使用计算机,就是要利用计算机处理各种不同的问题,而要做到这一点,人们就必须事先对各类问题进行分析,确定解决问题的具体方法和步骤,再编制好一组让计算机执行的指令即程序,交给计算机,让计算机按人们指定的步骤有效地工作。这些具体的方法和步骤,其实就是解决一个问题的算法。根据算法,依据某种规则编写计算机执行的命令序列,就是编制程序,而书写时所应遵守的规则,即为某种语言的语法。. s+ w2 ]' r  z2 B% p/ h9 K
  由此可见,程序设计的关键之一,是解题的方法与步骤,是算法。学习高级语言的重点,就是掌握分析问题、解决问题的方法,就是锻炼分析、分解,最终归纳整理出算法的能力。与之相对应,具体语言,如C语言的语法是工具,是算法的一个具体实现。所以在高级语言的学习中,一方面应熟练掌握该语言的语法,因为它是算法实现的基础,另一方面必须认识到算法的重要性,加强思维训练,以写出高质量的程序。
9 }  [3 ~, r, g2 ?; n) _; U! n  下面通过例子来介绍如何设计一个算法:6 D- M$ s: ]5 v4 F% \
  [例1-4] 输入三个数,然后输出其中最大的数。
# h. G9 r% e3 w  首先,得先有个地方装这三个数,我们定义三个变量A、B、C,将三个数依次输入到A、B、C中,另外,再准备一个M A X装最大数。由于计算机一次只能比较两个数,我们首先把A与B比,大的数放入M A X中,再把M A X 与C比,又把大的数放入M A X中。最后,把M A X输出,此时M A X中装的就是A、B、C三数中最大的一个数。算法可以表
- Q' l+ v0 J) _4 p  示如下:# T  u0 K- r7 G$ O1 \$ z$ A( u
  1) 输入A、B、C。3 O0 V# I3 q9 N" m' ]5 B. F2 X2 t
  2) A与B中大的一个放入M A X中。. n* g1 h  |) `# A. P8 X
  3) 把C与M A X中大的一个放入M A X中。
1 Q$ d, `- {" Q- ?$ }) X, r5 R  4) 输出M A X,M A X即为最大数。
0 Q* U5 V  M8 S2 c2 a/ ~9 k  其中的2 )、3 )两步仍不明确,无法直接转化为程序语句,可以继续细化:
3 y- h! f2 r( v7 }" d+ I  2) 把A与B中大的一个放入M A X中,若A > B,则MAX ←A;否则MAX ←B。% e0 s" j, u; w7 W# A. Q
  3) 把C与M A X中大的一个放入M A X中,若C > M A X,则M A X←C。3 n3 p% b5 o) _, `
  于是算法最后可以写成:, L- y% Q0 B1 x! m  K
  1) 输入A,B,C。- w+ w* i& |/ v# e9 D
  2) 若A > B,则MAX ←A;; v, o1 ]- K8 A& B& ]' Y
  否则M A X←B。
0 u# ~; ]/ Q" N* ?! ~2 o) M+ c/ }  3) 若C > M A X,则M A X←C。4 |! q/ H& v' I6 d
  4) 输出M A X,M A X即为最大数。
' W- A0 [* |' E. r" J  这样的算法已经可以很方便地转化为相应的程序语句了。
% d& _5 R6 M/ h- G9 G+ R  [例1-5] 猴子吃桃问题:有一堆桃子不知数目,猴子第一天吃掉一半,觉得不过瘾,又多吃了一只,第二天照此办理,吃掉剩下桃子的一半另加一个,天天如此,到第十天早上,猴子发现只剩一只桃子了,问这堆桃子原来有多少个?
- R1 o3 Q" n% t( A* L" X3 A  此题粗看起来有些无从着手的感觉,那么怎样开始呢?假设第一天开始时有a1只桃子,第二天有a2只,. . .,第9天有a9只,第1 0天是a1 0只,在a1, a2, . . .,a1 0中,只有a1 0= 1是知道的,现要求a1,而我们可以看出,a1, a2, . .,a1 0之间存在一个简单的关系:$ b7 M' a; A3 x5 d9 X% s
  a9= 2 * ( a1 0+ 1 )
: B. N" f) R1 W: E4 @  a8= 2 * ( a9+ 1 )  j& |6 n. I  H3 r) ^
  ┇
9 `' ~% {" i' ^0 p* I5 O  a1= 2 * ( a2+ 1 )
* a2 b# Y* S& z, C/ D/ G$ m  也就是:ai= 2 * ( ai + 1+1) i=9,8,7,6,...,1# t2 z+ \) l8 u0 p- o1 i7 h
  这就是此题的数学模型。2 S) f0 P# E9 b
  再考察上面从a9,a8直至a1的计算过程,这其实是一个递推过程,这种递推的方法在计算机解题中经常用到。另一方面,这九步运算从形式上完全一样,不同的只是ai的下标而已。由此,我们引入循环的处理方法,并统一用a0表示前一天的桃子数,a1表示后一天的桃子数,将算法改写如下:8 L: E2 s6 |; |- w' ]6 A( z% L
  1) a1=1; {第1 0天的桃子数,a1的初值}
. P  S! E1 @0 K% M+ t# R! K  i = 9。{计数器初值为9}
6 p  m3 o+ R9 e" P# k  2) a0= 2 * ( a1+ 1 )。{计算当天的桃子数}  b4 O6 P+ o- H0 j/ `+ @- I0 i7 Y$ u
  3) a1= a0。{将当天的桃子数作为下一次计算的初值}! \# j( W4 m, f1 X9 p
  4) i=i-1。
6 M% d% T' _* u5 k8 R  5) 若i > = 1,转2 )。
6 z2 N* _: F3 N. I  6) 输出a0的值。5 Y) k1 t/ Q! x7 g
  其中2 )~5 )步为循环。# b0 |9 ?" I* Z: v) U3 |, S1 C
  这就是一个从具体到抽象的过程,具体方法是:# B: g' H8 U& J6 w) E
  1) 弄清如果由人来做,应该采取哪些步骤。
/ p0 p: V2 o( }  2) 对这些步骤进行归纳整理,抽象出数学模型。+ ?, V2 x& z3 c( z7 ^* B* s! p
  3) 对其中的重复步骤,通过使用相同变量等方式求得形式的统一,然后简练地用循环解决。
) |, b1 E$ P1 Y  P0 ^0 d; G) n  算法的描述方法有自然语言描述、伪代码、流程图、N - S图、PA D 图等。
  x: H  w. g% r" w0 n  1.4.1 流程图与算法的结构化描述! Q* J' ~) F! m$ y2 h
  1. 流程图) j% {% Y6 e: O9 J
  流程图是一种传统的算法表示法,它利用几何图形的框来代表各种不同性质的操作,用流程线来指示算法的执行方向。由于它简单直观,所以应用广泛,特别是在早期语言阶段,只有通过流程图才能简明地表述算法,流程图成为程序员们交流的重要手段,直到结构化的程序设计语言出现,对流程图的依赖才有所降低。8 M4 v, s2 b6 v' E) j
  下面介绍常见的流程图符号及流程图的例子。2 b/ j* i8 I: l  B/ e
  本章例1 - 1的算法的流程图如图1 - 2所示。本章例1 - 2的算法的流程图如图1 - 3所示。在流程图中,判断框左边的流程线表示判断条件为真时的流程,右边的流程线表示条件为假时的流程,有时就在其左、右流程线的上方分别标注“真”、“假”或“T”、“F”或“Y”、“N”。/ e# L! U' m7 n5 v6 v8 A3 d! k( r
  另外还规定,流程线是从下往上或从右向左时,必须带箭头,除此以外,都不画箭头,流程线的走向总是从上向下或从左向右。
回复

使用道具 举报

 楼主| 发表于 2012-7-31 21:48:09 | 显示全部楼层

计算机等级考试二级C语言常用的算法(1)

  2. 算法的结构化描述1 k7 W- ]  c7 V' P3 Z8 Z1 B
  早期的非结构化语言中都有g o t o语句,它允许程序从一个地方直接跳转到另一个地方去。执行这样做的好处是程序设计十分方便灵活,减少了人工复杂度,但其缺点也是十分突出的,一大堆跳转语句使得程序的流程十分复杂紊乱,难以看懂也难以验证程序的正确性,如果有错,排起错来更是十分困难。这种转来转去的流程图所表达的混乱与复杂,正是软件危机中程序人员处境的一个生动写照。而结构化程序设计,就是要把这团乱麻理清。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-17 11:46 , Processed in 0.779380 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表