曹恒來


算法就是解決問題的方法與步驟。程序設計時,首先分析所要解決的問題,然后進行算法設計,再選用一種計算機語言來描述算法,形成計算機程序,因此算法是程序設計的基礎。設計了一個算法之后,不能只是心知肚明,還必須準確清楚地將它記錄下來,或提供交流,或依靠它來編寫程序。描述算法的方法有很多,常用的有自然語言、流程圖、偽代碼等。解決同一個問題的算法可能有多種,也會有優劣之分。
本課的學習對象是八年級學生,他們處于皮亞杰認知理論階段的形式運算階段,好奇心強,有—定的探索能力和表達欲望,并且能夠在原有知識的基礎上進行遷移,生活中也接觸過各種各樣的“算法”。但是,絕大多數學生沒有接觸過程序設計,即使接觸過程序設讓也不夠熟悉。很少有學生用計算機實現過算法,從生活算法出發,可以幫助學生形成算法的概念,但難以形成全面、透徹的認識。雖然在日常生活中經常遇到各種各樣的流程圖,但對流程圖的認識只是停留在直觀感受的層面,也不知道如何規范地使用流程圖符號來描述算法。
(1)理解算法的概念,明確算法對于程序設計的重要性。
(2)學會使用自然語言和流程圖描述算法。
(3)理解算法的三種基本結構
(4)在用不同方法解決查找問題的過程中,體會算法的效率。
教學重點:使用自然語言和流程圖描述算法,明確算法對于程序設計的重要性。
教學難點:使用流程圖描述算法。
1.感知生活,走進算法
腹有詩書氣自華,最是書香能致遠。讀書可以讓人保持思想活力,讓人得到智慧啟發,讓人滋養浩然之氣。
活動1:為了營造良好的閱讀環境,小明去新華書店為班級采購圖書。思考以下問題:
(1)生活中買書的流程是什么?(①選書;②付款)
(2)購買了某種圖書后,如何計算付款額?(①已知購書數量和圖書單價;②將數量乘以單價;③得出付款額)
小結:這種為解決一個問題而采取的方法和步驟,就稱為算法。買書的流程、計算付款額的步驟,其實就是算法。
設計意圖:通過計算圖書的付款額這個“現實”中的問題,引導學生對問題進行分析,找到解決問題的方法和步驟,感知生活中的算法,從而揭開算法的神秘面紗,初步建立算法的概念。
2.解決問題,描述算法
為便于交流,設計好算法之后,還必須把它準確清楚地表示出來。描述算法的方法有多種,活動1采用的是自然語言也就是日常生活中使用的漢語、英語等語言。還可以用流程圖描述算法,流程圖是用一組規定式樣的幾何圖形、簡明扼要的文字和帶箭頭的流線來表示算法。
活動2:用流程圖描述“計算圖書付款額”的算法(如圖1)。
(1)結合生活經驗,說一說表1中各流程圖符號的作用。
(2)教師演示“畫程”軟件中的圖標工具及使用方法。學生參照自然語言描述的算法,嘗試繪制“計算圖書付款額”的流程圖。(圖書數量為x,單價為y,付款額為pay)
(3)觀察并執行“計算圖書付款金額”流程圖,總結該算法的結構特點。
小結:①算法可以用自然語言和流程圖來進行描述;②這個流程圖中的各個操作能夠按照自上而下的順序執行,因此稱為順序結構。
活動3:“五一”到了新華書店搞優惠促銷活動,全場享受九折優惠,凡購書滿200元打八五折。請用流程圖來描述優惠購書時計算付款額的算法。
(1)用自然語言描述打折算法。
①輸入書的數量x(本)和單價y(元);
②計算pay=xy;
③判斷:如果()成立,則打九折,pay pay*0.9,否則打八五折,();
④輸出付款金額payo
(2)參照自然語言描述的算法,使用“畫程”軟件繪制流程圖(如圖2),執行該流程圖,輸入不同的購書數量及單價,思考:
①這個流程圖中是用哪種圖形符號實現條件判斷?
②這個問題中的條件是什么?條件成立時執行什么操作?不成立又執行什么操作?
小結:虛線框內利用“判斷選擇”框對條件進行判斷,根據給定的條件是否成立,從兩個分支路徑中選擇執行其中之一,這種控制結構稱為分支結構(或選擇結構)。
活動4:小明在新華書店看到了多種喜愛的圖書,決定全部購買下來,又該如何計算付款額呢?
(1)思考分析:
①假如小明買了兩種圖書,如何計算付款額?購買多種圖書時,又如何計算付款額呢?
②如何實現循環?又該如何結束循環?(以輸入的圖書數量0作為結束循環的標志)
(2)請用自然語言描述該算法。
①付款額pay清0;
②輸入書的數量x(本)和單價y(元);
③如果()成立,則:
計算pay=x*y+pay.();
回到③,重復執行;
否則結束循環;
④輸出付款金額pay
(3)使用“畫程”軟件繪制流程圖(如圖3),執行流程圖,輸入各種圖書的數量及單價,思考:
①用什么圖形符號可以描述重復執行的過程?
②該流程圖是如何執行的?
小結:虛線框內利用“判斷循環”框對條件進行判斷,若條件成立,重復執行某個操作,這種控制結構稱為循環結構。
通過計算圖書付款額系列問題,我們發現:①自然語言描述算法容易理解;②流程圖描述算法直觀、簡潔、易懂,并且邏輯關系清晰;③算法有三種基本結構,即順序結構、分支結構和循環結構。在實際編程過程中常將這三種結構進行組合以實現各種算法。
設計意圖:從分析計算圖書付款額的問題出發,分別利用自然語言及流程圖來描述算法,體會自然語言、流程圖描述算法的特點。在解決計算“購買一種圖書付款額”“優惠購書”“購買多種圖書”付款額等系列問題過程中,理解算法的三種基本結構,學生分析問題、解決問題的能力也得到提升。選用“畫程”工具來繪制流程圖,學生只需用拖拽圖標的方式就能輕松地繪制流程圖,而且這個流程圖是可以執行的,以驗證算法是否可行,使得算法學習能夠以“學生”和“思維”為中心,在沒有接觸程序設計語言的情況下也能夠研究和設計算法,大大降低了算法學習的門檻。

