鄭長(zhǎng)宏+郭建+譚樂婷
STEAM課程可以粗略地分為兩條主線:知識(shí)學(xué)習(xí)主線和項(xiàng)目任務(wù)主線。知識(shí)學(xué)習(xí)主線多是通過求解例題讓學(xué)生學(xué)習(xí)基本知識(shí)、基本技能和基本思想,為項(xiàng)目任務(wù)主線的學(xué)習(xí)奠定基礎(chǔ)。因此,STEAM課程設(shè)計(jì)中的例題設(shè)計(jì)顯得尤為重要。筆者總結(jié)多年的信息學(xué)奧林匹克競(jìng)賽、機(jī)器人、圖形化編程教學(xué)經(jīng)驗(yàn),特別是近年來(lái)在全年級(jí)開展的STEAM模塊化系列課程之“C++編程基礎(chǔ)”的實(shí)踐研究,得出以下例題設(shè)計(jì)策略。
● 鋪墊例題,讓學(xué)生學(xué)會(huì)分解任務(wù)以降低難度
STEAM課程的教育目標(biāo)之一是培養(yǎng)學(xué)生分解任務(wù)的能力。在STEAM課程中,教師主要引導(dǎo)學(xué)生完成任務(wù)(或項(xiàng)目),但很多時(shí)候這些任務(wù)的難度較大,不太容易一次就完成,所以需要把任務(wù)分解為難度相對(duì)較低、更容易完成的子任務(wù)。在設(shè)計(jì)例題時(shí),教師也可以將其分解為多道子例題,把包含基礎(chǔ)知識(shí)的例題放到前面作為鋪墊,由易到難逐步提升。
案例一:比較兩個(gè)變量的大小,由小到大輸出。
在學(xué)習(xí)第4講《if語(yǔ)句與關(guān)系表達(dá)式》一課時(shí),筆者準(zhǔn)備了這樣一道例題:輸入兩個(gè)不相等的數(shù)a和b,由小到大輸出。解題方法之一:如果ab,則先交換a和b的值,然后輸出a和b。解決這個(gè)題目有兩個(gè)關(guān)鍵點(diǎn):一是使用if語(yǔ)句對(duì)條件進(jìn)行選擇,二是交換變量a和b的值。學(xué)生認(rèn)為交換變量a和b的值只需要這樣兩條賦值語(yǔ)句:a=b;b=a。然而,這樣執(zhí)行的結(jié)果是錯(cuò)誤的,因?yàn)閍和b的值最后都是b的值。為了解決這個(gè)難點(diǎn),筆者花了不少時(shí)間來(lái)給學(xué)生講解如何交換兩個(gè)變量值。結(jié)果,教學(xué)超時(shí),沒有完成教學(xué)任務(wù)。
解決策略:把這道題的兩個(gè)任務(wù)分解開,把交換兩個(gè)變量a和b值的問題放到第3講《變量的定義與賦值》中,同時(shí),筆者設(shè)計(jì)了這樣一道例題:請(qǐng)輸入變量a、b的值,然后交換變量的值,再輸出。學(xué)生通過第3講的學(xué)習(xí),清楚地理解了交換兩個(gè)變量的值需要用到第三個(gè)變量臨時(shí)存儲(chǔ)數(shù)據(jù),代碼如下:
t=a;a=b;b=t;
在學(xué)習(xí)《if語(yǔ)句與關(guān)系表達(dá)式》比較兩個(gè)數(shù)大小的時(shí)候,教師可以用這樣的偽代碼將程序表示如下:
if(b>a) 交換a和b的值;
輸出a的值,輸出b的值;
有了前面的鋪墊,學(xué)生理解起來(lái)就容易多了。
● 優(yōu)化例題,讓學(xué)生體驗(yàn)項(xiàng)目?jī)?yōu)化的過程
STEAM課程強(qiáng)調(diào)項(xiàng)目式學(xué)習(xí),項(xiàng)目的設(shè)計(jì)與制作過程就是一個(gè)不斷優(yōu)化的過程。教師可以把例題設(shè)計(jì)得有些小缺陷,讓學(xué)生在解題的過程中不斷思考,不斷優(yōu)化,同時(shí)體驗(yàn)項(xiàng)目?jī)?yōu)化的過程。
案例二:寶庫(kù)密碼問題的兩次改進(jìn)。
筆者在第7講《計(jì)數(shù)循環(huán)與for語(yǔ)句》中設(shè)計(jì)了這樣一道例題A:富翁有個(gè)寶庫(kù),輸入密碼才可以打開。如果密碼正確,則提示“寶庫(kù)即將打開,請(qǐng)稍后……”;如果密碼錯(cuò)誤,則提示“密碼錯(cuò)誤,請(qǐng)重新輸入密碼”!并再次輸入密碼,但只能輸入三次。請(qǐng)用程序模擬這個(gè)寶庫(kù)密碼。
這道例題就是一個(gè)小小的項(xiàng)目,類似于手機(jī)輸入密碼解鎖屏幕,或銀行ATM取款的過程。如果直接這樣設(shè)計(jì)例題,沒有給學(xué)生優(yōu)化改進(jìn)這個(gè)項(xiàng)目的機(jī)會(huì),學(xué)生就失去了思考的原動(dòng)力,能力的培養(yǎng)有限。
解決策略:筆者把這道例題簡(jiǎn)化成了一個(gè)不完善的例題B:富翁有個(gè)寶庫(kù),輸入密碼才可以打開。如果密碼正確,提示“寶庫(kù)即將打開,請(qǐng)稍后……”;如果密碼錯(cuò)誤,則提示“密碼錯(cuò)誤”!請(qǐng)用程序模擬這個(gè)密碼寶庫(kù)。筆者把這道例題設(shè)置在《if語(yǔ)句與關(guān)系表達(dá)式》一課中,當(dāng)學(xué)生調(diào)試成功以后,有位學(xué)生提出這樣的疑問:“老師,輸入錯(cuò)誤密碼,程序要終止,這時(shí)還要再運(yùn)行一次程序,才能輸入正確密碼。這太麻煩了,如何才能在輸入錯(cuò)誤密碼之后,程序報(bào)錯(cuò)但不停止運(yùn)行,直接再次輸入密碼呢?”筆者在全班表?yè)P(yáng)了這位勤于思考的學(xué)生,也順理成章地在第5講《while語(yǔ)句與邏輯表達(dá)式》用例題B的改進(jìn)版例題C作為引入。
改進(jìn)后的例題C是這樣的:富翁有個(gè)寶庫(kù),輸入密碼才可以打開。如果密碼正確,提示“寶庫(kù)即將打開,請(qǐng)稍后……”;如果密碼錯(cuò)誤,則提示“密碼錯(cuò)誤,請(qǐng)重新輸入密碼”!請(qǐng)用程序模擬這個(gè)密碼寶庫(kù)。學(xué)生使用while語(yǔ)句調(diào)試成功以后,又提出問題:“密碼錯(cuò)誤可以一直輸入密碼,直到密碼正確。我同桌都把我的密碼試出來(lái)了!”筆者:“那怎么優(yōu)化呢?”學(xué)生:“我覺得應(yīng)該限定次數(shù),比如三次,手機(jī)就是這樣的。”
筆者又順勢(shì)設(shè)計(jì)出了較為完善的例題,也就是最開始的第7講的例題A。
于是,例題B只判斷密碼是否正確;例題C判斷密碼是否正確,如果錯(cuò)誤要求重新輸入密碼;例題A判斷密碼是否正確,如果密碼錯(cuò)誤要求重新輸入,但只能輸入三次。
通過對(duì)例題B、C、A三個(gè)版本的設(shè)計(jì),讓例題不斷優(yōu)化。這不僅讓學(xué)生的思考步步深入,還讓學(xué)生體驗(yàn)到了STEAM項(xiàng)目?jī)?yōu)化的過程。
● 多解例題,讓學(xué)生從多角度思考問題
一題多解,能夠讓學(xué)生從多個(gè)角度觀察問題、思考問題,在STEAM教學(xué)過程中可多加運(yùn)用。
案例三:三個(gè)變量a,b,c排序的問題。
為了引入if語(yǔ)句的嵌套和邏輯表達(dá)式,筆者設(shè)計(jì)了例題:給a、b、c三個(gè)數(shù)排序,由大到小輸出。
首先,筆者給出了較為困難的使用if語(yǔ)句的嵌套的解法一:先判斷a>b,再分情況判斷b>c,然后再分情況判斷a>c。具體求解思維導(dǎo)圖如圖1所示。
學(xué)生看到上面的層疊關(guān)系就覺得很難,再看到密密麻麻的程序代碼時(shí),更感覺是一頭霧水。筆者順勢(shì)引導(dǎo)學(xué)生學(xué)習(xí)第二種解法:利用學(xué)過的數(shù)學(xué)知識(shí),不難分析出這樣六種關(guān)系:①a>b>c;②a>c>b;③b>a>c; ④b>c>a;⑤c>a>b;⑥c>b>a。
可以用六條不帶else的if語(yǔ)句解決,思路如下:
① if(a>b>c),輸出“a>b>c”;
② if(a>c>b),輸出“a>c>b”;
③ if(b>a>c),輸出“b>a>c”;
④ if(b>c>a),輸出“b>c>a”;
⑤ if(c>a>b),輸出“c>a>b”;
⑥ if(c>b>a),輸出“c>b>a”;
但是新的問題來(lái)了,C++語(yǔ)言雖然允許類似“a>b>c”的表達(dá)式,但“a>b>c”并不表示“a>b并且b>c”。于是,筆者引入邏輯運(yùn)算符和邏輯表達(dá)式“a>b&&b>c”來(lái)表示“a>b并且b>c”。
筆者帶著學(xué)生總結(jié)了解法一的主要特點(diǎn)是if語(yǔ)句的嵌套,解法二的主要特點(diǎn)是分情況討論。當(dāng)學(xué)生認(rèn)為問題圓滿解決的時(shí)候,筆者又提出:“我們可以綜合解法一和解法二的特點(diǎn),設(shè)計(jì)一個(gè)既簡(jiǎn)單又不需要邏輯運(yùn)算符的解法?!蓖ㄟ^思考,有學(xué)生綜合了解法一的嵌套和解法二的分情況討論,得出了解法三:運(yùn)用不帶else的if語(yǔ)句的嵌套,用偽代碼表示如下:
① if(a>b)if(b>c),輸出“a>b>c”;
② if(a>c)if(c>b),輸出“a>c>b”;
③ if(b>a)if(a>c),輸出“b>a>c”;
④ if(b>c)if(c>a),輸出“b>c>a”;
⑤ if(c>a)if(a>c),輸出“c>a>b”;
⑥ if(c>b)if(b>a),輸出“c>b>a”;
同一例題,從多個(gè)角度思考,運(yùn)用不同的方法求解,拓寬了學(xué)生思維的廣度。
● 改編例題,讓學(xué)生注重解決問題的過程和方法
STEAM教育是注重過程和方法的教育。教師通過改編例題可以讓學(xué)生關(guān)注解題的過程和方法,而不僅僅是答案。
案例四:1到100的整數(shù)和求解問題。
在for循環(huán)的經(jīng)典例題中,“求1+2+3+……+100的和”是最常見的例題。筆者也使用過這道例題來(lái)講解for語(yǔ)句,但學(xué)生往往看到這道題就想到它的結(jié)果是5050。因?yàn)檫@道題在數(shù)學(xué)課上已經(jīng)學(xué)習(xí)過了,利用求等差數(shù)列和的方法(首項(xiàng)+末項(xiàng))×項(xiàng)數(shù)÷2可以輕松算出結(jié)果。但為了讓學(xué)生掌握for語(yǔ)句計(jì)數(shù)循環(huán)的方法,即通過for循環(huán)和語(yǔ)句“sum=sum+;”把每一個(gè)數(shù)加起來(lái),筆者把例題改編成求20+21+23+……+108,改編后,學(xué)生不容易一眼算出結(jié)果,就把注意力集中到使用for語(yǔ)句求解的問題上來(lái)。
● 美化例題,讓學(xué)生領(lǐng)略編程之美
在“C++編程基礎(chǔ)”教學(xué)中,筆者注重美化例題,把藝術(shù)教育融入到C++代碼的字里行間和程序格式的排列縮進(jìn)之間,讓學(xué)生在潛移默化中領(lǐng)略編程之美。
案例五:編寫一個(gè)小小的計(jì)算器程序。
排版優(yōu)美的程序代碼,不僅利于閱讀,而且可以感受到C++的代碼之美。在學(xué)習(xí)if語(yǔ)句和switch語(yǔ)句的時(shí)候,有這樣一道例題:編寫一個(gè)小小的計(jì)算器程序,輸入變量a和b,再輸入+、-、*、/中的一個(gè)符號(hào),完成相應(yīng)的計(jì)算,輸出答案。筆者在講解該例題時(shí),特別強(qiáng)調(diào)書寫的規(guī)范性,即代碼的縮進(jìn)與對(duì)齊,程序部分代碼如圖2所示。
以上是編寫程序時(shí)體現(xiàn)出的代碼美感,還可讓程序輸出結(jié)果也體現(xiàn)出美感。
案例六:運(yùn)用二重循環(huán)輸出圖形符號(hào)。
學(xué)習(xí)循環(huán)語(yǔ)句的嵌套可以通過使用二重循環(huán)輸出特定的圖形符號(hào)來(lái)練習(xí)。筆者設(shè)計(jì)了如圖3所示的圖形,編制例題,讓學(xué)生學(xué)習(xí)二重循環(huán)的使用。
由此可見,美化例題是讓例題在設(shè)計(jì)中融入藝術(shù)教育,讓學(xué)生潛移默化地感受編程之美。
合理運(yùn)用例題設(shè)計(jì)策略精心設(shè)計(jì)例題,讓學(xué)生在STEAM課程中學(xué)習(xí)方法,培養(yǎng)思維,增長(zhǎng)能力。這需要教師不斷探索,不斷實(shí)踐。endprint