C語言程序設計教程(第2版)-課件 第7章 函數調用_第1頁
C語言程序設計教程(第2版)-課件 第7章 函數調用_第2頁
C語言程序設計教程(第2版)-課件 第7章 函數調用_第3頁
C語言程序設計教程(第2版)-課件 第7章 函數調用_第4頁
C語言程序設計教程(第2版)-課件 第7章 函數調用_第5頁
已閱讀5頁,還剩59頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

函數調用概述函數的定義函數參數和函數值函數的調用局部變量和全局變量問題引入:

假設一個年級有20個班,每個班10位同學,要求編寫一個程序完成計算每個班的平均分和最高分。1、編寫函數專門完成計算10位同學的平均分和最高分;2、調用20次該函數即可完成這20個班的平均分和最高分。#include<stdio.h>intmax(intx,inty){intz;z=x>y?x∶y;

return(z);}intmain(){inta,b,c;

scanf(”%d,%d”,&a,&b);

c=max(a,b);

printf(“Maxis%d”,c);}main函數23abcmax函數xyz2333c=max(a,b);概述1、一個C程序可以分為若干個函數;2、每個程序有且只能有一個主函數(main),其他函數都是子函數;3、子函數可以互相調用,但主函數不能被調用;4、一個C源程序由一個或多個文件構成,一個源程序文件是一個編譯單位。說明:1、C程序的執行從main函數開始,調用其他函數后仍回到main函數,程序在main函數結束時結束;2、所有子函數都是平行的,任何子函數都不屬于其他函數;3、從用戶的角度看,函數可分為標準函數和自定義函數;4、從函數形式看,可分為無參數函數和有參數函數。#include<stdio.h>intprintstar(){printf("*******\n");}intprint_message(){printf("Howdoyoudo!\n");}intmain(){printstar();

print_message();

printstar();

}函數定義的一般形式函數定義的一般形式:

類型說明函數名([形式參數說明]){

函數體

}形式參數說明方法:

類型說明變量名[,類型說明變量名]…#include<stdio.h>intmax(intx,inty)

{intz;z=x>y?x∶y;

return(z);}intmain(){inta,b,c;

scanf(”%d,%d”,&a,&b);

c=max(a,b);

printf(“Maxis%d”,c);}2,3Maxis31)無參函數的定義形式

類型說明函數名()

{函數體}2)有參函數的定義形式

類型說明函數名(形式參數說明)

{函數體}3)空函數的定義形式

類型說明函數名([形式參數說明])

{}說明:1)一般情況下,函數體由兩部分組成:

{[局部變量說明]

語句

}intmax(intx,inty)

{intz;z=x>y?x∶y;

return(z);}說明:2)局部變量:函數體內定義的變量。其有效范圍僅限于所在的函數內部,離開函數體則無意義。intmax(intx,inty)

{intz;z=x>y?x∶y;

return(z);}函數參數和函數的值#include<stdio.h>intmax(intx,inty){intz;z=x>y?x∶y;

return(z);}intmain(){inta,b,c;

scanf(”%d,%d”,&a,&b);c=max(a,b);

printf(“Maxis%d”,c);}

各函數間的信息的往來是由參數傳遞和返回語句實現。一、形式參數和實際參數函數參數:用于函數間數據的傳遞形式參數:定義函數時使用的參數實際參數:引用函數時使用的參數函數max有兩個形式參數x和y,形參x和y只在函數max中使用。a和b是主函數中定義的變量,main函數調用函數max,a和b為函數max的實參。說明:1)定義函數時,必須說明形參的類型,形參只能是變量或數組;2)函數被調用前,形參不占用內存;函數調用結束后,形參所占用的內存也將被回收;intmax(intx,inty)

{intz;z=x>y?x:y;

return(z);}說明:3)實參可以是常量、變量或表達式;4)實參與形參的類型應相同或賦值兼容。字符型和整型可以互相匹配;5)C語言中實參對形參的數據傳遞是“值傳遞”,即單向傳遞。它僅由參數的對應位置確定,與名字無關。intmain(){inta,b,c;

scanf(”%d,%d”,&a,&b);

c=max(a,b);

printf(“Maxis%d”,c);}intmax(intx,inty){intz;z=x>y?x:y;

return(z);}#include<stdio.h>intmax(intb,inta)

