1. 程式人生 > >學習C語言常見的幾個問題及解決方法

學習C語言常見的幾個問題及解決方法

        所有初學者面臨的第一個問題便是:如何選擇教材。好的開始是成功的一半,選擇一本優秀的教材是事半功倍的關鍵因素。不幸的是,學校通常會幫你指定一本很差勁的C語言課本;而幸運的是,你還可以再次選擇。


  大名鼎鼎的譚浩強教授出了一本《C語言程式設計》,據說發行量有超過400萬,據我所知,很多學校都會推薦這本書作為C語言課本。雖然本人的名字(譚浩宇)跟教授僅僅一字之差,但我是無比堅定地黑他這本書的。這本書不是寫給計算機專業的學生的,而是給那些需要考計算機等級考試的其它專業學生看的。這本書的主要缺點是:例子程式非常不專業,不能教給你程式設計應該掌握的思考方式;程式風格相當地不好,會讓你養成亂寫程式碼的惡習;錯誤太多,曾經有人指出過這本書的上百個錯誤,其中不乏關鍵的概念性錯誤。好了,這本書我也不想說太多了,有興趣大家可以百度一下:)


  Kernighan和Ritchie的《The C Programming Language》(中譯名《C程式設計語言》)堪稱經典中的經典,不過舊版的很多內容都已過時,和現在的標準C語言相去甚遠,大家一定要看最新的版本,否則不如不看。另外,即使是最經典最權威的書,也沒有辦法面面俱到,所以手邊常備一本《C語言參考手冊》是十分必要的。《C語言參考手冊》就是《C Reference Manual》,是C語言標準的詳細描述,包括絕大多數C標準庫函式的細節,算得上是最好的標準C語言的工具書。順便提一句,最新的《C程式設計語言》是根據C89標準修訂的,而《C語言參考手冊》描述的是C99標準,二者可能會有些出入,建議按照C99標準學習。還有一本《C和指標》,寫得也是相當地不錯,英文名是《Pointers on C》,特別地強調指標的重要性,算是本書的一個特點吧。不過這本書並不十分適合初學者,如果你曾經學過C語言,有那麼一些C語言的基礎但又不是很紮實,那麼你可以嘗試一下這本書。我相信,只要你理解了指標,C語言便不再神祕。


  如果你已經啃完了一本C語言教材,想要更進一步,那麼有兩本書你一定要看。首先是《C Traps and Pitfalls》(中譯名《C陷井與缺陷》),很薄的一本小冊子,內容非常非常地有趣。要注意一點,這本書是二十多年前寫成的,裡面提到的很多C語言的缺陷都已被改進,不過能夠了解一些歷史也不是什麼壞事。然後你可以挑戰一下《Expert C Programming》(中譯名《C專家程式設計》),書如其名,這本書頗具難度,一旦你仔細讀完並能透徹理解,你便可以放心大膽地在簡歷上寫“精通C語言”了。


  切記一個原則,不要讀自己目前還看不懂的書,那是浪費生命。如果你看不懂,那你一定是缺失了某些必需基礎知識。此時,你要仔細分析自己需要補充哪些內容,然後再去書店尋找講述的這些內容的書籍。把基礎知識補充完畢再回頭來學習,才會真正的事半功倍。


  Unix/Linux還是Windows,這是個很大的問題


  不同的程式設計環境會造就出不同思維的程式設計師。Windows的程式設計師大多依賴整合開發環境,比如Visual Studio,而Unix程式設計師更加鍾愛Makefile與控制檯。顯而易見,整合開發環境更容易上手,在Windows上學習C語言,只需要會按幾個基本的Visutal C++工具欄按鈕就可以開始寫Hello, World!了,而在Unix下,你需要一些控制檯操作的基本知識。有人也許認為Unix的環境更簡潔,但習慣的力量是很大的,大家都很熟悉Windows的基本操作,而為了學習C語言去專門裝一個Unix系統,似乎有點不划算。


  對於一個只懂得Windows基本操作、連DOS是什麼都不知道的新手而言,儘快做一些有趣而有意義的事情才是最重要的。用C語言寫一個小程式遠比學習ls、cat等命令有趣,況且我們要專注於C語言本身,就不得不暫時忽略一些東西,比如編譯連結的過程、Makefile的寫法等等等等。


  所以我建議初學者應該以Visual C++ 6.0(不是VisualC++ .NET)或者Dev C++作為主要的學習環境,而且千萬不要在IDE的使用技巧上過多糾纏,因為今後你一定要轉向Unix環境的。Visual C++ 6.0使用很方便,除錯也很直觀,但其預設的編譯器對C標準的支援並不好,而Dev C++使用gcc編譯器,對C99的標準都支援良好。使用順帶提一下,很多大學的C語言課程還在使用Turbo C 2.0作為實驗環境,這是相當不可取的,原因其一是TC 2.0對C標準幾乎沒有支援,其二是TC 2.0編譯得到的程式是16位的,這對今後理解32位的程式會造成極大的困擾(當然,用djgpp之類的東西可以使TC 2.0編譯出32位程式,不過那過於複雜了)。


  等你學完一本C語言的教材,你一定要轉向Unix平臺繼續學習,幾乎所有的C語言高階教程都是基於Unix平臺的(比如《C專家程式設計》)。轉變的過程是痛苦的,你需要面對的是各種紛繁複雜的命令,完全不同於Windows平臺的思考方式,但是這種痛苦是值得的。Unix與C是共生的,Unix的思考方式和習慣更加符合C語言的思考方式和習慣。在Unix下,你可以找到無數優秀的原始碼供你盡情閱讀,你可以方便地檢視某個庫函式的聯機手冊,還可以看到最優秀的程式碼風格
  歸結起來就是一句話:初學C語言,建議使用Windows系統和整合開發環境,在準備向“高手”方向努力時,請先轉向Unix平臺。


  書已選定,環境配置完成,正所謂萬事俱備,只欠你自己的努力了。學習C語言的過程是枯燥的,因為在學習的過程中你面對的始終是一臺不會說話的電腦、一堆木訥的文字。而且在學習C語言的過程中還會遇到這樣或那樣的問題,今天本博主就給各位新入門的C語言學習者介紹一下學習C語言的過程中經常會遇到的問題及解決方法。
1、計算機語言挺枯燥的,如何提起興趣 
答:首先要明確學習的目標,沒有明確的學習目標就沒有學習動力。給自己定一個目標,比如這次一定通過計算機等級考試,或者這個月學習完做個東西出來等等。其次,確定了目標之後,要認真去做,多上機操作實踐,遇到不懂的要多跟教師和其他學員交流,千萬不能放棄。當自己編的一段小程式執行通過,或攻下一道難題,自己就會獲得一種成就感,可能還會很興奮,也就漸漸有了興趣。最後,要把所學的知識運用到實際問題當中,這樣既可以鞏固所學的知識,不至於完學了就忘,還可以根據實際需要拓展知識面。這樣良性迴圈,興趣也會越來越濃。 


2、有學員來信問到:我的電腦裡安裝的TURBO?C(970K)不能正常的編譯,現象是:在編譯過程中,提示沒有錯誤也沒有警告,按任意鍵返回,可是在電腦上不能生成"OBJ"檔案,有時提示:Unable to open input file’cos.obj’,我的朋友從他們學校的PC上拷貝回來的程式也出現這個問題?!在他們學校卻很正常,這是怎麼回事?這個問題一直在困擾我,使我的學習不能進行下去!請幫我解決。謝謝!
答:這需要重新設定options--directories中的include目錄和lib目錄,設為你C的安裝目錄就可以了。記住要儲存喲!
3、#include
main()
{int m=7,n=4;
float a=38.4,b=6.4,x;
x=m/2+n*a/b+1/2;
printf("%f\n",x);
}
這個程式的結果是27.000000
為什麼我一直算的是28.000000呢?請指教 
答:main()

int m=7,n=4;
float a=38.4,b=6.4,x;
x=m/2+n*a/b+1/2;
printf("%f\n",x);
}
m/2==3;因為m是整形所以結果為整形不是3.5而是3
同樣1/2不是0.5而是0。
要改的話,x=(float)m/2+n*a/b+1.0/2.0; 
結果為28.0000


4、有些人說我的程式很難讓人看懂,請問如何將程式寫得規範、簡潔明瞭
答:這是程式設計中重要的一點,要養成良好的程式設計習慣。請看一個例題:程式很簡單,是用TURBO C編一個時鐘程式。具體如下:
/**************************************************** 
Module:clock.c
just a test of my programming ability 
*****************************************************/
#include"math.h"
#include"dos.h"
#include"stdio.h"
#include"graphics.h"
main()
{
char s[30];
int gdriver,gmode;
int cosh,sinh,cosm,sinm,coss,sins;
struct ;time t;
char keydown=0;
int x=300,y=160,r=40;
clrscr();
gdriver=9; gmode=1;
initgraph(&gdriver,&gmode,"a:\\");/*需要說明的是,第三個引數a:\\是egavga.bgi這個檔案的路徑*/


/* install the graphic device.the third parameter is the path of the driver*/


setbkcolor(0);
setcolor(WHITE);
while(1)
{


circle(x,y,r);/*paintthecircle*/


line(x,y+r-10,x,y+r-12);
line(x+r-4,y,x+r,y);
line(x-r,y,x-r+4,y);
line(x,y-r+10,x,y-r+10+2); /* draw the fout scales */


gettime(&t);
sprintf(s,"The current time is %2d:%02d:%02d\n",t.ti_hour,t.ti_min,t.ti_sec,t);
outtextxy(0,0,s); /* out put the current time */
outtextxy(0,10,"This clock is written by lijun"); /*?show the auther */
coss=(int)((r-10)*cos(t.ti_sec*3.14f/30-3.14f/2)+x);
sins=(int)((r-10)*sin(t.ti_sec*3.14f/30-3.14f/2)+y);
cosm=(int)((r-19)*cos(t.ti_min*3.14f/30-3.14f/2)+x);
sinm=(int)((r-19)*sin(t.ti_min*3.14f/30-3.14f/2)+y);
cosh=(int)((r-28)*cos((t.ti_hour+(float)(t.ti_min)/60)*3.14f/6-3.14f/2)+x);
sinh=(int)((r-28)*sin((t.ti_hour+(float)(t.ti_min)/60)*3.14f/6-3.14f/2)+y);


/* calculate the position of the three points */
setcolor(14);
line(x,y,coss,sins);
setcolor(13);
line(x,y,cosm,sinm);
setcolor(10);
line(x,y,cosh,sinh);
setcolor(15);


/* draw the points */


sleep(1);
clrscr();&nb


sp; 
keydown=kbhit();/* check whether key down */
if(keydown)
{
closegraph();/* close graphic device */
exit(0);
}
}


}


 文章所有權歸屬
匯盈天下
http://www.huiyingtianxia.net/,轉載必註明。