摘 要: C語言由于其簡潔緊湊、靈活方便、運算符豐富等優(yōu)點,現(xiàn)已經(jīng)成為計算機、電子信息、自動化等眾多工科專業(yè)學(xué)生的專業(yè)必修基礎(chǔ)課。此外,C語言是一門結(jié)構(gòu)化程序設(shè)計語言,有利于學(xué)生掌握程序設(shè)計的思想。因此,C語言已成為目前高校學(xué)生掌握程序設(shè)計的一門基礎(chǔ)性語言。本文以C語言程序設(shè)計為主線,由淺入深地介紹了如何從學(xué)習(xí)C語言到學(xué)好C語言。
關(guān)鍵詞: C程序設(shè)計 運算符 預(yù)算順序 算法 結(jié)構(gòu)
一、引言
現(xiàn)在許多院校的計算機專業(yè)開設(shè)了C語言課程,將其作為學(xué)生學(xué)習(xí)程序設(shè)計技術(shù)的入門課程,這與C語言的特點是分不開的。C語言不但可以編寫系統(tǒng)軟件,而且可以根據(jù)用戶的需要編寫出滿足用戶要求的應(yīng)用軟件,尤其是C語言具有很好的對計算機的硬件編程能力。同時,C語言具有邏輯性強、處理問題周密、嚴謹?shù)奶攸c,是集知識和技能于一體,實踐性很強的課程。學(xué)生通過學(xué)習(xí)C語言可掌握程序設(shè)計的一些基本方法和技巧。然而C語言的數(shù)據(jù)類型較多、表達式豐富、語法結(jié)構(gòu)較復(fù)雜,是一門教師難教、學(xué)生難學(xué)的課程。
《C程序設(shè)計》的內(nèi)容很豐富,按照我們現(xiàn)在的教學(xué)大綱,教學(xué)的主要內(nèi)容是基礎(chǔ)知識、四種結(jié)構(gòu)的程序設(shè)計、函數(shù)與數(shù)組的應(yīng)用和一些簡單的算法。在學(xué)習(xí)時,同學(xué)們應(yīng)該把主要精力放在這些部分,多進行練習(xí)和上機調(diào)試。當然,在初學(xué)C語言時,可能會遇到有些問題理解不透,或者表達方式與以往數(shù)學(xué)學(xué)習(xí)中不同(如運算符等),這就要求不要氣餒,不明白的地方多問多想,鼓足勇氣進行學(xué)習(xí),待學(xué)完后面的章節(jié)知識,前面的問題也就迎刃而解了。學(xué)習(xí)C語言始終要記住“曙光在前頭”和“千金難買回頭看”。學(xué)習(xí)后面的知識,不要忘了回頭弄清遺留下的問題和加深理解前面的知識。這是我們學(xué)生最不易做到的,然而卻又是最重要的。學(xué)習(xí)C語言就是要經(jīng)過幾個反復(fù),才能前后貫穿,積累應(yīng)該掌握的C語言知識。那么,我們到底該如何學(xué)好《C程序設(shè)計》呢?
二、奠定基礎(chǔ)——了解、學(xué)好運算符和運算順序
C語言的運算非常靈活,功能十分豐富,運算種類遠多于其他程序設(shè)計語言。在表達式方面較其它程序語言更為簡潔,如自加、自減、逗號運算和三目運算使表達式更為簡單。但初學(xué)者往往會覺得這種表達式難讀,關(guān)鍵原因就是對運算符和運算順序理解不透不全。當多種不同運算組成一個運算表達式,即一個運算式中出現(xiàn)多種運算符時,運算的優(yōu)先順序和結(jié)合規(guī)則顯得十分重要。在學(xué)習(xí)中,只要我們對此合理進行分類,找出它們與我們在數(shù)學(xué)中所學(xué)到運算之間的不同點之后,記住這些運算也就不困難了,有些運算符在理解后更會牢記心中,將來用起來會得心應(yīng)手,而有些可暫時放棄不理,等用到時再記不遲。對于運算符的優(yōu)先級也是必須明確的?!禖程序設(shè)計》運算符可分為15種優(yōu)先級,從高到低,優(yōu)先級為1—15,且除第2、3級和第14級為從右至左結(jié)合外,其他都是從左至右結(jié)合,它決定著同級運算符的運算順序。這里就給大家介紹一個優(yōu)先級口訣:
括號成員第一
全體單目第二
乘除余三、加減四
移位五、關(guān)系六
等于(與)不等排第七
位與異位和位或
“三分天下”八九十
邏輯或跟與
十二和十一
條件高于賦值
逗號運算級最低。[1]
下面我們來舉個例子:
a=3;b=5;c=++a*b;d=a++*b;
對于c=++a*b來說,按表中所列順序,++先執(zhí)行,*后執(zhí)行,所以++a執(zhí)行后,a的值為4,由于++為前置運算,所以a的值4參與運算,C的值計算式為4*5=20而不是3*5=15了。而對于d=a++*b來說,由于a++為后置運算,所以a值為4參與運算,使得d的值仍為20,而a參與運算后其值加1,值為5。這個例子執(zhí)行后,a的值為5,b的值為5,c的值為20,d的值也是20。
三、砌磚壘墻——了解、學(xué)好四種程序結(jié)構(gòu)
?。?)順序結(jié)構(gòu)
順序結(jié)構(gòu)的程序設(shè)計是最簡單的,只要按照解決問題的順序?qū)懗鱿鄳?yīng)的語句就行,它的執(zhí)行順序是自上而下,依次執(zhí)行。例如:a=3,b=5,現(xiàn)交換a,b的值。這個問題就好像交換兩個杯子的水,這當然要用到第三個杯子,假如第三個杯子是c,那么正確的程序為:c=a;a=b;b=c;執(zhí)行結(jié)果是a=5,b=c=3。
?。?)分支結(jié)構(gòu)
順序結(jié)構(gòu)的程序雖然能解決計算、輸出等問題,但不能做判斷再選擇。對于要先做判斷再選擇的問題就要使用分支結(jié)構(gòu)。分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴格按照語句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當?shù)姆种дZ句。分支結(jié)構(gòu)適合于帶有邏輯或關(guān)系比較等條件判斷的計算,設(shè)計這類程序時往往都要先繪制其程序流程圖,然后根據(jù)程序流程寫出源程序,這樣做把程序設(shè)計分析與語言分開,使得問題簡單化,易于理解。程序流程圖是根據(jù)解題分析所繪制的程序執(zhí)行流程圖。學(xué)習(xí)分支結(jié)構(gòu)不要被分支嵌套所迷惑,只要正確繪制出流程圖,弄清各分支所要執(zhí)行的功能,嵌套結(jié)構(gòu)也就不難了。嵌套只不過是分支中又包括分支語句而已,不是新知識,只要對雙分支的理解清楚,分支嵌套是不難的。那么就先來簡單介紹一下二分支選擇結(jié)構(gòu)。C語言的if語句有兩種基本形式,即獨立的if結(jié)構(gòu)和if-else結(jié)構(gòu)。[2]其語法形式如下:
1)獨立的if結(jié)構(gòu)
if(表達式)
語句
2)if-else結(jié)構(gòu)
if(表達式)
語句1
else
語句2
再來看一下分支嵌套的語法形式
if(表達式1)
if(表達式2)語句1
else語句2
else語句3
?。?)循環(huán)結(jié)構(gòu)
循環(huán)結(jié)構(gòu)可以減少源程序重復(fù)書寫的工作量,用來描述重復(fù)執(zhí)行某段算法的問題,這是程序設(shè)計中最能發(fā)揮計算機特長的程序結(jié)構(gòu)。C語言中提供四種循環(huán),即goto循環(huán)、while循環(huán)、do-while循環(huán)和for循環(huán)。[3]四種循環(huán)可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提倡用goto循環(huán),因為強制改變程序的順序經(jīng)常會給程序的運行帶來不可預(yù)料的錯誤,在學(xué)習(xí)中我們主要學(xué)習(xí)while、do...while、for三種循環(huán)。常用的三種循環(huán)結(jié)構(gòu)學(xué)習(xí)的重點在于弄清它們相同與不同之處,以便在不同場合下使用,這就要清楚三種循環(huán)的格式和執(zhí)行順序,將每種循環(huán)的流程圖理解透徹后就會明白如何替換使用,如把while循環(huán)的例題,用for語句重新編寫一個程序,這樣能更好地理解它們的作用。特別要注意在循環(huán)體內(nèi)應(yīng)包含趨于結(jié)束的語句(即循環(huán)變量值的改變),否則就可能成了一個死循環(huán),這是初學(xué)者的一個常見錯誤。對于它們的異同點,我們也應(yīng)該了解,明確:用while和do...while循環(huán)時,循環(huán)變量的初始化的操作應(yīng)在循環(huán)體之前,而for循環(huán)一般在語句1中進行的;while循環(huán)和for循環(huán)都是先判斷表達式,后執(zhí)行循環(huán)體,而do...while循環(huán)是先執(zhí)行循環(huán)體后判斷表達式,也就是說do...while的循環(huán)體最少被執(zhí)行一次,而while循環(huán)和for就可能一次都不執(zhí)行。另外還要注意的是這三種循環(huán)都可以用break語句跳出循環(huán),用continue語句結(jié)束本次循環(huán),而goto語句與if構(gòu)成的循環(huán),是不能用break和continue語句進行控制的。[4]在這里介紹一下三種常見循環(huán)的一般格式:
1)while循環(huán):
while(表達式)
循環(huán)體
2)do-while循環(huán):
do
循環(huán)體
while(表達式)
3)for循環(huán):
for(表達式1;表達式2;表達式3)
循環(huán)體語句(組)
?。?)模塊化程序結(jié)構(gòu)
C語言的模塊化程序結(jié)構(gòu)用函數(shù)來實現(xiàn),即將復(fù)雜的C程序分為若干模塊,每個模塊都編寫成一個C函數(shù),然后通過主函數(shù)調(diào)用函數(shù)及函數(shù)調(diào)用函數(shù)來實現(xiàn)一大型問題的C程序編寫。因此常說:C程序=主函數(shù)+子函數(shù)。因此,對函數(shù)的定義、調(diào)用、值的返回等中要尤其注重理解和應(yīng)用,并通過上機調(diào)試加以鞏固。[5]
其實,順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)并不是彼此孤立的,在循環(huán)中可以有分支、順序結(jié)構(gòu),分支中也可以有循環(huán)、順序結(jié)構(gòu),但是不管哪種結(jié)構(gòu),我們均可廣義地把它們看成一個語句。在實際編程過程中常將這三種結(jié)構(gòu)相互結(jié)合以實現(xiàn)各種算法,設(shè)計出相應(yīng)程序,但是要編程的問題較大,編寫出的程序就往往很長、結(jié)構(gòu)重復(fù)多,造成可讀性差,難以理解,解決這個問題的方法是將C程序設(shè)計成模塊化結(jié)構(gòu)。[6]
四、修飾——掌握一些簡單的算法
所謂算法,就是解決某類問題的方法。確切地說,就是對某一類特定的問題,給出解決該問題的一系列(有窮的)操作,而每一操作都有其確切的意義,并在有限時間內(nèi)可以計算出結(jié)果。一個算法有多少個輸入量,它是問題給出的初始數(shù)據(jù),經(jīng)過算法的實現(xiàn),它有一個或多個輸出量,這就是算法對輸入運算的結(jié)果,即問題的解答?!禖程序設(shè)計》教學(xué)大綱,只要求我們掌握一些簡單的算法,在掌握這些基本算法后,要完成對問題的分析就容易了。[7]如兩個數(shù)的交換、三個數(shù)的比較、選擇法排序和冒泡法排序,這就要求我們要清楚這些算法的內(nèi)在含義,其中選擇法排序和冒泡法排序稍難,但只要明白排序的具體過程,對代碼的理解就不難了。如要將兩個變量X、Y的值交換。
用自然語言描述如下:
步驟1,將X值存入中間變量Z中:X→Z。
步驟2,將Y值存入變量X中:Y→X。
步驟3,將中間變量Z值存入Y中:Z→Y。
用偽代碼可表示如下:
BEGIN
x→z
y→x
z→y
END
當然還可以用流程圖表示,這里就不列舉了。
五、結(jié)語
在大學(xué)里,許多學(xué)C語言的人,都有著不同的目的。有的人是認真對待每一門所學(xué)的課程,包括C語言,有的人是對程序設(shè)計有著濃厚的興趣,還有的人只是為了獲得學(xué)分而學(xué)習(xí)C語言。這樣,一部分人會覺得C語言容易學(xué),一部分人又會覺得C語言難學(xué),還有一部分人會覺得C語言容易學(xué),但是不會編寫程序。這樣就導(dǎo)致了學(xué)習(xí)C語言效果的差異。其實,學(xué)習(xí)C語言并不是進行一種職業(yè)培訓(xùn),而是一種綜合思維的訓(xùn)練。我們應(yīng)當正確認識什么是程序,并學(xué)會一種思考問題的方法,初步掌握用C語言來進行程序設(shè)計。
參考文獻:
?。?]田祥宏,榮政.C語言程序設(shè)計.西安電子科技大學(xué)出版社,2007.
?。?]李麗娟.C程序設(shè)計基礎(chǔ)教程.
[3]Stephen Prata著.云巔工作室譯.C Primer Plus.
?。?]Kenneth A.Reek著.徐波譯.C和指針POINTERS ON C.
?。?][Bryant02]Bryant、O’Hallaron.深入理解計算機系統(tǒng)(Computer Systems:A Programmer’s Perspective).
?。?][Deitel94]H.M.Deitel.C程序設(shè)計教程(C How to Program).