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