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

?

淺談 《C語(yǔ)言程序設(shè)計(jì)》課程教學(xué)中學(xué)生編程能力的培養(yǎng)問(wèn)題*

2013-09-13 04:08趙仁慶鄧燕林
關(guān)鍵詞:C語(yǔ)言程序設(shè)計(jì)素?cái)?shù)C語(yǔ)言

劉 鵬,趙仁慶,鄧燕林

(楚雄師范學(xué)院數(shù)學(xué)系,云南 楚雄 675000)

C語(yǔ)言是一種國(guó)際上廣泛流行的計(jì)算機(jī)高級(jí)語(yǔ)言,具有用途廣泛、功能強(qiáng)大、使用靈活的特點(diǎn)?!禖語(yǔ)言程序設(shè)計(jì)》是高等學(xué)校的一門基本的計(jì)算機(jī)課程,在計(jì)算機(jī)教育和計(jì)算機(jī)應(yīng)用中發(fā)揮著重要的作用。通過(guò)學(xué)習(xí)程序設(shè)計(jì),學(xué)生進(jìn)一步了解計(jì)算機(jī)的工作原理,更好地理解和應(yīng)用計(jì)算機(jī);掌握用計(jì)算機(jī)處理問(wèn)題的方法,能培養(yǎng)分析問(wèn)題和解決問(wèn)題的能力,具備編制程序的初步能力[1]。

C語(yǔ)言是大學(xué)階段第一門程序設(shè)計(jì)的課程,有了C語(yǔ)言的基礎(chǔ),在以后學(xué)習(xí)高級(jí)語(yǔ)言編程就會(huì)很容易。在該課程的教學(xué)中,如何來(lái)培養(yǎng)學(xué)生的編程能力呢?

1.牢記程序設(shè)計(jì)的思想

結(jié)構(gòu)化程序設(shè)計(jì)的思想是自頂向下,逐步細(xì)化,模塊化設(shè)計(jì),結(jié)構(gòu)化編碼。核心的理念就是層次。良好的代碼要有層次感,先做好“頂層設(shè)計(jì)”,然后一步一步細(xì)化,這樣做可使編碼工作有條不紊地進(jìn)行。

在教材第291頁(yè)有這樣的題目[1]:有n個(gè)人圍成一圈,順序排號(hào)。從第1個(gè)人開(kāi)始報(bào)數(shù) (從1到3報(bào)數(shù)),凡報(bào)到3的人退出圈子,問(wèn)最后留下的是原來(lái)第幾號(hào)的那位。文獻(xiàn)[2]在第104頁(yè)給出如下的參考解答[2]:

這段代碼從頭到尾只有一個(gè)main()函數(shù),根本就不符合結(jié)構(gòu)化程序設(shè)計(jì)的思想要求。

把所有的代碼都堆在main()函數(shù)中,就如同在一個(gè)硬盤中存放了很多文件,卻沒(méi)有使用任何文件夾來(lái)進(jìn)行管理一樣;也如同買了一套房子,并沒(méi)有用墻把房子分隔成臥室、客廳、廚房、餐廳、衛(wèi)生間,而是將一切生活用品都堆放在房子的地上,吃喝拉撒都在一個(gè)大房間里進(jìn)行。

一個(gè)源程序由若干個(gè)函數(shù)組成,猶如用墻把房子分隔成一個(gè)個(gè)房間一樣。模塊化設(shè)計(jì)就是把一個(gè)大任務(wù)分為若干個(gè)相對(duì)簡(jiǎn)單的子任務(wù),每個(gè)子任務(wù)用函數(shù)來(lái)實(shí)現(xiàn)。

解決一個(gè)問(wèn)題首先要從大處著手,做好“頂層設(shè)計(jì)”。站在高處來(lái)看,解決這個(gè)問(wèn)題需要四個(gè)步驟[3]:輸入人數(shù);數(shù)組初始化;“從1到3報(bào)數(shù)”n-1次;輸出最后剩下的那個(gè)人的編號(hào)。而每一步都可以簡(jiǎn)單地用函數(shù)或基本的控制語(yǔ)句來(lái)實(shí)現(xiàn)。在向下一層展開(kāi)之前應(yīng)檢查本層設(shè)計(jì)是否正確,只有上一層設(shè)計(jì)是正確的才能向下細(xì)化。良好的程序設(shè)計(jì)應(yīng)該是把復(fù)雜的問(wèn)題分解為簡(jiǎn)單的問(wèn)題,然后各個(gè)擊破,一件一件有條不紊地完成。

