楊旺明
(三峽大學(xué),湖北宜昌 443002)
C 語言是計(jì)算機(jī)程序設(shè)計(jì)中常用的基礎(chǔ)的教學(xué)課程。目前高校C 語言程序設(shè)計(jì)的教學(xué)以講授知識點(diǎn)為主,采用老師講解知識點(diǎn),對應(yīng)程序演示及上機(jī)練習(xí)的模式。這樣教學(xué)模式能幫助學(xué)生掌握對應(yīng)的知識,基本上能實(shí)現(xiàn)對應(yīng)的習(xí)題練習(xí)。一個學(xué)期下來,對于編程學(xué)生存在著以下問題缺少實(shí)際問題的解決能力。所學(xué)習(xí)的知識點(diǎn)語法可以進(jìn)行一些理論學(xué)習(xí)和實(shí)踐,能閱讀或編寫簡單代碼,針對具體問題往往束手無策。
缺少綜合問題解決基本處理能力,缺少將問題總?cè)蝿?wù)進(jìn)行分析分解成若干個子問題,完成子問題從而解決總?cè)蝿?wù)能力,進(jìn)而編寫出對應(yīng)的程序?;蛘?,即使找到一種解決方案,但將代碼大部分寫在main 函數(shù)中,使得程序的調(diào)試變得困難,以至逐漸喪失編程興趣。
有鑒于此,本文提出設(shè)計(jì)應(yīng)用型問題作為教學(xué)案例,將知識點(diǎn)融合到案例中,采用軟件工程方法解決綜合問題,進(jìn)而提高學(xué)生編程能力,提高C 語言程序設(shè)計(jì)的教學(xué)效果。
應(yīng)用型人才的需要培養(yǎng)學(xué)生分析問題能力,解決問題及動手編程能力,能在將工作崗位中能適應(yīng)項(xiàng)目驅(qū)動開發(fā)。C 語言教材中一般來講皆是給知識點(diǎn)為章節(jié),每個章節(jié)也有對應(yīng)示例來講解對應(yīng)的知識點(diǎn)。在教學(xué)中,我們根據(jù)所學(xué)的知識點(diǎn)設(shè)計(jì)一個具體應(yīng)用實(shí)例,涵蓋多個章節(jié)的知識點(diǎn),綜合訓(xùn)練學(xué)生編程能力,激發(fā)編程興趣,提高教學(xué)效果。下面就以校歷打印為例,逐步實(shí)現(xiàn)該問題的解決方案,實(shí)現(xiàn)對應(yīng)的教學(xué)內(nèi)容的學(xué)習(xí)。
C 語言前面章節(jié)講述的是順序結(jié)構(gòu)、 選擇結(jié)構(gòu)及循環(huán)結(jié)構(gòu)。這一部分涉及的知識點(diǎn)有邏輯表達(dá)式、if 語句及循環(huán)結(jié)構(gòu)for 語句(或while 語句)。通過教材或講義示例,使學(xué)生掌握了閏年判斷方法、某年某月天數(shù)及for 語句實(shí)現(xiàn)循環(huán)(如求累加和)等,為了提高綜合編程能力,我們引入實(shí)際問題作為教學(xué)案例,以學(xué)校校歷打印來激發(fā)學(xué)生興趣,培養(yǎng)學(xué)生解決問題的綜合能力。
打印學(xué)校一學(xué)年的校歷。校歷見圖1。
圖1 校歷示例圖
校歷打印涉及日期處理、 教學(xué)周的計(jì)算及星期處理,是一個綜合型的案例。對于初級編程者而言,該問題比較復(fù)雜。當(dāng)然這里面需要用到的知識點(diǎn)有日期的處理,循環(huán)結(jié)構(gòu)的使用,如何才能用程序?qū)崿F(xiàn)呢? 我們可以用軟件工程方法,自上而下進(jìn)行設(shè)計(jì),自下而上的實(shí)現(xiàn)。那么問題就變得要簡單多了。
按照軟件工程學(xué)的方法,將總?cè)蝿?wù)分解成幾個小任務(wù)來完成。如果某個子任務(wù)在實(shí)現(xiàn)時還有一些復(fù)雜,則可以繼續(xù)分解。從整個結(jié)果來看,可以將其分為3 個大部分,即標(biāo)題部分,教學(xué)周及該年該月的周歷打印。標(biāo)題部分比較簡單,共兩行。教學(xué)周的計(jì)算是一個循環(huán)結(jié)構(gòu),而該年該月的周歷又包括兩部分,其一是計(jì)算該年該月有多少天,其二是打印出該年該月的位置。計(jì)算該年該月有多少天,可以分解為閏年判斷和天數(shù)計(jì)算。而打印該年該月的1日又可以分解為計(jì)算該年該月的1日是否教學(xué)周并計(jì)算該年該月的1日是星期幾。通過這樣的方法分解成子問題后,每個子問題就可以對應(yīng)相應(yīng)的知識點(diǎn)來編程實(shí)現(xiàn)。
通過上面的分析和分解,按照軟件工程學(xué)方法,自下而上逐個實(shí)現(xiàn)。問題明朗后,教師對所涉及的知識點(diǎn)進(jìn)行點(diǎn)撥,學(xué)生就可以分別根據(jù)所學(xué)知識來完成。涉及閏年判斷和天數(shù)計(jì)算,學(xué)生在學(xué)習(xí)邏輯表達(dá)式及選擇結(jié)構(gòu)時已經(jīng)掌握了,實(shí)現(xiàn)相對容易一些。計(jì)算該年該月的一日是星期幾是根據(jù)已經(jīng)知道1900年1月1日是星期一來進(jìn)行推算的,推算分兩個部分,其一按年計(jì)算,其二是按月計(jì)算,星期幾可以使用C 語言中的求余運(yùn)算%來實(shí)現(xiàn)。經(jīng)過這樣分析分解后,容易編寫對應(yīng)函數(shù),如下所示:
/*某年某月第一天是星期幾
已知1900年1月1日是星期一
*/
int firstDayMonth(int y,int m){
int i, weekday;
weekday = Monday;
/* 以年為單位按天算是星期幾*/
for(i=1900; i //每一年以365 天計(jì) weekday = (weekday + 365) % 7; //如果該年i 是閏年就加多1 天 if (isLeapYear(i)){ weekday = (weekday+1) % 7; } } /* 以月為單位按天算是星期幾*/ for(i=1; i weekday = (weekday + getDaysByYearMonth(y, i) )% 7; } //printf("%d-%d is %d
", y,m,weekday); return weekday; } 同樣的方法,對計(jì)算該年該月的1日是否是教學(xué)周的開始,只需要比較一下日期是否等于指定開學(xué)的日期,使用語句即可,如下所示: if(y == beginDate[i].year && m==beginDate[i].month&& d==beginDate[i].day) 計(jì)算出該年該月的第一天是星期幾后就可以讓該年該月的1日出現(xiàn)對應(yīng)星期列,前面用空白填補(bǔ),用典型的循環(huán)結(jié)構(gòu)中嵌套選擇結(jié)構(gòu)即可。 通過該案例,可以幫助學(xué)生理解邏輯表達(dá)式及選擇結(jié)構(gòu)與循環(huán)結(jié)構(gòu)使用等知識點(diǎn),在解決實(shí)際問題的過程中,提高學(xué)生編程能力與興趣,整個案例的實(shí)現(xiàn)過程中,學(xué)生查閱相關(guān)資料并相互之間進(jìn)行討論分析,有的學(xué)生還對結(jié)果進(jìn)行了改良,進(jìn)一步培養(yǎng)了學(xué)生的創(chuàng)新精神,取得很好的教學(xué)效果。 通過一學(xué)期的案例嘗試,極大地調(diào)動了學(xué)生編程興趣及實(shí)踐能力。實(shí)踐表明,通過案例特別是綜合案例的引入,極大提高了C 語言程序設(shè)計(jì)的考試成績,學(xué)生的C 語言二級通過率也有很大的提高。 在本文中,我們提出高校校歷制作的教學(xué)案例,改善傳統(tǒng)教學(xué)模式下學(xué)生解決實(shí)際問題及綜合問題能力的不足,培養(yǎng)學(xué)生動手能力,提高教學(xué)效果。2.3 案例效果
3 結(jié)論