{intc;

c=b>a?b∶a;

return(c);}intmain(){inta,b,c;

scanf(”%d,%d”,&a,&b);

c=max(a,b);

printf(“Maxis%d”,c);}main函數23abcmax函數bac2333例:讀程序,寫出運行結果#include<stdio.h>intsum(inta,intb){a=a+b;b=a+b;returna;}intmain(){inta=1,b=3,c;c=sum(a,b);printf(“Sumof%d,%dis%d\n”,a,b,c);}Sumof1,3is4main函數13abcsum函數ab13447二、函數的返回值1)返回函數值的方法函數的返回值也就是函數值,是一個確定的值。如果一個函數有返回值,就必須使用return語句;一個函數中可以有一個以上的return語句,但不論執行哪個return都將結束函數的調用返回主調函數。return語句中的括號可以省略;return后面的值可以是一個表達式。#include<stdio.h>intmax(intx,inty)

{if(x>y)returnx;

returny;}intmain(){inta,b,c;

scanf(”%d,%d”,&a,&b);

c=max(a,b);

printf(“Maxis%d”,c);}return(x>y?x:y);2)函數值的類型函數的類型即函數值的類型。如函數max是int型的也就是函數值是int型的;intmax(intx,inty)

{intz;z=x>y?x∶y;

return(z);}2)函數值的類型省略了類型說明的函數是int型的;max(intx,inty)

{intz;z=x>y?x∶y;

return(z);}2)函數值的類型return語句中表達式的值一般應與函數類型一致;如果不一致,則需要進行類型轉換,只有數值型數據可以進行自動類型轉換,以函數類型為準。floatmax(intx,inty)

{intz;z=x>y?x∶y;

return(z);}3)不需要返回值的函數如果函數中沒有使用return語句,函數返回的是一個不確定的數值;如果一個函數不需要返回值(表示一個過程),可以用int做類型說明;如果一個函數被聲明為int類型,就不允許再引用它的返回值#include<stdio.h>intprintstar(){printf("*******\n");}intprint_message(){printf("Howdoyoudo!\n");}intmain(){printstar();

print_message();

printstar();

}函數的調用一、函數調用的一般形式函數名(實參表列)說明:如果調用無參函數,實參表列可以忽略,但括號不能省;實參的個數和形參一般相等;實參與形參的類型一一對應,必要時使用類型轉換。c=max(a,b);#include<stdio.h>intmax(intx,inty)

{intz;z=x>y?x∶y;

return(z);}intmain(){inta,b,c;

scanf(”%d,%d”,&a,&b);

c=max(a,b);

printf(“Maxis%d”,c);}floatmax(floatx,floaty)

{floatz;z=x>y?x∶y;

return(z);}二、函數調用的方式1)函數語句形式為:函數名(實參表列);如:printmessage();printf(“%d”,p);說明:這種方式不要求函數帶回返回值,函數僅完成一定的操作。2)函數表達式函數的返回值參與運算。如:m=max(a,b);m=3*max(a,b);三、函數調用的執行過程1)按從右向左的順序,計算實參中各表達式的值;2)按照位置,將實參的值一一對應地傳送給形參;3)執行被調用函數;4)當遇到return(表達式)語句時,計算表達式的值,并返回主調函數。x=-1.200000,iabs(x)=2.000000四、函數的原形說明在程序中調用函數需滿足以下條件:1)被調函數必須存在,且遵循“先定義后使用”的原則;2)如果被調函數的定義在主調函數之后(位置),可以先給出原形說明。原形說明的形式為:類型說明函數名(參數類型,參數類型,…);#include<stdio.h>floatadd(floatx,floaty)/*函數首部*/{floatz;/*函數體*/z=x+y;

return(z);}intmain(){

floata,b,c;

scanf("%f,%f",&a,&b);

c=add(a,b);printf("sumis%f\n",c);}#include<stdio.h>intmain(){floatadd(floatx,floaty);/*函數聲明*/

floata,b,c;

scanf("%f,%f",&a,&b);

c=add(a,b);printf("sumis%f\n",c);}floatadd(floatx,floaty)/*函數首部*/{floatz;/*函數體*/z=x+y;

return(z);}floatfac(intk)

{floatt=1;inti;for(i=1;i<=k;i++)t=t*i;returnt;}intmain(){floatc;intm,n;m=3;n=2;c=fac(m)*fac(n);printf(“c=%f\n”,c);}函數的嵌套調用嵌套調用是指在一個函數的函數體中又調用了其他函數。例:編寫求的程序。分析:重復三次求階乘運算,只是每次的值不同。將求階乘的過程編成一個函數fac,以不同的參數值k來調用函數。inputm,n:588!/(5!*(8-5)!)=56數組作為函數的參數一、數組元素做函數實參與變量做實參一樣,數組元素做實參是“值傳遞”。例:求10個任意整數中的最大數。9085ma[1]m=a[0];9092ma[2]9295ma[3]…….9598ma[9]m=max(m,a[1]);m=max(m,a[2]);m=max(m,a[3]);m=max(m,a[9]);#include<stdio.h>intmax(intx,inty){return(x>y?x:y);}intmain(){inta[10],i,m;printf(“Enter10integer:\n”);for(i=0;i<10;i++)scanf(“%d”,&a[i]);

m=a[0];for(i=1;i<10;i++)m=max(m,a[i]);printf(“Maxis%d”,m);}二、一維數組與函數參數

若函數的形參是數組,對應的實參必須是數組名。例:求10個任意整數中的最大數。#include<stdio.h>intmax(intx[10]){inti,m;m=x[0];for(i=1;i<10;i++)if(m<x[i])m=x[i];returnm;}intmain(){inta[10],i,c;printf(“Enter10integer:\n”);for(i=0;i<10;i++)scanf(“%d”,&a[i]);c=max(a);printf(“Maxis%d”,c);}x[0]x[1]x[2]x[3]...x[9]86927752...94a[0]a[1]a[2]a[3]...a[9]首地址說明:1)實參數組與形參數組的類型必須一致。2)用數組名做參數時,傳遞的是數組的首地址,因此形參數組也可以不指定大小,但需另設一個參數,傳遞數組元素的個數。3)數組做函數參數時,形參數組和實參數組共享同一內存單元。

如果形參數組的元素的值被修改,實參數組的元素的值也就被改變了。#include<stdio.h>intmax(intx[],intn){inti,m;m=x[0];for(i=1;i<n;i++)if(m<x[i])m=x[i];returnm;}intmain(){inta[10],i,c;printf(“Enter10integer:\n”);for(i=0;i<10;i++)scanf(“%d”,&a[i]);c=max(a,10);

printf(“Maxis%d”,c);}三、多維數組與函數參數1)多維數組可以作為函數的參數;2)如果形參是多維數組,可以省略第一維的大小,但不能省略其他維的大小。判斷以下形式哪些是正確的:intmax(intx[3][5])intmax(intx[][5])intmax(intx[3][])intmax(intx[][])例:有一個3×4的矩陣,求最大元素的值。#include<stdio.h>intmax(intx[][4]){inti,j,m;m=x[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(m<x[i][j])m=x[i][j];returnm;}intmain(){inta[3][4]={{1,3,5,7},{2,4,6,8},{15,13,17,5}};printf(“Maxis%d”,max(a));}局部變量與全局變量一、局部變量在一個函數內部定義的變量1)函數的形式參數2)在某個復合語句中定義的變量說明:局部變量只在自己的范圍內有效。一、局部變量存儲類別:自動變量auto:調用該函數時,系統會給這些變量分配存儲空間,在函數調用結束時就自動釋放這些存儲空間。靜態局部變量static:這些局部變量的值在函數調用結束后不消失而保留原值,即占用的存儲單元不釋放,在下一次該函數調用時,該變量已有值,就是上一次函數調用結束時的值。(對static變量來說,若定義時不賦初值,則數值型自動賦初值為0)#include<stdio.h>intfun(){staticinta;a+=2;printf(“%d”,a);}intmain(){intcc;for(cc=1;cc<=4;cc++)fun();printf(“\n”);}例:請分析以下問題的輸出結果cc=1a=0a=2cc=2a=2a=4cc=3a=4a=6cc=4a=6a=8二、全局變量在函數之外定義的變量(外部變量)是全局變量。全局變量的有效范圍是:從定義變量的位置開始到源文件結束。在一個函數中,既可以使用本函數中的局部變量,也可以使用有效的全局變量。

說明:1、利用全局變量可以在函數間傳遞數據。2、應盡量少使用全局變量。3、如果全局變量與局部變量同名,則局部變量優先。例:全局變量與局部變量inta=3,b=5;intmax(inta,intb){intc;c=a>b?a:b;returnc;}intmain(){inta=8;printf(“%d\n”,max(a,b));}8程序舉例例:編寫一個函數swap用于交換兩個整數的值。設a=3,b=4,調用函數swap后,得a=4,b=3方法1:#include<stdio.h>intswap(intx,inty){intt;t=x;x=y;y=t;}main(){inta,b;scanf(“%d%d”,&a,&b);swap(a,b);printf(“%d%d”,a,b);}方法2:#include<stdio.h>intx,y;intswap(){intt;t=x;x=y;y=t;}main(){scanf(“%d%d”,&x,&y);swap();printf(“%d%d”,x,y);}函數的遞歸調用遞歸調用是指在調用一個函數時又直接或間接地調用了函數本身。1)直接遞歸調用2)間接遞歸調用注意:這兩種遞歸都無法結束。因此應含有某條件控制遞歸調用結束。例:用遞歸法求n!(n>0)intmain(){ intf=1,n,i;scanf(“%d”,&n); if(n>1) {for(i=2;i<=n;i++)f*=i;} elsef=1; printf(“f=%d\n”,f);}#include<stdio.h>intfac(intn){intf;if(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}intmain(){intn,y;printf("Inputaintegernumber:");scanf("%d",&n);

y=fac(n);printf("%d!=%15d",n,y);}#include<stdio.h>intfac(intn){intf;if(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}intmain(){intn,y;printf("Inputaintegernumber:");scanf("%d",&n);

y=fac(n);printf("%d!=%15d",n,y);}如果n=5:fac(5)=fac(4)*5=(fac(3)*4)*5=((fac(2)*3)*4)*5=(((fac(1)*2)*3)*4)*5=(((1*2)*3)*4)*5=((2*3)*4)*5=(6*4)*5=24*5=120例:編寫函數求aN的值,在主函數中調用這個函數,并將結果輸出。函數定義如下:intpow(inta,intN){……}#include<stdio.h>

intpow(inta,intN)

{if(N==0)return(1);

elsereturn(a*pow(a,N-1));

}intmain(){inta,N;scanf("%d%d",&a,&N);

printf("%d",pow(a,N));}

#include<stdio.h>intpow(inta,intN){intt=1,i;for(i=1;i<=N;i++)t=t*a;returnt;}intmain(){inta,N,s;scanf(“%d,%d”,&a,&N);s=pow(a,N);printf(“結果為%d”,s);}作業8:編程實現:通過鍵盤輸入三個實數a、b、c,請編寫函數分別求三個數之和以及三個數的最大值。函數定義如下:floatadd(floatx,floaty,floatz){……}floatmax(floatx,floaty,floatz){……}#include<stdio.h>floatadd(floatx,floaty,floatz){floats;s=x+y+z;returns;}floatmax(floatx,floaty,floatz){floatm;m=x>y?x:y;m=m>z?m:z;returnm;}intmain(){floata,b,c,sum,m;scanf(“%f,%f,%f”,&a,&b,&c);sum=add(a,b,c);m=max(a,b,c);printf(“sum=%f,max=%f”,sum,m);}編寫函數求已知字符串“ahappyday”中空格的個數,在主函數中調用這個函數,并將結果輸出。函數定義如下:intfind(chars[],intn){……}#include<stdio.h>intfind(chars[],intn){inti,t=0;for(i=0;i<=n-1;i++)if(s[i]==‘

’)t++;returnt;}intmain(){charstr[12]=“ahappyday”;intnum;num=find(str,12);printf(“%d\n”,num);}1.下面敘述中正確的是

。A.對于用戶自己定義的函數,在使用前必須加以說明B.函數可以返回一個值,也可以什么值也不返回C.說明函數時必須明確其參數類型和返回類型D.空函數不完成任何操作,所以在程序設計中沒有用處2.若函數的類型和return語句中表達式的類型不一致,則

。A.編譯時出錯B.運行時出現不確定結果C.不會出錯,且返回值的類型以return語句中表達式的類型為準D.不會出錯,且返回值的類型以函數的類型為準1.以下程序運行后,輸出結果是

。func(inta,intb){intm=0,i=2;i+=m+1;m=i+a+b;return(m);}main(){intk=4,m=1,p;p=func(k,m);printf("%d,",p);p=func(k,m);printf("%d\n",p);}

溫馨提示

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

評論

0/150

提交評論