国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

計(jì)算機(jī)專(zhuān)業(yè)編程語(yǔ)言類(lèi)課程教學(xué)的思考

2016-05-20 02:36:13何炎祥湖北工業(yè)大學(xué)計(jì)算機(jī)學(xué)院湖北武漢430068武漢大學(xué)計(jì)算機(jī)學(xué)院湖北武漢430072軟件工程國(guó)家重點(diǎn)實(shí)驗(yàn)室武漢大學(xué)湖北武漢430072
計(jì)算機(jī)教育 2016年4期
關(guān)鍵詞:編程語(yǔ)言

江 南,何炎祥(.湖北工業(yè)大學(xué) 計(jì)算機(jī)學(xué)院,湖北 武漢 430068;2. 武漢大學(xué) 計(jì)算機(jī)學(xué)院,湖北 武漢 430072;3. 軟件工程國(guó)家重點(diǎn)實(shí)驗(yàn)室(武漢大學(xué)),湖北 武漢 430072)

?

計(jì)算機(jī)專(zhuān)業(yè)編程語(yǔ)言類(lèi)課程教學(xué)的思考

江 南1,何炎祥2,3
(1.湖北工業(yè)大學(xué) 計(jì)算機(jī)學(xué)院,湖北 武漢 430068;
2. 武漢大學(xué) 計(jì)算機(jī)學(xué)院,湖北 武漢 430072;
3. 軟件工程國(guó)家重點(diǎn)實(shí)驗(yàn)室(武漢大學(xué)),湖北 武漢 430072)

摘 要:從計(jì)算機(jī)專(zhuān)業(yè)編程語(yǔ)言類(lèi)課程教學(xué)實(shí)踐中總結(jié)3方面的教學(xué)思考,首先討論如何在教學(xué)過(guò)程中提高學(xué)生準(zhǔn)確分析程序運(yùn)行結(jié)果的能力,即結(jié)合圖示分析運(yùn)行時(shí)數(shù)據(jù)區(qū)以及區(qū)分編譯時(shí)和運(yùn)行時(shí)錯(cuò)誤,其次提出對(duì)比不同編程語(yǔ)言關(guān)鍵特性的教學(xué)手段,最后闡述培養(yǎng)抽象描述和表達(dá)問(wèn)題能力的重要性,并以相應(yīng)教學(xué)案例和取得的效果加以說(shuō)明。

關(guān)鍵詞:編程語(yǔ)言;運(yùn)行時(shí)數(shù)據(jù)區(qū);語(yǔ)言特性對(duì)比;抽象描述

1 提高學(xué)生準(zhǔn)確分析程序運(yùn)行結(jié)果的能力

程序完成一定的功能,功能的正確性是我們對(duì)程序的首要關(guān)注面,運(yùn)行的結(jié)果就是設(shè)計(jì)和編碼所要實(shí)現(xiàn)的預(yù)期效果。程序的運(yùn)行結(jié)果是確定的,其中,“確定”這個(gè)詞表達(dá)的意思是:運(yùn)行結(jié)果一定是可以分析出來(lái)的,如果運(yùn)行結(jié)果和預(yù)期不符,那么一定要找出問(wèn)題所在。在教學(xué)過(guò)程中,常常聽(tīng)到學(xué)生說(shuō)“這個(gè)程序的運(yùn)行結(jié)果好象是……似乎是……”,有時(shí)候即使他們給出了一個(gè)正確的答案,也很難進(jìn)一步說(shuō)明答案的由來(lái)。因此,教師要在教學(xué)過(guò)程中對(duì)重要語(yǔ)法點(diǎn)設(shè)計(jì)相關(guān)聯(lián)的程序,注重分析程序的運(yùn)行結(jié)果并輔以圖示,而不是一遍遍地羅列和解釋每個(gè)語(yǔ)法點(diǎn),讓學(xué)生去記憶。一般來(lái)講,計(jì)算機(jī)總是規(guī)規(guī)矩矩地按照程序編譯后的指令去執(zhí)行,因此,我們提倡的做法是按照語(yǔ)言的語(yǔ)法功能,用人腦代替機(jī)器運(yùn)行程序,用筆和紙模擬機(jī)器執(zhí)行的過(guò)程。這種方法在學(xué)生初學(xué)語(yǔ)言時(shí)對(duì)迅速掌握語(yǔ)法要點(diǎn)非常實(shí)用,并且在掌握一門(mén)語(yǔ)言后用這種方法分析復(fù)雜程序也是很有必要的。

