☉湖北省水果湖高級中學 伍先軍 趙 宇
在所有實施新課改的省份的高考數學試題中,都不約而同地出現了流程圖(程序框圖).
圖1是2011年全國新課標高考數學試題中的第5題:
執行圖1所示的程序框圖,如果輸入的N是6,那么輸出的p是( )
A.120
B.720
C.1 440
D.5 040

編制流程圖(程序框圖)是利用計算機編程解決問題的關鍵性的一步.流程圖就是用來描述解決問題的操作步驟的.它由功能圖標和流程線組成.流程圖的功能圖標有4種:圓角矩形、平行四邊形、矩形、菱形,分別表示不同的功能.流程線的一端帶有箭頭,表示程序運行的走向(見圖2).
解流程圖(程序框圖)題,不外乎有兩種基本的解法:
①機械模擬,②模塊歸納.
所謂“機械模擬”,是指我們按照流程線的走向,一步一步地忠實地模擬計算機操作,得到最終結果.一般適用于數據規模較小、功能單一的程序.
所謂“模塊歸納”,是指我們把一個較大的復雜的程序,劃分為一個或多個功能相對獨立的較小的子模塊,分析每個子模塊的入口數據、出口數據,以及這個子模塊對入口數據進行了怎樣的操作從而得到出口數據的,這樣,我們就歸納得出:這個子模塊的實質,就是一個從輸入數據到輸出數據的映射關系,即函數,可抽象地記為:
輸出變量(或中間變量)=f(輸入變量1,輸入變量2,…,輸入變量n).

圖2

表1
若干個小的子模塊再組成一個大的功能模塊,最終,我們就能掌握整個程序的總體功能,再用數學的方式解決,寫出程序運行結果.對于一些功能較復雜、數據規模較大的大中型程序,這種“模塊歸納”的方式是比較合適的.進行模塊歸納時,要特別注意某些變量的初值和終值(統稱為端點)對輸出變量(或中間變量)的影響,在歸納得出函數關系后,要返回到流程圖中去進行端點校驗.
解高考流程圖題的根本方法:
【簡單題】只需機械模擬即可.
【稍難題】先機械模擬理清算法實質,再模塊歸納得出函數關系(或不等式),最后端點校驗以確保正確.
【變式題】在掌握機械模擬和模塊歸納兩種方法后隨機應變.
解流程圖題四十字口訣(原創):
鉛筆作指針,箭頭永向前.
表格當內存,舊值換新顏.
決策看條件,循環是關鍵.
輸入和輸出,函數來相連.
下面以2011年全國新課標高考數學試題第5題為例說明.
從流程圖(見本文開頭)的“開始”圖標開始,順著流程線走,從現在開始,我就變成一臺計算機了!我用左手拿一支鉛筆,筆尖指向當前即將執行的語句(相當于語句指針),右手拿一支筆,在表格中即時記錄、修改變量的值.
左手鉛筆指向“輸入N”,現在我遇到了一個字母N,N是什么?N就是一個變量,我先在草稿紙上畫一個表格,在表頭寫上變量的名字N(見表1),當做計算機存儲空間中的一個存儲單元,現在輸入N的值是6,在N的下面寫上6.
下一句:左手鉛筆指向語句“k=1,p=1”,這本是兩句,合在一起寫了.現在遇到了兩個新的變量k和p,把這兩個變量的名稱也寫入到表格的表頭中,現在本語句執行后它們的值都為1了,在它們的名稱下都寫下1.
繼續!左手鉛筆指向語句p=p·k.這是賦值語句,其中的“=”稱為賦值號,完全不同于數學中的等號,它表示將“=”右邊的表達式(可以是一個常量數據,或者是一個變量,也可以是一個表達式,本句是表達式p·k)的值(計算后),賦給“=”左邊的變量.因此,“=”左邊只能是變量,不能是常量或表達式.
那么,計算機是如何執行p=p·k的呢?先計算“=”右邊的算術表達式p·k的值:從存儲空間中讀取變量p的當前值為1(讀取操作不改變變量的值),讀取變量k的當前值為1,在CPU(中央處理器)中計算1·1,結果為1,再將結果1寫入(賦給)“=”左邊的變量p所在的存儲空間,現在p的值被改為1了(即使它原來的值就是1,計算機仍會執行寫入操作,寫入操作會改變變量的值).此時,劃掉此前的值1,寫上新值1.
繼續!左手鉛筆指向決策圖標:判斷k<N是否成立,計算機讀取變量k的當前值為1,變量N的當前值為6,計算關系表達式1<6的值,顯然1<6是成立的,計算的結果是真(用“是”、“真”或“True”等表示),程序此時轉向“是”分支,執行k=k+1(左手鉛筆指向此句).同樣,這也是一條賦值語句,先計算k+1的值:讀取k的當前值為1,在CPU中計算1+1,結果為2,再將結果2寫入到變量k,故k的值改為2了(劃掉此前的值1).
繼續!再次執行p=p·k,讀取p的值為1,k的值為2,計算1·2,得2,將結果2賦給(寫入)變量p,即p的值改為2了(劃掉此前的值1).
繼續!判斷k<N是否成立,計算機讀取變量k的值為2,變量N的值為6,計算關系表達式2<6,顯然2<6是成立的,計算的結果是真,程序繼續執行“是”分支,執行k=k+1,先計算k+1的值:讀取k的值為2,2+1得3,寫入到變量k,故k的值改為3了(劃掉此前的值2).
如此繼續執行,你會發現:賦值語句p=p·k,條件判斷k<N,賦值語句k=k+1,這3條語句被反復執行了多次,這種結構,在流程圖中構成了“環形”,在計算機語言中稱為“循環結構”.顯然,這種循環結構必須要有結束退出的時候,否則,計算機就會陷入“死循環”,這是程序設計者必須注意的.
你可以不厭其煩地一步一步地模擬計算機執行下去,直到k=N,此時k<N不成立了,就轉向“否”分支,輸出p的值為720.
那么,怎樣提高解題效率呢?換言之,如果本題輸入的N的值更大,你能較快地得出答案嗎?
關鍵在于流程圖中的“環形結構”,也就是循環結構.在循環結構中往往有兩種功能的語句:“關鍵運算”和“條件控制”.所謂“關鍵運算”是指輸出變量(本例為p)參與的運算,本例即p=p·k.所謂“條件控制”是指循環條件(本例即k<N)中的變量(本例為k)參與的運算,本例即k=k+1.通過這兩種功能的語句,你可以得出這段循環語句的功能就是連乘(注意變量p的初值必須為1,變量p常稱為累乘器),乘數從k=1到k=N,每次增加1(這里的變量k常稱為計數器),然后觀察循環之前計數器的初值和循環結束時計數器的終值,重點分析計數器的初值和終值是否參與了關鍵運算(端點校驗),最后得出結論:這段程序計算的是p=1*2*…*N(即N的階乘N!),現在無論輸入的N值是多少,你都可以迅速地用數學的方法計算結果了.這就是前述的“模塊歸納”.