C語言實驗教程(中)清華大學(xué)ppt課件_第1頁
C語言實驗教程(中)清華大學(xué)ppt課件_第2頁
C語言實驗教程(中)清華大學(xué)ppt課件_第3頁
C語言實驗教程(中)清華大學(xué)ppt課件_第4頁
C語言實驗教程(中)清華大學(xué)ppt課件_第5頁
已閱讀5頁,還剩143頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C言語實驗教程(中)第六章 循環(huán)程序設(shè)計 本章重點掌握: 循環(huán)的概念 while語句、do-while語句和for語句的運用方法及區(qū)別 循環(huán)嵌套 中途退出循環(huán)的方法第六章 循環(huán)程序設(shè)計 6.1 while循環(huán)語句 while循環(huán)語句的普通方式如下: while (表達式) 語句(即循環(huán)體) 執(zhí)行過程是:先計算while后面圓括號內(nèi)表達式的值,假設(shè)表達式的值為非0(真),那么執(zhí)行后面的語句部分,即循環(huán)體;然后再次計算表達式,并反復(fù)上述過程,直到表達式的值為0(假)時,退出循環(huán)。其執(zhí)行流程如下圖 第六章 循環(huán)程序設(shè)計例6.1 求1100自然數(shù)之和。#include void main() int

2、i=1,sum=0; while (i=100) sum+=i; i+; printf(%dn,sum);運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:5050第六章 循環(huán)程序設(shè)計 留意: (1)由于while語句先判別表達式,后執(zhí)行循環(huán)體,假設(shè)表達式的值一開場就為假,那么循環(huán)一次也不執(zhí)行。 (2)while語句的表達式要用圓括號括起來;當(dāng)循環(huán)體有多個語句時,要用花括號括起,以構(gòu)成復(fù)合語句。 (3)在循環(huán)體中應(yīng)該有使表達式的值有所變化的語句,以使循環(huán)能趨于終止,否那么會構(gòu)成死循環(huán)。第六章 循環(huán)程序設(shè)計 6.2 do-while循環(huán)語句 do-while循環(huán)語句的普通方式如下: do 語句(即循環(huán)體) while (表達

3、式); 執(zhí)行過程是:先執(zhí)行循環(huán)體,再計算while后面圓括號內(nèi)表達式的值,假設(shè)其值為真(非0),那么再次執(zhí)行循環(huán)體;如此反復(fù),直到表達式的值為假(0),終了循環(huán)。該語句的特點是先執(zhí)行循環(huán)體,后判別表達式的值,所以循環(huán)體至少將被執(zhí)行一次。其執(zhí)行流程如右圖所示 第六章 循環(huán)程序設(shè)計例6.2 用do-while語句計算1100自然數(shù)之和。#include void main() int i=1,sum=0; do sum+=i; i+; while (i=100); printf(%dn,sum); 運轉(zhuǎn)結(jié)果:5050第六章 循環(huán)程序設(shè)計 留意: (1)do-while循環(huán)是先執(zhí)行循環(huán)體,然后判別表

4、達式的值,所以循環(huán)體至少被執(zhí)行一次。 (2)當(dāng)循環(huán)體有多個語句時,需用花括號括起;while后面的表達式也運用圓括號括起。 (3)與while一樣,循環(huán)體中應(yīng)該有使表達式的值發(fā)生變化,從而使循環(huán)趨于終了的語句。 第六章 循環(huán)程序設(shè)計 6.3 for循環(huán)語句 for循環(huán)語句的普通方式如下: for (表達式1;表達式2;表達式3) 語句(即循環(huán)體) for語句的執(zhí)行過程是:先計算表達式1的值,作為循環(huán)變量的初值,再計算表達式2的值,假設(shè)該值為假,那么退出循環(huán);假設(shè)為真,那么執(zhí)行循環(huán)體。循環(huán)體執(zhí)行之后計算表達式3,對循環(huán)變量進展修正;然后再計算表達式2,假設(shè)為真,再一次執(zhí)行循環(huán)體;如此反復(fù),直到表

5、達式2的值為假時退出循環(huán)。 第六章 循環(huán)程序設(shè)計 執(zhí)行流程如下圖 第六章 循環(huán)程序設(shè)計例6.3 用for語句求1100自然數(shù)之和。 方式1:for語句中有三個表達式,這是for語句的普通方式。#include void main() int i,sum=0; for (i=1;i=100;i+) sum+=i; printf(%dn,sum);運轉(zhuǎn)結(jié)果:5050 第六章 循環(huán)程序設(shè)計 方式2:表達式1從for后面的圓括號中移到for語句的前面,但表達式1后的分號要保管。 #include void main() int i=1,sum=0; for (;i=100;i+) sum+=i; pr

6、intf(%dn,sum); 第六章 循環(huán)程序設(shè)計 方式3:表達式1移到for的前面,表達式3移到循環(huán)體中,分號保管,這時for后面括號內(nèi)只需一個表達式2。 #include void main() int i=1,sum=0; for (;i=100;) sum+=i+; printf(%dn,sum); 第六章 循環(huán)程序設(shè)計 方式4:表達式1、表達式2、表達式3可以是逗號表達式。for語句前面的sum=0放到表達式1的位置,循環(huán)體中的語句放到表達式3的位置,這時循環(huán)體為一個空語句。 #include void main() int i,sum; for (sum=0,i=1;i=100;s