1.1分析運(yùn)行時(shí)數(shù)據(jù)區(qū)

講授編程語(yǔ)言時(shí),強(qiáng)調(diào)“一個(gè)程序不管有多復(fù)雜,它終歸是該程序?qū)λ倏v數(shù)據(jù)產(chǎn)生的效果”。程序運(yùn)行時(shí)環(huán)境,特別是數(shù)據(jù)區(qū)是非常值得關(guān)注的。作為教學(xué)案例,我們先給出一段Java參數(shù)傳遞的代碼,其中程序的輸出以注釋給出。

假定類(lèi)Person的定義包括一個(gè)整型(int)成員變量age、一個(gè)構(gòu)造方法對(duì)成員變量進(jìn)行初始化,兩個(gè)成員方法getAge()和setAge(int)分別獲得age的值和對(duì)age進(jìn)行賦值。按照語(yǔ)法解釋?zhuān)摱未a的執(zhí)行情況是:運(yùn)行方法g()時(shí),首先創(chuàng)建了一個(gè)Person對(duì)象,其成員變量age的值是10,本地變量p指向該對(duì)象,第二行輸出10;使用p調(diào)用方法f時(shí),按照J(rèn)ava按值傳遞參數(shù)機(jī)制,p的值傳遞給f方法的形參person,由于p是一個(gè)引用類(lèi)型變量,它的值是對(duì)象的地址,這個(gè)地址值拷貝給person,因此person的值也是剛剛創(chuàng)建對(duì)象的地址,即person也指向這個(gè)Person對(duì)象;參數(shù)傳遞完成后,在f方法體中,首先創(chuàng)建了一個(gè)Person對(duì)象,其成員變量的值是20,person指向這個(gè)新創(chuàng)建的對(duì)象,因此輸出20;方法f執(zhí)行完畢后,返回到方法g,由于方法g在調(diào)用方法f時(shí),沒(méi)有對(duì)本地變量p產(chǎn)生任何改變,因此,輸出10。

教師僅僅這樣解釋顯得非常沉悶,如果給出它的運(yùn)行時(shí)數(shù)據(jù)區(qū)圖示,會(huì)直觀和形象得多。圖1中的(a)~(d)給出了調(diào)用方法g前后運(yùn)行時(shí)數(shù)據(jù)區(qū)的變化。

圖1 方法調(diào)用的運(yùn)行時(shí)數(shù)據(jù)區(qū)示意圖

在分析實(shí)現(xiàn)功能的層面上,模擬Java程序的運(yùn)行需要關(guān)心的是棧楨中各本地變量的取值和堆中對(duì)象各成員變量的取值。因此,在分析上述代碼時(shí),按照程序的執(zhí)行依次畫(huà)出圖1中的(a)~(d)。從圖1可以直接看出,參數(shù)傳遞完成時(shí),g棧楨中的person變量指向Person對(duì)象1;方法f執(zhí)行完成后,person變量指向Person對(duì)象2;返回方法g后,f棧楨中的p變量仍然指向Person對(duì)象1。

上述運(yùn)行時(shí)數(shù)據(jù)區(qū)的圖示方法貫穿在整個(gè)授課過(guò)程對(duì)程序的分析之中。這種方法適用于常用的命令式語(yǔ)言,如解釋C語(yǔ)言內(nèi)存泄漏問(wèn)題時(shí),用圖示法模擬運(yùn)行時(shí)數(shù)據(jù)區(qū)的變化,可以直觀描述被泄漏的內(nèi)存空間。

實(shí)踐表明,這種方法的使用形象化了知識(shí)點(diǎn),加深了學(xué)生對(duì)語(yǔ)言理解,在授課過(guò)程中,我們鼓勵(lì)學(xué)生使用這種方法來(lái)分析程序。從學(xué)生的反饋來(lái)看,這種方法對(duì)準(zhǔn)確分析程序的運(yùn)行結(jié)果有較大幫助。

