講授提綱第七章_函數(shù)(1)_第1頁
講授提綱第七章_函數(shù)(1)_第2頁
講授提綱第七章_函數(shù)(1)_第3頁
講授提綱第七章_函數(shù)(1)_第4頁
講授提綱第七章_函數(shù)(1)_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第七章 函數(shù)函數(shù)一、函數(shù)及其定義1函數(shù)定義的一般形式(p114)返回值類型 函數(shù)名 ( 形式參數(shù)表 )形式參數(shù)類型描述; (函數(shù)內(nèi)部的)變量定義與有關說明語句部分函數(shù)的可執(zhí)行語句序列函數(shù)頭、函數(shù)體例7-1 求兩個整數(shù)的最大值的函數(shù)定義。(或p115)int max ( x,y ) /* 定義了有兩個形式參數(shù)x,y且返回int值的函數(shù)max */int x, y; /* 說明了形參x,y均為int型 */ int z; /* 定義了函數(shù)內(nèi)部使用的變量z */z = x>y ? x:y; /* 將x,y中較大值送入z */return (z);/* 將z做為函數(shù)返回值,并使函數(shù)返回到被調(diào)程序

2、(父程序) */2關于函數(shù)返回值類型 允許C基本數(shù)據(jù)類型和任何有意義的用戶自定義類型。 如果省略返回值類型則隱含返回int類型。 沒有返回值的函數(shù)。3關于形式參數(shù)及形參說明函數(shù)參數(shù)是為在函數(shù)和父程序間傳遞數(shù)據(jù)而設置的。各參數(shù)在被父程序調(diào)用時才從父程序處獲得真正的值,因而在定義函數(shù)時參數(shù)是“形式上”的值稱形式參數(shù),簡稱形參。函數(shù)被調(diào)用時形參從父程序處獲得的真實值稱實際參數(shù),簡稱實參。實參傳遞給形參的過程稱實形結(jié)合,加上函數(shù)處理結(jié)果返回到父程序的過程統(tǒng)稱函數(shù)的參數(shù)傳遞,函數(shù)參數(shù)傳遞是函數(shù)技術中的重要內(nèi)容。 形參之間以“,”分隔。 形參是局部性變量,只在函數(shù)內(nèi)有效。 兩種形參說明效果相同。無參函數(shù)的

3、()不能省略,以示位于()前面的標識符是函數(shù)名。 char GetCHAR() int k; k =getchar(); if( k>=a && k<=z) return k-32; else return 0; 4關于函數(shù)體與函數(shù)返回。 函數(shù)體是實現(xiàn)函數(shù)功能的程序片斷,函數(shù)體的設計與通常的編程在編程思想和技術上沒有任何差別。 返回語句return使函數(shù)退出運行返回到父程序繼續(xù)執(zhí)行,同時將函數(shù)值帶回父程序。return語句共有4種形式。return(表達式);return 表達式;return; 無return語句。 return語句可以安排在函數(shù)體任何位置,也可安

4、排多條return語句。5關于多個函數(shù)的位置關系:并列關系而非嵌套關系。 6關于主函數(shù)main() 程序中有且僅有一個main()函數(shù),程序從main()函數(shù)開始執(zhí)行。 main() 函數(shù)也有形參,參數(shù)由操作系統(tǒng)給出,即“命令行參數(shù)”。二、函數(shù)調(diào)用1函數(shù)調(diào)用的一般形式(p115)函數(shù)名(實參表)2函數(shù)調(diào)用與函數(shù)執(zhí)行過程(p116)(1) 為函數(shù)的形參分配內(nèi)存空間;(2) 計算實參表達式的值,并將實參表達式的值賦給對應的形參;(3) 為函數(shù)的局部變量分配內(nèi)存空間;(4) 執(zhí)行函數(shù)體內(nèi)的語句片段;(5) 函數(shù)體執(zhí)行完畢或執(zhí)行了函數(shù)體內(nèi)的return語句(若return語句帶表達式,則計算出該表達式

5、的值,并以此值作為函數(shù)的返回值)后,釋放為這次函數(shù)調(diào)用分配的全部內(nèi)存空間;(6) 將函數(shù)及返回值返回到父程序的函數(shù)調(diào)用處,繼續(xù)執(zhí)行父程序。例7-2 如下給出了程序中調(diào)用max函數(shù)的全過程說明。 #include <stdio.h> float max( float x, float y ) float z; z = x>y ? x : y; return z; main() float a=19.8, b=-98.8, c; c = max( a, b ); printf( "MAX(a,b)=%fn", c ); 三、函數(shù)的參數(shù)傳遞方式1傳值方式例7-3

