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

圖1 用戶注冊(cè)

圖2 用戶登錄
(1)創(chuàng)建sqlite數(shù)據(jù)庫(kù)login.db及l(fā)oginuser表。執(zhí)行Python程序,在主文件夾下的data文件夾里自動(dòng)創(chuàng)建login.db數(shù)據(jù)庫(kù)和loginuser表,其中l(wèi)oginuser表主要包含id,username,password,loginerror等四個(gè)字段。
(2)算法持續(xù)優(yōu)化方向。可以在“算法3”的基礎(chǔ)上,對(duì)“用戶登錄”繼續(xù)進(jìn)行優(yōu)化升級(jí)。優(yōu)化1:加入隨機(jī)碼、簡(jiǎn)單算式計(jì)算、隨機(jī)拼圖等,這些功能主要是防止機(jī)器人操作。優(yōu)化2:綁定手機(jī)號(hào),借助第三方接口接收和比對(duì)手機(jī)短信驗(yàn)證碼。