華冠萍
摘要:在程序設(shè)計(jì)實(shí)驗(yàn)教學(xué)中,一直以來“難學(xué)”、“難教”成為師生共識(shí),實(shí)驗(yàn)效果不夠理想。本文通過引入問題求解法,改變傳統(tǒng)實(shí)驗(yàn)教學(xué)模式,以達(dá)到更好的教學(xué)效果。
關(guān)鍵詞:C程序設(shè)計(jì);實(shí)驗(yàn)教學(xué);問題求解
中圖分類號(hào):G642 文獻(xiàn)標(biāo)識(shí)碼:A
1引言
“程序設(shè)計(jì)基礎(chǔ)”是高校計(jì)算機(jī)專業(yè)重要的專業(yè)基礎(chǔ)課,是一門理論與實(shí)驗(yàn)同步教學(xué)的課程。其中,實(shí)驗(yàn)在整個(gè)程序設(shè)計(jì)教學(xué)中起著非常重要的作用,學(xué)生只有通過上機(jī)實(shí)驗(yàn),親自動(dòng)手設(shè)計(jì)、編寫程序,才能真正掌握程序的邏輯設(shè)計(jì)及語(yǔ)言的基本規(guī)則,加深對(duì)理論知識(shí)的鞏固、鍛煉程序設(shè)計(jì)的邏輯思維,提高軟件開發(fā)能力。
傳統(tǒng)的程序設(shè)計(jì)實(shí)驗(yàn)教學(xué)是以教師傳授為中心,教師在教學(xué)過程中的占主導(dǎo)作用,學(xué)生往往是被動(dòng)的參與者,并不起主體作用。大多數(shù)學(xué)生都認(rèn)為程序設(shè)計(jì)艱澀難懂、學(xué)難致用,程序設(shè)計(jì)常常處于一種機(jī)械、被動(dòng)的狀態(tài),設(shè)計(jì)水平徘徊不前,更有甚者,做完實(shí)驗(yàn)還不知道為什么要做這個(gè)實(shí)驗(yàn),“難學(xué)”、“難教”成為師生的共識(shí)。如何有效地開展程序設(shè)計(jì)實(shí)驗(yàn)教學(xué),探討實(shí)驗(yàn)教學(xué)的新思想、新方法,成為程序設(shè)計(jì)實(shí)驗(yàn)教學(xué)改革中亟待解決的問題。
作者在多年程序設(shè)計(jì)實(shí)驗(yàn)教學(xué)的基礎(chǔ)上,引入以問題求解為中心的實(shí)驗(yàn)教學(xué)方法。該方法順應(yīng)學(xué)生的認(rèn)知規(guī)律,注重學(xué)生的主體性,教師在其中主要起“導(dǎo)”的作用,引導(dǎo)學(xué)生從問題著手,啟發(fā)學(xué)生分析問題,進(jìn)而解決問
題。這樣不僅能培養(yǎng)學(xué)生的學(xué)習(xí)興趣,還能提高學(xué)生的實(shí)際編程能力,成為真正的問題解決者。
2問題求解法簡(jiǎn)述
問題是學(xué)生學(xué)習(xí)的引導(dǎo)者,是最好的老師,沒有問題便沒有深入。今天的大學(xué)生所面對(duì)的是一個(gè)高度發(fā)展、變化迅速的信息時(shí)代,他們每一個(gè)人時(shí)刻面臨著各種各樣的問題,解決問題將是他們生活的重要組成部分,問題解決能力也無疑成為他們的生活是否成功的關(guān)鍵因素。而程序設(shè)計(jì)也正是以解決問題為根本目的。
以問題求解為中心的實(shí)驗(yàn)教學(xué)模式從問題入手,啟發(fā)學(xué)生思考、分析問題,引導(dǎo)學(xué)生在問題解決中構(gòu)造算法,進(jìn)而掌握相關(guān)的概念、語(yǔ)法、功能及應(yīng)用,真正達(dá)到實(shí)驗(yàn)教學(xué)目的。以問題求解為中心的實(shí)驗(yàn)教學(xué)模式可分為以下步驟。
(1) 問題引入:通過問題來展開教學(xué),創(chuàng)設(shè)問題解決的情境,引導(dǎo)學(xué)生思考程序需求,對(duì)需求有個(gè)清晰的了解,找到根本問題所在。
(2) 分析問題:分析題意,弄清要解決什么樣的問題,即程序要實(shí)現(xiàn)什么樣的功能。具體為確定問題的輸入(要處理的數(shù)據(jù))、問題的輸出(希望的結(jié)果)、以及解決方案的附加需求或約束條件;同時(shí),規(guī)劃好存儲(chǔ)結(jié)構(gòu),即如何存放數(shù)據(jù)和中間結(jié)果,確定要使用的變量、函數(shù)等,并把簡(jiǎn)單情況描述出來。本階段還應(yīng)同時(shí)列出問題的變量及其相互關(guān)系,這些關(guān)系也可用公式的形式來表示。
(3) 算法設(shè)計(jì):設(shè)計(jì)算法來解決問題,按照結(jié)構(gòu)化的思想,先粗后細(xì),逐步畫出求解問題的N-S流程圖。具體可采用自頂向下的方法將問題描述成幾個(gè)子問題或子功能,然后再根據(jù)具體情況將子問題進(jìn)一步細(xì)化、逐步深入,直到所有子問題或子功能都能用語(yǔ)句描述為止,通過解決每一子問題最終解決原始問題。
值得一提的是,在此階段,教師不光要引導(dǎo)學(xué)生解決問題,還應(yīng)鼓勵(lì)學(xué)生尋求不同的解法,使一題多解,積極嘗試新的方法,拓寬邏輯編程思路,并在此基礎(chǔ)上分析最簡(jiǎn)捷解法(考慮經(jīng)濟(jì)性、復(fù)雜度等),引導(dǎo)學(xué)生對(duì)算法進(jìn)行優(yōu)化。
(4) 算法實(shí)現(xiàn):編寫程序,用具體的語(yǔ)言將算法的每一步轉(zhuǎn)換成一個(gè)或多個(gè)語(yǔ)句。根據(jù)N-S流程圖,用程序設(shè)計(jì)語(yǔ)言編寫程序,實(shí)現(xiàn)算法。此階段要注意準(zhǔn)確表達(dá)與語(yǔ)言邏輯,為了使編寫的程序正確,編寫程序時(shí)必須要遵循該程序設(shè)計(jì)語(yǔ)言的基本規(guī)范和表達(dá)邏輯,恪守程序語(yǔ)句和函數(shù)等的書寫格式,比如函數(shù)頭的格式、字母的大小寫、標(biāo)點(diǎn)符號(hào)放置、花括號(hào)的使用等。同時(shí),避免語(yǔ)言表達(dá)的二義性和非語(yǔ)法錯(cuò)誤,學(xué)生在編制程序的過程中會(huì)出現(xiàn)各種錯(cuò)誤,對(duì)于語(yǔ)法錯(cuò)誤,不難依靠編譯工具或解釋工具給出的錯(cuò)誤信息進(jìn)行修改,但是要糾正非語(yǔ)法性錯(cuò)誤,就不那么容易了,比如有效數(shù)字限制、數(shù)字溢出、隱含條件的限制引起的調(diào)用或循環(huán)次數(shù)有異問題等等。因此在程序編寫階段,指導(dǎo)學(xué)生不光要掌握基本語(yǔ)法,還得研究非語(yǔ)法性錯(cuò)誤的出錯(cuò)特征,提高編制程序質(zhì)量及運(yùn)行結(jié)果和效率。
(5) 編譯調(diào)試:在編寫好源程序的前提下,接著要測(cè)試程序是否能夠?qū)崿F(xiàn)算法設(shè)計(jì)的目的,所以必須調(diào)試程序。程序調(diào)試是當(dāng)程序發(fā)生錯(cuò)誤時(shí),分析錯(cuò)誤并改正錯(cuò)誤,作為程序?qū)懽鞯淖詈笠粋€(gè)環(huán)節(jié),它不僅是保證程序開發(fā)質(zhì)量的重要手段,也是實(shí)驗(yàn)教學(xué)的重要環(huán)節(jié)。此階段不光是為了“驗(yàn)證程序的正確性”,還要掌握分析、解決不同的錯(cuò)誤及異常,進(jìn)而掌握編程的方法與技巧,提高分析問題和解決問題的能力。一般程序錯(cuò)誤有以下幾種。
語(yǔ)法錯(cuò)誤:當(dāng)代碼中違反了一條或多條C語(yǔ)法規(guī)則時(shí)出現(xiàn),可在編譯階段檢出。如缺分號(hào)、未聲明變量、或書法遺漏等。
運(yùn)行時(shí)錯(cuò)誤:在程序執(zhí)行階段被檢測(cè)并顯示出來。如非法num/0,此時(shí)會(huì)停止程序執(zhí)行,并顯示診斷消息,指出在哪一行檢測(cè)到了運(yùn)行錯(cuò)誤。
未檢測(cè)到的錯(cuò)誤:許多錯(cuò)誤執(zhí)行可能并不會(huì)阻止程序完成運(yùn)行,而僅僅是得出不正確的結(jié)果。因此,預(yù)先知道一些不正確的結(jié)果并去檢查實(shí)際的輸出是否正確是很重要的。如scanf函數(shù)在對(duì)格式參數(shù)%d和%c的處理上有所不同,前者會(huì)忽略輸入的空白和回車,而后者則不會(huì)忽略。
邏輯錯(cuò)誤:當(dāng)程序遵循了一個(gè)有缺陷的算法時(shí)會(huì)發(fā)生。邏輯錯(cuò)誤不會(huì)導(dǎo)致運(yùn)行錯(cuò)誤,而且不會(huì)顯示錯(cuò)誤消息,所以該種錯(cuò)誤比較難以檢測(cè)到。只能采用程序調(diào)試功能中的斷點(diǎn)設(shè)置和單步調(diào)試相結(jié)合,進(jìn)行“分段檢查”,實(shí)時(shí)檢測(cè)有關(guān)變量的變化情況,逐段往下查,直到找到在某一段中代碼不對(duì)為止。
(6) 測(cè)試:在調(diào)試成功的基礎(chǔ)上,需要測(cè)試所編寫程序是否按預(yù)期方式完成任務(wù)。此階段不能只根據(jù)一次測(cè)試就確定,應(yīng)使用不同的數(shù)據(jù)集合來多次運(yùn)行程序,從而確保該程序在算法所提供的所有情況下都正常工作并得到正確結(jié)果。
3案例分析
下面以程序設(shè)計(jì)基礎(chǔ)課程實(shí)驗(yàn)教學(xué)中“選擇結(jié)構(gòu)程序設(shè)計(jì)”項(xiàng)目中的一個(gè)設(shè)計(jì)性實(shí)驗(yàn)為例,設(shè)計(jì)問題求解步驟。
(1) 問題引入:設(shè)計(jì)一實(shí)現(xiàn)公園售票功能的程序,具體要求:計(jì)算購(gòu)票人應(yīng)付金額,其中每張票零售價(jià)為20元,團(tuán)體價(jià)為12元,一次購(gòu)票超過20張(包含20張)時(shí)按團(tuán)體票售出。
(2) 問題分析:通過對(duì)該問題的分析,明確了程序要求通過對(duì)輸入票數(shù)的判斷,確定票價(jià)是以團(tuán)體價(jià)還是以零售價(jià)進(jìn)行計(jì)算,進(jìn)而利用計(jì)算公式求出應(yīng)付金額,問題描述為:
程序變量:團(tuán)體票價(jià),零售票價(jià),購(gòu)票數(shù)量,應(yīng)付金額
問題輸入:購(gòu)票數(shù)量
問題輸出:應(yīng)付金額
相關(guān)公式:應(yīng)付金額=購(gòu)票數(shù)量*團(tuán)體票價(jià)(購(gòu)票數(shù)量<20)
應(yīng)付金額=購(gòu)票數(shù)量*零售票價(jià) (購(gòu)票數(shù)量<20)
(3) 算法設(shè)計(jì):根據(jù)問題分析結(jié)果,按照結(jié)構(gòu)化的思想,畫出求解問題的N-S流程,如圖1所示。
(4) 算法實(shí)現(xiàn):根據(jù)上述N-S圖,算法代碼編寫如下:
#include <stdio.h>
void main()
{ int price1,price2,num,total;
char c;
price1=20;
price2=12;
c='y';
while(c!='n')
{
printf("請(qǐng)輸入購(gòu)買票數(shù):");
scanf("%d",&num);
if(num>=20)
total=num*price2;
else total=num*price1;
printf(" 應(yīng)付金額:%d",total);
printf(" 繼續(xù)嗎?(y/n)");
getchar();
scanf("%c",&c);
}
}
(5) 調(diào)試測(cè)試:在VC++ 6.0環(huán)境中編輯、編譯、調(diào)試源程序,程序調(diào)通后進(jìn)行數(shù)據(jù)測(cè)試,我們?cè)O(shè)定購(gòu)票數(shù)20
和10分別測(cè)試結(jié)果,進(jìn)行正確性驗(yàn)證。
4總結(jié)
在程序設(shè)計(jì)實(shí)驗(yàn)教學(xué)中,以問題求解來驅(qū)動(dòng)教學(xué)可以更好地發(fā)揮學(xué)生的主體性,有效地培養(yǎng)了學(xué)生的學(xué)習(xí)興趣,提高了學(xué)生分析問題、解決問題的能力,其優(yōu)勢(shì)是明顯的,但也存在一些問題。由于教師主要是進(jìn)行方法的引導(dǎo),學(xué)生有更多時(shí)間自主學(xué)習(xí),而學(xué)生的學(xué)習(xí)能力是不同的,因而在同一課堂內(nèi),全班同學(xué)所掌握的知識(shí)會(huì)有所不同,容易造成學(xué)生成績(jī)兩極分化和教學(xué)知識(shí)點(diǎn)的疏漏。這就需要教師在教學(xué)中加強(qiáng)課堂或階段小結(jié)和知識(shí)點(diǎn)的交流或回顧,使學(xué)習(xí)能力差的同學(xué)或操作有疏漏的同學(xué)能通過教師的總結(jié)和回顧跟上教學(xué)進(jìn)度,全面掌握知識(shí)點(diǎn),達(dá)到教學(xué)目標(biāo),促進(jìn)同步發(fā)展。
參考文獻(xiàn):
[1] Hanly,J.R.,Koffman,E.B..問題求解與程序設(shè)計(jì)C語(yǔ)言版[M]. 4版. 朱劍平,譯.北京:清華大學(xué)出版社,2007.
[2] 沈建英.計(jì)算機(jī)程序設(shè)計(jì)實(shí)驗(yàn)教學(xué)改革探索[J]. 實(shí)驗(yàn)技術(shù)與管理,2003,20(4):105-107.
[3] 吳冬芹.大學(xué)生程序設(shè)計(jì)學(xué)習(xí)心理研究與教學(xué)對(duì)策探討[D].揚(yáng)州大學(xué)碩士論文,2006.
[4] 關(guān)忠仁. C 語(yǔ)言教學(xué)質(zhì)量的思考與實(shí)踐[J]. 計(jì)算機(jī)教育,2007(6):56-57.
[5] 張曉慧,喬成立,等.問題式教學(xué)法在綜合性和設(shè)計(jì)性實(shí)驗(yàn)教學(xué)中的研究與實(shí)踐[J]. 教育探索,2008(11):81-82.
The Application of Problem Solving Method in C Language Programming Experiment Teaching
HUA Guan-ping
(College of Information Science, Zhejiang Shuren University, Hangzhou 310015, China)
Abstract: It is a common view in experiment teaching of programming that “hard to learn” and “hard to teach”. The experiment effect is not very ideal. This text introduces problem solving method to change traditional experiment teaching model and achieve the better teaching effect.
Key words: C language programming; experiment teaching; problem solving