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