
《C语言的基本结构》PPT课件.ppt
25页第二章C語言從零開始(C語言的基本結構)1第二章 C語言從零開始(C語言的基本結構)•在第一章中,相信讀者已經熟悉如何編譯C語言程式在本章中,我們將透過一個非常簡單的C語言程式來說明C語言的程式結構並且從本章開始,我們將實際撰寫每一個C語言範例程式,在撰寫程式之前,我們必須先提醒讀者以下幾件事–(1) 寫程式就和學數學一樣,必須親手練習,每當讀者看完一個範例之後,請自行動手將程式內容一個字一個字的輸入到檔案中並且詢問自己,本行程式的意義為何,是否可以略過以及改寫除此之外,我們並不建議讀者強記各種指令敘述與語法細節,但由逐字輸入及練習撰寫程式的過程中,讀者將自然地記住這些指令敘述與語法–(2) 寫程式就像是堆積木一樣,任何一個大型程式都是由小型程式、函式或程式區塊所組成,因此當學習完畢本書所有範例時,不必懼怕開發中大型程式的挑戰,閱讀本書完畢,您應該具有開發1000行以上程式的能力•【註】:開發有效率的大型程式尚須要配合軟體工程的理論以及系統分析的能力,此時您可能需要更多有關於這方面的訓練2大綱•2.1 最簡單的C程式範例•2.2 註解(comment)•2.3 前置處理指令-#include•2.4 C程式的進入點main(…)函式•2.5 敘述(statement)•2.6 自由格式與空白字元•2.7 深入C語言的文法【補充】•2.8 本章回顧3•下面是一個簡單的C程式範列,請逐字將之輸入到『.c』的檔案中,慢慢培養屬於自己的程式風格。
若您的IDE已經幫您建立了某些預設內容,請先將它刪除後再輸入•範例2-1:ch2_01.c(檔案位於隨書光碟 ch02\ch2_01.c)2.1 最簡單的C程式範例1234567891011121314/***************************//* 檔名:ch2_01.c *//* 功能:簡單的C程式範例 *//***************************/#include
所以這些文字可以當作說明該程式或程式片斷之用,善用註解文字將有助於日後維護程式時,快速了解程式功用在程式的任何地方都可以加入註解)•由於『/*…*/』具有換行功能,也就是可以將註解跨行描述,因此範例2-1的註解可以改寫如下/*************************** * 檔名:ch2_01.c * * 功能:簡單的C程式範例 * ***************************/72.2 註解(comment)–【謬誤】:•由於『/*…*/』註解格式在編譯器中,會從第一個遇到的『/*』開始視為註解文字,直到遇到第一個『*/』為止,因此並不允許使用巢狀註解文字,例如下列的程式碼中,就犯了這個錯誤•【C++】:–C++提供了另一種單行註解符號『//』,凡是『//』之後的整行文字都會被視為註解/*********外部註解********* * /*內部註解*/ * *********外部註解*********/錯誤的巢狀註解8•在C語言中,前置處理指令是前面出現「#」符號的指令,嚴格說起來,前置處理指令並非C語言的指令,因為這些指令會在程式進行編譯之前,先被前置處理器(preprocessor)置換成某些程式碼,因此前置處理指令又稱為假指令。
在此,我們先說明#include這個前置處理指令,至於其他的前置處理指令,則留待後面章節中再做說明–#include的功用在於引入標頭檔,所謂標頭檔就是放置某些已經撰寫完成函式內容的函式庫檔案,這些標頭檔可能是由編譯器所提供,也可能是自行撰寫的函式庫我們必須先引入標頭檔,才可以使用標頭檔內所提供的函式例如:stdio.h標頭檔中定義了printf()與scanf()函式的內容,stdlib.h標頭檔中定義了system()函式的內容因此,若我們在程式中要使用這些函式的話,就必須使用#include
下列是所有ANSI C所規範的函式庫標頭檔名稱及功能 112.3 前置處理指令-#include函式庫標頭檔名稱函式種類
–【解析與說明】:大多數由編譯器所提供的標頭檔,都會使用英文縮寫來表示該檔案所包含的函式庫類型,例如:math.h就是包含數學函式庫的標頭檔,stdio.h就是包含標準輸出入(standard input and output)的標頭檔,您最好根據此原則來命名自行撰寫的函式庫檔案,並於檔案內註解該檔案各函式庫的功用及各引數的規定,以便日後自行使用或提供他人使用142.4 C程式的進入點main(…)函式•C語言屬於模組化設計的一種語言,而C語言的模組則是以函式來加以表示換句話說,C程式是由各個不同功能的函式所組成,並且函式與函式之間可以透過呼叫以及回傳值方式加以聯繫,一個函式的基本定義格式如下:–函式的基本格式為『函式名稱()』,由於函式可以於被呼叫時接受呼叫者傳入引數,因此這些引數必須在『()』內加以宣告,而函式也可以回傳資料給呼叫者,所以我們也必須在函式名稱前面宣告回傳值的資料型態(關於資料型態請見第三章)函式的內容則是包含在『{』與『 } 』之間函式回傳值型態 函式名稱(傳入引數){ 函式內容(敘述群)}15•main()函式是命令列(Console Mode)C程式的進入點,換句話說,當我們在命令列式的作業系統中執行由C所撰寫的應用程式時,會先從main()函式開始執行。
–在範例2-1中,我們將main函式宣告為main(void),其中將void寫在()內,代表該函式不接受傳入任何引數資料若將之寫在函式名稱前,則代表該函式執行完畢後不回傳任何資料,例如:void main()大多數的編譯器都接受省略void的宣告語法(但可能會出現warning警告訊息),也就是當省略宣告void時,自動判定為不接受傳入引數或函式不回傳資料例如我們可以將範例2-1的main函式定義改寫如下:2.4 C程式的進入點main(…)函式main(){ …….}void main(){ …….}main(void){ …….}void main(void){ …….}16•除了上述的介紹之外,main函式還具有以下兩個特點:–(1) 唯一性:在C函式中,任何函式都具有唯一性,main函式也是如此–(2) 必要性:為了讓作業系統能夠找到程式進入點,因此不可省略或缺少main函式•【解析】:本書以命令列式的C語言程式為說明主體,也就是以純粹指令模式(console mode)下的C程式為主要說明對象,若在Windows或Mac OS上的C/C++程式,則由於作業系統上層還包含一層複雜架構(Framework),因此,如果要設計視窗程式,則必須遵循Framework的設計規範,而這將改變C /C++程式的運作規則,例如:Windows下的C /C++程式進入點為WinMain( )函式。
•【解析】:main函式的呼叫者為作業系統,因此範例2-1的程式並不接受作業系統傳入引數,也不會回傳任何數值給作業系統但有的時候作業系統會傳入引數給main函式,例如:我們撰寫一個可接受指定總球數及開獎球數的樂透程式,並將之編譯為lotto執行檔,此時可以在作業提示符號後面輸入『lotto 42 7』,來要求該程式以最大號碼42號的基本條件開出7個隨機號碼(6個基本號+1個特別號)這個時候,我們就必須在main的『()』中宣告所接受的引數資料型態了(詳見第7章)2.4 C程式的進入點main(…)函式17•C語言是模組化設計,並利用區塊來撰寫程式內容,區塊的符號為『{}』,不論是函式、迴圈、決策都是使用區塊符號來包裝內容–而區塊內容則是由敘述(statement)所組成,每一個敘述後面必須加入『;』做為結束例如:範例2-1中,main函式內容共有3個敘述,分別是『printf("歡迎使用C語言!\n");』、『printf("這是一個簡單的C程式.\n");』及『system("pause");』–前兩個敘述都是呼叫printf()函式,『()』內的字串則是傳入printf()函式的引數,而printf()函式則已經定義在
最後的敘述是呼叫system()函式,『()』內的字串"pause"則是傳入system()函式的引數,代表要作業系統執行pause指令,而system()則定義於
而在範例2-1中,#include
212.7 深入C語言的文法【補充】•C語言程式基本上仍舊是一個純文字檔案,因此是由眾多字元所構成,這些字元將會被編譯器的掃描程式分割為句元(Token)這些句元可能代表的是關鍵字、保留字、識別字、運算子、變數名稱或資料值•眾多句元又可以組合成敘述(statement),敘述的結尾則是『;』而眾多的敘述則成為函式內容編譯器的剖析程式(parser)會針對C程式的敘述是否符合C語言的文法(Grammar)加以判斷,若不符合文法,則會產生錯誤訊息–至於ANSI C語言的文法則列於附錄E中,它使用特殊的描述語法來表示,對於初次接觸程式語言的讀者來說,並不容易理解,因此,我們將在後面章節中,使用比較容易理解的格式來解說這些語法,讀者可以於學習完C語言後再回頭來看完整的C語言文法22•在本章中,我們學習到C程式的基本結構本章所學習到的內容如下:–(1) C程式的基本結構包含3大部分:•程式註解、前置處理指令、函式及敘述–(2) 在C程式中,可使用『/*…*/』做為註解符號–(3) 純文字模式的C程式進入點為 main( )函式–(4) 一般敘述以「;」做結尾–(5) C語言的輸出函式printf( )的簡單使用方法如下(我們將在第四章中,說明printf()的進階使用方法)•printf("輸出內容");2.8 本章回顧23–(6) C語言執行作業系統環境的指令可以透過system()來執行,將想要執行的指令包裝為字串當作引數傳送給system()函式即可,格式如下。
並非所有的作業系統指令都可以用這個方式來執行,實際上還必須視作業系統與編譯器提供了哪些指令•system("作業系統指令");•在C程式結構中,除了上述的3大部分之外,還包含其他細節,例如:全域變數的宣告應該出現在其他函式宣告之外這些細節,我們將於後面章節中分別加以介紹2.8 本章回顧24本章習題25。












