候繼倉 山東省日照教學研究室
吳加明 福建省泉州市第七中學
基于新課標的信息科技教材未發行使用,一線教師只能使用現行教材進行授課的情況,筆者通過深入中小學進行教學視導、聽評課等活動,發現教師在教學實施中仍存在諸多問題與不足。因此,筆者認為,教師需要研讀課標并于實踐中探索,切入“算法應用”,才能將編程教育扎實落實到課堂教學中。
在《用選擇結構程序做出判斷》的公開課中,授課教師讓學生通過編程實現機器人依據學生點餐來配送相應的飯菜。整節課下來,項目目標和教學任務均未完成,知識學習也不理想。探究問題所在,發現案例選擇脫離學生認知,無法對送餐機器人的工作原理進行抽象、分解。因此,建議教師修改任務:用學生食堂點餐作為實際“應用”案例,并將課題命名為《我是干飯人》。
吃午飯時,由于下課時間推遲,干飯人到達食堂時各窗口已排起長隊,那么如何選擇合適的隊伍來排隊呢?①選擇隊伍最短的——比較直觀且迅速。②選擇師傅打飯快的——這需要對打飯師傅的業務熟悉且準確判斷。③選擇師傅打飯時量給得足且肉給得多的——這考慮的不僅是業務,還有人品。學生七嘴八舌地回答,出現各種排隊條件,教師帶領學生使用Python選擇語句進行操作:①只選擇隊伍最短的,這是單選擇分支(if…),迅速且易于實現。②考慮到隊伍長短、師傅打飯速度、給飯量等,這是多選擇分支(if…else if…),雖然復雜耗時但經多重考慮后,可以取得最佳效果。③拓展:在學生排好隊后,出現了有人因一塊排骨的歸屬問題和師傅爭吵幾句的意外情況,嚴重影響隊伍進度,該怎么辦?
一名合格的干飯人,既要吃飽,更要吃好,那么主食和菜的選擇就非常關鍵了。①主食為饅頭米飯二選一,這是典型的單選擇分支(if…else…)。②菜品較多,有肉食、海鮮、蔬菜等,怎么辦呢?在大腦里快速梳理一下選擇的條件:尊重自身需求,只選擇口味好的,愛吃的;考慮身體的整體需求,營養均衡,葷素搭配;考慮經濟條件,每餐不能超過15元……依據條件的選擇與排序不同,每個干飯人都有不同的菜品搭配。接下來用流程圖和Python語句來實現這一過程,需要注意的是,因每個人對選擇條件的側重不同,其流程圖和程序中條件判斷語句的順序可能不同,即學生的項目成果是個性化的,能正確表現學生的選擇意圖即可。
整個教學過程讓學生全程參與,選用學生身邊最熟悉的生活場景,按照計算思維的四個過程來展開:①抽象。依據學生生活經驗,將食堂就餐過程抽象為排隊和打飯兩個環節,并進行需求分析。②分解。將排隊和打飯過程細化為多個可使用選擇判斷來解決的問題,并參照具體判斷條件做出相應選擇。③模式識別。將排隊選擇過程和飯菜選擇問題遷移到編程中的單選擇分支和多選擇分支來解決實現。④算法實現。學生利用流程圖和Python編程實現食堂就餐的整個過程,生成個性化的作品。
由此體現一個道理:當面對選擇舉棋不定的時候,可以像編程中的判斷語句那樣,抽象出影響選擇的因素,然后對其進行排序,依據現實逐一判斷,最終得出客觀、合理的選擇結果。這既是計算機編程中判斷語句的運行原理,也是培養計算思維的過程。
在學習編程的分支結構時,很多教師會以“用戶登錄”為例加以講解,這是信息系統的基本組成模塊,是進入信息系統的第一道門檻。那么,“用戶登錄”的算法應該如何設計并利用Python語言實現呢?
(1)入門級算法?!八惴?”是輸入賬號和密碼,與代碼中的明文信息直接進行比對,如果都正確,則進入下一步,否則,提示錯誤,并接受重新輸入。這個算法存在明顯的不足:第一,正確的賬號和密碼用明文寫在代碼中,容易被學生質疑毫無秘密可言;第二,這樣可以比對的賬號數量很有限。
(2)初級算法?!八惴?”是輸入賬號和密碼,使用接收到的賬號和密碼信息到信息系統數據庫中的用戶表進行查詢操作,如果能查詢到相應的用戶信息,則進入下一步,否則,提示錯誤,并重新接受輸入。使用數據庫,不但可以存放大量的用戶信息,而且解決了一個數據與代碼分離的重大問題,方便后期的系統維護。
(3)中級算法。明文密碼直接保存到數據庫明顯是不可取的,一般情況下,密碼信息都要經過加密算法處理后再存放到數據庫的用戶表中。因此,“算法3”是輸入賬號和密碼,對接收到的密碼信息進行相同加密算法處理后,再和賬號信息一起到信息系統數據庫中的用戶表進行查詢操作,如果能查詢到相應的用戶信息,則進入下一步,否則,提示錯誤,并重新接受輸入。這里也就很好地解釋了為什么大家使用的“密碼找回”功能,其實不是真正找回密碼,而是設置一個新密碼替換舊密碼。
現在,我們利用Python自帶的tkinter(圖形交互界面)、sqlite(小型數據庫)和hashlib(加密算法)三個模塊來實現上述“算法3”的功能,即圖形界面的用戶注冊和登錄小程序,其效果圖如圖1和圖2所示。

圖1 用戶注冊

圖2 用戶登錄
(1)創建sqlite數據庫login.db及loginuser表。執行Python程序,在主文件夾下的data文件夾里自動創建login.db數據庫和loginuser表,其中loginuser表主要包含id,username,password,loginerror等四個字段。
(2)算法持續優化方向。可以在“算法3”的基礎上,對“用戶登錄”繼續進行優化升級。優化1:加入隨機碼、簡單算式計算、隨機拼圖等,這些功能主要是防止機器人操作。優化2:綁定手機號,借助第三方接口接收和比對手機短信驗證碼。