摘要:比起《信息技術基礎》,《算法與程序設計》這門選修課對高一學生來說,更具有挑戰性,這也使學生對這門課產生了興趣。如何帶領學生挑戰自我,學會編程解決問題呢?筆者認為首先要讓學生理解學會編程解題的重要性。接著要從學生熟悉的問題出發,進行算法設計訓練,讓學生懂得將人工解題的過程描述成算法。教學中還應靈活處理教材,做到分散難點、用到再學,時刻牢記以“問題解決”為主線,精選“問題”以吸引學生興趣,調動學生進行自主探究學習的積極性。
關鍵詞:算法;程序設計;教學;問題解決
高中新的課程標準指出,在中學開設《算法與程序設計》課程的主要目的是使學生能從簡單問題出發,設計解決問題的算法,并能初步使用一種程序設計語言編制程序實現算法解決問題。我們要解決的問題雖然比較簡單,但這對初學《算法與程序設計》的學生來說可是不容易的,有人甚至覺得比數學還難。那么如何做好《算法與程序設計》這門選修課的教學呢?使學生能學得輕松、學得高興呢?下面就談一談一個學期來我的做法。
一、明確學習課程用途,消除學生畏難情緒
在學習本課程前,可能會有比較多的學生認為:人要計算機解決的問題都可以找到相應的軟件,為何還要學習編程?針對這個問題,我在第一節課就向學生介紹了我自己工作中遇到的問題:“如何批量添加“Serv-U”用戶”。
例1每年開學時,我都要在服務器上為每個學生開避一個文件夾,并利用“Serv-U”FTP軟件為每個學生設置對自己文件夾的使用權限。一個年段600人,每人建一個文件夾、設置權限這些工作少說要花1分鐘,600個人要600分鐘(10個小時),手工操作工作量大,且容易出錯。那么如何解決這個問題呢?
通過認真分析,我們發現同學們的文件夾可以按班級分類存放,每個同學的文件夾名稱也可以設置為“g06??**”這種形式(其中??表示班級,**表示座號),另外,“Serv-U”中的用戶配置都保存在一個文本文件中,且用戶與權限都很有規律。因此我們可以編寫一個程序,一個班一個班地、每個班一個一個同學地進行開辟空間和“Serv-U”的用戶權限設置。最后我演示一下我的程序,并簡要的解析了一下程序。
另外,我還結合實例,簡要介紹程序設計語言的發展,讓學生感受到高級語言比起低級語言是容易學習的,將要學習的VB高級語言是很容易被我們掌握的,從而消除學生對學習這門課的畏難情緒。
這節課我向學生傳遞了“編程有用、編程不難”這樣的信息,增強了學生學習本門課的興趣與信心,為本門課的教學打下了一個非常好的基礎。
二、讓學生理解算法設計重要性,引導學生進行簡單問題的算法設計
算法設計是程序設計的核心。多年的程序設計教學經驗告訴我們,學生學習這門課的難點就是如何進行設計算法。因此,我在這門課的第2、3節課就著重通過一些簡單的例子來讓學生懂得算法設計的三種基本結構。
1 實例入手,引導學生認識算法設計
例2時間轉換
輸入一個以秒為單位的時間t,將其轉換成x小時節v分鐘z秒形式,用自然語言描述算法。
一開始我們發現,學生對此問題無從下手。于是我們將問題改為“3800秒是幾小時幾分幾秒?”,學生很快算出答案“1小時3分20秒”。究其原因,我覺得學生可能習慣于解決一個具體的數學問題,而不習慣于解決一個帶變量的問題。這個恰恰是數學解題與編程解題的一個區別。接下來就讓學生說出他們是如何可得出以上的答案,然后引導學生進行歸納,將3800這個數換成t,再讓他們嘗試說法求法,經過幾次進行修改,最后我們得到如下的算法:
(1)輸入以秒為單位的時間t
(2)求出t整除3600的商x和余數a
(3)求出a除以60的商v和余數z
(4)輸出x小時v分z秒
通過這節課,從實例入手,逐步地把人工的解法用精確的方法描述出來。學生明白什么是算法設計,同時讓學生明白設計算法中要象數學一樣要適當使用記號(即將來要學習的變量)。
2 從學生熟悉的問題出發,進行算法設計訓練
在講解選擇結構問題的算法設計時,我們從學生在初中階段就知道的“求一元二次方程實根”的問題出發,進行算法設計的訓練。
我們先讓學生自己來描述一下“求實根”問題的算法,由于學生對此問題比較熟悉,同時有例2中的順序結構算法設計的基礎和老師點拔,學生很快得出如下的算法描述:
(1)輸入a,b,c
(2)求DLT=b2-4ae
(3)如果DLT<0,則輸出“無實根”,轉(5)
(4)否則,求兩實根x1,x2,輸出x1,x2
(5)結束
接著我們再分析自然語言描述法的不足,引出流程圖描述法,進而用流程圖把以上算法描述出來。學生就很容易理解了。
從學生熟悉的問題入手,進行算法設計的訓練,會收到較好的效果。
三、理解可視化編程一般步驟。靈活進行教材的處理
由于我們這門課是要用VB程序設計語言來實現簡單問題的編程解決,因此必須讓學生對VB可視化編程一般過程有所理解。按教材上的安排,可視化編程是在第三章,而第二章中有“程序的順序結構”、“程序的選擇結構”與“程序的循環結構”等重要教學內容,為了教學上方便,我將第三章的內容簡化、提前。重點讓學生理解“對象”、“屬性”、“事件”、“事件過程”、“事件驅動”等概念以及掌握可視化編程的一般步驟。
四、分散難點,用到再學
在教材中,第二章第1節的主要內容是VB程序的結構、數據類型、變量、常量、運算符、表達式與函數等概念,如果專門花一節課給學生講解,不僅枯燥而且抽象。對于本部分的教學,我們采取了分散難點、用到再學的策略。因此,我們就跳過這節課。當學習到下一節程序的順序結構時,我們通過計算“圓面積”這個學生最容易理解的問題,來講解程序的結構、變量、常量、賦值語句、輸入函數和輸出方法等。
這種分散難點、用到再學的策略通過將難點分散到多個任務中,用到再學,它不僅避免了由于難點太多而造成知識混淆的問題,同時又能結合實例,使學生有感性認識,便于難點的理解,收到極好的效果。
五、牢記“問題解決”主線,精選“問題”激發興趣
編程的目的就是為了解決問題,因此本門課程的教學應牢牢地把握“以問題解決”的主線。對任何一個問題講解,老師都要嚴格按照“分折問題”、“設計算法”、“編寫程序”、“調試運行”這幾個步驟進行,自始至終、潛移默化地培養學生正確的解題流程。當學生也能按照正確的解題過程進行解題,學生才算真正學會獨立地編程解題。
同時,“問題”還是學生學習本門課的動力,好的問題一出現在學生面前,就會讓學生躍躍欲試。因此我們在備課時要精選“問題”,從而引導學生思考問題,進而解決問題。
例如,我在講授“多分支選擇語句”這一節時,選擇了“星座計算”這個問題。這個問題是當今學生(特別是女生)比較興趣的,有了這個程序以后,他們就很容易替任何人測算出星座。于是我就安排學生以小組為單位,先學習課本中有關知識后,然后開始解決星座測算這個問題,看哪個小組設計更好、更快。最后我再對本節課的重點進行小結歸納,總結select case語句中的重點。
六、結束語
一個學期來,大部分同學都能認真完成作業,不少學生的作業不僅正確,而且界面漂亮。同學們上課聽講也較為認真,還經常有同學向我提問。我覺得本學期這門課程的教學基本上是成功的。