傻瓜編程入門(C語言版)


前言:由於有人要考C語言計算機二級,編程零基礎,要我入入門。我就把QQ聊天記錄整理一下,再把未講完的東西繼續講下去,希望為以后做類似工作也省省力。對於有多年編程經驗的資深程序員來說,這些着實小菜。而且由於為了應付二級考試,嚴格的說也不能算真正的計算機基礎講解。

但其實我想,基礎應該是最難的。硬件,操作系統,編譯器,算法,哪一個不是計算機里面最重要也是最難啃的部分?而對於一個沒有編程基礎的人來說,想去快速入門編程,只能以一種很傻瓜的方式去灌輸,只能把很多東西說的很淺顯,很死,甚至是錯誤。如果不是這樣,哪能讓一個人快速的上手呢?遙想自己當年學習c語言,從老師的嘴里得來的,也不過是一些傻瓜的理解,而解決問題的方法,大都是在死記硬背。舉一才能反三,計算機世界有自己的邏輯,對於一個初學者來說,任你再聰明絕頂,也需要很長的時間消化理解計算機的邏輯,直到有一天這種邏輯深入骨髓。

(以下零基礎者慎入)

初學編程的時候,以為內存就是一個大廣場,你的程序隨意在里面亂搭亂放。后來才知道,操作系統有虛擬內存管理,有虛擬地址向物理地址的轉換,有頁映射,有內存交換,有函數的棧空間,有全局存儲空間,還有可以動態申請釋放的堆,甚至還有動態鏈接庫的存儲區域。這些過程中甚至有硬件直接參與,比如虛擬地址的翻譯。

初學編程的時候,以為用Turbo C的丑陋界面編譯出來的程序獨占的享用CPU資源,以為“程序”就是計算機中的執行實體。殊不知操作系統有進程,還有線程,這些執行實體共享計算機的資源,並分時地運行在同一個CPU或者同一個CPU的同一個核心上。

至於算法和數據結構,卻反而顯得不那么難理解,不那么會在你了解了之后發出“原來我之前的理解是如此天真”的驚嘆。雖然算法和數據結構的設計非常耗費腦力,需要不斷推敲氣正確性,效率,實現細節,可用性。。。

而在CPU、操作系統的上的一切串行的東西,到了GPU上又會被很大程度上顛覆。不過希望隨着GPU硬件的升級,和GPU編程環境的發展,以后在SPMD的處理器上編程會變得像在CPU上用vs gcc那樣方便、容易,而不用考慮過多硬件的細節。

說的有些多了,進入正題吧。先講寫粗略的概念,更細節的有時間再說吧,更像一個學習的指導,還是需要看書才能真正理解的。另外,都是最基礎最傻瓜的,莫笑。

1 計算機基礎

計算機,也就是電腦,你天天用這個東西,他整天干嘛呢??
答:他在跑程序。
CPU是執行程序的電子器件,他執行人寫的程序,來完成各種各樣的工作。程序是啥呢??程序可以通常理解為一系列的執行指令。這些指令是你寫的,電腦按照你的指示完成工作。C語言就是這樣的一種程序,你用C語言寫出的程序的源文件(通常以.c結尾)。通過某種計算機程序的處理(這個東西叫做編譯器,你可以不理解他是干啥的,但你至少得會用)生成可執行文件,然后可以在電腦上運行。所以通常哈,用C語言寫程序的過程就是:
1 寫源程序
2 通過編譯器編譯生成可執行文件
3 執行,看看你寫的程序是否正確
第三步也稱作調試程序。你自己通過各種去測試你的程序有沒有錯誤。最簡單的方法是執行它,然后看它是不是和你想象一樣去工作。
所以你如果想學會C語言,必須會寫程序,會用編譯器,然后會調試。
調試這個我們以后再講吧。這是一個長期積累起來的經驗,關於如何快速調試。

內存,硬盤,鍵盤,顯示器,cpu,是你寫C語言程序必須接觸的幾個電腦硬件,接下來一一介紹這些硬件。

內存和硬盤都是存儲東西的,他們的區別在哪呢??
你的筆記本里有硬盤也有內存。一般內存是幾G,1G到4G。硬盤是幾十G到幾百G。硬盤是用來長效存儲,電腦斷電后硬盤數據不會丟失;而內存是暫時存儲,電腦一斷電,內存數據就沒了。所以一般你存東西都是在硬盤里的,這會占用硬盤空間。
那么內存有啥用呢???是這樣哈,硬盤存取速度比較慢,而內存存取速度快,所以在電腦程序中,一般打交道的是內存。因為你要完成某種計算任務,並不需要在電腦斷電以后這些數據還在。比如你想做一個計算器,加減乘除,算完你看到結果就好了,不需要長期存儲。這些數據都是存在內存里的。
所以電腦程序大部分時候都在和內存打交道,C語言程序也是。

