數(shù)據(jù)結構函數(shù)課件_第1頁
數(shù)據(jù)結構函數(shù)課件_第2頁
數(shù)據(jù)結構函數(shù)課件_第3頁
數(shù)據(jù)結構函數(shù)課件_第4頁
數(shù)據(jù)結構函數(shù)課件_第5頁
已閱讀5頁,還剩103頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第七章函數(shù)概述函數(shù)的定義函數(shù)的返回值函數(shù)的調用、函數(shù)的嵌套與遞歸調用函數(shù)參數(shù)及其傳遞方式變量的存儲屬性數(shù)組作為函數(shù)參數(shù)第七章函數(shù)概述函數(shù)的定義函數(shù)的返回值函數(shù)的調用、函數(shù)的嵌17.1概述模塊化程序設計基本思想:將一個大的程序按功能分割成一些小模塊,特點:各模塊相對獨立、功能單一、結構清晰、接口簡單控制了程序設計的復雜性提高元件的可靠性縮短開發(fā)周期避免程序開發(fā)的重復勞動易于維護和功能擴充開發(fā)方法:自上向下,逐步分解,分而治之7.1概述2從用戶角度標準函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)從函數(shù)形式無參函數(shù)有參函數(shù)使用庫函數(shù)應注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件函數(shù)分類

從用戶角度使用庫函數(shù)應注意:函數(shù)分類

3一般格式合法標識符函數(shù)返回值類型缺省int型無返回值void函數(shù)體函數(shù)類型函數(shù)名(形參類型說明表){ 說明部分 語句部分}現(xiàn)代風格:例有參函數(shù)(現(xiàn)代風格)intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)(現(xiàn)代風格)intmax(intx,y){intz;z=x>y?x:y;return(z);}例空函數(shù)dummy(){}函數(shù)體為空例無參函數(shù)printstar(){printf(“**********\n”);}或printstar(void){printf(“**********\n”);}7.2函數(shù)的定義合法標識符函數(shù)返回值類型函數(shù)體函數(shù)類型函數(shù)名(形參4函數(shù)類型函數(shù)名(形參表)形參類型說明{ 說明部分 語句部分}傳統(tǒng)風格:例有參函數(shù)(傳統(tǒng)風格)intmax(x,y)

intx,y;{intz;z=x>y?x:y;return(z);}函數(shù)傳統(tǒng)風格和例子函數(shù)類型函數(shù)名(形參表)傳統(tǒng)風格:例有參函數(shù)5返回語句形式:return(表達式);

或return表達式;

或return;功能:使程序控制從被調用函數(shù)返回到調用函數(shù)中,同時把返值帶給調用函數(shù)說明:函數(shù)中可有多個return語句若無return語句,遇}時,自動返回調用函數(shù)若函數(shù)類型與return語句中表達式值的類型不一致,按前者為準,自動轉換------函數(shù)調用轉換void型函數(shù)例無返回值函數(shù)

voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}7.3函數(shù)的返回值例無返回值函數(shù)7.3函數(shù)的返回值6調用形式函數(shù)名(實參表);說明:實參與形參個數(shù)相等,類型一致,按順序一一對應實參表求值順序,因系統(tǒng)而定(TurboC自右向左)6.4函數(shù)的調用6.4函數(shù)的調用7函數(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ù)的調用方式

函數(shù)語句:函數(shù)的調用方式

8對被調用函數(shù)要求:必須是已存在的函數(shù)庫函數(shù):#include<*.h>用戶自定義函數(shù):函數(shù)類型說明函數(shù)說明一般形式:函數(shù)類型函數(shù)名(形參類型[形參名],…..);

或函數(shù)類型函數(shù)名();作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便檢驗函數(shù)定義與函數(shù)說明不同函數(shù)說明位置:程序的數(shù)據(jù)說明部分(函數(shù)內或外)下列情況下,可不作函數(shù)說明若函數(shù)返值是char或int型,系統(tǒng)自動按int型處理被調用函數(shù)定義出現(xiàn)在主調函數(shù)之前有些系統(tǒng)(如BorlandC++)要求函數(shù)說明指出函數(shù)返值類型和形參類型,并且對void和int型函數(shù)也要進行函數(shù)說明函數(shù)說明

對被調用函數(shù)要求:函數(shù)說明

96.4.1函數(shù)的嵌套調用嵌套調用C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調用函數(shù)main()調用函數(shù)a結束a函數(shù)b函數(shù)調用函數(shù)b6.4.1函數(shù)的嵌套調用main()調用函數(shù)a結束a函數(shù)10例1求三個數(shù)中最大數(shù)和最小數(shù)的差值思考:max函數(shù)intmax(intx,inty,intz)功能:求三個數(shù)中的最大值min函數(shù)intmax(intx,inty,int)功能:求三個數(shù)中的最小值dif函數(shù)功能:求差值方式:max(a,b,c)-min(a,b,c)(即分別調用max函數(shù)和min函數(shù),求其差值)例1求三個數(shù)中最大數(shù)和最小數(shù)的差值max函數(shù)min函數(shù)11程序設計: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);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}main(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);d=dif(a,b,c);printf("Max-Min=%d\n",d);}程序設計:12求立方函數(shù)longcn(intn)功能:求n的立方值注意:由于立方值比較大,定義為long類型n*n*n=sq(n)*n例2:給定一個數(shù),求其平方及立方思路:求平方函數(shù)longsq(intn)功能:求n的平方值注意:由于平方值比較大,定義為long類型求立方函數(shù)例2:給定一個數(shù),求其平方及立方求平方函數(shù)13程序設計:#include<stdio.h>longsq(intn){longk;k=n*n;returnk;}longcn(intn){longk;k=sq(n)*n;returnk;}main(){intn;scanf(“%d”,&n);printf(“sq(%d)=%ld,cn(%d)=%ld\n”,n,sq(n),n,cn(n));}程序設計:14例3:求1k+2k+3k+……+nk思路:求和函數(shù)longf2(intn,intk)功能:求1k+2k+3k+……+nk注意:由于結果可能比較大,定義為long類型1k+2k+3k+……+nk=for(i=1;i<=n;i++)sum+=f1(i,k);求ik函數(shù)longf1(inti,intk)功能:求i的k次方(ik)注意:由于結果可能比較大,定義為long類型例3:求1k+2k+3k+……+nk求和函數(shù)求ik函數(shù)15程序設計:#include<stdio.h>longf1(inti,intk){longmul=1;intj;for(j=1;j<=k;j++) mul*=i;returnmul;}longf2(intn,intk){longsum=0;intj;for(j=1;j<=n;j++) sum+=f1(j,k);returnsum;}voidmain(){intn,k;scanf("%d,%d",&n,&k);printf("sum=%ld\n",f2(n,k));}程序設計:16例4:求20以內全部素數(shù)的積與全部素數(shù)的和的商思路:intisprime(intn)功能:判斷n是否為素數(shù)若是返回1,不是返回0求素數(shù)和longsum(intn)功能:求n以內素數(shù)的和for(i=2;i<=n;i++)if(isprime(i))s+=i;求素數(shù)積longmul(intn)功能:求n以內素數(shù)的積for(i=2;i<=n;i++)if(isprime(i))m*=i;floatdiv(intn)功能:求n以內素數(shù)的積與n以內素數(shù)的和的商d=mul(n)*1.0/sum(n);例4:求20以內全部素數(shù)的積與全部素數(shù)的和的商intis17程序設計:#include<stdio.h>intisprime(intn){intk;for(k=2;k<n;k++)if(n%k==0)return0;return1;}longsum(intn){longs=0;intk;for(k=2;k<=n;k++) if(isprime(k))s+=k; returns;}longmul(intn){longm=1;intk;for(k=2;k<=n;k++) if(isprime(k))m*=k; returnm;}floatdiv(intn){floatd;d=mul(n)*1.0/sum(n);returnd;}voidmain(){printf("%.2f",div(20));}程序設計:18思考題一:編寫一程序計算任一輸入的整數(shù)的各位數(shù)之和數(shù)據(jù)結構函數(shù)課件19課后練習:編寫一個函數(shù),輸入n為偶數(shù)時,調用函數(shù)求1/2+1/4+...+1/n,輸入n為奇數(shù)時,調用函數(shù)1/1+1/3+...+1/n課后練習:206.4.2函數(shù)的遞歸調用遞歸調用函數(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);}6.4.2函數(shù)的遞歸調用intf(intx)int21例求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);}例求n的階乘#include<stdio.h>22例題:hanoi塔問題voidmove(charx,chary){printf(“%c%c\n”,x,y);}voidhanoi(intn,charone,chartwo,charthree){if(n==1)move(one,three);else{hanoi(n-1,one,three,two)

move(one,three);

hanoi(n-1,two,one,three);}}main(){intm;scanf(“%d”,&m);printf(“Thesteptomoving%3ddisces:\n”,m);hanoi(m,’A’,’B’’C’);}例題:hanoi塔問題23課后思考:有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數(shù),他說比第3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最后問第一個人,他說是10歲。請問第五個人多大?intage(n)intn;{intc;if(n==1)c=10;elsec=age(n-1)+2;return(c);}main(){printf("%d",age(5));}課后思考:有5個人坐在一起,問第五個人多少歲?他說比第4個人24思考題:題目:利用遞歸調用方式,將所輸入的5個字符,以相反順序打印出來。#include"stdio.h"main(){inti=5;voidpalin(intn);palin(i);printf("\n");}voidpalin(intn){charnext;if(n<=1){next=getchar();printf("\n\0:");putchar(next);}else{next=getchar();palin(n-1);putchar(next);}}思考題:25形參與實參形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù):調用函數(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);}形參實參6.5函數(shù)參數(shù)及其傳遞方式

形參與實參c=max(a,b);(main函數(shù))(max26說明:實參必須有確定的值形參必須指定類型形參與實參類型一致,個數(shù)相同若形參與實參類型不一致,自動按形參類型轉換———函數(shù)調用轉換形參在函數(shù)被調用前不占內存;函數(shù)調用時為形參分配內存;調用結束,內存釋放形參與實參形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù):調用函數(shù)時函數(shù)名后面括號中的表達式6.5函數(shù)參數(shù)及其傳遞方式說明:6.5函數(shù)參數(shù)及其傳遞方式27值傳遞方式方式:函數(shù)調用時,為形參分配單元,并將實參的值復制到形參中;調用結束,形參單元被釋放,實參單元仍保留并維持原值特點:形參與實參占用不同的內存單元單向傳遞參數(shù)傳遞方式參數(shù)傳遞方式28711x:y:調用前:調用結束:711x:y:/*ch7_2.c*/#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;}調用:711a:b:711x:y:swap:711x:y:117a:b:temp例交換兩個數(shù)711x:y:調用前:調用結束:711x:y:/*ch7_229方式:函數(shù)調用時,將數(shù)據(jù)的存儲地址作為參數(shù)傳遞給形參特點:形參與實參占用同樣的存儲單元“雙向”傳遞實參和形參必須是地址常量或變量函數(shù)的地址傳遞

方式:函數(shù)調用時,將數(shù)據(jù)的存儲地址作為參數(shù)傳遞給形參函數(shù)的地30/*ch9_3.c*/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調前:a59b調swap:p1&a&bp2a95b交換:p1&a&bp2a95b返回:例子圖解/*ch9_3.c*/例交換兩個數(shù)a59b調前:a59b31#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);文件包含編譯預處理命令函數(shù)類型說明函數(shù)定義函數(shù)調用函數(shù)調用函數(shù)返回值形參實參例子解析#include<stdio.h>longsum(i326.6數(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ù)組對應元素變量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);}6.6數(shù)組作為函數(shù)參數(shù)例兩個數(shù)組大小比較432105a33地址傳遞在主調函數(shù)與被調函數(shù)分別定義數(shù)組,且類型應一致形參數(shù)組大小(多維數(shù)組第一維)可不指定形參數(shù)組名是地址變量數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù)34#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例求學生的平均成績#include<stdio.h>floatave3512a調用前12ax調用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ù)比較12a調用前12ax調用21ax交換21a返回#includ36voidsort(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)37voidsort(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=1例數(shù)組排序----簡單選擇排序(1)voidsort(intarray[],intn)380123456789a9132732495768768899arrayi=8voidsort(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ù)組排序----簡單選擇排序(2)0123456789a913273249576876889939概述變量是對程序中數(shù)據(jù)的存儲空間的抽象內存…….main(){inta;a=10;printf(“%d”,a);}編譯或函數(shù)調用時為其分配內存單元1020002001程序中使用變量名對內存操作6.8變量的存儲屬性內存…….main()編譯或函數(shù)調用時為其分配內存單元10240變量的屬性數(shù)據(jù)類型:變量所持有的數(shù)據(jù)的性質(操作屬性)存儲屬性存儲器類型:寄存器、靜態(tài)存儲區(qū)、動態(tài)存儲區(qū)生存期:變量在某一時刻存在-------靜態(tài)變量與動態(tài)變量作用域:變量在某區(qū)域內有效-------局部變量與全局變量變量的存儲類型auto-----自動型register-----寄存器型static------靜態(tài)型extern-----外部型變量定義格式:[存儲類型]數(shù)據(jù)類型變量表;概述變量是對程序中數(shù)據(jù)的存儲空間的抽象如:intsum;

autointa,b,c;

registerinti;

staticfloatx,y;6.8變量的存儲屬性

變量的屬性概述如:intsum;6.8變量的41局部變量---內部變量定義:在函數(shù)內定義,只在本函數(shù)內有效說明:main中定義的變量只在main中有效不同函數(shù)中同名變量,占不同內存單元形參屬于局部變量可定義在復合語句中有效的變量局部變量可用存儲類型: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);}運行結果:54321例不同函數(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);}運行結果:main:a=3,b=4sub:a=6,b=7main:a=3,b=4局部變量與全局變量

局部變量---內部變量floatf1(inta)a42---外部變量定義:在函數(shù)外定義,可為本文件所有函數(shù)共用有效范圍:從定義變量的位置開始到本源文件結束,及有extern說明的其它源文件應盡量少使用全局變量,因為:全局變量在程序全部執(zhí)行過程中占用存儲單元降低了函數(shù)的通用性、可靠性,可移植性降低程序清晰性,容易出錯定義

說明次數(shù):只能1次可說明多次位置:所有函數(shù)之外函數(shù)內或函數(shù)外分配內存:分配內存,可初始化不分配內存,不可初始化外部變量說明:extern數(shù)據(jù)類型變量表;外部變量定義與外部變量說明不同若外部變量與局部變量同名,則外部變量被屏蔽外部變量可用存儲類型:缺省或static全局變量---外部變量應盡43floatmax,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);}作用域maxmin例子解析(1)floatmax,min;作用域maxmin例子解析(44intp=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的作用范圍擴展后例子解析(2)intp=1,q=5;c1,c2的作用范圍p,q的作用范45intmax(intx,inty){intz;z=x>y?x:y;return(z);}main(){externinta,b;printf("max=%d",max(a,b));}inta=13,b=-8;運行結果:max=13externinta,b;intmax(){intz;z=a>b?a:b;return(z);}main(){printf("max=%d",max());}inta=13,b=-8;例外部變量定義與說明intmax(intx,inty)運行結果:max46/*ch7_17.c*/inta=3,b=5;max(inta,intb){intc;c=a>b?a:b;return(c);}main(){inta=8;printf("max=%d",max(a,b));}運行結果:max=8例外部變量與局部變量/*ch7_17.c*/運行結果:max=8例外部變量與47存儲方式靜態(tài)存儲:程序運行期間分配固定存儲空間動態(tài)存儲:程序運行期間根據(jù)需要動態(tài)分配存儲空間內存用戶區(qū)程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)全局變量、局部靜態(tài)變量形參變量局部動態(tài)變量(autoregister)函數(shù)調用現(xiàn)場保護和返回地址等生存期靜態(tài)變量:從程序開始執(zhí)行到程序結束動態(tài)變量:從包含該變量定義的函數(shù)開始執(zhí)行至函數(shù)執(zhí)行結束動態(tài)變量與靜態(tài)變量

存儲方式程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)全局變量、局部靜態(tài)變量形參48靜態(tài)動態(tài)存儲方式程序整個運行期間函數(shù)調用開始至結束生存期編譯時賦初值,只賦一次每次函數(shù)調用時賦初值自動賦初值0或空字符不確定未賦初值靜態(tài)存儲區(qū)動態(tài)區(qū)存儲區(qū)寄存器局部變量外部變量作用域定義變量的函數(shù)或復合語句內本文件其它文件局部變量默認為auto型register型變量個數(shù)受限,且不能為long,double,float型局部static變量具有全局壽命和局部可見性局部static變量具有可繼承性extern不是變量定義,可擴展外部變量作用域register局部staticauto外部static外部存儲類別變量存儲類型靜態(tài)動態(tài)存儲方式程序整個運行期間函數(shù)調用開始至結束生存期編譯49#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:c10675156例變量的壽命與可見性

#include<stdio.h>other()-----50以下程序的運行結果是________main(){intk=4,m=3,p;p=func(k,m);printf("%d,",p);p=func(k,m);printf("%d\n",p);}func(a,b)inta,b;{staticintm=0,i=2; i+=m+1;m=i+a+b; return(m);}以下程序的運行結果是________514.以下程序的運行結果是________staticintx=500;main(){autointx=300;printf("1.x=%d\n",x);f();ff();printf("4,x=%d\n",x);}f(){x+=100;printf("2.x=%d\n",x);}ff(){intx=10;printf("3.x=%d\n",x);}4.以下程序的運行結果是________525.以下程序的運行結果是________main(){inti;for(i=1;i<=5;i++)f(i);}f(j)intj;{staticinta=100;autointk=1;++k;printf("%d+%d+%d=%d\n",a,k,j,a+k+j);a+=10;}5.以下程序的運行結果是________53求1?。玻。常。矗。?!的值main(){intj,s;_________;for(j=1;j<=__________;j++)s+=____________;printf(“sum=%d\n”,s);}fac(a)inta;{__________;b*=a;ruturnb;}求1!+2?。常。矗。?!的值54第七章函數(shù)概述函數(shù)的定義函數(shù)的返回值函數(shù)的調用、函數(shù)的嵌套與遞歸調用函數(shù)參數(shù)及其傳遞方式變量的存儲屬性數(shù)組作為函數(shù)參數(shù)第七章函數(shù)概述函數(shù)的定義函數(shù)的返回值函數(shù)的調用、函數(shù)的嵌557.1概述模塊化程序設計基本思想:將一個大的程序按功能分割成一些小模塊,特點:各模塊相對獨立、功能單一、結構清晰、接口簡單控制了程序設計的復雜性提高元件的可靠性縮短開發(fā)周期避免程序開發(fā)的重復勞動易于維護和功能擴充開發(fā)方法:自上向下,逐步分解,分而治之7.1概述56從用戶角度標準函數(shù)(庫函數(shù)):由系統(tǒng)提供用戶自定義函數(shù)從函數(shù)形式無參函數(shù)有參函數(shù)使用庫函數(shù)應注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件函數(shù)分類

從用戶角度使用庫函數(shù)應注意:函數(shù)分類

57一般格式合法標識符函數(shù)返回值類型缺省int型無返回值void函數(shù)體函數(shù)類型函數(shù)名(形參類型說明表){ 說明部分 語句部分}現(xiàn)代風格:例有參函數(shù)(現(xiàn)代風格)intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)(現(xiàn)代風格)intmax(intx,y){intz;z=x>y?x:y;return(z);}例空函數(shù)dummy(){}函數(shù)體為空例無參函數(shù)printstar(){printf(“**********\n”);}或printstar(void){printf(“**********\n”);}7.2函數(shù)的定義合法標識符函數(shù)返回值類型函數(shù)體函數(shù)類型函數(shù)名(形參58函數(shù)類型函數(shù)名(形參表)形參類型說明{ 說明部分 語句部分}傳統(tǒng)風格:例有參函數(shù)(傳統(tǒng)風格)intmax(x,y)

intx,y;{intz;z=x>y?x:y;return(z);}函數(shù)傳統(tǒng)風格和例子函數(shù)類型函數(shù)名(形參表)傳統(tǒng)風格:例有參函數(shù)59返回語句形式:return(表達式);

或return表達式;

或return;功能:使程序控制從被調用函數(shù)返回到調用函數(shù)中,同時把返值帶給調用函數(shù)說明:函數(shù)中可有多個return語句若無return語句,遇}時,自動返回調用函數(shù)若函數(shù)類型與return語句中表達式值的類型不一致,按前者為準,自動轉換------函數(shù)調用轉換void型函數(shù)例無返回值函數(shù)

voidswap(intx,inty){inttemp;temp=x;x=y;y=temp;}7.3函數(shù)的返回值例無返回值函數(shù)7.3函數(shù)的返回值60調用形式函數(shù)名(實參表);說明:實參與形參個數(shù)相等,類型一致,按順序一一對應實參表求值順序,因系統(tǒng)而定(TurboC自右向左)6.4函數(shù)的調用6.4函數(shù)的調用61函數(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ù)的調用方式

函數(shù)語句:函數(shù)的調用方式

62對被調用函數(shù)要求:必須是已存在的函數(shù)庫函數(shù):#include<*.h>用戶自定義函數(shù):函數(shù)類型說明函數(shù)說明一般形式:函數(shù)類型函數(shù)名(形參類型[形參名],…..);

或函數(shù)類型函數(shù)名();作用:告訴編譯系統(tǒng)函數(shù)類型、參數(shù)個數(shù)及類型,以便檢驗函數(shù)定義與函數(shù)說明不同函數(shù)說明位置:程序的數(shù)據(jù)說明部分(函數(shù)內或外)下列情況下,可不作函數(shù)說明若函數(shù)返值是char或int型,系統(tǒng)自動按int型處理被調用函數(shù)定義出現(xiàn)在主調函數(shù)之前有些系統(tǒng)(如BorlandC++)要求函數(shù)說明指出函數(shù)返值類型和形參類型,并且對void和int型函數(shù)也要進行函數(shù)說明函數(shù)說明

對被調用函數(shù)要求:函數(shù)說明

636.4.1函數(shù)的嵌套調用嵌套調用C規(guī)定:函數(shù)定義不可嵌套,但可以嵌套調用函數(shù)main()調用函數(shù)a結束a函數(shù)b函數(shù)調用函數(shù)b6.4.1函數(shù)的嵌套調用main()調用函數(shù)a結束a函數(shù)64例1求三個數(shù)中最大數(shù)和最小數(shù)的差值思考:max函數(shù)intmax(intx,inty,intz)功能:求三個數(shù)中的最大值min函數(shù)intmax(intx,inty,int)功能:求三個數(shù)中的最小值dif函數(shù)功能:求差值方式:max(a,b,c)-min(a,b,c)(即分別調用max函數(shù)和min函數(shù),求其差值)例1求三個數(shù)中最大數(shù)和最小數(shù)的差值max函數(shù)min函數(shù)65程序設計: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);}intdif(intx,inty,intz){returnmax(x,y,z)-min(x,y,z);}main(){inta,b,c,d;scanf("%d%d%d",&a,&b,&c);d=dif(a,b,c);printf("Max-Min=%d\n",d);}程序設計:66求立方函數(shù)longcn(intn)功能:求n的立方值注意:由于立方值比較大,定義為long類型n*n*n=sq(n)*n例2:給定一個數(shù),求其平方及立方思路:求平方函數(shù)longsq(intn)功能:求n的平方值注意:由于平方值比較大,定義為long類型求立方函數(shù)例2:給定一個數(shù),求其平方及立方求平方函數(shù)67程序設計:#include<stdio.h>longsq(intn){longk;k=n*n;returnk;}longcn(intn){longk;k=sq(n)*n;returnk;}main(){intn;scanf(“%d”,&n);printf(“sq(%d)=%ld,cn(%d)=%ld\n”,n,sq(n),n,cn(n));}程序設計:68例3:求1k+2k+3k+……+nk思路:求和函數(shù)longf2(intn,intk)功能:求1k+2k+3k+……+nk注意:由于結果可能比較大,定義為long類型1k+2k+3k+……+nk=for(i=1;i<=n;i++)sum+=f1(i,k);求ik函數(shù)longf1(inti,intk)功能:求i的k次方(ik)注意:由于結果可能比較大,定義為long類型例3:求1k+2k+3k+……+nk求和函數(shù)求ik函數(shù)69程序設計:#include<stdio.h>longf1(inti,intk){longmul=1;intj;for(j=1;j<=k;j++) mul*=i;returnmul;}longf2(intn,intk){longsum=0;intj;for(j=1;j<=n;j++) sum+=f1(j,k);returnsum;}voidmain(){intn,k;scanf("%d,%d",&n,&k);printf("sum=%ld\n",f2(n,k));}程序設計:70例4:求20以內全部素數(shù)的積與全部素數(shù)的和的商思路:intisprime(intn)功能:判斷n是否為素數(shù)若是返回1,不是返回0求素數(shù)和longsum(intn)功能:求n以內素數(shù)的和for(i=2;i<=n;i++)if(isprime(i))s+=i;求素數(shù)積longmul(intn)功能:求n以內素數(shù)的積for(i=2;i<=n;i++)if(isprime(i))m*=i;floatdiv(intn)功能:求n以內素數(shù)的積與n以內素數(shù)的和的商d=mul(n)*1.0/sum(n);例4:求20以內全部素數(shù)的積與全部素數(shù)的和的商intis71程序設計:#include<stdio.h>intisprime(intn){intk;for(k=2;k<n;k++)if(n%k==0)return0;return1;}longsum(intn){longs=0;intk;for(k=2;k<=n;k++) if(isprime(k))s+=k; returns;}longmul(intn){longm=1;intk;for(k=2;k<=n;k++) if(isprime(k))m*=k; returnm;}floatdiv(intn){floatd;d=mul(n)*1.0/sum(n);returnd;}voidmain(){printf("%.2f",div(20));}程序設計:72思考題一:編寫一程序計算任一輸入的整數(shù)的各位數(shù)之和數(shù)據(jù)結構函數(shù)課件73課后練習:編寫一個函數(shù),輸入n為偶數(shù)時,調用函數(shù)求1/2+1/4+...+1/n,輸入n為奇數(shù)時,調用函數(shù)1/1+1/3+...+1/n課后練習:746.4.2函數(shù)的遞歸調用遞歸調用函數(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);}6.4.2函數(shù)的遞歸調用intf(intx)int75例求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);}例求n的階乘#include<stdio.h>76例題:hanoi塔問題voidmove(charx,chary){printf(“%c%c\n”,x,y);}voidhanoi(intn,charone,chartwo,charthree){if(n==1)move(one,three);else{hanoi(n-1,one,three,two)

move(one,three);

hanoi(n-1,two,one,three);}}main(){intm;scanf(“%d”,&m);printf(“Thesteptomoving%3ddisces:\n”,m);hanoi(m,’A’,’B’’C’);}例題:hanoi塔問題77課后思考:有5個人坐在一起,問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數(shù),他說比第3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最后問第一個人,他說是10歲。請問第五個人多大?intage(n)intn;{intc;if(n==1)c=10;elsec=age(n-1)+2;return(c);}main(){printf("%d",age(5));}課后思考:有5個人坐在一起,問第五個人多少歲?他說比第4個人78思考題:題目:利用遞歸調用方式,將所輸入的5個字符,以相反順序打印出來。#include"stdio.h"main(){inti=5;voidpalin(intn);palin(i);printf("\n");}voidpalin(intn){charnext;if(n<=1){next=getchar();printf("\n\0:");putchar(next);}else{next=getchar();palin(n-1);putchar(next);}}思考題:79形參與實參形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù):調用函數(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);}形參實參6.5函數(shù)參數(shù)及其傳遞方式

形參與實參c=max(a,b);(main函數(shù))(max80說明:實參必須有確定的值形參必須指定類型形參與實參類型一致,個數(shù)相同若形參與實參類型不一致,自動按形參類型轉換———函數(shù)調用轉換形參在函數(shù)被調用前不占內存;函數(shù)調用時為形參分配內存;調用結束,內存釋放形參與實參形式參數(shù):定義函數(shù)時函數(shù)名后面括號中的變量名實際參數(shù):調用函數(shù)時函數(shù)名后面括號中的表達式6.5函數(shù)參數(shù)及其傳遞方式說明:6.5函數(shù)參數(shù)及其傳遞方式81值傳遞方式方式:函數(shù)調用時,為形參分配單元,并將實參的值復制到形參中;調用結束,形參單元被釋放,實參單元仍保留并維持原值特點:形參與實參占用不同的內存單元單向傳遞參數(shù)傳遞方式參數(shù)傳遞方式82711x:y:調用前:調用結束:711x:y:/*ch7_2.c*/#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;}調用:711a:b:711x:y:swap:711x:y:117a:b:temp例交換兩個數(shù)711x:y:調用前:調用結束:711x:y:/*ch7_283方式:函數(shù)調用時,將數(shù)據(jù)的存儲地址作為參數(shù)傳遞給形參特點:形參與實參占用同樣的存儲單元“雙向”傳遞實參和形參必須是地址常量或變量函數(shù)的地址傳遞

方式:函數(shù)調用時,將數(shù)據(jù)的存儲地址作為參數(shù)傳遞給形參函數(shù)的地84/*ch9_3.c*/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調前:a59b調swap:p1&a&bp2a95b交換:p1&a&bp2a95b返回:例子圖解/*ch9_3.c*/例交換兩個數(shù)a59b調前:a59b85#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);文件包含編譯預處理命令函數(shù)類型說明函數(shù)定義函數(shù)調用函數(shù)調用函數(shù)返回值形參實參例子解析#include<stdio.h>longsum(i866.6數(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ù)組對應元素變量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);}6.6數(shù)組作為函數(shù)參數(shù)例兩個數(shù)組大小比較432105a87地址傳遞在主調函數(shù)與被調函數(shù)分別定義數(shù)組,且類型應一致形參數(shù)組大小(多維數(shù)組第一維)可不指定形參數(shù)組名是地址變量數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù)88#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例求學生的平均成績#include<stdio.h>floatave8912a調用前12ax調用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ù)比較12a調用前12ax調用21ax交換21a返回#includ90voidsort(intarray[],intn){inti,j,k,t;for(i=0;i<n-1;i++){

溫馨提示

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

評論

0/150

提交評論