c語言函數(shù)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第1頁
c語言函數(shù)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第2頁
c語言函數(shù)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第3頁
c語言函數(shù)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第4頁
c語言函數(shù)市公開課金獎(jiǎng)市賽課一等獎(jiǎng)?wù)n件_第5頁
已閱讀5頁,還剩82頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第八章函數(shù)

(TheUser-definedFunction)Functiondeclaration,called,returnavalueandpassingcharacter(定義、調(diào)用、返回值方法及參數(shù)傳遞方式)Functionusage(掌握函數(shù)使用慣用方法)Variablescopeandstorageclass(變量作用域和變量存放類別)第1頁8.1概述一、C函數(shù)概念將一個(gè)C程序分為若干模塊,每個(gè)模塊實(shí)現(xiàn)一個(gè)特定功效,在C語言中用函數(shù)來實(shí)現(xiàn)模塊功效。

函數(shù):含有某種功效獨(dú)立程序段。IndependentProgramBlock

⑴從程序設(shè)計(jì)方法看C函數(shù):它是實(shí)現(xiàn)模塊化程序設(shè)計(jì)語法元素。(Syntaxelement)⑵從C語言中程序組成方式看C函數(shù):它是程序基本組成單位。(Programfoundation)第2頁二、C函數(shù)與C程序結(jié)構(gòu)⑴C程序由主函數(shù)(main函數(shù))和若干個(gè)子函數(shù)組成;⑵主函數(shù)調(diào)用子函數(shù);⑶子函數(shù)在定義時(shí)是并列;⑷子函數(shù)可相互調(diào)用,也可被屢次調(diào)用。mainabcdefghhieg第3頁#include<stdio.h>#include<math.h>voidmain(){charprime(int);//函數(shù)申明或定義函數(shù)原形(FunctionPrototype)intn;printf("\nInputaninteger:");scanf("%d",&n);if(prime(n)==‘g’)//函數(shù)調(diào)用printf("\n%disaprime.",n);elseprintf("\n%disNOTa prime.",n);}//函數(shù)定義(Function

Definition)charprime(intn)//函數(shù)類型、名稱,形式參數(shù)定義{charflag='g';inti,k;k=sqrt(n)+1;for(i=2;i<=k;i++) if(fmod(n,i)==0) {flag='r'; break;}returnflag;//返回值}//函數(shù)體定義第4頁main()/*主函數(shù)*/{print_star();/*調(diào)用print_star函數(shù)打印****/

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

print_star();/*調(diào)用print_star函數(shù)打印****/}print_star()/*定義print_star函數(shù)*/{prinf(“\n**********”);}print_message()/*定義print_message函數(shù)*/

{prinf(“\nHello!”);}函數(shù)調(diào)用例:運(yùn)行結(jié)果:**********Hello!**********

第5頁三、C函數(shù)特點(diǎn)⑴一個(gè)源文件由一個(gè)或多個(gè)函數(shù)組成,它是一個(gè)獨(dú)立編譯單元。(Independentcompilingunit)⑵一個(gè)C程序由一個(gè)或多個(gè)源文件組成。(built-upofmanyfiles)文件3:函數(shù)Complex.h#include"Vector.h"classCComplex{…}文件2:函數(shù)Jpcal3.h#include"Complex.h"classCEq{…}文件1:主函數(shù)#include"jpcal3.h"#include"PBcal.h"Main(){…}文件4:函數(shù)Vector.h#include<stdio.h>#include<math.h>classCVector{…}第6頁⑶Programstartfromthe“main”function,andfinallyendedattheendofthe“main”function.(C程序執(zhí)行總是從main函數(shù)開始,調(diào)用其他函數(shù)后流程回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序運(yùn)行。)⑷Functioncannotbedeclaredbynesting,butcanbecalledbynesting.“main”functioncanneverbecalled.(函數(shù)不能嵌套定義,但能夠相互調(diào)用。注意不能調(diào)用main函數(shù)。)第7頁四、函數(shù)分類(CategoryofFunctions)1.從函數(shù)參數(shù)形式看,函數(shù)可分為四類:①Noarguments

andno

returnvalue

voidprint_star(void){printf(“**********”);}orvoidprint_star(){printf(“**********”);}第8頁Argumentsbutnoreturnvalue

voidmax(inta,intb){intz;z=a>b?a:b;printf(“Themaxis:%d”,z);}Noargumentsbutreturnavalue

intget_number(){intnumber;scanf(“%d”,&number);returnnumber;}第9頁有參函數(shù)(ArgumentsWithreturnvalue)有參函數(shù)例:(輸出兩數(shù)中大者)#include<stdio.h>

