分享C語言學(xué)習(xí)的幾點(diǎn)建議

2014年06月23日 09:46 來源:互聯(lián)網(wǎng) 作者:秩名 我要評(píng)論(0)

標(biāo)簽:C語言(117708)程序員(29472)

  初學(xué)C語言的朋友應(yīng)該首先了解C語言關(guān)鍵的核心概念(結(jié)構(gòu)化、三個(gè)執(zhí)行流程、優(yōu)先級(jí)、指針、文件、共用體、函數(shù)、作用域、重載等 ),只有弄明白了這些才能在今后的學(xué)習(xí)中游刃有余的把握C語言的精髓。這幾個(gè)概念就像邏輯線一樣,把整個(gè)C語言的體系貫穿起來,給人一種“結(jié)構(gòu)化”的思想體系。下面我簡要談一下這幾個(gè)核心概念。

  1、從宏觀角度來看,結(jié)構(gòu)化是C語言的編程思想基礎(chǔ),就是說C語言每一個(gè)功能模塊就是一個(gè)結(jié)構(gòu),每一個(gè)結(jié)構(gòu)實(shí)現(xiàn)一個(gè)運(yùn)算或一個(gè)算法,這個(gè)結(jié)構(gòu)就用大括號(hào)表示“{ }”,大括號(hào)里面的就是算法。尤其注意的是大括號(hào)的“}”括在那里,就決定在哪里結(jié)束算法功能。這些是初學(xué)者經(jīng)常犯的錯(cuò)誤,往往會(huì)把算法功能的結(jié)束點(diǎn)弄錯(cuò)。

  2、 三個(gè)執(zhí)行流程就是順序流程、條件流程、循環(huán)流程。三個(gè)流程都是計(jì)算機(jī)通用的執(zhí)行流程,是必須了解的流程,每一個(gè)算法都基于這三個(gè)流程執(zhí)行順序。

  3、 優(yōu)先級(jí)是對多個(gè)函數(shù)并列時(shí)候優(yōu)先算法的特權(quán),沒有注意優(yōu)先級(jí)的順序就會(huì)把算法出錯(cuò),這些優(yōu)先級(jí)是必須記住的。

  4、 指針是C語言的重要特點(diǎn),是對運(yùn)算速度加快運(yùn)算的重要精髓。它是對數(shù)據(jù)地址的操作,而不是對數(shù)據(jù)的操作。

  5、文件和共用體是很簡單的概念,不用多說了。文件顧名思義和日常概念一樣,學(xué)過數(shù)據(jù)軟件的都對共用體了解不是太難。

  6、從微觀角度來看,函數(shù)是C語言的驅(qū)動(dòng)機(jī)制,所有的語句都由函數(shù)驅(qū)動(dòng)來實(shí)現(xiàn)的。記住函數(shù)命令和相關(guān)的配置參數(shù),就能好好的利用C的優(yōu)勢。注意的是,函數(shù)不能記錯(cuò),不然你將得出錯(cuò)的結(jié)果。如果能學(xué)會(huì)調(diào)試,那就會(huì)更深一層了解函數(shù)功能的作用。

  7、作用域就像使用期限一樣,說明從那里到那里所起的作用,在這之外的就不起作用了(過期的東西就不值錢一樣)。把握好作用域的使用方式,就能明確函數(shù)的關(guān)系,不會(huì)在巨大的函數(shù)名里面迷失方向。

  8、重載就是為了方便用戶,使用類似于調(diào)用的機(jī)制給用戶減少寫入時(shí)間的功能。就像查字典一樣,你不懂一個(gè)字,就要去查字典(相當(dāng)于調(diào)用別的工具來實(shí)現(xiàn)你要做的事),而查字典是你已經(jīng)學(xué)會(huì)的東西,就可以做這件事了。 學(xué)習(xí)C語言從大體上了解還不夠,要把各種原理在腦海里模擬一遍,實(shí)現(xiàn)把計(jì)算機(jī)C的功能在人腦里運(yùn)作,就能從宏觀上把握C的步驟。

  教了多年《C程序設(shè)計(jì)》課程,大多學(xué)生覺的這門課程難學(xué)。其實(shí),按照我們現(xiàn)在的教學(xué)大綱和教學(xué)要求,只要同學(xué)們掌握一些方法,克服心理上畏難、不輕言放棄,是完全可以學(xué)好的。

  《C程序設(shè)計(jì)》的內(nèi)容很豐富,按照我們現(xiàn)在的教學(xué)大綱,教學(xué)的主要內(nèi)容是基礎(chǔ)知識(shí)、四種結(jié)構(gòu)的的程序設(shè)計(jì)、函數(shù)與數(shù)組的應(yīng)用和一些簡單的算法。在學(xué)習(xí)時(shí),同學(xué)們應(yīng)該把主要精力放在這些部分,通過實(shí)踐(練習(xí)和上機(jī)調(diào)試等熟練掌握。

  當(dāng)然,在初學(xué)C語言時(shí),可能會(huì)遇到有些問題理解不透,或者表達(dá)方式與以往數(shù)學(xué)學(xué)習(xí)中不同(如運(yùn)算符等),這就要求不氣餒,不明白的地方多問多想,鼓足勇氣進(jìn)行學(xué)習(xí),待學(xué)完后面的章節(jié)知識(shí),前面的問題也就迎刃而解了,這一方面我感覺是我們同學(xué)最欠缺,大多學(xué)不好的就是因?yàn)橐婚_始遇到困難就放棄,曾經(jīng)和好多同學(xué)談他的問題,回答是聽不懂、不想聽、放棄這樣三個(gè)過程,我反問,這節(jié)課你聽過課嗎?回答又是沒有,根本就沒聽過課,怎么說自己聽不懂呢?相應(yīng)的根本就沒學(xué)習(xí),又談何學(xué)的好?

  學(xué)習(xí)C語言始終要記住“曙光在前頭”和“千金難買回頭看”,“千金難買回頭看”是學(xué)習(xí)知識(shí)的重要方法,就是說,學(xué)習(xí)后面的知識(shí),不要忘了回頭弄清遺留下的問題和加深理解前面的知識(shí),這是我們學(xué)生最不易做到的,然而卻又是最重要的。比如:在C語言中最典型的是關(guān)于結(jié)構(gòu)化程序設(shè)計(jì)構(gòu)思,不管是那種教材,一開始就強(qiáng)調(diào)這種方法,這時(shí)也許你不能充分體會(huì),但是學(xué)到函數(shù)時(shí),再回頭來仔細(xì)體會(huì),溫故知新,理解它就沒有那么難了。學(xué)習(xí)C語言就是要經(jīng)過幾個(gè)反復(fù),才能前后貫穿,積累應(yīng)該掌握的C知識(shí)。

  那么,我們?nèi)绾螌W(xué)好《C程序設(shè)計(jì)》呢?

  一.學(xué)好C語言的運(yùn)算符和運(yùn)算順序

  這是學(xué)好《C程序設(shè)計(jì)》的基礎(chǔ),C語言的運(yùn)算非常靈活,功能十分豐富,運(yùn)算種類遠(yuǎn)多于其它程序設(shè)計(jì)語言。在表達(dá)式方面較其它程序語言更為簡潔,如自加、自減、逗號(hào)運(yùn)算和三目運(yùn)算使表達(dá)式更為簡單,但初學(xué)者往往會(huì)覺的這種表達(dá)式難讀,關(guān)鍵原因就是對運(yùn)算符和運(yùn)算順序理解不透不全。當(dāng)多種不同運(yùn)算組成一個(gè)運(yùn)算表達(dá)式,即一個(gè)運(yùn)算式中出現(xiàn)多種運(yùn)算符時(shí),運(yùn)算的優(yōu)先順序和結(jié)合規(guī)則顯得十分重要。在學(xué)習(xí)中,只要我們對此合理進(jìn)行分類,找出它們與我們在數(shù)學(xué)中所學(xué)到運(yùn)算之間的不同點(diǎn)之后,記住這些運(yùn)算也就不困難了,有些運(yùn)算符在理解后更會(huì)牢記心中,將來用起來得心應(yīng)手,而有些可暫時(shí)放棄不記,等用到時(shí)再記不遲。

  先要明確運(yùn)算符按優(yōu)先級(jí)不同分類,《C程序設(shè)計(jì)》運(yùn)算符可分為15種優(yōu)先級(jí),從高到低,優(yōu)先級(jí)為1 ~ 15,除第2、3級(jí)和第14級(jí)為從右至左結(jié)合外,其它都是從左至右結(jié)合,它決定同級(jí)運(yùn)算符的運(yùn)算順序。下面我們通過幾個(gè)例子來說明:

 ?。?) 5*8/4%10 這個(gè)表達(dá)式中出現(xiàn)3種運(yùn)算符,是同級(jí)運(yùn)算符,運(yùn)算順序按從左至右結(jié)合,因此先計(jì)算5 *8=40,然后被4除,結(jié)果為10,最后是%(求余數(shù))運(yùn)算,所以表達(dá)式的最終結(jié)果為10%10 = 0;

 ?。?)a = 3;b = 5;c =++ a* b ;d =a + +* b;

  對于c=++a*b來說,按表中所列順序,+ +先執(zhí)行,*后執(zhí)行,所以+ + a執(zhí)行后,a的值為4,由于+ +為前置運(yùn)算,所以a的值4參與運(yùn)算,C的值計(jì)算式為4*5=20而不是3*5=15了;而對于d=a++*b來說,由于a + +為后置運(yùn)算,所以a值為4參與運(yùn)算,使得d的值仍為20,而a參與運(yùn)算后其值加1,值為5。 這個(gè)例子執(zhí)行后,a的值為5,b的值為5,c的值為20,d的值也是20;

 ?。?)(a = 3,b = 5,b+ = a,c = b* 5)

  例子中的“,”是逗號(hào)結(jié)合運(yùn)算,上式稱為逗號(hào)表達(dá)式,自左向右結(jié)合,最后一個(gè)表達(dá)式的結(jié)果值就是逗號(hào)表達(dá)式的結(jié)果,所以上面的逗號(hào)表達(dá)式結(jié)果為40,a的值為3,b的值為8,c的值為40。

 ?。?)a=5;b=6;c=a》b?a:b;

  例中的a》b?a:b是一個(gè)三目運(yùn)算,它的功能是先做關(guān)系運(yùn)算a》b部分,若結(jié)果為真,則取問號(hào)后a的值,否則取冒號(hào)后b的值,因此c的值應(yīng)該為6,這個(gè)運(yùn)算可以用來代替if…else…語句的簡單應(yīng)用。

  二.學(xué)好C語言的四種程序結(jié)構(gòu)

  (1)順序結(jié)構(gòu)

  順序結(jié)構(gòu)的程序設(shè)計(jì)是最簡單的,只要按照解決問題的順序?qū)懗鱿鄳?yīng)的語句就行,它的執(zhí)行順序是自上而下,依次執(zhí)行。

  例如;a = 3,b = 5,現(xiàn)交換a,b的值,這個(gè)問題就好象交換兩個(gè)杯子水,這當(dāng)然要用到第三個(gè)杯子,假如第三個(gè)杯子是c,那么正確的程序?yàn)椋?c = a; a = b; b = c; 執(zhí)行結(jié)果是a = 5,b = c = 3如果改變其順序,寫成:a = b; c = a; b = c; 則執(zhí)行結(jié)果就變成a = b = c = 5,不能達(dá)到預(yù)期的目的,初學(xué)者最容易犯這種錯(cuò)誤。 順序結(jié)構(gòu)可以獨(dú)立使用構(gòu)成一個(gè)簡單的完整程序,常見的輸入、計(jì)算,輸出三步曲的程序就是順序結(jié)構(gòu),例如計(jì)算圓的面積,其程序的語句順序就是輸入圓的半徑r,計(jì)算s = 3.14159*r*r,輸出圓的面積s。不過大多數(shù)情況下順序結(jié)構(gòu)都是作為程序的一部分,與其它結(jié)構(gòu)一起構(gòu)成一個(gè)復(fù)雜的程序,例如分支結(jié)構(gòu)中的復(fù)合語句、循環(huán)結(jié)構(gòu)中的循環(huán)體等。

 ?。?) 分支結(jié)構(gòu)

  順序結(jié)構(gòu)的程序雖然能解決計(jì)算、輸出等問題,但不能做判斷再選擇。對于要先做判斷再選擇的問題就要使用分支結(jié)構(gòu)。分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計(jì)方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ句。分支結(jié)構(gòu)適合于帶有邏輯或關(guān)系比較等條件判斷的計(jì)算,設(shè)計(jì)這類程序時(shí)往往都要先繪制其程序流程圖,然后根據(jù)程序流程寫出源程序,這樣做把程序設(shè)計(jì)分析與語言分開,使得問題簡單化,易于理解。程序流程圖是根據(jù)解題分析所繪制的程序執(zhí)行流程圖。

  學(xué)習(xí)分支結(jié)構(gòu)不要被分支嵌套所迷惑,只要正確繪制出流程圖,弄清各分支所要執(zhí)行的功能,嵌套結(jié)構(gòu)也就不難了。嵌套只不過是分支中又包括分支語句而已,不是新知識(shí),只要對雙分支的理解清楚,分支嵌套是不難的。下面我介紹幾種基本的分支結(jié)構(gòu)。

 ?、賗f(條件)

  {

  分支體

  }

  這種分支結(jié)構(gòu)中的分支體可以是一條語句,此時(shí)“{ }”可以省略,也可以是多條語句即復(fù)合語句。它有兩條分支路徑可選,一是當(dāng)條件為真,執(zhí)行分支體,否則跳過分支體,這時(shí)分支體就不會(huì)執(zhí)行。如:要計(jì)算x的絕對值,根據(jù)絕對值定義,我們知道,當(dāng)x》=0時(shí),其絕對值不變,而x《0時(shí)其絕對值是為x的反號(hào),因此程序段為:if(x =0時(shí),方程有兩個(gè)實(shí)根,否則(b^2-4ac =0)

  {x1=(-b+sqrt(d))/2a;

  x1=(-b-sqrt(d))/2a;

  printf(“x1=%8.4f,x2=%8.4f\n”,x1,x2);

  }

  else

  {r=-b/(2*a);

  i =sqrt(-d)/(2*a);

  printf(“x1=%8.4f+%8.4fi\n”r, i);

  printf(“x2=%8.4f-%8.4fi\n”r,i)

  }

  ③嵌套分支語句:其語句格式為:

  if(條件1) {分支1};

  else if(條件2) {分支2}

  else if(條件3) {分支3}

  ……

  else if(條件n) {分支n}

  else {分支n+1}

  嵌套分支語句雖可解決多個(gè)入口和出口的問題,但超過3重嵌套后,語句結(jié)構(gòu)變得非常復(fù)雜,對于程序的閱讀和理解都極為不便,建議嵌套在3重以內(nèi),超過3重可以用下面的語句。

 ?、躶witch開關(guān)語句:該語句也是多分支選擇語句,到底執(zhí)行哪一塊,取決于開關(guān)設(shè)置,也就是表達(dá)式的值與常量表達(dá)式相匹配的那一路,它不同if…else 語句,它的所有分支都是并列的,程序執(zhí)行時(shí),由第一分支開始查找,如果相匹配,執(zhí)行其后的塊,接著執(zhí)行第2分支,第3分支……的塊,直到遇到break語句;如果不匹配,查找下一個(gè)分支是否匹配。這個(gè)語句在應(yīng)用時(shí)要特別注意開關(guān)條件的合理設(shè)置以及break語句的合理應(yīng)用。

  (3)循環(huán)結(jié)構(gòu):

  循環(huán)結(jié)構(gòu)可以減少源程序重復(fù)書寫的工作量,用來描述重復(fù)執(zhí)行某段算法的問題,這是程序設(shè)計(jì)中最能發(fā)揮計(jì)算機(jī)特長的程序結(jié)構(gòu),C語言中提供四種循環(huán),即goto循環(huán)、while循環(huán)、do –while循環(huán)和for循環(huán)。四種循環(huán)可以用來處理同一問題,一般情況下它們可以互相代替換,但一般不提倡用goto循環(huán),因?yàn)閺?qiáng)制改變程序的順序經(jīng)常會(huì)給程序的運(yùn)行帶來不可預(yù)料的錯(cuò)誤,在學(xué)習(xí)中我們主要學(xué)習(xí)while、do…while、for三種循環(huán)。常用的三種循環(huán)結(jié)構(gòu)學(xué)習(xí)的重點(diǎn)在于弄清它們相同與不同之處,以便在不同場合下使用,這就要清楚三種循環(huán)的格式和執(zhí)行順序,將每種循環(huán)的流程圖理解透徹后就會(huì)明白如何替換使用,如把while循環(huán)的例題,用for語句重新編寫一個(gè)程序,這樣能更好地理解它們的作用。特別要注意在循環(huán)體內(nèi)應(yīng)包含趨于結(jié)束的語句(即循環(huán)變量值的改變),否則就可能成了一個(gè)死循環(huán),這是初學(xué)者的一個(gè)常見錯(cuò)誤。

  在學(xué)完這三個(gè)循環(huán)后,應(yīng)明確它們的異同點(diǎn):用while和do…while循環(huán)時(shí),循環(huán)變量的初始化的操作應(yīng)在循環(huán)體之前,而for循環(huán)一般在語句1中進(jìn)行的;while 循環(huán)和for循環(huán)都是先判斷表達(dá)式,后執(zhí)行循環(huán)體,而do…while循環(huán)是先執(zhí)行循環(huán)體后判斷表達(dá)式,也就是說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語句進(jìn)行控制的。

  順序結(jié)構(gòu)、分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)并不彼此孤立的,在循環(huán)中可以有分支、順序結(jié)構(gòu),分支中也可以有循環(huán)、順序結(jié)構(gòu),其實(shí)不管哪種結(jié)構(gòu),我們均可廣義的把它們看成一個(gè)語句。在實(shí)際編程過程中常將這三種結(jié)構(gòu)相互結(jié)合以實(shí)現(xiàn)各種算法,設(shè)計(jì)出相應(yīng)程序,但是要編程的問題較大,編寫出的程序就往往很長、結(jié)構(gòu)重復(fù)多,造成可讀性差,難以理解,解決這個(gè)問題的方法是將C程序設(shè)計(jì)成模塊化結(jié)構(gòu)。

 ?。?)模塊化程序結(jié)構(gòu)

  C語言的模塊化程序結(jié)構(gòu)用函數(shù)來實(shí)現(xiàn),即將復(fù)雜的C程序分為若干模塊,每個(gè)模塊都編寫成一個(gè)C函數(shù),然后通過主函數(shù)調(diào)用函數(shù)及函數(shù)調(diào)用函數(shù)來實(shí)現(xiàn)一大型問題的C程序編寫,因此常說:C程序=主函數(shù)+子函數(shù)。 因些,對函數(shù)的定義、調(diào)用、值的返回等中要尤其注重理解和應(yīng)用,并通過上機(jī)調(diào)試加以鞏固。

  三.掌握一些簡單的算法

  編程其實(shí)一大部分工作就是分析問題,找到解決問題的方法,再以相應(yīng)的編程語言寫出代碼。這就要求掌握算法,根據(jù)我們的《C程序設(shè)計(jì)》教學(xué)大綱中,只要求我們掌握一些簡單的算法,在掌握這些基本算法后,要完成對問題的分析就容易了。如兩個(gè)數(shù)的交換、三個(gè)數(shù)的比較、選擇法排序和冒泡法排序,這就要求我們要清楚這些算法的內(nèi)在含義,其中選擇法排序和冒泡法排序稍難,但只要明白排序的具體過程,對代碼的理解就不難了。如用選擇法對10個(gè)不同整數(shù)排序(從小到大),選擇法排序思路:設(shè)有10個(gè)元素a[1]~a[10],將a[1]與a[2]~a[10]比較,若a[1]比a[2]~a[10]都小,則不進(jìn)行交換,即無任何操作;若a[2]~a[10] 中有一個(gè)比a[1]小,則將其中最大的一個(gè)(假設(shè)為a)與a[1]交換,此時(shí)a[1]中存放了10個(gè)中最小的數(shù)。第二輪將a[2]與a[3]~a[10]比較,將剩下9個(gè)數(shù)中的最小者a與a[2]交換,此時(shí)a[2] 中存放的10個(gè)數(shù)中第2小的數(shù);依此類推,共進(jìn)行9輪比較,a[1]到a[10]就已按從小到大的順序存放。即每一輪都找出剩下數(shù)中的最小一個(gè),代碼如下:

  for(i=1;i《=9;i++)

  for(j=i+1;j a[j]

  {temp=a;

  a=a[j];

  a[j]=temp;

  }

  結(jié)語:當(dāng)我們把握好上述幾方面后,只要同學(xué)們能克服畏難、厭學(xué)、上課能專心聽講,做好練習(xí)與上機(jī)調(diào)試,其實(shí)C語言并不難學(xué)。