钟秋琴
职业学校的计算机语言教学中,学生编写程序常常没有头绪,其原因是没有搞清楚编制一个计算机解题程序的结构。我认为在教学中让学生了解数学解题过程与计算机程序结构的关系很有必要。计算机程序是三种基本结构:顺序结构、选择结构与循环结构。它们是否与数学上人工解题的顺序过程、选择过程、循环过程一一对应呢?答案是否定的。因为上述各种过程的划分是由数学上人工解题的不同方法确定的,而不同程序结构的划分是由计算机的不同解题方法确定的。这两种方法有时是一致的,有时不一致。特别是当人工算法的步骤不能简单地用计算机语言表达时,两种算法就不一致了。这时,往往借用循环结构处理一些非循环过程。
一、选择过程和选择结构
选择过程的计算机程序一般来说呈分支结构。
例如计算:y=□
数学上人工解法是对于一个任意给定的x,根据其值选(1)式或(2)式。运算过程是一个选择的过程。计算机的解题方法和人工方法是一致的,程序结构为选择结构。程序如下:
input “x=”;x
if x>=0then y=sqr(x) else y=sqr(-x)
print “y=”;y
end
反过来,一个程序如果是选择结构,可见其数学处理过程也是分支选择的。
二、循环过程和循环结构
循环过程的程序处理一般来说是一个循环结构。如给出n个任意的数,求其正数之和并输出正数。人工解题可以归纳为对给出的数逐个进行判别,如为正数,则进行累加并列出,否则跳过。重复n次这样的操作后结束。这个过程是一个循环的过程。计算机的运算步骤也采用循环结构。程序如下:
input “n=”;n
for i=1 to n
input “number=”;number
if number>=0 then
sum=sum+number
print “number=”;number
end if
next i
print “sum=”;sum
end
反过来,一个程序是循环结构,它对应的数学处理过程不一定就是循环过程,有可能是顺序过程。
三、顺序过程和顺序结构
一个顺序结构的程序对应的数学处理过程一定是顺序的,反过来,顺序过程的程序处理很可能是一个循环结构。所以,概括地说,数学上的顺序处理过程,在计算机处理时程序往往是一个循环结构。下面举例说明。
求立方值大于2000的最小整数。数学上人工解法是设x满足:
x3=2000 (1)
得出 x=12.5992(2)
最后求出最小整数是13。整个运算过程从设未知量x开始,到最后根据x值求出结果。根据这个算法,它是一个顺序过程。但这个解法在计算机上实现不了,因为计算机程序是不能对未知量进行操作的。将人工解法的思想同计算机运行特点结合起来考虑。假设一个具体的数值a满足a3>2000,判断是否成立,若不成立,则假设a为另一个数,继续以上的判断,直到某次假设的a使不等式成立,而输出这个a值,操作结束。而不断假设的a值应是从小到大的差为1的等差数列,这样才能保证所求a是最小整数且不至于漏掉某个可能的答案。这样由人工算法演变到计算机算法就将一个原本不循环的计算问题变为一个循环的计算问题,目的在于变未知量为已知量。计算机算法如下:
由103=1000,可估计所求数大于10。
(1)(1)设所求数为11,判断113>2000是否成立?(不成立)
(2)(2)设所求数为12,判断123>2000是否成立?(不成立)
(n)(n)设所求数为(10+n),判断(10+n)3>2000是否成立?
假设的数从一开始的11,每次递增1,直到第n次使不等式成立,则数(10+n)为所求结果。程序如下:
number=11
do while number^3<=2000
number=number+1
loop
print “number=”;number
end
所以,凡是有未知量存在的数学解题方法,在计算机上均可演变为对假设具体数值循环操作的解题方法,这是个顺序过程循环处理的典型例子。是由计算机程序的操作局限性所决定的。
再看一个我国古代数学家在《算经》中出的一道题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”意为:公鸡每只5元,母鸡3元,小鸡3只1元,问公鸡、母鸡、小鸡各多少?
数学上人工解法如下:
(1)(1)分析:设公鸡、母鸡、小鸡均为x、y、z只,则
x+y+z=100
5x+3y+z/3=100
这是一个3元1次方程,但只有两个方程式,一般是解不出。
(2)判断:根据题意,可以知道x、y、z均为大于等与零的整数,又z必须被整除3,x在0—20,y在0—33,z在0—99之间,用x,y的值依次去试,直到找到答案。
这个算法是一个人工算法,其中有列式计算,也有判断推导,用计算机语言是无法实现的。计算机语言所进行的操作是基本的代数运算、函数运算和逻辑关系运算。基于这个原则,所确定的计算步骤应尽量地简单,不超出语言所能表达的范围。计算机算法如下:
令cock、hen、chick表示公鸡、母鸡、小鸡的只数,用循环语句,先定下公鸡的只数0—20,当公鸡数定下后,再定母鸡的只数0—33,根据题意,小鸡的只数为100-cock-hen,用条件语句判断钱数是否为100,若成立,则输出结果,否则一直穷尽所有组合。程序如下:
dim cook as integer,hen as integer,chick as integer
print “cook”,“hen”,“chick”
for cock=0 to 20
for hen=0 to 33
chick=100-cock-hen
if 5*cock+3*hen+chick/3=100 then print cock,hen,chick
next hen
next cock
end
以上可以看出,因为数学上的运算步骤不是都可以用计算机语言表达得出来的,在语言不能表达时,就要简化运算步骤,使得语言能够表达这些运算步骤,这样的结果就是将一个顺序问题变成一个在计算机上运行的循环问题。
总结以上的内容可知,由于(1)计算机程序不能对未知量进行操作,(2)计算机语言所能进行的操作一般为基本的代数运算、函数运算和逻辑关系运算,它所能表达的运算种类有限。所以当一个人工解题算法违背了计算机程序的操作原则或不能用计算机相应的操作语句表达它的运算步骤时,计算机的解题算法和人工算法就不一致了。这就是为什么一个数学上几步就可以完成的顺序过程问题,程序实现时往往是一个循环结构问题的原因。所以,数学上人工解题的三个基本过程与计算机程序的三种基本结构之间的关系可以概括为:顺序过程是顺序结构的必要而非充分条件;分支过程是选择结构的充分必要条件;循环过程是循环结构的充分而非必要条件。