intmax(intx,inty);//函數(shù)原形main(){intnum1,num2,a;scnaf("%d,%d",&num1,&num2);a=max(num1,num2);printf("max=%d",a);}intmax(intx,inty){intz;if(x>y)z=x;elsez=y;returnz;}第10頁2.Byuserusage(從用戶使用角度看,函數(shù)有兩種)①StandardLibraryFunction標(biāo)準(zhǔn)函數(shù)庫函數(shù):是由編譯系統(tǒng)提供已設(shè)計(jì)好函數(shù),用戶只需調(diào)用而無需去實(shí)現(xiàn)它。前幾章用過scanf,printf,getchar,putchar,fmod,sqrt等都是庫函數(shù)。②User-definedFunction用戶自定義函數(shù):由程序員自己定義和設(shè)計(jì)函數(shù)。需要程序員自己來編寫函數(shù)功效實(shí)當(dāng)代碼。第11頁8.2DefinitionofFunction(函數(shù)定義普通形式)

一、Noargumentsfunction

definition(無參函數(shù)定義)Typefunction_name(){variableDeclaration(說明部分)sentences(語句)}比如:Voidprint_message(){printf(“\nHello!”);}NoParameterspassedFunctionhead

FunctionBody

or:Voidprint_message(void){……}Noinputandnoreturnvalue第12頁二、

Argumentsfunctiondefinition(有參函數(shù)定義形式)Typefunction_name(parameterlist)類型標(biāo)識符函數(shù)名(形式參數(shù)表列){variableDeclaration(說明部分)sentences(語句)}有參數(shù)傳遞formalparameterslist第13頁比如:intmax(intx,inty)/*求x和y二者中大者,x,y為形參*/{intz;/*函數(shù)體中變量說明*/z=x>y?x:y;return(z);/*將z值作為函數(shù)返回值*/}三、

TheEmptyFunction(空函數(shù)定義)類型標(biāo)識符函數(shù)名(){}比如:dummy(){}功效:donothing(調(diào)用后什么也不做)用處:建立程序結(jié)構(gòu),在需要時(shí)補(bǔ)充功效。typefunction_name(){}第14頁四、

對形參說明傳統(tǒng)方式上面講形式參數(shù)表說明形式是新版C語言表示形式(當(dāng)代方式),即形式參數(shù)說明是類型和參數(shù)在一起說明。傳統(tǒng)形式參數(shù)說明是類型和參數(shù)分別說明。如:按傳統(tǒng)方式說明形參intmax(x,y)intx,y;{……}按當(dāng)代方式說明形參intmax(intx,inty){……}這兩種方式都能夠使用,但推薦使用當(dāng)代方式。

注意這里是逗號第15頁8.3Argumentsandreturnvalue

函數(shù)參數(shù)和函數(shù)值

一、

形式參數(shù)和實(shí)際參數(shù)formalarguments

:在定義函數(shù)時(shí)函數(shù)名后面小括弧中變量名,簡稱形參。actual

arguments

:在調(diào)用函數(shù)時(shí)函數(shù)名后面小括弧中表示式,簡稱實(shí)參。main(){inta,b,c;scanf(“%d,%d,&a,&b);c=max(a,b);printf(“Maxis%d”,c);}intmax(intx,inty){intz;z=x>y?x:y;return(z);}formal

argumentactualargument第16頁上例中形參加實(shí)參、函數(shù)名與返回值之間關(guān)系:c=max(a,b);-----------------------

max(intx,inty)

{………

returu(z);}

Actualarguments:whenprogramexecutionpassthevaluetofunctionformalarguments:informthecompliertoallocatememoryspaceAssignthereturnvaluetothefunctionname第17頁formalargumentsarelocalones(形參是函數(shù)內(nèi)部變量,只在函數(shù)內(nèi)部才有意義;形參調(diào)用前不占內(nèi)存單元,調(diào)用時(shí)占用,調(diào)用后釋放)對每個(gè)形參必須指明其名字和數(shù)據(jù)類型; max(inta,b)Theactualargumentmusthasadefinitudevalue (實(shí)參能夠是常量、變量或表示式,而且必須有確定值)Formalargumentsmustmatchactualonesinnumbersandtype(實(shí)參個(gè)數(shù)、類型必須與對應(yīng)形參一致)Someinstruction(關(guān)于參數(shù)幾點(diǎn)說明):第18頁c=max(a,b);-----------------------

max(intx,inty)

{………

returu(z);}實(shí)參對形參數(shù)據(jù)傳遞是值傳遞,即單向傳遞,只由實(shí)參傳遞給形參,反之不可。調(diào)用結(jié)束后,只有形參單元被釋放,實(shí)參單元中值不變。ValuesofargumentsNoreturnvalues第19頁二、函數(shù)返回值(Returnvalue)定義:經(jīng)過函數(shù)調(diào)用使主調(diào)函數(shù)得到一個(gè)確定值,稱為函數(shù)返回值。比如:c=max(3,5);此時(shí)函數(shù)返回值是5,所以c=52.函數(shù)返回值語句return

函數(shù)返回值是經(jīng)過return語句取得。return語句將被調(diào)用函數(shù)一個(gè)確定值帶回主調(diào)函數(shù)中去。return語句普通形式:

return(value);

returnvalue;“函數(shù)返回值”是有確定值常量、變量或表示式。第20頁說明:⑵一個(gè)函數(shù)中能夠有多個(gè)return語句,不過一次函數(shù)執(zhí)行只能執(zhí)行其中一個(gè)。當(dāng)執(zhí)行到某個(gè)return語句時(shí),則終止函數(shù)執(zhí)行,并帶回函數(shù)值。⑶若函數(shù)體內(nèi)沒有return語句,就一直將函數(shù)執(zhí)行完,再返回調(diào)用函數(shù),有一個(gè)不確定值帶回。⑴return后面值能夠是一個(gè)表示式,比如:z=x>y?x:y;return(z);return(x>y?x:y);

⑷return后面能夠無“返回值”(即return;),則該return語句只起到終止函數(shù)執(zhí)行,返回主調(diào)函數(shù)作用。第21頁三、函數(shù)值類型(Typeofreturnvalue)

函數(shù)定義時(shí)說明函數(shù)類型(即函數(shù)值類型),應(yīng)該與return語句類型一致。說明:⑴凡不加類型說明函數(shù),一律自動(dòng)按整型處理。⑵假如函數(shù)類型和return語句類型不一致,以函數(shù)類型為準(zhǔn)。對數(shù)值型數(shù)據(jù),能夠自動(dòng)進(jìn)行類型轉(zhuǎn)換。即函數(shù)類型決定返回值類型。⑶假如函數(shù)不返回值,能夠?qū)⒑瘮?shù)定義為“無類型”void(或稱“空類型”)。比如:voidprint_star(){……}第22頁8.4函數(shù)調(diào)用(Functioncalls)一、函數(shù)調(diào)用普通形式(Methods)

variable_name(Arguments

list)

Argumentsfunction:Noarguments

variable_name

()

說明:(2)實(shí)參加形參個(gè)數(shù)相等,類型一致,按次序?qū)?yīng),一一傳遞數(shù)據(jù);⑴實(shí)際參數(shù)表中多個(gè)實(shí)參間用逗號隔開,實(shí)參能夠是常量、變量或表示式;(3)實(shí)參表求值次序與系統(tǒng)相關(guān)。第23頁二、函數(shù)調(diào)用詳細(xì)方式1.

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

普通形式:

函數(shù)名(實(shí)際參數(shù)表);

慣用于調(diào)用一個(gè)能夠忽略返回值或沒有返回值函數(shù)。使用情況:

如:對scanf函數(shù)和printf函數(shù)調(diào)用。

2.函數(shù)調(diào)用出現(xiàn)在表示式(函數(shù)表示式)中

普通形式:

變量名=函數(shù)表示式使用情況:

用于調(diào)用帶返回值函數(shù),函數(shù)返回值將參加表示式運(yùn)算。

如:a=3+max(num1,num2);注意:無返回值函數(shù)調(diào)用,不能出現(xiàn)在表示式中。

第24頁三、對被調(diào)用函數(shù)申明(Functiondeclaration)⒈函數(shù)被調(diào)用前提條件被調(diào)用函數(shù)必須是已存在函數(shù),如用戶自定義函數(shù)或庫函數(shù);而且必須事先申明。

同變量一樣,函數(shù)調(diào)用也應(yīng)該遵照“先說明,后使用”標(biāo)準(zhǔn)。

Likevariables,allfunctioninaCprogrammustbedeclaredbeforetheyareinvoked.第25頁2.庫函數(shù)函數(shù)申明(Libraryfunctiondeclaration)

假如使用庫函數(shù),需要在文件開頭用#include命令將需要庫函數(shù)包含到文件中。

現(xiàn)在我們清楚了,為何在使用庫函數(shù)之前必須包含對應(yīng)頭文件?那是因?yàn)閷@些庫函數(shù)原型說明全部都寫在對應(yīng)頭文件里了。Headfiles(我們現(xiàn)在用到頭文件有):#include“stdio.h”/*調(diào)用輸入輸出函數(shù)*/#include“math.h”/*調(diào)用數(shù)學(xué)函數(shù)*/#include“string.h”/*調(diào)用字符,字符串函數(shù)*/

在本書附錄C中列出了C語言能夠使用標(biāo)準(zhǔn)庫函數(shù),大約有75個(gè)。請?jiān)陂喿x時(shí)注意形參要求、功效及返回值。第26頁3.用戶自定義函數(shù)函數(shù)申明(User-definedFunction)

Functiondeclarationconsistsoffourparts:Functiontype(returntype)FunctionnameParameterlistTerminatingsemicolonCodedinthefollowingformat:Function-typefunction_name(type1var1,type2var2,……);

Function-typefunction_name(type1,type2,……);

or第27頁普通形式:類型標(biāo)識符函數(shù)名(類型1形參1,類型2形參2,……);

類型標(biāo)識符函數(shù)名(類型1,類型2,……);

或在C語言中,以上函數(shù)申明稱為函數(shù)原型(Prototype)。

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)用第28頁4.函數(shù)申明和函數(shù)定義區(qū)分

函數(shù)申明作用是把函數(shù)名字、函數(shù)類型以及形參類型、個(gè)數(shù)和次序通知編譯系統(tǒng),方便在調(diào)用該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對照檢驗(yàn)。

舊版C語言函數(shù)說明只是對函數(shù)名及其返回類型說明。如:floatmax();未進(jìn)行全方面檢驗(yàn),新版C語言兼容這種使用方法,但不提倡使用。所以,以下函數(shù)說明都是正當(dāng)(legal):floatmax(intx,inty);floatmax(int,int);floatmax();

函數(shù)定義是指對函數(shù)功效確實(shí)立,包含指定函數(shù)名、函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個(gè)完整、獨(dú)立函數(shù)單位。第29頁5.3casesoffunctiondeclarationbeingomitted⑴Returnaintegervalue(函數(shù)返回值為整型或字符型時(shí),能夠不進(jìn)行類型說明,系統(tǒng)自動(dò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ù)第30頁⑵Functiondefinedinglobedeclarationsection(函數(shù)定義在主調(diào)函數(shù)之前,能夠不進(jìn)行類型申明)floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b;scanf(“%f,%f,“&a,&b);printf(“sumis%f”,add(a,b));}globedeclarationsection主調(diào)函數(shù)在被調(diào)函數(shù)之后第31頁⑶Functiondeclaredinglobedeclarationsection(在全部函數(shù)定義之前已說明了函數(shù)類型,則在各個(gè)主調(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第32頁8.5PassingArraystoFunction

(數(shù)組作為函數(shù)參數(shù))

FunctionArgumentsArrayselement(數(shù)組元素能夠做函數(shù)實(shí)參)Arraysname(數(shù)組名能夠做函數(shù)參數(shù))Multi-dimensionalarrays(多維數(shù)組)一、數(shù)組元素能夠做函數(shù)實(shí)參數(shù)組元素能夠象變量一樣作為表示式組成部分,所以,數(shù)組元素能夠做函數(shù)實(shí)參,而且能夠單向傳遞給形參。第33頁二、PassingArraystofunctions(數(shù)組名能夠做函數(shù)參數(shù))因?yàn)閿?shù)組名代表就是數(shù)組在內(nèi)存中存放區(qū)域首地址。把數(shù)組名作為函數(shù)參數(shù)來實(shí)現(xiàn)大量數(shù)據(jù)傳遞是一個(gè)非常好數(shù)據(jù)傳遞方法。說明:數(shù)組名做函數(shù)實(shí)參和形參時(shí)不是“值傳遞”,而是“地址傳遞”。地址傳遞結(jié)果使得形參加實(shí)參共用同一個(gè)數(shù)組。所以,形參數(shù)組各元素值假如發(fā)生改變會使實(shí)參數(shù)組各元素值發(fā)生一樣改變。第34頁/*example*/main(){floatlargest(floata[],intn);floatvalue[4]={2.5,-4.75,1.2,3.67};printf(“%f\n”,largest(value,4));}floatlargest(floata[],intn){inti;floatmax;for(i=1;i<n;i++) if(max<a[i])max=a[i];return(max);}Thearraysshouldbedeclaredrespectivelyinthecallingfunctionandthecalledfunction.Thesizeofactualargumentarraymaynotsimilarwiththeformalone.itisnotnecessarytospecifythesizeofformalargumentarray.

Thetypeofactualargumentarraymustbesimilartotheformalone.第35頁2.5-4.751.23.67地址actualargumentvalue[4]

formalargument

a[]value[0]value[1]value[2]value[3]

a[0]a[1]a[2]a[3]

InC,thenameofthearrayrepresentstheaddressofitsfirstelement.Bypassingthearrayname,theaddressofthearrayispassedtothecalledfunction.Thearrayinthecalledfunctionnowreferstothesamearraystoredinthememory.Therefore,anychangesinthearrayinthecalledfunctionwillbereflectedintheoriginalarray.Passingaddressofparametertothefunctionisreferredtoaspassbyaddress.Thewholearraycan’tbepassedbyvalueasitwasdidinthecaseofordinaryvariables.第36頁數(shù)組名做參數(shù)好處(Advantage):⑴因?yàn)橹恍鑿?fù)制一個(gè)地址值,而無須復(fù)制全部需要處理數(shù)據(jù),所以節(jié)約存放空間并提升效率。

⑵因?yàn)橹髡{(diào)函數(shù)和被調(diào)函數(shù)是在相同內(nèi)存區(qū)域上對數(shù)據(jù)進(jìn)行操作,所以能夠?qū)崿F(xiàn)數(shù)據(jù)同時(shí)更新。第37頁三、多維數(shù)組能夠做函數(shù)參數(shù)多維數(shù)組元素能夠做實(shí)參多維數(shù)組名能夠做參數(shù)說明:⑴形參數(shù)組定義時(shí)必須指定第二維大小如:intarray[3][10];或intarray[][10];但intarray[3][];╳和intarray[][];╳⑵實(shí)參數(shù)組能夠大于形參數(shù)組如:實(shí)參數(shù)組定義為:intarray[5][10];形參數(shù)組定義為:intarray[3][10];

這時(shí)形參數(shù)組只取實(shí)參數(shù)組一部分,其余部分不起作用。第38頁8.6函數(shù)嵌套調(diào)用(Nestingcalls)

嵌套調(diào)用(Nestingcalls):在調(diào)用一個(gè)函數(shù)過程中,該函數(shù)又調(diào)用其它函數(shù)。嵌套定義(Nestingdefinition):在定義一個(gè)函數(shù)時(shí),該函數(shù)體內(nèi)包含另一個(gè)函數(shù)定義。

C語言不能嵌套定義,但能夠嵌套調(diào)用。在調(diào)用一個(gè)函數(shù)過程中,又調(diào)用另一個(gè)函數(shù)。第39頁main函數(shù)調(diào)用A函數(shù)結(jié)束A函數(shù)調(diào)用B函數(shù)B函數(shù)192873456第40頁[例8.6]用弦截法求方程根

本例較復(fù)雜,重點(diǎn)是了解怎樣將復(fù)雜問題分解,然后再整合,最終處理問題。x2,f(x2)x1,f(x1)x,f(x)

數(shù)學(xué)函數(shù)(公式)為:y=f(x)=x3-5x+16x-80=0問題可轉(zhuǎn)化為:求曲線與x軸交點(diǎn)x坐標(biāo)1.解題方法:⑴在曲線上取兩點(diǎn)P和Q坐標(biāo)為(x1,f(x1))和(x2,f(x2)),假如f(x1)和f(x2)符號相反,則(x1,x2)區(qū)間內(nèi)必有一根,反之,改變x1和x2值,直到f(x1)和f(x2)異號為止。第41頁⑵求連接P和Q點(diǎn)線段與x軸交點(diǎn)x。x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1))⑶假如f(x)和f(x1)符號相同,(x,x2)區(qū)間內(nèi)必有一根,此時(shí)將x作為新x1。假如f(x)和f(x2)符號相同,(x1,x)區(qū)間內(nèi)必有一根,此時(shí)將x作為新x2。⑷重復(fù)步驟⑵和⑶,不??s小(x1,x2)距離,同時(shí)f(x)越來越趨于0,直到|f(x)|<ε。2.程序設(shè)計(jì):函數(shù)f(x):求x3-5x2+16x-80函數(shù)xpoint(x1,x2):求(x1,f(x1))和(x2,f(x2))連線與x軸交點(diǎn)x。函數(shù)root(x1,x2):求(x1,x2)區(qū)間內(nèi)根。第42頁程序流程圖:求f(x)函數(shù)流程圖:開始實(shí)參值傳給形參x函數(shù)值y=x3-5x2+16x-80

返回/*定義f函數(shù)源程序*/floatf(floatx){floaty;y=x*(x*(x-5.0)+16.0)-80.0;return(y);}求xpoint(x1,x2)函數(shù)流程圖:開始實(shí)參值傳給形參x1,x2x=(x1*f(x2)-x2*f(x1))/(f(x2-f(x1)

返回/*定義xpoint函數(shù)源程序*/floatxpoint(floatx1,floatx2){floatx;x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));return(x);}第43頁求root(x1,x2)函數(shù)流程圖:開始實(shí)參值傳給形參x1,x2求y1=f(x1)

返回求x=xpoint(x1,x2)

;y=f(x)y*y1>0y1=y

;x1=xx2=x是否fabs(y)≥ε是否/*定義root函數(shù)源程序*/floatroot(floatx1,floatx2){floatx,y,y1;y1=f(x1);do{x=xpoint(x1,x2);y=f(x);if(y*y1>0){y1=y;x1=x;}elsex2=x;}while(fabs(y)>=0.0001);return(x);}第44頁主函數(shù)流程圖:開始輸入x1,x2f1=f(x1),f2=f(x2)f1*f2≥0是x=root(x1,x2)否輸出x結(jié)束main(){floatf(floatx);floatxpoint(floatx1,floatx2);//函數(shù)申明floatroot(floatx1,floatx2);//函數(shù)申明

floatx1,x2,f1,f2,x;do{printf(“inputx1,x2:\n”);scanf(“%f,%f”,&x1,&x2);f1=f(x1);f2=f(x2);}while(f1*f2>=0);x=root(x1,x2);printf(“Arootis%8.4f”,x);}注意:因用到庫函數(shù)fabs,故應(yīng)在文件開頭加上:#include“math.h”第45頁main輸出根x結(jié)束調(diào)用rootroot函數(shù)xpoint函數(shù)f函數(shù)調(diào)用xpoint調(diào)用f11321231141059678上題函數(shù)嵌套調(diào)用關(guān)系:第46頁8.7函數(shù)遞歸調(diào)用(recursion)

定義:

Recursionisafunctioncallsitself(在調(diào)用一個(gè)函數(shù)過程中直接或間接地調(diào)用該函數(shù)本身)直接遞歸調(diào)用間接遞歸調(diào)用第47頁說明:不應(yīng)出現(xiàn)無終止遞歸調(diào)用,所以,應(yīng)該給定一個(gè)限制遞歸次數(shù)條件。遞歸調(diào)用對應(yīng)普通算法:f(x)=終了公式(Terminatedequation)遞歸公式(Recursionequation)遞歸函數(shù)執(zhí)行過程:遞歸調(diào)用:記住此次現(xiàn)場,遞歸調(diào)用。終了調(diào)用:返回上次調(diào)用現(xiàn)場。第48頁例:用遞歸法求n!算法:f(n)=1(n=1)f(n-1)*n(n>1)main(){intn,f;printf(“Inputn:”);scanf(“%d”,&n);f=jx(n);printf("\nn!=%d",f);}intjx(intn){intf;if(n==1)f=1;elsef=jx(n-1)*n;returnf;}第49頁main輸出f=6結(jié)束調(diào)用jx(3)Jx(n)函數(shù)Jx(n)函數(shù)Jx(n)函數(shù)調(diào)用Jx(2)調(diào)用jx(1)Jx(3)=jx(2)*3Jx(3)=jx(2)*3=1*2*3Jx(2)=jx(1)*2=1*2Jx(2)=jx(1)*2上題函數(shù)嵌套調(diào)用關(guān)系:f=1Jx(1)=1第50頁8.8Localvariablesandglobalvariables

(局部變量和全局變量)

一、局部變量(Localvariables)定義:在函數(shù)內(nèi)部或復(fù)合語句內(nèi)部定義變量,稱作局部變量。(bedefinedinsideafunctionoranestedblock)作用域:函數(shù)內(nèi)或復(fù)合語句(NestedBlock)內(nèi)。注意:⑴主函數(shù)main定義變量只在主函數(shù)中有效,主函數(shù)不能使用其它函數(shù)定義變量。⑵不一樣函數(shù)中同名變量互不影響。⑶形參也是局部變量。

第51頁例1:voidfunction1(void) voidfunction2(void); main() { intm=1000; function2(); printf(“%d\n”,m); }/*第三次輸出*/ voidfunction1(void) { intm=10; printf(“%d\n”,m); }/*第一次輸出*/ voidfunction2(void) { intm=100; function1(); printf(“%d\n”,m); }/*第二次輸出*/

運(yùn)行結(jié)果:10

100

1000

第52頁例2:

main(){inta=20,b=10;….{inta=0;intc=a+b;a、b在此

…c在此范圍范圍內(nèi)有效內(nèi)有效}b=a;}運(yùn)行結(jié)果:a=20

b=20

c=10

第53頁二、全局變量(globalvariables)定義:在函數(shù)外部定義變量稱作全局變量(也稱外部變量)。(Thevariableswhicharedeclaredoutsideallfunctionsarereferredtoasglobalvariables

orexternalvariables)

作用域:可認(rèn)為本文件中全部函數(shù)公用。Canbequotedbyallfunctionsinthisfile.注意:⑴從定義變量位置開始到本文件結(jié)束,這段程序中函數(shù)可直接使用外部變量。⑵假如在定義點(diǎn)之前函數(shù)想使用外部變量,則應(yīng)該在該函數(shù)中用關(guān)鍵字extern作“外部變量”說明。第54頁intp=1,q=5;//全局變量floatf1(inta)/*定義函數(shù)f1*/{intb,c;…}charc1,c2;//全局變量charf2(intx,inty)/*定義函數(shù)f2*/{inti,j;…}voidmain()/*主函數(shù)*/{intm,n;…}全局變量 p,q作用范圍全局變量c1,c2作用范圍第55頁externc2;intp=1,q=5;//全局變量floatf1(inta)/*定義函數(shù)f1*/{intb,c;…}charc1,c2;//全局變量charf2(intx,inty)/*定義函數(shù)f2*/{inti,j;…}voidmain()/*主函數(shù)*/{intm,n;…}全局變量 p,q,c2作用范圍全局變量c1作用范圍第56頁intp=1,q=5;//全局變量floatf1(inta)/*定義函數(shù)f1*/{intb,c;…}charc1,c2;//全局變量charf2(intx,inty)/*定義函數(shù)f2*/{inti,j;intp=3,q=9;…}voidmain()/*主函數(shù)*/{intm,n;…}全局變量 p,q作用范圍全局變量c1,c2作用范圍第57頁從程序設(shè)計(jì)觀點(diǎn)看使用全局變量

:優(yōu)點(diǎn):(1)增加了函數(shù)間數(shù)據(jù)聯(lián)絡(luò)同一文件中一些函數(shù)引用全局變量,當(dāng)某個(gè)函數(shù)中改變了全局變量值,其它函數(shù)中全局變量值也隨之改變。(2)函數(shù)能夠得到多個(gè)返回值。(3)全局變量在程序全部執(zhí)行過程中都占用存放單元。⑶假如在同一源文件中,全局變量和局部變量同名,則在局部變量作用范圍內(nèi),全局變量不起作用。第58頁⑴全局變量在程序全部執(zhí)行過程中都占 用存放單元。⑵使用全局變量不符合程序設(shè)計(jì)中要求模塊 間“強(qiáng)內(nèi)聚性、弱耦合性”標(biāo)準(zhǔn)。⑶使用全局變量過多,會降低程序可讀性 和可維護(hù)性。缺點(diǎn):第59頁8.9變量存放類別(storageclass)一、Staticstorageanddynamicstorage靜態(tài)存放方式:程序運(yùn)行期間分配固定存放空間方式(fixedmemory)動(dòng)態(tài)存放方式:程序運(yùn)行期間依據(jù)需要進(jìn)行動(dòng)態(tài)分配存放空間方式(changeablememory)程序區(qū)靜態(tài)存放區(qū)動(dòng)態(tài)存放區(qū)全局變量,局部靜態(tài)變量形式參數(shù)局部變量(自動(dòng))函數(shù)調(diào)用現(xiàn)場保護(hù)和返回地址第60頁二、Staticvariablesanddynamicvariables靜態(tài)存放變量:用靜態(tài)存放方式存放變量。

特點(diǎn):在靜態(tài)存放區(qū)分配存放單元,整個(gè)程序運(yùn)行期間都不釋放。動(dòng)態(tài)存放變量:用動(dòng)態(tài)存放方式存放變量。

特點(diǎn):函數(shù)開始調(diào)用時(shí)為變量分配存放空間,函數(shù)結(jié)束時(shí)釋放這些空間。一個(gè)程序兩次調(diào)用同一函數(shù),其中同一個(gè)局部變量內(nèi)存地址可能不一樣。第61頁C語言變量屬性:數(shù)據(jù)類型存放類型存放類型:數(shù)據(jù)在內(nèi)存中存放方式。即靜態(tài)存放方式和動(dòng)態(tài)存放方式。經(jīng)過存放分類符來表示。三、變量屬性及其定義數(shù)據(jù)類型:整型,實(shí)型,字符型……變量按存放類別分類:(storageclass)automaticvariables(自動(dòng)變量)register

variables

(存放器變量)static

variables

(靜態(tài)變量)extern

variables

(外部變量)第62頁上述變量屬性:作用域(Scope),生存期(Longevity),可見性(Visibility)作用域:變量能夠使用程序范圍(active)生存期:變量在程序執(zhí)行一段時(shí)間內(nèi)保持存活狀態(tài)(alive)可見性:變量可從內(nèi)存中存取特征(accessible)定義變量普通形式:存放分類符類型標(biāo)識符變量名;如:autointa;staticintb;registerintd;Storage-classtypevariables_name;第63頁1.automatic

variables(自動(dòng)變量)四、變量存放類型automaticvariablescomesintobeingandendsinthefunctionatwhichtheyaredeclared.自動(dòng)變量在它們所使用函數(shù)中申明,隨函數(shù)調(diào)用而生成,而當(dāng)退出函數(shù)時(shí)自動(dòng)終止,因而得名自動(dòng)變量。自動(dòng)變量是它們所在函數(shù)局部變量,因而被稱為局部變量或內(nèi)部變量Variablesdeclaredinsideafunctionwithoutclassspecificationareautomaticonesbydefault.函數(shù)中定義變量假如沒有存放類型申明,則隱含指定為自動(dòng)變量,數(shù)據(jù)存放在動(dòng)態(tài)存放區(qū)中,屬于動(dòng)態(tài)存放變量。程序中大多數(shù)變量屬于自動(dòng)變量第64頁說明:⑴在一個(gè)函數(shù)內(nèi)假如局部變量不作存放類型說明,均為自動(dòng)變量;⑵形式參數(shù)缺省存放類型是auto,但不能將auto加在形參說明之前。如:intb,c=3等價(jià)于autointb,c=3;如:intmax(autointx,autointy){……}╳自動(dòng)變量定義為autointa;第65頁2.static

variables

(靜態(tài)變量)Thelongevitylastfromitsdefinitionuntilltheprogramended.靜態(tài)變量生存期為從其定義開始到整個(gè)程序結(jié)束Staticcandeclarelocalvariablesandexternalones.static可用于說明靜態(tài)局部變量和靜態(tài)全局變量第66頁靜態(tài)局部變量(Staticlocalvariables)

(1)definition:insidethefunction定義:在函數(shù)內(nèi)部定義(2)scope:inthefunctionatwhichitwasdeclared.

作用域:定義它函數(shù)內(nèi)部。(3)longevity:Entireprogram(Global)生存期:存放在靜態(tài)存放區(qū),整個(gè)程序運(yùn)行期間都不釋放。

而自動(dòng)變量在函數(shù)調(diào)用結(jié)束后即釋放。第67頁(5)假如靜態(tài)局部變量不賦初值,編譯時(shí)自動(dòng)賦0。

