第一篇:程序員學(xué)習(xí)C語言的十大好處
www.004km.cn 程序員學(xué)習(xí)C語言的十大好處
凡是程序員都知道C語言也都學(xué)習(xí)過C語言,因為它是程序員最基礎(chǔ)的學(xué)習(xí)內(nèi)容,往往最基礎(chǔ)的也是最重要的并且是對我們最有幫助的。那就讓我們來談?wù)劤绦騿T學(xué)習(xí)C語言的十大好處吧!
1)相比較其他的編程語言(像C++,JAVA),C語言是個低級語言。從總體上來說,低級的編程語言可以讓你更好的了解計算機(jī)。
2)設(shè)備驅(qū)動程序和操作系統(tǒng)只能用C語言來編寫?,F(xiàn)在,你可能還從來沒有編寫過一個設(shè)備驅(qū)動程序或者一個操作系統(tǒng),但是如果你需要去修改他們的時候,怎么辦?
3)如果你想要得到一份編寫微控制器程序的工作的時候,該怎么辦?他們都是用C語言編寫的。就因為不想學(xué)習(xí)一門新的語言,你就準(zhǔn)備限制你能得到工作的機(jī)會嗎?
4)C的程序比其他用別的語言寫的程序,實現(xiàn)相同的功能,它用的代碼行數(shù)更少,而它帶來的運(yùn)行效率卻更快。有時候,你的程序所需要的速度,中國自學(xué)編程網(wǎng),只有C語言能做到。
www.004km.cn
5)如果你學(xué)習(xí)過C語言,你就能學(xué)習(xí)現(xiàn)在任何的高級編程語言。因為所有的高級語言都是以C語言為基礎(chǔ)的(像JAVA,C++,C#等等)。
6)因為C語言已經(jīng)存在很多年了,它有廣泛的使用團(tuán)體并且有大量的現(xiàn)成代碼可以利用。這就使你能在過去程序的基礎(chǔ)上,快速和高效的編寫新的算法和函數(shù)。
7)C語言是一個開源組織的語言。一個開源組織的產(chǎn)物--LINUX,就是用C語言寫的。如果你會C語言,你就能參加這個組織并且還能向眾多的開源組織投稿,比如參加Source Forge并且給他們投稿。
8)C語言是唯一一個向你闡述指針的本質(zhì)的語言。而C#和Java干脆跳過了指針這個題目??墒侵羔槾_實使C語言變得更加強(qiáng)大。
9)找編程開發(fā)方面的工作時,C語言仍然是最普遍需要的語言。所以它值得你花時間去學(xué)會它。
10)任何里面有微處理器的設(shè)備都支持C語言。從微波爐到手機(jī),都是由C語言技術(shù)來推動的。
(ps:本文章由北大青鳥廣安門校區(qū)搜集自互聯(lián)網(wǎng))
第二篇:29.如何學(xué)習(xí)C語言-----程序員之路
作者:t5k5 日期:2007-10-24
一周沒有寫東西了,今天上校內(nèi)的時候有個好友分享了這篇帖子,深有感觸,以后堅決不用TC了,去下個VC++來學(xué)習(xí)C,哈哈~~還說我們用的教材太LJ了,這個我倒不怎么清楚,因為沒學(xué)懂啊。。
看文章結(jié)尾的鏈接就知道是CSDN上的了,以下是原文:
=================T5K5的學(xué)習(xí)分割線=================
學(xué)習(xí)C語言不是一朝一夕的事情,但也不需要花費(fèi)十年時間才能精通。如何以最小的代價學(xué)習(xí)并精通C語言是本文的主題。請注意,即使是“最小的代價”,也絕不是什么捷徑,而是以最短的時間取得最多的收獲,同時也意味著你需要經(jīng)歷艱苦的過程。
一、要讀就讀好書,否則不如不讀
所有初學(xué)者面臨的第一個問題便是:如何選擇教材。好的開始是成功的一半,選擇一本優(yōu)秀的教材是事半功倍的關(guān)鍵因素。不幸的是,學(xué)校通常會幫你指定一本很差勁的C語言課本;而幸運(yùn)的是,你還可以再次選擇。
大名鼎鼎的譚浩強(qiáng)教授出了一本《C語言程序設(shè)計》,據(jù)說發(fā)行量有超過400萬,據(jù)我所知,很多學(xué)校都會推薦這本書作為C語言課本。雖然本人的名字(譚浩宇)跟教授僅僅一字之差,但我是無比堅定地黑他這本書的。這本書不是寫給計算機(jī)專業(yè)的學(xué)生的,而是給那些需要考計算機(jī)等級考試的其它專業(yè)學(xué)生看的。這本書的主要缺點是:例子程序非常不專業(yè),不能教給你程序設(shè)計應(yīng)該掌握的思考方式;程序風(fēng)格相當(dāng)?shù)夭缓茫瑫屇沭B(yǎng)成亂寫代碼的惡習(xí);錯誤太多,曾經(jīng)有人指出過這本書的上百個錯誤,其中不乏關(guān)鍵的概念性錯誤。好了,這本書我也不想說太多了,有興趣大家可以百度一下:)
Kernighan和Ritchie的《The C Programming Language》(中譯名《C程序設(shè)計語言》)堪稱經(jīng)典中的經(jīng)典,不過舊版的很多內(nèi)容都已過時,和現(xiàn)在的標(biāo)準(zhǔn)C語言相去甚遠(yuǎn),大家一定要看最新的版本,否則不如不看。另外,即使是最經(jīng)典最權(quán)威的書,也沒有辦法面面俱到,所以手邊常備一本《C語言參考手冊》是十分必要的。《C語言參考手冊》就是《C Reference Manual》,是C語言標(biāo)準(zhǔn)的詳細(xì)描述,包括絕大多數(shù)C標(biāo)準(zhǔn)庫函數(shù)的細(xì)節(jié),算得上是最好的標(biāo)準(zhǔn)C語言的工具書。順便提一句,最新的《C程序設(shè)計語言》是根據(jù)C89標(biāo)準(zhǔn)修訂的,而《C語言參考手冊》描述的是C99標(biāo)準(zhǔn),二者可能會有些出入,建議按照C99標(biāo)準(zhǔn)學(xué)習(xí)。還有一本《C和指針》,寫得也是相當(dāng)?shù)夭诲e,英文名是《Pointers on C》,特別地強(qiáng)調(diào)指針的重要性,算是本書的一個特點吧。不過這本書并不十分適合初學(xué)者,如果你曾經(jīng)學(xué)過C語言,有那么一些C語言的基礎(chǔ)但又不是很扎實,那么你可以嘗試一下這本書。我相信,只要你理解了指針,C語言便不再神秘。
如果你已經(jīng)啃完了一本C語言教材,想要更進(jìn)一步,那么有兩本書你一定要看。首先是《C Traps and Pitfalls》(中譯名《C陷井與缺陷》),很薄的一本小冊子,內(nèi)容非常非常地有趣。要注意一點,這本書是二十多年前寫成的,里面提到的很多C語言的缺陷都已被改進(jìn),不過能夠了解一些歷史也不是什么壞事。然后你可以挑戰(zhàn)一下《Expert C Programming》(中譯名《C專家編程》),書如其名,這本書頗具難度,一旦你仔細(xì)讀完并能透徹理解,你便可以放心大膽地在簡歷上寫“精通C語言”了。
切記一個原則,不要讀自己目前還看不懂的書,那是浪費(fèi)生命。如果你看不懂,那你一定是缺失了某些必需基礎(chǔ)知識。此時,你要仔細(xì)分析自己需要補(bǔ)充哪些內(nèi)容,然后再去書店尋找講述的這些內(nèi)容的書籍。把基礎(chǔ)知識補(bǔ)充完畢再回頭來學(xué)習(xí),才會真正的事半功倍。
二、Unix/Linux還是Windows,這是個很大的問題
不同的編程環(huán)境會造就出不同思維的程序員。Windows的程序員大多依賴集成開發(fā)環(huán)境,比如Visual Studio,而Unix程序員更加鐘愛Makefile與控制臺。顯而易見,集成開發(fā)環(huán)境更容易上手,在Windows上學(xué)習(xí)C語言,只需要會按幾個基本的Visutal C++工具欄按鈕就可以開始寫Hello, World!了,而在Unix下,你需要一些控制臺操作的基本知識。有人也許認(rèn)為Unix的環(huán)境更簡潔,但習(xí)慣的力量是很大的,大家都很熟悉Windows的基本操作,而為了學(xué)習(xí)C語言去專門裝一個Unix系統(tǒng),似乎有點不劃算。
對于一個只懂得Windows基本操作、連DOS是什么都不知道的新手而言,盡快做一些有趣而有意義的事情才是最重要的。用C語言寫一個小程序遠(yuǎn)比學(xué)習(xí)ls、cat等命令有趣,況且我們要專注于C語言本身,就不得不暫時忽略一些東西,比如編譯鏈接的過程、Makefile的寫法等等等等。
所以我建議初學(xué)者應(yīng)該以Visual C++ 6.0(不是VisualC++.NET)或者Dev C++作為主要的學(xué)習(xí)環(huán)境,而且千萬不要在IDE的使用技巧上過多糾纏,因為今后你一定要轉(zhuǎn)向Unix環(huán)境的。Visual C++ 6.0使用很方便,調(diào)試也很直觀,但其默認(rèn)的編譯器對C標(biāo)準(zhǔn)的支持并不好,而Dev C++使用gcc編譯器,對C99的標(biāo)準(zhǔn)都支持良好。使用順帶提一下,很多大學(xué)的C語言課程還在使用Turbo C 2.0作為實驗環(huán)境,這是相當(dāng)不可取的,原因其一是TC 2.0對C標(biāo)準(zhǔn)幾乎沒有支持,其二是TC 2.0編譯得到的程序是16位的,這對今后理解32位的程序會造成極大的困擾(當(dāng)然,用djgpp之類的東西可以使TC 2.0編譯出32位程序,不過那過于復(fù)雜了)。
等你學(xué)完一本C語言的教材,你一定要轉(zhuǎn)向Unix平臺繼續(xù)學(xué)習(xí),幾乎所有的C語言高級教程都是基于Unix平臺的(比如《C專家編程》)。轉(zhuǎn)變的過程是痛苦的,你需要面對的是各種紛繁復(fù)雜的命令,完全不同于Windows平臺的思考方式,但是這種痛苦是值得的。Unix與C是共生的,Unix的思考方式和習(xí)慣更加符合C語言的思考方式和習(xí)慣。在Unix下,你可以找到無數(shù)優(yōu)秀的源代碼供你盡情閱讀,你可以方便地查看某個庫函數(shù)的聯(lián)機(jī)手冊,還可以看到最優(yōu)秀的代碼風(fēng)格(說到代碼風(fēng)格,我會專門寫一篇文章詳細(xì)敘述)。
歸結(jié)起來就是一句話:初學(xué)C語言,建議使用Windows系統(tǒng)和集成開發(fā)環(huán)境,在準(zhǔn)備向“高手”方向努力時,請先轉(zhuǎn)向Unix平臺。
三、萬事俱備,你就是東風(fēng)
書已選定,環(huán)境配置完成,正所謂萬事俱備,只欠你自己的努力了。請從書的前言開始,仔細(xì)地閱讀手頭的教材,很多人看書喜歡直接從第一章開始看,這是錯誤的做法。前言是作者對整本書的大體介紹,作者一般會告訴你需要什么基礎(chǔ)才能夠順利閱讀本書,這可以幫助你檢驗自己的基礎(chǔ)知識是否已經(jīng)具備??赐昵把裕€要瀏覽一下目錄,了解一下書的整體結(jié)構(gòu),順便給自己安排一下學(xué)習(xí)計劃。
學(xué)習(xí)C語言,必需注意每一個細(xì)節(jié),書上的例子代碼一定要自己親自敲一遍,編譯執(zhí)行輸出都跟書上說的一致才能算是學(xué)完了一個例子,如果不一致,就要仔細(xì)找原因。出了書本上有的例子,自己還要“創(chuàng)造”一些例子,比如學(xué)習(xí)運(yùn)算符優(yōu)先級的時候,可以寫幾個相同的表達(dá)式,在不同的位置加上括號,看看有哪些不同的行為,比如*p++和(*p)++,又比如a = b == c、(a = b)== c和a =(b == c)等等。自己抄的書上的例子以及改造之后的例子,還有自己“創(chuàng)造”的例子,都應(yīng)該仔細(xì)地歸類保存,并且要在源代碼中寫上簡短的注釋,闡述這個例子的意圖。
例子之后就是習(xí)題了,我建議初學(xué)者把所有的習(xí)題都獨(dú)立做一遍,然后對照答案的代碼,看看自己的代碼有那些不足,再試著修改自己的代碼。很多人不重視習(xí)題,這是極大的錯誤,因為作者通常會在習(xí)題中說明一些重要的道理,而不是單純地檢驗前面的知識。
也許你認(rèn)為這樣學(xué)習(xí)太慢,其實不然。學(xué)得細(xì)致就不用走回頭路,等你學(xué)到后面才發(fā)現(xiàn)自己前面沒搞清楚,那才是真的得不償失。一般說來,整本書讀完,你應(yīng)該完成數(shù)千行乃至上萬行的代碼,無論是原封不動照抄書上的,還是自己心血來潮寫就的,都是今后繼續(xù)學(xué)習(xí)的一筆財富。以我自己舉例,閱讀《Windows核心編程》時(我只閱讀了3/4的內(nèi)容),除了抄書上的代碼,還自己寫了很多例子,一共有5574行(用unix下的wc工具統(tǒng)計),時隔多日,我早已記不清Windows的系統(tǒng)編程了,但只要花幾分鐘翻出以前的代碼看看,便會重新了然于胸。所謂好記性不如爛筆頭,就是這個道理。
仔細(xì)讀書、認(rèn)真抄寫源代碼、獨(dú)立完成習(xí)題外加更進(jìn)一步的實驗,最后將所有的代碼留下,成為自己的經(jīng)驗和財富,絕對的辛苦,也絕對的事半功倍。當(dāng)然,這種方式只適合學(xué)習(xí)需要精通的技術(shù),如果不是學(xué)習(xí)C語言,你還要具體情況具體分析。
寫到最后,還有非常非常重要的一點沒有提及──代碼風(fēng)格,從最開始學(xué)習(xí)就必須強(qiáng)迫自己模仿最優(yōu)秀的代碼風(fēng)格。因為代碼風(fēng)格太重要內(nèi)容也太多,我會用專門的一篇文章來詳細(xì)討論,請大家關(guān)注《程序員之路──關(guān)于代碼風(fēng)格》。
第三篇:程序員教你學(xué)C語言
程序員教你學(xué)C語言
很多小伙伴都老是會碰到疑問,其實還是基礎(chǔ)沒打扎實,這些題如果你不看答案你能知道多少呢?如果還有很多不知道就證明基礎(chǔ)沒打扎實,如果你還在入門糾結(jié),如果你還在苦惱怎么入門!小編有個建議,可以加小編弄的一個C語言交流基地,大家可以進(jìn)入交流基地:565122788,里面新手入門資料,可以說從零到項目實戰(zhàn),都是可以免費(fèi)獲取的,還有程序員大牛為各位免費(fèi)解答問題,熱心腸的小伙伴也是蠻多的。不失為是一個交流的的好地方,小編在這里邀請大家加入我的大家庭。歡迎你的到來。一起交流學(xué)習(xí)!共同進(jìn)步!小編等你!還有前面沒有看的同學(xué)最好從程序員教你學(xué)C語言
(一)開始看哦,尤其是基礎(chǔ)還沒打扎實的同學(xué)!
今天只舉幾個例子,主要幫大家鞏固循環(huán)的知識,每個例子大家都要敲鍵盤敲出來,然后運(yùn)行成功了才算掌握了,不然還是眼高手低,看上去懂了,一到寫程序又犯難了。我發(fā)現(xiàn)有不少人熱衷于打印圖形,所以就弄了幾個圖形。第一個是打印金字塔。代碼和運(yùn)行圖如下:
首先定義了兩個變量i、j,然后使用system(“color 0e”)改變顏色。接下來會進(jìn)入一個外層循環(huán),其中的i代表層數(shù),我們可以看到這里金字塔有6層,所以i的取值范圍也是0<=i<6,第一次進(jìn)循環(huán)時,i=0,然后到第一個內(nèi)層循環(huán),這個循環(huán)的初始條件是j=6-i=6,結(jié)束條件是j>0,所以這里會打印6個空格,然后來到第二個內(nèi)層循環(huán),這個循環(huán)的初始條件是j=1;結(jié)束條件是j<=2*i+1=1,所以這里會打印一個星,然后會以printf(“ ”)打印一個換行結(jié)束第一次外層循環(huán),然后開始第二次外層循環(huán),如此反復(fù),最后就得到了如上所示的圖形。
不理解的話可以把外層循環(huán)for(i = 0;i < 6;i++)的i<6改成i<3,這樣就只會打印三行,可以便于理解。
第二個是打印菱形,其實就是上一個圖形的變化,效果和代碼如下:
可以看到,我們這個圖形是上下對稱的,所以打印菱形上半部分(就是上一個例子的打印金字塔)的代碼和下半部分的代碼十分相似,只是把外層循環(huán)的頭部從for(i = 0;i < 6;i++)變成了for(i = 6;i >= 0;i--),大家理解一下代碼,菱形的上半部分,打印的星星數(shù)會越來越多,從1到3再到5再到7...而星星前面的空格數(shù)會越來越少,從6到5再到4再到3...而菱形的下半部分剛好反過來了,所以只需要修改很少的代碼就能實現(xiàn)菱形了
接下來是打印一個五角星,這是之前一個萌萌噠妹紙學(xué)習(xí)的代碼,因為我比較懶啦,所以沒做修改就直接拿來了,希望不要介意 #include
這個程序很明顯分成了四塊,由四個外層for循環(huán)構(gòu)成,for(n1=1;n1<6;n1++)打印最上面5行,for(n2=1;n2<5;n2++)打印中間4行,for(n3=1;n3<3;n3++)打印下面2行行,for(n4=1;n4<5;n4++)打印最下面4行,大家自己理解下代碼,不懂的就問
最后一個圖形是我剛剛寫的六芒星,完整的代碼輸出結(jié)果是這樣的:
學(xué)習(xí)交流群(565122788)
但是我這里只給出一半代碼,剩下的需要大家自己學(xué)完成,當(dāng)是對自己的考驗也好,作業(yè)也罷,還是希望大家能夠自己親自動手試一下的。不懂的就再問 #include
更多的數(shù)據(jù)類型和循環(huán)
前面我們說為了讓計算機(jī)能夠識別一個變量到底占了多少字節(jié),我們需要為變量定義數(shù)據(jù)類型,那究竟有多少種數(shù)據(jù)類型呢,其實前面我給出32個關(guān)鍵字里面就已經(jīng)包括了,short、int、long、char、float、double這6個關(guān)鍵字代表了C語言里的6中基本數(shù)據(jù)類型,怎么去理解它們呢,舉個例子:大家都見過剪卡器吧?(沒見過?手機(jī)卡總見過吧)。我們知道不同的手機(jī)使用的手機(jī)卡的大小是有區(qū)別的,我們通常是用剪卡器,拿著它把原來移動的大卡這么一咔,一個小卡就出來了,不同型號的剪卡器咔出來的手機(jī)卡大小不一樣,比如蘋果手機(jī)的卡就特別小,三星的卡稍微大點......,現(xiàn)在我們聯(lián)想一下,short、int、long、char、float、double這六個東東是不是很像不同類型的剪卡器?拿著它們在內(nèi)存上咔咔咔,不同大小的內(nèi)存就分配好了。在32位的系統(tǒng)下short咔出來的內(nèi)存大小是2個字節(jié)(也叫byte);int咔出來的內(nèi)存大小是4個byte;long咔出來的內(nèi)存大小是4個byte;float咔出來的內(nèi)存大小是4個byte;double咔出來的內(nèi)存大小是8個byte;char咔出來的內(nèi)存大小是1個byte。接下來我們就寫程序看看這些基本的數(shù)據(jù)類型在我們自己電腦上的大小吧。
其中sizeof關(guān)鍵字可以確定給定的類型占據(jù)了多少字節(jié),它后面可以直接跟類型的關(guān)鍵字,比如sizeof(int),也可以跟變量(比如sizeof(i))甚至是表達(dá)式,比如最后一行的sizeof(i-1),它的結(jié)果是表達(dá)式的計算結(jié)果所占據(jù)的字節(jié)數(shù),i-1的結(jié)果為0,0也是整數(shù),所以占據(jù)的字節(jié)數(shù)為4。(注意這里是指的32位的編譯環(huán)境下的情況,具體平臺大家可以運(yùn)行這個程序測試一下)。然后接下來是對這6種基本數(shù)據(jù)的使用情況
可以看到,兩組都是同樣的數(shù)據(jù),但是最后打印出來的結(jié)果,上面一組數(shù)據(jù)中字符變量、浮點變量和雙精度變量打印出來的結(jié)果都不對。原因是什么呢,因為是printf的第一個參數(shù),%d這個符號,前面的%是占位符,后面的這個d代表是以整數(shù)形式打印出來,而不同的數(shù)據(jù)類型要以不同的形式打印出來,所以總結(jié)一下,%c表示打印字符、%f是打印浮點數(shù)、%lf是打印雙精度,%hd、%d、%ld分別是打印短整型、整型和長整型
關(guān)于上面的字符c='a'為什么按%d整數(shù)打印是97的問題,這個其實就涉及到ascii碼表了,我們知道在計算機(jī)底層,所有的數(shù)據(jù)都是以0和1存儲的,那計算機(jī)如何識別像a、b、c這樣的字符呢,其他它們最終在計算機(jī)里也是被以0、1數(shù)據(jù)的形式存放的,而且美國人就為它們指定了一個統(tǒng)一的標(biāo)準(zhǔn),就是ascii編碼,圖片如下
可以看到小寫字符a的ascii碼值的十進(jìn)制就是97,而大寫A的ascii碼是65,printf中的%d就是以十進(jìn)制整數(shù)方式輸出它在內(nèi)存中的數(shù)據(jù),所以就輸出了97 接下來將大家使用這些基本數(shù)據(jù)類型最容易犯錯的一點,就是極限值,我們知道計算機(jī)里的一位只能表示0或者1,而兩位只能表示0、1、2、3,依次類推,我們?nèi)绻蠳位,那也只能表示2的N次方個數(shù)據(jù),我們說int是4字節(jié)的,就是32位,所以int也是有極限值的,那是不是就是2的32次方呢,理論上來講,它能表示這么多的數(shù)據(jù),但是因為有正負(fù)數(shù)的存在,這個值還得減半,我們接下來的程序就是測試你機(jī)器上的這些基本類型的極限值的,注意unsigned這個修飾符就是無符號的數(shù),比如unsigned int,這就是無符號整數(shù),這樣它能表示的范圍就是0~4294967295(2的32次方-1)了。不小心極限值的話,就會經(jīng)常犯錯
C/C++學(xué)習(xí)交流群,歡迎大家一起來交流提升。565122788進(jìn)群就能獲取C語言新手學(xué)習(xí)大禮包
另外兩種循環(huán):while循環(huán)和do...while循環(huán)(還有一種可以構(gòu)成循環(huán)的是goto,但是先不講).while循環(huán)的格式: while(表達(dá)式){ 循環(huán)執(zhí)行語句;} 下一條語句;while循環(huán)和for循環(huán)的區(qū)別在于它的循環(huán)頭部沒有賦初值的操作,一開始就會進(jìn)行循環(huán)表達(dá)式的判斷,如果表達(dá)式成立,則進(jìn)入循環(huán),否則跳到循環(huán)的下一條語句??匆粋€例子 # include
第四篇:程序員之路──如何學(xué)習(xí)C語言并精通C語言
程序員之路──如何學(xué)習(xí)C語言
學(xué)習(xí)C語言不是一朝一夕的事情,但也不需要花費(fèi)十年時間才能精通。如何以最小的代價學(xué)習(xí)并精通C語言是本文的主題。請注意,即使是“最小的代價”,也絕不是什么捷徑,而是以最短的時間取得最多的收獲,同時也意味著你需要經(jīng)歷艱苦的過程。
一、要讀就讀好書,否則不如不讀
所有初學(xué)者面臨的第一個問題便是:如何選擇教材。好的開始是成功的一半,選擇一本優(yōu)秀的教材是事半功倍的關(guān)鍵因素。不幸的是,學(xué)校通常會幫你指定一本很差勁的C語言課本;而幸運(yùn)的是,你還可以再次選擇。
大名鼎鼎的譚浩強(qiáng)教授出了一本《C語言程序設(shè)計》,據(jù)說發(fā)行量有超過400萬,據(jù)我所知,很多學(xué)校都會推薦這本書作為C語言課本。雖然本人的名字(譚浩宇)跟教授僅僅一字之差,但我是無比堅定地黑他這本書的。這本書不是寫給計算機(jī)專業(yè)的學(xué)生的,而是給那些需要考計算機(jī)等級考試的其它專業(yè)學(xué)生看的。這本書的主要缺點是:例子程序非常不專業(yè),不能教給你程序設(shè)計應(yīng)該掌握的思考方式;程序風(fēng)格相當(dāng)?shù)夭缓?,會讓你養(yǎng)成亂寫代碼的惡習(xí);錯誤太多,曾經(jīng)有人指出過這本書的上百個錯誤,其中不乏關(guān)鍵的概念性錯誤。好了,這本書我也不想說太多了,有興趣大家可以百度一下:)
Kernighan和Ritchie的《The C Programming Language》(中譯名《C程序設(shè)計語言》)堪稱經(jīng)典中的經(jīng)典,不過舊版的很多內(nèi)容都已過時,和現(xiàn)在的標(biāo)準(zhǔn)C語言相去甚遠(yuǎn),大家一定要看最新的版本,否則不如不看。另外,即使是最經(jīng)典最權(quán)威的書,也沒有辦法面面俱到,所以手邊常備一本《C語言參考手冊》是十分必要的?!禖語言參考手冊》就是《C Reference Manual》,是C語言標(biāo)準(zhǔn)的詳細(xì)描述,包括絕大多數(shù)C標(biāo)準(zhǔn)庫函數(shù)的細(xì)節(jié),算得上是最好的標(biāo)準(zhǔn)C語言的工具書。順便提一句,最新的《C程序設(shè)計語言》是根據(jù)C89標(biāo)準(zhǔn)修訂的,而《C語言參考手冊》描述的是C99標(biāo)準(zhǔn),二者可能會有些出入,建議按照C99標(biāo)準(zhǔn)學(xué)習(xí)。還有一本《C和指針》,寫得也是相當(dāng)?shù)夭诲e,英文名是《Pointers on C》,特別地強(qiáng)調(diào)指針的重要性,算是本書的一個特點吧。不過這本書并不十分適合初學(xué)者,如果你曾經(jīng)學(xué)過C語言,有那么一些C語言的基礎(chǔ)但又不是很扎實,那么你可以嘗試一下這本書。我相信,只要你理解了指針,C語言便不再神秘。
如果你已經(jīng)啃完了一本C語言教材,想要更進(jìn)一步,那么有兩本書你一定要看。首先是《C Traps and Pitfalls》(中譯名《C陷井與缺陷》),很薄的一本小冊子,內(nèi)容非常非常地有趣。要注意一點,這本書是二十多年前寫成的,里面提到的很多C語言的缺陷都已被改進(jìn),不過能夠了解一些歷史也不是什么壞事。然后你可以挑戰(zhàn)一下《Expert C Programming》(中譯名《C專家編程》),書如其名,這本書頗具難度,一旦你仔細(xì)讀完并能透徹理解,你便可以放心大膽地在簡歷上寫“精通C語言”了。
切記一個原則,不要讀自己目前還看不懂的書,那是浪費(fèi)生命。如果你看不懂,那你一定是缺失了某些必需基礎(chǔ)知識。此時,你要仔細(xì)分析自己需要補(bǔ)充哪些內(nèi)容,然后再去書店尋找講述的這些內(nèi)容的書籍。把基礎(chǔ)知識補(bǔ)充完畢再回頭來學(xué)習(xí),才會真正的事半功倍。
二、Unix/Linux還是Windows,這是個很大的問題
不同的編程環(huán)境會造就出不同思維的程序員。Windows的程序員大多依賴集成開發(fā)環(huán)境,比如Visual Studio,而Unix程序員更加鐘愛Makefile與控制臺。顯而易見,集成開發(fā)環(huán)境更容易上手,在Windows上學(xué)習(xí)C語言,只需要會按幾個基本的Visutal C++工具欄按鈕就可以開始寫Hello, World!了,而在Unix下,你需要一些控制臺操作的基本知識。有人也許認(rèn)為Unix的環(huán)境更簡潔,但習(xí)慣的力量是很大的,大家都很熟悉Windows的基本操作,而為了學(xué)習(xí)C語言去專門裝一個Unix系統(tǒng),似乎有點不劃算。
對于一個只懂得Windows基本操作、連DOS是什么都不知道的新手而言,盡快做一些有趣而有意義的事情才是最重要的。用C語言寫一個小程序遠(yuǎn)比學(xué)習(xí)ls、cat等命令有趣,況且我們要專注于C語言本身,就不得不暫時忽略一些東西,比如編譯鏈接的過程、Makefile的寫法等等等等。
所以我建議初學(xué)者應(yīng)該以Visual C++ 6.0(不是VisualC++.NET)或者Dev C++作為主要的學(xué)習(xí)環(huán)境,而且千萬不要在IDE的使用技巧上過多糾纏,因為今后你一定要轉(zhuǎn)向Unix環(huán)境的。Visual C++ 6.0使用很方便,調(diào)試也很直觀,但其默認(rèn)的編譯器對C標(biāo)準(zhǔn)的支持并不好,而Dev C++使用gcc編譯器,對C99的標(biāo)準(zhǔn)都支持良好。使用順帶提一下,很多大學(xué)的C語言課程還在使用Turbo C 2.0作為實驗環(huán)境,這是相當(dāng)不可取的,原因其一是TC 2.0對C標(biāo)準(zhǔn)幾乎沒有支持,其二是TC 2.0編譯得到的程序是16位的,這對今后理解32位的程序會造成極大的困擾(當(dāng)然,用djgpp之類的東西可以使TC 2.0編譯出32位程序,不過那過于復(fù)雜了)。
等你學(xué)完一本C語言的教材,你一定要轉(zhuǎn)向Unix平臺繼續(xù)學(xué)習(xí),幾乎所有的C語言高級教程都是基于Unix平臺的(比如《C專家編程》)。轉(zhuǎn)變的過程是痛苦的,你需要面對的是各種紛繁復(fù)雜的命令,完全不同于Windows平臺的思考方式,但是這種痛苦是值得的。Unix與C是共生的,Unix的思考方式和習(xí)慣更加符合C語言的思考方式和習(xí)慣。在Unix下,你可以找到無數(shù)優(yōu)秀的源代碼供你盡情閱讀,你可以方便地查看某個庫函數(shù)的聯(lián)機(jī)手冊,還可以看到最優(yōu)秀的代碼風(fēng)格
歸結(jié)起來就是一句話:初學(xué)C語言,建議使用Windows系統(tǒng)和集成開發(fā)環(huán)境,在準(zhǔn)備向“高手”方向努力時,請先轉(zhuǎn)向Unix平臺。
三、萬事俱備,你就是東風(fēng)
書已選定,環(huán)境配置完成,正所謂萬事俱備,只欠你自己的努力了。請從書的前言開始,仔細(xì)地閱讀手頭的教材,很多人看書喜歡直接從第一章開始看,這是錯誤的做法。前言是作者對整本書的大體介紹,作者一般會告訴你需要什么基礎(chǔ)才能夠順利閱讀本書,這可以幫助你檢驗自己的基礎(chǔ)知識是否已經(jīng)具備??赐昵把?,還要瀏覽一下目錄,了解一下書的整體結(jié)構(gòu),順便給自己安排一下學(xué)習(xí)計劃。
學(xué)習(xí)C語言,必需注意每一個細(xì)節(jié),書上的例子代碼一定要自己親自敲一遍,編譯執(zhí)行輸出都跟書上說的一致才能算是學(xué)完了一個例子,如果不一致,就要仔細(xì)找原因。出了書本上有的例子,自己還要“創(chuàng)造”一些例子,比如學(xué)習(xí)運(yùn)算符優(yōu)先級的時候,可以寫幾個相同的表達(dá)式,在不同的位置加上括號,看看有哪些不同的行為,比如*p++和(*p)++,又比如a = b == c、(a = b)== c和a =(b == c)等等。自己抄的書上的例子以及改造之后的例子,還有自己“創(chuàng)造”的例子,都應(yīng)該仔細(xì)地歸類保存,并且要在源代碼中寫上簡短的注釋,闡述這個例子的意圖。
例子之后就是習(xí)題了,我建議初學(xué)者把所有的習(xí)題都獨(dú)立做一遍,然后對照答案的代碼,看看自己的代碼有那些不足,再試著修改自己的代碼。很多人不重視習(xí)題,這是極大的錯誤,因為作者通常會在習(xí)題中說明一些重要的道理,而不是單純地檢驗前面的知識。
也許你認(rèn)為這樣學(xué)習(xí)太慢,其實不然。學(xué)得細(xì)致就不用走回頭路,等你學(xué)到后面才發(fā)現(xiàn)自己前面沒搞清楚,那才是真的得不償失。一般說來,整本書讀完,你應(yīng)該完成數(shù)千行乃至上萬行的代碼,無論是原封不動照抄書上的,還是自己心血來潮寫就的,都是今后繼續(xù)學(xué)習(xí)的一筆財富。以我自己舉例,閱讀《Windows核心編程》時(我只閱讀了3/4的內(nèi)容),除了抄書上的代碼,還自己寫了很多例子,一共有5574行(用unix下的wc工具統(tǒng)計),時隔多日,我早已記不清Windows的系統(tǒng)編程了,但只要花幾分鐘翻出以前的代碼看看,便會重新了然于胸。所謂好記性不如爛筆頭,就是這個道理。
仔細(xì)讀書、認(rèn)真抄寫源代碼、獨(dú)立完成習(xí)題外加更進(jìn)一步的實驗,最后將所有的代碼留下,成為自己的經(jīng)驗和財富,絕對的辛苦,也絕對的事半功倍。當(dāng)然,這種方式只適合學(xué)習(xí)需要精通的技術(shù),如果不是學(xué)習(xí)C語言,你還要具體情況具體分析。
寫到最后,還有非常非常重要的一點沒有提及──代碼風(fēng)格,從最開始學(xué)習(xí)就必須強(qiáng)迫自己模仿最優(yōu)秀的代碼風(fēng)格。
第五篇:十大C語言經(jīng)典程序
計算機(jī)二級C語言程序必背
1、/*輸出9*9口訣。共9行9列,i控制行,j控制列。*/ #include
{ for(j=1;j<10;j++)
{
result=i*j;
printf(“%d*%d=%-3d”,i,j,result);/*-3d表示左對齊,占3位*/
}
printf(“n”);/*每一行后換行*/
} }
2、/*古典問題:有一對兔子,從出生后第3個月起每個月都生一對兔子,小兔子長到第三個月后每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數(shù)為多少? 兔子的規(guī)律為數(shù)列1,1,2,3,5,8,13,21....*/ main(){ long f1,f2;int i;f1=f2=1;for(i=1;i<=20;i++)
{ printf(“%12ld %12ld”,f1,f2);
if(i%2==0)printf(“n”);/*控制輸出,每行四個*/
f1=f1+f2;/*前兩個月加起來賦值給第三個月*/
f2=f1+f2;/*前兩個月加起來賦值給第三個月*/
} }
3、/*判斷101-200之間有多少個素數(shù),并輸出所有素數(shù)及素數(shù)的個數(shù)。
程序分析:判斷素數(shù)的方法:用一個數(shù)分別去除2到sqrt(這個數(shù)),如果能被整除,則表明此數(shù)不是素數(shù),反之是素數(shù)。*/ #include “math.h” main(){
int m,i,k,h=0,leap=1;
printf(“n”);
for(m=101;m<=200;m++)
{ k=sqrt(m+1);
for(i=2;i<=k;i++)
if(m%i==0)
{leap=0;break;}
if(leap)
/*內(nèi)循環(huán)結(jié)束后,leap依然為1,則m是素數(shù)*/
{printf(“%-4d”,m);h++;
if(h%10==0)
printf(“n”);
}
leap=1;
}
printf(“nThe total is %d”,h);}
4、/*一個數(shù)如果恰好等于它的因子之和,這個數(shù)就稱為“完數(shù)”。例如6=1+2+3.編程
找出1000以內(nèi)的所有完數(shù)。*/ main(){
static int k[10];
int i,j,n,s;
for(j=2;j<1000;j++)
{
n=-1;
s=j;
for(i=1;i {if((j%i)==0) { n++; s=s-i; k[n]=i; } } if(s==0) {printf(“%d is a wanshu: ”,j); for(i=0;i printf(“%d,”,k[i]); printf(“%dn”,k[n]); } } } 5、/*下面程序的功能是將一個4×4的數(shù)組進(jìn)行逆時針旋轉(zhuǎn)90度后輸出,要求原始數(shù)組的數(shù)據(jù)隨機(jī)輸入,新數(shù)組以4行4列的方式輸出,請在空白處完善程序。*/ main(){ int a[4][4],b[4][4],i,j; /*a存放原始數(shù)組數(shù)據(jù),b存放旋轉(zhuǎn)后數(shù)組數(shù)據(jù)*/ printf(“input 16 numbers: ”);/*輸入一組數(shù)據(jù)存放到數(shù)組a中,然后旋轉(zhuǎn)存放到b數(shù)組中*/ for(i=0;i<4;i++) for(j=0;j<4;j++) { scanf(“%d”,&a[i][j]); b[3-j][i]=a[i][j]; } printf(“array b:n”); for(i=0;i<4;i++) { for(j=0;j<4;j++) printf(“%6d”,b[i][j]); printf(“n”); } } 6、/*編程打印直角楊輝三角形*/ main(){int i,j,a[6][6];for(i=0;i<=5;i++) {a[i][i]=1;a[i][0]=1;} for(i=2;i<=5;i++) for(j=1;j<=i-1;j++) a[i][j]=a[i-1][j]+a[i-1][j-1];for(i=0;i<=5;i++) {for(j=0;j<=i;j++) printf(“%4d”,a[i][j]); printf(“n”);} } 7、/*通過鍵盤輸入3名學(xué)生4門課程的成績,分別求每個學(xué)生的平均成績和每門課程的平均成績。 要求所有成績均放入一個4行5列的數(shù)組中,輸入時同一人數(shù)據(jù)間用空格,不同人用回車 其中最后一列和最后一行分別放每個學(xué)生的平均成績、每門課程的平均成績及班級總平均分。*/ #include int i,j; for(i=0;i<3;i++) for(j=0;j<4;j++) scanf(“%f”,&a[i][j]); for(i=0;i<3;i++) { sum1=0; for(j=0;j<4;j++) sum1+=a[i][j]; a[i][4]=sum1/4; } for(j=0;j<5;j++) { sum2=0; for(i=0;i<3;i++) sum2+=a[i][j]; a[3][j]=sum2/3; } for(i=0;i<4;i++) { for(j=0;j<5;j++) printf(“%6.2f”,a[i][j]); printf(“n”); } } 8、/*完善程序,實現(xiàn)將輸入的字符串反序輸出,如輸入windows 輸出swodniw。*/ #include int i,j,k; printf(“Enter a string: ”); scanf(“%s”,c); k=strlen(c); for(i=0,j=k-1;i { c1=c[i];c[i]=c[j];c[j]=c1;} printf(“%sn”,c); } 指針法: void invert(char *s){int i,j,k;char t;k=strlen(s);for(i=0,j=k-1;i { printf(“cannot open the filen”); exit(0); } printf(“input str:n”);gets(str); printf(“n%s”,str); fprintf(fp,“%s”,str);invert(str); printf(“n%s”,str);fprintf(fp,“n%s”,str); fclose(fp);} 9、/*下面程序的功能是從字符數(shù)組s中刪除存放在c中的字符。*/ #include int j,k; printf(“nEnter a string: ”); gets(s); printf(“nEnter a character: ”); c=getchar(); for(j=k=0;s[j]!= '