鐘秋琴
職業學校的計算機語言教學中,學生編寫程序常常沒有頭緒,其原因是沒有搞清楚編制一個計算機解題程序的結構。我認為在教學中讓學生了解數學解題過程與計算機程序結構的關系很有必要。計算機程序是三種基本結構:順序結構、選擇結構與循環結構。它們是否與數學上人工解題的順序過程、選擇過程、循環過程一一對應呢?答案是否定的。因為上述各種過程的劃分是由數學上人工解題的不同方法確定的,而不同程序結構的劃分是由計算機的不同解題方法確定的。這兩種方法有時是一致的,有時不一致。特別是當人工算法的步驟不能簡單地用計算機語言表達時,兩種算法就不一致了。這時,往往借用循環結構處理一些非循環過程。
一、選擇過程和選擇結構
選擇過程的計算機程序一般來說呈分支結構。
例如計算: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)計算機語言所能進行的操作一般為基本的代數運算、函數運算和邏輯關系運算,它所能表達的運算種類有限。所以當一個人工解題算法違背了計算機程序的操作原則或不能用計算機相應的操作語句表達它的運算步驟時,計算機的解題算法和人工算法就不一致了。這就是為什么一個數學上幾步就可以完成的順序過程問題,程序實現時往往是一個循環結構問題的原因。所以,數學上人工解題的三個基本過程與計算機程序的三種基本結構之間的關系可以概括為:順序過程是順序結構的必要而非充分條件;分支過程是選擇結構的充分必要條件;循環過程是循環結構的充分而非必要條件。