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

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1主要內(nèi)容6.1函數(shù)的定義與返回值6.2函數(shù)的調(diào)用6.3變量的作用域與生存期6.4函數(shù)間的數(shù)據(jù)傳遞6.5嵌套調(diào)用與遞歸調(diào)用2學習目標掌握函數(shù)的定義和類型。掌握函數(shù)的調(diào)用。了解變量的存儲域和生存期。了解變量的存儲類別。掌握函數(shù)間的數(shù)據(jù)傳遞。掌握函數(shù)的嵌套調(diào)用和遞歸調(diào)用。36.1函數(shù)的定義和返回值6.1.1函數(shù)的定義

函數(shù)定義的傳統(tǒng)形式是:類型標識符函數(shù)名(形式參數(shù)表)形式參數(shù)說明{內(nèi)部數(shù)據(jù)說明語句}intsum(x,y)intx,inty;{intz;z=x+y;returnz;}4現(xiàn)代格式是:類型標識符函數(shù)名(形參說明形參1,形參說明形參2,……){內(nèi)部數(shù)據(jù)說明語句}intsum(intx,inty){intz;z=x+y;returnz;}56.1.2函數(shù)的返回值

函數(shù)的值是指函數(shù)被調(diào)用之后,執(zhí)行函數(shù)體中的程序段所取得的并返回給主調(diào)函數(shù)的值,例如調(diào)用正弦函數(shù)取得正弦值。函數(shù)的值只能通過return語句返回主調(diào)函數(shù)。return語句的一般形式為:return表達式;或者為:return(表達式);該語句的功能是計算表達式的值,并返回給主調(diào)函數(shù)。在函數(shù)中允許有多個return語句,但每次調(diào)用只能有一個return語句被執(zhí)行,因此只能返回一個函數(shù)值。

6函數(shù)定義及返回值舉例。#include<stdio.h>floatsum(floatx,floaty){floatz;z=x+y;return(z);}voidshow(){printf("\nfinish");}main(){floata,b,c;printf("pleaseinputxandy:");scanf("%f,%f",&a,&b);c=sum(a,b);printf("sumis%f",c);show();}運行時輸入1.0,2.0并回車,可得到結(jié)果:sumis3.000000finish76.1.3函數(shù)的分類

(1)從函數(shù)定義的角度看,函數(shù)可分為庫函數(shù)和用戶定義函數(shù)兩種。1)庫函數(shù)。2)用戶定義函數(shù)。(2)從函數(shù)有無返回值看,又可把函數(shù)分為有返回值函數(shù)和無返回值函數(shù)兩種。1)有返回值函數(shù)。2)無返回值函數(shù)。(3)從主調(diào)函數(shù)和被調(diào)函數(shù)之間數(shù)據(jù)傳送的角度看又可分為無參函數(shù)和有參函數(shù)兩種。1)無參函數(shù)。2)有參函數(shù)。86.2函數(shù)的調(diào)用6.2.1函數(shù)的調(diào)用

1.函數(shù)的調(diào)用形式在C語言中,有參函數(shù)調(diào)用的一般形式如下:函數(shù)名(實際參數(shù)表)對無參函數(shù)調(diào)用時形式為:函數(shù)名()實際參數(shù)表中的參數(shù)可以是常數(shù)、變量或其他構(gòu)造類型數(shù)據(jù)及表達式。各實參之間用逗號分隔。9(1)函數(shù)表達式。函數(shù)作為表達式中的一項出現(xiàn)在表達式中,以函數(shù)返回值參與表達式的運算。這種方式要求函數(shù)是有返回值的。例如:z=sum(x,y)是一個賦值表達式,把sum的返回值賦予變量z。(2)函數(shù)語句。函數(shù)調(diào)用的一般形式加上分號即構(gòu)成函數(shù)語句。例如:printf("%D",a);scanf("%d",&b);都是以函數(shù)語句的方式調(diào)用函數(shù)。(3)函數(shù)實參。函數(shù)作為另一個函數(shù)調(diào)用的實際參數(shù)出現(xiàn)。這種情況是把該函數(shù)的返回值作為實參進行傳送,因此要求該函數(shù)必須是有返回值的。例如:printf("%d",sum(x,y));即是把max調(diào)用的返回值又作為printf函數(shù)的實參使用。

