曹紅霞
學業水平考試既是對教學效果的檢驗,又是教學發展的風向標,對教學具有不可忽視的導向作用。如何評價學生的學業成績,實現考試過程與學習過程的有效鏈接,發揮考試對教與學的導向作用,促進程序教學的有效實施,一直是我思考和探索的問題。下面,結合幾年來的課題研究、命題和審題的實踐體會,談談我對程序設計模塊學業水平考試命題的幾點思考。
● 考核內容的全面性與側重點
考什么是教師和學生關注的首要問題,它不僅指引著教育教學的方向,也體現著課程的定位。學業水平考試需要保證試題的內容效度,即保證試題內容對模塊考核目標和內容的覆蓋率。因此,試題的考核內容應具有全面性,在命題方面,需要根據考核內容的需求,發揮不同題型的考查功能,綜合運用多種題型,全面考查學生對相關知識、技能、思想和方法,尤其是核心概念和基本方法的掌握情況。例如,利用綜合題創設貼近生活的問題情境,考查學生解決實際問題的能力,實現對多維度教學目標的綜合評價;同時,以散點式出題方式設置選擇題、填空題,彌補綜合題在內容覆蓋面上的不足,實現對核心內容的全面評價。
由于學業水平考試還應發揮其導向功能,在命題方向和考查內容上應有所側重,可將教學中的重點、難點轉化為問題。以往很多考試偏重對程序設計語言的考核,較多的考查某一門程序設計語言所用的符號、語句和語法規則等,使程序設計教學變成了針對某一門編程語言的教學。實際上,編程語言只是算法實現的工具,程序設計的關鍵是問題求解的思路,教學中教師應該更加關注求解問題的思想和方法,突出算法的核心地位,引導學生學習求解問題的思維方法,理解算法的基本思想,學會選用恰當的算法解決實際問題。因此,程序設計模塊的學業水平考試不應僅僅以掌握知識的多少和熟練程度作為評價的標準,而應側重于編程解決問題的思想與方法,下以一例來闡釋。
例1:四位同學中的一位做了好事不留名,老師問這四位同學是誰做的好事。甲說:不是我。乙說:是丙做的。丙說:是丁做的。丁說:丙說謊。已知四位同學中三個人說的是真話,一個人說的是假話。
(1)如果用1、2、3、4分別表示甲、乙、丙、丁四人,用x代表做好事的人,則他們說的四句話可分別表示為: ? ?、 ? ? 、 ? ? 、 ? ? 。
(2)由于做好事的人x是甲、乙、丙、丁中的一個,那么用窮舉法求解這個問題,可以讓 ? 從1至 ? 逐個試,看是否滿足條件 ? ? ? ? ?。如果用n統計說真話的人數,當n= ? 時(滿足判斷條件),x的值即為做好事的人。
試題分析:抽象是一種重要的思維方法,在程序設計的過程中,教師往往需要把一個實際問題抽象成合適的“數學模型”。完成本題,學生需要將四位同學的話抽象為數學關系式x≠1、x=3、x=4、x≠4,并在分析問題的基礎上歸納出用窮舉法求解問題的三個要素,即窮舉對象、窮舉范圍和判斷條件,將求解思路填充完整。這是窮舉法教學的一個重點內容,試題既考查了學生對窮舉算法基本思想的理解,也考查了學生對抽象思維方法的掌握情況。
● 試題的思維性與過程化
程序設計課程定位于提高學生編程解決問題的能力,其核心是問題求解的基本思想和方法,因此,程序設計模塊學業水平考試的命題應該重視思維性,加強對一些基本思維方法的考查。同時,程序設計教學強調讓學生經歷編程解決問題的全過程,應用所學的基本思想和方法解決實際問題,因此,試題的設計要過程化,引導學生在頭腦中虛擬和再現問題求解的過程,實現答題過程與問題求解過程的有效鏈接,下以一例來闡釋。
例2:出租車收費問題。
某地出租車收費標準為:車程在3公里以內(包括3公里),統一收費12元;超過3公里但不超過10公里的(包括10公里),超過3公里的部分每公里收費2元;車程超過10公里,超過10公里的部分每公里收費3元。
現在需要編寫程序實現如下功能:輸入車程公里數,單擊命令按鈕“計算車費”,系統則計算應收車費,并輸出車程和收費金額。請根據程序需求完成如下工作:
(1)分析問題,找出問題描述中的已知信息和所求內容。
(2)設車程為x公里,應收車費為y元,請根據題中信息,列出關于x和y的表達式。
(3)根據上述分析,設計算法,并加以描述。
(4)設計程序界面。
(5)根據算法編寫程序,寫出程序代碼。
(6)總結求解這類問題的基本思想方法。
試題分析:本題首先創設了一個問題情境“出租車收費”,將一個現實問題呈現給學生,然后以這個問題的求解過程為主線,設計一系列小問題,引導學生分析問題,明確問題中各要素之間的關系,列出解決問題所需的解析式,然后設計算法、編寫程序。(1)~(5)小題呈現了一個典型的用解析法求解問題的過程,學生在答題過程中自然而然地經歷了求解問題的過程。第(6)小題要求學生歸納解決此類問題的基本思想方法,則是在前5道小題基礎上的進一步提升,既考查了學生在具體實踐基礎上的總結歸納能力,又考查了學生對解析法基本思想的理解。
顯然,這類問題是無法直接使用死記硬背的知識作答的,學生必須有相應的實踐經驗,又能夠針對具體問題,靈活運用原有的知識和經驗在頭腦中虛擬編程解決問題的步驟,方能正確作答。同時,貼近生活的問題情境,體現了程序設計的現實應用,學生在具體情境中運用所學的知識和技能、技術與方法解決現實問題,答題過程成為問題求解過程的再現,有利于考查學生編程解決實際問題的能力。
實際考試時,如果需要節省考試時間或降低試題難度,可以選取其中的部分小題,或者如例1那樣將問答題改為填空題、選擇題等其他題型。又如,可以將第(5)小題轉化為下面的程序填空題:
Private Sub 計算車費_Click()
Dim x As Single
Dim y As Single
x = Val(Text1.Text)
If x > 0 And x <= 3
Then ? ? If ? ?Then y = 12 + (x - 3) * 2
If x > 10 Then y =
If x <= 0 Then y = 0
Label1.Caption = x & "公里"
Label2.Caption = ? & "元"
End Sub
● 學生的個性習慣與試題的開放性
程序設計課程要求嚴謹的邏輯性,但也提倡一題多解,鼓勵學生用個性化的方式解決問題。因此程序設計模塊學業水平考試應遵循個性化原則,以有效地解決問題為目標,賦予學生一定的自主選擇權,只要能夠解決問題,學生可以自由選擇適合的方法。
傳統的標準化試題能較好地測量學生的知識記憶情況,比較客觀,但標準化試題答案統一,不利于考查學生的思維水平,特別是多向度的求異思維,甚至在某種程度上束縛了學生的個性化發展。針對這一問題,可以在學業水平考試中適當加入一些開放性和半開放性試題。
例3:求斐波那契數列前50項的值。
斐波那契數列是這樣一個數列:1、1、2、3、5、8、13、21、34……這個數列的第一項和第二項為1,從第三項開始,每一項等于前兩項之和。張楠想編程計算并輸出該數列前50項的值,請你幫他完成如下工作:
(1)分析問題,構建解決問題所需的表達式: ? ? ? ? ? ? ? 。
(2)選擇方法:你認為求解此問題適合選用的算法是: ? ? ? ? 。
(3)根據上述分析,設計求解問題的算法,并選擇合適的方式加以描述。
(4)根據算法寫出程序代碼。
試題分析:斐波那契數列問題是一個經典的數學問題,有多種求解方法,學生可以根據自己的喜好和習慣,選擇恰當的方法,設計算法、編寫程序。本試題的答案不唯一,合理即可給分。第(1)小題只要構建出類似f1=1,f2=1,fn=fn-1+fn-2(n>=3)的表達式,能夠清晰表達數列各項之間的遞推關系,變量名不限;第(2)小題只要選用的算法合理,如解析法、遞歸法、迭代法等,都可得分;第(3)小題算法描述不限定描述方法,學生可以按照自己的習慣選用某種算法描述形式,不管是自然語言、流程圖還是偽代碼,只要將算法描述清楚即可;第(4)小題學生只需根據前面的算法寫出正確的程序代碼,至于程序結構、選用的語句等都不作統一要求。試題以問題解決為主線,從分析問題、選用方法、描述算法、編寫程序,都充分尊重學生的應用和表述習慣,符合關注學生個體差異、鼓勵學生創造實踐的評價理念。
開放性試題,廢除了所謂的標準答案,而且問題的結構不良,更加人性化,便于學生自由發揮,有利于考查學生的思維狀況。但在參考答案的設置和評分時需要慎重,盡量涵蓋并允許所有合理答案,評分時應本著寬容的態度,尊重學生的個性習慣,鼓勵學生用不同的方式方法解決問題,只要能“自圓其說”,言之有理,即可給分。
以上是我在課題研究和命題實踐中的幾點思考和探索,針對程序設計模塊學業水平考試命題,還有很多問題有待研究和解決,如程序設計模塊考核內容的梳理、各種類型題目在試卷中應占的比例、試題質量如何評測、這類試題是否適用于選拔性考試和階段性考核、這種命題導向會對教學產生怎樣的影響、如何幫助教師和學生適應這類試題,等等,這些問題都需要我們在以后的實踐中進一步探索和研究。