“自頂向下,逐步求精”的層次理念是每個(gè)編程人員時(shí)刻都要堅(jiān)持的,就像做人要守好自己的“底線”一樣,不能輕易發(fā)生動(dòng)搖。

2.歸納總結(jié)編程的標(biāo)準(zhǔn)模板

在教學(xué)的過(guò)程中,可以總結(jié)出一個(gè)編程的標(biāo)準(zhǔn)模板。利用這個(gè)模板,可幫助學(xué)生快速搭建程序框架,讓學(xué)生能集中精力于數(shù)據(jù)的處理、問(wèn)題的解決方面。這個(gè)模板為:

下面就以求兩個(gè)正整數(shù)的最大值為例進(jìn)行說(shuō)明:

第一:預(yù)處理命令#include<stdio.h>必不可少,另外可能用到的有#include<math.h>、#include<string.h>。若程序中有一些常數(shù),建議用預(yù)處理命令將其定義為符號(hào)常量:#define N 10,另外要注意預(yù)處理命令后面沒(méi)有標(biāo)點(diǎn)符號(hào)。

第二:函數(shù)聲明由函數(shù)定義中的首行,再加一個(gè)分號(hào)“;”形成,此時(shí)形參名可省略不寫。形參名是什么都無(wú)所謂,特別注意函數(shù)聲明是以分號(hào)“;”結(jié)束的。

第三:根據(jù)問(wèn)題的需要,定義有關(guān)的變量,在使用的過(guò)程中一定要注意與定義時(shí)的變量類型要保持一致。全局變量一般是在不同的地方進(jìn)行傳遞數(shù)值的。

第四:數(shù)據(jù)的輸入主要有以下幾種方式:①賦值:在定義時(shí)進(jìn)行賦值即為初始化,如數(shù)組的初始化;②鍵盤輸入:特別注意做好數(shù)據(jù)輸入 (出)時(shí)的提示設(shè)計(jì),如:

③加入數(shù)據(jù)的合法性檢查:數(shù)據(jù)的合法性檢查是數(shù)據(jù)輸入時(shí)要做的事,當(dāng)用戶輸入不合法的數(shù)據(jù),程序提示用戶重新輸入,如:

第五:數(shù)據(jù)處理是程序設(shè)計(jì)編寫的核心,一般使用函數(shù)來(lái)完成,這樣一來(lái)使設(shè)計(jì)者的精力放在后面的函數(shù)定義上即可:c=max(a,b);。

第六:數(shù)據(jù)的輸出主要用函數(shù)printf()實(shí)現(xiàn):

字符數(shù)據(jù)的輸入輸出函數(shù)有:putchar,getchar,puts,gets。

第七:函數(shù)定義就是程序設(shè)計(jì)者要花時(shí)間精力去做的事情,如:

3.掌握一些基本的算法和常見(jiàn)問(wèn)題的求解方法

有了模板后,要寫好程序就需要寫好函數(shù),而要寫好函數(shù)就必須熟悉一些基本的算法和常見(jiàn)問(wèn)題的求解方法。

第一個(gè)問(wèn)題:用輾轉(zhuǎn)相除法,求解整數(shù)x和y的最大公約數(shù)的算法如下[4]:

步驟1:變量r是x除以y的余數(shù);

步驟2:變量r不是0的時(shí)候,反復(fù)執(zhí)行步驟3~5;

步驟3:變量x代入變量y的值;

步驟4:變量y代入變量r的值;

步驟5:變量r是x除以y的余數(shù);

步驟6:變量y的值即為最大公約數(shù);

使用基本語(yǔ)句:

一般來(lái)說(shuō),只要能得到問(wèn)題的解法,就很容易把它寫成函數(shù)的形式。該問(wèn)題從使用窮舉法、基本語(yǔ)句到使用函數(shù)、遞歸函數(shù)的過(guò)程,體現(xiàn)了編程中精益求精的思想,極能體現(xiàn)編程思維的抽象性和深刻性。

第二個(gè)問(wèn)題:判斷鍵盤輸入的整數(shù) (用n來(lái)表示)是否是素?cái)?shù):

根據(jù)數(shù)學(xué)上的結(jié)論,循環(huán)只需到n的算術(shù)平方根就可以了。但此時(shí)不能簡(jiǎn)單地用sqrt(n)來(lái)求n的平方根或整數(shù)部分,由1=12,1+3=22,1+3+5=32,…,1+3+…+(2k-1)=k2,可求出n的整數(shù)部分。整個(gè)程序如下[3]:

素?cái)?shù)問(wèn)題本身就是初等數(shù)論中的重要問(wèn)題,解決該問(wèn)題的程序效率與所掌握的有關(guān)數(shù)學(xué)理論知識(shí)密切相關(guān),這里給出的求n的整數(shù)部分的方法值得程序設(shè)計(jì)者深思。

第三個(gè)問(wèn)題:級(jí)數(shù)求和中典型的例子是[1]:用π/4≈1-1/3+1/5-1/7+…公式求π的近似值,直到某一項(xiàng)的絕對(duì)值小于106為止 (該項(xiàng)不累加)[1]。

該問(wèn)題之所以重要是因?yàn)樯婕暗窖h(huán)累加求和基本方法、交錯(cuò)數(shù)列符號(hào)處理技巧,真正掌握該編程思想就能處理許多求和的問(wèn)題。

這類問(wèn)題還很多,需要在學(xué)習(xí)過(guò)程中不斷地歸納總結(jié)。通過(guò)對(duì)這些問(wèn)題的解決,可訓(xùn)練學(xué)生的編程思維,進(jìn)一步提高學(xué)生的編程能力。

4.樹(shù)立正確的觀念

現(xiàn)在介紹IT行業(yè)優(yōu)秀工程師的經(jīng)驗(yàn)方面的書籍很多,里面有許多值得在教學(xué)中推廣的做法。當(dāng)然,在以往教學(xué)中也存在許多錯(cuò)誤的觀念,會(huì)嚴(yán)重影響教學(xué)的質(zhì)量。

一些正確的觀念,在教學(xué)之初就要強(qiáng)調(diào):①浮點(diǎn)數(shù)是實(shí)數(shù)在計(jì)算機(jī)上的近似表示,只能表示一部分實(shí)數(shù);②程序設(shè)計(jì)中,遇到常數(shù)一般定義為符號(hào)常數(shù),避免魔法數(shù)問(wèn)題 (程序中的常數(shù)與問(wèn)題沒(méi)有直接關(guān)系);③寫循環(huán)時(shí)一定要檢查邊界條件,避免造成失之毫厘,差之千里的錯(cuò)誤;④指針是某個(gè)對(duì)象存儲(chǔ)時(shí)占用若干連續(xù)存儲(chǔ)單元中首個(gè)存儲(chǔ)單元的地址。這方面的問(wèn)題建議大家好好讀讀參考文獻(xiàn)[3]、[4]~[8]。

許多初學(xué)者都會(huì)有這樣的想法:只要編寫出程序,運(yùn)行結(jié)果也沒(méi)有問(wèn)題就萬(wàn)事大吉了。實(shí)際上這是一個(gè)很嚴(yán)重的錯(cuò)誤觀念!比如求100~200間的全部素?cái)?shù)的程序如下[1]:

該程序編譯、連接都沒(méi)問(wèn)題,執(zhí)行結(jié)果如下

從數(shù)學(xué)的角度上來(lái)說(shuō)結(jié)果也沒(méi)有錯(cuò)誤。但該程序隱藏著一個(gè)很難發(fā)現(xiàn)的錯(cuò)誤[3]:語(yǔ)句if(m%10==0)printf(" ");的正確位置是在m=m+1;之后 (應(yīng)與前面的花括號(hào)互換位置)!程序中if(m%10==0)printf(" ");語(yǔ)句的意思是前面輸出了10,20,30,……個(gè)素?cái)?shù)時(shí)就換行,即只要前面輸出的素?cái)?shù)個(gè)數(shù)是10的倍數(shù)就換行。該問(wèn)題中第10個(gè)素?cái)?shù)與第11個(gè)素?cái)?shù)以及第20個(gè)素?cái)?shù)與第21個(gè)素?cái)?shù)恰好相鄰,掩蓋了這個(gè)錯(cuò)誤。將語(yǔ)句中的10改為其他正整數(shù)如3、4等,錯(cuò)誤馬上就凸顯出來(lái)。

實(shí)際上這里使用該語(yǔ)句是想每行輸出10個(gè)素?cái)?shù),只有語(yǔ)句if(m%10==0)printf(" ");緊隨語(yǔ)句m=m+1;之后,才能真正實(shí)現(xiàn)這一目的。

5.注重實(shí)踐操作