3.實例分析,再認算法
前面圖書的單價都是由用戶輸入的,而在實際生活中,往往是通過輸入商品編碼,從數據庫中查找對應商品的單價。
活動5:根據圖書ISBN編碼,在表2“圖書信息表”中查找圖書單價(表中的圖書信息是按照圖書ISBN編碼從小到大排序的)。如果查找到該圖書信息,則輸出單價,如果沒有查找到,則輸出“未入庫!”。請你設計一種實現圖書單價查詢的算法。
(1)先結合日常經驗說一說你的查找方法。
(2)選擇幾種圖書,使用你所選定的查找方法,根據"ISBN編碼”在“圖書信息表”中查找該編碼對應的單價,并記錄相關數據,如表3。
(3)與同學交流,比較各種查找算法的效率。
小結:解決問題的算法可能有多種,不同的算法有優有劣,這當中的差異甚至可以很大。我們在設計算法時要盡可能地對算法進行優化,以提高程序的效率。
設計意圖:通過按碼索價活動初步體驗算法的應用,感受算法的價值。各組學生根據搭建的支架探究解決查找問題的方法,如順序查找和二分查找。通過這些查找方法的比較,學生感受到同一個問題可能有多種解決方法,而且方法也有優劣之分,優秀算法能提高解決問題的效率,從而更好地理解“算法是程序的靈魂”這句話的含義。
4.思維導圖,梳理知識
課件展示,引導學生利用思維導圖對算法知識加以梳理(如上頁圖4)。

結束語:算法是程序的靈魂。在用計算機編程解決問題時,首先要分析問題,確定算法,然后才能用計算機語言編寫程序。著名計算機科學家李國杰院士對算法作了精辟論述:“算法設計是人類智慧的結晶,計算機的知識創新,主要就是算法的創新,創建一種新算法其意義不亞于建造一種新機型。”
設計意圖:借助思維導圖,引導學生將關鍵知識點整合并以結構化方式呈現,進一步鞏固學生的認知結構。最后借用李國杰院士的一段話作結束語,凸顯出算法是程序的靈魂,讓學生更加清晰地了解算法在程序設計中的地位和作用,為后續學習做好鋪墊。
在信息化社會中,生產、生活中許多問題的解決需要運用各種信息化設備,這些設備的運作都是靠人用程序來指揮的,而程序只是用某種計算機語言所描述或表示的算法。所以說,算法是計算機信息處理的核心和基礎。掌握算法的基本思想,可以更好地理解這些信息化設備的內在運行機制,從而更有利于掌握各種信息化設備的應用,更陜適應時代的步伐。算法是對特定問題求解步驟的一種精確描述,算法這種確定性的特征,使得算法的學習對提高學生邏輯思維能力具有直接的促進作用。然而,初學者對算法概念及流程圖的圖形符號既熟悉又陌生,老師的教學往往過于注重算法形式的學習而淡化對算法本質的理解,學生雖然也能明白教科書上的算法案例,卻不能正確應用算法來解決問題。本節課克服了上述不足,其教學具有以下幾個方面的特色:
一是關注了計算機算法的本質特征。算法可分為三種形式:第一種是生活算法,即完成某一項工作的方法和步驟;第二種是數學算法,即數學運算法則和解題規則;第三種是計算機算法,即求解某一類問題的一個運算序列。由于生活算法與計算機算法有非常相似的地方,許多老師常常使用生活算法來類比計算機算法,例如“狼羊過河”的問題,通過游戲的方式模擬狼羊過河的步驟引出算法的概念,這里呈現的過河的過程并不是算法實施的結果,這個問題實際上人事先已經解決好了。而計算機算法則強調通過一系列的運算之后,由計算機輸出問題解決的結果,例如在用遞歸法解決“漢諾塔”問題時,計算機給出的移動金盤的過程就是算法實施的結果,所以說,計算機算法實際上是使用機械化的方法進行問題的自動求解,我們并不能簡單地把生活算法映射到計算機算法。本課則回到了計算機信息處理的原始含義——數值計算,通過計算圖書付款額這個“現實”中的問題,引導學生對問題進行分析,找到解決問題的方法和步驟,其中內隱了計算機解決問題的基本過程,即輸入信息
處理輸出信息,既引出了算法的概念,又較好地體現.了計算機算法的本質。
二是創設真實的問題情境。以往的算法教學,算法的三種基本結構常常以去情境化的方式教給學生,學生未能經歷可信可靠的“真正的學習”,難以形成篇決實際問題的能力。本課則創設了“計算圖書付款額”的真實問題,設計了系列的四個活動:活動1對“購買圖書付款”的—般過程進行分析,通過用自然語言精確描述解決這個問題的步驟,引出算法的概念;活動2則將活動1中用自然語言描述的算法轉化為流程圖,在實施算法的過程中引導學生發現順序結構;活動3中學生在對優惠購書方式分析的基礎上,嘗試用分支結構描述算法,以解決優惠購書問題;活動4是用循環結構解決“計算多種圖書付款額”問題。學生在不斷嘗試的過程中,逐步學會運用算法解決實際問題,理解和掌握算法的三種基本結構。三個子問題的復雜度是不斷增加的,學生又較好地體會到了運用迭代思維解決復雜問題的思路和方法。
三是使用畫程工具降低算法學習的門檻。算法學習存在兩大障礙:一是在用自然語言描述算法之后,怎么把它轉化為流程圖,無論是用紙筆,還是用wbrd、visio等軟件,都比較費時費力;二是畫好的流程圖,怎么轉化為程序?流程圖是人與人之間交流算法思想的工具,對于初學者來說,還不會編寫程序,因此無法寫出代碼驗證算法,最終使算法學習淪為紙上談兵。畫程軟件較好地解決了這兩個問題,只用拖拽圖標的方式就能輕松地繪制流程圖,這個流程圖還是可以執行的,學生能夠通過算法的實施來檢驗問題解決的效果,那么在研究和設計算法時,就可以暫時不理會程序設計的細節,只需專注于算法思想,大大降低了算法學習的門檻。
四是通過實驗體會算法在程序設計中的地位和作用。對于同一個問題,可能有多種算法,這些算法雖然功能相同,但性能卻可能不完全一樣,也就是說,算法有優劣之分。最后的“按碼索價”活動,通過思想實驗的方式進行推演,在沒有編程的情況下,對“順序查找”和“二分查找”這兩種算法進行比較,感受優秀的算法可以提高解決問題的效率,從而真正理解“算法是程序的靈魂”這句話的含義。