7、um+=i,i+) ; printf(%dn,sum); 第六章 循環(huán)程序設(shè)計 如例6.3中的for語句可改寫成如下的while語句,也就是例6.1的實現(xiàn)方式。 #include void main() int i,sum=0; i=1; while (i=100) sum+=i; i+; printf(%dn,sum); 第六章 循環(huán)程序設(shè)計 例6.4 編一程序,求abba=1855時a、b的值。其中a、b均為位數(shù),而ab和ba那么為這兩個1位數(shù)組成的二位數(shù)。 #include void main() int a,b,n; int mul=1855; for (a=1;a10;a+) for

8、 (b=1;b10;b+) n=(10*a+b)*(10*b+a); if (n=mul) printf(a=%d,b=%dn,a,b); 運轉(zhuǎn)結(jié)果: a=3,b=5 a=5,b=3第六章 循環(huán)程序設(shè)計 6.4 循環(huán)的退出 6.4.1 break語句 break語句的普通方式為: break; break語句可用在循環(huán)語句中(包括for、while和do-while循環(huán)),用來立刻終止循環(huán)的執(zhí)行,而轉(zhuǎn)到循環(huán)語句的下一個語句。如右圖所示。第六章 循環(huán)程序設(shè)計例6.5 編寫一程序,對一個數(shù)n=1,2,3,求階乘,當(dāng)其大于106時就終了,輸出這時的n和n!的值。#include void main(

9、) int n=1; long fact=1; while (1) n+; fact*=n; if (fact(long)1E6) break; printf(N=%d,N!=%ldn,n,fact); 運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:N=10,N!=3628800第六章 循環(huán)程序設(shè)計 6.4.2 continue語句 continue語句的普通方式如下: continue; 它的作用是終止當(dāng)前這一輪循環(huán),也就是跳過循環(huán)體中位于continue語句之后的其它語句,并開場下一輪的循環(huán)。如下圖。第六章 循環(huán)程序設(shè)計例6.6 編寫一程序,用來計算輸入的10個整數(shù)中正數(shù)的平均值。#include void mai

10、n() int i,n,a; float sum; for (sum=0,n=0,i=1;i=10;i+) scanf(%d,&a); if (a0) continue; sum+=a; n+; printf(Average=%6.2fn,sum/n);運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:68 -40 44 -20 48 65 -3 0 -7 12Average= 39.50第六章 循環(huán)程序設(shè)計 6.4.3 goto語句 goto語句是無條件轉(zhuǎn)移語句。它的普通方式如下: goto 語句標號; goto語句的執(zhí)行過程是:將程序轉(zhuǎn)移到標號所標識的語句去執(zhí)行。 goto語句只能在所在的函數(shù)體內(nèi)轉(zhuǎn)移,即got

11、o與標號在同一函數(shù)內(nèi)。 goto語句與if語句配合運用,也能構(gòu)成循環(huán),但按照構(gòu)造化程序設(shè)計原那么,應(yīng)該限制運用。 goto語句最常見的用法是用來退出多重循環(huán) 第六章 循環(huán)程序設(shè)計 在遇到特殊情況(如某種出錯)時用來轉(zhuǎn)出正??刂茦?gòu)造,可以運用goto語句提早終了正常處置的程序段 。例如在例5.5中,在輸入百分制成果時假設(shè)發(fā)生輸入錯誤,加上如下一段程序很有效。 L1:scanf(%d,&score); if(score100) printf(Enter wrong score,please try again:n ); goto L1; 第六章 循環(huán)程序設(shè)計 6.5 運用舉例 例6.7 用

12、牛頓迭代法求a的平方根。迭代公式為: Xn+1=(Xn+a/Xn)/2 #include #include void main() float a,x0,x1,eps=1e-4; printf(Please input a:); scanf(%f,&a); if (a0) printf(a=eps) x0=x1; x1=(x0+a/x0)/2; printf(sqrt(a)=%fn,x1); 運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:Please input a:1.69sqrt(a)=1.30000第六章 循環(huán)程序設(shè)計例6.8 輸出九九乘法口訣。#include void main() int i,j,r

13、esult; printf(n); for (i=1;i10;i+) for(j=1;j10;j+) result=i*j; printf(%d*%d=%-3d,i,j,result); /* -3d表示左對齊,占3位 */ printf(n);/*每一行后換行*/ 第六章 循環(huán)程序設(shè)計例6.9 從鍵盤上輸入一行字符,分別統(tǒng)計其中字母、數(shù)字和其它字符的個數(shù)。#include void main() char c; int letter=0,digit=0,other=0; while (c=getchar()!=n) if (c=a & c=A & c=0 & c=9)

14、 digit+; else other+; printf(Letter=%d,Digit=%d,Other=%dn, letter,digit,other);運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:s4ad5l6?Letter=5,Digit=5,Other=3第六章 循環(huán)程序設(shè)計例6.10 編一程序,利用級數(shù)求圓周率pi。pi=4(1-+-+(-1)n-1) 1計算級數(shù)前20項#include void main() int i,sign=1; float pi=0,term; for (i=1;i=20;i+) term=(float)sign/(2*i-1); pi+=term; sign=-sign; p

15、i=4*pi; printf(PI=%8.6fn,pi); 運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:PI=3.091624第六章 循環(huán)程序設(shè)計(2)要求誤差小于10-5,計算pi近似值及項數(shù)。#include #include void main() long n=1,sign=1; float pi=0,term; do term=(float)sign/(2*n-1); pi+=term; sign=-sign; n+; while (fabs(term)1e-5); pi=4*pi; printf(PI=%8.6f,N=%ldn,pi,n);運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:PI=3.141616,N=50002第七章

