關於如何深入學習C語言


我說明下我自己的情況,我在學校學過一學期C語言一學期C++,學過一學期匯編

語言,對計算機雖然不是很精通但也不是小白。我現在想深入點學習C語言,因為我根據我

現在掌握的C語言知識和理解很難做出什么實用性的東西來,頂多也就是能編點小程序處理

點數學問題,而且對程序效率的深層優化什么的也是不很明了。
    我舉例子來說,我個人是比較喜歡這樣的學習方法的:就是先確定自己想完成一個什

么功能的程序,然后一步步來實現,我以前編過一個貪吃蛇的程序,用了一晚上從准備到

出來完整的程序,因為以前我從沒編過關於圖形界面的程序,所以開始很慢,但是用了一

晚上算是實現了。雖然貪吃蛇的大體是實現了,但是程序運行起來並不是那么完美的,比

如說在蛇轉向的時候總會閃幾下,我不知道這是為什么,因為從我的程序看來不應該閃的

。我自己考慮可能是由於不了解系統的比較深的原理不能達到很好的顯示效果(比如說雙

緩沖什么的,我聽到過這個詞但不知道具體什么意思)。還有昨天晚上我給自己定了個目

標,就是編一個程序能實現把所有的小於指定數的素數寫入一個記事本文件內保存。然后

開始上網學習C語言簡單的文件操作,最后程序也實現了是個比較簡單的程序,雖然運行效

率有點低,而且也遇到了一個之前不曾想到的問題。我大體說下。因為程序涉及文件讀寫

操作,我的程序是每測試出一個數是素數就寫進文件,然后關閉文件,這樣勢必運行慢了

,因為在程序關閉文件時要把文件緩存的內容寫進硬盤,硬盤讀寫相對慢就耽誤程序的運

行。於是我就想改進程序,先把素數寫進緩存,等寫了很多個素數直到緩存滿了再寫到硬

盤。但是實現起來又遇到了問題,我把自己的程序改了下,打開文件不關閉,這樣就不會

每寫一個素數都要寫硬盤了,但是我發現只有我要求程序尋找小於5000(具體或許不是這

個數,我沒測試到底是幾)的素數的時候程序運行正常,一旦要求程序運行查找很大的數

以下的素數時總是報錯,是系統錯誤。我想綜其原因可能就是我對文件操作和系統緩沖的

具體細節什么的不清楚。(關於這兩個程序的源碼,我想我還是在下面貼出來吧)
    我想問的是比較深入的學習C語言的步驟,一步步來,我想先確定各項目,比如先實現

個什么程序,后實現個什么程序,我好有具體目標一步步來。最好不要只是給我推薦讀什

么書,因為我放假在家很難靜下心來研究一本書的,而且我想如果我真是有心情一本一本

書讀下來也不用來這里問問題了。我對基本的C的語法什么的都了解了,就是想能深點學習

,因為C語言畢竟不是只用來處理幾個數學小問題就行了的。連操作系統都能用C寫,我不

求能到達那種專業的程度,畢竟不是一兩天的事。我就是想能一步步更加深的學習C。另外

我沒專門學習過數據結構和算法,我也不想單獨來學,我想在學習C和處理問題的道路上順

便用到后學習。
    我想有過C學習經歷的人都有經過我這一步的時候吧,有沒有過來人講一下他學習C的

經驗和根據我的情況給我些建議,我很感激。也不必非得回答我的問題,大家覺得根據我

自己說的我的情況給我點具體可行的建議什么的就行了。我領會東西還算不笨,而且對計

算機語言方面的學習能力也算比較強。我不是小氣只是真的分不多,先謝謝了。還有我留

下自己郵箱如果有什么東西或者想進一步交流可以給我發郵件:

xuejianbest@hotmail.com

50 个解决方案

#1


//這是未修改前的將素數寫進文件的源代碼:

