鐘秋琴
職業(yè)學(xué)校的計(jì)算機(jī)語(yǔ)言教學(xué)中,學(xué)生編寫程序常常沒(méi)有頭緒,其原因是沒(méi)有搞清楚編制一個(gè)計(jì)算機(jī)解題程序的結(jié)構(gòu)。我認(rèn)為在教學(xué)中讓學(xué)生了解數(shù)學(xué)解題過(guò)程與計(jì)算機(jī)程序結(jié)構(gòu)的關(guān)系很有必要。計(jì)算機(jī)程序是三種基本結(jié)構(gòu):順序結(jié)構(gòu)、選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)。它們是否與數(shù)學(xué)上人工解題的順序過(guò)程、選擇過(guò)程、循環(huán)過(guò)程一一對(duì)應(yīng)呢?答案是否定的。因?yàn)樯鲜龈鞣N過(guò)程的劃分是由數(shù)學(xué)上人工解題的不同方法確定的,而不同程序結(jié)構(gòu)的劃分是由計(jì)算機(jī)的不同解題方法確定的。這兩種方法有時(shí)是一致的,有時(shí)不一致。特別是當(dāng)人工算法的步驟不能簡(jiǎn)單地用計(jì)算機(jī)語(yǔ)言表達(dá)時(shí),兩種算法就不一致了。這時(shí),往往借用循環(huán)結(jié)構(gòu)處理一些非循環(huán)過(guò)程。
一、選擇過(guò)程和選擇結(jié)構(gòu)
選擇過(guò)程的計(jì)算機(jī)程序一般來(lái)說(shuō)呈分支結(jié)構(gòu)。
例如計(jì)算:y=□
數(shù)學(xué)上人工解法是對(duì)于一個(gè)任意給定的x,根據(jù)其值選(1)式或(2)式。運(yùn)算過(guò)程是一個(gè)選擇的過(guò)程。計(jì)算機(jī)的解題方法和人工方法是一致的,程序結(jié)構(gòu)為選擇結(jié)構(gòu)。程序如下:
input “x=”;x
if x>=0then y=sqr(x) else y=sqr(-x)
print “y=”;y
end
反過(guò)來(lái),一個(gè)程序如果是選擇結(jié)構(gòu),可見其數(shù)學(xué)處理過(guò)程也是分支選擇的。
二、循環(huán)過(guò)程和循環(huán)結(jié)構(gòu)
循環(huán)過(guò)程的程序處理一般來(lái)說(shuō)是一個(gè)循環(huán)結(jié)構(gòu)。如給出n個(gè)任意的數(shù),求其正數(shù)之和并輸出正數(shù)。人工解題可以歸納為對(duì)給出的數(shù)逐個(gè)進(jìn)行判別,如為正數(shù),則進(jìn)行累加并列出,否則跳過(guò)。重復(fù)n次這樣的操作后結(jié)束。這個(gè)過(guò)程是一個(gè)循環(huán)的過(guò)程。計(jì)算機(jī)的運(yùn)算步驟也采用循環(huán)結(jié)構(gòu)。程序如下:
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
反過(guò)來(lái),一個(gè)程序是循環(huán)結(jié)構(gòu),它對(duì)應(yīng)的數(shù)學(xué)處理過(guò)程不一定就是循環(huán)過(guò)程,有可能是順序過(guò)程。
三、順序過(guò)程和順序結(jié)構(gòu)
一個(gè)順序結(jié)構(gòu)的程序?qū)?yīng)的數(shù)學(xué)處理過(guò)程一定是順序的,反過(guò)來(lái),順序過(guò)程的程序處理很可能是一個(gè)循環(huán)結(jié)構(gòu)。所以,概括地說(shuō),數(shù)學(xué)上的順序處理過(guò)程,在計(jì)算機(jī)處理時(shí)程序往往是一個(gè)循環(huán)結(jié)構(gòu)。下面舉例說(shuō)明。
求立方值大于2000的最小整數(shù)。數(shù)學(xué)上人工解法是設(shè)x滿足:
x3=2000 (1)
得出 x=12.5992(2)
最后求出最小整數(shù)是13。整個(gè)運(yùn)算過(guò)程從設(shè)未知量x開始,到最后根據(jù)x值求出結(jié)果。根據(jù)這個(gè)算法,它是一個(gè)順序過(guò)程。但這個(gè)解法在計(jì)算機(jī)上實(shí)現(xiàn)不了,因?yàn)橛?jì)算機(jī)程序是不能對(duì)未知量進(jìn)行操作的。將人工解法的思想同計(jì)算機(jī)運(yùn)行特點(diǎn)結(jié)合起來(lái)考慮。假設(shè)一個(gè)具體的數(shù)值a滿足a3>2000,判斷是否成立,若不成立,則假設(shè)a為另一個(gè)數(shù),繼續(xù)以上的判斷,直到某次假設(shè)的a使不等式成立,而輸出這個(gè)a值,操作結(jié)束。而不斷假設(shè)的a值應(yīng)是從小到大的差為1的等差數(shù)列,這樣才能保證所求a是最小整數(shù)且不至于漏掉某個(gè)可能的答案。這樣由人工算法演變到計(jì)算機(jī)算法就將一個(gè)原本不循環(huán)的計(jì)算問(wèn)題變?yōu)橐粋€(gè)循環(huán)的計(jì)算問(wèn)題,目的在于變未知量為已知量。計(jì)算機(jī)算法如下:
由103=1000,可估計(jì)所求數(shù)大于10。
(1)(1)設(shè)所求數(shù)為11,判斷113>2000是否成立?(不成立)
(2)(2)設(shè)所求數(shù)為12,判斷123>2000是否成立?(不成立)
(n)(n)設(shè)所求數(shù)為(10+n),判斷(10+n)3>2000是否成立?
假設(shè)的數(shù)從一開始的11,每次遞增1,直到第n次使不等式成立,則數(shù)(10+n)為所求結(jié)果。程序如下:
number=11
do while number^3<=2000
number=number+1
loop
print “number=”;number
end
所以,凡是有未知量存在的數(shù)學(xué)解題方法,在計(jì)算機(jī)上均可演變?yōu)閷?duì)假設(shè)具體數(shù)值循環(huán)操作的解題方法,這是個(gè)順序過(guò)程循環(huán)處理的典型例子。是由計(jì)算機(jī)程序的操作局限性所決定的。
再看一個(gè)我國(guó)古代數(shù)學(xué)家在《算經(jīng)》中出的一道題:“雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一。百錢買百雞,問(wèn)雞翁、母、雛各幾何?”意為:公雞每只5元,母雞3元,小雞3只1元,問(wèn)公雞、母雞、小雞各多少?
數(shù)學(xué)上人工解法如下:
(1)(1)分析:設(shè)公雞、母雞、小雞均為x、y、z只,則
x+y+z=100
5x+3y+z/3=100
這是一個(gè)3元1次方程,但只有兩個(gè)方程式,一般是解不出。
(2)判斷:根據(jù)題意,可以知道x、y、z均為大于等與零的整數(shù),又z必須被整除3,x在0—20,y在0—33,z在0—99之間,用x,y的值依次去試,直到找到答案。
這個(gè)算法是一個(gè)人工算法,其中有列式計(jì)算,也有判斷推導(dǎo),用計(jì)算機(jī)語(yǔ)言是無(wú)法實(shí)現(xiàn)的。計(jì)算機(jī)語(yǔ)言所進(jìn)行的操作是基本的代數(shù)運(yùn)算、函數(shù)運(yùn)算和邏輯關(guān)系運(yùn)算?;谶@個(gè)原則,所確定的計(jì)算步驟應(yīng)盡量地簡(jiǎn)單,不超出語(yǔ)言所能表達(dá)的范圍。計(jì)算機(jī)算法如下:
令cock、hen、chick表示公雞、母雞、小雞的只數(shù),用循環(huán)語(yǔ)句,先定下公雞的只數(shù)0—20,當(dāng)公雞數(shù)定下后,再定母雞的只數(shù)0—33,根據(jù)題意,小雞的只數(shù)為100-cock-hen,用條件語(yǔ)句判斷錢數(shù)是否為100,若成立,則輸出結(jié)果,否則一直窮盡所有組合。程序如下:
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
以上可以看出,因?yàn)閿?shù)學(xué)上的運(yùn)算步驟不是都可以用計(jì)算機(jī)語(yǔ)言表達(dá)得出來(lái)的,在語(yǔ)言不能表達(dá)時(shí),就要簡(jiǎn)化運(yùn)算步驟,使得語(yǔ)言能夠表達(dá)這些運(yùn)算步驟,這樣的結(jié)果就是將一個(gè)順序問(wèn)題變成一個(gè)在計(jì)算機(jī)上運(yùn)行的循環(huán)問(wèn)題。
總結(jié)以上的內(nèi)容可知,由于(1)計(jì)算機(jī)程序不能對(duì)未知量進(jìn)行操作,(2)計(jì)算機(jī)語(yǔ)言所能進(jìn)行的操作一般為基本的代數(shù)運(yùn)算、函數(shù)運(yùn)算和邏輯關(guān)系運(yùn)算,它所能表達(dá)的運(yùn)算種類有限。所以當(dāng)一個(gè)人工解題算法違背了計(jì)算機(jī)程序的操作原則或不能用計(jì)算機(jī)相應(yīng)的操作語(yǔ)句表達(dá)它的運(yùn)算步驟時(shí),計(jì)算機(jī)的解題算法和人工算法就不一致了。這就是為什么一個(gè)數(shù)學(xué)上幾步就可以完成的順序過(guò)程問(wèn)題,程序?qū)崿F(xiàn)時(shí)往往是一個(gè)循環(huán)結(jié)構(gòu)問(wèn)題的原因。所以,數(shù)學(xué)上人工解題的三個(gè)基本過(guò)程與計(jì)算機(jī)程序的三種基本結(jié)構(gòu)之間的關(guān)系可以概括為:順序過(guò)程是順序結(jié)構(gòu)的必要而非充分條件;分支過(guò)程是選擇結(jié)構(gòu)的充分必要條件;循環(huán)過(guò)程是循環(huán)結(jié)構(gòu)的充分而非必要條件。