6、 返回階乘的函數(shù)及其調(diào)用,函數(shù)調(diào)用時參數(shù)采用傳值方式。 #include <stdio.h> float fac( int n ) int f= 1.0; while ( n >= 1 ) f = f * n; -n; return ( f ); main() int k = 6; printf( "%8.1fn", fac( k ) ); 2傳地址方式例7-4 返回階乘的函數(shù)及其調(diào)用,函數(shù)調(diào)用時采用傳地址方式。 #include <stdio.h> float fac( int *n ) int f= 1.0; while ( *n >

7、= 1 ) f = f * (*n); -(*n); return ( f ); main() int k = 6; printf( "%8.1fn", fac( &k ) ); 要點 傳值方式中函數(shù)對形參的處理是在函數(shù)內(nèi)部變量中進行的,形參在函數(shù)內(nèi)的改變不會使與之結(jié)合的實參變量發(fā)生變化,稱變量直接操作。傳地址方式中函數(shù)對形參的處理是在形參的所指對象單元即與形參結(jié)合的實參變量上進行的,形參在函數(shù)中的改變實質(zhì)是實參變量的改變,稱變量間接操作。四、函數(shù)的類型說明函數(shù)類型說明有三種方法 將函數(shù)定義放在函數(shù)調(diào)用之前。 在函數(shù)調(diào)用之前的任何位置安排一條類型說明語句,形式為:返

8、回值類型 函數(shù)名(); 在調(diào)用函數(shù)的父程序內(nèi)的變量定義處,順便說明函數(shù)返回值類型。規(guī)定 如果函數(shù)返回int, char類型可以不進行函數(shù)類型說明。§7.2 指針與函數(shù)的參數(shù)傳遞一、向函數(shù)中傳遞變量的指針例7-5 試圖用swap() 函數(shù)將兩實參變量的值交換。void _swap( int x, int y ) int z; z=x; x=y; y=z; main() int a=10, b=20; _swap( a,b ); printf( "a=%d, b=%dn", a, b); 結(jié)論傳值方式不能將“形參的值”“傳回”父程序中的實參。例7-6 用swap函數(shù)將

9、兩實參變量的值交換。 #include <stdio.h> void swap( int *x, int *y ) int z; z = *x; *x = *y; *y = z; main() int a=10, b=20; swap( &a, &b ); printf( "a=%d, b=%dn", a, b); 結(jié)論傳地址方式可以將“形參的值”“傳回”父程序中的實參。二、通過指針向函數(shù)中傳遞一維數(shù)組方法 定義一個指針形參,函數(shù)調(diào)用時將實參數(shù)組的首地址賦值給指針形參,從而達到“對形參數(shù)組的處理是在實參數(shù)組上進行的”的效果。例7-7 求整型數(shù)組各

