語言-課件2第七章_第1頁
語言-課件2第七章_第2頁
語言-課件2第七章_第3頁
語言-課件2第七章_第4頁
語言-課件2第七章_第5頁
已閱讀5頁,還剩85頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

81頁第1

頁第七章函數(shù)共

81頁第2

本章要點函數(shù)的定義函數(shù)的調(diào)用函數(shù)參數(shù)的傳遞方式變量的作用域和存儲方法內(nèi)部函數(shù)和外部函數(shù)共

81頁第3

頁C程序是函數(shù)的集合體,每個函數(shù)是一個獨立的程序模塊;由一個主函數(shù)和若干個子函數(shù)組成,程序總是從主函數(shù)開始執(zhí)行;所有子函數(shù)地位平等,可互相調(diào)用、自我調(diào)用。函數(shù)可集中或分散存放在一個或多個源程序文件中?!?/p>

引入函數(shù)的優(yōu)點:減少重復(fù)編寫程序的工作量;使程序便于調(diào)試和閱讀。

函數(shù)F1()main()F11()F2()F21()F22()C語言程序的結(jié)構(gòu)7.1函數(shù)的概念和函數(shù)的定義共

81頁第4

頁main:主函數(shù)e,d,h,g被多次調(diào)用a,b,c,d,e,f,g,h,相互調(diào)用mainabdeghhgedcgf函數(shù)是C程序的最小單元。主函數(shù)可以調(diào)用其它函數(shù),其它函數(shù)可以相互調(diào)用.函數(shù)調(diào)用舉例main()

/*主函數(shù)*/{

printstar();

/*調(diào)用printstar函數(shù)畫****/

print_message();

/*調(diào)用print_message函數(shù)寫字*/

printstar();

/*調(diào)用printstar函數(shù)畫****/}

printstar()

/*printstar函數(shù)*/{printf(“\n**********”);}print_message()

/*print_message函數(shù)*/

{printf(“\nHello!”);}運行結(jié)果:**********

Hello!**********

一個c程序由一個或多個源文件組成#include“l(fā)x2.c”#include“l(fā)x3.c”main()

{

printstar();

print_message();

printstar();}

printstar()

{printf(“\n**********”);}print_message(){printf(“\nHello!”);}Lx1.cLx2.cLx3.c共

81頁第7

頁數(shù)學(xué)函數(shù)

#includemath.h字符和字符串函數(shù)

ctype.h,string.hI/O函數(shù)#includestdio.h動態(tài)存儲分配函數(shù)

形式有參函數(shù)無參函數(shù)空函數(shù)庫函數(shù)用戶定義函數(shù):C函數(shù)的分類共

81頁第8

頁一、定義形式:[類型標識符]函數(shù)名([形式參數(shù)表])[形式參數(shù)說明]{[說明與定義部分]

語句}7.1.2函數(shù)的定義各形參之間用”,”隔開形參可以缺省,但括號不可省若該項缺省,自動按整型處理。函數(shù)體(是一段程序,實現(xiàn)函數(shù)的功能)函數(shù)名字有值,它代表函數(shù)的入口地址。有參函數(shù)定義形式有參函數(shù)定義形式共

81頁第9

頁無參函數(shù)的定義形式:

[類型標識符]

函數(shù)名()

{[說明部分]

語句

}

例:print_message(){printf(“Howareyou!\n”);}例:dummy

()

{}

沒有數(shù)據(jù)類型說明、和形參說明函數(shù)體為空。無參函數(shù)定義空函數(shù)定義共

81頁第10

long

facto

(

n

)

int

n;

{longs=1;inti;for(i=1;i<=n;i++)s*=i;return(s);

}函數(shù)名形式參數(shù)列表函數(shù)類型形式參數(shù)說明函數(shù)體函數(shù)返回

求階乘函數(shù)facto的定義函數(shù)的定義(舉例)共

81頁第11

main(){

inta,b,c;intmax();scanf(”%d,%d”,&a,&b);

c=

max(a,b);

printf(”Max=%d”,c);}int

max

(

x,

y

)

intx,y;{

intz;z=x>y?x:y;return(z);}形式參數(shù)列表:是用“,”分開的一組變量,用來接收調(diào)用時傳入的數(shù)據(jù)形式參數(shù)說明:在{外面對形式參數(shù)的類型進行說明函數(shù)調(diào)用求兩個變量的最大值函數(shù)的定義(舉例)函數(shù)聲明共

81頁第12

頁二、形式參數(shù)和實際參數(shù)形式參數(shù):形參調(diào)用前不占內(nèi)存單元,調(diào)用時占用,調(diào)用后釋放形參是函數(shù)的內(nèi)部變量,只在函數(shù)內(nèi)部才有意義。對每個形參必須指明其名字和數(shù)據(jù)類型。實際參數(shù):實參必須有確定的值,可以是常量,變量或表達式。實參與形參的類型、個數(shù)必須一致。共

81頁第13

頁7.1.3函數(shù)的調(diào)用1.函數(shù)調(diào)用的一般形式為:

函數(shù)名(實際參數(shù)列表);或函數(shù)名(實際參數(shù)列表)實參的數(shù)量、類型和排列順序必須與函數(shù)定義時形參表中形參的數(shù)量、類型和排列順序一致。

2.

執(zhí)行過程:在一個函數(shù)中調(diào)用另一個函數(shù)時,程序?qū)⒖刂茝恼{(diào)用函數(shù)處轉(zhuǎn)移到被調(diào)用函數(shù),并且執(zhí)行被調(diào)用函數(shù)。在執(zhí)行完被調(diào)用函數(shù)的所有語句或者遇到return語句時,程序的控制要返回到調(diào)用函數(shù)中原來調(diào)用函數(shù)的地方繼續(xù)執(zhí)行。共

81頁第14

頁例:調(diào)用max函數(shù)的程序main(){inta,b,c;intmax();scanf("%d,%d",&a,&b);

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

函數(shù)調(diào)用intmax(x,y)intx,y;{intz;if(x>y)z=x;elsez=y;return(z);}實際參數(shù)形式參數(shù)返回函數(shù)值接收返回值程序執(zhí)行順序?共

81頁第15

頁/*1*//*2*//*3*//*4*//*5*//*11*//*12*//*13*//*14*//*15*//*16*/main(){inta,b,c;intmax();scanf("%d,%d",&a,&b);c=max(a,b);printf("max=%d\n",c);}intmax(x,y)intx,y;{intz;if(x>y)z=x;elsez=y;return(z);}斷點保護斷點和現(xiàn)場,轉(zhuǎn)向11入口返回斷點恢復(fù)現(xiàn)場帶回函數(shù)值函數(shù)執(zhí)行過程虛實結(jié)合ax,by共

81頁第16

頁(1)函數(shù)語句

(把函數(shù)調(diào)用作為一個語句)

一般形式:函數(shù)名(實際參數(shù)表);

此時不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。例如:printstar();3.函數(shù)調(diào)用的幾種方式(2)函數(shù)表達式(函數(shù)調(diào)用出現(xiàn)在表達式中)一般形式:變量名=函數(shù)表達式

這時要求函數(shù)帶回一個確定的值以參加表達式的運算。例如:c=3+max(a,b);注意:無返回值函數(shù)的調(diào)用,不能出現(xiàn)在表達式中。函數(shù)調(diào)用作為一個函數(shù)的實參。例如:m=max(a,max(b,c));(3)函數(shù)參數(shù)(函數(shù)調(diào)用出現(xiàn)函數(shù)參數(shù)中)值傳遞:

在調(diào)用函數(shù)時,實參將值傳遞給形參。C語言規(guī)定,實參對形參的數(shù)據(jù)傳遞是“值傳遞”,即單向傳遞。在調(diào)用函數(shù)時,給形參分配存儲單元,并將實參對應(yīng)的值傳遞給形參,調(diào)用結(jié)束后,形參單元被釋放,實參單元仍保留并維持原值。

因此,在執(zhí)行一個被調(diào)用函數(shù)時,形參的值如果發(fā)生變化,并不會改變主調(diào)函數(shù)中實參的值。7.1.4函數(shù)參數(shù)的傳遞方式共

81頁第18

頁例如:voidadd(inta,intb){a+=3;b+=6;printf(“a=%d,b=%d\n”,a,b);}

main(){intx=1,y=2;add(x,y);printf(“x=%d,y=%d\n”,x,y);}輸出結(jié)果:a=4,b=8函數(shù)的調(diào)用值傳遞x=1,y=2執(zhí)行函數(shù)體返回共

81頁第19

值傳遞的優(yōu)點:被調(diào)用的函數(shù)不可能改變調(diào)用函數(shù)中變量的值,而只能改變它的局部的臨時副本。

值傳遞的缺點:每個形式參數(shù)僅能傳遞一個數(shù)據(jù),不適用需要在函數(shù)之間傳遞大量數(shù)據(jù)。

地址傳遞:將實參的地址傳遞給形參,實參和形參指向同一內(nèi)存空間,對形參的修改,可以直接影響實參。7.1.4函數(shù)參數(shù)的傳遞方式(續(xù))共

81頁第20

頁7.1.5函數(shù)的返回值2.函數(shù)的返回值語句:return語句

一般形式:

return(表達式);

或return表達式;

定義:通過函數(shù)調(diào)用使主調(diào)函數(shù)得到一個確定的值,稱為函數(shù)的返回值。注意不要丟掉;可以省略括號功能:將表達式的值帶回主調(diào)函數(shù)。共

81頁第21

頁說明:⑵一個函數(shù)中可以有多個return語句,但是一次函數(shù)執(zhí)行只能執(zhí)行其中的一個。當執(zhí)行到某個

return語句時,則終止函數(shù)執(zhí)行,并帶回函數(shù)值。fun(intx){if(x<1)return2*x+1;elseif(x<=10)returnx*x;elsereturn3*x–10;}⑴return后面的值可以是一個表達式,例如:

z=x>y?x:y;return(z);return(x>y?x:y);

等效共

81頁第22

頁說明(續(xù)):⑷若函數(shù)體內(nèi)沒有return語句,就一直將函數(shù)執(zhí)行完,再返回調(diào)用函數(shù),返回一個不確定的值。⑶

return后面可以無“返回值”(即return;),則該return語句只起到終止函數(shù)執(zhí)行,返回主調(diào)函數(shù)的作用。共

81頁第23

頁intmax(x,y)intx,y;{intz;if(x>y)z=x;elsez=y;

return(z);}返回整型函數(shù)值intmax(x,y)intx,y;{intz;if(x>y)z=x;elsez=y;

return;}無返回值

max(x,y)

intx,y;

{intz;

if(x>y)z=x;elsez=y;

}無返回語句在此返回缺省類型說明

函數(shù)返回值共

81頁第24

頁3.函數(shù)值的類型

函數(shù)定義時應(yīng)該指定函數(shù)的類型(即函數(shù)值的類型),應(yīng)該與return語句的類型一致。說明:⑴凡不加類型說明的函數(shù),一律自動按整型處理。⑵如果函數(shù)類型和return語句的類型不一致,以函數(shù)類型為準。對數(shù)值型數(shù)據(jù),可以自動進行類型轉(zhuǎn)換。既函數(shù)類型決定返回值的類型。⑶如果函數(shù)無返回值,可以將函數(shù)定義為“無類型”void

(或稱“空類型”)。例如:voidprint_star(){……}注意:函數(shù)中沒有return語句,函數(shù)帶回的是一個不確定的值。為明確表示不帶回值,可以用void定義。共

81頁第25

頁例:編寫計算的程序。程序2:floatsum(n)intn;{inti;floats=0;for(i=1;i<=n;i++)s+=1.0/i;return(s);}main(){intn;floatx;n=20;x=sum(n);printf("x=%f",x);}voidsum(n)intn;

{inti;floats=0;

for(i=1;i<=n;i++)s+=1/(float)i;

printf("s=%f",s);}

main(){intn;

n=20;

sum(n);

}程序1:程序運行結(jié)果:s=3.597740調(diào)用函數(shù)時,變量做函數(shù)實參,它和對應(yīng)的形參各自占用獨立的存儲單元。共

81頁第26

頁例:閱讀程序

floatadd(x,y)floatx,y;{floatz;z=x+y;return(z);}

main(){floata,b;scanf("%f,%f",&a,&b);printf("sumis%f\n",add(a,b));}

add函數(shù)程序運行:3.6,5.5<回車>sumis9.100000以上程序另一寫法:

main(){

floatadd();

floata,b;scanf("%f,%f",&a,&b);printf("sumis%f",add(a,b));}floatadd(x,y)floatx,y;{floatz;z=x+y;return(z);}/*定義add函數(shù)*/程序運行結(jié)果:3.6,5.5<回車>sumis9.100000主函數(shù)在前面子函數(shù)在后面對被調(diào)用函數(shù)的說明共

81頁第28

頁7.1.6函數(shù)的說明⒈對被調(diào)用函數(shù)說明的前提條件

被調(diào)用函數(shù)必須是已存在的函數(shù),例如用戶自定義函數(shù)或庫函數(shù)。2.被調(diào)用函數(shù)是用戶自定義函數(shù)的函數(shù)說明

同變量一樣,函數(shù)的調(diào)用也應(yīng)該遵循“先聲明,后使用”的原則。

如使用用戶自定義函數(shù),而且主調(diào)函數(shù)和被調(diào)用函數(shù)在同一個文件中,應(yīng)該在主調(diào)函數(shù)中說明被調(diào)函數(shù)的類型。其說明形式如下:共

81頁第29

頁函數(shù)說明的一般形式:

類型標識符函數(shù)名(類型1,類型2,……);或類型標識符函數(shù)名(類型1形參1,類型2形參2,……);功能:通知編譯程序函數(shù)值是什么類型,有多少參數(shù)及它們各自的類型,為編譯程序進行類型檢查提供依據(jù)。main(){

floatadd(floatx,floaty);

floata,b,c;scanf(“%f,%f”,&a,&b);c=add(a,b);printf(“sumis%f”,c);}/*定義add函數(shù)*/floatadd(floatx,floaty){floatz;z=x+y;return(z);}對被調(diào)用函數(shù)的說明作為表達式被調(diào)用運行結(jié)果:3.6,5.5sumis9.100000或:類型標識符函數(shù)名();共

81頁第30

頁3.函數(shù)說明和函數(shù)定義的區(qū)別

函數(shù)說明的作用是把函數(shù)的名字、函數(shù)類型以及形參的類型、個數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時系統(tǒng)按此進行對照檢查。

函數(shù)定義是指對函數(shù)功能的確立,包括指定函數(shù)名、函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個完整的、獨立的函數(shù)單位。

函數(shù)說明與函數(shù)定義的首部唯一區(qū)別:函數(shù)說明語句的()之后必須有分號,而函數(shù)定義首部的()之后沒有分號。函數(shù)定義只能一次函數(shù)說明可以多次共

81頁第31

頁4.以下三種情況可以省略被調(diào)用函數(shù)的說明⑴函數(shù)的返回值為整型或字符型時,可以不進行函數(shù)聲明,系統(tǒng)按整型處理。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ù)說明該函數(shù)沒有加類型說明,為整型函數(shù).共

81頁第32

頁⑵被調(diào)用函數(shù)的定義在主調(diào)函數(shù)之前,可以省略聲明。floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b;scanf(“%f,%f,“&a,&b);printf(“sumis%f”,add(a,b));}被調(diào)函數(shù)在主調(diào)函數(shù)之前主調(diào)函數(shù)在被調(diào)函數(shù)之后共