10【例6-2】函數(shù)求值的順序。#include<stdio.h>main(){inti=8;printf("%d\n%d\n%d\n%d\n",++i,--i,i++,i--);}如按照從右至左的順序求值。運行結(jié)果應(yīng)為:8778如對printf語句中的++i,--i,i++,i--從左至右求值,結(jié)果應(yīng)為:9889

112.形式參數(shù)和實際參數(shù)函數(shù)的參數(shù)分為形參和實參兩種。形參出現(xiàn)在函數(shù)定義中,在整個函數(shù)體內(nèi)都可以使用,離開該函數(shù)則不能使用。實參出現(xiàn)在主調(diào)函數(shù)中,進入被調(diào)函數(shù)后,實參變量也不能使用。形參和實參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時,主調(diào)函數(shù)把實參的值傳送給被調(diào)函數(shù)的形參從而實現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。實際參數(shù)和形式參數(shù)的關(guān)系可以由下圖形象地說明。main函數(shù)fun函數(shù)x1ab12y2(實參)(形參)12函數(shù)的形參和實參具有以下特點:(1)形參變量只有在被調(diào)用時才分配內(nèi)存單元,在調(diào)用結(jié)束時,即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。(2)實參可以是常量、變量、表達式、函數(shù)等,無論實參是何種類型的量,在進行函數(shù)調(diào)用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此應(yīng)預(yù)先用賦值、輸入等辦法使實參獲得確定值。(3)實參和形參在數(shù)量上、類型上、順序上應(yīng)嚴格一致,否則會發(fā)生類型不匹配的錯誤。(4)函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。因此在函數(shù)調(diào)用過程中,形參的值發(fā)生改變,而實參中的值不會變化。

136.2.2庫函數(shù)的調(diào)用

1.文件包含對每一類庫函數(shù),在使用前都應(yīng)該在源程序的開頭包含相應(yīng)的頭文件名。如程序中調(diào)用了字符串函數(shù),就要在程序調(diào)用之前包含以下命令:#include<string.h>該命令以#include開頭,后面跟相應(yīng)的頭文件名,頭文件名除了可以用尖括號括起來,雙引號也是允許的。#include"string.h"也是正確的。2.庫函數(shù)的調(diào)用形式庫函數(shù)的一般調(diào)用形式是:函數(shù)名(參數(shù)表)庫函數(shù)的調(diào)用可以通過6.2.1節(jié)介紹的三種調(diào)用形式調(diào)用。(1)函數(shù)表達式,例如:y=sin(x);(2)函數(shù)語句,例如:printf("ilikefootball");(3)函數(shù)實參,例如:printf("theresultis%f",sin(x));

146.2.3函數(shù)的聲明以及位置對函數(shù)調(diào)用的影響

1.位置對函數(shù)調(diào)用的影響函數(shù)定義的位置會影響函數(shù)的作用域。一個函數(shù)的作用域是從其定義位置起,直到源程序的末尾。因此,被調(diào)用函數(shù)的定義位置將影響函數(shù)能否被直接調(diào)用。以下幾種情況是可以直接調(diào)用的:如果被調(diào)函數(shù)的返回值是整型或字符型時,可以不對被調(diào)函數(shù)作說明,而直接調(diào)用。這時系統(tǒng)將自動對被調(diào)函數(shù)返回值按整型處理。當被調(diào)函數(shù)的函數(shù)定義出現(xiàn)在主調(diào)函數(shù)之前時,在主調(diào)函數(shù)中也可以不對被調(diào)函數(shù)再作說明而直接調(diào)用。對庫函數(shù)的調(diào)用不需要再作說明,但必須把該函數(shù)的頭文件用include命令包含在源文件前部。在其他情況下,如果定義靠前的函數(shù)要調(diào)用位置靠后的函數(shù),必須對函數(shù)進行函數(shù)的聲明。

152.函數(shù)的聲明所謂函數(shù)的聲明,是指向編譯系統(tǒng)提供函數(shù)必要的信息:函數(shù)名,函數(shù)的類型,函數(shù)參數(shù)的個數(shù)、類型及排列次序,以便編譯系統(tǒng)對函數(shù)的調(diào)用進行檢查。有參函數(shù)聲明的一般形式為:類型標識符函數(shù)名(類型標識符形參1,類型標識符形參2,……);例如:floatsum(floata,intb){floatc;c=a+b;returnc;}這個函數(shù)定義的聲明為:floatsum(floatx,inty);

166.2.4內(nèi)部函數(shù)與外部函數(shù)

一個C程序的各個函數(shù)可以存放在同一個源文件中,也可以分別放在不同的源文件中。C程序中的內(nèi)部函數(shù)與外部函數(shù)的區(qū)別就是相對于源文件的“內(nèi)”與“外”。根據(jù)一個C函數(shù)能否被其他源文件中的函數(shù)所調(diào)用,C函數(shù)的存儲類型可分為外部型(extern)和靜態(tài)型(static)兩種,默認的存儲類型為extern。能被其他源文件中的函數(shù)所調(diào)用的函數(shù),稱為外部函數(shù);反之,不能被其他源文件中函數(shù)調(diào)用的函數(shù),稱為內(nèi)部函數(shù)。內(nèi)部函數(shù)可以保證函數(shù)的范圍只局限在本文件之內(nèi),這樣可以有效避免其他文件中同名函數(shù)的干擾。外部函數(shù)可以讓其他文件在對函數(shù)進行外部聲明后調(diào)用此函數(shù),這樣就不必在本文件內(nèi)再定義實現(xiàn)相同功能的函數(shù),從而簡化了程序。

176.3變量的作用域與生存期6.3.1變量的作用域

在討論函數(shù)的形參變量時曾經(jīng)提到,形參變量只在被調(diào)用期間才分配內(nèi)存單元,調(diào)用結(jié)束立即釋放。這一點表明形參變量只有在函數(shù)內(nèi)才是有效的,離開該函數(shù)就不能再使用了。這種變量有效性的范圍稱為變量的作用域。不僅對于形參變量,C語言中所有量都有自己的作用域。變量說明的方式不同,其作用域也不同。C語言中的變量按作用域范圍可分為兩種,即局部變量和全局變量。186.3.2局部變量與全局變量

1.局部變量局部變量也稱為內(nèi)部變量。局部變量是在函數(shù)內(nèi)進行定義說明的。其作用域僅限于函數(shù)內(nèi),離開該函數(shù)后再使用這種變量是非法的?!纠?-3】局部變量的作用域。#include<stdio.h>intf1(inta,intb){intc;c=a+b;returnc;}intf2(intx,inty){intz;z=x*y;returnz;}main(){intm,n;m=f1(3,4);n=f2(3,4);printf("m=%d,n=%d",m,n);}在函數(shù)f1內(nèi)定義了三個變量,a,b為形參,c為一般變量。在f1的范圍內(nèi)a,b,c有效,或者說a,b,c變量的作用域限于f1內(nèi)。同理,x,y,z的作用域限于f2內(nèi)。m,n的作用域限于main函數(shù)內(nèi)。

192.全局變量全局變量也稱為外部變量,它是在函數(shù)外部定義的變量。它不屬于哪一個函數(shù),而屬于一個源程序文件。其作用域是整個源程序。在函數(shù)中使用全局變量,一般應(yīng)作全局變量說明。只有在函數(shù)內(nèi)經(jīng)過說明的全局變量才能使用。全局變量的說明符為extern。但在一個函數(shù)之前定義的全局變量,在該函數(shù)內(nèi)使用可不再加以說明。【例6-5】輸入一個立方體的長、寬、高,計算立方體的體積和三個面的面積。#include<stdio.h>floats1,s2,s3;floatvs(floata,floatb,floatc){floatv;v=a*b*c;s1=a*b;s2=b*c;s3=a*c;returnv;}main(){floatv,l,w,h;printf("\inputlength,widthandheight\n");scanf("%f,%f,%f",&l,&w,&h);v=vs(l,w,h);printf("v=%fs1=%fs2=%fs3=%f\n",v,s1,s2,s3);}輸入:1.0,2.0,3.0結(jié)果為:vs=6.000000s1=2.000000s2=6.000000s3=3.000000

206.3.3變量的生存期

變量在調(diào)用時必須分配內(nèi)存單元(或寄存器),所以變量就有生存時間的問題。變量什么時候分配內(nèi)存單元(或寄存器),什么時候釋放內(nèi)存單元(或寄存器),都是值得考慮的問題。這樣就引入了變量的生存期的概念。變量從開始分配內(nèi)存單元(或寄存器)到釋放所分配的內(nèi)存單元(或寄存器)的期間被稱為變量的生存期。變量按其生存期可分為動態(tài)存儲變量和靜態(tài)存儲變量。

216.3.4動態(tài)存儲變量與靜態(tài)存儲變量

靜態(tài)存儲變量通常是在變量定義時就分配好存儲單元并一直保持不變,直至整個程序結(jié)束。全局變量即屬于此類存儲方式。動態(tài)存儲變量是在程序執(zhí)行過程中,使用它時才分配存儲單元,使用完畢立即釋放。典型的例子是函數(shù)的形式參數(shù),在函數(shù)定義時并不給形參分配存儲單元,只是在函數(shù)被調(diào)用時,才予以分配,調(diào)用函數(shù)完畢立即釋放。如果一個函數(shù)被多次調(diào)用,則反復(fù)地分配、釋放形參變量的存儲單元。從以上分析可知,靜態(tài)存儲變量是一直存在的,而動態(tài)存儲變量則時而存在時而消失。

226.3.5變量的存儲類型

存儲屬性registerautoexternstatic存儲位置寄存器內(nèi)存作用域局部全局局部或全局生存期動態(tài)存儲靜態(tài)存儲231.自動變量autoauto存儲類型是C語言程序中使用最廣泛的一種類型。C語言規(guī)定,函數(shù)內(nèi)凡未加存儲類型說明的變量均視為自動變量,即自動變量可省去說明符auto。例如:{inti,j,k;charc;……}等價于:{autointi,j,k;autocharc;……}242.寄存器變量register當對一個變量頻繁讀寫時,必須反復(fù)訪問內(nèi)存儲器,從而花費大量的存取時間。為此,C語言提供了另一種變量,即寄存器變量。這種變量存放在CPU的寄存器中,使用時,不需要訪問內(nèi)存,而直接從寄存器中讀寫,這樣可提高效率。寄存器變量的說明符是register。對于循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反復(fù)使用的變量均可定義為寄存器變量。寄存器變量應(yīng)用舉例。#include<stdio.h>main(){registeri,s=0;for(i=1;i<=100;i++)s=s+i;printf("s=%d\n",s);}253.外部變量extern在一個文件中,定義在所有函數(shù)之外的變量稱為外部變量。在前面介紹全局變量時已介紹過外部變量,這里再補充說明外部變量的幾個特點。(1)外部變量和全局變量是對同一類變量的兩種不同角度的提法。全局變量是從它的作用域提出的,外部變量是從它的存儲方式提出的,表示了它的生存期。(2)當一個源程序由若干個源文件組成時,在一個源文件中定義的外部變量在其他的源文件中也有效。例如:有一個源程序由源文件F1.C和F2.C組成:F1.Cinta,b;charc;main(){……}F2.Cexterninta,b;externcharc;func(intx,y){……}264.靜態(tài)變量static靜態(tài)變量是靜態(tài)分配的變量,其類型說明符是static。在編譯時,在特定的存儲區(qū)為其分配存儲空間,所分配的存儲空間在程序中自始至終都歸該變量使用。靜態(tài)變量屬于靜態(tài)存儲方式,但是屬于靜態(tài)存儲方式的量不一定就是靜態(tài)變量,例如外部變量雖屬于靜態(tài)存儲方式,但不一定是靜態(tài)變量,必須由static加以定義后才能成為靜態(tài)外部變量,或稱靜態(tài)全局變量。靜態(tài)變量分為靜態(tài)局部變量和靜態(tài)全局變量兩種。

276.4函數(shù)間的數(shù)據(jù)傳遞6.4.1參數(shù)的值傳遞方式

參數(shù)的值傳遞方式又稱為數(shù)據(jù)復(fù)制方式,是指實參值本身復(fù)制給被調(diào)用函數(shù)的形參,使形參獲得值?!纠?-9】參數(shù)的值傳遞方式舉例。#include<stdio.h>voidmax(intx,inty){intz;if(x>y)z=x;elsez=y;printf("themaxis%d",z);}main(){inta,b;printf("pleaseinputtwonumbers:");scanf("%d,%d",&a,&b);max(a,b);}在此程序中,形參x,y開始并沒有分配內(nèi)存單元,沒有獲得值。直到main函數(shù)調(diào)用max函數(shù)時,才將實參a,b的值賦給x,y,繼續(xù)進行運算。

286.4.2參數(shù)的地址傳遞方式

地址傳遞方式是把地址常量而不是內(nèi)存地址所代表的實際數(shù)據(jù)傳遞給被調(diào)用函數(shù)的形參。這種方式一般以地址常量作形參,如數(shù)組名等。【例6-10】地址傳遞方式舉例。#include<stdio.h>voidswap(int*x,int*y){intaddr;addr=*x;*x=*y;*y=addr;}main(){inta,b;printf("pleaseinputtwonumbers:");scanf("%d,%d",&a,&b);swap(&a,&b);printf("afterswap,a=%d,b=%d",a,b);}此程序的功能是交換兩個變量的值。假如輸入:3,5輸出結(jié)果為:afterswap,a=5,b=3296.4.3函數(shù)返回值方式

有返回值的函數(shù)在調(diào)用后都有一個返回值,這也是數(shù)據(jù)傳遞的一種方式,它和傳遞參數(shù)無關(guān)。函數(shù)的返回值是通過return語句實現(xiàn)的?!纠?-11】函數(shù)返回值方式舉例。#include<stdio.h>voidmax(intx,inty){intz;if(x>y)z=x;elsez=y;returnz;}main(){inta,b,c;printf("pleaseinputtwonumbers:");scanf("%d,%d",&a,&b);c=max(a,b);printf("themaxis%d",c);}306.4.4外部變量傳遞方式

外部變量的傳遞方式也是和傳遞參數(shù)無關(guān)的一種方式,它利用了外部變量作用域覆蓋主調(diào)函數(shù)和被調(diào)函數(shù),在主調(diào)函數(shù)和被調(diào)函數(shù)之間任意傳遞數(shù)據(jù)。但是要注意,過多地使用外部變量會降低各個函數(shù)的獨立性,是結(jié)構(gòu)化程序設(shè)計所不提倡的,并且由于很多函數(shù)可以對外部變量進行操作,導(dǎo)致程序容易出錯。【例6-12】外部變量傳遞方式舉例。#include<stdio.h>intc;voidsum(intx,inty){c=x+y;printf("thefirstresultis%d\n",c);}main(){inta=2,b=2;sum(a,b);a=4;c=c+a;printf("thesecondresultis%d",c);}運行結(jié)果為:thefirstresultis4thesecondresultis8316.4.5數(shù)組名作為函數(shù)參數(shù)的調(diào)用

【例6-13】數(shù)組名作為函數(shù)參數(shù)調(diào)用舉例。求一個10人的實驗小組的平均成績。#include<stdio.h>floataverage(floatarray[10]){inti;floataver,sum=0;for(i=0;i<10;i++)sum=sum+array[i];aver=sum/10;returnaver;}main(){floataver,grade[10];inti;printf("pleaseinputthegrades:");for(i=0;i<10;i++)scanf("%f",&grade[i]);aver=average(grade);printf("theaveragegradeis%f",aver);}326.5嵌套調(diào)用與遞歸調(diào)用

6.5.1嵌套調(diào)用

調(diào)用a函數(shù)結(jié)束調(diào)用b函數(shù)返回返回main函數(shù)a函數(shù)b函數(shù)33計算12+22+32+…+n2的值。#include<stdio.h>longsquare(longa){longb;b=a*a;returnb;}longsum(longn){longc=0,d,i;for(i=1;i<=n;i++){d=square(i);c=c+d;}returnc;}main(){longresult,n;printf("pleaseinputn:");scanf("%d",&n);result=sum(n);printf("theresultis%d",result);}346.5.2遞歸調(diào)用

一個函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用。這種函數(shù)稱為遞歸函數(shù)。C語言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身。每調(diào)用一次就進入新的一層。例如有函數(shù)f如下:intf(intx){inty;z=f(y);returnz;}這個函數(shù)是一個遞歸函數(shù)。但是運行該函數(shù)將無休止地調(diào)用其自身,這當然是不正確的。為了防止遞歸調(diào)用無終止地進行,必須在函數(shù)內(nèi)有終止遞歸調(diào)用的手段。常用的辦法是加條件判斷,滿足某種條件后就不再作遞歸調(diào)用,然后逐層返回。

35漢諾塔問題。一塊板上從左到右有三根針:A,B,C。A針上套有n個大小不等的

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論