#include <stdio.h>
#include <math.h>
void writefile(int);    //這個函數的作用就是把傳遞給它的參數寫進文件
int main()
{
FILE *pWriteFile=fopen("D:\\VC\\file1.txt","w");
fclose(pWriteFile);         //這兩句的作用是如果存在重名文件,則刪除了重建。

int i;
int num=3;   
int big=3;
printf("輸入一個大數做為結束條件:");
scanf("%i",&big);
if(big<3)           //輸入的數小於3直接退出程序
  goto exit0;
writefile(2);    //先在文件里寫2,因為2是素數,而程序下面是從3開始判斷的
s0: 
for(i=3;i<=sqrt(num);i+=2) //判斷num是否為素數
  if(num%i==0)
  {
   num+=2;
   goto s0;
  }
writefile(num);    //把num寫進文件
num+=2;
if(num>big)     //退出程序條件
  goto exit0;
goto s0;
exit0:
return 0;
}
void writefile(int num)       //此函數作用是把num寫進文件里,而且后面跟着寫兩個空格來分隔兩個數字。
{        //num是數字,文件里是以字符形式出現的,所以函數里涉及數字到字符的轉換
int i=31;
int a=0,b=0;
char zhishu[32]={0};
while(num!=0)
{
  zhishu[--i]=num%10+0x30;
  num/=10;
}
for(a=0;zhishu[a]==0;a++) ;
while(a!=31)
  zhishu[b++]=zhishu[a++];
zhishu[b++]=' ';
zhishu[b++]=' ';
zhishu='\0';
FILE *pWriteFile=fopen("D:\\VC\\file1.txt","a");
  fputs(zhishu,pWriteFile);
fclose(pWriteFile);    //這里有關閉文件操作,所以每運行一次函數都要寫硬盤,這勢必影響程序運行速度
}

//總結:由於每次調用writefile函數都要寫硬盤,也就是說每寫個素數到文件都真正讀取文件一次,沒有利用好文件操作的緩存,程序效率低。

#2


//做了一部分修改后的把素數寫入文件的程序代碼
#include <stdio.h>
#include <math.h>
int main()
{
FILE *pWriteFile=fopen("D:\\VC\\file1.txt","w");
fclose(pWriteFile);
int i;
int t;             
int num=3;
int big=3;
printf("輸入一個大數做為結束條件:");
scanf("%i",&big);
s0: 
for(i=3;i<=sqrt(num);i+=2)
  if(num%i==0)
  {
   num+=2;
   goto s0;
  }
//---------------------------------------------------------    把原來的writefile函數實現的功能在這里實現,程序其他地方基本沒改
t=num;          //保存num的值
int writefilei=31;
int writefilea=0,writefileb=0;
char writefilezhishu[32]={0};
while(num!=0)
{
  writefilezhishu[--writefilei]=num%10+0x30;
  num/=10;
}                
for(writefilea=0;writefilezhishu[writefilea]==0;writefilea++) ;
while(writefilea!=31)
  writefilezhishu[writefileb++]=writefilezhishu[writefilea++];   //把num數字轉化為字符型時並存在writefilezhishu[]這個數組里
writefilezhishu[writefileb++]=' ';
writefilezhishu[writefileb++]=' ';
writefilezhishu[writefileb]='\0';
pWriteFile=fopen("D:\\VC\\file1.txt","a");   //只打開不關閉 
fputs(writefilezhishu,pWriteFile);
num=t;           //恢復num的值
//---------------------------------------------------------------
num+=2;
if(num>big)
  goto exit0;
goto s0;
exit0:
fclose(pWriteFile);   //退出程序時關閉文件
return 0;
}

//這樣效率是比之前高了點,但是存在一個問題,當要求輸入時候輸入的數大於一個值時候報錯(比如輸入5000),而輸入小點的數(比如2000)正常。
//我不知道原因何在。后來我又把程序改了一下,一切正常效率也提上去了,但是至於這個程序為什么會出現這種情況,我還是不清楚,希望了解的人給個解釋,謝謝。
//我會把報錯的截圖發在后面,還有修改后的程序只改了一行,就是把打開文件那一行移到上面去。
//我還是再在下面貼個改好了的程序源碼吧,有利於查出為什么會出現上面這個程序的錯誤。

#3


//最終版把素數寫入文件的程序代碼
#include <stdio.h>
#include <memory.h>
#include <math.h>
int main()
{
 FILE *pWriteFile=fopen("D:\\VC\\file1.txt","w");
 fclose(pWriteFile);
 pWriteFile=fopen("D:\\VC\\file1.txt","a");                //把打開文件操作移到程序開始
 int i;
 int t;             
 int num=3;
 int big=3;
 int writefilei=31;
 int writefilea=0,writefileb=0;
 char writefilezhishu[32]={0};
 printf("輸入一個大數做為結束條件:");
 scanf("%i",&big);
 if(big<3)
 goto exit0;
 fputs("2  ",pWriteFile); 
s0: 
 for(i=3;i<=sqrt(num);i+=2)
  if(num%i==0)
  {
   num+=2;
   goto s0;
  }
//---------------------------------------------------------    把原來的writefile函數實現的功能在這里實現,程序其他地方基本沒改
 t=num;          //保存num的值
 writefilei=31;
 writefilea=0,writefileb=0;
 memset(writefilezhishu,0,sizeof(writefilezhishu));

 while(num!=0)
 {
  writefilezhishu[--writefilei]=num%10+0x30;
  num/=10;
 }                
 for(writefilea=0;writefilezhishu[writefilea]==0;writefilea++) ;
 while(writefilea!=31)
  writefilezhishu[writefileb++]=writefilezhishu[writefilea++];   //把num數字轉化為字符型時並存在writefilezhishu[]這個數組里
 writefilezhishu[writefileb++]=' ';
 writefilezhishu[writefileb++]=' ';
 writefilezhishu[writefileb]='\0';
 fputs(writefilezhishu,pWriteFile);     //這里不打開或者關閉文件,只寫文件,實際上寫的是文件緩存
 num=t;           //恢復num的值
//---------------------------------------------------------------
 num+=2;
 if(num>big)
  goto exit0;
 goto s0;
exit0:
 fclose(pWriteFile);   //退出程序時關閉文件
 return 0;
}