81頁第33

頁⑶如果已在所有函數(shù)定義之前,在文件的開頭,在函數(shù)的外部已說明了函數(shù)類型,則在各個主調(diào)函數(shù)中不必對所調(diào)用的函數(shù)再作聲明。charletter(char,char);floatf(float,float);inti(float,float);main(){…….}charletter(charc1,charc2){……}floatf(floatx,floaty){……}inti(float,float){……}此處不必說明在所有函數(shù)之前說明函數(shù)類型定義函數(shù)letter、f和i共

81頁第34

頁#include“stdio.h”

/*調(diào)用輸入輸出函數(shù)*/#include“math.h”

/*調(diào)用數(shù)學(xué)函數(shù)*/#include“string.h”

/*調(diào)用字符,字符串函數(shù)*/#include“graphics.h”

/*調(diào)用圖形函數(shù)*/用戶也可建立自己的庫函數(shù),這是高級應(yīng)用的內(nèi)容。5.庫函數(shù)及調(diào)用

庫函數(shù):由人們根據(jù)需要編制并提供給用戶使用的一些基本函數(shù),在用戶定義的函數(shù)中常常調(diào)用這些函數(shù)。方法:在文件的開頭用#include

命令將需要的庫函數(shù)包含到文件中。共

81頁第35

