C語言程序設計課件word版_第1頁
C語言程序設計課件word版_第2頁
C語言程序設計課件word版_第3頁
C語言程序設計課件word版_第4頁
C語言程序設計課件word版_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、程序設計語言一般分為機器語言、匯編語言和高級語言三大類。1機器語言 對于計算機來說,一組機器指令就是程序,稱為機器語言程序。 2匯編語言 為了便于理解與記憶,人們采用能幫助記憶的英文縮寫符號(稱為指令助記符)來代替機器語言指令代碼中的操作碼,用地址符號來代替地址碼。 3高級語言 機器語言和匯編語言都是面向機器的語言,一般稱為低級語言。 例2.1 編寫一個C程序,其功能是顯示字符串“How do you do!”。其C程序如下:#include stdio.hmain() printf(How do you do!n);下面針對一般的C程序作幾點說明:(1)一個完整的C語言程序可以由多個函數(shù)組成

2、,但必須包含一個且只能包含一個名為main的函數(shù)(主函數(shù))。程序總是從main函數(shù)開始執(zhí)行。(2)在一個C函數(shù)模塊中,由左右花括號 括起來的部分是函數(shù)體,其中的語句系列實現(xiàn)函數(shù)的預定功能。(3)C程序中的每一個語句必須以“;”結(jié)束,但書寫格式是自由的。 (4)#include是編譯預處理命令,其作用是將雙引號或尖括號括起來的文件內(nèi)容讀到該命令的位置處。 (5)在C程序的任何位置處都可以用/* . */作注釋,以提高程序的可讀性。 整型常量及其變量的定義1整型常量 在C語言中,有3種類型的整型常量:基本整型常量、長整型常量、無符號整型常量。 在C語言中,不管是哪種類型的整型常量,都可以用3種數(shù)制

3、表示。 (1)十進制整型常量。 (2)十六進制整型常量。 (3)八進制整型常量。 2整型變量的定義 在C程序中,用于存放整型數(shù)據(jù)的變量稱為整型變量。在C語言中,可以定義基本整型、長整型、短整型和無符號整型等4種類型的整型變量。它們的定義方式如下。(1)基本整型變量 定義基本整型變量的形式如下: int 變量表列;(2)長整型 定義長整型變量的形式如下: long int 變量表列;(3)短整型定義短整型變量的形式如下: short int 變量表列;(4)無符號整型定義無符號基本整型變量的形式如下: unsigned int 變量表列; 一個類型說明語句可以同時定義多個同類型的變量,各變量之間

4、用逗號“,”分隔。 用類型說明語句定義的變量只是說明了為這些變量分配了存儲空間,以便用于存放與之相同類型的數(shù)據(jù),在未對這些變量賦值前,這些變量中(即存儲空間中)的值是隨機的。 C語言允許在定義變量的同時為變量賦初值。 在為整型變量初始化或賦值時,C編譯系統(tǒng)自動將被賦數(shù)據(jù)轉(zhuǎn)換成與相應變量的類型一致。 由于各種整型變量所占的字節(jié)數(shù)有限,因此,它們所能存放的整數(shù)有一定的范圍。 實型常量及其變量的定義1實型(浮點型)常量(1)十進制數(shù)形式(2)指數(shù)形式(科學記數(shù)法)2實型變量的定義在C程序中,用于存放實型數(shù)據(jù)的變量稱為實型變量。在C語言中,實型變量有單精度與雙精度兩種。 單精度 float 雙精度 d

5、ouble 字符型常量及其變量的定義1字符型常量 n 換行 r 回車 b 退格 t 制表(橫向跳格) 單引號(單撇號) 雙引號(雙撇號) ddd 13位八進制數(shù)所代表的ASCII碼字符 xhh 12位十六進制數(shù)所代表的ASCII碼字符 f 走紙換頁 反斜杠字符2字符型變量的定義字符型變量的定義方式如下:char 變量表列;數(shù)據(jù)的輸入與輸出應包括以下幾項: 輸入(出)的設備 輸入(出)的格式 輸入(出)的內(nèi)容格式輸出函數(shù) 格式輸出函數(shù)的一般形式如下: printf(*“格式控制”,輸出表); 其中格式控制部分要用一對雙撇號括起來,它用于說明輸出項目所采用的格式。 1整型格式說明符(1)十進制形式

6、 (2)八進制形式(3)十六進制形式2實型格式說明符如果以十進制數(shù)形式輸出實型數(shù)據(jù),其格式說明符為 %f 或 %m.nf如果以指數(shù)形式輸出實型數(shù)據(jù),其格式說明符為 %e 或 %m.ne3字符型格式說明符 字符型數(shù)據(jù)的格式說明符為 %c 或 %mc (1)輸出表中各輸出項目之間要用“,”分隔。 (2)格式控制中的各格式說明符與輸出表中的各輸出項目在個數(shù)、次序、類型等方面必須一一對應。 (3)格式控制中除格式說明符外的其他字符將按原樣輸出。 (4)在輸出格式說明符中,如果帶有寬度說明,則在左邊沒有數(shù)字的位置上用空格填滿(即輸出的數(shù)字是右對齊)。但如果在寬度說明前加一個負號(),則輸出為左對齊,即在

7、右邊補空格。 格式輸入函數(shù)格式輸入函數(shù)的一般形式如下: scanf(“格式控制”,內(nèi)存地址表);1整型格式說明符(1)十進制形式 用于輸入十進制形式的整型數(shù)據(jù)。(2)八進制形式用于輸入八進制形式的整型數(shù)據(jù)。(3)十六進制形式用于輸入十六進制形式的整型數(shù)據(jù)。2實型格式說明符用于輸入的單精度實型格式說明符為 %f 或 %e用于輸入的雙精度實型格式說明符為 %lf3字符型格式說明符用于輸入的字符型格式說明符為 %c 或 %mc賦值運算賦值運算符為“”。賦值表達式為變量名表達式(1)在C語言中,“”為賦值運算符,而不是等號;(2)賦值運算符“”左邊必須是變量名,不能是表達式;(3)賦值運算符“”兩端的

8、類型不一致時,系統(tǒng)將自動進行類型轉(zhuǎn)換。算術(shù)運算 在C語言中,基本的算術(shù)運算符有以下幾個: 加法運算符(雙目運算符),或正值運算符(單目運算符)。如xy,x。 減法運算符(雙目運算符),或負值運算符(單目運算符)。如a3,x。 * 乘法運算符(雙目運算符)。如3*x。 / 除法運算符(雙目運算符)。如x/y。 % 模余運算符(雙目運算符)。只適用于整型數(shù)據(jù),如9%4的值為1,11%3的值為2等。關(guān)系運算在C語言中,基本的關(guān)系運算符有以下6個: 小于 小于或等于 大于 大于或等于 等于! 不等于結(jié)果只有兩個:true 或者 false 執(zhí)行int x2,y3;后表達式x(y3)的值是( 1 )邏輯

9、運算 在C語言中,邏輯常量只有兩種:值非零表示“真”,值為零表示“假”。其基本的邏輯運算符有以下3個: & (邏輯與) 兩個量都為真時為真(1),否則為假(0) | | (邏輯或) 兩個量中只要有一個為真時為真(1),只有都為假時為假(0) ! (邏輯非) 一個量為真時為假(0),假時為真(1)自增與自減運算符 增1運算符“”和減1運算符“”是兩個單目(只有一個運算對象)運算符,它們的運算對象只能是整型或字符型變量。 增1運算符是將運算對象的值增1;減1運算符是將運算對象的值減1。 假設定義變量 int a= 5;int b;前綴自增 b = +a;/ a=6 b=6后綴自增 b = a+;/

10、 a=6 b=5sizeof運算符sizeof運算符有以下兩種用法:(1)用于求得表達式計算結(jié)果所占內(nèi)存的字節(jié)數(shù)。其一般形式為 sizeof 表達式(2)用于求得某種數(shù)據(jù)類型的量所占內(nèi)存的字節(jié)數(shù)。其一般形式為 sizeof(類型名)逗號運算符 逗號“,”是C程序中常見的符號。 在C語言中,逗號除作為分隔符使用外,還可以作為運算符來使用,稱為逗號運算符。 逗號表達式的一般形式為子表達式1,子表達式2,子表達式n在使用逗號運算符(逗號表達式)時,要注意以下幾點: (1)逗號運算符是所有運算符中級別最低的一種運算符。 (2)一個逗號表達式又可以與另一個表達式(可以是逗號表達式,也可以不是逗號表達式)

11、連接成新的逗號表達式。 (3)在許多情況下,使用逗號表達式的目的僅僅是為了得到各個子表達式的值,而并不一定要得到或使用整個逗號表達式的值。 C語言中的宏定義有兩種形式:符號常量定義與帶參數(shù)的宏定義。 符號常量定義 在C語言中,允許將程序中多處用到的“字符串”定義成一個符號常量。在C語言中定義符號常量的一般形式如下:#define 符號常量名 字符串 由于C語言中的所有變量名、函數(shù)名等都使用小寫字母,因此,符號常量名一般用大寫字母表示,以便與C語言中的保留關(guān)鍵字相區(qū)別。 C編譯系統(tǒng)對定義的符號常量的處理只是進行簡單的替換,不作任何語法檢查。 #define 是一個命令,而不是語句,因此在行末不能

12、加“;”,并且應獨立占一行。 #define 命令一般應出現(xiàn)在程序中函數(shù)的外面,其作用域范圍是從#define 符號常量名 字符串到#undef 符號常量名(或文件末)帶參數(shù)的宏定義 帶參數(shù)的宏定義的一般形式為 #define 宏名(參數(shù)表) 字符串 其中字符串中應包含在參數(shù)表中所指定的參數(shù),并且,當參數(shù)表中的參數(shù)多于一個時,各參數(shù)之間要用逗號分隔。在使用帶參數(shù)的宏定義時,應注意以下兩個問題。(1)在使用帶參數(shù)的宏定義時,一般應將宏定義字符串中的參數(shù)都要用括號括起來,否則經(jīng)過宏展開后,可能會出現(xiàn)意想不到的錯誤。 (2)在使用帶參數(shù)的宏定義時,除了應將宏定義字符串中的參數(shù)都要用括號括起來,還需要

13、將整個字符串部分也要用括號括起來,否則經(jīng)過宏展開后,還會可能出現(xiàn)意想不到的錯誤。書寫一個求最大值的宏定義# define MAX(a , b) (ab)? (a) ,(b)3.1 語句與復合語句 在C語言中,一個表達式后面跟隨一個分號就構(gòu)成了一個語句,這種語句稱為表達式語句。 在C語言中,分號(;)是表達式語句的終結(jié)符,而不是語句之間的分隔符,也就是說,分號是表達式語句的一個組成部分,只不過它位于表達式的后面。 在一個函數(shù)體內(nèi)部,由左、右花括號括起來的語句稱為復合語句,它的一般形式為說明部分;語句部分;3.2 if 語 句If 語句的形式為 if (表達式) 語句這種選擇結(jié)構(gòu)的流程圖如圖3.1

14、所示。下面對if語句作幾點說明:(1)if語句中的邏輯表達式(即條件)必須要用一對圓括號括起來。 (2)if語句后的語句可以是復合語句。 (3)一個if語句 最后需要強調(diào)的是,在使用if語句時,一定要注意邏輯表達式的正確寫法,特別是在連續(xù)使用多個if語句時更要注意。3.3 ifelse結(jié)構(gòu) 在C語言中,ifelse結(jié)構(gòu)的語句形式為 if (表達式) 語句1 else 語句2下面對ifelse結(jié)構(gòu)作以下幾點說明: (1)ifelse結(jié)構(gòu)中的語句1與語句2都可以是復合語句。 (2)在ifelse結(jié)構(gòu)中,語句1與語句2都可以是空語句。 (3)在ifelse結(jié)構(gòu)中,如果在else前面有多個if語句,則

15、else與最近的if配對。(4)如果有多個ifelse結(jié)構(gòu)嵌套如下: if (表達式1) 語句1 else if (表達式2) 語句2 else else if (表達式n) 語句n else 語句n1則可簡寫成 if (表達式1) 語句1 else if (表達式2) 語句2 else if (表達式n) 語句n else 語句n1在ifelse結(jié)構(gòu)中,如果語句1與語句2都是單一的賦值語句,并且都是給同一個變量賦值,則可以用條件運算符來進行處理。 下面對條件表達式作幾點說明:(1)條件運算符優(yōu)先級要比賦值運算符高。 (2)條件運算符的優(yōu)先級比關(guān)系運算符與算術(shù)運算符都要低,因此,條件表達式中的

16、“表達式1”、“表達式2”與“表達式3”都不必用括號括起來。 (3)條件運算符的結(jié)合方向為“從右到左”。 在C語言中提供了一個直接實現(xiàn)多路分支選擇的結(jié)構(gòu),稱為switch結(jié)構(gòu),其一般形式如下:switch(表達式) case 常量表達式1: 語句1 case 常量表達式2: 語句2 case 常量表達式n: 語句n default : 語句n1 下面對switch結(jié)構(gòu)作幾點說明: (1)switch結(jié)構(gòu)中的表達式、常量表達式1、L、常量表達式n必須是整型或字符型。這是因為,在switch結(jié)構(gòu)中,其分支數(shù)一般是有限的,并且是離散的,因此,其表達式的值也應是有限的,且是離散的。 (2)同一個swi

17、tch結(jié)構(gòu)中的常量表達式值必須互不相同,否則就會出現(xiàn)矛盾的現(xiàn)象,即對于“表達式”的同一個值對應多種執(zhí)行方案,這是錯誤的。(3)在switch結(jié)構(gòu)中,case 與 default 的順序可以任意,各case之間 的順序也可以任意。 (4)在執(zhí)行switch結(jié)構(gòu)時,當執(zhí)行完某case 后的語句后,將順序執(zhí)行后面case 后的語句,直到遇 break 語句才退出整個switch 結(jié)構(gòu)的執(zhí)行。 (5)在switch結(jié)構(gòu)中,如果沒有default 且“表達式”值不等于任何case 后常量表達式的值,則直接退出switch 結(jié)構(gòu)而轉(zhuǎn)到其后的語句執(zhí)行。例3.12 計算獎金。 當企業(yè)利潤P等于或低于0.5萬元

18、時,獎金為利潤的1%;當0.5P1萬元時,超過0.5萬元部分的獎金為利潤的1.5%,0.5萬元以下仍按1%計算;當1P2萬元時,1萬元以下部分仍按前面的方法計算,超過1萬元的部分其獎金按利潤的2%計算;當2P5萬元時,2萬元以下部分仍按前面的方法計算,超過2萬元部分的獎金按利潤的2.5%計算;當5P10萬元時,5萬元以下部分仍按前面的方法計算,超過5萬元部分的獎金按利潤的3%計算;當P10萬元時,10萬元以下部分仍按前面的方法計算,超過10萬元部分按3.5%計算。其中P由鍵盤輸入,計算并輸出相應的獎金數(shù)W。根據(jù)圖3.5所示的流程圖,用ifelse if結(jié)構(gòu)寫出C程序如下:#include st

19、dio.hmain() float p,w; printf(input p: ); scanf(%f,&p); if (p0.0) w0.0; else if (p0.5) w0.01*p; else if (p1.0) w0.0050.015*(p0.5); else if (p2.0) w0.01250.02*(p1.0); else if (p5.0) w0.03250.025*(p2.0); else if (p10.0) w0.10750.03*(p5.0); else w0.25750.035*(p10.0); printf(w%fn,w);例3.14 求解一元二次方程Ax2BxC

20、0。相應的C程序如下:#include stdio.h#include math.hmain() double a,b,c,d,x1,x2,p; printf(input a,b,c: ); scanf(%lf%lf%lf,&a,&b,&c); if (a0.0) if (b0.0) printf(ERRn); else printf(X%fn,c/b); else if (b0.0) dc/a; if (d0.0) printf(X1%fn,sqrt(d); printf(X2%fn,sqrt(d); else printf(X1j%fn,sqrt(d); printf(X2j%fn,sqr

21、t(d); else if (c0.0) printf(X10.0n); printf(X2%fn,b/a); else db*b4*a*c; if (d0.0) dsqrt(d); if (b0.0) x1(bd)/(2*a); else x1(bd)/(2*a); x2c/(a*x1); printf(X1%fn,x1); printf(X2%fn,x2); else dsqrt(d)/(2*a); pb/(2*a); printf(X1%fj%fn,p,d); printf(X2%fj%fn,p,d); 當型循環(huán)結(jié)構(gòu)當型循環(huán)結(jié)構(gòu)的流程圖如圖4.1所示。while循環(huán)實現(xiàn)當型循環(huán)結(jié)構(gòu)的C語

22、句形式為 while (表達式) 循環(huán)體語句 功能:當表達式值0時,執(zhí)行循環(huán)體,執(zhí)行完后繼續(xù)判斷表達式值,只有當表達式值0時才退出循環(huán)。例4.2 從鍵盤輸入各學生成績,并對90分以上(包括90分)的學生人數(shù)進行計數(shù),直到輸入的成績?yōu)樨摓橹梗詈筝敵龀煽冊?0分以上的學生人數(shù)。其流程圖如圖4.3所示。其中變量count為整型,用于對90分以上的學生人數(shù)進行計數(shù)。相應的C程序如下:#include stdio.hmain() int count; float grade; count0; scanf(%f,&grade); while (grade0.0) if (grade90.0) count

23、count1; scanf(%f,&grade); printf(count%dn,count);直到型循環(huán)結(jié)構(gòu)直到型循環(huán)結(jié)構(gòu)的流程圖如圖4.4所示。do_while循環(huán)do_ while循環(huán)的執(zhí)行過程是,首先執(zhí)行循環(huán)體,然后判斷條件(即計算邏輯表達式),如果條件滿足(即邏輯表達式值為真),則退出循環(huán)結(jié)構(gòu);如果條件不滿足(即邏輯表達式值為假),則繼續(xù)執(zhí)行循環(huán)體。 實現(xiàn)直到型循環(huán)結(jié)構(gòu)的C語句形式為do 循環(huán)體語句 while(表達式); 功能:先執(zhí)行循環(huán)體,然后判斷表達式值,若表達式值0,則再次執(zhí)行循環(huán)體,如此循環(huán),直到表達式值0為止。例4.3 計算并輸出下列級數(shù)和:直到某項的絕對值小于 為止相

24、應的流程圖如圖4.5所示。其中f用于改變每一項的符號,因為這是一個各項符號相間的級數(shù)。相應的C程序如下:#include stdio.hmain() int k; double sum,d,f; sum1.0; k1;f1.0; do kk1;ff;d1.0/(k*(k1);sumsumf*d; while(d1.0e4); printf(sum%lfn,sum);當型循環(huán)結(jié)構(gòu)與直到型循環(huán)結(jié)構(gòu)的區(qū)別與聯(lián)系 當型循環(huán)結(jié)構(gòu)與直到型循環(huán)結(jié)構(gòu)既有共同之處,又有區(qū)別。主要體現(xiàn)在以下幾個方面。(1)在while循環(huán)中,其循環(huán)體可以一次也不執(zhí)行(即執(zhí)行while循環(huán)結(jié)構(gòu)的一開始,其條件就不滿足)。 (2)不

25、管是while循環(huán)結(jié)構(gòu)還是dowhile循環(huán)結(jié)構(gòu),在循環(huán)體內(nèi)部必須要有能改變條件(即邏輯表達式值)的語句,否則將造成死循環(huán)。 (3)對于有些問題既可以用while循環(huán)結(jié)構(gòu)來處理,也可以用dowhile循環(huán)結(jié)構(gòu)來處理。(4)不管是while循環(huán)結(jié)構(gòu)還是dowhile循環(huán)結(jié)構(gòu),其循環(huán)體如果包含一個以上的語句,應以復合語句形式出現(xiàn)。C語言提供的for循環(huán)屬于當型循環(huán)結(jié)構(gòu),其一般形式為for(表達式1;表達式2;表達式3) 循環(huán)體語句(組)它等價于下列的當型循環(huán)結(jié)構(gòu):表達式1;while(表達式2) 循環(huán)體語句 表達式3; 下面對for循環(huán)語句作幾點說明: (1)在for語句中,三個表達式中的任何一個

26、表達式均可省略,但其中的兩個“;”不能省略。 (2)下列兩個循環(huán)都是死循環(huán): for(表達式1;表達式3) 循環(huán)體與 for(;) 循環(huán)體 因為它們都沒有用于判斷循環(huán)是否結(jié)束的條件(即表達式2)。 (3)for循環(huán)本質(zhì)上也是當型循環(huán)結(jié)構(gòu),只不過它對于事先可以確定循環(huán)次數(shù)的問題特別方便。 (4)在for循環(huán)中,循環(huán)體也可以是復合語句(即用一對花括號 括起來的語句組)。循環(huán)的嵌套 所謂循環(huán)的嵌套是指一個循環(huán)體內(nèi)又包含了另一個完整的循環(huán)結(jié)構(gòu)。C語言允許循環(huán)結(jié)構(gòu)嵌套多層。循環(huán)的嵌套結(jié)構(gòu)又稱為多重循環(huán)。例4.6 計算并輸出10以內(nèi)(包括10)所有自然數(shù)的階乘值。即計算1!,2!,3!,4!,5!,6!,

27、7!,8!,9!,10!。采用的方法是,對于10以內(nèi)的每一個自然數(shù)分別求它們的階乘值。其流程圖如圖4.7所示。顯然,這是一個二重循環(huán)結(jié)構(gòu)。相應的C程序如下:#include stdio.hmain() int n,k; double s; for (n1; n10; nn1) s1.0; for (k1; kn; kk1) ss*k; printf(%2d!%16.7fn ,n,s); break 語句C語言中的break語句有以下兩個功能:(1)跳出 switch 結(jié)構(gòu);(2)退出當前循環(huán)結(jié)構(gòu),包括 while 結(jié)構(gòu)、 dowhile 結(jié)構(gòu)和for循環(huán)結(jié)構(gòu)。continue 語句 conti

28、nue語句的功能是結(jié)束本次循環(huán)的執(zhí)行,但不退出循環(huán)結(jié)構(gòu)。 下面舉兩個例子來說明continue語句的使用。例4.10 輸出100200之間所有能被7或9整除的自然數(shù)。相應的C程序如下:#include stdio.hmain() int n; for (n100; n200; nn1) if (n%7!0)&(n%9!0) continue; /*結(jié)束本次循環(huán),繼續(xù)進行下次循環(huán)*/ printf(%d n,n); 實際上,上述程序等價于#include stdio.hmain() int n; for (n100; n200; nn1) if (n%70) | | (n%90) printf(

29、%d n,n); 函數(shù)的概念 在C語言中,函數(shù)分為以下兩種。 (1)標準庫函數(shù) 這種函數(shù)用戶不必定義,但可直接使用。例如scanf() , printf() , fabs() , sqrt() ,exp(),sin(),cos()等都是C語言中常用的庫函數(shù)。 (2)用戶自己定義的函數(shù) 這種函數(shù)用以解決用戶的專門問題,一般由用戶自己編寫。例5.1 從鍵盤輸入兩個正整數(shù)m與n(mn),求 的值(即求 )。 其C程序如下:#include stdio.hmain() /*主函數(shù)*/ int m,n; int p(); /*說明本函數(shù)中要調(diào)用的函數(shù)p()是整型*/ scanf(%d,%d,&m,&n)

30、; if (mn) printf(%dn,p(m)/p(mn); else printf(mn ! n);int p(k) /*計算階乘值的函數(shù)*/int k; int s,i; s1; for (i1; ik; ii1) ss*i; return(s);下面對函數(shù)作幾點說明: (1)一個完整的C程序可以由若干個函數(shù)組成,其中必須有一個且只能有一個主函數(shù)main()。 (2)一個完整C程序中的所有函數(shù)可以放在一個文件中,也可以放在多個文件中。 在編譯命令行中鍵入各個函數(shù)所在的文件名(各文件名之間用空格分隔)。 在主函數(shù)中用 #include 語句將各函數(shù)所在的文件包含進來。 (3)C語言中的函

31、數(shù)沒有從屬關(guān)系,各函數(shù)之間互相獨立,可以互相調(diào)用。 函數(shù)的定義 在C語言中,函數(shù)定義的一般形式為 類型標識符 函數(shù)名(形參表列) 形參類型說明 說明部分 語句部分 在定義C函數(shù)時要注意以下幾點。(1)函數(shù)類型標識符同變量類型說明符,它表示返回的函數(shù)值類型。 (2)如果省略函數(shù)的類型標識符,則默認為是int型。 (3)C語言允許定義空函數(shù)。如dummy() (4)函數(shù)中返回語句的形式為return(表達式);或return 表達式;(5)如果“形參表列”中有多個形式參數(shù),則它們之間要用“,”分隔。(6)C語言允許在形參表中直接對形參的類型進行說明。 函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式為函數(shù)名(實參表列

32、)(1)函數(shù)調(diào)用可以出現(xiàn)在表達式中(有函數(shù)值返回);也可以單獨作為一個語句(無函數(shù)值返回)。(2)實參表中的各實參可以是表達式,但它們的類型和個數(shù)應與函數(shù)中的形參一一對應。 (3)在調(diào)用函數(shù)中,通常要對被調(diào)用函數(shù)的返回值類型進行說明(一般在調(diào)用函數(shù)的函數(shù)體中的說明部分),包括函數(shù)類型、函數(shù)名和一對圓括號。 例5.2 下列程序的功能是計算輸出一個圓臺兩底面積之和。#include stdio.hmain() double r1,r2; double q(); printf(input r1 ,r2: ); scanf(%lf,%lf,&r1,&r2); printf(s%fn,q(r1,r2);

33、double q(x,y)double x,y; double s; s3.1415926*(x*xy*y); return(s);但C語言規(guī)定,在以下幾種情況下可以不在調(diào)用函數(shù)中對被調(diào)用函數(shù)作類型說明: 被調(diào)用函數(shù)為整型或字符型,自動按整型處理。 被調(diào)用函數(shù)的定義出現(xiàn)在調(diào)用函數(shù)之前。 在調(diào)用函數(shù)之前已經(jīng)由別的函數(shù)(它可能也要調(diào)用該被調(diào)用函數(shù))對被調(diào)用函數(shù)作了類型說明。 (4)C語言雖不允許嵌套定義函數(shù),但可以嵌套調(diào)用函數(shù)。 形參與實參的結(jié)合方式1地址結(jié)合 所謂地址結(jié)合,是指在一個模塊調(diào)用另一個模塊時,并不是將調(diào)用模塊中的實參值直接傳送給被調(diào)用模塊中的形參,而只是將存放實參的地址傳送給形參。

34、2數(shù)值結(jié)合 所謂數(shù)值結(jié)合,是指調(diào)用模塊中的實參地址與被調(diào)用模塊中的形參地址是互相獨立的,在一個模塊調(diào)用另一個模塊時,直接將實參值傳送給形參被存放在形參地址中。 例5.3 分析下列C程序:void swap(x,y)int x,y; int t; tx; xy; yt; return; #include stdio.hmain() int x,y; scanf(x%d,y%d,&x,&y); swap(x,y); printf(x%d,y%dn,x,y);在這個程序中共有兩個函數(shù)。在主函數(shù)中分別為整型變量x與y輸入數(shù)據(jù),然后調(diào)用函數(shù)swap(x,y)。而函數(shù)swap(x,y)的功能是實現(xiàn)變量x值

35、與y值的交換。但在實際運行該程序時,如果從鍵盤輸入x6,y8則輸出的結(jié)果為x6,y8 即沒有達到交換的目的。這是因為在主函數(shù)中調(diào)用函數(shù)swap()時,只是將實參x和y的值分別傳遞給了swap()函數(shù)中的形參x和y,但由于主函數(shù)中的實參x和y與函數(shù)swap()中的形參x和y在計算機中的存儲地址是不同的,因此,在函數(shù)swap()中雖然交換了形參x與y的值,但實參x與y的值實際上沒有改變,即它們沒有被交換。由此可以看出,在形參與實參為數(shù)值結(jié)合的情況下,實參與形參在計算機內(nèi)存中的存儲地址不是同一個,因此,即使在被調(diào)用函數(shù)中改變了形參值,調(diào)用函數(shù)中的實參值也是不會被改變的。 局部變量與全局變量1局部變量

36、 在函數(shù)內(nèi)部定義的變量稱為局部變量。函數(shù)內(nèi)部定義的變量只在該函數(shù)范圍內(nèi)有效,因此,不同函數(shù)中的局部變量可以重名,互不混淆。2全局變量 在函數(shù)外定義的變量稱為全局變量除非十分必要,一般不提倡使用全局變量,其原因有以下幾點: 由于全局變量屬于程序中的所有函數(shù),因此,在程序的執(zhí)行過程中,全局變量都需要占用存儲空間,即使實際正在執(zhí)行的函數(shù)中根本用不著這些全局變量,它們也要占用存儲空間。 在函數(shù)中使用全局變量后,要求在所有調(diào)用該函數(shù)的調(diào)用程序中都要使用這些全局變量,從而會降低函數(shù)的通用性。 在函數(shù)中使用全局變量后,使各函數(shù)模塊之間的互相影響比較大,從而使函數(shù)模塊的“內(nèi)聚性”差,而與其他模塊的“耦合性”強

37、。 在函數(shù)中使用全局變量后,會降低程序的清晰性,可讀性差。動態(tài)存儲變量與靜態(tài)存儲變量1用戶程序的存儲分配一般來說,用戶程序在計算機中的存儲分配如圖5.1所示。其中: 程序區(qū)用于存放程序; 靜態(tài)存儲區(qū)是在程序開始執(zhí)行時就分配的固定存儲單元,如全局變量; 動態(tài)存儲區(qū)是在函數(shù)調(diào)用過程中進行動態(tài)分配的存儲單元,如函數(shù)形參、自動變量、函數(shù)調(diào)用時的現(xiàn)場保護和返回地址等。2變量的存儲類型 數(shù)據(jù)類型:如整型(int)、實型(float)、字符型(char)、雙精度型(double)等。 數(shù)據(jù)的存儲類型:分為自動類型(auto)、靜態(tài)類型(static)、寄存器類型(register)、外部類型(extern)

38、。 例5.4 計算并輸出15的階乘值。其C程序如下:int fac(n) int n; static int f1; ff*n; return(f);#include stdio.hmain() int i; for (i1; i5; ii1) printf(%d!%dn,i,fac(i);下面對靜態(tài)存儲變量作幾點說明: 形參不能定義成靜態(tài)類型。 對局部靜態(tài)變量賦初值是在編譯時進行的,在調(diào)用時不再賦初值;而對自動變量賦初值是在調(diào)用時進行的,每次調(diào)用將重新賦初值。 定義局部靜態(tài)變量時若不賦初值,則在編譯時將自動賦初值0;但在定義自動變量時若不賦初值,則其初值為隨機值。 若無多大必要,盡量不用局部

39、靜態(tài)變量。3外部變量 全局變量如果在文件開頭定義,則在整個文件范圍內(nèi)的所有函數(shù)都可以使用該變量。 一般來說,全局變量有以下幾種用法: 在同一文件中,為了使全局變量定義點之前的函數(shù)中也能使用該全局變量,則應在函數(shù)中用extern加以說明。 使一個文件中的函數(shù)也能用另一個文件中的全局變量。 利用靜態(tài)外部變量,使全局變量只能被本文件中的函數(shù)引用。 內(nèi)部函數(shù)與外部函數(shù) 在C語言中,函數(shù)可以分為內(nèi)部函數(shù)與外部函數(shù)。只能被本文件中其他函數(shù)調(diào)用的函數(shù)稱為內(nèi)部函數(shù),內(nèi)部函數(shù)又稱為靜態(tài)函數(shù)。 定義內(nèi)部函數(shù)的形式如下: static 類型標識符 函數(shù)名(形參表) 定義外部函數(shù)的形式如下:extern 類型標識符

40、函數(shù)名(形參表)人們在解決一些復雜問題時,為了降低問題的復雜程度(如問題的規(guī)模等),一般總是將問題逐層分解,最后歸結(jié)為一些最簡單的問題。 例5.5 編寫一個C函數(shù),對于輸入的參數(shù)n,依次打印輸出自然數(shù)1到n。 這是一個很簡單的問題,實際上不用遞歸就能解決,其C函數(shù)如下:#include stdio.hwrt(int n) int k; for (k1;kn;k) printf(%dn,k); return;解決這個問題還可以用以下的遞歸函數(shù)來實現(xiàn):#include stdio.hwrt1(int n) if (n!0) wrt1(n1); printf(%dn,n); return;功能:對于

41、輸入的參數(shù)n,依次打印輸出自然數(shù)1到n自己調(diào)用自己的過程稱為遞歸調(diào)用過程。在C語言中,自己調(diào)用自己的函數(shù)稱為遞歸函數(shù)。 遞歸分為直接遞歸與間接遞歸兩種。 所謂直接遞歸,是指直接調(diào)用函數(shù)本身。 例5.6 編寫一個函數(shù),其功能是判斷給定的正整數(shù)是否是素數(shù),若是素數(shù)則返回函數(shù)值1,否則返回函數(shù)值0。 其C函數(shù)如下:#include math.hsushu(int n) int k,i,flag; ksqrt(double)n); i2; flag0; while (ik)&(flag0) if (n%i0) flag1; ii1; return(!flag);例5.8 Hanoi塔問題。 相傳古代印

42、度有一座Bramah廟,廟中有三根插在黃銅板上的寶石柱,在其中的一根柱子上放了64個金盤子,大盤在下,小盤在上,稱為Hanoi塔。有一天,廟里的和尚們想把這些盤子從一根柱子上移到另一根柱子上,規(guī)定每次只允許移動一個盤子,并且,在移動過程中都不允許出現(xiàn)大盤子壓在小盤子上面的現(xiàn)象,但在移動盤子的過程中可以利用三根柱子中的任何一根。 為了使問題具有普遍性,假設圓盤數(shù)為n,按直徑從小到大依次編號為1,2,n;三根柱子的名稱分別為X,Y,Z。開始時,n個圓盤按從大到小的順序(即下面放大圓盤,上面放小圓盤)放在X柱子上,現(xiàn)在要將X柱子上的n個圓盤移到Z柱子上,其移動的原則如上所述。這個問題稱為n階Hano

43、i塔問題??梢詫懗鯟程序如下:#include stdio.hmain() int n; char xX,yY,zZ; void hanoi(); printf(input n); scanf(%d,&n); hanoi(n,x,y,z);void hanoi(n,x,y,z)int n;char x,y,z; void move();if (n1) move(x,n,z); else hanoi(n1,x,z,y); move(x,n,z); hanoi(n1,y,x,z); return;void move(x,n,z)int n;char x,z; printf(%c(%d)%cn,x,

44、n,z);編譯預處理功能是C語言的一個重要特點。所謂編譯預處理,是指C語言編譯系統(tǒng)首先對程序模塊中的編譯預處理命令進行處理。 C語言提供的編譯預處理命令主要有以下3種: (1)宏定義; (2)文件包含命令; (3)條件編譯命令。 編譯預處理命令一般是在函數(shù)體的外面。正確使用編譯預處理命令,可以編寫出易于調(diào)試、易于移植的程序模塊。文件包含命令 文件包含是指一個源文件可以將另一個指定的源文件包括進來。 文件包含命令的一般形式為 #include 文件名或 #include 文件名 其功能是將指定文件中的全部內(nèi)容讀到該命令所在的位置后一起被編譯。在使用文件包含命令時,要注意以下幾個問題:(1)當#i

45、nclude命令指定的文件中的內(nèi)容改變時,包含這個文件的所有源文件都應該重新進行編譯處理;(2)一個#include命令只能指定一個被包含文件,如果需要包含多個文件,則要用多個#include命令實現(xiàn);(3)被包含的文件應該是源文件,不能是經(jīng)編譯后的目標文件;(4)文件包含可以嵌套使用,即被包含的文件中還可以使用#include命令;(5)由#include命令所指定的文件中可以有任何語言成分,因此,通??梢詫⒔?jīng)常使用的、具有公用性質(zhì)的符號常量、帶參數(shù)的宏定義以及外部變量等集中起來放在這種文件中,以盡量避免一些重復操作。6.1 一維數(shù)組 一維數(shù)組的定義與引用 定義一維數(shù)組的一般形式如下: 類型

46、說明符 數(shù)組名常量表達式; 其中類型說明符是定義數(shù)組中各元素的數(shù)據(jù)類型,常量表達式是說明數(shù)組的大?。磾?shù)組中元素的個數(shù)。 數(shù)組的說明與變量的說明一樣,其作用是為數(shù)組分配存儲空間。關(guān)于數(shù)組的說明要注意以下幾個問題:(1)數(shù)組名的命名規(guī)則與變量名相同。(2)說明數(shù)組大小的常量表達式必須為整型,并且用方括號括起來(不能用圓括號)。(3)說明數(shù)組大小的常量表達式中可以包含符號常量,但不能是變量。 例6.1 下面的程序說明了如何對數(shù)組定義和引用數(shù)組元素:#include stdio.h#define N 5main() int i, aN; for (i0; iN; ii1) aii; for (i0; iN; ii1)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論