而自動(dòng)變量不賦初值,其值不確定。提醒:盡可能少用靜態(tài)局部變量!比如:打印1!~5!intfac(intn){staticintf=1;f=f*n;return(f)}main(){inti;for(i=1;i<=5;i++)printf(“%d!=%d\n”,i,fac(i));}(4)usage:initializedwhencomplied,butnolongerinitialized

whencallingit.使用:編譯時(shí)賦初值,每次調(diào)用時(shí)不再賦初值,只保留調(diào)用結(jié)束時(shí)變量值。

而自動(dòng)變量調(diào)用一次,重新賦值一次。第68頁靜態(tài)全局變量(Staticglobalvariables)

(1)declaration:outsideallfunctions定義:在全部函數(shù)之外定義(2)scope:canbequotedbyallfunctionsinthefileatwhichitwasdeclared,butcan’tbequotedbyotherfiles.作用域:能夠被本程序文件中全部函數(shù)使用,而不能被其它程序文件引用。(3)longevity:Entireprogram(Global)生存期:整個(gè)程序運(yùn)行期間,編譯時(shí)分配在靜態(tài)存放區(qū)(不論是否加static說明)。(4)靜態(tài)全局變量與普通全局變量區(qū)分: 靜態(tài)全局變量只能被它定義時(shí)所在文件使用,而普通全局變量能被其它文件使用。第69頁3.register

variables

(存放器變量)存放器:它是CPU中運(yùn)算器組成部分,用來暫時(shí)存放數(shù)據(jù)存放裝置。存放器變量:直接放置在運(yùn)算器存放器中變量稱為存放器變量。引入存放器變量是為了提升“存取”速度。⑵存放器變量屬于動(dòng)態(tài)存放變量,但并不放在動(dòng)態(tài)存放區(qū)中,它放在存放器中。⑴register只適合用于說明局部變量;比如:registerinti;定義了i是存放器變量,其數(shù)據(jù)類型是整型。第70頁說明:⑶存放器變量作用域與自動(dòng)變量相同。⑵因?yàn)橛?jì)算機(jī)存放器數(shù)目有限,不宜定義太多存放器變量。不一樣系統(tǒng)允許使用存放器個(gè)數(shù)是不一樣。⑴只有局部變量(非靜態(tài))和形式參數(shù)能夠作為存放器變量。比如:registerstaticinti;╳第71頁4.external

variables

(外部變量)⑴Longevityandscope:Externalvariablesarealiveandactiveduringtheentireprogram,andareknownasglobalvariable.生存期與作用域:在整個(gè)程序運(yùn)行期間都“存活”和“有效”變量稱為外部變量;也稱為全局變量。⑵Insideamulti-fileprogram:在多個(gè)源程序文件組成程序中第72頁/*文件A.c*/inta;main(){……}比如:/*文件B.c*/externinta;power(){……}也能夠?qū)懗蒭xterna;假如在B文件中引用在A文件中定義全局變量(該

全局變量不是static變量),則需要在B文件中,用關(guān)鍵字extern說明。IfBfilewantexcerptavariabledefinedinAfile,Bfilemustdeclareitasextern.Thatexterndeclarationdoesnotallocatestoragespaceforvariables.第73頁若在A文件中全局變量是靜態(tài)外部變量(static),則即使在B文件中用extern對其說明,也無法在A文件中使用該全局變量。/*文件A.c*/staticinta;main(){……}比如:/*文件B.c*/externinta;power(){……}無法使用變量a第74頁(3)在同一個(gè)源文件中,全局變量作用域之外函數(shù)中使用該全局變量時(shí),也需用extern對其說明。Intheprogramsegmentbelowleft,themaincannotaccessthevariableyasithasbeendeclaredafterthemainfunction.Theproblemcanbesolvedbydeclaringthevariablewiththestorageclassextern.main(){inty;…}inty=5;func1(){y=y+1;}main(){externinty;…}inty=5;func1(){……}main(){inti;voidprint_out();externfloatheight[];…print_out();}voidprint_out()//函數(shù)申明{externfloatheight[];……}floatheight[SIZE];第75頁8.10內(nèi)部函數(shù)和外部函數(shù)

一、內(nèi)部函數(shù)(LocalFunction)定義:假如一個(gè)函數(shù)只能被本文件中其它函數(shù)調(diào)用,稱為內(nèi)部函數(shù)(又稱靜態(tài)函數(shù))。Wewouldlikeaparticularfunctiontobecalledonlybythefunctioninthefileatwhichitisdeclared,otherthantobecalledbyanyfunctionsinotherfiles.Thiscanbeaccomplishedbydeclaringthefunctionwiththestorageclassstatic.格式:static類型標(biāo)識符函數(shù)名(形參表)staticfunction-typefunction_name(argumentlist)第76頁比如:staticintfun(a,b){..….}作用:函數(shù)作用域限于所在文件,不一樣文件中同名函數(shù)互不干擾,便于程序局部化。第77頁二、外部函數(shù)(ExternalFunction)定義:假如一個(gè)函數(shù)允許被其它文件調(diào)用,稱為外部函數(shù)。Functionareexternalby

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論