陈侃 陈梅
“算法初步”这一章是高中新课改数学新增的内容,其思想非常重要, 但算法并不神秘,例如运用消元法解二元一次方程组的过程就是一种算法. 为了有条理地、清晰地表达算法,往往需要将解决问题的过程整理成程序框图;为了能在计算机上实现,还要将程序框图翻译成计算机语言,也就是程序. 在学习过程中,能熟练地进行两者间的互化,是掌握算法的基础.
一、根据程序框图设计程序
根据程序框图设计程序的一般步骤:(1)理解题意,确定程序框图的结构(顺序结构、条件结构、循环结构);(2)明确各程序框的含义,并且写出对应的程序代码;(3)在有条件的情况下,进行上机运行.
例1 请写出下面的程序框图描述的程序.
[x<1?] [开始 ] [否][是][结束] [输出y] [输入x] [x<10?] [是] [否]
分析 通过观察,此程序框图为条件结构,而条件结构的程序为:
[IF 条件 THEN
语句体1
ELSE
语句体2
END IF]
解 所求算法的程序为: [INPUT x
IF x<1 THEN
y = x^2
ELSE
IF x<10 THEN
y = 2*x+1
ELSE
y = 3*x-11
END IF
END IF
PRINT y
END]
点拨 (1)在本程序中,IF-THEN语句中嵌入了另一个IF-THEN语句,在每个语句结束时都要写END IF; (2)程序中的符号都要用专用符号,例如:乘号、幂等.
例2 请写出下面的程序框图描述的程序.
[开始 ] [否][结束] [输出S] [k>50?][是]
分析 通过观察,此程序框图是循环结构,程序设计语言中有直到型和当型两种循环结构. 直到型循环结构对应的UNTIL语句是:
[DO
循环体
LOOP UNTIL 条件]
当型循环结构对应的WHILE语句是:
[WHILE 条件
循环体
WEND]
通过进一步分析我们发现,此循环结构用当型和直到型循环结构的语句都符合程序框图.
解法一 UNTIL语句编写计算机程序:
[k=1
S=0
DO
S=S+1/k
k=k+1
LOOP UNTIL k>50
PRINT S
END]
解法二 WHILE语句编写计算机程序:
[k=1
S=0
WHILE k<=50
S=S+1/k
k=k+1
WEND
PRINT S
END]
二、根据程序画出程序框图
根据程序画程序框图的一般步骤:(1)理解题意,确定程序的结构语句(条件语句、循环语句);(2)明确各函数的含义,一步一步转化为程序框图;(3)最后合成整个程序的程序框图. 在画程序框图的过程中,要注意所有的细节,例如各种语句所对应的框的特征,不要忘记起止框等.
例3 请根据给出的算法程序画出程序框图.
[INPUT “x=”; x
b = x MOD 2
IF b = 0 THEN
PRINT “it is even”
ELSE
PRINT “it is odd”
END IF
END]
分析 先读懂题意,先找出关键语句(条件语句,循环语句),此题为条件结构,然后发现程序中“MOD”语句,意味着需要取余数. 这里[b]等于[x]除以2的余数,即判断[x]是否为偶数,最后写出程序框图.
解 此程序的程序框图为:
[开始 ] [否][结束] [输出“x是偶数”] [b=0?][是] [b等于x除以2的余数] [输入x][输出“x是奇数”]
例4 请根据给出的算法程序画出程序框图.
[INPUT “x=”;x
k = 0
DO
x = 10*x+9
k = k+1
LOOP UNTIL x>2014
PRINT k
END]
分析 由题意,很容易发现此程序为直到型循环结构,再加上一些基本的赋值语句.
解 此程序的程序框图为:
[开始 ] [否][结束] [输出k] [x>2014?][是] [输入x]
通过以上例题分析,我们可以发现,只要掌握了程序框图的几种结构(顺序结构、条件结构、循环结构)和各种框的功能,知道程序框图的一般画法,掌握了程序的算法语句(输入、输出语句,条件语句、循环语句),并且能把程序框图的结构与程序的语句一一对应,那么我们就可以非常轻松、方便地解决程序与程序框图的互化问题.
程序与程序框图是描述算法的两种重要语言,它们各有优势. 程序框图具有直观、形象的特点,我们可以迅速地理解某一算法,但计算机无法理解它,程序虽复杂,但计算机可以执行,方便计算. 所以我们在学习算法这一章时,应该熟练掌握,灵活运用.
[练习]
1. 根据程序框图写出程序.
[开始 ] [否][结束] [输出S] [是] [输入a,b]
2. 根据程序框图写出程序.
[开始 ] [否][结束] [输出y] [是] [输入x]
3. 请根据下面的程序,画出程序框图. [INPUT “n=”;n
i = 1
S = 0
WHILE i<=n
S = S +(i+1)/i
i=i+1
WEND
PRINT “S=”;S
END]
[参考答案]
1.
[INPUT [a,b]
IF [a+b<1] THEN
[S=2*a+b]
ELSE
[S=1]
END IF
PRINT [S]
END]
2.
[INPUT “x=”;x
DO
y = x/3+2
x = y
LOOP UNTIL ABS(y-x)<1
PRINT y
END]
3.
[开始 ] [否][结束] [输出s] [是] [输入n] [[i≤n?]]