16、數(shù)組 本章重點掌握: 數(shù)組的定義 數(shù)組的援用 數(shù)組的初始化 數(shù)組的運用 第七章 數(shù)組 7.1 一維數(shù)組 7.1.1一維數(shù)組的定義 一維數(shù)組定義的格式如下: 類型闡明符 數(shù)組名常量表達式 類型闡明符包括int、char、float、double等 ,常量表達式的 值是數(shù)組的長度或數(shù)組元素的個數(shù)。 例如,用來存放某班10個學(xué)生成果的一維數(shù)組可定義為: int scorel0;第七章 數(shù)組 7.1.2 一維數(shù)組的運用 數(shù)組的運用有兩種方式:一是逐個援用其數(shù)組元素,另一是援用其數(shù)組名 一維數(shù)組元素的表示方式為: 數(shù)組名下標表達式 數(shù)組元素下標總是從0開場,當(dāng)數(shù)組長度為n時,下標表達式的取值范圍為0,1

17、,2,n-l。例如: int al0; 闡 明 數(shù) 組 有 1 0 個 元 素 , 分 別 表 示 為a0,a1,a9 第七章 數(shù)組例7.1 計算一個班學(xué)生的平均成果。#include #define N 10void main() int scoreN,i,sum; float average; sum=0; printf(PLease input %d scores.n,N); for (i=0;iN;i+) printf(score%d=,i); scanf(%d,&scorei); sum+=scorei; average=(float)sum/N; printf(Averag

18、e=%5.2fn,average); 運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:PLease input 10 scores.score0=85score1=70score2=92score3=65score4=80score5=55score6=78score7=90score8=77score9=81Average=77.30 第七章 數(shù)組 7.1.3 一維數(shù)組的初始化 定義數(shù)組時直接給數(shù)組元素賦初值,其初始化方式是: 類型闡明符數(shù)組名常量表達式=初始值表; 例如: int a5=1,3,5,7,9; 數(shù)組定義也可寫成:int a=1,3,5,7,9; 初值表中的初值個數(shù)可以少于數(shù)組的長度,這時初值只賦給數(shù)組前

19、面的假設(shè)干個元素,其后的元素的初值根據(jù)類型自動設(shè)置為0(整型)或0(字符型),例如: int b4=2,4,6; 表示b0=2,bl=4,b2=6,b3=0。 第七章 數(shù)組例7.2 用數(shù)組來計算Fibonacci數(shù)列。Fibonacci數(shù)列滿足以下遞歸關(guān)系: #include #define N 10void main() int i; int fN=1,1; for (i=2;iN;i+) fi=fi-1+fi-2; for (i=0;iN;i+) printf(%6d,fi);運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:1 1 2 3 5 8 13 21 34 55第七章 數(shù)組 7.2 二維數(shù)組 7.2.1 二維

20、數(shù)組的定義 二維數(shù)組的定義方式為: 類型闡明符數(shù)組名常量表達式1常量表達式2; 例如:int a34; 數(shù)組的元素是: a00 a01 a02 a03 al0 a11 a12 a13 a20 a21 a22 a23第七章 數(shù)組 7.2.2 二維數(shù)組的初始化 二維數(shù)組同樣可以在定義時對其元素進展初始化。例如:int a23=1,3,5,7,9,11; a00 a0l a02 al0 all al2 也可以為二維數(shù)組部分元素賦初值,如: int a23=1,3,5; 即:a00=1,a01=3,a02=5 還可以采用嵌套,分別對各行賦初值,如: int a23=1,3,5,7,9,11; 其中1,

21、3,5對第0行三個元素賦初值,7,9,11對第1行三個元素賦初值 1357911第七章 數(shù)組 定義二維數(shù)組允許第一維的長度(即行數(shù))省略,例如: int a3=1,3,5,7,9,11; 系統(tǒng)根據(jù)初值的個數(shù)6和列數(shù)3,就可以確定行數(shù)2。 7.2.3 二維數(shù)組的援用 援用方式是: 數(shù)組名下標表達式1下標表達式 其中下標表達式可以是整型常量、整型變量或整型表達式 第七章 數(shù)組例7.3 編程實現(xiàn)二維數(shù)組的輸入、輸出。#include void main() int i,j,a23; for (i=0;i2;i+) for (j=0;j3;j+) scanf(%d,&aij); for (i=

22、0;i2;i+) for (j=0;j3;j+) printf(a%d%d=%dn,i,j,aij); 運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:1 2 3 4 5 6a00=1a01=2a02=3a10=4a11=5a12=6第七章 數(shù)組例7.4 有一3行4列的整型矩陣,編程將每一行的最小值輸出。#include void main() int i,j,min3; int a34=1,5,3,2,7,4,9,2,8,6,7,2; for (i=0;i3;i+) mini=ai0; for (j=1;jaij) mini=aij; for (i=0;i3;i+) printf(min%d=%dn,i+1,mini)

23、; 運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:min1=1min2=2min3=2第七章 數(shù)組 7.3 字符數(shù)組和字符串 7.3.1 字符數(shù)組的定義 一維字符數(shù)組的定義方式是: char 數(shù)組名常量表達式; 如:char c5; 字符數(shù)組也可以在定義時進展初始化,如: char c5=C,h,i,n,a; 字符數(shù)組的長度也可由初值來確定,如: char c=C,h,i,n,a; 初值表中初值的個數(shù)可以少于數(shù)組元素的個數(shù),這時只需數(shù)組的前幾個元素賦初值,剩下的自動賦以0。 第七章 數(shù)組 C言語二維字符數(shù)組的定義方式為: char 數(shù)組名常量表達式1常量表達式; 例如:char c3l5; 7.3.2 字符串 1.字符

24、串的表示 字符串常量是用雙引號括起來的字符序列。C言語沒有字符串類型變量,字符串的存放與處置通常利用字符數(shù)組進展。 字符數(shù)組的長度和字符串的實踐長度不同,人們往往關(guān)懷的是字符串的實踐長度,為此C言語規(guī)定以字符0作為字符串的終了標志,當(dāng)遇到字符0時表示字符串終了,實踐的字符串由0前面的字符組成。 第七章 數(shù)組 系統(tǒng)對字符串常量也自動加一個0作為終了符,例如字符串China有5個字符,但在內(nèi)存卻占6個字節(jié),最后一個字節(jié)存放0 . 初始化的方式還可省去外面的花括號,如: char c=China;Chi na0第七章 數(shù)組例7.5 檢測某一給定字符串的長度。#include void main()

25、int i=0; char str=C Language; while (stri!=0) i+; printf(The length of string is %d.,i);運轉(zhuǎn)結(jié)果:The length of string is 10. 第七章 數(shù)組2.字符串的輸入輸出 運用格式輸入輸出函數(shù),字符串的輸入輸出可以有兩種方式:一種采用“%c格式符,另一種采用%s格式符用%c格式符逐個字符輸入輸出,輸入輸出方式和普通數(shù)組的輸入輸出一樣。用%s格式符將整個字符串一次輸入,例如:char strl5;scanf(“%s,str); 留意 數(shù)組名代表數(shù)組的起始地址,不能在數(shù)組名str前再加取地址符&

26、amp;第七章 數(shù)組 C言語規(guī)定用scanf輸入字符串時,以空格或回車鍵作為字符串的分隔符,因此假設(shè)輸入的字符串中包含空格,將只把空格前的部分字符賦給數(shù)組。例如輸入 Who are you? 假設(shè)要輸入上述整個字符串,可定義三個數(shù)組,用如下語句輸入: scanf(%s%s%s,str1,str2,str3); 第七章 數(shù)組例7.6 輸入一行字符并輸出。#include void main() int i=0; char str80,C; while (C=getchar()!=n) stri+=C; stri=0; printf(%sn,str);運轉(zhuǎn)結(jié)果:C LanguageC Langua

27、ge 第七章 數(shù)組3.常用的字符串處置函數(shù)(1)字符串輸入函數(shù)gets gets函數(shù)用來從鍵盤上輸入一個字符串,它讀入全部字符(包括空格),直到遇到回車符為止。其調(diào)用方式為: char str20; gets(str);(2)字符串輸出函數(shù)putsputs函數(shù)用來輸出一個字符串,其調(diào)用方式是:puts(str); 第七章 數(shù)組(3)字符串拷貝函數(shù)strcpystrcpy用來拷貝一個字符串,其調(diào)用方式為:strcpy(strl,str2);(4)字符串比較函數(shù)strcmpstrcmp函數(shù)的作用是用來比較兩個字符串,其調(diào)用方式是:strcmp(strl,str2)(5)字符串銜接函數(shù)strcats

28、trcat函數(shù)用來銜接兩個字符串,把字符串2銜接到字符數(shù)組1后面,并在最后加一個0,結(jié)果放在字符數(shù)組1中,其調(diào)用方式為:strcat(str1,str2);(6)字符串長度函數(shù)strlenstrlen函數(shù)用于測試字符串的長度。函數(shù)值為字符串的實踐長度。其調(diào)用方式是:strlen(str) 第七章 數(shù)組 7.4 運用舉例 例7.7 統(tǒng)計輸入的字符中有多少行?多少單詞?多少字符? #include void main() int C,nl,nw,nc,inword=0; nw=nc=0; nl=1; while (C=getchar()!=.) nc+; if (C=n) nl+; if (C=

29、|C=n|C=t) inword=0;第七章 數(shù)組else if (inword=0) inword=1; nw+; printf(%6d%6d%6dn,nl,nw,nc); 第七章 數(shù)組例7.8 利用冒泡法,對輸入的20個整數(shù)由小到大進展陳列。#include void main() int a20,i,j,t; for (i=0;i20;i+) scanf(%d,&ai); for (i=0;i19;i+) for (j=0;jaj+1) t=aj; aj=aj+1; aj+1=t; for (i=0;i20;i+) if (i%5=0) printf (n); printf(%6

30、d,ai); 運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:1 3 5 7 9 11 13 15 17 19 2 4 6 8 10 12 14 16 18 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20第七章 數(shù)組例7.9 將一個四階矩陣轉(zhuǎn)置。矩陣轉(zhuǎn)置是把矩陣的行和列互換,即把矩陣按主對角線翻轉(zhuǎn),例如:#include void main() int a44,i,j,t; for (i=0;i4;i+) for (j=0;j4;j+) scanf(%d,&aij); 第七章 數(shù)組 for (i=0;i3;i+) for (j=i+1;j4;j+) /*

31、 留意循環(huán)是從i+1開場 */ t=aij; aij=aji; aji=t; for (i=0;i4;i+) for (j=0;j4;j+) printf(%5d,aij); printf(n); 運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:1 2 3 45 6 7 89 10 11 1213 14 15 16 1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16第八章 函數(shù) 本章重點掌握: 函數(shù)的定義與闡明 函數(shù)的類型及調(diào)用格式 實參與形參的對應(yīng)規(guī)那么 變量的作用域與存儲類型 第八章 函數(shù) 8.1 C程序與函數(shù) 函數(shù)是一個相對獨立的、完成某一特定功能的程序模塊。 #include float

32、 max(float x,float y);/* max函數(shù)的闡明 */ void main() float a,b,c; scanf(%f,%f,&a,&b); c=max(a,b); /* max 函數(shù)調(diào)用 */ printf(max=%fn,c); 第八章 函數(shù)float max(float x,float y) /* max函數(shù)的定義 */ float z; if (xy) z=x; else z=y; return (z);運轉(zhuǎn)結(jié)果:10,20max=20.000000第八章 函數(shù)(1)main()函數(shù)這是每個C程序都必需有的最根本的函數(shù),且只能有一個,它的名字由系統(tǒng)