頁7.2數(shù)組作函數(shù)參數(shù)數(shù)組元素可以作函數(shù)的實參數(shù)組名可以作函數(shù)的實參和形參多維數(shù)組可以作函數(shù)參數(shù)

7.2.1.數(shù)組元素作函數(shù)實參

由于表達式可以做實參,數(shù)組元素可以作為表達式的組成部分,因此,數(shù)組元素可以做函數(shù)的實參,與變量一樣,是單向傳遞,即“值傳送”方式。

例如:

inta[10];······x=power(a[9],5);數(shù)組元素作實參共

81頁第36

頁7.2.2數(shù)組名作函數(shù)的參數(shù)

可以用數(shù)組名作函數(shù)參數(shù),此時實參和形參都用數(shù)組名。由于數(shù)組名代表的就是數(shù)組在內(nèi)存中存放區(qū)域的首地址。把數(shù)組名作為函數(shù)參數(shù)來實現(xiàn)大量數(shù)據(jù)的傳遞是一個非常好的數(shù)據(jù)傳遞方法。這種傳遞方式是“地址傳遞”共

81頁第37

頁有兩種形式:①

[函數(shù)值類型說明符]函數(shù)名(類型說明符數(shù)組名[],……)

{函數(shù)體}

[函數(shù)值類型說明符]函數(shù)名(數(shù)組名,……)

類型說明符數(shù)組名[];

{函數(shù)體}

1.一維數(shù)組作函數(shù)參數(shù)2.數(shù)組作函數(shù)形參的函數(shù)調(diào)用方式函數(shù)名(數(shù)組名,………)共

81頁第38

頁說明:在主調(diào)函數(shù)和被調(diào)用函數(shù)中分別定義數(shù)組。實參數(shù)組和形參數(shù)組類型要一致。實參數(shù)組和形參數(shù)組大小可以不一致,形參數(shù)組可以不指定大小。(這里指一維數(shù)組)。函數(shù)調(diào)用時,形參數(shù)組將獲得實參數(shù)組的起始地址。共

81頁第39

頁例:編寫函數(shù),求n個數(shù)組元素的算術(shù)平均值。doubleaverage(inta[],intn){inti;doubles=0;for(i=0;i<n;i++)s=s+a[i];returns/n;}主函數(shù)調(diào)用如何編寫?

main(){intb[3]={1,2,3};doubles;s=average(b,3);printf(“%f\n”,s);}形參數(shù)組不指定大小,數(shù)組名后跟一個空方括號這是數(shù)組作形參時常使用的技巧實參a獲得b的起始地址數(shù)組名做函數(shù)是“地址傳遞”。也就是把實參數(shù)組的起始地址傳遞給形參數(shù)組,這樣二者共占一段內(nèi)存單元。因此,形參數(shù)組各元素的值如果發(fā)生變化會使實參數(shù)組各元素的值發(fā)生同樣的變化。例:閱讀下列程序,指出輸出結(jié)果。main(){voidswap();/*函數(shù)聲明*/intb[2]={10,2};swap(b);printf(“b[0]=%d,b[1]=%d\n”,b[0],b[1]);}

voidswap(inta[]){intt;t=a[0];a[0]=a[1];a[1]=t;}共

81頁第41

頁數(shù)組bbb[1]b[0]102數(shù)組a數(shù)組bb,ab[1]b[0]102a[1]a[0]函數(shù)開始調(diào)用之前函數(shù)開始調(diào)用,實參數(shù)組b將起始地址傳遞給形參數(shù)組a,二者共占一段內(nèi)存單元數(shù)組a數(shù)組bb,ab[1]b[0]210a[1]a[0]swap函數(shù)執(zhí)行過程中,a[0]與a[1]的值交換數(shù)組bbb[1]b[0]210函數(shù)調(diào)用結(jié)束后共

81頁第42

頁例:編寫一個函數(shù).

功能:在n個整數(shù)中,找出數(shù)值最大的數(shù)。給定10個整型數(shù),找出其中數(shù)值最大的數(shù)。intmax(a,n)inta[],n;{intm,i;m=a[0];for(i=1;i<n;i++)if(a[i]>m)m=a[i];return(m);}子函數(shù):main(){intx[10],amax;inti;for(i=0;i<10;i++)scanf("%d",&x[i]);

amax=max(x,10);printf(“amax=%d",amax);}主函數(shù):前面所學(xué)內(nèi)容共

81頁第43

頁例:用選擇法對數(shù)組中10個整數(shù)按由小到大排序.方法:寫一個函數(shù)sort(array[],n):對數(shù)組元素按由小到大排序。寫主函數(shù):輸入array數(shù)組,調(diào)用sort函數(shù),輸出排序后的array數(shù)組。voidsort(intarray[],intn){inti,j,t;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++)if(array[j]<array[i]){t=array[j];array[j]=array[i];array[i]=t;}}前面所學(xué)內(nèi)容共

81頁第44

頁main(){inta[10],i;printf(“enterarray:\n”);for(i=0;i<10;i++)scanf(“%d”,&a[i]);sort(a,10);printf(“thesortedarray:\n”);for(i=0;i<10;i++)printf(“%d”,a[i]);printf(“\n”);}由于地址傳遞,實參數(shù)組a改變數(shù)組名做參數(shù)的好處:⑴由于只需復(fù)制一個地址值,而無須復(fù)制全部需要處理的數(shù)據(jù),因此節(jié)約存儲空間并提高效率。⑵由于主調(diào)函數(shù)和被調(diào)函數(shù)是在相同的內(nèi)存區(qū)域上對數(shù)據(jù)進行操作,因此可以實現(xiàn)數(shù)據(jù)的同步更新。共

81頁第45

頁有兩種形式

(形式基本同一維)①[函數(shù)值類型說明符]函數(shù)名(類型說明符數(shù)組名[][正整型常量表達式],……){函數(shù)體}②[函數(shù)值類型說明符]函數(shù)名(數(shù)組名,……)

類型說明符數(shù)組名[][正整型常量表達式];{函數(shù)體}7.2.3二維數(shù)組作函數(shù)參數(shù)“行”可以不確定“列”必須確定!!共

81頁第46

頁說明:形參數(shù)組定義時可以指定每一維的大小,也可以省略第一維的大小,不允許省略第二維以及其他高維的大小.例如:intarray[3][10];或intarray[][10];是一樣的!但

intarray[3][];和intarray[][];是錯誤的!實參數(shù)組可以大于形參數(shù)組。(行可以不同,列必須相同)例如:實參數(shù)組定義為:intarray[5][10];

形參數(shù)組定義為:intarray[3][10];

這時形參數(shù)組只取實參數(shù)組的一部分,其余部分不起作用。共

81頁第47

頁例:閱讀程序,指出運行結(jié)果。

voidadd1(inta[][3],intn){inti;for(i=0;i<n;i++)++a[i][i];}

main(){intx[3][3]={0,1,2,3,4,5,6,7,8},i;add1(x,3);for(i=0;i<3;i++)printf("%d",x[i][i]);printf("\n");}程序運行結(jié)果為:159注意:二維數(shù)組的調(diào)用注意:二維數(shù)組的定義共

81頁第48

頁例:寫函數(shù)打印n行10列二維數(shù)組,其中n是任意整數(shù)。

voidprint_array(inta[][10],intn){inti,j;for(i=0;i<n;i++){for(j=0;j<10;j++)printf(“%3d”,a[i][j]);printf(“\n”);}}例:寫函數(shù)交換任意一個n*10的二維數(shù)組的i,j兩行

voidexchange(inta[][10],inti,intj){intk,t;for(k=0;k<10;k++){t=a[i][k];a[i][k]=a[j][k];a[j][k]=t;}}例:編寫函數(shù),計算兩個3行4列的矩陣之和。并求:C3X4=A3X4+B3X4voidqiuh(floatx[][4],floaty[][4],floatz[][4],intn){inti,j;for(i=0;i<n;i++)for(j=0;j<4;j++)z[i][j]=x[i][j]+y[i][j];}main(){floata[3][4],b[3][4],c[3][4];inti,j;for(i=0;i<3;i++)for(j=0;j<4;j++)scanf(“%f%f”,&a[i][j],&b[i][j]);qiuh(a,b,c,3);for(i=0;i<3;i++){for(j=0;j<4;j++)printf(“%10.2f”,c[i][j]);printf(“\n”);}}注意函數(shù)的定義和函數(shù)的調(diào)用共

81頁第50

頁7.3函數(shù)的嵌套調(diào)用和遞歸調(diào)用7.3.1函數(shù)的嵌套調(diào)用嵌套定義:在定義一個函數(shù)時,該函數(shù)體內(nèi)包含另一個函數(shù)的定義。嵌套調(diào)用:在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù)。C語言不允許嵌套定義,但可以嵌套調(diào)用。在調(diào)用一個函數(shù)的過程中,又調(diào)用另一個函數(shù)。共

81頁第51

頁函數(shù)的嵌套調(diào)用main函數(shù){……

……

調(diào)用函數(shù)A;

……}函數(shù)A{……

……

調(diào)用函數(shù)B;

……}函數(shù)B{……

……

……}調(diào)用調(diào)用返回返回共

81頁第52

頁例:閱讀程序,指出運行結(jié)果。main(){inta=0,b=0,b1(int,int);printf("b1=%df1=%d\n",b1(a,b),f1(

));}b1(intd,inte){intf1(

),f;d=5;e=10;f=f1(

)+d+e;returnf;}f1(){intc,i=1;c=15;while(i<=3){c*=i;i++;}returnc;}程序執(zhí)行結(jié)果:

b1=105f1=90f1返回的是整型可以省略聲明這個說明也可以省略函數(shù)聲明。也可寫成原型:b1(intd,inte)此例b1返回的是整型也可以不說明共

81頁第53

頁7.3.2函數(shù)的遞歸調(diào)用1.遞歸的概念:在調(diào)用一個函數(shù)的過程中直接或間接地調(diào)用該函數(shù)本身。f函數(shù)調(diào)用f函數(shù)直接遞歸調(diào)用intf(intx){inty,z;…..z=f(y);……return(2*z);}

81頁第54

頁intf1(intx)

{inty,z;…..z=f2(y);……return(2*z);}intf2(intt)

{inta,c;…..c=f1(a);……return(3+c);}間接遞歸調(diào)用共

81頁第55

頁遞歸函數(shù)的執(zhí)行過程:

遞歸調(diào)用:記住本次現(xiàn)場,遞歸調(diào)用。終了調(diào)用:返回上次調(diào)用現(xiàn)場。特點

是無終止的遞歸調(diào)用,因此,應(yīng)該給定一個限制遞歸次數(shù)的條件。

f1函數(shù)調(diào)用f2函數(shù)f2函數(shù)調(diào)用f1函數(shù)共

81頁第56

頁intf(intx){inty;if(x==0||x==1)return(3);y=x*x-f(x-2);returny;}main(){intz;z=f(3);printf(“%d\n”,z);}A)0B)9C)6D)8例:閱讀以下程序段,運行后的結(jié)果是:舉例:編寫計算n!的程序。

n*(n-1)!當n>1longintfact(intn){longintf;if(n==0||n==1)f=1;elsef=n*fact(n-1);returnf;}main(){longintred;intn;scanf("%d",&n);red=fact(n);printf("red=%ld",red);}假如求5!,則程序執(zhí)行結(jié)果為:red=1201當n=0,n=1n!=共

81頁第58

頁f=3*fact(2)f=1*2*3=6fact函數(shù)

n=3f=2*fact(1)f=1*2=2fact函數(shù)

n=2

調(diào)用fact函數(shù)時,總是從fact的第一條語句開始執(zhí)行;執(zhí)行到return語句,總是返回到該次調(diào)用的調(diào)用位置繼續(xù)執(zhí)行調(diào)用函數(shù)。fact函數(shù)的調(diào)用過程:main()fact(5)輸出fact(5)f=5*fact(4)f=1*2*3*4*5=120fact函數(shù)

n=5f=4*fact(3)f=1*2*3*4=24fact函數(shù)

n=4第一次調(diào)用第二次調(diào)用第三次調(diào)用第四次調(diào)用第五次調(diào)用返回返回返回返回返回共

81頁第59

頁變量的數(shù)據(jù)類型char型

int型

float型

double型總結(jié):數(shù)據(jù)類型決定為變量分配的內(nèi)存單元的長度,數(shù)據(jù)的存放

形式。(從程序設(shè)計角度,決定了可以表示的數(shù)的范圍)問題:1.何時為變量分配內(nèi)存單元?

2.變量位于內(nèi)存的什么位置?

3.變量的有效作用范圍?7.4變量的作用域和存儲方法共

81頁第60

變量的作用域和生存期

變量的作用域

指一個變量在程序中的有效范圍。

C語言規(guī)定:凡是在函數(shù)內(nèi)定義的變量,它的作用域僅僅是包含這個變量定義的復(fù)合語句;而在函數(shù)體外定義的變量,它的作用域是從定義點到文件尾。

變量的生存期指程序在執(zhí)行期間,變量存在的時間間隔,即從給變量分配內(nèi)存,至所分配內(nèi)存被系統(tǒng)收回的那段時間。

C語言規(guī)定:凡是出現(xiàn)在靜態(tài)數(shù)據(jù)區(qū)的變量,生存期都是從程序開始執(zhí)行到程序結(jié)束;而出現(xiàn)在靜態(tài)區(qū)之外的變量,生存期僅僅是從函數(shù)開始執(zhí)行到函數(shù)執(zhí)行結(jié)束這段時間。共

81頁第61

頁1.局部變量(內(nèi)部變量)定義:在函數(shù)內(nèi)部定義的變量,只能在本函數(shù)內(nèi)部使用,稱為局部量。7.4.1局部變量和全局變量(從變量的作用域分)如:floatf1(inta){intb,c;…..{charf2(intx,inty){inta,b;……}main(){intm,n;…….{a,b,c在函數(shù)f1中有效x,y,a,b在函數(shù)f2中有效m,n在主函數(shù)中有效共

81頁第62

頁主函數(shù)main定義的變量只在主函數(shù)中有效,主函數(shù)不能使用其它函數(shù)定義的變量。不同函數(shù)可以使用相同名字的變量,它們在內(nèi)存中占不同的單元,互不影響。(如,前例f1和f2中的a,b變量)形式參數(shù)也是局部變量。在一個函數(shù)內(nèi)部,可以在復(fù)合語句中定義變量,這些變量只在本復(fù)合語句中有效。

關(guān)于局部變量幾點說明:如:main(){inta,b;/*a,b在整個main函數(shù)內(nèi)有效*/……

{intc;/*c僅在本復(fù)合語句內(nèi)有效*/c=a+b;……

}…….}共

81頁第63

頁2.全局變量

程序中,在函數(shù)之外定義的變量稱為外部變量,即全局變量。全局變量可以為本文件中的其他函數(shù)所共用,但是,它的有效范圍是從定義變量的位置開始到源文件的結(jié)束。如:intp=1,q=5;floatf1(inta)

{intb,c;…..

{charc1,c2;charf2(intx,inty)

{inta,b;……

}main()

{intm,n;…….

{全局變量c1,c2的作用范圍全局變量p,q的作用范圍共

81頁第64

頁從定義變量的位置開始到本文件結(jié)束,這段程序中的函數(shù)可直接使用全局變量。(注意全局變量的有效范圍)如果在同一源文件中,全局變量和局部變量同名,則在局部變量的作用范圍內(nèi),全局變量不起作用。

關(guān)于全局部變量幾點說明:共

81頁第65

頁例如:#include“stdio.h”inta=7,b=10;main(){inta=5,c;c=a+b;printf(“c=%d\n”,c);}運行結(jié)果:c=15全局量的a沒有起作用共

81頁第66

頁使用全局變量的優(yōu)點:函數(shù)間數(shù)據(jù)聯(lián)系:同一文件中的一些函數(shù)引用全局變量,當某個函數(shù)中改變了全局變量的值,其它函數(shù)中的全局變量值也隨之改變。函數(shù)可以得到多個返回值。缺點:全局變量在程序的全部執(zhí)行過程中都占用存儲單元,而不是僅在需要時才開辟單元。降低函數(shù)的通用性,因為函數(shù)在執(zhí)行時要依賴其使用的全局變量。(對函數(shù)的移植帶來不便)使用過多,降低程序的清晰性,難以判別全局變量的值。

提示:全局變量應(yīng)盡可能少用。共

81頁第67

兩種:靜態(tài)存儲方式:程序運行期間分配固定存儲空間的方式。動態(tài)存儲方式:程序運行期間根據(jù)需要進行動態(tài)的分配存儲空間的方式。程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)全局變量,局部靜態(tài)變量形式參數(shù)局部變量(自動)函數(shù)調(diào)用的現(xiàn)場保護和返回地址7.4.2變量的存儲方法運行期間的C程序占用的內(nèi)存由3部分構(gòu)成:共

81頁第68

頁變量存貯類型有四種:1.自動變量(auto)2.靜態(tài)變量(static)3.寄存器變量(register)4.外部變量(extern)

局部變量全局變量共

81頁第69

頁1.局部變量的存儲方法(1)自動變量(auto)

動態(tài)分配存儲空間的變量。如:函數(shù)中的局部變量、函數(shù)的形參、復(fù)合語句中的局部變量,稱為自動變量,用關(guān)鍵字auto作為存儲類型說明。如:intf(inta){

autointb,c=3;

…}自動變量被分配在動態(tài)存儲區(qū),用前分配,用后釋放。實際上不加特殊聲明(static)的局部變量都是自動變量,因此在定義自動變量時,關(guān)鍵字可以省略。intf(inta){intb,c=3;

…}寫成為:共

81頁第70

頁(2)用(static)聲明局部變量

靜態(tài)存儲方式,整個程序運行期間都不釋放。定義形式:在變量名前面加關(guān)鍵字static

static類型說明符變量名;編譯時賦初值,每次調(diào)用時不賦初值,只保留調(diào)用結(jié)束時變量的值。如果局部靜態(tài)變量不賦初值,編譯時自動賦0,而自動變量不賦初值,其值不確定。局部靜態(tài)變量只允許所在函數(shù)引用,其它函數(shù)不能引用。共

81頁第71

頁例如:f(inta){intb=0;staticintc=3;b=b+1;c=c+1;return(a+b+c);}main(){inta=2,i;for(i=0;i<3;i++)printf(“%d”,f(a));}運行結(jié)果為:

789第一次調(diào)用開始第一次調(diào)用結(jié)束第二次調(diào)用開始0b34410c共

81頁第72

頁(3)寄存器變量(register)定義:直接放置在運算器的寄存器中的變量稱為寄存器變量說明方式:在變量名前面加關(guān)鍵字register

register類型說明符變量名;只有局部自動變量和形式參數(shù)才可以聲明為寄存器變量,因為register變量在函數(shù)調(diào)用結(jié)束時必須釋放。如:intfac(intn){registerinti,f=1;for(i=1;i<=n;i++)f=f+i;return(f);}寄存器變量的說明注意:局部靜態(tài)變量不能聲明為寄存器變量共

81頁第73

頁2.全局變量的存儲方法(1)外部全局變量

在多個源程序文件的情況下,如果在文件B中要引用文件A中所定義的全局變量,則應(yīng)該在文件B中對所要引用的變量,用extern說明。例如:

prog1.c的內(nèi)容如下:inta;main(){x=6;f1();}voidf1(){a+=2;printf("a=%d\n",a);f2();}prog2.c的內(nèi)容為:externinta;voidf2(){a++;printf("a=%d\n",a);}對文件prog1.c中全局變量a的聲明共

81頁第74

頁(2)靜態(tài)全局變量若在一個文件中定義的全局變量僅限于本文件引用,而不能被其它文件訪問,則可以定義為靜態(tài)全局變量。例如:staticintx;

例如:file1.cfile2.cstaticinta;externinta;main()fun(intn);{{…..}…..}

staticinta只能用于file1.c,雖然file2.c中將同名變量inta說明為extern,但仍無法使用file1.c中的a變量。共

81頁第75

頁7.5內(nèi)部函數(shù)和外部函數(shù)1.內(nèi)部函數(shù)(靜態(tài)函數(shù))定義:如果一個函數(shù)只能被本文件中其它函數(shù)調(diào)用,稱為內(nèi)部函數(shù)。定義格式:

static類型標識符函數(shù)名(形參表)函數(shù)體例如:staticintfun(a,b){······}作用:函數(shù)的作用域限于所在文件,不同文件中同名函數(shù)互不干擾,便于程序的格式化。共

81頁第76

頁2.外部函數(shù)定義:如果一個函數(shù)允許被其它文件調(diào)用,稱為外部函數(shù)。定義格式:

[extern]類型標識符函數(shù)名(形參表)函數(shù)體

例如:externintfun(inta,intb){······}

或intfun(inta,intb){······}通常不加static標識符的函數(shù)都是外部函數(shù)(我們前面所有函數(shù))。共

81頁第77

頁3.標號的生存期及作用域生存期

在C語言中,由于函數(shù)的生存期是全程的,即從程序開始至程序結(jié)束,標號是函數(shù)的一部分,標號的生存期自然是全程的。作用域

C語言規(guī)定,標號的作用域僅為定義標號的函數(shù),即不允許用goto語句從一個函數(shù)轉(zhuǎn)向另一個函數(shù)。

81頁第78

頁函數(shù)間的數(shù)據(jù)傳遞

——三種傳遞方式返回值參數(shù)全局變量共

81頁第79

頁函數(shù)的返回值通過return語句返回。return語句只能把一個返值傳遞給調(diào)用函數(shù)。返回值的類型為定義的函數(shù)類型,若return語句中表達式類型與函數(shù)類型不一致,則轉(zhuǎn)換為函數(shù)類型。返回值可以是數(shù)值,也可以是地址。當返值是地址時,應(yīng)該用指針接受它。無返回值的函數(shù),定義為void類型。共

81頁第80

頁函數(shù)間的參數(shù)傳遞在函數(shù)被調(diào)用時才分配形參的存儲單元。實參可以是常量、變量或表達式。實參類型必須與形參相符。傳遞時是傳遞參數(shù)值,即單向傳遞。使用地址作為參數(shù),可以返回函數(shù)處理結(jié)果。數(shù)組作為參數(shù)時的情況。數(shù)組元素作實參,與單個變量一樣。數(shù)組名作參數(shù),傳送的是數(shù)組首地址。共

81頁第81

頁使用全局變量傳遞數(shù)據(jù)在所有函數(shù)之外說明的變量是全局變量,它在所有函數(shù)中都是可見的。利用全局變量的這個特性,可以在函數(shù)間傳遞數(shù)據(jù)共

81頁第82

頁作業(yè)

第七章(筆頭作業(yè))練習二、三

上機編程題

溫馨提示

  • 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

提交評論