版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第四章 循環(huán)結構第4章 循環(huán)結構 C語言程序設計 第4章 循環(huán)結構概述goto語句以及用goto語句構成循環(huán)while語句do-while語句for語句循環(huán)的嵌套幾種循環(huán)的比較break語句和continue語句程序舉例 C語言程序設計C語言中三種基本結構(順序、選擇、循環(huán)) 順序結構AB流程圖 C語言程序設計循環(huán)結構當型循環(huán)結構While語句直到型循環(huán)結構do.while語句PA假真AP假真 C語言程序設計循環(huán)結構與if語句的不同循環(huán)while(表達式) 循環(huán)體語句表達式循環(huán)體假真 C語言程序設計 三種基本結構的共同特點: 只有一個入口;只有一個出口;結構內的每一部分都有機會被執(zhí)行到;結構內
2、不存在“死循環(huán)”。 4.1 循環(huán)結構概述 程序中凡涉及求階乘、累加、排序等問題都要用循環(huán)解決,因為程序中的“某一程序段要重復執(zhí)行若干次”。C語言中可以實現(xiàn)循環(huán)的語句:goto 和if組合while語句do while語句for語句 C語言程序設計考試重點了解4.2 goto語句以及用goto語句構成循環(huán)作用:無條件地轉移到語句標號指向的語句去執(zhí)行。 一般格式: C語言程序設計 goto 語句標號; .標號:語句; 說明:語句標號由字母、數(shù)字和下劃線組成,定名規(guī)則同變量名,不能用數(shù)字開頭。goto loop; ( ) goto 100;()與循環(huán)語句配合使用時,可從循環(huán)體內跳到循環(huán)體外,而不能從
3、循環(huán)體外跳到循環(huán)體內。goto語句轉移的方向可前可后。與if語句配合使用時可構成循環(huán)。goto 語句違背結構化程序設計的原則,因此應限制使用。 C語言程序設計例4.1 用if 和goto語句構成循環(huán),求#include main( ) int i,sum=0; i=1;loop: if(i=100) sum+=i; i+; goto loop; printf(%d,sum);sum=0+1sum=1+2=3sum=3+3=6sum=6+4sum=4950+100=5050循環(huán)初值循環(huán)終值循環(huán)變量增值循環(huán)條件循環(huán)體4.3 while語句while語句實現(xiàn)“當型”循環(huán)結構。一般形式: C語言程序設
4、計 while(表達式) 循環(huán)體語句;沒有“;”功能:先判斷表達式,若為真則執(zhí)行循環(huán)體,再判斷表達式,重復上述過程,直到表達式為假時退出循環(huán)。求sum=sum+i i=i+1i=1;sum=0i100假真注意:循環(huán)體語句如果只有一個,可以不加花括號;如果超過一個,必須加花括號組成復合語句 C語言程序設計#include main( ) int i,sum=0; i=1; while(i=100) sum=sum+i; i+; printf(%d,sum);循環(huán)條件循環(huán)體例4.2 用while語句構成循環(huán),求循環(huán)初值循環(huán)終值循環(huán)變量增值關于while循環(huán)語句:while循環(huán)先判斷表達式,后執(zhí)行循
5、環(huán)體。循環(huán)體有可能一次也不執(zhí)行!。循環(huán)體若包含一個以上語句,應該用括起來。循環(huán)體應包含有使循環(huán)趨向結束的語句;下列情況,退出while循環(huán)條件表達式不成立(為零)循環(huán)體內遇 break , goto無限循環(huán) while(1) 循環(huán)體 ; C語言程序設計條件永遠為真 C語言程序設計例 用while語句顯示110的平方#include void main() int i=1; while(i=10) printf(%d*%d=%dn,i,i,i*i); i+; 1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=1004.4 do-wh
6、ile語句do-while語句實現(xiàn)“當型”循環(huán)結構。一般形式: C語言程序設計功能:先執(zhí)行一次循環(huán)體,然后判斷表達式。若為真,則再次執(zhí)行循環(huán)體,否則退出循環(huán)。求do循環(huán)體語句;while(表達式) ; 有“;”i=1,sum=0sum=sum+i i=i+1i100真假i=1,sum=0sum=sum+i i=i+1 直到i100注意:循環(huán)體最少要執(zhí)行一次 C語言程序設計例4.3 用do-while語句構成循環(huán),求#include main( ) int i,sum=0; scanf(%d,&i); do sum+=i; i+; while(i=100); printf(%d,sum);循環(huán)條
7、件循環(huán)體#include main()int i,sum=0; scanf(%d,&i); while(i=100) sum+=i; i+; printf(%d,sum);比較do-while 循環(huán),循環(huán)體至少執(zhí)行一次;while和do-while可以解決同一問題,兩者可以互換。while后的表達式一開始就為假時,兩種循環(huán)結果不同。輸入:1輸出:5050 5050輸入:101輸出:101 0比較while與do-whilemain() int n = 1; int b = 1; scanf(n=%d,&n); do b= b+n; n+; while(n = 10); printf(“b =
8、%d, b);main() int n = 1; int b = 1; scanf(n=%d,&n); while(n = 10) b=b+n; n+; printf(“b = %d, b);n=12n=12b = 1b = 2一次也沒執(zhí)行執(zhí)行了一次4.4 for語句 for 語句是 C 語言中最為靈活,使用最廣泛的循環(huán)語句,可完全替代while,do-while語句。一般形式 C語言程序設計 for(表達式1;表達式2;表達式3) 循環(huán)體語句;常用形式 for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值) 循環(huán)體語句;一般形式:執(zhí)行流程表達式2循環(huán)體語句假(0)真(非0)for表達式1表達式3
9、for(表達式1;表達式2;表達式3) 循環(huán)體語句; 表達式1 表達式2 表達式3 循環(huán)體語句;真假循環(huán)結束 C語言程序設計#include main( ) int i,sum=0; for(i=1;i=100;i+) sum+=i; printf(%d,sum);i 100sum=sum+i不成立成立i=1i +for循環(huán)下面的語句循環(huán)步長例 用for語句構成循環(huán),求幾點說明:for語句中表達式1、2、3類型任意,都可省略,但分號“;”不能省。無限循環(huán):for(;)不斷執(zhí)行循環(huán)體,循環(huán)不終止。for語句可以轉換成while結構 C語言程序設計 第六章 循環(huán)控制表達式1;while(表達式2)
10、循環(huán)體語句;表達式3;for語句說明表達式1可以省略,但其后的分號不能省。此時應在for語句前給循環(huán)變量初始化。 如:int i = 0; for( ; i 10) break; 表達式3省略時,需要另外設置循環(huán)變量的改變,使循環(huán)正常結束。 如:for(i =1; i = 10;) result *= i; i+ +; 表達式1,2,3可以同時省略,但必須保留分號。 如: for( ; ; ) 相當于 while(1) C語言程序設計 表達式1、3可以是與循環(huán)無關的表達式,也可以是逗號表達式。for ( s=0 , i=1 ; i=100 ; i+ ) s=s+i;/*表達式是逗號表達式*/m
11、ain() int i,j,k; for(i=0,j=100;i=j;i+,j-) k=i+j; printf(%d+%d=%dn,i,j,k); 表達式2可以是關系、邏輯、算術、字符表達式,非0時,執(zhí)行循環(huán)體,為0時退出循環(huán)。#includemain() char c; for(;(c=getchar()!=n;) printf(%c ,c);#include main() int i,c; for(i=0;(c=getchar()!=n;i+=c)printf(%d ,i+c);總結: C語言程序設計 省略表達式1:應在for之前為變量賦初值。/*正常形式*/main( ) int i ,
12、sum=0; for(i=1;i=100;i+) sum=sum+i; printf(%d,sum);/*省略表達式1*/main( ) int i,sum=0; i=1; for(;i=100;i+) sum=sum+i printf(%d,sum);省略表達式2:循環(huán)條件始終為“真”,循環(huán)不終止。省略表達式3:應另外設法使程序能夠結束。/*省略表達式3*/main( ) int i,sum=0; for(i=1;i=100;) sum=sum+i i+; printf(%d,sum);省略表達式1、3:完全等同于while語句。/*省略表達式1、3*/main( ) int i,sum=0
13、; i=1; for(;i=100;) sum=sum+i i+; printf(%d,sum);三個表達式都省略:無初值,不判斷條件,循環(huán)變量 不增值,死循環(huán)。4.6 循環(huán)的嵌套定義:一個循環(huán)體內又包含了另一個完整的循環(huán)結構,稱為循環(huán)的嵌套。三種循環(huán)可以互相嵌套,層數(shù)不限。嵌套循環(huán)的執(zhí)行流程。 C語言程序設計 (1) while() while() . (2) do do while(); . while( );(3) for(;) for(;) (4) while() do while(); . C語言程序設計 (5) for( ; ;) while() . (7) for( ; ;) d
14、o while(); while() .(6) do for(; ;) . while();循環(huán)可以互相嵌套,但不能相互交叉。 for for . . for for . . C語言程序設計 注意:在嵌套的循環(huán)結構中,內層循環(huán)是外層循環(huán)的循環(huán)體的一部分,外層循環(huán)每進行一輪,內層循環(huán)要一直循環(huán)到結束。main() int i, j;for(i=1;i=5;i+) for(j=1;j=5;j+) printf(“*”); printf(“n”); * C語言程序設計 例 計算3組14累加的和#include void main() int i,j,s=0; for(i=1;i=3;i+) for(
15、j=1;j=4;j+) s=s+j; printf(“s=%dn,s);結果:s=301 2 3 i j s=01 1 11 3 62 1 112 2 132 4 203 1 213 2 233 3 263 4 302 3 161 4 10同書上例14.7 幾種循環(huán)的比較 C語言程序設計 語 句適用范圍說 明while只知道結束條件而無法確定執(zhí)行次數(shù)的情況下。 循環(huán)變量初始化在循環(huán)體之前 循環(huán)體中應包含使循環(huán)結束的語句 可以用 break 和continue 語句控制do-while至少執(zhí)行一次時ifgoto無條件循環(huán) 該循環(huán)不能用break 和continue 語句控制for已知執(zhí)行次數(shù)或者
16、已知初值,終值,步長時。使用比較靈活4.8 break語句和continue語句break語句功能:在“循環(huán)語句”和“switch語句”中,終止并跳出循環(huán)體或開關體。說明:break只能終止并跳出最近一層的結構。break不能用于循環(huán)語句和switch語句之外的任何其它語句之中。一般形式:break; C語言程序設計 流程形式: C語言程序設計 表達式break;假(0)真(非0)whiledobreak;.表達式假(0)真(非0)while表達式2break;.假(0)真(非0)for表達式1表達式3 C語言程序設計 switch表達式語句組1break;語句組2break;語句組nbrea
17、k;語句組break;.const 1const 2const ndefaultcase C語言程序設計 例 break舉例:輸出圓面積,面積大于100時停止#include #define PI 3.14159void main( ) int r ; float area; for(r=1;r100) break; printf(r=%d,area=%f,r,area); r 10area=3.14*r*rNYr =1i +for循環(huán)下面的語句area100NY使用break跳出整個循環(huán)輸出: r=1, area=3.14 r=2, area=12.57 r=3, area=28.27 r=
18、4, area=50.27 r=5, area=78.85 / * 當 r=6時, area=113.10 故此值沒有被 輸出 */ C語言程序設計 例 break舉例:小寫字母轉換成大寫字母,直至輸入非字母字符#include void main()char c; while(1) c=getchar(); if(c=a & c=A & c=Z) putchar(c); else break; break 使無限循環(huán)結束Continue語句功能:結束本次循環(huán),跳過循環(huán)體中尚未執(zhí)行的語句,進行下一次是否執(zhí)行循環(huán)體的判斷。continue 語句僅用于循環(huán)語句中。 C語言程序設計 break 和
19、continue 語句的區(qū)別continue 語句只結束本次循環(huán),break語句則是結束整個循環(huán)。 continue 語句只用于while,do-while,for循環(huán)語句中,break語句還可以用于switch語句中。流程形式(重要!) C語言程序設計 表達式continue;假(0)真(非0)while真(非0)docontinue;.表達式假(0)while表達式2continue;.假(0)真(非0)for表達式1表達式3 C語言程序設計 例4.5 把100200之間不能被3整除的數(shù)輸出#include void main() int i; for(i=100;i=200;i+) if
20、(i%3= =0) continue; printf(“%d”,n); 使用continue 結束本次循環(huán)i 200NYi =100i +for循環(huán)下面的語句i%3= =0YprintfN運行結果: 100,101, 103,104, 106,107, 109,110, 112,113, 115,116, 118,119, C語言程序設計 例 求輸入的十個整數(shù)中正數(shù)的個數(shù)及其平均值#include void main() int i,num=0,a; float sum=0; for(i=0;i10;i+) scanf(%d,&a);if(a=0) continue;num+;sum+=a;
21、printf(%d plus integers sum :%6.0fn,num,sum); printf(Mean value:%6.2fn,sum/num);4.9 程序舉例 C語言程序設計 t=1,pi=0,n=1.0,s=1當|t|1e-6pi=pi+tn=n+2s=-st=s/npi=pi*4輸出pi分子:1,-1,1,-1分母:1,3,5,7,.#include #include void main() int s; float n,t,pi; t=1; pi=0; n=1.0; s=1; while(fabs(t)=1e-6) pi=pi+t; n=n+2; s= -s; t=s/
22、n; pi=pi*4; printf(pi=%10.6fn,pi);運行結果: pi=3.141594 C語言程序設計 例4.7 求Fibonacci數(shù)列:1、1、2、3、5、8前40個數(shù)。 Fibonacci數(shù)列可以用一個有趣的古典數(shù)學問題來描述:有一對兔子,出生三個月后每個月都生一對兔子。小兔子長到三個月后每個月又生一對兔子。假設所有的兔子都不死,問每個月的兔子總數(shù)是多少對?月數(shù)小兔中兔老兔總數(shù)1111111111123450200002352 C語言程序設計 f1=1,f2=1for i=1 to 20輸出f1,f2f1=f1+f2f2=f2+f1#include #include vo
23、id main() long int f1,f2; int i; f1=1; f2=1; for(i=1;i=20;i+) printf(%12ld %12ld ,f1,f2); if(i%2=0) printf(n); f1=f1+f2; f2=f2+f1; 1534233159710946750255142293524578241578171855377258417711121393832040570288739088169213896104181286571964181346269922746563245986321144987676546368317811217830914930352
24、102334155 C語言程序設計 例4.8 判斷m是否素數(shù)。#include #include void main() int m,i,k; scanf(%d,&m); k=sqrt(m); for(i=2;ik) printf(%d is a prime numbern,m); else printf(%d is not a prime numbern,m);讀入mk=i=2當ikm被i整除真假用break結束循環(huán)i=i+1ik+1真假輸出”是素數(shù)”輸出”不是素數(shù)” 19 19 is a prime number C語言程序設計 例4.9 求100200間的全部素數(shù)。 由于不是求一個數(shù)是否
25、素數(shù),因此需要使用雙循環(huán)嵌套。外層第一個循環(huán),用于在100200間提取一個數(shù),然后內層第二個循環(huán)進行判斷。#include #include void main() int m, k, i, n=0; for(m=101;m=200;m=m+2) k=sqrt(m); for(i=2;i=k+1) printf(%d,m);n=n+1; if(n%10=0) printf(n); printf(n);運行結果: 101 103 107 109 113 127 131 137 139 149 157 163 167 173 179 181 191 193 197199 C語言程序設計 例4.10
26、 譯密碼。按一定規(guī)律將電文變成密碼: 將字母A變?yōu)镋、將字母a變?yōu)閑,即變成其后的第四個字母,W將變成A。字母按上述規(guī)律轉換,非字母字符不變。輸入一行字符,輸出相應密碼。分析:由于字符和整數(shù)之間可以通用,所以A-E對應A-A+4可以定義一個字符型變量c,c接受輸入,并c-c+4。特殊之處是W-Z和w-z之間時,它們需要對應為A-D和a-d,怎么辦?一種是用書上的辦法,再減回去,即用c-c-26來解決。ABCDEFGHIJKLMNOPQRSTUVWXYZ C語言程序設計 #include void main() char c; while(c=getchar()!=n) if(c=a&c=A&c
27、 Z&cz) c=c-26; printf(%c,c); printf(“n); Hello,world! Lipps,asvph!第五章 函數(shù)第5章 函數(shù) C語言程序設計 第5章 函數(shù)概述函數(shù)定義的一般形式函數(shù)參數(shù)和函數(shù)的值函數(shù)的調用函數(shù)的嵌套調用函數(shù)的遞歸調用例:#include stdio.hint sum(int x, int y); main() int a,b,s; a=23;b=12; s=sum(a,b); printf(s=%d,s);int sum(int x,int y) int z; z=x+y; return z; C語言程序設計 例: #include main(
28、) printstar( ); print_message( ); printstar( ); printstar( ) printf (“* n” ); print_message( ) printf (“ How do you do!n”) ; 運行結果: * How do you do! * *5.1 概述模塊化程序設計基本思想:將一個大的程序按功能分割成一些小模塊,特點:各模塊相對獨立、功能單一、結構清晰、接口簡單控制了程序設計的復雜性避免程序開發(fā)的重復勞動易于維護和功能擴充開發(fā)方法: 自上向下,逐步分解,分而治之C是模塊化程序設計語言C程序結構C是函數(shù)式語言必須有且只能有一個名為ma
29、in的主函數(shù)C程序的執(zhí)行總是從main函數(shù)開始,在main中結束函數(shù)分類從用戶角度標準函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù):用戶根據(jù)需要自己定義的函數(shù)從函數(shù)形式無參函數(shù) int max() .有參函數(shù) int max(int x,int y) .使用庫函數(shù)應注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件庫函數(shù)系統(tǒng)已經給我們編寫好的函數(shù),可以直接拿來使用,使用前需在程序的開頭使用include命令包含頭文件函數(shù)名功能abs求絕對值sin求正弦tan求正切數(shù)學函數(shù),頭文件是 math.h#includemain() int a=-1
30、, b; b=abs(a);printf(“%d”,b); 1 2abxyzint sum(int x,int y) /*定義sum函數(shù)/ int z; z=x+y; return z;main() int a,b,c; a=1; b=2; c=sum(a,b); /*調用sum函數(shù)求和*/printf(“a+b=%d”,c);x,y,z是在sum函數(shù)被調用時才臨時分配的空間,sum用完時空間收回int sum(int x,int y) /*定義sum函數(shù)/ int z; z=x+y; return z;main() int a,b,c; a=1; b=2; c=sum(a,b); /*調用s
31、um函數(shù)求和*/printf(“a+b=%d”,c);main() 調用sum函數(shù)sum函數(shù)執(zhí)行函數(shù)體返回int sum(int x,int y) /*定義sum函數(shù)/ int z; z=x+y; return z;main() int a,b,c; a=1; b=2; c=sum(a,b); /*調用sum函數(shù)求和*/printf(“a+b=%d”,c); c=sum(a, b);int sum(int x, int y)5.2 函數(shù)的定義一般格式合法標識符函數(shù)返回值類型缺省int型無返回值void函數(shù)體函數(shù)返回值類型 函數(shù)名(形參類型說明表)說明部分語句部分現(xiàn)代風格:例 有參函數(shù)(現(xiàn)代風格
32、) int max(int x,int y) int z; z=xy?x:y; return(z); 例 有參函數(shù)(現(xiàn)代風格) int max(int x, y) int z; z=xy?x:y; return(z); 例 空函數(shù) dummy( ) 函數(shù)體為空例 無參函數(shù) printstar( ) printf(“*n”); 或 printstar(void ) printf(“*n”); 函數(shù)類型 函數(shù)名(形參表)形參類型說明說明部分語句部分傳統(tǒng)風格:例 有參函數(shù)(傳統(tǒng)風格) int max(x,y) int x,y; int z; z=xy?x:y; return(z); 注意:函數(shù)不能嵌
33、套定義,即不能在一個函數(shù)的函數(shù)體內再定義另外的函數(shù)二、函數(shù)的返回值返回語句形式: return(表達式);或 return 表達式; 功能:使程序控制從被調用函數(shù)返回到調用函數(shù)中,同時把返值帶給調用函數(shù) C語言程序設計 說明:函數(shù)的返回值,必須用 return 語句帶回。return 語句只能把一個返值傳遞給調用函數(shù)。函數(shù)中可有多個return語句,執(zhí)行哪一個由程序執(zhí)行情況來定,只能執(zhí)行一個。 if(ab) return(a); else return(b); return 后的值可以是一個表達式,如:return(x y ? x : y);返回值的類型為定義的函數(shù)類型,不指定的按整型處理。如
34、: int max(int x, int y) float min(float a,float b) double abc(float d1,float d2)若 return 語句中表達式類型與函數(shù)類型不一致,則轉換為函數(shù)類型。若無return語句,遇時,自動返回調用函數(shù)??赡芊祷匾粋€不確定或無用的值 。無返回值的函數(shù),定義為 void 類型。 C語言程序設計 printstar() printf(*);main() int a; a=printstar(); printf(%d,a);例:無return語句,函數(shù)帶回不確定值輸出:10void printstar() printf(*);m
35、ain() int a; a=printstar(); printf(%d,a);編譯錯誤! C語言程序設計 void swap(int x,int y ) int temp; temp=x; x=y; y=temp; 例:無返回值函數(shù)例8.3: 函數(shù)返回值類型轉換#include void main() int max(float x,float y); float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z
36、);輸入:1.5,2.5輸出:Max is 25.3 函數(shù)參數(shù)和函數(shù)的值形式參數(shù)和實際參數(shù)形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù):調用函數(shù)時函數(shù)名后面括號中的表達式 C語言程序設計 例5.2比較兩個數(shù)并輸出大者#include main() int max(int x,int y); int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);int max(int x, int y) int z; z=xy?x:y; return(z);形參實參c=max(a,b);(main 函數(shù))(max 函數(shù))max(in
37、t x, int y) int z; z=xy?x:y; return(z); 運行:7,8 Max is 8 C語言程序設計 例5.2比較兩個數(shù)并輸出大者#include void main() int max(int x,int y); int a,b,c; scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);max(int x, int y) int z; z=xy?x:y; return(z);形參實參定義max函數(shù)調用max函數(shù)只有在max函數(shù)被調用時,其中的x,y,z才臨時分配空間,用完之后占用的空間就被釋放;x,y,z只在max
38、內起作用幾點說明:實參可以是常量、變量或表達式。必須有確定的值。當函數(shù)調用時,將實參的值傳遞給形參,若是數(shù)組名,則傳送的是數(shù)組首地址。 形參必須指定類型,只能是簡單變量或數(shù)組,不能是常量或表達式形參與實參類型一致,個數(shù)相同,順序相同。若形參與實參類型不一致,自動按形參類型轉換函數(shù)調用轉換形參在函數(shù)被調用前不占內存;函數(shù)調用時為形參分配內存;調用結束,內存釋放實參對形參的數(shù)據(jù)傳送是值傳送,也是單向傳送,當被調函數(shù)的形參發(fā)生變化時,并不改變主調函數(shù)實參的值。形、實參占據(jù)的是不同的存儲單元 C語言程序設計 5.4 函數(shù)的調用主調函數(shù):主動去調用其它函數(shù) 被調函數(shù):被其它函數(shù)所調用函數(shù)調用的一般形式函
39、數(shù)名(實參表列)說明:實參表列:有確定值的數(shù)據(jù)或表達式實參與形參個數(shù)相等,類型一致,按順序一一對應,當有多個實參時,實參間用“ ,”分隔實參表求值順序,因系統(tǒng)而定調用無參函數(shù)時,實參表列為空,但( )不能省 C語言程序設計 函數(shù)的嵌套調用 C語言程序設計 不允許嵌套定義,函數(shù)間的關系是平行的、獨立的。 C中的函數(shù): 允許嵌套調用,即在調用某函數(shù)過程中又調用另一函數(shù)。main( )調用函數(shù)a結束a函數(shù)b函數(shù)調用函數(shù)b(1)函數(shù)調用時,不用寫 返回值類型和實參類型 C語言程序設計 #include void main() int max(float x,float y); float a,b; i
40、nt c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);函數(shù)聲明函數(shù)調用;不寫返回值類型和實參類型如果寫成:c=int max(float x,float y);實參與形參個數(shù)相等,類型一致,按順序一一對應,當有多個實參時,實參間用“ ,”分隔實參表求值順序,因系統(tǒng)而定實參可以是常量,變量,表達式,甚至是函數(shù)的調用即:c=max(a+b,a-b);調用無參函數(shù)時,實參表列為空,但( )不能省函數(shù)有返回值時,函數(shù)調用可以作為一個表達式
41、出現(xiàn)在任意合法地方;當函數(shù)無返回值時,不能把函數(shù)調用的結果進行賦值例:void max(int x,int y) c=max(a,b); . C語言程序設計 函數(shù)調用過程中,數(shù)據(jù)是從實參向形參單向傳遞! C語言程序設計 c=max(a,b); /*調用max函數(shù)*/ /*定義max函數(shù)*/int max(int x, int y) int z; z=xy?x:y; return(z); yaxb特別注意:x和y只有在max函數(shù)被調用的時候才臨時分配空間,當調用結束時,x和y占據(jù)的空間將釋放;也就是用完就拋棄!注意:x和y值在max函數(shù)中如果發(fā)生變化,不會傳遞給a和b。即形參x和y的變化不會影響
42、實參a和b! C語言程序設計 #include void main() int f(int a,int b); int i=2,p; p=f(i,+i); printf(%d,p);int f(int a, int b) int c; if(ab) c=1; else if(a=b) c=0; else c=-1; return(c);例5.4 參數(shù)求值順序按自右向左求值函數(shù)調用等于f(3,3)運行結果:0按自左向右求值函數(shù)調用等于f(2,3)運行結果:- 1為使程序有通用性:需自右向左求值時,改為:j=+i; p=f ( j , j ) ;需自左向右求值時,改為:j = i ; k = +
43、i ; p = f ( j , k ) ;i=1;Printf(“%d,%d”,i,i+); /*VC中自左向右 1,1*/VC中是按的:自右向左函數(shù)調用的方式按函數(shù)在程序中出現(xiàn)的位置,有三種調用方式:函數(shù)語句:以獨立的語句去調用函數(shù)。不要求有返回值,僅完成一定的操作。 例 printstar(); printf(“Hello,World!n”);函數(shù)表達式: 函數(shù)返回一個確定值,以參加表達式的運算。不可用于void例 m=max(a,b)*2;函數(shù)參數(shù):函數(shù)調用作為另一個函數(shù)的參數(shù)。 例 printf(“%d”,max(a,b); /*輸出大數(shù)*/ m=max(a,max(b,c); /*三
44、數(shù)比大小*/ C語言程序設計 C語言程序設計 例:形、實參占據(jù)的是不同的存儲單元#include void main( ) int a=2,b=3; printf (“a=%d, b=%d n”,a, b); printf(“&a=%x,&b=%xn” ,&a,&b); add(a,b); /*調用add函數(shù)*/ printf(“a=%d,b=%dn”, a,b); printf(“&a=%x,&b=%xn”, &a,&b); add(int x,int y) /*定義add函數(shù)*/x=x+8; y=y+12; printf(“x=%d,y=%d n”,x,y); printf(“&x=%x,
45、&y=%xn”,&x,&y); 2+8=103+12=1523ffd0ffd4ffd8ffdcxayb運行結果: a=2,b=3&a=ffd8,&b=ffdc x=10,y=15 &x=ffd0,&y=ffd4a=2, b=3&a=ffd8,&b=ffdc調用完成后x和y所占空間釋放!對被調用函數(shù)的聲明和函數(shù)原型對被調用函數(shù)要求:必須是已存在的函數(shù)庫函數(shù): #include 用戶自定義函數(shù):如果被調函數(shù)定義在主調函數(shù)之后,那么在主調函數(shù)中對被調函數(shù)作聲明。 C語言程序設計 函數(shù)聲明一般形式:函數(shù)類型 函數(shù)名(形參類型 形參名,. ); 或 函數(shù)類型 函數(shù)名();作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)
46、個數(shù)及類型,以便檢驗C語言中函數(shù)聲明稱為函數(shù)原型。函數(shù)定義與函數(shù)聲明不同,聲明只與函數(shù)定義的第一行相同。聲明可以不寫形參名,只寫形參類型。函數(shù)說明位置:程序的數(shù)據(jù)說明部分(函數(shù)內或外) C語言程序設計 #include void main() float add(float x,float y ); /*對被調用函數(shù)的聲明*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); /*調用add函數(shù),在前*/ printf(sum is %f,c);float add(float x, float y) /*定義add函數(shù),在后*/ float z; /*函
47、數(shù)體 z=x+y; return(z); float add(float,float);例5.5 對被調用的函數(shù)作聲明輸入:3.6 ,6.5輸出:sum is 10.100000說明:舊版本C中函數(shù)聲明不采用函數(shù)原型,只聲明函數(shù)名和函數(shù)類型。如: float add( )函數(shù)調用之前,如果未對函數(shù)作聲明,則編譯系統(tǒng)把第一次遇到的函數(shù)形式作為函數(shù)聲明,并默認為int型。即:函數(shù)類型是int型可以不作函數(shù)聲明,最好作聲明。被調用函數(shù)的定義(程序)在主調函數(shù)之前,可以不加函數(shù)聲明。在所有函數(shù)定義前,已在函數(shù)外部做了函數(shù)聲明,則在各主調函數(shù)中可以不加函數(shù)聲明。 C語言程序設計 #include flo
48、at add(float x, float y) float z; z=x+y; return(z);main() float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);被調函數(shù)出現(xiàn)在主調函數(shù)之前,不必函數(shù)說明void main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=xy?x:y; return(z);int型函數(shù)可不作函數(shù)說明char lette
49、r(char,char);float f(float,float);int I(float,float);main()char letter(char c1,char c2)float f(float x,float y)Int I(float j,float k)在函數(shù)外面做函數(shù)說明 C語言程序設計 main()調fun()結束fun()返回保存:返回地址當前現(xiàn)場恢復:主調程序現(xiàn)場返回地址函數(shù)調用的執(zhí)行過程 C語言程序設計 #include int fun1(int x,int y);void main(void) int a,b; scanf(“%d%d”,&a,&b); printf(“
50、The result is:%dn”,fun1(a,b) );int fun1(int x,int y) int fun2(int m); return ( fun2(x)+fun2(y) );int fun2(int m) return (m*m);例 輸入兩個整數(shù),求平方和輸入: 3 4輸出: The result is: 25 C語言程序設計 #include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%
51、d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d);例 求三個數(shù)中最大數(shù)和最小數(shù)的差值int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z);int min(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z);main( )調用函數(shù)dif輸出結束dif函數(shù)max函數(shù)調用函數(shù)max調用函數(shù)minmin函數(shù)skip5.6
52、函數(shù)的遞歸調用遞歸:在函數(shù)調用過程中,直接或間接的調用自身。遞歸調用方式直接遞歸調用:在函數(shù)體內又調用自身 C語言程序設計 f( )調fint f(int x) int y,z; z=f(y); . return(2*z);間接遞歸調用:當函數(shù)1去調用另一函數(shù)2時,而另一函數(shù)2反過來又調用函數(shù)1自身。 C語言程序設計 調f2調f1f1( )f2( )int f1(int x) int y,z; z=f2(y); . return(2*z);int f2(int t) int a,c; c=f1(a); . return(3+c);解決無終止遞歸調用的方法是:確定好結束遞歸的條件。 條件成立,進
53、行遞歸 用if語句控制 條件不成立,結束遞歸 C語言程序設計 例5.7 有5個人,第5個人比第4個人大2歲,第4個人比第3個人大2歲,第2個人比第1個人大2歲,第1個人10歲,問第5個人多大? age(5) age(4) age(3) age(2) age(1) =2+age(4) =2+age(3) =2+age(2) =2+age(1) =10=18 =16 =14 =12 10 n=1數(shù)學模型:age(n)= age(n-1)+2 n1age(int n) int c; if(n=1) c=10; else c=2+age(n-1); return(c); #include void m
54、ain( ) printf(“%d n”, age(5);運行結果:18回推遞推有些問題,可以用遞推,也可以用遞歸的方法解決。遞推:從一個已知的事實出發(fā),按一定規(guī)律推出下一個事實,再從已知的新的事實,推出下一個新的事實. C語言程序設計 例 用遞推法求n! ,即從1開始, 乘2, 乘3.一直到n #include void main( ) int i, s=1; for(i=1;i=5;i+) s=s* i; printf(“s=%d n”,s); 運行結果:s=120遞歸:在函數(shù)調用自身時,要給出結束遞歸的條件。先回推再遞推如:n!, 5!=5 4! 4!=4 3! 3!=3 2! 2!=2
55、 1! 1!=1 0!=1 C語言程序設計 1 (n=0,1) n!= n*(n-1)! (n1)#include void main() float fac(int n); int n; float y; printf(Input a integer number:); scanf(%d,&n); y=fac(n); printf(%d! =%15d,n,y);float fac(int n) float f; if(n0) printf(n0,data error!); else if(n=0|n=1) f=1; else f=fac(n-1)*n; return(f);運行:input
56、a integer number:1010! = 3628800例5.8 用遞歸方法求n!十九世紀未,歐洲珍奇商店出現(xiàn)一種漢諾塔游戲,推銷材料介紹說:古代印度布拉瑪廟里的僧侶們正在玩這種游戲,如果游戲結束,世界未日即來臨。是一個只能用遞歸方法解決的問題。 規(guī)則及分析: n個盤子從一根針移到另一根針,每次只能移動一個盤子,不允許大盤在小盤上面。 共有三根針,n個盤子由A移到C,需移動的次數(shù)是2n -1, 若64個盤子移動的次數(shù)為: 264 - 1=18, 446, 744, 073, 709, 551, 600 一年的秒數(shù)是:365 x 24 x 60 x 60=31536000 1844674
57、407370951160031536000 =58494217355年 即:5849億年, 從能源角度推算, 太陽系壽命只有150億年 C語言程序設計 例5.9 Hanoi(漢諾)塔問題 BCA方法與步驟將A上n-1個盤子借助C移到B 。把A上剩下一個盤子送到C將n-1個盤子從B借助A移到C C語言程序設計 BCA簡化實例:將A上3個盤子移到C步驟:1. A上兩個盤子借助C移到B 2. A上最后一個盤子移到C (可直接完成) 3. B上兩個盤子借助A移到C 第一步進一步分解: 1.1 A上一個盤子從AC 1.2 A上一個盤子從AB 1.3 C上一個盤子從CB 第三步進一步分解: 3.1 B上一
58、個盤子從BA 3.2 B上一個盤子從BC3.3 A上一個盤子從AC共移動7步:23-1次所以,n個盤要移動2n-1次結論:上面三個步驟包含兩類操作步驟1和3都是將n-1個盤子從一個針移到另一個針上(n1時),這是一個遞歸的過程;方法一樣,只是針的名稱不同而已,為使問題一般化,將步驟1和3表示為:將one 針上的n-1個盤子移到two針,借助 three針,只是對應關系不同。第一步對應關系:one A two B three C 第三步對應關系:one B two C three A 將1個盤子從一個針上移到另一針上。因此,可以用兩個函數(shù)分別實現(xiàn)上面兩類操作,用hanoi函數(shù)實現(xiàn)第一類操作,用m
59、ove函數(shù)實現(xiàn)第2類操作。hanoi(n,one,two,three) 將n個盤從 one three借助twomove(x,y) 將1個盤從x y座,x、y根據(jù)情況取代ABC座中的1個。 C語言程序設計 C語言程序設計 例5.9 用遞歸方法解決Hanoi(漢諾)塔問題的程序 #include void main() void hanoi(int n,char one,char two,char three); int m; printf(Input the number of diskes:); scanf(%d,&m); printf(The step to moving %3d disk
60、es:n,m); hanoi(m,A,B,C);void hanoi(int n,char one,char two,char three)void move(char x, char y); if(n=1) move(one,three); else hanoi(n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); void move(char x, char y) printf(%c-%cn,x, y); 運行: input number of diskes: 3the step to moving 3 diskes:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二手房專業(yè)獨家代理權合同模板版
- 2025年智能汽車分期付款抵押合同
- 2025年度個人與企業(yè)間設備分期借款合同2篇
- 二零二五年度棉花種植保險合同4篇
- 2025年度土地租賃合同租賃期滿后續(xù)約協(xié)議
- 二零二五年度體育休閑用地及體育場館房屋轉讓合同
- 二零二五年度口紅租賃與品牌授權合作合同3篇
- 二零二五年度醫(yī)療設備融資租賃合同模板9篇
- 2025年教育培訓機構兼職招生銷售合同3篇
- 2025年度辦公樓保潔服務合同規(guī)范集3篇
- 華為HCIA-Storage H13-629考試練習題
- Q∕GDW 516-2010 500kV~1000kV 輸電線路劣化懸式絕緣子檢測規(guī)程
- 遼寧省撫順五十中學2024屆中考化學全真模擬試卷含解析
- 2024年湖南汽車工程職業(yè)學院單招職業(yè)技能測試題庫及答案解析
- 家長心理健康教育知識講座
- GB/T 292-2023滾動軸承角接觸球軸承外形尺寸
- 軍人結婚函調報告表
- 民用無人駕駛航空器實名制登記管理規(guī)定
- 北京地鐵6號線
- 航空油料計量統(tǒng)計員(初級)理論考試復習題庫大全-上(單選題匯總)
評論
0/150
提交評論