//這樣程序無論輸入的數字是多少運行都不會出錯了,一切正常,而且運行效率與前面程序相比大大提高,因為這個程序寫文件利用了全緩沖方式。

#4


如果你想深入學習C語言的話,我建議你看看匯編和操作系統、數據結構之類的書。

#5


想深入學習C語言,至少得了解匯編

#6


同上,這么多人都告訴你了。

#7


計算機組成原理→DOS命令→匯編語言→C語言(不包括C++)、代碼書寫規范→數據結構、編譯原理、操作系統→計算機網絡、數據庫原理、正則表達式→其它語言(包括C++)、架構……

VC調試時按Alt+8,TC或BC用TD調試,打開匯編窗口看每句C對應的匯編不就啥都明白了嗎。
(Linux或Unix下應該也可以在用GDB調試時,看每句C對應的匯編。)
想要從本質上理解C指針,必須學習匯編以及C和匯編的對應關系。
從匯編的角度理解和學習C語言的指針,原本看似復雜的東西就會變得非常簡單!

記不得哪位C++大牛在哪本學習C++的書的前言里面說過
“用C語言1000行源碼能完成的工作千萬不要用C++重寫!”

#8


該回復於2011-01-19 17:05:12被版主刪除

#9


char writefilezhishu[32]={0};
while(num!=0)
{
  writefilezhishu[--writefilei]=num%10+0x30;
  num/=10;
}   
for(writefilea=0;writefilezhishu[writefilea]==0;writefilea++) ;
這句沒有任何作用,因為你前面至少 每個都加了0x30,所以還沒進入就退出了。

你那個輸入5000以后就出錯是,因為5000以內的數超過了32個,你內存訪問越界了。

深入學習C語言, 要學好匯編,數據結構,算法,可能以后還要操作系統,計算機組成原理,體系結構等。

#10


該回復於2011-01-20 09:26:19被版主刪除

#11


我是覺得樓主的能力已經很強了。。。


雙緩沖 在QT里是一種事件處理機制 

#12


該回復於2011-01-20 09:32:44被版主刪除

#13


多動手調程序,多搜集資料  適當買些書自學

#14


共同學習~~樓上說的很清楚了

#15


多了解匯編吧

#16


我剛好跟你相反,我只喜歡看書,不喜歡寫代碼!

#17


編譯原理也是非常重要的。特別是運行時環境和代碼生成那幾章!

#18


送你一句話,看了過后你就知道怎么做了:
程序不是看出來的,是寫出來的;思想不是想出來的,是敲出的!
樓主好好琢磨一下。

#19


每日任務…~

#20


樓主的文筆,有平靜的力量。怎么就靜不下來看書?關於文件的操作我實在看不懂你寫,我沒覺得那么復雜。你用fopen打開一個流然后又用fclose把流關閉。你說是為了防止重名。可是你怎么判斷?你沒任何條件就把它關了?以w方式打開流,如果該文件存在則文件長度截為零。打開一個流的時候,fopen函數已經建立了緩沖區還有做了其他雜七雜八的事情。當然你可以用setvbuf建立一個替換緩沖區。為什么你對文件進行一次操作就要關閉一次?最后不操作再關不行?我推薦K&R的那本。只有200多頁。C語言教父寫的。我聽說很好准備去看。我也很迷茫。

#21


lz大腦短路 ,不解釋,為何會如此復雜,寫個素數程序,,,

#22


樓上的問題還真獨到。

#23


LZ還沒干啥就開始展望未來了,求素數可以用篩法,你還sqrt循環呢,這個剛學C語言的都會。

#24


C語言只是個工具嘛,拿來用的,比如學學SDK編程嘛,去運用C語言寫的東西

#25


KISS!
Keep It Sample and Stupid!

#26


糾正上帖
Sample->Simple

#27


lz的文筆很好

#28


zhishu......

#29


愛拉托遜斯篩選法

#30


其實樓主挺強的,而且目標又明確,繼續努力下去肯定有收獲

#31


lz不錯了,我還在看書的階段,離自己編一個程序還有一大段距離

#32


樓主文筆真好!
不過寫個找素數的程序應該不會這么復雜的吧,你可以去谷歌下篩法找素數,進而研究一下算法

#33


應該去做項目提升
游戲 開源項目 等等
對游戲感興趣嗎?聯系U箱ksqdq11@163.com

#34


學習一門語言?
看書---寫程序---讀程序---調試程序----再寫程序。。。。

如何深入?
看書:C與指針---C陷阱與缺陷---C專家編程---ISO C標准。
寫程序---讀程序---調試程序----再寫程序

再深入?
修煉內功。
匯編語言,操作系統,數據結構,算法。。。
寫程序---讀程序---調試程序----再寫程序

再再深入?
。。。。。。。。。。。。。。。。。。。。
寫程序---讀程序---調試程序----再寫程序

#35


好長的帖子啊,沒看完。。。

#36


怎么才叫深入呢?語言就是語言,語法就擺在那里,再深入也是有限的。

編程編到最后其實就是思想,而不是什么語言。

#37


興趣--> 相關的書籍->項目->周邊的書籍

#38


該回復於2011-02-09 13:25:55被版主刪除

#39


我也一直對深入學習摸不到頭緒..

#40


素數可以編譯的時候直接靜態生成然后,篩選,當然這是聽老師講的,沒試過

#41


匯編……

#42


我猜擬如果堅持下去,或許有一天會回頭跟我們這樣的新手說吧,樓主
引用 34 樓 athenacle_ 的回復:
學習一門語言?
看書---寫程序---讀程序---調試程序----再寫程序。。。。

如何深入?
看書:C與指針---C陷阱與缺陷---C專家編程---ISO C標准。
寫程序---讀程序---調試程序----再寫程序

再深入?
修煉內功。
匯編語言,操作系統,數據結構,算法。。。
寫程序---讀程序---調試程序----再寫程序

再再深入?
。。。。。。。。。。。。……

#43


其實很佩服樓主的毅力,我就是有點懶,剛開始還能堅持,現在又放下了,向樓主學習,努力。。。。。

#44


樓主真的很強大,我自學c語言有一個月了,只會一些小程序,其他什么度不會

#45


引用 7 樓 zhao4zhong1 的回復:
計算機組成原理→DOS命令→匯編語言→C語言(不包括C++)、代碼書寫規范→數據結構、編譯原理、操作系統→計算機網絡、數據庫原理、正則表達式→其它語言(包括C++)、架構……
這是學習C和其他知識的步驟么  我大白  想自學C的一些基礎知識,現在迷茫,不知道如何入門、做什么准備、學習它需要多久   請老師指明  謝謝了

#46


非常不錯,值得學習啊

#47


引用 45 樓 guofansen 的回復:
引用 7 樓 zhao4zhong1 的回復:

計算機組成原理→DOS命令→匯編語言→C語言(不包括C++)、代碼書寫規范→數據結構、編譯原理、操作系統→計算機網絡、數據庫原理、正則表達式→其它語言(包括C++)、架構……


這是學習C和其他知識的步驟么 我大白 想自學C的一些基礎知識,現在迷茫,不知道如何入門、做什么准備、學習它需要多久 請老師指明 謝謝了

下載Win-TC看幫助里面的C基礎知識。

#48


引用 34 樓 athenacle_ 的回復:
學習一門語言?
看書---寫程序---讀程序---調試程序----再寫程序。。。。

如何深入?
看書:C與指針---C陷阱與缺陷---C專家編程---ISO C標准。
寫程序---讀程序---調試程序----再寫程序

再深入?
修煉內功。
匯編語言,操作系統,數據結構,算法。。。
寫程序---讀程序---調試程序----再寫程序

再再深入?
。。。。。。。。。。。……
很好了

#49


0.0

#50


要想學好c語言就得計算機運行程序的每一步.你懂得數字電路,計算機組成原理,操作系統(windows,linux),匯編,編譯,鏈接,數據結構,離散數學,線性代數.....必要的話還要學網絡,網絡安全,密碼學......
其實c語言學到后來就是數學了,各種算法
學海無涯,回頭是岸......

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: