![《C語言程序設(shè)計》課件-第7章 函數(shù)_第1頁](http://file4.renrendoc.com/view11/M02/1C/04/wKhkGWetyPCAefkVAAC_ZA7Foec652.jpg)
![《C語言程序設(shè)計》課件-第7章 函數(shù)_第2頁](http://file4.renrendoc.com/view11/M02/1C/04/wKhkGWetyPCAefkVAAC_ZA7Foec6522.jpg)
![《C語言程序設(shè)計》課件-第7章 函數(shù)_第3頁](http://file4.renrendoc.com/view11/M02/1C/04/wKhkGWetyPCAefkVAAC_ZA7Foec6523.jpg)
![《C語言程序設(shè)計》課件-第7章 函數(shù)_第4頁](http://file4.renrendoc.com/view11/M02/1C/04/wKhkGWetyPCAefkVAAC_ZA7Foec6524.jpg)
![《C語言程序設(shè)計》課件-第7章 函數(shù)_第5頁](http://file4.renrendoc.com/view11/M02/1C/04/wKhkGWetyPCAefkVAAC_ZA7Foec6525.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
7.1函數(shù)定義第7章函數(shù)思政目標(biāo)1、規(guī)則意識與嚴(yán)謹態(tài)度函數(shù)定義及調(diào)用規(guī)則嚴(yán)格,培養(yǎng)學(xué)生遵循規(guī)則意識,在學(xué)習(xí)中養(yǎng)成嚴(yán)謹認真的態(tài)度。2、創(chuàng)新思維與問題解決鼓勵學(xué)生自定義函數(shù)解決問題,激發(fā)創(chuàng)新思維,提升其獨立思考和解決實際問題的能力。7.1函數(shù)定義第七章函數(shù)概述模塊化程序設(shè)計基本思想:將一個大的程序按功能分割成一些小模塊,特點:各模塊相對獨立、功能單一、結(jié)構(gòu)清晰、接口簡單控制了程序設(shè)計的復(fù)雜性提高元件的可靠性縮短開發(fā)周期避免程序開發(fā)的重復(fù)勞動易于維護和功能擴充開發(fā)方法:自上向下,逐步分解,分而治之C是模塊化程序設(shè)計語言C程序結(jié)構(gòu)C是函數(shù)式語言必須有且只能有一個名為main的主函數(shù)C程序的執(zhí)行總是從main函數(shù)開始,在main中結(jié)束函數(shù)不能嵌套定義,可以嵌套調(diào)用函數(shù)分類從用戶角度標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)從函數(shù)形式無參函數(shù)有參函數(shù)使用庫函數(shù)應(yīng)注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件7.1
函數(shù)的定義一般格式合法標(biāo)識符函數(shù)返回值類型缺省int型無返回值void函數(shù)體函數(shù)類型函數(shù)名(形參類型說明表){
說明部分 語句部分}現(xiàn)代風(fēng)格:例有參函數(shù)(現(xiàn)代風(fēng)格)
intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)(現(xiàn)代風(fēng)格)
intmax(intx,y){intz;z=x>y?x:y;return(z);}例空函數(shù)
dummy(){}函數(shù)體為空例無參函數(shù)
printstar(){printf(“**********\n”);}或
printstar(void){printf(“**********\n”);}函數(shù)類型函數(shù)名(形參表)形參類型說明{
說明部分 語句部分}傳統(tǒng)風(fēng)格:例有參函數(shù)(傳統(tǒng)風(fēng)格)
intmax(x,y)
intx,y;{intz;z=x>y?x:y;return(z);}函數(shù)的返回值返回語句形式:return(表達式);
或
return表達式;
或
return;功能:使程序控制從被調(diào)用函數(shù)返回到調(diào)用函數(shù)中,同時把返值帶給調(diào)用函數(shù)說明:函數(shù)中可有多個return語句若無return語句,遇}時,自動返回調(diào)用函數(shù)若函數(shù)類型與return語句中表達式值的類型不一致,按前者為準(zhǔn),自動轉(zhuǎn)換------函數(shù)調(diào)用轉(zhuǎn)換void型函數(shù)例無返回值函數(shù)
voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}printstar(){printf("**********");}main(){inta;a=printstar();printf("%d",a);}例函數(shù)帶回不確定值輸出:**********10voidprintstar(){printf("**********");}main(){inta;a=printstar();printf("%d",a);}編譯錯誤!例函數(shù)返回值類型轉(zhuǎn)換main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;
return(z);}7.2函數(shù)的調(diào)用第7章函數(shù)思政目標(biāo)1、嚴(yán)謹精確意識函數(shù)調(diào)用時實參與形參需嚴(yán)格匹配,培養(yǎng)學(xué)生嚴(yán)謹精確的做事態(tài)度和規(guī)范意識。2、自主學(xué)習(xí)與探索精神理解函數(shù)調(diào)用規(guī)則及各種情況,激發(fā)學(xué)生自主學(xué)習(xí)熱情,培養(yǎng)探索精神。7.2函數(shù)的調(diào)用7.2
函數(shù)的調(diào)用調(diào)用形式函數(shù)名(實參表);說明:實參與形參個數(shù)相等,類型一致,按順序一一對應(yīng)實參表求值順序,因系統(tǒng)而定(TurboC自右向左)main(){inti=2,p;p=f(i,++i);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}例參數(shù)求值順序main(){inti=2,p;p=f(i,i++);printf("%d",p);}intf(inta,intb){intc;if(a>b)c=1;elseif(a==b)c=0;elsec=-1;return(c);}運行結(jié)果:0運行結(jié)果:1調(diào)用方式函數(shù)語句:例printstar();printf(“Hello,World!\n”);函數(shù)表達式:例m=max(a,b)*2;函數(shù)參數(shù):例printf(“%d”,max(a,b));m=max(a,max(b,c));函數(shù)說明對被調(diào)用函數(shù)要求:必須是已存在的函數(shù)庫函數(shù):#include<*.h>用戶自定義函數(shù):函數(shù)類型說明函數(shù)說明一般形式:函數(shù)類型函數(shù)名(形參類型[形參名],…..);
或函數(shù)類型函數(shù)名();作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便檢驗函數(shù)定義與函數(shù)說明不同函數(shù)說明位置:程序的數(shù)據(jù)說明部分(函數(shù)內(nèi)或外)下列情況下,可不作函數(shù)說明若函數(shù)返值是char或int型,系統(tǒng)自動按int型處理被調(diào)用函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前有些系統(tǒng)(如BorlandC++)要求函數(shù)說明指出函數(shù)返值類型和形參類型,并且對void和int型函數(shù)也要進行函數(shù)說明例函數(shù)說明舉例main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}int型函數(shù)可不作函數(shù)說明(BorlandC++不行)floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)說明main(){floatadd(float,float);/*functiondeclaration*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}floatadd();7.3函數(shù)參數(shù)及其傳遞方式第7章函數(shù)思政目標(biāo)1、理解數(shù)據(jù)傳遞本質(zhì)通過函數(shù)參數(shù)傳遞,讓學(xué)生理解數(shù)據(jù)流動,培養(yǎng)嚴(yán)謹思維,樹立正確的信息處理觀念。2、辯證看待問題值傳遞單向性與地址傳遞雙向性對比,引導(dǎo)學(xué)生辯證思考,提升分析和解決問題的能力。7.3函數(shù)參數(shù)及其傳遞方式7.3
函數(shù)參數(shù)及其傳遞方式形參與實參形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達式c=max(a,b);(main函數(shù))(max函數(shù))max(intx,inty){intz;z=x>y?x:y;return(z);}例比較兩個數(shù)并輸出大者main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf("Maxis%d",c);}max(intx,inty){intz;z=x>y?x:y;return(z);}形參實參說明:實參必須有確定的值形參必須指定類型形參與實參類型一致,個數(shù)相同若形參與實參類型不一致,自動按形參類型轉(zhuǎn)換———函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放7.3
函數(shù)參數(shù)及其傳遞方式形參與實參形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù):調(diào)用函數(shù)時函數(shù)名后面括號中的表達式例計算x的立方#include<stdio.h>floatcube(floatx){return(x*x*x);}main(){floata,product;printf("Pleaseinputvalueofa:");scanf("%f",&a);product=cube(a);printf(”Cubeof%.4fis%.4f\n",a,product);}xaproduct××××1.21.21.728參數(shù)傳遞方式值傳遞方式方式:函數(shù)調(diào)用時,為形參分配單元,并將實參的值復(fù)制到形參中;調(diào)用結(jié)束,形參單元被釋放,實參單元仍保留并維持原值特點:形參與實參占用不同的內(nèi)存單元單向傳遞711x:y:調(diào)用前:調(diào)用結(jié)束:711x:y:例交換兩個數(shù)#include<stdio.h>main(){intx=7,y=11;printf("x=%d,\ty=%d\n",x,y);printf("swapped:\n");
swap(x,y);printf("x=%d,\ty=%d\n",x,y);}swap(inta,intb){inttemp;temp=a;a=b;b=temp;}調(diào)用:711a:b:711x:y:swap:711x:y:117a:b:temp地址傳遞方式:函數(shù)調(diào)用時,將數(shù)據(jù)的存儲地址作為參數(shù)傳遞給形參特點:形參與實參占用同樣的存儲單元“雙向”傳遞實參和形參必須是地址常量或變量swap(p1,p2)int*p1,*p2;{intp;p=*p1;*p1=*p2;*p2=p;}main(){inta,b;scanf("%d,%d",&a,&b);printf(“a=%d,b=%d\n”,a,b);printf(“swapped:\n”);swap(&a,&b);printf(”a=%d,b=%d\n",a,b);}例交換兩個數(shù)a59b調(diào)前:a59b調(diào)swap:p1&a&bp2a95b交換:p1&a&bp2a95b返回:#include<stdio.h>
longsum(inta,intb);longfactorial(intn);main(){intn1,n2;longa;scanf("%d,%d",&n1,&n2);a=sum(n1,n2);printf("a=%1d",a);}longsum(inta,intb){longc1,c2;c1=factorial(a);c2=factorial(b);
return(c1+c2);}
longfactorial(intn){longrtn=1;inti;for(i=1;i<=n;i++)rtn*=i;
return(rtn);}longsum(inta,intb);longfactorial(intn);文件包含編譯預(yù)處理命令函數(shù)類型說明函數(shù)定義函數(shù)調(diào)用函數(shù)調(diào)用函數(shù)返回值形參實參7.4函數(shù)的嵌套與遞歸調(diào)用第7章函數(shù)思政目標(biāo)1、邏輯思維鍛煉函數(shù)嵌套與遞歸調(diào)用需嚴(yán)謹設(shè)計邏輯結(jié)構(gòu)。學(xué)生通過理解和運用,能提升邏輯思維,學(xué)會有條理地分析與解決問題,增強思維的縝密性。2、堅韌精神塑造遞歸過程可能復(fù)雜,調(diào)試?yán)щy。學(xué)生在克服這些挑戰(zhàn)中培養(yǎng)堅韌不拔的精神,學(xué)會在面對困難時堅持不懈,提升心理承受能力與意志力。7.4函數(shù)的嵌套與遞歸調(diào)用7.4
函數(shù)的嵌套與遞歸調(diào)用嵌套調(diào)用C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調(diào)用函數(shù)main()調(diào)用函數(shù)a結(jié)束a函數(shù)b函數(shù)調(diào)用函數(shù)b
例求三個數(shù)中最大數(shù)和最小數(shù)的差值#include<stdio.h>
intdif(intx,inty,intz);intmax(intx,inty,intz);intmin(intx,inty,intz);voidmain(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);
d=dif(a,b,c);printf("Max-Min=%d\n",d);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}intmax(intx,inty,intz){intr;r=x>y?x:y;return(r>z?r:z);}intmin(intx,inty,intz){intr;r=x<y?x:y;return(r<z?r:z);}main()調(diào)用函數(shù)dif輸出結(jié)束dif函數(shù)max函數(shù)調(diào)用函數(shù)max調(diào)用函數(shù)minmin函數(shù)例用弦截法求方程根xyf(x)0x1x2xf(x1)f(x2)求f(x1)與f(x2)連線與x軸的交點x輸入x1,x2,求f(x1),f(x2)直到f(x1)與f(x2)異號y=f(x),y1=f(x1)y與y1同號真假x1=xy1=yx2=x直到
|y|<
root=x輸出
rootroot函數(shù)運行情況:Inputx1,x2:2,6
Arootofequationis5.0000main()調(diào)用函數(shù)root輸出根x結(jié)束root函數(shù)xpoint函數(shù)調(diào)用函數(shù)xpoint調(diào)用函數(shù)ff函數(shù)遞歸調(diào)用定義:函數(shù)直接或間接的調(diào)用自身叫函數(shù)的遞歸調(diào)用f()調(diào)f調(diào)f2調(diào)f1f1()f2()說明C編譯系統(tǒng)對遞歸函數(shù)的自調(diào)用次數(shù)沒有限制每調(diào)用函數(shù)一次,在內(nèi)存堆棧區(qū)分配空間,用于存放函數(shù)變量、返回值等信息,所以遞歸次數(shù)過多,可能引起堆棧溢出intf(intx){inty,z;……
z=f(y);…….return(2*z);}intf1(intx){inty,z;……
z=f2(y);…….return(2*z);}intf2(intt){inta,c;……
c=f1(a);…….return(3+c);}例求n的階乘#include<stdio.h>intfac(intn){intf;if(n<0)printf("n<0,dataerror!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}main(){intn,y;printf("Inputaintegernumber:");scanf("%d",&n);
y=fac(n);printf("%d!=%15d",n,y);}聚焦解決問題:求Fibonacci數(shù)列:1、1、2、3、5、8……第20個數(shù)是多少。Fibonacci數(shù)列可以用一個有趣的古典數(shù)學(xué)問題來描述:有一對兔子,出生三個月后每個月都生一對兔子。小兔子長到三個月后每個月又生一對兔子。假設(shè)所有的兔子都不死,問每個月的兔子總數(shù)是多少對?激活舊知(引導(dǎo)入門)f[0]f[1]f[2]f[3]f[4]f[5]f[19]……...11f[19]01452319235#include<stdio.h>main(){inti;
intf[20]={1,1};
for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++){if(i%5==0)printf("\n");printf("%12d",f[i]);}}用數(shù)組求Fibonacci數(shù)列前20個數(shù)示證新知(教會理解)
在定義一個過程或函數(shù)時,出現(xiàn)直接或者間接調(diào)用自己的成分,稱之為遞歸。遞歸的定義若直接調(diào)用自己,稱之為直接遞歸。若間接調(diào)用自己,稱之為間接遞歸。示證新知(教會理解)
int
fun(intn){if(n==1) //語句1return1; //語句2else //語句3returnn*fun(n-1); //語句4}
直接遞歸函數(shù)示例:求n!(n為正整數(shù))示證新知(教會理解)間接遞歸示例:voidf1(){
f2(
);
}voidf2(){
f1(
);
}總可以轉(zhuǎn)換為直接遞歸函數(shù)遞歸:無處不在。實例1:家譜41/23第一年種瓜第n年種瓜實例2:種瓜得瓜42/23問題解決:fun(1)=1 (1)fun(n)=n*fun(n-1)n>1 (2)
構(gòu)建遞歸模型遞歸模型是遞歸算法的抽象,它反映一個遞歸問題的遞歸結(jié)構(gòu)。
例如求n!遞歸算法對應(yīng)的遞歸模型如下:遞歸出口遞歸體一般地,一個遞歸模型是由遞歸出口和遞歸體兩部分組成。遞歸出口確定遞歸到何時結(jié)束。遞歸體確定遞歸求解時的遞推關(guān)系。問題解決:
遞歸出口的一般格式如下:
f(s1)=m1
這里的s1與m1均為常量,有些遞歸問題可能有幾個遞歸出口。問題解決:遞歸體的一般格式如下:
f(sn)=g(f(si),f(si+1),…,f(sn-1),cj,cj+1,…,cm)g是一個非遞歸函數(shù)snsisi+1sn-1…大問題求解若干個相似子問題求解轉(zhuǎn)化常量
把一個不能或不好直接求解的“大問題”轉(zhuǎn)化成一個或幾個“小問題”來解決;再把這些“小問題”進一步分解成更小的“小問題”來解決。遞歸思路46/23但遞歸分解不是隨意的分解,遞歸分解要保證“大問題”與“小問題”相似,即求解過程與環(huán)境都相似。每個“小問題”都可以直接解決(此時分解到遞歸出口)直到例如,統(tǒng)計全國GDP國家統(tǒng)計局(GDP)某企業(yè)(GDP)
海淀區(qū)統(tǒng)計局(GDP)
北京統(tǒng)計局(GDP)上海統(tǒng)計局(GDP)
遞歸出口大問題47/23小問題f(s1)=m1f(sn)=g(f(sn-1),cn-1)f(sn)↓
f(sn-1)↓…↓
f(s2)↓f(s1)求f(sn)的分解過程如下:為了討論方便,簡化上述遞歸模型為:48/23
遇到遞歸出口發(fā)生“質(zhì)變”,即原遞歸問題便轉(zhuǎn)化成可以直接求解的問題。求值過程:
f(s1)=m1↓
f(s2)=g(f(s1),c1)↓
f(s3)=g(f(s2),c2)↓…↓
f(sn)=g(f(sn-1),cn-1)
這樣f(sn)便計算出來了,因此遞歸的執(zhí)行過程由分解和求值兩部分構(gòu)成。49/23嘗試應(yīng)用(知識提練)求解fun(5)即5!的過程如下:fun(5)遞歸出口fun(4)fun(3)fun(2)fun(1)=1分解過程fun(2)=2fun(3)=6fun(4)=24fun(5)=120求值過程學(xué)生實戰(zhàn):用遞歸實現(xiàn)求n的階乘fun(0)=1(1)遞歸出口fun(1)=1fun(n)=n*fun(n-1)n>1(2)遞歸體
#include<stdio.h>intfac(intn){intf;if(n<0)printf("n<0,dataerror!");elseif(n==0||n==1)f=1;elsef=fac(n-1)*n;return(f);}main(){intn,y;printf("Inputaintegernumber:");scanf("%d",&n);
y=fac(n);printf("%d!=%15d",n,y);}驗證新知(教會理解)
(1)方法的遞歸:解決1到100的和圖1循環(huán)計算1到100的和圖2遞歸計算1到100的和#include<stdio.h>main(){inti,sum=0;for(i=1;i<=100;i++)sum+=i;printf("%d",sum);}#include<stdio.h>main(){intsum;sum=getsum(100);printf("%d",sum);}getsum(intn){if(n==1)return1;returngetsum(n-1)+n;}驗證新知(教會理解)
(2)遞歸的實現(xiàn)過程圖1遞歸計算1到100的和融會貫通(考察應(yīng)用)F(1)=1,F(xiàn)(2)=1F(n)=F(n-1)+F(n-2)n>2求F(6)=?F(6)F(2)F(1)F(2)F(1)F(3)F(2)F(4)F(3)F(2)F(1)F(3)F(2)F(5)F(4)求得F(6)=8一顆遞歸樹對于復(fù)雜的遞歸問題,在求解時需要進行多次分解和求值。例如Fibonacci數(shù)列遞歸算法對應(yīng)的遞歸模型:學(xué)生實戰(zhàn):F(1)=1,F(xiàn)(2)=1F(n)=F(n-1)+F(n-2)n>2求F(20)=?#include<stdio.h>longfib(intn){longf;if(n==1||n==2)f=1;elsef=fib(n-1)+fib(n-2);return(f);}main(){intn;longy;printf("Inputaintegernumber:");scanf("%d",&n);y=fib(n);printf("fib(%d)=%15ld",n,y);}學(xué)生實戰(zhàn):歸納總結(jié):設(shè)計求解問題的遞歸模型。轉(zhuǎn)換成對應(yīng)的遞歸算法。遞歸算法設(shè)計的步驟遞歸模型遞歸算法課后實踐:有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數(shù),他說比第3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最后問第一個人,他說是10歲。設(shè)計一個函數(shù)描述上述遞歸過程,并采用主函數(shù)調(diào)用的方式,輸出第五個學(xué)生的年齡。7.5數(shù)組作為函數(shù)參數(shù)第7章函數(shù)思政目標(biāo)1、嚴(yán)謹思維與數(shù)據(jù)處理理解數(shù)組參數(shù)傳遞規(guī)則,培養(yǎng)嚴(yán)謹思維,學(xué)會精準(zhǔn)處理數(shù)據(jù),提高信息管理能力。2、團隊協(xié)作與創(chuàng)新意識分組合作解決數(shù)組相關(guān)問題,培養(yǎng)團隊精神,激發(fā)創(chuàng)新思維,探索優(yōu)化方案。7.5數(shù)組作為函數(shù)參數(shù)7.5
數(shù)組作為函數(shù)參數(shù)數(shù)組元素作函數(shù)實參——值傳遞例兩個數(shù)組大小比較432105a562312107688432105b212343986654n=0m=0k=0in=0m=0k=1in=0m=1k=1in=1m=1k=1in=1m=1k=2in=2m=1k=2in=3m=1k=2a和b為有10個元素的整型數(shù)組比較兩數(shù)組對應(yīng)元素變量n,m,k記錄a[i]>b[i],a[i]==b[i],a[i]<b[i]的個數(shù)最后若n>k,認為數(shù)組a>b
若n<k,認為數(shù)組a<b
若n==k,認為數(shù)組a==b#include<stdio.h>main(){inta[10],b[10],i,n=0,m=0,k=0;printf("Enterarraya:\n");for(i=0;i<10;i++) scanf("%d",&a[i]);printf("Enterarrayb:\n");for(i=0;i<10;i++) scanf("%d",&b[i]);for(i=0;i<10;i++){if(large(a[i],b[i])==1)n=n+1;elseif(large(a[i],b[i])==0)m=m+1;elsek=k+1;}
/*Output*/}intlarge(intx,inty){intflag;if(x>y)flag=1;elseif(x<y)flag=-1;elseflag=0;return(flag);}數(shù)組名作函數(shù)參數(shù)地址傳遞在主調(diào)函數(shù)與被調(diào)函數(shù)分別定義數(shù)組,且類型應(yīng)一致形參數(shù)組大小(多維數(shù)組第一維)可不指定形參數(shù)組名是地址變量例求學(xué)生的平均成績#include<stdio.h>
floataverage(intstu[10],intn);voidmain(){intscore[10],i;floatav;printf("Input10scores:\n");for(i=0;i<10;i++)scanf("%d",&score[i]);av=average(score,10);printf("Averageis:%.2f",av);}floataverage(int
stu[10],intn){inti;floatav,total=0;for(i=0;i<n;i++)total+=stu[i];av=total/n;returnav;}實參用數(shù)組名形參用數(shù)組定義,
intstu[]..2109score562312….….88stu例數(shù)組元素與數(shù)組名作函數(shù)參數(shù)比較12a調(diào)用前a[0]a[1]12a調(diào)用a[0]a[1]12xy21xy交換12a返回#include<stdio.h>voidswap2(intx,inty){intz;z=x;x=y;y=z;}main(){inta[2]={1,2};
swap2(a[0],a[1]);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}值傳遞12a調(diào)用前12ax調(diào)用21ax交換21a返回#include<stdio.h>voidswap2(intx[]){intz;z=x[0];x[0]=x[1];x[1]=z;}main(){inta[2]={1,2};
swap2(a);printf("a[0]=%d\na[1]=%d\n",a[0],a[1]);}地址傳遞例數(shù)組元素與數(shù)組名作函數(shù)參數(shù)比較例數(shù)組排序----簡單選擇排序voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i; for(j=i+1;j<n;j++) if(array[j]<array[k])k=j; if(k!=i) {t=array[i]; array[i]=array[k]; array[k]=t; }}}main(){inta[10],i;for(i=0;i<10;i++) scanf("%d",&a[i]);
sort(a,10);for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}0123456789a4968573299927137688arraykjjjkjkjjjjj949i=0例數(shù)組排序----簡單選擇排序voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i; for(j=i+1;j<n;j++) if(array[j]<array[k])k=j; if(k!=i) {t=array[i]; array[i]=array[k]; array[k]=t; }}}main(){inta[10],i;for(i=0;i<10;i++) scanf("%d",&a[i]);
sort(a,10);for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}kjjkjkjjjjj0123456789a4968573299927137688array949kk1368i=10123456789a9132732495768768899arrayi=8例數(shù)組排序----簡單選擇排序voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){k=i; for(j=i+1;j<n;j++) if(array[j]<array[k])k=j; if(k!=i) {t=array[i]; array[i]=array[k]; array[k]=t; }}}main(){inta[10],i;for(i=0;i<10;i++) scanf("%d",&a[i]);
sort(a,10);for(i=0;i<10;i++)printf("%d",a[i]);printf("\n");}例求二維數(shù)組中最大元素值1357246815173412ijmax=11357246815173412ijmax=31357246815173412ijmax=5j1357246815173412imax=7j1357246815173412imax=7j1357246815173412imax=34intmax_value(intarray[3][4]){inti,j,k,max;max=array[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++) if(array[i][j]>max) max=array[i][j];return(max);}main(){inta[3][4]={{1,3,5,7}, {2,4,6,8},{15,17,34,12}};printf("maxvalueis%d\n",max_value(a));}多維形參數(shù)組第一維維數(shù)可省略,第二維必須相同
intarray[][4]例求二維數(shù)組中各行元素之和get_sum_row(intx[][3],intresult[],introw,intcol){inti,j;for(i=0;i<row;i++){result[i]=0; for(j=0;j<col;j++) result[i]+=x[i][j];}}main(){inta[2][3]={3,6,9,1,4,7};intsum_row[2],row=2,col=3,i;
get_sum_row(a,sum_row,row,col);for(i=0;i<row;i++)printf("Thesumofrow[%d]=%d\n",i+1,sum_row[i]);}314679asum_rowxresult18127.6變量的存儲屬性第7章函數(shù)思政目標(biāo)1、樹立全局意識認識全局變量和局部變量的特點及相互關(guān)系,讓學(xué)生明白在程序設(shè)計中既要關(guān)注局部功能實現(xiàn),也要考慮全局影響,培養(yǎng)全局觀念,避免因局部優(yōu)化而損害整體性能,類比于在團隊合作中兼顧個人與集體利益。2、嚴(yán)謹對待細節(jié)處理變量存儲屬性時,細節(jié)決定成敗,如同名變量在不同作用域的影響、變量初始化時機等。學(xué)生在學(xué)習(xí)過程中注重這些細節(jié),能養(yǎng)成嚴(yán)謹認真的態(tài)度,提高解決問題的準(zhǔn)確性,如同在學(xué)習(xí)和生活中注重細節(jié)才能避免失誤。7.6變量的存儲屬性7.6
變量的存儲屬性概述變量是對程序中數(shù)據(jù)的存儲空間的抽象內(nèi)存…….main(){inta;a=10;printf(“%d”,a);}編譯或函數(shù)調(diào)用時為其分配內(nèi)存單元1020002001程序中使用變量名對內(nèi)存操作變量的屬性數(shù)據(jù)類型:變量所持有的數(shù)據(jù)的性質(zhì)(操作屬性)存儲屬性存儲器類型:寄存器、靜態(tài)存儲區(qū)、動態(tài)存儲區(qū)生存期:變量在某一時刻存在-------靜態(tài)變量與動態(tài)變量作用域:變量在某區(qū)域內(nèi)有效-------局部變量與全局變量變量的存儲類型auto-----自動型register-----寄存器型static------靜態(tài)型extern-----外部型變量定義格式:[存儲類型]數(shù)據(jù)類型變量表;7.6
變量的存儲屬性概述變量是對程序中數(shù)據(jù)的存儲空間的抽象如:intsum;
autointa,b,c;
registerinti;
staticfloatx,y;局部變量與全局變量局部變量---內(nèi)部變量定義:在函數(shù)內(nèi)定義,只在本函數(shù)內(nèi)有效說明:main中定義的變量只在main中有效不同函數(shù)中同名變量,占不同內(nèi)存單元形參屬于局部變量可定義在復(fù)合語句中有效的變量局部變量可用存儲類型:autoregisterstatic(默認為auto)floatf1(inta){intb,c;…….}charf2(intx,inty){inti,j;……}main(){intm,n;…….}a,b,c有效x,y,i,j有效m,n有效例不同函數(shù)中同名變量main(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}例復(fù)合語句中變量#defineN5main(){inti;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++)
{
inttemp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;
}for(i=0;i<N;i++)printf("%d",a[i]);}運行結(jié)果:54321例復(fù)合語句中變量#defineN5main(){inti;inta[N]={1,2,3,4,5};for(i=0;i<N/2;i++)
{
inttemp; temp=a[i]; a[i]=a[N-i-1]; a[N-i-1]=temp;
}for(i=0;i<N;i++)printf("%d",a[i]);}例不同函數(shù)中同名變量main(){inta,b;a=3;b=4;printf("main:a=%d,b=%d\n",a,b);sub();printf("main:a=%d,b=%d\n",a,b);}sub(){inta,b;a=6;b=7;printf("sub:a=%d,b=%d\n",a,b);}運行結(jié)果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4全局變量---外部變量定義:在函數(shù)外定義,可為本文件所有函數(shù)共用有效范圍:從定義變量的位置開始到本源文件結(jié)束,及有extern說明的其它源文件
應(yīng)盡量少使用全局變量,因為:全局變量在程序全部執(zhí)行過程中占用存儲單元降低了函數(shù)的通用性、可靠性,可移植性降低程序清晰性,容易出錯
定義
說明次數(shù):只能1次可說明多次位置:所有函數(shù)之外函數(shù)內(nèi)或函數(shù)外分配內(nèi)存:分配內(nèi)存,可初始化不分配內(nèi)存,不可初始化>外部變量說明:
extern數(shù)據(jù)類型變量表;外部變量定義與外部變量說明不同若外部變量與局部變量同名,則外部變量被屏蔽外部變量可用存儲類型:缺省或
staticfloatmax,min;floataverage(floatarray[],intn){inti;floatsum=array[0];max=min=array[0];for(i=1;i<n;i++){if(array[i]>max)max=array[i];elseif(array[i]<min)min=array[i];sum+=array[i];}return(sum/n);}main(){inti;floatave,score[10];/*Input*/ave=average(score,10);printf("max=%6.2f\nmin=%6.2f\naverage=%6.2f\n",max,min,ave);}作用域maxminintp=1,q=5;floatf1(inta){intb,c;…….}intf3(){…..}charc1,c2;charf2(intx,inty){inti,j;……}main(){intm,n;…….}c1,c2的作用范圍p,q的作用范圍externcharc1,c2;externcharc1,c2;c1,c2的作用范圍擴展后c1,c2的作用范圍擴展后例外部變量定義與說明intmax(intx,inty){intz;z=x>y?x:y;return(z);}main(){externinta,b;printf("max=%d",max(a,b));}inta=13,b=-8;運行結(jié)果:max=13externinta,b;intmax(){intz;z=a>b?a:b;return(z);}main(){printf("max=%d",max());}inta=13,b=-8;inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;printf("max=%d",max(a,b));}例外部變量與局部變量運行結(jié)果:max=8inti;main(){voidprt();for(i=0;i<5;i++)prt();}voidprt(){for(i=0;i<5;i++)printf(“%c”,’*’);printf(“\n”);}例外部變量副作用運行結(jié)果:*****動態(tài)變量與靜態(tài)變量存儲方式靜態(tài)存儲:程序運行期間分配固定存儲空間動態(tài)存儲:程序運行期間根據(jù)需要動態(tài)分配存儲空間內(nèi)存用戶區(qū)程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)全局變量、局部靜態(tài)變量形參變量局部動態(tài)變量(autoregister)函數(shù)調(diào)用現(xiàn)場保護和返回地址等生存期靜態(tài)變量:從程序開始執(zhí)行到程序結(jié)束動態(tài)變量:從包含該變量定義的函數(shù)開始執(zhí)行至函數(shù)執(zhí)行結(jié)束變量存儲類型靜態(tài)動態(tài)存儲方式程序整個運行期間函數(shù)調(diào)用開始至結(jié)束生存期編譯時賦初值,只賦一次每次函數(shù)調(diào)用時賦初值自動賦初值0或空字符不確定未賦初值靜態(tài)存儲區(qū)動態(tài)區(qū)存儲區(qū)寄存器局部變量外部變量作用域定義變量的函數(shù)或復(fù)合語句內(nèi)本文件其它文件局部變量默認為auto型register型變量個數(shù)受限,且不能為long,double,float型局部static變量具有全局壽命和局部可見性局部static變量具有可繼承性extern不是變量定義,可擴展外部變量作用域register局部staticauto外部static外部存儲類別例文件file1.cinta;main(){…….…….f2;…….f1;…….}f1(){autointb;………f2;……..}f2(){staticintc;………}C作用域b作用域a作用域mainf2f1mainf1f2maina生存期:b生存期:c生存期:例auto變量的作用域main(){intx=1;voidprt(void);
{
intx=3;prt();printf(“2ndx=%d\n”,x);
}printf(“1stx=%d\n”,x);}voidprt(void){intx=5;printf(“3thx=%d\n”,x);}運行結(jié)果:3thx=52ndx=31stx=1x=1作用域x=1作用域x=3作用域x=5作用域main(){voidincrement(void);increment();increment();increment();}voidincrement(void){intx=0;x++;printf(“%d\n”,x);}例局部靜態(tài)變量值具有可繼承性運行結(jié)果:111main(){voidincrement(void);increment();increment();increment();}voidincrement(void){staticintx=0;x++;printf(“%d\n”,x);}運行結(jié)果:123例變量的壽命與可見性#include<stdio.h>inti=1;main(){staticinta;
registerintb=-10;
intc=0;printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);c=c+8;other();printf("-----MAIN------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);i=i+10;
other();}other(){staticinta=2;staticintb;
intc=10;a=a+2;i=i+32;c=c+5;printf("-----OTHER------\n");printf("i:%da:%d\b:%dc:%d\n",i,a,b,c);b=a;}-------Main------i:1a:0b:-10c:0------Other------i:33a:4b:0c:15-------Main-----i:33a:0b:-10c:8-------Other-------i:75a:6b:4c:15全局i1main:a0b:-10registermain:c0靜態(tài)存儲區(qū)動態(tài)存儲區(qū)other:a2other:b0other:c10843315443other:c10675156main(){voidgx(),gy();
externintx,y;printf(“1:x=%d\ty=%d\n”,x,y);y=246;gx();gy();}voidgx(){externintx,y;x=135;printf(“2:x=%d\ty=%d\n”,x,y);}intx,y;voidgy(){printf(“3:x=%d\ty=%d\n”,x,y);}例用extern擴展外部變量作用域運行結(jié)果:1:x=0y=02:x=135y=2463:x=135y=246例引用其它文件中的外部變量intglobal;externfloatx;main(){intlocal; . . .}externintglobal;staticintnumber;func2(){ . . .}floatx;staticintnumber;func3(){externintglobal; . . .}file1.cfile2.cfile3.c例引用其它文件中的變量,輸出ab和a的m次方inta;main(){intpower(intn);intb=3,c,d,m;printf("Enterthenumberaanditspower:\n");scanf("%d,%d",&a,&m);c=a*b;printf("%d*%d=%d\n",a,b,c);d=power(m);printf("%d**%d=%d",a,m,d);}externinta;intpower(intn){inti,y=1;for(i=1;i<=n;i++) y*=a;return(y);}7.7常見錯誤分析第7章函數(shù)思政目標(biāo)1、嚴(yán)謹細致的做事態(tài)度函數(shù)使用中,遵循規(guī)范至關(guān)重要。包含頭文件、聲明函數(shù)等細節(jié)需嚴(yán)謹對待,培養(yǎng)學(xué)生一絲不茍的做事風(fēng)格。2、自我反思與問題解決能力面對函數(shù)相關(guān)錯誤,學(xué)生應(yīng)積極反思。通過分析錯誤原因,提高解決問題能力,增強面對挑戰(zhàn)的信心。7.7常見錯誤分析7.7常見錯誤分析使用庫函數(shù)時忘記包含頭文件1不少初學(xué)者容易忘記,在使用庫函數(shù)時需要用“#include”命令將該原型函數(shù)的頭文件包含進來。例如:intmain(){ inta=4; printf("%f",sqrt(a));}編譯警告信息如左圖所示,運行結(jié)果如右圖所示,顯然,輸出結(jié)果是錯誤的。編譯警告信息指出“printf”和“sqrt”沒有被定義,這是因為使用庫函數(shù)時忘記包含頭文件了,應(yīng)在程序的開頭加上以下兩行代碼。#include<stdio.h>#include<math.h>7.7常見錯誤分析忘記對所調(diào)用的函數(shù)進行函數(shù)原型聲明2如果函數(shù)的返回值不是整型或者字符型,并且函數(shù)的定義在主調(diào)函數(shù)之后,那么在調(diào)用函數(shù)前必須對函數(shù)進行原型聲明。初學(xué)者容易忘記這一點,例如:#include<stdio.h>intmain(){ doublea=2.5,b=3.9; printf("Theavergaeof%5.2fand%5.2fis%5.2f\n",a,b,average(a,b));}doubleaverage(doublex,doubley){ return((x+y)/2.0);}7.7常見錯誤分析編譯錯誤信息如下圖所示。average函數(shù)是非整型函數(shù),且調(diào)用在先,定義在后,因此,應(yīng)在調(diào)用之前進行函數(shù)聲明。可在main函數(shù)之前或main函數(shù)中加上函數(shù)原型的聲明語句:doubleaverage(doublex,doubley);7.7常見錯誤分析函數(shù)的實參和形參類型不一致3函數(shù)一旦被定義,就可多次調(diào)用,但必須保證形參和實參數(shù)據(jù)類型一致。如果實參和形參數(shù)據(jù)類型不一致,則按不同類型數(shù)值的賦值規(guī)則進行轉(zhuǎn)換。例如:#include<stdio.h>intmain(){ intfun(intx,inty); floata=2.5,b=3.9,c; c=fun(a,b); printf("%f\n",c);}intfun(intx,inty){ returnx+y;}7.7常見錯誤分析編譯警告信息如左圖所示,運行結(jié)果如右圖所示。實參a和b為float型,形參x和y為int型。在編譯時,系統(tǒng)給出了“警告”。a和b值傳遞給x和y時,會按賦值規(guī)則處理,把小數(shù)部分刪去,從而導(dǎo)致結(jié)果錯誤。7.7常見錯誤分析使用未賦值的自動變量4未進行初始化時,自動變量的值是不確定的。在使用時要特別注意,例如:#include<stdio.h>intmain(){ inti; printf("%d\n",i);}7.7常見錯誤分析運行結(jié)果如下圖所示,這里的-858993460是一個不可預(yù)知的數(shù)。因此,在引用自動變量時,必須對其初始化或?qū)ζ滟x值。7.7常見錯誤分析本章小結(jié)本章主要介紹了C語言中函數(shù)的相關(guān)內(nèi)容。通過本章的學(xué)習(xí),讀者應(yīng)重點掌握以下內(nèi)容。掌握函數(shù)定義、調(diào)用和原型聲明的方法。理解函數(shù)參數(shù)傳遞的過程,以及“值傳遞”和“地址傳遞”的區(qū)別。掌握函數(shù)的嵌套調(diào)用和遞歸調(diào)用的程序設(shè)計方法。理解局部變量、全局變量以及變量的存儲類別的概念,能夠區(qū)分各種類型變量的作用域和生存期的情況。了解內(nèi)部函數(shù)和外部函數(shù)的概念。學(xué)習(xí)完本章內(nèi)容后,讀者應(yīng)樹立使用函數(shù)進行程序設(shè)計的思想,從而可以對較復(fù)雜的問題進行模塊化程序設(shè)計。7.8經(jīng)典題型第7章函數(shù)思政目標(biāo)1、鞏固基礎(chǔ)知識經(jīng)典題解涵蓋函數(shù)各方面知識,學(xué)生通過練習(xí)鞏固函數(shù)定義、調(diào)用、參數(shù)傳遞等基礎(chǔ)內(nèi)容,為深入學(xué)習(xí)編程筑牢根基,如同建造高樓大廈需穩(wěn)固基石,培養(yǎng)扎實的專業(yè)素養(yǎng)。2、培養(yǎng)嚴(yán)謹邏輯解題過程要求精準(zhǔn)理解規(guī)則,如函數(shù)返回值類型、變量作用域等。學(xué)生需細致分析,避免邏輯漏洞,養(yǎng)成嚴(yán)謹思維習(xí)慣,提高解決問題的準(zhǔn)確性和效率。1.下述程序段的輸出結(jié)果是()。intx=10;inty=x++;printf(“%d,%d”,(x++,y),y++);A)11,10B)11,11C)10,10D)10,11答案:A)
函數(shù)參數(shù)求解順序:自右向左3.以下敘述中正確的是()。A)C語言程序總是從第一個定義的函數(shù)開始執(zhí)行B)在C語言程序中,要調(diào)用的函數(shù)必須在main()函數(shù)中定義C)C語言程序總是從main()函數(shù)開始執(zhí)行D)C語言程序中的main()函數(shù)必須放在程序的開始部分答案:C)C程序總是從main()函數(shù)開始執(zhí)行
不能在一個函數(shù)內(nèi)部定義另一個函數(shù)
main()函數(shù)可以放在程序的任何位置
4.以下函數(shù)fff(floatx){printf(“%d\n”,x*x);}的類型是()。A)與參數(shù)x的類型相同B)void類型C)intD)無法確定答案:C)
當(dāng)定義函數(shù)時,函數(shù)名前缺類型名時,類型應(yīng)為int類型。void類型表示空類型,就是不屬于任何類型。6.以下程序輸出的結(jié)果是()。#include<stdio.h>main(){inti=2,p;p=f(i,i+1);printf(“%d\n”,p);}intf(inta,intb){intc;c=a;if(a>
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【正版授權(quán)】 IEC TR 63558:2025 EN Automatic speech recognition: Classification according to acoustic and linguistic indicators in real-life applications
- 廠房長期租賃合同書
- 大數(shù)據(jù)智能營銷服務(wù)合同
- 環(huán)保設(shè)施建設(shè)施工合同
- 智慧物流園區(qū)運營服務(wù)協(xié)議
- 院校與企業(yè)戰(zhàn)略合作協(xié)議書
- 房屋交易居間合同
- 合同資料員勞動合同
- 做時間的主人活動方案
- 個人勞務(wù)分包合同協(xié)議書
- 2025年中華工商時報社事業(yè)單位招聘12人歷年高頻重點模擬試卷提升(共500題附帶答案詳解)
- 安全生產(chǎn)事故調(diào)查與案例分析(第3版)課件 呂淑然 第1-4章 緒論-應(yīng)急預(yù)案編制與應(yīng)急管理
- 《教育強國建設(shè)規(guī)劃綱要(2024-2035年)》解讀講座
- 2024-2025學(xué)年廣東省深圳市寶安區(qū)高一(上)期末數(shù)學(xué)試卷(含答案)
- 同濟大學(xué)《線性代數(shù)》-課件
- 申請兩癌補助申請書
- 香港審計合同范例
- 2024年事業(yè)單位考試(面試)試題與參考答案
- 《高層建筑結(jié)構(gòu)》課件
- 校園安全形勢會商研判制度(4篇)
- 連鑄應(yīng)急預(yù)案
評論
0/150
提交評論