33、命名。運轉(zhuǎn)一個C程序,總是從main函數(shù)開場,在調(diào)用其它函數(shù)后,流程回到main函數(shù)。(2)庫函數(shù)是由系統(tǒng)提供的規(guī)范函數(shù),這種函數(shù)不需求用戶定義就可直接運用(3)用戶自定義函數(shù)這種函數(shù)由用戶按照函數(shù)的格式和指定的功能本人進展設(shè)計和定義,是C程序設(shè)計的主要任務(wù)之一。 第八章 函數(shù) 8.2 函數(shù)的定義和闡明 8.2.1 函數(shù)的定義 C函數(shù)定義的普通格式如下: 函數(shù)類型 函數(shù)名(方式參數(shù)表) 函數(shù)體 1.函數(shù)頭:包括函數(shù)名、函數(shù)類型及方式參數(shù)表 (1)函數(shù)名 用標識符表示,用來標識一個函數(shù)的名字,函數(shù)名后面必需有一對圓括號 第八章 函數(shù)(2)函數(shù)類型:即函數(shù)前往值的類型。無前往值的函數(shù)類型規(guī)定為vo

34、id .(3)方式參數(shù)表置于函數(shù)名后面的圓括號內(nèi),它由0個、1個或多個參數(shù)組成,參數(shù)之間用逗號分隔,參數(shù)必需有類型闡明。它的作用是指明將從主調(diào)函數(shù)接納哪些類型的數(shù)據(jù)。如:float max(float x,float y) 2.函數(shù)體函數(shù)體是函數(shù)頭下面最外層一對花括號內(nèi)的代碼,由一系列語句構(gòu)成,用以實現(xiàn)函數(shù)的功能。 當(dāng)函數(shù)執(zhí)行到return語句或執(zhí)行完函數(shù)體一切語句,流程回到主調(diào)函數(shù)。 第八章 函數(shù)函數(shù)前往有以下幾種情況:(1)return(e),e是一個表達式。return是函數(shù)執(zhí)行的最后一個操作。例如:float max(float x,float y) float z; z=xy? x:

35、y; return(z); 第八章 函數(shù)(2)return后面不帶表達式,無前往值,函數(shù)只是執(zhí)行某一操作,這時流程直接前往到主調(diào)函數(shù)的調(diào)用途。例如:void spc(int n) int i; for(i=0;in;i+) printf( ); return;第八章 函數(shù)(3)執(zhí)行完函數(shù)體,流程自動前往到調(diào)用點,這時不前往任何值。例如上面程序段也可寫成:void spc(int n) int i; for(i=0;iy) return(x); else return(y); 第八章 函數(shù)闡明:(1)假設(shè)函數(shù)規(guī)定了前往值類型(非void),有的編譯系統(tǒng)規(guī)定函數(shù)體內(nèi)必需包含return語句,有的無

36、此規(guī)定。假設(shè)函數(shù)在無return語句的分支上終了,不同的編譯系統(tǒng)能夠前往不同的值。好的編程習(xí)慣是:對于有類型的函數(shù),在其每個分支上都應(yīng)該以return語句終了。(2)假設(shè)函數(shù)類型為void,函數(shù)體內(nèi)可以不包含return語句 第八章 函數(shù) 關(guān)于main函數(shù)的類型,還需求做以下闡明: (1) main函數(shù)默以為int型。對于int型的main函數(shù),函數(shù)體的各分支都應(yīng)該以return語句終了,所前往的值會傳送給操作系統(tǒng),表示程序執(zhí)行的結(jié)果。 (2)有些C編譯系統(tǒng)(如VC+)允許main函數(shù)為void型,在main函數(shù)中不需求return語句。為方便起見,本書例題大多采用此方式,但在實踐編程中,建議

37、將main函數(shù)定義為int型。 第八章 函數(shù) 8.2.2 函數(shù)的闡明 函數(shù)定義之后就可以被調(diào)用,但假設(shè)沒有函數(shù)闡明,C言語只允許后面定義的函數(shù)調(diào)用前面已定義的函數(shù)。假設(shè)想要讓前面定義的函數(shù)也能調(diào)用后面定義的函數(shù),那么必需在調(diào)用之前先對被調(diào)函數(shù)進展函數(shù)闡明 . 函數(shù)闡明那么只是指明函數(shù)的類型、函數(shù)名及形參的個數(shù)、類型和陳列順序。如例8.1中的第2行: float max(float x,float y); 函數(shù)闡明的普通格式為: 函數(shù)類型 函數(shù)名(方式參數(shù)表); 第八章 函數(shù) 8.3 函數(shù)的調(diào)用 8.3.1 函數(shù)調(diào)用的格式 函數(shù)調(diào)用的普通格式如下: 函數(shù)名(實踐參數(shù)表) 函數(shù)調(diào)用的執(zhí)行過程是:首

38、先計算每個實參表達式的值,并把該值傳送給對應(yīng)的形參,然后轉(zhuǎn)入函數(shù)體中并執(zhí)行函數(shù)體中的語句,當(dāng)執(zhí)行到return語句或者作為函數(shù)體終了的右花括號,表示函數(shù)體執(zhí)行終了,這時流程再前往到主調(diào)函數(shù)中。 第八章 函數(shù) 函數(shù)調(diào)用有以下方式: (1)函數(shù)語句 把函數(shù)調(diào)用作為一個語句,如:spc(l0); (2)函數(shù)表達式 這時函數(shù)調(diào)用出如今一個表達式中,要求函數(shù)前往一個值以參與表達式的運算,如:c=max(a,b); 留意: (1)C言語沒有規(guī)定實參表中實參表達式求值的順序,不同的編譯系統(tǒng)會根據(jù)對代碼進展優(yōu)化的需求自行規(guī)定對實參的求值順序。 (2)函數(shù)調(diào)用時,被調(diào)用函數(shù)可以是庫函數(shù)或用戶自定義函數(shù)。假設(shè)是庫

