Posted on 2008-04-19 23:41
silentneil 閱讀(414)
評論(0) 編輯 收藏 引用
第1章 C語言概述
1.1 C語言出現的歷史背景
C語言是國際上廣泛流行的計算機高級語言,即可用來寫系統軟件,也可用來寫應用軟件。
C語言是在B語言的基礎上發展起來的。
早期的C語言運行在UNIX操作系統上,后來運行在DOS操作系統上,現在的C語言可運行在Windos操作系統上。
C語言有許多版本,我們使用的是Turbo C 2.0。
P1,說明。
1.2 C語言的特點
C語言有許多優于其它語言的特點:
(1)語言簡潔、緊湊,使用方便、靈活。
C語言一共只有32個關鍵字,9個控制語句,書寫形式自由。
P2,表1.1。
(2)運算符豐富。
C共有34種運算符,如+、-等。
P2,說明。
(3)數據結構豐富。
C有整型、實型等多種數據結構。
P3,說明。
(4)具有結構化的控制語句。
C有if…else、while等多種結構化的控制語句。
P3,說明。
(5)語法限制不太嚴格,程序設計自由度大。
如對數組下標越界不作檢查等。
P3,說明。
(6)C語言可進行位運算。
這是C區別于其它高級語言的主要特點。
P3,說明。
(7)生成目標代碼質量高。
這也是C的優于其它高級語言之處。
P3,說明。
(8)C程序可移植性好。
即C程序可基本不做修改移到不同的計算機上運行。
P3,說明。
1.3 簡單的C程序介紹
P4,例1.1,見ex1-1.c。
程序功能:打印一個字符串,并輸出一個換行符。
P4,例1.2,見ex1-2.c。
程序功能:求兩個數之和。
P5,例1.3,見ex1-3.c。
程序功能:求兩個數的較大者。
分析這三個例子的執行過程。
說明:
4
C程序是由函數組成的。在上面的例子中的函數有:main、printf、scanf和max。其中main是主函數,printf、scanf是庫函
數,max是自定義函數。一個C程序一定要有一個主函數。庫函數是放在*.h的庫函數文件中,只要直接調用就可。自定義函數要由用戶先定義后調用。
5 認識一下C函數
C函數定義的一般格式為:
函數類型 函數名(形參類型 形式參數,…)
{
數據聲明部分;
函數執行部分;
}
C函數調用的一般格式為:
函數名(實際參數,…)
(3)一個C程序總是從main主函數開始執行的,而不論main函數在程序中的位置如何。主函數可以調用子函數,子函數還可以調用子子函數。因此C程序是層次結構的。
(4)C程序一行可以寫多個語句,每個語句以“;”結束。C程序是區分大小寫字母的。C程序本身沒有輸入輸出語句,其輸入輸出是由庫函數printf和scanf來完成的。/*…*/是C的注釋語句。
1.4 C程序的上機步驟
C程序編寫好后,要經過編輯、編譯、連接與運行四個步驟,這四個步驟的作用分別是:
編輯:把C語言源程序輸入計算機并進行修改存盤,生成*.c的源程序文件。
編譯:用C編譯程序對*.c的源程序文件進行編譯,生成*.obj的二進制文件。
連接:把*.obj的二進制文件與系統標準模塊進行連接,生成*.exe的可執行文件。
運行:執行*.exe的可執行文件,輸出執行結果。
以上步驟均可在Turbo C的工作平臺上進行,啟動Turbo C,就可以進行編輯,打命令Ctrl+F9,就可以進行編譯、連接和運行,打命令Alt+F5,就可看到執行結果。
舉例說明,見ex1-1.c。
1.5 Turbo C常用命令簡介
1. 啟動和退出
啟動:在DOS下打TC,或在Windows下創建快捷命令執行。
退出:Alt+X
2. 程序的編輯
簡單編輯:Ins:插入/改寫 Backspace:刪除前一字符
Del:刪除當前字符 Ctrl+Y:刪除一行
塊操作:Ctrl+KB、Ctrl+KK:定義塊首、尾
Ctrl+KC、Ctrl+KV、Ctrl+KY:塊復制、塊移動、塊刪除
Ctrl+KH:取消塊定義
3. 程序載入與存盤
F3:載入程序 F6:切換窗口
F2:存盤 Alt+FN:新建程序
4. 編譯和運行
Ctrl+F9:編譯連接執行程序 Alt+F5:查看執行結果
Ctrl+F7:添加監視表達式 F7:進入子函數單步執行
F8:越過子函數單步執行 Ctrl+F2:取消單步執行
舉例說明,見ex1-1.c。
第2章 程序的靈魂-算法
一個程序應包括兩個方面的內容:
3 對數據的描述:即程序中的數據要指定它的類型和組織形式,也稱數據結構。
4 對操作的描述:即程序中對要做的事要指明它的操作步驟,也稱算法。
算法是程序的靈魂,也就是說,要計算機解決實際中的問題,“怎么解”是程序設計的關鍵。
2.1 算法的概念
(1)算法的定義
計算機算法:就是要計算機解決問題的操作步驟。
P13,例。
(2)算法的分類
計算機算法可分為兩類:數值算法和非數值算法。
P14,例。
2.2 簡單算法舉例
P14,例2.1。
注意:解決同一問題可有不同的算法,算法有優劣之分。
P15,例2.2。
注意:循環是算法中常用的手段。
2.3 算法的特性
算法具有如下特性:
(1)有窮性
即經過有限步就能夠完成。
P14,例2.1。P15,例2.2。
(2)確定性
即每一步都是確定的。
P14,例2.1。P15,例2.2。
(3)有零個或多個輸入
即一個算法必須輸入的數據可以是零個或多個。
P14,例2.1。P15,例2.2。
(4)有一個或多個輸出
即一個算法可以輸出一個或多個數據。
P14,例2.1。P15,例2.2。
(5)有效性
即算法中每一步驟都能有效地執行,并得到確定的結果。
P14,例2.1。P15,例2.2。
2.4 怎樣表示一個算法
算法的表示法有多種,敘述如下:
(1)用自然語言表示
即把算法用人們日常使用的語言表示出來。
P14,例2.1。P15,例2.2。
特點:常常具有不確定性,不宜采用。
(2)用流程圖表示
即把算法用一些特定的符號和圖形表示出來。
P20,例2.6,例2.7。
特點:這是一種較好的表示法,經常采用。
(3)用N-S圖表示
即把算法用一些特定的符號和圖形表示出來。
P26,例2.11,例2.12。
特點:這也是一種較好的表示法,經常采用。
(4)用偽代碼表示
即把算法用一些稱為偽代碼的文字和符號表示出來。
P29,例2.16,例2.17。
特點:這也是一種較好的表示法,經常采用。
(5)用計算機語言表示
即把算法用某種計算機語言符號表示出來。
P31,例2.20,例2.21。
特點:這當然是一種很好的表示法,可以輸入計算機執行。
2.5 結構化程序設計方法
算法有三種基本結構,它們是:
(1)順序結構:即算法的執行是按順序一步接著一步的執行。
(2)選擇結構:即算法的執行是對某些步驟可有選擇的執行。
(3)循環結構:即算法的執行是對某些步驟可有限次的重復執行。
這三種基本結構的流程圖見P23,圖2.14,圖2.15,圖2.16,圖2.17。用這三種基本結構設計程序稱為結構化程序設計。
結構化程序設計的方法指的是:
1 自頂向下
2 逐步細化
3 模塊化設計
4 結構化編碼
P32,例。
第3章 數據類型、運算符與表達式
3.1 C的數據類型
數據是程序的必要組成部分,也是程序處理的對象。C規定,在程序中使用的每一個數據必須屬于某一數據類型。
C語言中所有的數據類型見P38。
3.2 常量與變量
在程序運行過程中,值保持不變的量稱為常量,值可能發生變化的量稱為變量。
3.2.1 常量與符號常量
1. 常量
常量是日常所說的常數、字符、字符串等。
P38,例。
2. 符號常量
用#define定義的用標識符來表示的常量。
格式:#define 常量名 常量
功能:定義一個符號常量
P38,例3.1。
說明:常量名必須是一個標識符。
3.2.2 變量
1. 標識符
標識符是用來表示符號常量、變量、數組、函數、過程、類型及文件的名字的。
標識符的命名規則:
(1)以字母或下劃線開頭,由字母、數字和下劃線組成;
(2)不能與關鍵字同名,最好不要與庫函數名同名;
(3)長度無限定,但不同版本的C編譯時有自己的規定;
(4)區分大小寫。
P40,例。
2. 變量的聲明
格式:類型名 變量名,… ;
功能:聲明變量。
說明:(1)變量名必須是一個標識符,變量必須先聲明后使用;
(2)變量一旦聲明,系統就為它開辟一個相應類型的存儲空間;
(3)變量所占用的存儲空間的首地址稱為該變量的地址。
P40,例。
3. 變量的賦值
格式:變量名=表達式;
功能:把=號右邊表達式的值賦給=號左邊的變量。
P40,例。
3.3 整型數據
3.3.1 整型常量的表示方法
整型常量常用三種形式表示:
(1)十進制:直接寫;
(2)八進制:前加0;
(3)十六進制:前加0X或0x。
P41,例。
3.3.2 整型變量
1. 整型數據在內存中的存放形式
整型數據在內存中采用定點表示。
定點表示有原碼、反碼、補碼之分,一般在機內使用補碼。
原碼:最高位為符號位,小數點定在最低位之后,數值用二進制表示。
反碼:正數的反碼與原碼一樣,負數的反碼除符號位外各位取反。
補碼:正數的補碼與原碼一樣,負數的補碼是反碼加1。
例1:整數10的16位定點表示
因:(10)10=(1010)2
故:整數10的16位定點表示為
原碼:
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
反碼:
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
補碼:
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
例2:整數-10的16位定點表示
因:(-10)10=(-1010)2
故:整數-10的16位定點表示為
原碼:
1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
反碼:
1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1
補碼:
1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0
現代計算機一般用補碼表示。
2. 整型變量的分類
(1)有三種整型變量
整型: int
短整型:short [int]
長整型:long [int]
(2)整型變量的分類
每種整型變量都可以是無符號的,無符號前加unsigned,有符號前加signed或省缺,于是可有6類整型變量。
P42,例。
(3)整型變量占用的存儲空間及取值范圍
P43,表3.1。
3. 整型變量的聲明
格式:[unsigned] int|short|long 變量名,…;
功能:聲明整型變量。
P44,例,例3.2。
4. 整型數據的溢出
int型的取值范圍為-32768~32767(-215~215-1),超出這個范圍稱為溢出,此時可能輸出難以理解的結果。
P44,例,例3.3。
3.3.3 整型常量的類型
整型常量一般按整型數據的取值范圍自動劃定,但也可強制規定它是什么類型,規則是:
無符號整型后加u或U;
長整型后加l或L。
P45,(1)~(5)
3.4 實型數據
3.4.1 實型常量的表示方法
實型常量常用二種形式表示:
(1)十進制小數形式:直接寫,要有小數點,前或后至少要有一個數;
(2)指數形式:用e或E的前后加數據表示,前面是一個小數,后面是一個整數。
P45,例。
3.4.2 實型變量
1. 實型數據在內存中的存放形式
實型數據在內存中采用浮點表示
方法:設總位數為16,高12位為尾數,低4位為階碼。尾數與階碼最高位為符號位,尾數小數點定在最高位之后,階碼小數點定在最低位之后。
例1:實數10.0的16位浮點表示
因:(10.0)10=(0.1)10×10(2)10=(0.1)2×10(10)2
故:實數10.0的16位浮點表示為
0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0
例2:實數-10.0的16位浮點表示
因:(-10.0)10=(-0.1)10×10(2)10=(-0.1)2×10(10)2
故:實數-10.0的16位浮點表示為
1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0
注意:(1)位數一般實數是32位,表示法類似;
(2)階碼與尾數的位數不同的計算機有不同的規定。
(3)數據進行轉化表示時,尾數表示為±0.a…的形式,且a不為0,故表示是唯一的。
(4)以上階碼與尾數是原碼表示,實際上應轉成補碼。
2. 實型變量的分類
(1)有三種實型變量
單精度: float
雙精度: double
長雙精度:long double
(2)占用的存儲空間及取值范圍
P46,表3.2。
(3)實型變量的聲明
格式:float | double |long double 變量名,…;
功能:聲明實型變量。
P46,例。
3. 實型數據的舍入誤差
由于單精度實型只保留7位有效數據,故實型數據超出7位時會造成舍入誤差。
P47,例3.4。
3.4.3 實型常量的類型
實型常量一般按雙精度double來處理,但也可強制規定它是什么類型,規則是:
單精度后加f或F;
雙精度后加l或L。
P47,例。
3.5 字符型數據
3.5.1 字符常量
(1)一般字符常量
是用單撇號括起來的一個字符。
P48,例。
(2)特殊字符常量
是以反斜捍“\”開頭后跟一些字母或數字組成的字符。
P48,表3.3。
P49,例3.5。
3.5.2 字符變量
只有一種類型:char
聲明格式:char變量名,…;
字符變量可以用來存放一個字符。
P49,例。
3.5.3 字符數據在內存中的存放形式
字符型數據在計算機內以ASCII碼的形式存放,每個字符占用一個字節。
方法:查ASCII碼表,最高位填0。
例:字符’a’的存儲形式
因:(a)字符=(97)10進ASCII碼=(1100001)2進ASCII碼
故:字符’a’的存儲形式為
0 1 1 0 0 0 0 1
P50,例3.6,例3.7。
注意:一般字符的ASCII碼值范圍為0~127,無符號字符的ASCII碼值范圍為0~255。
3.5.4 字符串常量
(1)字符串常量
是用雙撇號括起來的若干個字符。
P52,例。
(2)字符串常量的存儲
字符串常量的存儲是每個字符占用一個字節,尾部再加一個\0作為結束符。于是長度為n的字符串占用n+1個字節的存儲空間。
P52,例。
3.6 變量賦初值
格式:類型名 變量名=常量表達式,… ;
功能:聲明變量并賦初值。
P53,例。
3.7 各類數值型數據間的混合運算
各類數值型數據間的混合運算時會自動進行轉換。
規則:(1)char,short型轉為int型;
(2)float型轉為double型;
(3)不同類型由低向高轉換,即int →unsigned →long →double
P54,圖3.10。
P54,例。
3.8 算術運算符與算術表達式
3.8.1 C的運算符簡介
C語言的運算符有13類,P55。
學習運算符注意如下幾點:
(1)運算符的功能:如+號運算的意義。
(2)與運算量的關系:如單目、雙目,運算量的類型等。
(3)運算的優先級:如先* /后+-。
(4)結合方向:如算術運算從左到右,賦值從右到左。
(5)結果的類型:如兩個整型數相加還是整型數。
3.8.2 算術運算符和算術表達式
1. 基本的算術運算符
基本的算術運算符有:+、-、*、/、%
P55,例。
注意:(1)+、-可作單目運算符,也可作雙目運算符。
(2)/ 運算對整形是封閉的,如5/3的值是1。
2. 算術運算符的優先級和結合方向
(1)優先級:①單目+、-②*、/、%③雙目+、-
(2)結合方向:從左到右
P55,例。
3. 強制類型轉換運算符
格式:(類型標識符)表達式
功能:把表達式強制為類型標識符指定的類型。
優先級:與單目+-相同。
注意:(1)強制轉換是一種單目運算;
(2)被強制轉換變量本身并未轉換。
P56,例,例3.8。
4. 自增、自減運算符
(1)運算符:+ +、--
(2)優先級:與單目+、-相同。
(3)結合方向:從右到左
P57,例。
注意:(1)自增與自減運算符只能用于變量;
(2)前+ +、--:先增值后引用;
后+ +、--:先引用后增值。
5. 有關表達式使用中的問題說明
表達式是把常量、變量、函數用各種運算符連接起來的合法的式子。C中的表達式簡練、高效,但有時會出現岐義性,使得程序理解有一定的困難,不同版本的C對表達式的解釋也有所不同。
P58,(1)~(3)
3.9 賦值運算符和賦值表達式
1. 賦值運算符
(1)運算符:=
(2)優先級:僅高于逗號“,”運算,低于其它運算。
(3)結合方向:從右到左
P59,例。
2. 類型轉換
當賦值運算兩邊的類型不一致,且都是數值類型或字符型時,會自動發生類型轉換,轉換以左邊變量的類型為準。
轉換規則:
(1)實型賦給整型:舍去小數。
(2)整型賦給實型:值不變。
(3)雙精度賦給單精度:取其前7位有效數字,反之值不變。P59,例。
(4)字符型賦給整型:低8位照搬,高8位視符號位補0或1。P60,例。
(5)整型賦給字符型:低8位照搬,高8位丟失。P60,例。
(6)整型賦給長整型:值不變,反之低16位照搬。P60,例。
(7)無符號型賦給有符號型:長度相同時最高位變為符號位,長度不同時高位補0或截去高位。P61,例。
(8)有符號型賦給無符號型:長度相同時最高位失去符號位,長度不同時高位補0或截去高位。P61,例。
P61,例3.9。
3. 復合的賦值運算
(1)運算符:+=、-=、*=、/=、%= 等
(2)優先級:與賦值運算“=”相同;
(3)結合方向:從右到左。
P62,例。
4. 賦值表達式
由賦值語句購成的表達式稱為賦值表達式,這種表達式還可以嵌套,從右到左逐一進行賦值運算,表達式的值是最后一次賦值的值。
P63,例。
注意:(1)結合方向是從右到左的;
(2)復合的賦值運算也可購成賦值表達式;
(3)賦值表達式可出現在輸出的語句中。
3.10 逗號運算符和逗號表達式
1. 逗號運算符
(1)運算符: ,
(2)優先級:最低;
(3)結合方向:從左到右。
P63,例。
2. 逗號表達式
格式:表達式1,表達式2,… ,表達式n
求解過程:從左到右逐一求表達式的值,整個表達式的值為最后一個表達式的值。
P64,例。