洪留榮
摘要:針對C語言程序設(shè)計課對于地方高校初學者學習上的困難,本文探討了在課堂教學上的一些教學思路。從數(shù)據(jù)類型、表達式以及復合語句三個方面探討了教學上應關(guān)注的重點和核心,分析了這樣做的優(yōu)點,強調(diào)了課堂教學從教材上提煉相關(guān)課堂內(nèi)容的重要性。
關(guān)鍵詞:C語言程序設(shè)計;課堂教學;數(shù)據(jù)類型;表達式;復合語句
中圖分類號:G642? ? ? 文獻標識碼:A
文章編號:1009-3044(2021)10-0117-03
C語言程序設(shè)計是計算機類專業(yè)的重要專業(yè)基礎(chǔ)課,教授的對象一般是高校低年級學生,地方高校學生優(yōu)點是視野天闊、個性強、接受新事物的能力強,不足之處在于自控能力差、缺乏目標、自我學習能力欠缺。因此,目前出現(xiàn)了諸多教學模式的探討。文獻[1]提出了基于“學習成果導向”理念的計算機基礎(chǔ)教學改革模式,從教學設(shè)計到最后的評價進行了改良;文獻[2]針對學生能力提升問題改了教學模式,提出了培養(yǎng)學生C語言編程能力和工程實踐能力的教學模式;文獻[3]和[4]從教學的教法上進行了C語言教學改革,分別討論了翻轉(zhuǎn)課堂和網(wǎng)絡(luò)教學模式的應用;文獻[5]從精煉課程內(nèi)容上入手并提出了“MOOC+翻轉(zhuǎn)課堂教學模式”。這些改革的方法均發(fā)揮了各自的優(yōu)點,考慮到無論教學模式如何,將課堂教學內(nèi)容簡化、厘清知識的本質(zhì)是最根本的問題,它可以有效提升學生學習的興趣,使學生樂于進一步探索學習,更好地發(fā)揮新教學模式的作用,從而有效地培養(yǎng)他們的計算思維能力和編程能力,因此,本文從三個方面探討C語言程序設(shè)計課堂教學的教學思路,抓住本質(zhì),簡化學生理解難度。
1 以“數(shù)據(jù)類型”與“地址”統(tǒng)領(lǐng)整個C語言程序設(shè)計教學
絕大多數(shù)人在談到C語言時,都把“指針”作為它的精華,但這只對了一部分,C語言真正的精華在于“數(shù)據(jù)類型”,從指針的運算、格式符對值的解釋、各種數(shù)據(jù)類型的轉(zhuǎn)換、數(shù)組及函數(shù)等均是在“數(shù)據(jù)類型”這個概念的基礎(chǔ)之上處理的,而且指針僅是一種數(shù)據(jù)類型,其表現(xiàn)出的形式是整型值。
基于此,在課堂教學中,從講述常量和變量的概念起,把重點放在內(nèi)存地址的概念以及格式符對內(nèi)容的解釋上,包括存放的字節(jié)數(shù)、符號位、存放的格式與數(shù)據(jù)類型的關(guān)系,以及獲取值、賦值、格式符與數(shù)據(jù)類型的關(guān)系,培養(yǎng)學生理解數(shù)據(jù)與數(shù)據(jù)類型的密切關(guān)系,講清了這種關(guān)系,學生就可以快速地理解各種類型數(shù)據(jù)的核心本質(zhì),從而準確地理解類型提升與強制轉(zhuǎn)換這些概念以及在這些過程中發(fā)現(xiàn)的變化,也為后續(xù)需要用內(nèi)存解釋C語法打下很好的思維基礎(chǔ)。比如,初始時,把握了這個本質(zhì)學生自己就很容易解釋像float型數(shù)據(jù)用“%d”輸入輸出時出錯的現(xiàn)象,少犯一些自己無法解釋和無從修改的低級錯誤,這些錯誤如果經(jīng)常出現(xiàn)對許多初學者的學習積極性打擊非常大,從而失去學習的興趣。
數(shù)組作為重要的構(gòu)造類型,在C語言中占重要地位,它的應用非常靈活,數(shù)組名的意義是關(guān)鍵內(nèi)容,許多高校使用的教材把重點放在了數(shù)組所定義的變量上,重點講述各變量的引用,這使得學生在后續(xù)的數(shù)組作為參數(shù)以及與指針的關(guān)系理解起來困難非常大,經(jīng)常出現(xiàn)一個例程中的語句照抄到自己的代碼中也出錯的現(xiàn)象,尤其是二維數(shù)組、多維數(shù)組這些復雜的結(jié)構(gòu)。因此,在數(shù)組一章中,如果用數(shù)據(jù)類型對數(shù)組名和它的元素進行分析,指出數(shù)組名本身的數(shù)據(jù)類型就是數(shù)組本身;數(shù)組名作為表達式的操作數(shù)時是地址(sizeof(數(shù)組名)、&(數(shù)組名)除外),此地址指向的數(shù)據(jù)類型就是數(shù)組元素的類型,這樣,學生就可以很容易把數(shù)組名賦值給指向一維數(shù)組的指針、指針數(shù)組、多級指針時,從數(shù)據(jù)類型的角度考慮問題。這樣當用數(shù)組名作為實參傳值給指針類型的形參時,就容易正確定義形參的數(shù)據(jù)類型及結(jié)構(gòu)。當時參與形參類型不一致后出現(xiàn)的運行錯誤,可以再根據(jù)數(shù)據(jù)類型這個關(guān)鍵的東西進行分析。
強調(diào)數(shù)據(jù)類型,可以非常明確地把指針變量轉(zhuǎn)換成C語言的基本數(shù)據(jù)類型變量一樣的思維方式來理解,指出指針變量就是一個變量,只是類型與基本數(shù)據(jù)類型不同,其存放的是整數(shù)形式的值,即地址,因為前面講述的地址概念到此處學生已經(jīng)非常熟悉,已經(jīng)形成良好的思維模式,所以理解起來很容易,所以此時的指針概念只是地址換了一個說法而已。
為了突出指針變量是“值”且數(shù)據(jù)類型為指針類型的概念,在教學過程中,把聲明指針變量的一般寫法,如教材上定義指針變量的方式,如int? *p;,強調(diào)成(int*) p;這樣的方式,指出數(shù)據(jù)類型為(int *),后面只是一個簡單變量,并提醒學生引用時數(shù)據(jù)類型的一致性;這樣,把指針變量使用的思維與使用一般基礎(chǔ)類型變量的方法統(tǒng)一起來。強調(diào)指針變量的數(shù)據(jù)類型相同指的是它指向的數(shù)據(jù)類型一致這個概念。例如,二維數(shù)組名作為實參時,其對應形參的寫法就非常容易理解了;再如函數(shù)指針(*fun)(),強調(diào)不同函數(shù)的數(shù)據(jù)類型不同,學生就可以快速理解一個函數(shù)指針做形參的意義以及實參的正確寫法。
在抓住了這些本質(zhì)以后,一些同學還可以比較好地理解像這樣的函數(shù)指針數(shù)組int (*s[10])(int),并且可以正確調(diào)用它,而這并不在教學內(nèi)容之列。
這種以數(shù)據(jù)類型為綱的教學思路,可以把構(gòu)造類型的變量轉(zhuǎn)換成基本數(shù)據(jù)類型這種簡單的變量進行理解。從筆者多年的教學經(jīng)歷來看,學生對指針和數(shù)組(包括二維數(shù)組、多數(shù)數(shù)組、多級指針)之間的傳參、指向一維數(shù)組的指針、指針數(shù)組以及函數(shù)指針這些相對較復雜的概念理解起來并不存在大的困難,有些平時訓練多一點的同學,可以寫出水平較高的代碼,調(diào)試時遇到的一般性問題通常有解決的思路。學生如果有了這些核心知識和思維的鋪墊,指針一章的教學內(nèi)容并不是困難的。
以數(shù)據(jù)類型為主線,同時對后續(xù)結(jié)構(gòu)體類型、共同體類型等都可以轉(zhuǎn)換成基本數(shù)據(jù)類型的思維方式來理解,只需要強調(diào)一下各自類型的獨有特點就可以了,比如結(jié)構(gòu)體類型成員變量的賦值、輸入與輸出等,剩下的教學重點就可以放在算法思維上了,即如何應用結(jié)構(gòu)體這些數(shù)據(jù)類型解決鏈表問題。
有了數(shù)據(jù)類型這個本質(zhì)基礎(chǔ),在課后閱讀別人所寫的紛繁復雜的代碼時,也就變得相對容易,從筆者的教學經(jīng)歷來看,學生如果把握了數(shù)據(jù)類型這種C語言本質(zhì),就可以很好地理解本科生C語言程序設(shè)計教學大綱上規(guī)定的重點和難點,加之適當編程練習和閱讀代碼就可以把握核心內(nèi)容。更重要的是學生持續(xù)學習C語言的能力增強,這是因為能理解代碼增加了他們學習的積極性,有了積極性,學習C語言興趣更高,更加樂于去實踐,更能加強理解,起到一個良性循環(huán)的作用。
2 以表達式的值統(tǒng)領(lǐng)各表達式的講解
地方高校學生在開始接觸C語言時一般在低年級,并沒有好的計算思維能力,很多人在入學前,沒有真正接觸過臺式電腦,因此往往以一般性邏輯思維和高中時的數(shù)學表達式思維來看C語言的表達式,經(jīng)常會以一般的邏輯方式去考慮問題,而許多教材所給內(nèi)容又恰好加深了這種誤解,例如,所給的例題多類似if(x>60)這樣的寫法,如果教師也以這種方式去講解,許多學生就會陷入“如果x大于60就執(zhí)行什么”的思維方式中,因而,對表達式的理解就不透徹,比如對于后續(xù)常用的像if(!x) 、while(1)這樣的寫法理解起來非常吃力,要花時間去講解這些()中的表達式要作為邏輯表達式或關(guān)系表達式等內(nèi)容,給學生造成思維上的混亂。所以,表達式的講解一定要以C語言標準上(如C11、C17標準)的定義進行簡化,強調(diào)表達式的結(jié)果是一個值,以值的方式去理解,單個變量是一個表達式、函數(shù)是一個表達式,表達式中的運算符,根據(jù)優(yōu)先級和順序點參與運算,它們都有一個最后的結(jié)果值,這樣學生對諸如x=3、a>b>c這樣的表達式理解起來就方便了。有了這種基礎(chǔ),后續(xù)講解選擇語句、循環(huán)語句等就()中的表達式值以0和非0值作為統(tǒng)一標準進行講解,即當表達式為非0時執(zhí)行語句,為0時不執(zhí)行語句,這樣,初學者對if(!x) 、while(1)寫法理解起來就很容易,并很快能閱讀并編寫出類似的代碼,也不會把“a>b && b>c”這樣的表達式寫成“a>b>c”。因此,強調(diào)表達式的值,可以統(tǒng)一所有選擇語句和循環(huán)語句中涉及的表達式部分,可以用“值非0執(zhí)行,0不執(zhí)行”這樣簡單的話來描這類語句的執(zhí)行過程。這不僅適用于關(guān)系表達式、邏輯表達式,也適用于函數(shù)表達式,同時也與_Bool類型的值統(tǒng)一。
3 以復合語句統(tǒng)領(lǐng)選擇語句和循環(huán)語句
C語言初學者一般容易理解基本的選擇語句和循環(huán)語句,代碼閱讀不會存在大的困難,也可以寫出比較簡單的程序代碼,但對于這類語句的嵌套結(jié)構(gòu)理解起來就相對困難,像if-else語句if部分和else部分分別嵌套有if或if-else語句;for循環(huán)中又嵌套其他循環(huán)的情況。對于這些知識點,可均以復合語句作為切入點進行教學,以while循環(huán)為例,首先給出while語句的基本語法結(jié)構(gòu):
while(表達式) 一條語句;
強調(diào)上述全部代碼是一條while語句,其執(zhí)行過程為當表達式值非0時,只執(zhí)行其后的一條語句,如果當表達式值非0時,需執(zhí)行多條語句,需要用{}括起來。這個一般教學中都會講到,但很多教材并沒有強調(diào){}是一條復合語句,如果把{}這個看成一條語句,則while{}后面如何復雜,都與while語句定義的格式一致,是一條while語句。比如有以下代碼:
while(i>1)
{
printf("%d ",i);
for(j=1;j
{
jc=jc*j;
}
while(a--)
jc=jc+5;
i++;
}
t++;
按照上述以語句的分析方法,把while循環(huán)作為一條語句,則學生很容易看出整個代碼實質(zhì)上是兩條語句:
while語句
t++;
while()后跟一條復合語句,執(zhí)行的過程是先把while語句執(zhí)行完成,再執(zhí)行t++;語句,然后再介紹while中的復合語句的分析,它只包含四條語句:
printf("%d ",i);
for語句
while語句
i++;
外層while()中的表達式值非0時,依次順序執(zhí)行這些語句。因為把循環(huán)看成了一條語句,這也意味著這四條語句中先執(zhí)行完printf("%d ",i);,然后執(zhí)行for這條語句,這條語句執(zhí)行完才執(zhí)行后面的while語句,所以從順序上看這非常清晰,學生容易理解,且須記的內(nèi)容很少。
把問題拆成一條一條語句的講授方法,有以下好處:
(1)選擇語句、循環(huán)語句以語句統(tǒng)一,函數(shù)體內(nèi)語句就可以用簡單的順序結(jié)構(gòu)進行思維。對于初始者,這樣的簡單描述,使學生容易理解、掌握程序代碼的執(zhí)行過程,如果當教學中沒有給出這種簡易的結(jié)構(gòu)說明,而只是用一段代碼來說明什么是多重循環(huán)且用代碼來解釋它們的運行過程,大多數(shù)學生的注意力往往就會集中在每一行代碼本身,缺乏整體的概念。強調(diào)復合語句看成一條語句,可以把表面非常復雜的代碼進行簡化,讓學生容易從整體上把握編程的思路,培養(yǎng)他們的算法思維能力,同時可有效提升他們的編程能力和閱讀代碼的能力。
(2)可以間接培養(yǎng)學生函數(shù)遞歸調(diào)用的部分思維,為后續(xù)學習函數(shù)打下基礎(chǔ)。選擇語句、循環(huán)語句當中的復合語句可包含選擇語句、循環(huán)語句,雖然這部分內(nèi)容沒有講述到“遞歸”的概念,但這里實際上已經(jīng)切入了函數(shù)遞歸調(diào)用的部分思維,這種思維就是外層中有相同內(nèi)層。
(3)可以為模塊化編程打下思維基礎(chǔ)。這里復合語句雖然沒有說明模塊化,但用整條語句進行分析,可以讓學生體會到一條語句是作為一個整體,一條語句可以包含多條語句,以完成一定的任務(wù),這些雖然在課堂教學中沒有指出,但這樣的方式顯然可以引導學生做這樣直覺性的思考,從而為后續(xù)模塊化編程的教學打下思維基礎(chǔ)。
4 結(jié)束語
C語言這種簡潔緊湊、靈活方便計算機語言,學好它有一定難度。從整體上講,一般地方院校的學生自學能力和學習積極性相對不足,更需教師在課堂教學上多下功夫。我國古代最早一篇專門論述教育、教學問題的論著《學記》中強調(diào)的教師應“其言也,約而達,微而臧”[6],因此,提煉出C語言的本質(zhì),以簡單的過程描述復雜的問題顯得非常重要。本文把前后教學內(nèi)容有意識的提煉、提前鋪墊,用簡單的方式去解釋C程序設(shè)計中紛繁復雜的代碼,使學生易于理解,更好地提升他們的學習興趣,培養(yǎng)他們的算法思維能力和編程能力;思維的鋪墊可以讓學生在前期逐步形成學習后期知識的所需的思維意識,這樣后續(xù)新知識的學習就相對容易。
參考文獻:
[1] 張翠平,趙暉.基于“學習成果導向”理念的教學研究——以C語言程序設(shè)計課程為例[J].計算機教育,2020(3):153-156,161.
[2] 陳濤,朱俊,裔傳俊,等.面向編程能力培養(yǎng)的C語言教學模式研究[J].計算機教育,2020(1):100-103.
[3] 何迎生,王從銀.基于慕課的C語言程序設(shè)計翻轉(zhuǎn)課堂教學實踐[J].計算機教育,2020(1):160-163.
[4] 駱春妹,袁三一.基于網(wǎng)絡(luò)教學平臺的C語言課程教與學研究[J].教育教學論壇,2020(9):372-373.
[5] 李薇,黑新宏,王磊.C語言程序設(shè)計課程的金課建設(shè)實踐[J].計算機教育,2020(6):142-146.
[6] 王凌皓,姬天雨.中國古代師道觀評析[J].河北師范大學學報(教育科學版),2019,21(1):15-20.
【通聯(lián)編輯:光文玲】