39、函數(shù),普通要在本文件的開頭加上頭文件的援用。 第八章 函數(shù) 8.3.2 參數(shù)的傳送 值傳送 :函數(shù)被調(diào)用時,系統(tǒng)根據(jù)形參類型,為每個形參分配存儲單元,并將實參的值復(fù)制到對應(yīng)的形參單元中,這時形參就得到了實參的值 ,如下圖 第八章 函數(shù)例8.2 編寫函數(shù)將兩個整數(shù)的值交換并輸出。#include void swap(int x,int y) int z; z=x;x=y;y=z; printf(x=%d,y=%dn,x,y);void main() int a,b; scanf(%d%d,&a,&b); swap(a,b); printf(a=%d,b=%dn,a,b); 運轉(zhuǎn)結(jié)

40、果:運轉(zhuǎn)結(jié)果:5 9x=9,y=5a=5,b=9第八章 函數(shù)例8.3 比較兩個數(shù),輸出其中的大值。#includeint max(int x,int y) int z; z=(xy?x:y); return(z); void main() int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c); 運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:54,89Max is 89第八章 函數(shù) 8.4 運用舉例1 例8.4 編寫一函數(shù),計算x的n次方的值,其中n是正整數(shù)。 該函數(shù)可以將x和n作為方式參數(shù),計算結(jié)果經(jīng)過return語句前往主調(diào)函數(shù)。

41、 float power(float x,int n) int i; float pw; pw=1; for (i=1;i=n;i+) pw*=x; return(pw); 第八章 函數(shù)例8.5 求三個整數(shù)的最大公因子。#include int gcd(int m,int n);void main() int a,b,c,g; scanf(%d%d%d,&a,&b,&c); g=gcd(a,b); /* 先求兩個數(shù)的最大公因子 */ g=gcd(g,c); /* 再與第三個數(shù)求最大公因子 */ printf(gcd=%dn,g);第八章 函數(shù)int gcd(int m,

42、int n) int r; while (n!=0) r=m%n; m=n; n=r; return (m); 運轉(zhuǎn)結(jié)果:34 153 85gcd=17第八章 函數(shù)例8.6 編程求解 (假定n=6,k=4)。#include#define n 6#define k 4int sop(int m,int l);int power(int p,int q);void main() long sum=0; printf(從1到%d的%d次冪之和為:,n,k); sum=sop(n,k); printf(%dn,sum);npkp1第八章 函數(shù)int sop(int m,int l) int i,su

43、m=0; for(i=1;i=m;i+) sum=sum+power(i,l); return (sum);int power(int p, int q) int i,ret=1; for(i=1;i=q;i+) ret=ret*p; return (ret);運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:從從1到到6的的4次冪之和為:次冪之和為:2275第八章 函數(shù) 8.5 函數(shù)的嵌套調(diào)用與遞歸調(diào)用 8.5.1 函數(shù)的嵌套調(diào)用 函數(shù)的定義不能嵌套,但函數(shù)的調(diào)用可以嵌套。一個函數(shù)既可以被其它函數(shù)調(diào)用,同時它又可以調(diào)用其它函數(shù),這就是函數(shù)的嵌套調(diào)用。 例8.7 用牛頓迭代法求一個正實數(shù)的平方根。 計算的迭代公式為 : r

44、n+1= ( + rn)n=0,1,2,21nra第八章 函數(shù)程序如下:#include float sq_rt(float x);float abs(float x);void main() float a; printf(a=); scanf(%f,&a); if (a0) printf(Square_root(%5.2f)=%fn,a,sq_rt(a); else printf(Input error!n); 第八章 函數(shù)float sq_rt(float x) float r,eps=1e-5; r=1.0; while(abs(r*r-x)=eps) r=(x/r+r)/2.

45、0; return (r); float abs(float x) if (x0) x=-x; return (x); 運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:a=2.0Square_root( 2.00)=1.414216第八章 函數(shù)該程序有三個函數(shù),它們相互獨立,互不從屬,但調(diào)用該程序有三個函數(shù),它們相互獨立,互不從屬,但調(diào)用是嵌套的是嵌套的, ,其調(diào)用過程如下圖其調(diào)用過程如下圖, ,程序的執(zhí)行過程是從程序的執(zhí)行過程是從到。到。 第八章 函數(shù) 8.5.2 函數(shù)的遞歸調(diào)用 C言語規(guī)定,函數(shù)不僅可以調(diào)用其它函數(shù),還可以直接或間接地調(diào)用它本身,稱為遞歸調(diào)用。函數(shù)在它本身的函數(shù)體中出現(xiàn)對它本身的調(diào)用是直接遞歸;函數(shù)A

46、調(diào)用某一個其它函數(shù),而該函數(shù)又直接或間接地調(diào)用函數(shù)A,是間接遞歸 . 用遞歸方式描畫問題,必需具備兩個條件: (1)初始定義,至少有一次不用遞歸調(diào)用; (2)每次遞歸調(diào)用,總是向(1)方向轉(zhuǎn)化(收斂性)。第八章 函數(shù)例8.8 用遞歸算法編寫求階乘的程序。#include long int fact(int n);void main() int n; printf(n=); scanf(%d,&n); printf(%d!=%ldn,n,fact(n);第八章 函數(shù)long int fact(int n) if (n=0) return (1); else return (n*fact(

47、n-1);運轉(zhuǎn)結(jié)果:n=99!=362880 第八章 函數(shù)以3!為例來闡明遞歸函數(shù)的執(zhí)行過程 第八章 函數(shù)用遞歸的方法描畫問題與實踐問題的自然表達方式較接近,易于了解和設(shè)計,但是在函數(shù)被調(diào)用時,進、出函數(shù)次數(shù)較多,因此運轉(zhuǎn)效率較低,且每次進、出函數(shù)都有中間結(jié)果要保管,這樣還要占去一定的存儲空間。因此像階乘這樣一些明顯可用遞推方式處理的問題,還是不用遞歸為好。下面用遞推方式編寫fact函數(shù):long int fact(int n) long result; int i; result=1; for (i=2;i=n,i+); result *=i; return(result);第八章 函數(shù)例8

48、.9 用遞歸來實現(xiàn)Fibonacci數(shù)列。用直接遞歸來實現(xiàn)如下:#includelong int fibonacci(int n) if(n=2) return 1; return fibonacci(n-1)+fibonacci(n-2);void main() int a,b; printf(n=); scanf(%d,&a); b=fibonacci(a); printf(%d,b); f0=1,f1=1fi=fi-1+fi-2 i2運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果:n=68第八章 函數(shù) 8.6 作用域與存儲類 每一個變量或函數(shù)都具有三個屬性:一是類型,二是作用域,三是存儲類。 變量的作用域是

49、指一個變量可以起作用的程序范圍,即在什么范圍內(nèi)這個變量是可見的或可訪問的;變量的作用域取決于變量闡明的位置。 存儲類是指變量以何種方式存儲,不同的存儲方式將影響變量的生存期。 8.6.1 作用域 1.部分變量 在一個函數(shù)體內(nèi)或程序塊內(nèi)闡明的變量稱為部分變量。部分變量只在闡明它的函數(shù)體內(nèi)或程序塊內(nèi)有效 。第八章 函數(shù)如有以下的表示性程序:float f1(float x) int i,j; /* 可援用f1()的參數(shù)x,部分變量i、j */char f2(char x,char y) int i; char j; /* 可調(diào)用f1(),援用f2()的參數(shù)x、y,部分變量i、j */ void m

50、ain() int n; char c; /* 可調(diào)用f1(),f2(),援用部分變量n、c */第八章 函數(shù) 上面程序main中闡明變量n、c,f1中闡明i、j,f2中也闡明了i、j,這些變量各自在闡明它們的函數(shù)體內(nèi)有效,其它函數(shù)不能運用它們。由于這個特點,不同函數(shù)可以運用一樣的變量名,同一名字在不同函數(shù)中代表不同的對象,互不干擾。 另外,函數(shù)形參的有效范圍也部分于函數(shù),如fl中的x,f2中的x、y,它們都是所在函數(shù)的部分量。 C言語規(guī)定,函數(shù)體內(nèi)闡明的變量,假設(shè)程序塊中沒有重新闡明,那么在程序塊中繼續(xù)有效;如在程序塊中重新闡明,那么在其外的函數(shù)體闡明的該變量名被隱蔽起來,這時程序塊中運用的

51、是塊中重新闡明的變量。 第八章 函數(shù)例8.10 演示變量作用域。#include void main() int a=2,b=4,c=6; printf(%4d%4d%4dn,a,b,c); int b=8,c=10; printf(%4d%4d%4dn,a,b,c); a=b; printf(%4d%4d%4dn,a,b,c); 運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果: 2 4 6 2 8 10 8 4 6第八章 函數(shù)2.全局變量在圖8.5所示的程序中,變量a、b都在函數(shù)外定義,它們都是全局變量,但它們的有效范圍不同。在函數(shù)fl和f2中可直接援用全局變量a、b,但在main中只能直接援用變量a,不能直接援用變量

52、b。另外,假設(shè)在f2中定義一個部分變量,與全局變量同名,例如定義了一個部分變量a,那么在f2中援用的是本人的部分變量a,全局變量a在f2中被隱蔽起來了。 第八章 函數(shù)第八章 函數(shù) 8.6.2 存儲類 變量的存儲類有以下四種:自動的、靜態(tài)的、存放器的和外部的。 1.自動變量(auto) 自動變量通常是指在函數(shù)體內(nèi)或程序塊內(nèi)定義的部分變量。在定義自動變量時,可在定義變量的類型標識符前面加上保管字auto。C言語規(guī)定,在函數(shù)或程序塊內(nèi)定義的變量假設(shè)未加存儲類闡明,默許是自動的,所以在這種情況下保管字auto可以省略。 自動變量在動態(tài)存儲區(qū)內(nèi)分配存儲單元,函數(shù)調(diào)用終了時,系統(tǒng)將釋放這些單元,自動變量中

53、的數(shù)據(jù)也就消逝了。 第八章 函數(shù)如:main( ) auto int i,j; auto float a,b; 也可寫成缺省方式:main( ) int i,j; float a,b; 第八章 函數(shù)2.靜態(tài)變量(static)靜態(tài)變量可以是部分的,也可以是全局的。部分靜態(tài)變量又稱內(nèi)部靜態(tài)變量,位于函數(shù)體內(nèi)。其作用域是在定義它的函數(shù)或程序塊內(nèi);但它被存放在內(nèi)存的靜態(tài)存儲區(qū)中,在程序執(zhí)行過程中,被分配的存儲空間一直歸該變量一切,只不過在它的作用域之外不可對它進展存取。因此,對于部分靜態(tài)變量,即使不在它的作用域之內(nèi),它的值仍保管在內(nèi)存中;一旦再次進入它的作用域再次調(diào)用定義它的函數(shù)或進入定義它的程序塊