10、元素之和。int add( int *x, int n ) int sum, i; for( sum=0,i=0; i<n; i+ ) sum += *(x+i); return sum; main() int arr4 = 1,3,4,5 , s; s = add( arr, 4 ); printf( "%dn", s ); 數(shù)組的元素描述形式也可采用下標法或元素指針法。 for( sum=0,i=0; i<n; i+ ) sum += xi; /* 下標法 */ for( sum=0,i=0; i<n; i+ ) sum += x+; /* 元素指針法

11、 */ 2000 1 arr0 2002 3 arr12004 4 arr22006 5 arr32008 2000 x 2010 4 n 2012 sum 2014 i三、通過指針向函數(shù)中傳遞字符串方法定義一個指向字符(串)的指針變量作形參,調(diào)用時將字符串的首地址與形參變量結(jié)合使形參指針指向了實參字符串。這樣在函數(shù)中對字符串的處理實質(zhì)是在實參字符串上進行的。例7-8 將字符串中所有小寫字母改成大寫字母進行輸出,小寫轉(zhuǎn)大寫工作由自定義函數(shù)StrToUpr()完成。void StrToUpr( char *s ) while ( *s != '0' ) if ( *s>=&

12、#39;a' && *s<='z' ) *s = *s - ('a'-'A'); +s; main() char str40; gets( str ); StrToUpr( str ); puts( str ); 例7-9 用函數(shù)實現(xiàn)字符串的復制。 #include <stdio.h> void StrCopy( char *from, char *to ) while ( *from != '0' ) *to+ = *from+; *to = '0' main() cha

13、r str140, str240; gets( str1 ); StrCopy( str1, str2 ); puts( str2 ); 四、 通過指針向函數(shù)中傳遞二維數(shù)組方法傳二維數(shù)組首地址以使函數(shù)中的形參指針指向二維數(shù)組,形成“對形參數(shù)組處理實質(zhì)上是在實參二維數(shù)組上進行”的效果。例7-10 求二維數(shù)組中元素的最大值。程序1int Arr2Max( int a3, int m ) /* int Arr2Max(int (*a)3,int m) */ int max=-32768, i, j; for ( i=0; i<m; i+ ) for( j=0; j<3; j+ ) if(

14、 aij > max ) max = aij; return max; main() int arr23 = 1,4,7,4,18,6 ; printf( "MAX=%dn", Arr2Max(arr,2) ); 程序2 形參描述為指向一維數(shù)組的指針,函數(shù)描述改為int Arr2Max(int (*a)3,int m)。 程序3 形參描述為指向一維數(shù)組的指針,元素的處理采用游動的元素指針法。 #include <stdio.h> int Arr2Max( int (*a)3, int m ) int max=-32768, j; int (*p)3; fo

15、r ( p=a; p<a+m; p+ ) for( j=0; j<3; j+ ) if( (*p)j > max ) max = p0j; return max; main() int arr23 = 1,4,7,4,18,6 ; printf( "MAX=%dn", Arr2Max(arr,2) ); 五、返回指針的函數(shù)例7-11 某字符數(shù)組中存有兩個字符串以 0做為串結(jié)束符,即字符數(shù)組中先存一個字符串以0結(jié)束,從0的下一字符位置又存有一個字符串以0結(jié)束,如下程序可以打印出第2個字符串。 #include <stdio.h> char *Se

16、condStr ( char *s ) while ( *s!='0' ) s+; return ( s+1 ); main() char str40 = "abcdef0ABCDEFGH", *str2; str2 = SecondStr( str ); puts( str2 ); §7.3 函數(shù)程序設計要點1 必須了解開發(fā)環(huán)境所能提供的系統(tǒng)函數(shù)。要點2 如何設計給定功能的函數(shù),設計必須嚴格按如下步驟進行。(1)清楚知道函數(shù)所要完成的功能。(2)入口參量設計。要說明參數(shù)個數(shù),傳遞方式,形參名,參數(shù)含義。(3)出口參量設計。要說明出口參量個數(shù),參量

17、傳遞方式,參量含義。(4)寫出正確的函數(shù)頭描述。(5)函數(shù)體設計。要點3 如何劃分函數(shù)。一、給定功能設計函數(shù)例7-12 設計函數(shù)計算n!設計過程(1)明確函數(shù)功能:求一個正整數(shù)的階乘。(2)入口參量設計。(3)出口參量設計。(4)函數(shù)頭描述:float fac (int n)(5)函數(shù)體設計。float fac ( int n ) int i; float p; for ( p=1,i=1; i<=n; i+ ) p *= i; return p; 例7-13 設計函數(shù)求一維數(shù)組中的最大值和最小值。設計過程 入口參量。 出口參量。 函數(shù)頭描述。void MaxMin( a, n, max

18、, min )float a, *max, *min; / 或 float *a, *max, *min; */int n; 函數(shù)體設計。函數(shù)及調(diào)用程序 void MaxMin( a, n, max, min ) float a, *max, *min; int n; int i; *max = *min = a0; for ( i=1; i<n; i+ ) if ( ai > *max ) *max = ai; if ( ai < *min ) *min = ai; main() float a5 = 1,23,45,-9,7, c, d; MaxMin( a, 5, &a

19、mp;c, &d ); printf( "MAX=%6.1f MIN=%6.1fn", c, d ); 例7-14 編寫函數(shù)將3個整數(shù)排序并求和。設計過程 參量設計。 函數(shù)頭描述。int SortSum( int *x1, int *x2, int *x3 )函數(shù)設計結(jié)果 int SortSum( int *x1, int *x2, int *x3 ) int t; if( *x1 > *x2 ) t=*x1; *x1=*x2; *x2=t; if( *x1 > *x3 ) t=*x1; *x1=*x3; *x3=t; if( *x2 > *x3

20、) t=*x2; *x2=*x3; *x3=t; return ( *x1 + *x2 + *x3 ); 二、 借助函數(shù)編寫程序例7-15 計算S=Cn1+Cn3+Cnk (n由鍵盤輸入,k為不大于n的最大整數(shù))。設計過程程序結(jié)構(gòu)為: 輸入n 累加器s清0 for ( i=1; i<=n;i+=2 ) 計算Cni => p è Cni = n! ( i! * (n-i)! ) s += p 輸出s 設計函數(shù) float fac (int n);#include "stdio.h" float fac( int n ) int i; float p; f

21、or( p=1,i=1; i<=n; i+ ) p *= i; return p; main( ) int n, i, sum; scanf ( "%d", &n ); for ( sum=0,i=1;i<=n;i+=2 ) sum += fac(n) / fac(i) / fac(n-i); printf ( "%dn", sum ); 例7-16 對M行N列矩陣的每行分別求和,將最小的和數(shù)輸出。思考過程 函數(shù)Sum():求和及存入一維數(shù)組bM。函數(shù)Min():求數(shù)組最小值。 Sum()函數(shù)的設計 入口參量:一個M行N列的二維數(shù)組,

22、描述為int xN。出口參量:一個M個元素的一維數(shù)組,描述為int y或int *y。函數(shù)頭描述:void Sum ( int x N, int y )函數(shù):void Sum ( int xN, int y ) int i, j; for ( i=0; i<M; i+ ) yi = 0; for ( j=0; j<N; j+ ) yi += xij; Min()函數(shù)的設計 入口參量:一個M個元素的一維數(shù)組,描述為int x或int *x。出口參量:以函數(shù)返回值形式返回的x數(shù)組最大值。函數(shù)頭描述:int Min ( int *x )函數(shù):int Min( int *x ) int i

23、, min; min = x0; for ( i=1; i<M; i+ ) if ( xi < min ) min = xi; return min; 主函數(shù)main() #include <stdio.h> #define M 3 #define N 3 main() int aMN= 1,2,3, 1,2,2, 3,4,5 ; int bM; Sum ( a, b); printf( "Min=%dn", Min( b ) ); 例7-36 求一組分數(shù)之和S= ,以輸入了0(分子為0或分母為0)結(jié)束輸入及求和過程。#include <std

24、io.h>int gcd( int m, int n ) /* 用歐氏“輾轉(zhuǎn)相除法”求m,n的最大公約數(shù) */ /*函數(shù)體請參見例4-29 */ main() int s1, s2, a, b, k; s1 = 0; s2 = 1; scanf( "%d %d", &a, &b ); while ( a!=0 && b!=0 ) k = gcd(a,b); a /= k; b /= k; s1 = s1*b + s2*a; s2 = s2*b; k = gcd(s1,s2); s1 /= k; s2 /= k; scanf ( &quo

25、t;%d %d", &a, &b ); printf( "%d/%d=%7.2fn", s1, s2, (float)s1/s2 ); 函數(shù)嵌套調(diào)用與遞歸調(diào)用一、函數(shù)的嵌套調(diào)用例7-22 用函數(shù)實現(xiàn)起泡排序。void swap( int *x, int *y ) int t; t = *x; *x = *y; *y = t; void BubbleSort( int x, int n ) int i, j; for ( i=0; i<n-1; i+ ) for ( j=0; j<n-i-1; j+ ) if ( xj > xj+1

26、 ) swap( &xj, &xj+1 ); main() int a100, n, i; printf("input n="); scanf( "%d", &n ); for ( i=0; i<n; i+ ) scanf( "%d", &ai ); BubbleSort( a, n ); for ( i=0; i<n; i+ ) printf( "%d ", ai ); 二、函數(shù)的遞歸調(diào)用遞歸問題特征(1)細化出的子問題與原問題性質(zhì)相同但比原問題簡單。(2)問題有“不含

27、遞歸的”最簡解。例7-23 用遞歸方法求階乘。 #include <stdio.h> long fac( int n ) if ( n = 1 ) return 1; else return n * fac(n-1); main() printf( "%ldn", fac(4) ); 遞歸函數(shù)設計要點(1)遞歸函數(shù)中含有從原問題到子問題轉(zhuǎn)換的遞歸調(diào)用語句。(2)遞歸函數(shù)有引起問題越來越簡單并反映原問題與子問題性質(zhì)的形參。(3)遞歸函數(shù)中必須有不含遞歸的最簡情況處理語句。例7-18 菲波拉奇數(shù)列第一項是0,第二項是1,以后每一項是前2項的和。用遞歸函數(shù)求菲波拉奇數(shù)

28、到的第n項。int fib( int n ) if ( n = 1 ) return 0; if ( n = 2 ) return 1; return fib( n-1 ) + fib( n-2 ); main() int k=8; printf( "Fib(%d)=%dn", k, fib(k) ); 例7-19 用遞歸函數(shù)實現(xiàn)輾轉(zhuǎn)相除法求最大公約數(shù)。int gcd( int m, int n ) if ( n = 0 ) return m; else return gcd( n, m%n ); main() int a, b; scanf( "%d %d&qu

29、ot;, &a, &b ); printf( "gcd(%d,%d)=%dn", a, b, gcd(a,b) ); §7.5變量的存儲類型一、變量的存儲性質(zhì)變量的數(shù)據(jù)性質(zhì) 變量的存儲性質(zhì)變量存儲類型auto 自動變量static 靜態(tài)變量extern 外部變量register 寄存器變量變量定義的完整格式 (變量存儲類型標識符) 變量數(shù)據(jù)類型標識符 變量表;二、自動變量(局部變量)三、外部變量(全局變量)四、靜態(tài)變量內(nèi)部靜態(tài)變量與局部變量的區(qū)別外部靜態(tài)變量與全局變量的區(qū)別五、寄存器型變量六、再論變量初始化1靜態(tài)變量的初始化2動態(tài)變量的初始化例7-

30、20 閱讀下列程序并回答問題。(1)程序中定義的各個變量的存儲類型是什么?分配在什么數(shù)據(jù)區(qū)?生存期、作用域是什么?(2)寫出程序運行結(jié)果。 #include <stdio.h> int n = 1 ; main() static int x = 5 ; int y ; y = n; A: printf( "MAIN: x=%2d y=%2d n=%2dn", x, y, n ); B: func(); C: printf( "MAIN: x=%2d y=%2d n=%2dn", x, y, n ); D: func(); func() sta

31、tic int x = 4 ; int y = 10; x += 2; n += 10; y += n; E: printf( "FUNC: x=%2d y=%2d n=%2dn", x, y, n ); MAIN: x=5,y=1,n=1FUNC:x=6, y=21,n=11MAIN:x=5,y =1,n=11FUNC:x=8,y=31,n=21 系統(tǒng)函數(shù)函數(shù)的程序閱讀例7-26 以下程序的運行結(jié)果是什么?sub( int x, int y, int *z ) *z = x + y; main() int a, b, c; A: sub(10, 5, &a); B

32、: sub( 7, a, &b); C: sub( a, b, &c); printf( "%d %d %dn", a, b, c); 例7-27 寫出以下程序的運行結(jié)果。int a10, i; main() sub1(); sub3(a); sub2(); sub3(a); sub1() for ( ;i<10; i+ ) ai=i+i; sub2() int a10, i; for (i=0; i<10; i+ ) ai = i; sub3( int a ) int i; for ( i=0;i<10;i+ ) printf( "%d ", ai );*例7-28 閱讀程序?qū)懗鲞\行結(jié)果,并說明函數(shù)功能。int *find( int *x, int id ) while( *x != id ) if( *x>=3 &

溫馨提示

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

評論

0/150

提交評論