那么內存和硬盤了解了,cpu、鍵盤和顯示器是干嘛的捏。
cpu就是執行運算,你寫程序反倒不用關心。
顯示器顯示你程序的結果,和你的輸入。
鍵盤用來輸入。
基本上你要考二級,就涉及這么多了。有時候會讓你讀文件寫文件,那么這就是在操作硬盤了,記住一點就是文件存儲在硬盤里。

2 C語言基礎

C語言,它是所有現代流行語言的鼻祖。要想學習它,必須了解它的一些基本概念:

變量
變量類型
變量定義
運算符
順序執行
條件執行(if else)
循環執行(for、 while)
函數
數組
結構
指針

變量

變量,就是內存空間中的一部分區域,存儲你運算中需要的數據。你可以讀取它,可以往里面寫數據,也可以對他進行運算。所以變量可能是最重要也最基礎的概念,它和內存緊緊相連。只不過你剛剛開始學習寫程序不需要總想着內存。
那變量有幾個要素呢??
答:變量類型,變量名稱。
變量類型可以表示其操作,這個變量的行為,占用內存的大小。而變量名稱用於區分變量,並對它進行操作,引用。
比如:
    int a;
這是一個整數型的變量,名叫a。
變量的類型決定了你能對它的操作以及操作的行為。比如int就是整形,可以有正負int是英文integer的縮寫。unsigned int是無符號整數類型,0和正整數。float是所謂的浮點數,你可以理解為小數。
不同類型的變量,同樣的操作可能會有不同的行為。比如一個a-b。
對於整形的a和b,它的結果是一個整數。
對於無符號整數也就是正整數的a和b,它的結果是一個無符號整數,但也有可能是一個非法的值,因為如果b大於a的話,結果可能就是無意義的了。
至於浮點數依次類推。
總之計算機運算的一個宗旨就是,運算數是什么類型,運算結果就是什么類型。如果出現兩個運算類型不一樣或者你給的運算數和運算符的要求的類型不一樣,計算機會給你做轉換。

運算符

剛剛講到運算了,就可以到下一話題了,就是運算符。變量是一個基礎的概念,運算符也是。計算機整天在做的就是運算,運算符是你表示這些運算的標志。
運算符主要包括兩種,算數運算和邏輯運算。至於位運算,不知道考不考,再說吧,這里先講前兩種。
算術運算就是加減乘除取余數,分別對應標志 + - * / %。%是取余數,不是除,除是/。
這里要說明的一點是,計算機的運算和現實世界的運算有一定出入。對於小數,也就是浮點數float,它的算術運算行為比較正常。而對於整形,它的算數運算比較奇怪。整數的除法不整除,只會取結果的整數部分,即商,比如7 / 2結果是3。至於溢出和浮點數的計算誤差什么的就略顯高深了。
除開算數運算還有邏輯運算。就是與(&&)、或(||)、非(!)。
基本上就是真假值的運算,這個在條件判斷里面會用到。

判斷與循環

由於計算機程序都是順序執行的,從某一個入口處往下執行直到某個結束處,這個入口叫main函數,結束為main函數的結尾。
既然順序執行,可不可以改變它的執行順序呢?答案是可以的,通過條件判斷語句和循環語句。
條件判斷的大體是。
    if ( ... )
    { ... }
    else
    { ... }
基本就是說,判斷一條件,如果為真,執行后面的語句,否則執行else后面的語句。
if可以進行嵌套,組成
    if ( ... )
   { ... }
   else if ( ... )
   { ... }
   else if ( ... )
   { ... }
   ...
   else
   { ... }

接下來講循環。可以說,沒有循環,就沒有計算機程序。其重要性不言而喻。
循環就是說,反復執行某一段程序,直到某個條件滿足,跳出這個循環。在c語言里主要有for循環和while循環,for用得比較多,但while比較基礎。他們之間可以互相轉化,但在大多數場合,for比較方便。

數組,結構,指針

數組是一段連續的內存的變量,用有多個某種類型的元素。
比如剛剛聲明的
    int a;
它是一個變量,只占用一段內存。如果聲明一個數組,就可以聲明很多個int型的變量。數組聲明用
    int a[10]
這樣的語法,表示聲明一個有十個元素的整數型數組。
然后是結構。

結構是復雜數據類型,一般是struct關鍵字聲明,基本上是很多簡單數據類型(也就是整形浮點型什么的)組成的。

至於指針呢,是一種特殊的變量類型。它里面存儲的值是一個內存地址,這個內存地址所在的內存可能存儲着某種其他數據。指針是比較難的,初學不用學得很明白,能會用能過考試就好。

函數

函數是程序執行單位,但比語句高一層。語句是執行最基礎單位,而語句組成了函數
一般來講,程序從一個函數開始執行。對於c語言程序,所有程序的起點是所謂的main函數。而在某個函數之內,可以調用其他函數。這樣,函數作為一個功能的單位,完成不同的功能,組合在一起,就成為了一個比較大的功能,完成復雜的計算。
函數需要定義和調用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM