《C語言程序設計教程》課件第7章函數_第1頁
《C語言程序設計教程》課件第7章函數_第2頁
《C語言程序設計教程》課件第7章函數_第3頁
《C語言程序設計教程》課件第7章函數_第4頁
《C語言程序設計教程》課件第7章函數_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章函數本章要點:C語言程序結構和特點函數的定義函數的返回值與函數的類型函數的調用及參數的傳遞關系函數的嵌套與遞歸全局變量和局部變量的概念變量的存儲類別學習方法建議:學習本章內容時,應重點掌握函數的定義和使用方法,學會函數的調用以及參數的傳遞關系。要求從閱讀程序開始,逐步掌握函數編程的思路,并仿照例題練習編寫程序、上機調試,真正掌握結構化程序的設計。函數的遞歸調用是本章的難點。1.問題描述——求函數值求y=(f(x))3+(f(x))2+f(x)+6的值,其中f(x)=x2+3x-1,x為實數。2.引例分析此程序可定義三個函數,一個是f函數,功能是用于求x2+3x–1的值,一個是fadd函數,該函數嵌套調用f函數,用于求y的值。第三個函數就是主函數,用來輸入x的值,并輸出y的值。7.1引例

3.程序代碼#include"stdio.h"doublefadd(double);/*函數聲明*/doublef(double);/*函數聲明*/main(){doublex,y;printf("PleaseEnterx:");scanf("%lf",&x);/*輸入x值*/y=fadd(x);/*調用fadd(x)函數*/printf("y=%6.3f\n",y);}/*輸出y值*/doublefadd(doublex)/*定義函數y=(f(x))3+(f(x))2+f(x)+6*/{doubleftemp,y;ftemp=f(x);/*調用f(x)函數*/y=ftemp*ftemp*ftemp+ftemp*ftemp+ftemp+6;/*計算y值*/returny;}/*返回函數值*/doublef(doublex)/*定義函數f(x)=x2+3x-1*/{doubley;y=x*x+3*x-1;returny;}/*返回函數值*/7.2.1函數的定義任何函數(包括主函數main())都是由函數說明和函數體兩部分組成。根據函數是否需要參數,可將函數分為無參函數和有參函數兩種。1.無參函數的一般形式函數類型函數名(){說明語句部分;可執(zhí)行語句部分;}2.有參函數的一般形式函數類型函數名(數據類型參數1[,數據類型參數2…]){說明語句部分;可執(zhí)行語句部分;}

7.2函數的定義與調用【例7.1】定義一個函數,用于求兩個數中的大數。#include"stdio.h"intmax(intn1,intn2)/*定義一個函數max()*/{return(n1>n2?n1:n2);}main(){intmax(intn1,intn2); /*函數說明*/

intnum1,num2;printf("inputtwonumbers:\n");scanf("%d%d",&num1,&num2);printf("max=%d\n",max(num1,num2));}3.空函數的定義既無參數、函數體又為空的函數。其一般形式為:[函數類型]函數名(){}說明:(1)函數類型:用于指定函數帶回來的值的類型,可以是任何有效類型。函數類型可以省略,則系統(tǒng)默認為int型,這時函數返回一個整數值。當函數無返回值時函數類型一般應寫成void,稱為無類型或空類型。(2)參數表:它是一個用逗號分隔的變量說明表,參數表中的參數稱為“形式參數”,簡稱“形參”。形參用于主調函數和被調用函數之間進行數據傳遞,即當函數被調用時,形參接收實參傳過來的值。參數表的定義形式如下:類型標識符形式參數1,類型標識符形式參數2,……

例如:floatarea(floata,floatb,floatc)(3)可以定義空函數,即形式參數和函數體均為空。調用此函數時,不做任何工作,只是表明這里需要調用一個函數。1.函數返回值與return語句return語句的一般格式為:return(返回值表達式);功能:返回調用函數,并將“返回值表達式”的值帶給調用函數。說明:(1)一個函數中可以有一個或多個return語句,當執(zhí)行到某個return語句時,程序的控制流程將返回到主調函數,并將return語句中表達式的值作為函數值帶回。(2)若函數體內沒有return語句,則一直執(zhí)行到函數體末尾的“}”為止,然后返回到主調函數,這時也會有一個不確定的值被帶回到主調函數。若不需要帶回函數值,一般可將函數定義為void類型。(3)return語句中表達式的類型應與函數類型一致,若不一致時,以函數類型為準。2.函數類型函數類型與return語句返回值的類型一致。

7.2.2函數的返回值與函數類型

7.2.3對被調用函數的說明和函數原型對被調用函數進行說明,其一般格式為:函數類型函數名(數據類型[參數名1][,數據類型[參數名2]…]);C語言規(guī)定,以下兩種情況,可以省去對被調用函數的說明:(1)當被調用函數的函數定義出現在調用函數之前時。因為在調用之前,編譯系統(tǒng)已經知道了被調用函數的函數類型、參數個數、類型和順序。(2)如果在所有函數定義之前,在函數外部(例如文件開始處)預先對各個函數進行了說明,則在調用函數中可缺省對被調用函數的說明。1.函數調用C語言中函數調用的一般形式為:函數名([實際參數表])注意:實參的個數、類型和順序,應該與被調用函數所要求的參數個數、類型和順序一致,才能正確地進行數據傳遞。2.函數調用方式(1)函數表達式。函數作為表達式的一項,出現在表達式中,以函數返回值參與表達式的運算。這種方式要求函數是有返回值的。例如:c=2*max(a,b);(2)函數語句。C語言中的函數可以只進行某些操作而不返回函數值,這時的函數調用可作為一條獨立的語句。例如:max(a,b);(3)函數實參。函數作為另一個函數調用的實際參數出現。這種情況是把該函數的返回值作為實參進行傳送,因此要求該函數必須是有返回值的。例如:n=max(a,max(b,c));其中max(b,c)是一次調用,它的值作為max另一次調用的實參。(4)調用時實參與形參在類型必須匹配。7.2.4函數的調用

函數的參數分為形參和實參兩種,作用是實現數據傳送。形參出現在函數定義中,只能在該函數體內使用。發(fā)生函數調用時,調用函數把實參的值復制1份,傳送給被調用函數的形參,從而實現調用函數向被調用函數的數據傳送。關于形參與實參的說明:(1)實參可以是常量、變量、表達式、函數等。無論實參是何種類型的量,在進行函數調用時,它們都必須具有確定的值,以便把這些值傳送給形參。(2)形參變量只有在被調用時,才分配內存單元;調用結束時,即刻釋放所分配的內存單元。(3)實參對形參的數據傳送是單向的,即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。(4)實參和形參占用不同的內存單元,即使同名也互不影響。7.2.5函數的形參與實參【例7.2】實參對形參的數據傳遞。#include"stdio.h"main(){voids(intn);/*函數說明*/intn=100;/*定義實參n,并初始化*/s(n);/*調用函數*/printf("n_s=%d\n",n);/*輸出調用后實參的值*/}voids(intn){inti;printf("n_x=%d\n",n);/*輸出改變前形參的值*/for(i=n-1;i>=1;i--)n=n+i;/*改變形參的值*/printf("n_x=%d\n",n);/*輸出改變后形參的值*/}7.3.1函數的嵌套調用函數的嵌套調用是指,在執(zhí)行被調用函數時,被調用函數又調用了其他函數。其關系可表示如圖所示。

7.3函數的的嵌套調用和遞歸調用【例7.3】計算s=1k+2k+3k+……+Nk

。#defineK4#defineN5longf1(intn,intk) /*計算n的k次方*/{longpower=n;inti;for(i=1;i<k;i++)power*=n;returnpower;}longf2(intn,intk) /*計算1到n的k次方之累加和*/{longsum=0;inti;for(i=1;i<=n;i++)sum+=f1(i,k);/*在函數f2()中調用函數f1()*/returnsum;}#include"stdio.h"main(){printf("Sumof%dpowersofintegersfrom1to%d=",K,N);

printf("%d\n",f2(N,K));}所謂函數的遞歸調用是指,一個函數在它的函數體內,直接或間接地調用它自身。遞歸調用分為直接遞歸調用和間接遞歸調用兩種,如圖所示。

7.3.2函數的遞歸調用遞歸調用的過程可分為如下兩個階段:(1)遞推階段:將原問題不斷轉化為新問題,逐漸從未知向已知的方向推測,最終達到已知的條件,即遞歸結束條件。(2)回歸階段:從已知條件出發(fā),按遞推的逆過程,逐一求值回歸,最后到遞推的起始處,完成回歸。【例7.4】用遞歸法計算n!。#include"stdio.h"longfact(intn)/*定義fact()函數,用于求n!*/{longf;if(n>1)f=fact(n-1)*n;/*遞歸調用函數fact()*/elsef=1;return(f);}main(){intn;longy;printf("inputainteagernumber:\n");scanf("%d",&n);y=fact(n);/*調用函數fact()*/printf("%d!=%ld\n",n,y);} 7.4.1數組元素作為函數參數數組元素就是下標變量,與普通變量并無區(qū)別。數組元素只能用作函數實參,其用法與普通變量完全相同。在發(fā)生函數調用時,把數組元素的值傳送給形參,實現單向值傳送?!纠?.5】寫一函數,統(tǒng)計字符串中字母的個數。

#include"stdio.h"intisalp(charc){if(c>='a'&&c<='z'||c>='A'&&c<='Z')/*判斷是否為字母*/return(1);/*返回真值1*/elsereturn(0);/*返回假值0*/}main(){inti,num=0;charstr[255]; printf("Inputastring:\n"); gets(str); for(i=0;str[i]!='\0';i++) if(isalp(str[i]))num++;/*循環(huán)調用函數,若返回值為真,字母個數+1*/ puts(str); printf("num=%d\n",num);}

7.4數組作為函數參數數組名作函數參數時,既可以作形參,也可以作實參。而且形參和相對應的實參都必須是類型相同的數組(或指向數組的指針變量),都必須有明確的數組說明。【例7.6】已知某個學生5門課程的成績,求平均成績。#include"stdio.h"floataver(floata[])/*求平均值函數*/{inti;floatav,s=a[0];for(i=1;i<5;i++)s+=a[i];av=s/5;returnav;}main(){floatsco[5],av;inti;printf("\ninput5scores:\n");for(i=0;i<5;i++)scanf("%f",&sco[i]);av=aver(sco);/*調用函數,實參為一數組名*/printf("averagescoreis%5.2f\n",av);}

7.4.2數組名作為函數的形參和實參7.5.1局部變量在一個函數內部或一個復合語句內定義的變量稱為局部變量,它只在本函數范圍或該復合語句內有效,即只有在本函數內或本復合語句內才能使用它們,離開該范圍是不能使用這些變量的。例如:intf1(inta)/*函數f1*/{intb,c;

…} /*a,b,c作用域:僅限于函數f1()中*/intf2(intx)/*函數f2*/{inty,z;…} /*x,y,z作用域:僅限于函數f2()中*/main(){intm,n;

…} /*m,n作用域:僅限于函數main()中*/

7.5局部變量與全局變量

在函數外部定義的變量,它的作用域是:從定義變量的位置開始,到本文件結束。外部變量可被作用域內的所有函數直接引用。例如:intx,y;/*全局變量*/floatf1(inta){…}floata,b;/*全局變量*/intf2(intc){intz;…}main(){intm,n;…}7.5.2全局變量【例7.7】分析下面程序,寫出運行結果。intn=12;/*定義全局變量n*/#include"stdio.h"main(){intn=5;/*定義局部變量n*/printf("mainPublicn=%d\n",n);/*局部變量n有效*/fun1();fun2();}fun1(){printf("fun1Publicn=%d\n",n);/*全局變量n有效*/n++;/*全局變量n有效*/}fun2(){printf("fun2Publicn=%d\n",n);/*全局變量n有效*/{intn;/*定義局部變量n*/for(n=1;n<3;n++) /*局部變量n有效*/printf("fun2Localn=%d\n",n);/*局部變量n有效*/}n++;/*全局變量n有效*/printf("fun2Publicn=%d\n",n);/*全局變量n有效*/}C語言對變量的存儲類型說明有四種:自動變量(auto)、寄存器變量(register)、外部變量(extern)、靜態(tài)變量(static)。7.6.1靜態(tài)變量定義格式:static數據類型變量表;注意:靜態(tài)變量屬于靜態(tài)存儲。在程序執(zhí)行過程中,即使所在函數調用結束也不釋放。換句話說,在程序執(zhí)行期間,靜態(tài)變量始終存在。定義靜態(tài)變量但不初始化,則自動賦以"0"(整型和實型)或'\0'(字符型);且每次調用它們所在的函數時,不再重新賦初值,只是保留上次調用結束時的值。當需要保留函數上一次調用結束時的值或者變量只被引用而不改變其值時,才使用靜態(tài)變量。7.6變量的動態(tài)存儲與靜態(tài)存儲簡介定義格式:[auto]數據類型變量表; 注意:自動變量屬于動態(tài)存儲方式。在函數中定義的自動變量,只在該函數內有效;函數被調用時分配存儲空間,調用結束就釋放。在復合語句中定義的自動變量,只在該復合語句中有效;退出復合語句后,也不能再使用,否則將引起錯誤。定義動態(tài)變量而不初始化,則其值是不確定的。如果初始化,則賦初值操作是在調用時進行的,且每次調用都要重新賦一次初值。由于自動變量的作用域和生存期,都局限于定義它的個體內(函數或復合語句),因此不同的個體中允許使用同名的變量而不會混淆。即使在函數內定義的自動變量,也可與該函數內部的復合語句中定義的自動變量同名。7.6.2自動變量【例7.8】自動變量與靜態(tài)變量的存儲特性。#include"stdio.h"voidf(){inta=0; /*自動變量:每次調用都重新初始化*/staticintb=0; /*靜態(tài)變量:只初始化1次*/

printf("a=%d,b=%d\n",a,b);

++a;++b;}main(){inti;for(i=0;i<4;i++)f();} 7.6.3寄存器變量一般情況下,變量的值都是存儲在內存中的。為提高執(zhí)行效率,C語言允許將局部變量的值存放到寄存器中,這種變量就稱為寄存器變量。其定義格式為:register

數據類型變量表;注意:只有局部變量才能定義成寄存器變量,即全局變量不行。允許使用的寄存器數目是有限的,不能定義任意多個寄存器變量。7.6.4外部變量外部變量屬于靜態(tài)存儲方式。其定義格式為:extern數據類型外部變量表;上機實驗1.掌握函數的定義和調用;2.掌握參數的傳遞關系。一、實驗目的1.驗證性實驗1)分析下面程序的輸出結果,然后上機驗證。#include"stdio.h"#include"math.h"voidfun();voidmain(){fun();fun();fun();}voidfun(){intx=0;staticinty=0;x=x+1;y=y+1;printf("x=%d,y=%d\n",x,y);}二、實驗內容

2)用遞歸算法,把一個整數的每一位數分解,并從低位到高位打印出來。例如:對整數765,輸出:567。請將程序補充完整。#include"stdio.h"voidf(intx){inti;i=_____;/*取出x的個位的數賦值給i*/printf("%d",i);x/=10;/*將x的值縮小10倍并截尾取整*/if(x>0&&i>0)f(x);/*遞歸調用f(x)函數*/}voidmain(){inta;printf("inputa:");scanf("%d",&a);f(a);/*調用f()函數,將實參傳遞給形參*/}2.設計性實驗1)函數fun()的功能是:根據整型形參m,計算如下公式的值。請將程序補充完整。例如,若m=2000,則應輸出:0.000160。#include<stdio.h>_____fun(intm){doubley=0,d;inti;for(i=100;i<=_____;i+=100){d=(double)i*(double)i;

y+=1.0/d;}return(y);}voidmain(){intn=2000;printf("\nTheresultis%lf\n",fun(n));}2)產生3個小于10的隨機數,計算他們階乘的和;編寫函數實現階乘。例如:6!+0!+2!=723,請將程序補充完整。(提示:小于10隨機函數為rand()%10)#include"stdlib.h"#include"stdio.h"intf(intm)/*計算階乘的函數*/{inti,jc=1;for(i=1;i<=__①__;i++)jc*=i;returnjc;}main(){inti,a[3],s=0;for(i=0;i<3;i++){a[i]=(rand()%10);/*將3個隨機產生的數據送入數組*/s+=f(__②__);/*調用階乘函數,并累加其返回值*/}for(i=0;i<3;i++)/*按要求的格式輸出*/printf("%d!+",a[i]);printf("__③__=%d",s);/*去掉最后的+號*/}3)函數fun的功能是:計算正整數num的各位上的數字之積。例如,若輸入:252,則輸出應該是:20。若輸入:202,則輸出應該是:0。請?zhí)羁铡?include"stdio.h"longfun(longnum){longk=1;do{k*=num%10;num_____;}while(num);return(k);}voidmain(){longn;scanf("%d",&n);

printf("\n%ld\n",fun(n));

}4)函數fun的功能是求出一個2*M整型二維數組中最大元素的值,請將程序補充完整。#include<stdio.h>#defineM4fun(inta[][M]){

溫馨提示

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

評論

0/150

提交評論