54、,變量原有的值依然有效,這是部分靜態(tài)變量與自動變量的區(qū)別。 第八章 函數(shù)例8.11 演示部分靜態(tài)變量。#include int sum(int x) static int s=0; s+=x; return s;void main() int i; for (i=0;i5;i+) printf(%4d,sum(10);運轉(zhuǎn)結(jié)果: 10 20 30 40 50 第八章 函數(shù) 全局靜態(tài)變量又稱外部靜態(tài)變量,在函數(shù)外定義,定義前加static闡明。它的作用域是定義它的源文件,并且是從定義點開場。 3.存放器變量(register) 這類變量存放在CPU的通用存放器中。它的作用域與自動變量一樣,只需自

55、動變量和形參可以闡明為存放器類。存放器類變量在定義前加上保管字register,如以下方式: register int i; for (i=0;in;i+) 第八章 函數(shù) 變量存放在存放器中,其處置速度要比存放在內(nèi)存中的自動變量快得多。另外需求指出,存放器變量不能進展地址運算地址運算的概念見9.1.3節(jié),也不能是靜態(tài)變量。 4.外部變量(extern) 全局變量默許的作用域是從它的定義點開場到根源文件的末尾。假設(shè)在定義點之前的函數(shù)要援用該全局變量,需求在援用之前對該變量作外部變量闡明;同樣,在定義全局變量之外的其它文件要援用該全局變量,也需求在援用之前作外部變量闡明。闡明外部變量時,在變量名前

56、加上外部變量闡明保管字extern,請看下面表示性程序: 第八章 函數(shù)(1)定義點之前的函數(shù)援用全局變量,必需加外部闡明。void main() extern int a; /* 這里可援用a,由于前面已對a作了外部闡明 */int a;float f1(int x) /* 本函數(shù)位于全局變量a定義之后,可援用a */float f2 (char x, float y) float a; /* 這里可以援用部分變量a,在f2內(nèi)全局變量a被隱蔽 */ 第八章 函數(shù)(2)其它文件要援用本文件中的全局變量,應(yīng)該加外部闡明,請看下面表示性程序:/* file1.c */int x;void main(

57、) /* 可援用全局變量x */* file 2.c */extern int x;float fun(float a) /* 可援用file1中定義的變量x */ /* 由于在本文件中,x已作了外部闡明 */第八章 函數(shù) 8.6.3 內(nèi)部函數(shù)與外部函數(shù) 定義函數(shù)也需求指明存儲類,函數(shù)的存儲類分內(nèi)部靜態(tài)的和外部的。根據(jù)函數(shù)的運用范圍,可以分為內(nèi)部函數(shù)和外部函數(shù)。 1.內(nèi)部函數(shù) 內(nèi)部函數(shù)又稱靜態(tài)函數(shù),它只能被本文件中的其它函數(shù)調(diào)用。在定義內(nèi)部函數(shù)時,前面應(yīng)加上保管字static,如: static float fun1(float x,float y) 函數(shù)fun1的作用范圍僅限于定義它的源文件

58、,而其它文件中的函數(shù)不能調(diào)用它。 第八章 函數(shù)2.外部函數(shù)在定義函數(shù)時,假設(shè)加上保管字extern,那么闡明該函數(shù)是外部的,如:extern int fun2(int x, int y) 函數(shù)fun2可被其它文件中的函數(shù)所調(diào)用。如有其它文件中的函數(shù)需求調(diào)用fun2,需求在該文件中添加fun2的函數(shù)闡明在調(diào)用之前,函數(shù)闡明中也需求運用extern保管字闡明所調(diào)用的函數(shù)是外部的。留意,在定義函數(shù)時假設(shè)未指明存儲類,那么該函數(shù)默以為外部的。第八章 函數(shù) 8.7 運用舉例2 例8.12 產(chǎn)生隨機數(shù)的函數(shù)。 產(chǎn)生隨機數(shù)最常用的方法是線性同余法,這時一個隨機數(shù)可以用前一個隨機數(shù)求得: ri = ( mul

59、tiplier * ri-1 + increment ) % modulus 實踐上這不是真正的隨機數(shù),而是經(jīng)過ri-1算出ri。但假設(shè)幾個參數(shù)選得適宜,從效果上看還是很像隨機數(shù)的,因此又把這樣產(chǎn)生的數(shù)叫偽隨機數(shù)。比如這樣選擇參數(shù): r=(r*123+59)%65536 只需給出一個r的初值,就能計算出下一個r,程序如下: 第八章 函數(shù)#include unsigned random() static unsigned r=100; r=(r*123+59)%65536; return r;void main() int i; for (i=0;i10;i+) printf( %u,rando

60、m();運轉(zhuǎn)結(jié)果:運轉(zhuǎn)結(jié)果: 12359 12888 12419 20268 2655 64480 1243 21876 3831 12520 第八章 函數(shù)例8.13 上述產(chǎn)生隨機數(shù)序列的程序,還可以將變量r闡明為靜態(tài)全局變量,程序如下:#include static unsigned r;unsigned random() r=(r*123+59)%65536; return r;void random_init(unsigned seed) r=seed;第八章 函數(shù)void main() unsigned i,n; scanf(%d,&n); random_init(n); for (i=0;i10;i+) printf( %u,random();運轉(zhuǎn)結(jié)果: 100 12359 12888 12419 20268 2655 64480 1243 21876 3831 12520 第八章 函數(shù)例8.1

溫馨提示

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

評論

0/150

提交評論