




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第7章函數大學計算機基礎網絡信息中心教研室2主要內容7.1概述7.2函數的定義7.3函數的參數和返回值7.4函數的調用大學計算機基礎網絡信息中心教研室3主要內容7.8函數應用舉例7.7內部函數和外部函數7.6變量的作用域與存儲類別7.5數組作函數參數大學計算機基礎網絡信息中心教研室47.1概述1、一個c語言程序由一個或多個源程序文件組成(適合分別編寫,編譯,提高編程效率)。2、一個源程序文件由一個或多個函數組成(以源文件為單位進行編譯)。3、c語言程序的執行順序:從main函數開始,調用其它函數后回到main函數中,結束整個程序的運行(系統定義的函數)。大學計算機基礎網絡信息中心教研室57.1概述5、函數分類標準函數(庫函數)用戶函數有參函數無參函數4、所有函數都是平行的,即函數相互獨立,不可以嵌套定義,但可以相互調用,嵌套調用,遞歸調用(不可以調用main函數)。大學計算機基礎網絡信息中心教研室67.2函數的定義1、無參函數定義(一般是執行一組操作)
類型標識符函數名()
{
變量聲明部分;執行語句部分;
}指定函數返回值的類型,省略為int;空類型(void)表示無返回值用有效的C語言標識符:規則同變量命名函數頭函數體例如:#include<stdio.h>main()/*主函數*/{printf(“\n”);}大學計算機基礎網絡信息中心教研室77.2函數的定義2、有參函數定義類型標識符函數名(類型名形式參數1,類型名形式參數2,…){
變量聲明部分;執行語句部分;
}例如intmax(intx,inty)/*函數頭*/{
intz;
/*函數體中變量的聲明*/
z=x>y?x:y;/*執行語句部分*/
return(z);/*執行語句部分*/}形參的數據類型形參名稱:命名規則同變量名指定函數返回值的類型,省略為int;空類型(void)表示無返回值用大學計算機基礎網絡信息中心教研室87.2函數的定義#include<stdio.h>intmax(intx,inty)/*函數頭*/{intz;/*函數體中變量的聲明*/z=x>y?x:y;/*執行語句部分*/return(z);/*執行語句部分*/}main(){inta,b,c;printf(“請輸入兩個整數:”);scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“最大值是:%d”,c);}形式參數實際參數返回變量z的值作為函數返回值大學計算機基礎網絡信息中心教研室97.3函數的參數和返回值1形式參數和實際參數2函數的返回值大學計算機基礎網絡信息中心教研室107.3.1形式參數和實際參數1定義函數時函數名后面括號中的變量名稱2形式參數的概念
實際參數的概念
調用函數時函數名后面括號中的參數實參與形參說明
①形參在函數調用前不占用內存。因為形參只有在函數被調用時才分配內存單元,調用結束后立即釋放所占內存。②形參只能是變量,而實參可以是常量,變量或表達式。(必須有確定的值)③被定義函數中必須指定形參的類型。④實參與形參的個數、類型應一致。⑤實參對形參的數據傳遞是單向傳遞,只能由實參傳給形參,反之不可以。大學計算機基礎網絡信息中心教研室117.3.1形式參數和實際參數例、調用函數時的數據傳遞
#include<stdio.h>sum(intx,inty,intz)
/*3.為x,y,z開辟單元接受實參的值*/{z=x+y;
/*4.執行函數體*/}
/*5.結束調用,x,y,z被釋放*/main(){inta=1,b=2,c=0;/*1.開辟三個單元a,b,c分別存1,2,0*/
sum(a,b,c);
/*2.調用函數,a,b,c是實參*/
printf(“c=%d\n”,c);
/*6.輸出c值*/}此例說明:C函數調用是傳值調用,即參數值的傳遞是單向的,不能在函數體內改變實參的值。大學計算機基礎網絡信息中心教研室127.3.2函數的返回值(1)函數的返回值是通過return語句實現。return語句形式:
return(表達式);
return表達式;
return;/*沒有確定返回值*/(2)若函數不需要返回值,函數體中可以不含return語句,此時執行到函數體最后一條語句后,自動執行一條return語句。(3)函數返回值類型:定義函數時應予以指定,若不加指定,則當做整型(int)處理。同時返回值類型應與return語句表達式類型一致,若不一致,以函數值類型為準進行轉換。(4)為了明確表示不帶回返回值,可以用“void”定義“空類型”。大學計算機基礎網絡信息中心教研室137.3.2函數的返回值例:將上例修改為以下程序#include<stdio.h>intsum(intx,inty)/*3.為x,y開辟單元并接受實參的值1/2*/{intz;/*4.在函數內使用的變量*/z=x+y;/*5.執行函數體*/returnz;/*6.結束調用,x,y,z被釋放,z值為返回值*/}main(){inta=1,b=2,c;/*1.開辟三個單元a,b,c*/
c=sum(a,b);/*2.調用函數,a,b,是實參,返回值賦給c*/printf(“c=%d\n”,c);/*7.輸出c值*/}大學計算機基礎網絡信息中心教研室147.4函數的調用2被調函數的聲明3嵌套調用
函數調用的形式和方式
14遞歸調用5程序舉例
大學計算機基礎網絡信息中心教研室157.4.1函數調用的形式和方式函數調用的形式
1無參函數調用:
函數名();
/*括號不能省略*/有參函數調用:
函數名(實參列表);
/*實參之間用逗號隔開*/大學計算機基礎網絡信息中心教研室167.4.1函數調用的形式和方式函數調用的方式
2(1)函數語句:把函數作為一個語句(不用函數返回值)。如:
display_star();(2)函數表達式:函數包含在表達式中(用函數的返回值繼續參與運算),要求函數帶回確定的返回值。如
c=2*max(a,b);(3)函數參數:把函數調用作為另一個函數的實參。如
m=max(max(a,b),max(c,d));max(a,b)和max(c,d)函數的返回值作為另一次函數max()調用的個實參!大學計算機基礎網絡信息中心教研室177.4.2被調函數的聲明函數聲明的形式
1函數類型函數名(參數類型1,參數類型2,…);或函數類型函數名(參數類型1參數名1,參數類型2參數名2,…);大學計算機基礎網絡信息中心教研室187.4.2被調函數的聲明(1)將要聲明的函數必須是已存在的函數(2)函數聲明語句中參數列表可以省略參數名,但不可以省略參數類型,次序以及數目應保持一致。(3)如果在所有函數定義之前,在函數的外部已做了函數聲明,則在各個主調函數中不必對所調用的函數再作聲明(4)如果所調用函數的定義出現在主調函數之前,可以不必聲明。(5)如果被調函數的返回值類型是整形或字符型,可以不必聲明。函數聲明的說明
2大學計算機基礎網絡信息中心教研室197.4.3嵌套調用指在調用一個函數的過程中又可以調用另一個函數嵌套調用的概念
main函數結束b函數調用b函數調用a函數a函數①②③④⑤⑥⑦⑧⑨①②③④⑤⑥⑦⑧⑨大學計算機基礎網絡信息中心教研室207.4.3嵌套調用例、利用嵌套調用求1!+2!+3!+…+20!的值設計思路:先設計一個求n!的函數,再設計求和的函數,主函數調用求和函數,求和函數調用求n!的函數。#include,stdio.h>intfac(int);/*函數fac原型聲明*/floatsum(int);/*函數sum的原型聲明*/main(){floatadd;add=sum(20);/*主函數調用sum函數*/
printf(“add=%e”,add);
/*sum返回值超過int型和long型的范圍*/}大學計算機基礎網絡信息中心教研室21floatsum(intn)/*求n以內的自然數的階乘和*/{intk;floats=0;for(k=1;k<=n,k++)
s+=fac(k);/*調用fac求k!并累加到s中*/
returns;/*返回階乘和*/}intfac(intn)/*求n以內的自然數的階乘和*/{intk;floats=1;for(k=1;k<=n,k++) s=s*k;/*調用fac求k!并累加到s中*/returns;/*返回階乘和*/}大學計算機基礎網絡信息中心教研室227.4.4遞歸調用指一個函數直接或間接地調用自身的情況。有兩種方式:直接遞歸調用和間接遞歸調用。包含有遞歸調用的函數稱為遞歸函數。遞歸調用的概念
1遞歸調用的特征
2(1)轉化。(2)終止。大學計算機基礎網絡信息中心教研室23例如:用遞歸調用的方法求n!。①轉化:n!→(n-1)!→(n-2)!→…→2!→1!→0!遞推公式:n!=n*(n-1)!②終止:n=0,1時,n!=1例如求計算4!的過程:pf(4)=4*pf(3)pf(4)=24↓↑
pf(3)=3*pf(2)pf(3)=6↓↑
pf(2)=2*pf(1)pf(2)=2↓↑
pf(1)=1*pf(0)pf(1)=1↓↑
pf(0)=1大學計算機基礎網絡信息中心教研室24程序如下:#include<stdio.h>intfac(intn)
/*求階乘的遞歸函數*/{intc;if(n==0|n==1)c=1;
/*遞歸終止*/
elsec=n*fac(n-1);
/*遞歸調用*/
returnc;}main(){intn;scanf(“%d”,&n);if(n<0)printf(“dataerror!\n”);elseprintf(“%d!=%d\n”,n,fac(n));}大學計算機基礎網絡信息中心教研室257.4.4遞歸調用(1)需要求解的問題可以轉化為一個相對簡單的子問題。(2)最終有一個問題不是遞歸的,必須有確定的值。例如求解n!可以轉化成求(n-1)!,同時n!在n=0或1時,不是遞歸的,且有確定值。遞歸定義的條件
3大學計算機基礎網絡信息中心教研室267.4.4遞歸調用【例7-7】Hanoi(漢諾)塔問題
這是一個古典的數學問題,是一個用遞歸方法解題的典型例子。問題是這樣的:古代有一個梵塔,塔內有3個座A、B、C,開始時A座上有64個盤子,盤子大小不等,大的在下,小的在上(如圖7-)。有一個老和尚想把這64個盤子從A座移到C座,但每次只允許移動一個盤子,且在移動過程中在3個座上都始終保持大盤在下,小盤在上。在移動過程可以利用B座,求移動的具體步驟。大學計算機基礎網絡信息中心教研室277.4.4遞歸調用遞歸過程如下:(1)將n-1個盤子從A座經過C座移動到B座;(2)然后將第n個盤子從A座移動到C座;(3)再將n-1個盤子從B座經過A座移動到C座。#include<stdio.h>voidhanoi(intn,inta,intb,intc){if(n==1)
printf("%c-->%c\n",a,c);else{hanoi(n-1,a,c,b);printf("%c-->%c\n",a,c);
hanoi(n-1,b,a,c);}}voidmain(){intn;printf("請輸入盤數:\n");
scanf("%d",&n);if(n<1)printf("dataerror!\n");elsehanoi(n,'A','B','C');}程序如下:大學計算機基礎網絡信息中心教研室287.4.5程序舉例例、求Fibonacci數列的第n項。Fibonacci數列定義如下F(n)=1當n=1時1當n=2時F(n-1)+F(n-2)當n>2時分析:數列具備遞歸條件題目給出遞推公式,F(n)=F(n-1)+F(n-2)
且有遞歸終止的條件n=1或n=2是有確定值1大學計算機基礎網絡信息中心教研室297.4.5程序舉例#include<stdio.h>longfibo(int);main(){longf;intn;scanf(“%d”,&n);f=fibo(n);printf(“%ld\n”,f);}longfibo(intn){longf;if(n=1|n=2)f=1;elsef=fibo(n-1)+fibo(n-2);returnf;}程序如下:大學計算機基礎網絡信息中心教研室307.5數組作函數實參數組元素作函數實參
12數組名作函數實參多維數組名作函數實參3大學計算機基礎網絡信息中心教研室317.5.1數組元素作函數實參數組元素作函數實參,跟普通變量一樣,是單向值傳遞。【例7-10】數組元素作函數實參的實例。#include<stdio.h>voidpan(intn){
if(n>0)printf("%d",n);else printf("0");}
voidmain(){inta[5],i;printf("請輸入5個數:\n");for(i=0;i<5;i++){scanf("%d",&a[i]);pan(a[i]);}}
大學計算機基礎網絡信息中心教研室327.5.2數組名作函數實參
用數組名作為函數實際參數時,不是把數組元素的值傳遞給形式參數數組,而是把實參數組的起始地址傳遞給形參數組。也就是說,使得兩個數組就共用同一段存儲單元。這種參數傳遞有時也可以稱為“地址傳遞”。說明:(1)應分別在主調函數和被調用函數中定義數組。(2)實參數組應與形參數組類型保持一致。但允許(1)實參數組與形參數組大小可以不一致。(2)形參數組可以不指定大小,但數組名后面的方括號不能少。大學計算機基礎網絡信息中心教研室337.5.2數組名作函數實參【例7-11】有一個數組score,內放10個學生成績,求平均成績。程序如下:#include<stdio.h>main(){floataverage(floatb[10]);floatscore[10],aver;inti;printf(“input10scores:\n”);for(i=0;i<10;i++)scanf(“%f”,&score[i]);aver=average(score);printf(“averagescoreis%5.2f\n”,aver);}大學計算機基礎網絡信息中心教研室347.5.2數組名作函數實參floataverage(floatb[10]){inti;floataver,sum=0;for(i=0;i<10;i++)sum=sum+b[i];aver=sum/10;return(aver);}大學計算機基礎網絡信息中心教研室357.5.2數組名作函數實參【例7-12】形參數組可以不定義長度。floataverage(floatarray[],intn){inti;floataver,sum=0;for(i=0;i<n;i++)sum+=array[i];aver=sum/n;returnaver;}
#include<stdio.h>voidmain(){floataverage(floatarray[],intn);floatscore1[]={98.5,97,91.5,60,55};floatscore2[]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};printf("score1的平均值是%6.2f\n",average(score1,5));printf("score2的平均值是%6.2f\n",average(score2,10));}大學計算機基礎網絡信息中心教研室367.5.3多維數組名作函數實參
數組B:
11,52,56,67,2545,89,54,69,8996,63,68,79,86
編寫一個函數,求任意二維數組中所有奇數的平方根之和。通過調用該過程計算并輸出PA+PB的值(保留5位小數);其中PA為數組A中所有奇數平方根的和,PB為數組B中所有奇數平方根的和。兩個數組的數據分別如下:數組A:
23,45,56,13,3434,74,85,54,7656,98,56,76,6798,54,83,12,5933,87,74,48,62大學計算機基礎網絡信息中心教研室37#include<stdio.h>#include<math.h>main(){int[5][5]={23,45,56,13,34,34,74,85,54,76,56,98,56,76,67,98,54,83,12,59,33,87,74,48,62};intb[3][5]={11,52,56,67,25,45,89,54,69,89,96,63,68,79,86};floatpa,pb;pa=sum(a,5,5);pb=sum(b,3,5);printf("%.5f\n",pa+pb); }7.5.3多維數組名作函數實參大學計算機基礎網絡信息中心教研室38floatsum(inta[],intm,intn){inti,j;floats=0;for(i=0;i<m;i++)for(j=0;j<n;j++)if(a[i*n+j]%2!=0)s+=sqrt(a[i*n+j]);returns;}7.5.3多維數組名作函數實參大學計算機基礎網絡信息中心教研室397.6變量的作用域與存儲類別1變量的作用域2變量的存儲類別大學計算機基礎網絡信息中心教研室407.6.1變量的作用域(1)在一個函數內部定義的變量是局部變量,只能在函數內部使用。(2)在主函數內部定義的變量也是局部變量,其它函數也不能使用主函數中的變量。(3)形式參數是局部變量。(4)在復合語句中定義的變量是局部于復合語句的變量,只能在復合語句塊中使用。(5)局部變量在函數被調用的過程中分配存儲單元,結束調用時釋放內存。(6)同一個函數內有局部變量不允許重名,但不同函數中局部變量可以重名。局部變量
1內部變量大學計算機基礎網絡信息中心教研室417.6.1變量的作用域main(){intk,a=0;for(k=1;k<=2;k++){inta=1;a++;printf(“k=%d,a=%d\n”,k,a);}printf(“k=%d,a=%d\n”,k,a);}局部變量舉例:大學計算機基礎網絡信息中心教研室427.6.1變量的作用域全局變量
2(1)在函數外部定義的變量是全局變量,其作用域是變量定義位置至整個程序文件結束。(2)非必要時不要使用全局變量:①整個過程中全局變量都要占存儲單元;②降低了函數的通用性;③降低程序的清晰性。(3)如果在同一個源文件中,全局變量與局部變量同名,則在局部變量的作用范圍內,全局變量不起作用。外部變量大學計算機基礎
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030中國月子中心行業市場深度調研及發展潛力與投資報告
- 2025至2030中國徑向通道行業發展趨勢分析與未來投資戰略咨詢研究報告
- 2025至2030中國底座式污水泵行業發展趨勢分析與未來投資戰略咨詢研究報告
- 公司兼并保密協議
- 太空探索與科幻文學創作關聯研究:高中文學創作課程教案
- 農村科技示范園區建設協議
- 在線教育平臺課程證書郵寄系統數據遷移恢復協議
- 觀后感百團大戰觀后感350字(8篇)
- 假期旅行的收獲與感悟游記讀后感分享心得5篇范文
- 關于流氓兔的笑話之誰是對的15篇
- 探究大象耳朵秘密:2025年課堂新視角
- 《新能源乘用車二手車鑒定評估技術規范 第1部分:純電動》
- 下沉式廣場結構施工方案
- 《加坡的教育制度》課件
- Windows操作系統及應用期末測試試題及答案
- 《交通事故車輛及財物損失價格鑒證評估技術規范》
- 北師大版二年級數學下冊各單元測試卷
- 招生就業處2025年工作計劃
- 【MOOC】外國文學經典導讀-西北大學 中國大學慕課MOOC答案
- 醫院供電合同
- 市場營銷學練習及答案(吳健安)
評論
0/150
提交評論