1.2區(qū)分編譯時(shí)錯(cuò)誤和運(yùn)行時(shí)錯(cuò)誤

編譯器不報(bào)錯(cuò)并不保證運(yùn)行時(shí)沒(méi)有錯(cuò)誤發(fā)生。在教學(xué)過(guò)程中,為了培養(yǎng)學(xué)生準(zhǔn)確分析程序運(yùn)行結(jié)果的能力,我們還重視幫助學(xué)生建立編譯時(shí)錯(cuò)誤和運(yùn)行時(shí)錯(cuò)誤的概念,區(qū)分編譯時(shí)錯(cuò)誤和運(yùn)行時(shí)錯(cuò)誤。為了做到這一點(diǎn),我們針對(duì)不同語(yǔ)言的特點(diǎn),設(shè)計(jì)不同的代碼段,解釋它們的編譯結(jié)果和運(yùn)行結(jié)果。先以Java語(yǔ)言中的“造型”這一語(yǔ)法點(diǎn)為例。在Java中,造型分向上造型和向下造型,造型機(jī)制的語(yǔ)法點(diǎn)總結(jié)為:向上造型總是允許的,可以隱式進(jìn)行;向下造型必須顯式進(jìn)行。我們可能寫(xiě)出看似符合這個(gè)總結(jié)的程序,但是,程序運(yùn)行可能會(huì)報(bào)類(lèi)造型異常的錯(cuò)誤。假定類(lèi)B是類(lèi)A的子類(lèi),給出如下代碼段:

在授課過(guò)程中,先給出代碼段(1),分別創(chuàng)建了父類(lèi)A的對(duì)象a和子類(lèi)B的對(duì)象b,將子類(lèi)型引用變量b強(qiáng)制轉(zhuǎn)換為父類(lèi)型(由造型操作(A)完成),即向上造型,然后賦給父類(lèi)型引用變量a,這段代碼既沒(méi)有編譯時(shí)錯(cuò)誤也沒(méi)有運(yùn)行時(shí)錯(cuò)誤;由于向上造型總是被允許的,即一個(gè)子類(lèi)對(duì)象總是一個(gè)父類(lèi)型,它可以隱式進(jìn)行,去掉造型操作符(A)后,程序是不受影響的。然后給出代碼段(2),它將一個(gè)父類(lèi)型引用變量a賦給子類(lèi)型引用變量b,即向下造型,因?yàn)闊o(wú)法知道一個(gè)父類(lèi)型引用變量在運(yùn)行時(shí)是否引用到一個(gè)子類(lèi)型對(duì)象,向下造型必須顯式進(jìn)行,因此代碼段(2)報(bào)編譯時(shí)錯(cuò)誤。接著給出代碼段(3),顯式造型父類(lèi)型引用變量a為一個(gè)子類(lèi)型(由造型操作(B)完成),這樣,在編譯時(shí),編譯器認(rèn)為類(lèi)型正確,不報(bào)錯(cuò)誤;但是,在運(yùn)行時(shí)進(jìn)行類(lèi)型檢查時(shí),由于引用變量a指向的對(duì)象是父類(lèi)型的,將一個(gè)子類(lèi)型變量引用到這個(gè)父類(lèi)型對(duì)象時(shí),Java運(yùn)行時(shí)機(jī)制報(bào)類(lèi)造型異常的錯(cuò)誤。為了修正這個(gè)錯(cuò)誤,最后給出代碼段(4),即在向下造型前,將b賦給a,即將父類(lèi)型的引用變量a指向子類(lèi)對(duì)象,這樣,程序運(yùn)行時(shí),引用變量a指向的對(duì)象是子類(lèi)型的,將它賦給子類(lèi)型變量沒(méi)有任何問(wèn)題。

對(duì)于C++編程語(yǔ)言,在VC++環(huán)境下,一個(gè)典型的編譯時(shí)不報(bào)錯(cuò),但運(yùn)行時(shí)報(bào)錯(cuò)的例子如下:

int *p = (int *) malloc(2*sizeof(int));

free(p);

free(p);

它表示的是,指針變量p在運(yùn)行時(shí)指向了一個(gè)整型數(shù)據(jù)空間,然后釋放這個(gè)數(shù)據(jù)空間,最后它又再次釋放這個(gè)已經(jīng)釋放的空間。許多大型C/ C++程序運(yùn)行時(shí)錯(cuò)誤是因?yàn)檫@種同一內(nèi)存空間多次釋放而造成的。需要說(shuō)明的是,VC++和GCC環(huán)境對(duì)這類(lèi)運(yùn)行時(shí)問(wèn)題的處理是不同的,給出這個(gè)例子是為了說(shuō)明區(qū)分編譯時(shí)錯(cuò)誤和運(yùn)行時(shí)錯(cuò)誤對(duì)理解程序的必要性。

從“分析運(yùn)行時(shí)數(shù)據(jù)區(qū)”和“區(qū)分編譯時(shí)錯(cuò)誤和運(yùn)行時(shí)錯(cuò)誤”兩個(gè)方面闡述如何在教學(xué)過(guò)程中提高準(zhǔn)確分析程序運(yùn)行結(jié)果的能力。實(shí)踐表明,這樣能夠加強(qiáng)學(xué)生對(duì)知識(shí)點(diǎn)的把握,使得這些知識(shí)點(diǎn)在學(xué)生的大腦有更清晰地認(rèn)識(shí),并加深學(xué)生對(duì)編程語(yǔ)言的理解。

2 對(duì)比不同編程語(yǔ)言的關(guān)鍵特性

不同編程語(yǔ)言在設(shè)計(jì)和實(shí)現(xiàn)上具有差異。C/ C++和Java是我們主要講授的兩種命令式編程語(yǔ)言,從程序形式上看,這兩門(mén)語(yǔ)言較為接近,但它們?cè)谠O(shè)計(jì)和實(shí)現(xiàn)上又具有明顯的不同。在學(xué)習(xí)第二門(mén)編程語(yǔ)言時(shí),如果適當(dāng)結(jié)合已講授的另外一門(mén)編程語(yǔ)言,會(huì)得到很好的觸類(lèi)旁通的效果,深化學(xué)生對(duì)編程語(yǔ)言的理解。

我們以面向?qū)ο笳Z(yǔ)言的一個(gè)重要特性,多態(tài)為例。首先,設(shè)計(jì)具有對(duì)比性的兩段代碼,分別在VC++和javac下進(jìn)行編譯:

然后給出程序的分析:C/C++中,虛函數(shù)才會(huì)被覆蓋,即子類(lèi)函數(shù)覆蓋了父類(lèi)中聲明為virtual的相同函數(shù)。當(dāng)調(diào)用這樣的函數(shù)時(shí),運(yùn)行時(shí)才會(huì)確定到底執(zhí)行哪個(gè)類(lèi)中的函數(shù)體,如果調(diào)用該函數(shù)的指針變量指向一個(gè)父類(lèi)型,則執(zhí)行父類(lèi)中對(duì)應(yīng)的函數(shù);如果指向一個(gè)子類(lèi)型,則執(zhí)行子類(lèi)中對(duì)應(yīng)的函數(shù)。因此,當(dāng)指針變量p指向a時(shí),由于a的類(lèi)型是父類(lèi)型A,所以第1行和第2行分別輸出A-f和A-g;當(dāng)指針變量p指向b時(shí),對(duì)于第3行輸出,雖然b的類(lèi)型是子類(lèi)型B,但是函數(shù)f未聲明為虛函數(shù),f函數(shù)的調(diào)用在編譯時(shí)已經(jīng)由p的類(lèi)型所確定,為父類(lèi)型A,因此第3行輸出A-f,對(duì)于最后一行輸出,由于g函數(shù)聲明為虛函數(shù),而此時(shí)p指向的是一個(gè)子類(lèi)型b,因此輸出B-g。

Java代碼中,Java語(yǔ)言沒(méi)有virtual關(guān)鍵字,可以視為所有的方法都是虛方法,因此,B類(lèi)中的方法f和方法g分別覆蓋了A中的方法f和方法g。方法覆蓋時(shí),在運(yùn)行時(shí)由調(diào)用方法的引用變量所引用對(duì)象的類(lèi)型來(lái)確定到底執(zhí)行哪個(gè)類(lèi)中的方法體。對(duì)于第1行和第2行的輸出,父類(lèi)型的引用變量p指向的是一個(gè)父類(lèi)對(duì)象a,則分別調(diào)用父類(lèi)的方法f和方法g,因此輸出A-f和A-g;在將父類(lèi)型的引用變量指向一個(gè)子類(lèi)對(duì)象b后,第3行和第4行的輸出分別是調(diào)用類(lèi)B中相應(yīng)的方法體,因此輸出B-f和B-g。

最后,引導(dǎo)學(xué)生對(duì)以上2個(gè)程序進(jìn)行小修改,查看運(yùn)行結(jié)果,思考為什么會(huì)是這樣的運(yùn)行結(jié)果,按照課堂上的分析,能否解釋得通?按照學(xué)生下次課堂教學(xué)的反饋,引導(dǎo)有興趣的學(xué)生閱讀相關(guān)的編譯器源碼,對(duì)編程語(yǔ)言的實(shí)現(xiàn)進(jìn)行粗略地介紹,減少編程語(yǔ)言在學(xué)生眼里的神秘感。

實(shí)踐表明,語(yǔ)言的類(lèi)似特性在不同語(yǔ)言中的對(duì)比教學(xué)是很有效果的。學(xué)生會(huì)給出一些類(lèi)似“原來(lái)如此”的反饋,可見(jiàn),這種教學(xué)手段能夠澄清學(xué)生看來(lái)似是而非或者覺(jué)得百思不得其解的運(yùn)行結(jié)果,也極大提高了學(xué)生對(duì)編程語(yǔ)言的學(xué)習(xí)興趣,并能引導(dǎo)學(xué)生對(duì)后續(xù)課程,如編譯原理等課程有基本認(rèn)識(shí)。

3 培養(yǎng)抽象表達(dá)問(wèn)題的能力

編程語(yǔ)言類(lèi)課程的教學(xué)不僅要教會(huì)學(xué)生使用一到兩門(mén)編程語(yǔ)言,更要在講授知識(shí)的同時(shí),讓學(xué)生具有良好的抽象描述和表達(dá)問(wèn)題的能力。

從功用來(lái)看,程序是用來(lái)解決問(wèn)題的,為了解決問(wèn)題首先需要描述和表達(dá)問(wèn)題。它要求設(shè)計(jì)者站在計(jì)算機(jī)求解問(wèn)題的角度,將問(wèn)題抽象化。因此,在授課過(guò)程中教師如果過(guò)于關(guān)注語(yǔ)言本身的細(xì)節(jié),可能學(xué)生學(xué)到的只是語(yǔ)言結(jié)構(gòu),這對(duì)解決問(wèn)題是遠(yuǎn)遠(yuǎn)不夠的,因?yàn)閷?duì)程序設(shè)計(jì)沒(méi)有宏觀把握,不能寫(xiě)出好的軟件。從這個(gè)意義上講,編程語(yǔ)言類(lèi)的教學(xué)應(yīng)該在教學(xué)過(guò)程中,逐步引導(dǎo)學(xué)生建立一種實(shí)用的軟件工程思想,這是非常重要的。

為了培養(yǎng)抽象表達(dá)問(wèn)題的能力,教師在講授程序的主要語(yǔ)法點(diǎn)之后,可以適當(dāng)設(shè)計(jì)一些小案例作為問(wèn)題提出,學(xué)生從已學(xué)的知識(shí)點(diǎn)中,將問(wèn)題抽象化,然后開(kāi)始編碼實(shí)現(xiàn)、測(cè)試、調(diào)試并最終解決問(wèn)題。其結(jié)果是既提高了學(xué)生對(duì)語(yǔ)法點(diǎn)的掌握程度,又培養(yǎng)了學(xué)生抽象描述和表達(dá)問(wèn)題、解決問(wèn)題的能力。

最后要強(qiáng)調(diào)的是,為了培養(yǎng)學(xué)生抽象表達(dá)問(wèn)題的能力,掌握一門(mén)語(yǔ)言并具有扎實(shí)的編程技能是非常必要的。任何一門(mén)語(yǔ)言的熟練掌握和精通都需要花費(fèi)努力和時(shí)間,不是短期可以實(shí)現(xiàn)的,因此在授課過(guò)程中我們一直強(qiáng)調(diào)并鼓勵(lì)踏實(shí)的學(xué)習(xí)作風(fēng),盡可能激發(fā)學(xué)生的學(xué)習(xí)興趣,使得他們?cè)谡n程結(jié)束之后還愿意在編程語(yǔ)言應(yīng)用能力的學(xué)習(xí)提高上投入精力。

4 結(jié) 語(yǔ)

具備一定的編程技能和具有抽象描述問(wèn)題的能力是編程語(yǔ)言類(lèi)課程需要達(dá)到的教學(xué)目標(biāo),本文基于計(jì)算機(jī)專(zhuān)業(yè)編程語(yǔ)言類(lèi)課程的教學(xué)實(shí)踐,對(duì)教學(xué)方法和思路提出思考。未來(lái)將繼續(xù)結(jié)合教學(xué)實(shí)踐,提高編程語(yǔ)言類(lèi)課程的教學(xué)質(zhì)量,并努力縮小與國(guó)外計(jì)算機(jī)編程類(lèi)課程教學(xué)的差距。

參考文獻(xiàn):

[1] 曹西征, 孫志勇. VC++教學(xué)中實(shí)例驅(qū)動(dòng)法和模糊評(píng)價(jià)研究[J]. 計(jì)算機(jī)教育, 2015(21): 82-84.

[2] Shewchun J . Data structures and Java programming [EB/OL]. [2015-11-30]. http://www.cs.berkeley.edu/~jrs/61b/.

[3] Sierra K , Bates B. Head fi rst Java[M]. 2 ed . Sebastopol: O'Reilly Media Inc, 2005.

[4] Sahami M. Programming methodology [EB/OL]. [2015-11-30]. http://web.stanford.edu/class/cs106a/.

(見(jiàn)習(xí)編輯:趙盼;編輯:宋文婷)

第一作者簡(jiǎn)介:江南,女,講師,研究方向?yàn)榫幊陶Z(yǔ)言、可信編譯,nanjiang@whu.edu.cn。

基金項(xiàng)目:湖北工業(yè)大學(xué)教研項(xiàng)目“ RESTFUL Web服務(wù)環(huán)境下自主學(xué)習(xí)云系統(tǒng)的研究與實(shí)現(xiàn)”(2012015)。

中圖分類(lèi)號(hào):G642

文章編號(hào):1672-5913(2016)04-0156-04

猜你喜歡
編程語(yǔ)言
基于JavaScript編程語(yǔ)言之 閉包技術(shù)在焦點(diǎn)輪播上的應(yīng)用
壓力-體積轉(zhuǎn)換在CFC編程語(yǔ)言中的實(shí)現(xiàn)解析
計(jì)算機(jī)應(yīng)用軟件開(kāi)發(fā)中編程語(yǔ)言的選擇研究
計(jì)算機(jī)軟件開(kāi)發(fā)的JAVA編程語(yǔ)言及其實(shí)際應(yīng)用分析
Java編程語(yǔ)言的特點(diǎn)與應(yīng)用
軟件開(kāi)發(fā)中JAVA編程的應(yīng)用探究
Java編程的現(xiàn)狀與發(fā)展前景
計(jì)算機(jī)應(yīng)用軟件開(kāi)發(fā)中編程語(yǔ)言的選取
常用計(jì)算機(jī)編程語(yǔ)言的分析及選用技巧
淺談不同編程語(yǔ)言對(duì)計(jì)算機(jī)軟件開(kāi)發(fā)的影響
電子制作(2018年1期)2018-04-04 01:48:36
湘西| 东丽区| 南靖县| 山东省| 宜兴市| 勐海县| 青田县| 永平县| 滨海县| 广丰县| 越西县| 永修县| 武穴市| 巫山县| 秦安县| 合肥市| 浦江县| 同江市| 通化县| 卢龙县| 城步| 广汉市| 安陆市| 洮南市| 苏尼特左旗| 石景山区| 依安县| 晴隆县| 富裕县| 留坝县| 南陵县| 龙州县| 紫云| 平湖市| 隆昌县| 星座| 南宫市| 二手房| 澜沧| 宕昌县| 昭平县|