令小白頭痛的C語言,到底該怎麼學?

C語言作為現在大多數理工科本科生的必修課,很多從未有過程式設計概念的同學也不得不開始學習這門課程。但是由於授課老師水平參差不齊,有些學生學著學著便開始直呼“頭痛”,不得不說是十分真實了。

令小白頭痛的C語言,到底該怎麼學?

我們的第一個程式:HelloWorld

作為必修課,又不能掛科,那麼我們應該怎麼學呢?下面將從兩個角度來探討C語言的學習。

一、應試角度

毫無疑問,C語言本身是一門必修課,這意味著它具有課程的共性,即知識存在基礎知識、重點知識和難點知識等。注意,C語言的基礎知識是基本的邏輯,而不是計算機的組成原理,恰好相反的是,我們正是透過學習C語言來逐步瞭解計算機的原理的。在高中時代,我們學過用程式框圖和虛擬碼來描述演算法,如果這部分的知識掌握了的話,那麼我們就相當於擁有了學習C語言的基礎知識。

C語言是面向過程的,也就是以過程為中心。而面向過程的程式本質上是透過一種規範表述來描述資料結構和演算法,C語言正是其中的一種規範表述。因此C語言的重點就是理解關鍵字和符號的基本含義,結合我們的基礎的邏輯思維,讓我們能看懂程式的過程,也就是程式實際上幹了一些什麼事。下面簡單舉個例子。

令小白頭痛的C語言,到底該怎麼學?

1+2+……+100 ?

比如我們要用C語言計算1+2+……+100的值, 如果以課程角度來看,首先這樣的題目考了一個什麼知識點?肯定考了迴圈語句這個知識點,因為計算的每一步都是加法,假如這道題是一個改錯題,題目的程式如上圖所示,那麼其中一種改法就是在小於號後面加個等於號,變成小於等於號。我們先看一下for關鍵字後面的小括號裡的內容,根據for迴圈的知識,小括號其中被兩個分號夾住的部分如果成立則執行,不成立則退出迴圈,而且括號裡面的i++表示i會在每次迴圈之後增加1,因此,按圖中程式,當i為100的時候,會先判斷i是否小於100,由於不成立,所以退出迴圈,而我們輸出的資料是sum,相當於輸出的1+2+……+99的值,所以一種辦法就是讓sum在for迴圈就計算出正確的值,另外一種改法就是不輸出sum,而輸出sum+100的值。

上面的例子體現出,首先程式類的題目很多情況都不止一個解決辦法,其次正確理解C語言程式需要掌握C語言的語法基礎,比如關鍵字、運算子、語句、資料型別和常用函式等。C語言的最大難點就是指標。如果單純以透過期末考試的角度來看待這個知識點的話,那麼應該翻一下歷年期末的指標是怎麼考查的,直接將可能考的方式和答案記住。這個角度適用於應試能力強,對於C語言毫無興趣的同學。

二、研究和實用角度

從第二個角度來看待C語言,就是C語言實際上有什麼作用,具體幹了什麼,怎麼幹的。第一個角度裡可以直接無視#include之類的固定語句,而在第二個角度裡我們就是要一條條弄懂。

比如,C語言裡,以#開頭的語句稱為預編譯語句,C語言程式首先會透過編譯器生成中間檔案。編譯器就是一個已經做好的程式,就像翻譯官一樣,把C語言翻譯成機器能夠讀懂的語言,而中間檔案是已經翻譯好的你寫的那部分程式,預編譯語句則是對編譯器翻譯程式做一些準備工作。比如#include這個語句,其實就是把stdio。h這個檔案的內容直接貼上到這個語句處,stdio。h檔案包含的是標準輸入輸出函式的宣告。有了這個宣告,我們就能在我們的程式裡使用這些函式。這些標頭檔案函式具體的定義是已經編譯好了的,編譯器會把我們寫的程式編譯出來的中間檔案和那些編譯好了的函式實現連線起來,使得我們使用的那些函式是有具體作用的,而不是空殼。像這樣的內容,課堂上並不會講得十分詳細,因此我們具體學習的時候,可以多查閱資料,使得自己理解其中的每一個步驟,這樣就能對C語言有一個全面的理解。

再一個就是要多考慮如何用C語言來解決實際問題,實踐能很快地提高一個新手的技能水平,並能清醒地意識到自己哪方面還不懂。具體可以做的專案,比如用C語言來計算同時期的極限和積分的題目,或者學習一下簡單的圖形庫,做個簡單的遊戲之類的,也可以透過刷OJ來提高演算法和語法水平。

令小白頭痛的C語言,到底該怎麼學?

用openGL模擬行星公轉