教師平時(shí)都會(huì)告誡學(xué)生:看懂學(xué)會(huì)書上的理論知識(shí),學(xué)習(xí)只成功了30%;動(dòng)手編程,親自上機(jī)調(diào)試運(yùn)行,可達(dá)60%;善于利用所得到的知識(shí)解決實(shí)際問(wèn)題,才能達(dá)到90%以上。學(xué)習(xí)C語(yǔ)言程序設(shè)計(jì),必須重視實(shí)踐環(huán)節(jié),既會(huì)編寫程序,又會(huì)上機(jī)實(shí)踐,另外還要舉一反三。

6.注意在后續(xù)學(xué)習(xí)中培養(yǎng)學(xué)生的編程能力

《C語(yǔ)言程序設(shè)計(jì)》課程只是程序設(shè)計(jì)學(xué)習(xí)過(guò)程中的起點(diǎn),在今后的學(xué)習(xí)過(guò)程中,還需要進(jìn)一步學(xué)習(xí)其他高級(jí)程序語(yǔ)言,遇到許多實(shí)際問(wèn)題時(shí)要有編程解決的意識(shí)。只有養(yǎng)成用程序設(shè)計(jì)來(lái)解決實(shí)際問(wèn)題的良好習(xí)慣,才能使程序設(shè)計(jì)的學(xué)習(xí)得到深化,程序設(shè)計(jì)能力才可能會(huì)得到提高。

如學(xué)生在后續(xù)課程《信息論與編碼》中需要計(jì)算信息熵:

其中p1,p2,…,pn為概率分布:p1+p2+…+pn=1,pi〉0。

C語(yǔ)言數(shù)學(xué)庫(kù)中沒(méi)有l(wèi)og2(x)函數(shù),可用換底公式來(lái)計(jì)算:log2(x)=log(x)/log(2)。函數(shù)的參數(shù)個(gè)數(shù)是變化的,C語(yǔ)言中沒(méi)有專門的函數(shù),參考程序?yàn)?

《C語(yǔ)言程序設(shè)計(jì)》課程教學(xué)中學(xué)生編程能力的培養(yǎng)問(wèn)題是一個(gè)系統(tǒng)工程,只有堅(jiān)持不懈地努力,才能收到良好的效果。

[1]譚浩強(qiáng).C程序設(shè)計(jì) (第四版)[M].北京:清華大學(xué)出版社,2010:9,131-132,137-138,291.

[2]譚浩強(qiáng).C程序設(shè)計(jì) (第四版)學(xué)習(xí)輔導(dǎo)[M].北京:清華大學(xué)出版社,2010:104.

[3]薛非.拋棄C程序設(shè)計(jì)中的謬誤與惡習(xí)[M].北京:清華大學(xué)出版社,2012:86-87,255.

[4]李克秋譯.算法解讀[M].北京:科學(xué)出版社,2012:100.

[5]尹哲,鄭秀雯譯.編寫可讀代碼的藝術(shù)[M].北京:機(jī)械工業(yè)出版社,2012.

[6]陳正沖.C語(yǔ)言深度解剖——解開(kāi)程序員面試筆試的秘密[M].北京:航空航天大學(xué)出版社,2010.

[7]崔康譯.程序員的思維修煉開(kāi)發(fā)認(rèn)知潛能的九堂課[M].北京:人民郵電出版社,2011.

[8]何海濤.劍指Offer名企面試官精講典型編程題[M].北京:電子工業(yè)出版社,2012.

猜你喜歡
C語(yǔ)言程序設(shè)計(jì)素?cái)?shù)C語(yǔ)言
兩個(gè)素?cái)?shù)平方、四個(gè)素?cái)?shù)立方和2的整數(shù)冪
有關(guān)殆素?cái)?shù)的二元丟番圖不等式
基于Visual Studio Code的C語(yǔ)言程序設(shè)計(jì)實(shí)踐教學(xué)探索
關(guān)于兩個(gè)素?cái)?shù)和一個(gè)素?cái)?shù)κ次冪的丟番圖不等式
關(guān)于素?cái)?shù)簡(jiǎn)化剩余系構(gòu)造的幾個(gè)問(wèn)題
基于C語(yǔ)言的計(jì)算機(jī)軟件編程
高職高專院校C語(yǔ)言程序設(shè)計(jì)教學(xué)改革探索
以“學(xué)生為中心”的《C語(yǔ)言程序設(shè)計(jì)》教學(xué)設(shè)計(jì)探究
基于翻轉(zhuǎn)課堂的《C語(yǔ)言程序設(shè)計(jì)》課程教學(xué)系統(tǒng)的實(shí)現(xiàn)與研究
淺談《C語(yǔ)言程序設(shè)計(jì)》課程的教學(xué)改革