




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第七章函數(shù)2第七章
函數(shù)教學(xué)目標(biāo):
掌握函數(shù)定義和調(diào)用的方法了解主調(diào)函數(shù)和被調(diào)函數(shù)之間實(shí)參和形參
的關(guān)系和數(shù)據(jù)傳遞規(guī)則掌握函數(shù)調(diào)用過(guò)程中不同變量的作用范圍
及存儲(chǔ)方式了解內(nèi)部函數(shù)和外部函數(shù)的用法3第七章
函數(shù)教學(xué)重點(diǎn)與難點(diǎn):熟悉函數(shù)定義和調(diào)用的用法了解主調(diào)函數(shù)和被調(diào)函數(shù)之間實(shí)參和形參
的關(guān)系和數(shù)據(jù)傳遞規(guī)則47.1函數(shù)的概念函數(shù)是指具有特定功能的獨(dú)立的一段程序。一個(gè)完整的C語(yǔ)言程序,是由一個(gè)且只能是一個(gè)主函數(shù)和其他若干個(gè)函數(shù)組成,主函數(shù)名指定為main。有了函數(shù)之后,就可以將某個(gè)常用的功能或者需要多次重復(fù)使用的一段程序預(yù)先編制成函數(shù),在使用的地方按C語(yǔ)言規(guī)定的格式調(diào)用就行了。函數(shù)的使用,能夠?qū)崿F(xiàn)模塊化程序設(shè)計(jì),達(dá)到簡(jiǎn)化設(shè)計(jì)的目的。57.1函數(shù)的概念
C語(yǔ)言的函數(shù)分為庫(kù)函數(shù)和用戶自定義函數(shù)兩種。
(1)庫(kù)函數(shù):這類函數(shù)由系統(tǒng)提供,包括最基本最通用的功能,用戶使用較廣泛。用戶只需知道函數(shù)名,按規(guī)定格式直接調(diào)用即可。
(2)用戶自定義函數(shù):庫(kù)函數(shù)中沒(méi)有而用戶需要使用的函數(shù),這類函數(shù)必須由用戶自己進(jìn)行定義。注意:不同版本的編譯系統(tǒng)提供的庫(kù)函數(shù)會(huì)有所不同,不同庫(kù)函數(shù)的頭文件也可能會(huì)不同,使用時(shí)注意查閱有關(guān)資料。使用庫(kù)函數(shù)必須在源文件的開頭用#include命令將調(diào)用的庫(kù)函數(shù)信息包含到文件中來(lái)。67.2函數(shù)的定義和調(diào)用7.2.1函數(shù)的定義
C語(yǔ)言規(guī)定,程序中使用的所有函數(shù)都必須進(jìn)行定義,以保證編譯系統(tǒng)正確識(shí)別該函數(shù)并實(shí)現(xiàn)它的功能。
函數(shù)的定義應(yīng)包含:(1)函數(shù)名。供編譯系統(tǒng)識(shí)別,并供主調(diào)函數(shù)調(diào)用。(2)函數(shù)返回值及類型。以確定函數(shù)調(diào)用結(jié)束后帶回來(lái)的數(shù)值及其類型。(3)參數(shù)的名字及類型。供函數(shù)調(diào)用時(shí)傳遞數(shù)據(jù),若無(wú)參數(shù)可缺省。(4)函數(shù)體。用以實(shí)現(xiàn)函數(shù)功能的具體的程序,如為空函數(shù)可缺省。(5)如有需要,還需指定函數(shù)的類型。7.2函數(shù)的定義和調(diào)用7函數(shù)定義的格式為:函數(shù)存儲(chǔ)類型
函數(shù)返回值類型
函數(shù)名(形參列表){
函數(shù)體}例如,定義一個(gè)求和函數(shù)sum:intsum(intx,inty)/*函數(shù)名為sum,x、y為形參*/{intz=x+y;/*函數(shù)體的功能為計(jì)算x+y*/return(z);/*調(diào)用結(jié)束后帶回運(yùn)算結(jié)果z*/}7.2.1函數(shù)的定義8說(shuō)明:(1)程序的執(zhí)行從main()函數(shù)開始,調(diào)用其他函數(shù)后回到main()函數(shù),在main()函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。(2)函數(shù)的存儲(chǔ)類型詳見(jiàn)7.7。(3)函數(shù)返回值類型是指調(diào)用函數(shù)結(jié)束后帶回來(lái)的數(shù)值類型。(4)函數(shù)名的命名,應(yīng)遵循C語(yǔ)言中關(guān)于標(biāo)識(shí)符的命名規(guī)則。(5)形參可有可無(wú)。若無(wú)形參,函數(shù)名后的()不能省略,()內(nèi)或空缺或?yàn)関oid;若有形參,形參的格式為:(形參類型
形參名稱),有多個(gè)形參,則形參間以逗號(hào)隔開。(6)函數(shù)體允許缺省,如果缺省該函數(shù)稱為空函數(shù)??蘸瘮?shù)的運(yùn)用一般是為將來(lái)擴(kuò)充功能預(yù)留位置。7.2.1函數(shù)的定義97.2.2函數(shù)的調(diào)用
函數(shù)的調(diào)用指的是一個(gè)函數(shù)(稱之為主調(diào)函數(shù))在執(zhí)行中暫停,轉(zhuǎn)而執(zhí)行另一個(gè)函數(shù)(稱之為被調(diào)函數(shù))的過(guò)程。
被調(diào)函數(shù)執(zhí)行完畢,返回到主調(diào)函數(shù)暫停處繼續(xù)執(zhí)行,稱為函數(shù)調(diào)用返回。
C語(yǔ)言中調(diào)用函數(shù)的一般形式為:
函數(shù)名(實(shí)參列表)或
函數(shù)名(實(shí)參列表);注意:函數(shù)調(diào)用時(shí),()中的實(shí)參應(yīng)與函數(shù)定義時(shí)()中的形參在數(shù)量、位置、類型上一一對(duì)應(yīng)。7.2.2函數(shù)的調(diào)用10函數(shù)的三種調(diào)用方式:1.函數(shù)表達(dá)式
函數(shù)的調(diào)用出現(xiàn)在表達(dá)式中,則函數(shù)的返回值參與表達(dá)式的運(yùn)算。此時(shí)函數(shù)調(diào)用不能有分號(hào)。2.函數(shù)參數(shù)
函數(shù)的調(diào)用出現(xiàn)在實(shí)參的位置上,則函數(shù)的返回值作為該位置上的實(shí)參使用。同樣,這時(shí)的函數(shù)調(diào)用也不能有分號(hào)。3.函數(shù)語(yǔ)句
函數(shù)調(diào)用作為單獨(dú)的一條語(yǔ)句出現(xiàn),不需要函數(shù)返回值,只要求函數(shù)完成一定的操作。作為語(yǔ)句,函數(shù)調(diào)用必須有分號(hào)。7.2.2函數(shù)的調(diào)用117.2.2函數(shù)的調(diào)用【例7.1】比較從鍵盤輸入的兩個(gè)整數(shù)的大小,并顯示其中的大數(shù)。#include<stdio.h>voidmax(intx,inty)/*定義一個(gè)max函數(shù)*/{intz;/*定義一個(gè)整型變量z*/z=x>y?x:y;/*對(duì)變量z賦值,取x和y中的大數(shù)*/printf("較大數(shù)是:%d",z);/*顯示z*/}voidmain(){inta,b;printf("請(qǐng)輸入任意兩個(gè)整數(shù):");scanf("%d,%d",&a,&b);max(a,b);/*調(diào)用自定義函數(shù)max*/printf("\n");/*光標(biāo)換行*/}程序運(yùn)行結(jié)果:請(qǐng)輸入任意兩個(gè)整數(shù):3,9↙較大數(shù)是:9127.2.3函數(shù)說(shuō)明如果函數(shù)先定義后調(diào)用,這種情況不需要進(jìn)行函數(shù)說(shuō)明。C語(yǔ)言也允許函數(shù)先調(diào)用后定義,主調(diào)函數(shù)在調(diào)用函數(shù)前必須進(jìn)行函數(shù)說(shuō)明。
函數(shù)說(shuō)明的作用是把函數(shù)名、函數(shù)參數(shù)的數(shù)量和類型等相關(guān)信息告之編譯系統(tǒng),供編譯系統(tǒng)識(shí)別其為函數(shù)而不是常量、變量、數(shù)組名等其他對(duì)象。7.2.3函數(shù)說(shuō)明137.2.3函數(shù)說(shuō)明
函數(shù)說(shuō)明的一般格式:
函數(shù)存儲(chǔ)類型
函數(shù)返回值類型
函數(shù)名(形參列表);
函數(shù)說(shuō)明就是在函數(shù)定義中的第一行后面加上分號(hào)即可。
注意:
函數(shù)存儲(chǔ)類型、函數(shù)返回值類型、函數(shù)名應(yīng)與其后定義的函數(shù)一致。例如:函數(shù)max是先調(diào)用后定義的,則調(diào)用前必須進(jìn)行的函數(shù)說(shuō)明為:voidmax(intx,inty);
147.3函數(shù)間的數(shù)據(jù)傳遞
在調(diào)用有參函數(shù)時(shí),主調(diào)函數(shù)和被調(diào)函數(shù)之間需要有數(shù)據(jù)的傳遞關(guān)系。
函數(shù)時(shí)函數(shù)名后面括號(hào)中的變量名稱為“形式參數(shù)”,簡(jiǎn)稱“形參”;而主調(diào)函數(shù)在調(diào)用函數(shù)時(shí),函數(shù)名后面括號(hào)中的參數(shù)稱為“實(shí)際參數(shù)”,簡(jiǎn)稱“實(shí)參”。
函數(shù)間的數(shù)據(jù)傳遞方式主要有傳值方式和傳址方式。157.3.1傳值方式
在調(diào)用函數(shù)過(guò)程中,系統(tǒng)把實(shí)參的值傳遞給被調(diào)用函數(shù)的形參,使形參從實(shí)參中得到一個(gè)值。該值在函數(shù)調(diào)用期間有效,參加被調(diào)函數(shù)中的運(yùn)算。所需要的運(yùn)算結(jié)果只能由return語(yǔ)句帶回到主調(diào)函數(shù)。7.3.1傳值方式16注意:(1)只能是按位置對(duì)應(yīng)關(guān)系由實(shí)參向形參傳遞數(shù)據(jù),這種傳遞是單向進(jìn)行的。實(shí)參無(wú)論使用哪種形式,都必須具有確定的值。(2)實(shí)參與形參的類型應(yīng)一致或能夠賦值兼容。(3)在被調(diào)用函數(shù)未被調(diào)用時(shí),形參不占內(nèi)在的存儲(chǔ)單元。只有在函數(shù)調(diào)用過(guò)程中,形參才被臨時(shí)分配內(nèi)存單元,調(diào)用結(jié)束,形參所占單元即被釋放。而實(shí)參單元保留并維持原值。所以形參值的改變,不會(huì)影響對(duì)應(yīng)實(shí)參的值。(4)形參屬于局部變量。(5)實(shí)參和形參因?qū)儆诓煌鎯?chǔ)單元,所以既可以同名,也可以不同名。7.3.1傳值方式177.3.1傳值方式【例7.2】將兩個(gè)整數(shù)自增后求和。#include<stdio.h>voidmain(){inta=2,b=3,s;intsum(intx,inty);/*函數(shù)說(shuō)明*/s=sum(a,b);/*調(diào)用函數(shù)求和*/printf("a=%d,b=%d,s=%d\n",a,b,s);}intsum(intx,inty)/*定義求和函數(shù)sum*/{intz=++x+(++y);printf("x=%d,y=%d\n",x,y);/*顯示形參x、y*/return(z);/*求和結(jié)果作為返回值*/}程序運(yùn)行結(jié)果:x=3,y=4a=2,y=3,s=7187.3.2傳址方式
傳址方式是在主調(diào)函數(shù)和被調(diào)函數(shù)間進(jìn)行地址的傳遞,傳送給被調(diào)用函數(shù)形參的不是數(shù)據(jù),而是地址常量。
傳址方式一般以數(shù)組名或指針作為形參,實(shí)參則為數(shù)組的首地址,這樣形參和實(shí)參數(shù)組(或指針)就占用同一存儲(chǔ)地址,具有相同的首地址。如果在被調(diào)用函數(shù)中修改了元素值,調(diào)用函數(shù)后實(shí)參數(shù)組元素值也相應(yīng)發(fā)生變化。
傳值方式只能帶回一個(gè)返回值,傳址方式則能將多個(gè)返回值帶給主調(diào)函數(shù)。7.3.2傳址方式19【例7.3】分析下列程序執(zhí)行結(jié)果。#include<stdio.h>a(inty[]);/*函數(shù)說(shuō)明*/voidmain(){staticintx[4]={1,2,3,4};printf("調(diào)用前數(shù)組元素值:");printf("%d,%d,%d,%d\n",x[0],x[1],x[2],x[3]);a(x);/*調(diào)用函數(shù)a*/printf("調(diào)用后數(shù)組元素值:");printf("%d,%d,%d,%d\n",x[0],x[1],x[2],x[3]);/*顯示調(diào)用函數(shù)a后數(shù)組各元素值*/}a(inty[])/*定義函數(shù)a*/{intn;for(n=0;n<4;n++)y[n]=y[n]-1;}7.3.2傳址方式程序運(yùn)行結(jié)果:調(diào)用前數(shù)組元素值:1,2,3,4調(diào)用后數(shù)組元素值:0,1,2,320注意:用數(shù)組元素作實(shí)參時(shí),向形參傳遞的是數(shù)組元素的值,這種參數(shù)傳遞為傳值方式;而用數(shù)組名作實(shí)參時(shí),向形參傳遞的是數(shù)組的首地址,這種參數(shù)傳遞是傳址方式。(2)用數(shù)組名作參數(shù),應(yīng)在主調(diào)函數(shù)和被調(diào)函數(shù)中分別定義數(shù)組。(3)實(shí)參數(shù)組和形參數(shù)組類型必須一致,否則結(jié)果將會(huì)出錯(cuò)。(4)C語(yǔ)言編譯系統(tǒng)不檢查形參數(shù)組的大小,只是在調(diào)用函數(shù)時(shí)將實(shí)參數(shù)組的首地址傳給形參數(shù)組名,所以形參數(shù)組可以不指定大小。
7.3.2傳址方式217.4.1函數(shù)的嵌套調(diào)用
在C語(yǔ)言中,函數(shù)之間的相互調(diào)用稱為嵌套調(diào)用。
函數(shù)嵌套調(diào)用過(guò)程如圖所示:7.4函數(shù)的嵌套與遞歸
22【例7.4】用函數(shù)嵌套調(diào)用方式,找出輸入的3個(gè)整數(shù)中的最大數(shù)。#include<stdio.h>voidmain(){intmax3(inta,intb,intc);/*函數(shù)說(shuō)明*/inta,b,c,max;printf("請(qǐng)輸入3個(gè)整數(shù):");scanf("%d,%d,%d",&a,&b,&c);max=max3(a,b,c);/*將函數(shù)max3的返回值賦給變max*/printf("最大數(shù)為:%d\n",max);}7.4.1函數(shù)的嵌套調(diào)用23intmax3(inta,intb,intc){intmax2(inta,intb);/*函數(shù)說(shuō)明*/intm;m=max2(a,b);/*嵌套調(diào)用函數(shù)max2*/m=max2(m,c);return(m);/*將3個(gè)數(shù)中的最大數(shù)作為返回值*/}intmax2(inta,intb){if(a>=b)return(a);elsereturn(b);}7.4.1函數(shù)的嵌套調(diào)用程序運(yùn)行結(jié)果:請(qǐng)輸入3個(gè)整數(shù):32,56,28↙最大數(shù)為:56247.4.2函數(shù)的遞歸調(diào)用
在調(diào)用一個(gè)函數(shù)的過(guò)程中直接或間接地調(diào)用該函數(shù)本身稱為函數(shù)的遞歸調(diào)用。
直接調(diào)用本函數(shù),就是在調(diào)用函數(shù)a的過(guò)程中,又要調(diào)用a函數(shù)本身,如圖所示。
7.4.2函數(shù)的遞歸調(diào)用
25
間接調(diào)用本函數(shù),就是在調(diào)用函數(shù)a的過(guò)程中要調(diào)用b函數(shù),而在調(diào)用b函數(shù)過(guò)程中又要調(diào)用a函數(shù),如圖所示。7.4.2函數(shù)的遞歸調(diào)用
26【例7.5】用遞歸方法求n!。#include<stdio.h>voidmain(){intfac(intn);/*函數(shù)說(shuō)明*/intn;inty;printf("請(qǐng)輸入1個(gè)整數(shù):");scanf("%d",&n);y=fac(n);/*調(diào)用函數(shù)fac()*/printf("%d!=%d\n",n,y);}7.4.2函數(shù)的遞歸調(diào)用
27intfac(intn)/*定義函數(shù)fac()*/{intf;if(n<0)printf("n<0,數(shù)據(jù)錯(cuò)誤");/*負(fù)數(shù)為輸入錯(cuò)誤*/elseif(n==0‖n==1)f=1;/*0和1的階乘為1*/elsef=fac(n-1)*n;/*大于1時(shí)遞歸調(diào)用計(jì)算階乘*/return(f);}強(qiáng)調(diào):函數(shù)遞歸調(diào)用的過(guò)程中,必須要有終止遞歸的條件,否則會(huì)出現(xiàn)函數(shù)不停地調(diào)用自身而出現(xiàn)死循環(huán)。并且可能由于無(wú)限占用內(nèi)存而造成系統(tǒng)崩潰的嚴(yán)重后果。7.4.2函數(shù)的遞歸調(diào)用
程序運(yùn)行結(jié)果:請(qǐng)輸入1個(gè)整數(shù):5↙5!=12028
變量的作用域,指的是變量的有效范圍。C語(yǔ)言中,每一個(gè)變量都有一個(gè)作用域的問(wèn)題。在不同位置定義的變量,作用域也有所不同。
從變量的作用域來(lái)劃分,變量分為局部變量和全局變量。7.5變量的作用域297.5.1局部變量7.5.1局部變量
局部變量是指在一定范圍內(nèi)有效的變量,以下各位置定義的變量均屬于局部變量:(1)在函數(shù)體內(nèi)定義的變量,只在本函數(shù)范圍內(nèi)有效;(2)在復(fù)合語(yǔ)句內(nèi)定義的變量,只在本復(fù)合語(yǔ)句范圍內(nèi)有效;(3)形式參數(shù),只在所在的函數(shù)范圍內(nèi)有效。說(shuō)明:由于局部變量的作用域不同,所以不同函數(shù)和不同的復(fù)合語(yǔ)句中的局部變量可以同名。30
7.5.2全局變量
程序的編譯單位是源程序文件,一個(gè)源文件由一個(gè)或多個(gè)函數(shù)組成。在函數(shù)內(nèi)定義的變量是局部變量,在函數(shù)之外定義的變量則是外部變量,外部變量就是全局變量。
全局變量的作用域不僅僅局限于一個(gè)函數(shù),而是供多個(gè)函數(shù)共用,一般情況下,其有效范圍從全局變量定義的位置開始到本源程序結(jié)束為止。7.5.2全局變量31注意:(1)函數(shù)之外定義的變量,都屬于全局變量。各變量定義的位置不同,作用域也不同。(2)在一個(gè)函數(shù)中既可以使用本函數(shù)中的局部變量,也可以使用有效的全局變量。(3)全局變量允許與局部變量同名。當(dāng)局部變量有效時(shí),與之同名的全局變量將在該范圍內(nèi)無(wú)效。(4)利用全局變量可以增加各個(gè)函數(shù)間的數(shù)據(jù)聯(lián)系渠道,因?yàn)槿绻谝粋€(gè)函數(shù)中改變了全局變量的值,就會(huì)影響其它函數(shù)的執(zhí)行結(jié)果。但另一方面,全局變量的使用會(huì)使函數(shù)的通用性降低,可移植性和可讀性變差,因此要限制使用全局變量。7.5.2全局變量32【例7.6】有一個(gè)一維數(shù)組,存放有10名學(xué)生成績(jī),寫一個(gè)函數(shù),當(dāng)主函數(shù)調(diào)用此函數(shù)后,能求出平均分、最高分和最低分。#include<stdio.h>floatmax=0,min=0;/*定義全局變量max和min*/floataverage(floata[],intn)/*定義函數(shù)average*/{inti;floataver,sum=a[0];/*定義局部變量aver和sum*/max=min=a[0]/*全局變量max和min初始化*/for(i=1;i<n;i++){if(a[i]>max)max=a[i];/*取最高分*/elseif(a[i]<min)min=a[i];/*取最低分*/sum=sum+a[i];/*求總分*/}aver=sum/n;return(aver);/*返回平均分*/}7.5.2全局變量33voidmain(){floataver,score[10];inti;printf("請(qǐng)輸入10名學(xué)生成績(jī):");for(i=0;i<10;i++)scanf("%f",&score[i]);ave=average(score,10);/*調(diào)用函數(shù)average求平均分*/printf("最高分為:%6.2f\最低分為:%6.2f\平均分為:%6.2f\n",max,min,ave);}7.5.2全局變量程序運(yùn)行結(jié)果:請(qǐng)輸入10名學(xué)生成績(jī):85607988966598817380↙最高分為:98.00最低分為:60.00平均分為:80.50347.6.1靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式
從變量值存在的時(shí)間來(lái)分,變量的存儲(chǔ)方式分為兩種:
(1)靜態(tài)存儲(chǔ)方式;(2)動(dòng)態(tài)存儲(chǔ)方式。
靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間由系統(tǒng)分配固定的存儲(chǔ)空間的方式;
動(dòng)態(tài)存儲(chǔ)方式則是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)分配存儲(chǔ)空間的方式。7.6變量的存儲(chǔ)類型357.6.1靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式
數(shù)據(jù)按照不同的存儲(chǔ)類型分別存放在靜態(tài)存儲(chǔ)區(qū)和動(dòng)態(tài)存儲(chǔ)區(qū)中。
全局變量全部存放在靜態(tài)存儲(chǔ)區(qū)中,在程序開始執(zhí)行時(shí)給全局變量分配存儲(chǔ)空間,程序執(zhí)行完畢后才釋放。在程序執(zhí)行過(guò)程中它們始終占據(jù)固定的存儲(chǔ)空間。
動(dòng)態(tài)存儲(chǔ)區(qū)中存放的數(shù)據(jù),是在函數(shù)調(diào)用開始時(shí)才分配動(dòng)態(tài)存儲(chǔ)空間,函數(shù)結(jié)束時(shí)即釋放這些空間。
數(shù)據(jù)的存儲(chǔ)類型指的是變量在內(nèi)存中的存儲(chǔ)方式,C語(yǔ)言中,變量的存儲(chǔ)類型包括四種:自動(dòng)變量(auto類型)、靜態(tài)變量(static類型)、寄存器變量(register類型)和外部變量(extern類型)。367.6.2變量的存儲(chǔ)類型1.自動(dòng)變量(auto類型)
自動(dòng)變量的數(shù)據(jù)存儲(chǔ)在動(dòng)態(tài)存儲(chǔ)區(qū)中,存儲(chǔ)空間是動(dòng)態(tài)分配的,函數(shù)調(diào)用結(jié)束時(shí)將自動(dòng)釋放所占存儲(chǔ)空間。
自動(dòng)變量定義的標(biāo)準(zhǔn)形式為:
auto數(shù)據(jù)類型
變量名列表;說(shuō)明:auto類型為系統(tǒng)默認(rèn)類型,故關(guān)鍵字auto可以省略不寫。7.6.2變量的存儲(chǔ)類型372.靜態(tài)變量(static類型)
靜態(tài)變量的數(shù)據(jù)存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū)中,在整個(gè)程序運(yùn)行期間,靜態(tài)變量分配的存儲(chǔ)空間是固定不變的。static類型既可以定義局部變量,又可以定義全局變量,其定義形式為:
static數(shù)據(jù)類型
變量名列表;
7.6.2變量的存儲(chǔ)類型38【例7.7】分析下列程序的運(yùn)行結(jié)果。#include<stdio.h>intf(inta)/*定義函數(shù)f*/{autointb=1;/*定義自動(dòng)變量b并賦初值*/staticc=5;/*定義靜態(tài)變量c并賦初值*/b=b+1;c=c+1;return(a+b+c);/*設(shè)定返回值*/}voidmain(){inta=2,i;for(i=0;i<3;i++)/*設(shè)定循環(huán)次數(shù)為3*/printf("%d\n",f(a));/*顯示調(diào)用函數(shù)f()的返回值*/}7.6.2變量的存儲(chǔ)類型程序運(yùn)行結(jié)果:101112397.6.2變量的存儲(chǔ)類型說(shuō)明:(1)靜態(tài)局部變量是在編譯時(shí)賦初值的,即只賦初值一次,在程序運(yùn)行時(shí)它已有初值。而自動(dòng)變量是在函數(shù)調(diào)用時(shí)進(jìn)行賦值的,每調(diào)用一次函數(shù)就重新賦值一次,函數(shù)調(diào)用結(jié)束后其值將不存在。(2)如果定義局部變量時(shí)沒(méi)有對(duì)其賦初值,對(duì)靜態(tài)局部變量,編譯時(shí)自動(dòng)賦初值,數(shù)值型變量的初值為0,字符變量的初值為空字符"\0";而自動(dòng)變量的初值將是一個(gè)不確定的值。(3)靜態(tài)局部變量雖然在靜態(tài)存儲(chǔ)區(qū)中分配存儲(chǔ)空間,但它仍然只能被本函數(shù)引用,而不能被其它函數(shù)引用。
如果將全局變量定義為static類型,則把該全局變量的作用域限制在本文件范圍內(nèi),其它文件將不能引用。407.6.2變量的存儲(chǔ)類型3.寄存器變量(register類型)
通常情況下,變量的值都是存放在內(nèi)存中的。由于CPU中的寄存器存取速度遠(yuǎn)高于內(nèi)存的存取速度,為提高效率,允許將局部變量的值存放到寄存器中,這種變量稱為寄存器變量。
寄存器變量的定義形式為:
register數(shù)據(jù)類型
變量名列表;417.6.2變量的存儲(chǔ)類型說(shuō)明:(1)寄存器變量的有效范圍僅限于本函數(shù)內(nèi)。(2)寄存器變量存放在寄存器中,由于計(jì)算機(jī)中寄存器數(shù)量不多,故不能定義太多的寄存器變量。(3)只有自動(dòng)變量和形式參數(shù)可以定義為寄存器變量,全局變量及靜態(tài)存儲(chǔ)的局部變量是不能定義為寄存器變量的。(4)隨著計(jì)算機(jī)性能的提高,編譯系統(tǒng)已經(jīng)能夠識(shí)別使用頻繁的變量,并自動(dòng)地將這些變量放在寄存器中而不需要程序員指定。因此現(xiàn)在實(shí)際上并沒(méi)有必要使用寄存器變量。427.6.2變量的存儲(chǔ)類型4.外部變量(extern類型):
外部變量就是在函數(shù)外部定義的全局變量,它的作用域是從變量的定義處開始,到本程序文件的結(jié)束,在其有效的作用范圍內(nèi),全局變量可以被程序中的各個(gè)函數(shù)引用。
如果程序員希望能將全局變量的作用域進(jìn)行擴(kuò)展,則可以利用extern類型加以說(shuō)明。
定義格式為:extern數(shù)據(jù)類型
變量名列表;437.6.2變量的存儲(chǔ)類型
利用extern說(shuō)明來(lái)擴(kuò)展全局變量的作用域,常見(jiàn)的有以下兩種情況:
第一種情況是在一個(gè)文件內(nèi)部擴(kuò)展全局變量的作用域。因?yàn)槿肿兞康淖饔梅秶抻诙x處到文件結(jié)束,所以在全局變量定義處之前的函數(shù)是不能引用該全局變量的。但如果用extern對(duì)該變量加以說(shuō)明,則該變量在文件中的作用域就擴(kuò)展到了對(duì)變量進(jìn)行extern說(shuō)明的位置,即全局變量的作用域?yàn)閺膃xtern說(shuō)明處開始至文件結(jié)束。
447.6.2變量的存儲(chǔ)類型
第二種情況是將一個(gè)文件中的全局變量的作用域擴(kuò)展到其它文件。
例如一個(gè)程序由兩個(gè)文件組成,兩個(gè)文件中都用到同一個(gè)外部變量a,是不能在兩個(gè)文件中各自定義外部變量a的,否則程序連接時(shí)將出現(xiàn)“重復(fù)定義”的錯(cuò)誤。
解決辦法就是在任何一個(gè)文件中定義外部變量a,而另一個(gè)文件進(jìn)行extern說(shuō)明即可,這樣就將變量a的作用域擴(kuò)展到了另一個(gè)文件。
457.6.2變量的存儲(chǔ)類型【例7.8】求3個(gè)整數(shù)中的最大數(shù)。#include<stdio.h>intmax(){externintx,y,z;/*將全局變量x、y、z的作用域擴(kuò)展至此處*/intmm=x>y?x:y;/*將x、y中值大者賦值給m*/if(z>m)m=z;/*取m與z中值大者*/return(m);/*將3個(gè)整數(shù)中的最大數(shù)作為返回值*/}intx,y,z;/*定義全局變量x、y、z*/voidmain(){printf("請(qǐng)輸入3個(gè)整數(shù):");scanf("%d%d%d",&x,&y,&z);/*鍵盤輸入3個(gè)整數(shù)*/printf("最大數(shù)是:%d\n",max());/*顯示3個(gè)整數(shù)中的最大數(shù)*/}
程序運(yùn)行結(jié)果:請(qǐng)輸入3個(gè)整數(shù):395617↙最大數(shù)是:56467.7內(nèi)部函數(shù)和外部函數(shù)
函數(shù)是C語(yǔ)言程序的最小單位,一個(gè)C語(yǔ)言源文件由一個(gè)或多個(gè)函數(shù)組成。按照程序設(shè)計(jì)的需要,一個(gè)文件中的函數(shù)可以只供本文件中其它函數(shù)調(diào)用,也可以既供本文件又供其它文件中的函數(shù)調(diào)用。
根據(jù)函數(shù)能否被其它源文件調(diào)用,函數(shù)分為內(nèi)部函數(shù)和外部函數(shù)兩種。477.7.1內(nèi)部函數(shù)
內(nèi)部函數(shù)只能被本文件中的各個(gè)函數(shù)調(diào)用,且不能被其它文件中的函數(shù)調(diào)用。在定義內(nèi)部函數(shù)時(shí),必須用static加以說(shuō)明。
內(nèi)部函數(shù)的定義格式為:
static函數(shù)類型標(biāo)識(shí)符
函數(shù)名(形參列表)注意:(1)內(nèi)部函數(shù)又稱為靜態(tài)函數(shù),使用范圍僅限于定義它的源程序文件內(nèi),其它程序文件是不能調(diào)用該函數(shù)的。(2)不同文件中的內(nèi)部函數(shù)允許同名,因?yàn)樗鼈兊淖饔梅秶煌粫?huì)造成混淆。(3)內(nèi)部函數(shù)的static不可省略。7.7.1內(nèi)部函數(shù)48【例7.9】分析下列程序。#include<stdio.h>staticvoidswap(intx,inty)/*定義內(nèi)部函數(shù)swap()*/{intt;t=x;x=y;y=t;printf("%d%d\n",x,y);}voidmain(){inta=2,b=5;swap(a,b);printf("%d%d\n",a,b);}7.7.1內(nèi)部函數(shù)程序運(yùn)行結(jié)果:5225497.7.2外部函數(shù)
外部函數(shù)可以被任何文件的任何函數(shù)所調(diào)用。
其定義格式為:
extern函數(shù)類型標(biāo)識(shí)符
函數(shù)名(形參列表)C語(yǔ)言規(guī)定,如果在定義函數(shù)時(shí)省略extern,則系統(tǒng)默認(rèn)該函數(shù)為外部函數(shù)。
說(shuō)明:當(dāng)一個(gè)文件夾需調(diào)用其它文件定義的外部函數(shù)時(shí),必須要在該文件的適當(dāng)位置(通常是在其首部)用extern來(lái)說(shuō)明所調(diào)用的函數(shù)是外部函數(shù)。7.7.2外部函數(shù)50【例7.10】通過(guò)調(diào)用外部函數(shù)求絕對(duì)值。/*文件1file1.c*/#include<stdio.h>voidmain(){externintf();/*對(duì)函數(shù)f()進(jìn)行外部說(shuō)明*/ints,x;printf("請(qǐng)輸入一個(gè)整數(shù):");scanf("%d",&x);s=f(x);/*調(diào)用外部函數(shù)f()*/printf("絕對(duì)值為:%d\n",s);}7.7.2外部函數(shù)51/*文件2file2.c*/externintf(inta)/*將函數(shù)f()定義為外部函數(shù)*/{intb;if(a>=0)b=a;elseb=-a;return(b);}7.7.2外部函數(shù)程序運(yùn)行結(jié)果:請(qǐng)輸入一個(gè)整數(shù):-6↙絕對(duì)值為:6527.8程序設(shè)計(jì)綜合實(shí)例【例7.11】輸入一個(gè)整數(shù),輸出此整數(shù)是否為素?cái)?shù)的信息。#include<stdio.h>intprime(intn)/*定義函數(shù)prime()*/{intflag=1,i;/*初始化狀態(tài)為是素?cái)?shù)信息*/for(i=2;i<=(n/2);i++){if(n%i==0)flag=0;break;}/*能被1和本身以外的數(shù)整除則為非素?cái)?shù)*/return(flag);/*返回是否為素?cái)?shù)信息*/}voidmain(){intn;printf("請(qǐng)輸入一個(gè)整數(shù):");scanf("%d",&n);if(prime(n))/*如果prime()返回值為1*/printf("%d是素?cái)?shù)。\n",n);else/*如果prime()返回值為0*/printf("%d不是素?cái)?shù)。\n",n);}程序運(yùn)行結(jié)果:請(qǐng)輸入一個(gè)整數(shù):22↙22不是素?cái)?shù)537.8程序設(shè)計(jì)綜合實(shí)例【例7.12】將數(shù)組元素從大到小排序。#include<stdio.h>#definesize10voidsort(inta[],intn)/*定義函數(shù)sort()*/{inti,j,temp;for(i=0;i<n-1;i++)/*外循環(huán)*/for(j=0;j<n-i-1;j++)/*內(nèi)循環(huán)*/if(a[j]<a[j+1])/*判斷大小*/{
temp=a[j];a[j]=a[j+1];a[j+1]=temp;/*排序*/}}547.8程序設(shè)計(jì)綜合實(shí)例voidmain(){intk;intb[size]={10,25,31,6,19,56,32,27,65,12};printf("數(shù)組元素為:\n");for(k=0;k<size;k++)printf("%d",b[k]);/*顯示未排序數(shù)組元素值*/printf("\n");sort(b,size);/*調(diào)用函數(shù)sort()排序*/printf("排序后的數(shù)組元素為:\n");for(k=0;k<size;k++)printf("%d",b[k]);/*依次顯示排序后的數(shù)組元素*/printf("\n");}程序運(yùn)行結(jié)果:數(shù)組元素為:1025316195632276512排序后的數(shù)組元素為:6556323127251912106557.8程序設(shè)計(jì)綜合實(shí)例【例7.13】將輸入的字符串反序后存放。#include<stdio.h>#include<string.h>voidinverse(charstr[])/*定義函數(shù)inverse()*/{
chart;
inti,j;
for(i=0,j=strlen(str);i<strlen(str)/2;i++,j--){
t=str[i];
str[i]=str[j-1];
str[j-1]=t;
/*首尾字符依次互換*/
}}567.8程序設(shè)計(jì)綜合實(shí)例voidmain(){
charstr[100];
printf("請(qǐng)輸入字符串:\n");
gets(str);/*從鍵盤輸入字符串*/
inverse(str);
/*調(diào)用函數(shù)inverse()將字符串反序*/printf("反序后的字符串:\n");
puts(str);/*顯示反序后的字符串*/}程序運(yùn)行結(jié)果:請(qǐng)輸入字符串:abcdefg↙反序后的字符串:gfedcba577.8程序設(shè)計(jì)綜合實(shí)例【例7.14】從n名評(píng)委的評(píng)分中去掉一個(gè)最高分和一個(gè)最低分,然后統(tǒng)計(jì)總分,最后計(jì)算平均分作為選手的最后得分。#include<stdio.h>#include<string.h>#definen10intscore[n];/*定義數(shù)組score[n]且為全局變量*/voidoutline()/*定義函數(shù)outline()*/{puts(“********************”);}/*顯示一行*號(hào)*/voidget_data()/*定義函數(shù)get_data()*/{printf("\n請(qǐng)?jiān)u分:\n");outline();/*調(diào)用函數(shù)outline()顯示一行*號(hào)*/for(inti=0;i<n;i++){printf("%d號(hào)評(píng)委:",i+1);scanf("%d",&score[i]);/*按序給出評(píng)分*/}outline();/*調(diào)用函數(shù)outline()顯示一行*號(hào)*/}587.8程序設(shè)計(jì)綜合實(shí)例floatprocessor()/*定義函數(shù)processor()*/{
intmax,min;
intsum=0;inti;max=min=score[0];/*最高分和最低分初始化*/for(i=1;i<n;i++){sum+=score[i];/*計(jì)算總分*/if(score[i]>max)max=score[i];/*統(tǒng)計(jì)最高分*/if(score[i]<min)min=score[i];/*統(tǒng)計(jì)最低分*/}sum=sum-min-max;return(sum*1.0/(n-2));}597.8程序設(shè)計(jì)綜合實(shí)例voidmain(){floataveget_data();ave=processor();printf("最后得分:%.1f\n",ave);outline();}程序運(yùn)行結(jié)果:請(qǐng)?jiān)u分:********************1號(hào)評(píng)委:85↙2號(hào)評(píng)委:7
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 簽署房屋買賣合同
- 合同協(xié)議吸收合并協(xié)議
- 農(nóng)業(yè)科技智能溫室系統(tǒng)技術(shù)方案
- 個(gè)人健康記錄統(tǒng)計(jì)表(年度)
- 投資居間合同協(xié)議書
- 分項(xiàng)工程施工合同
- 房地產(chǎn)開發(fā)全總包合同
- 計(jì)算機(jī)購(gòu)銷合同
- 2025年寧波貨運(yùn)從業(yè)資格證模擬考試題
- 公司賬號(hào)保密協(xié)議
- 校長(zhǎng)第一次全體教師會(huì)上發(fā)言:2025春季開學(xué)教師掌握這 6 詞教育之路暢通無(wú)阻
- 新能源汽車及零部件檢驗(yàn)檢測(cè)公共服務(wù)平臺(tái)建設(shè)項(xiàng)目可行性研究報(bào)告
- 《工程熱力學(xué)》課件-11 理想氣體熱力學(xué)能、焓和熵的計(jì)算
- 發(fā)票知識(shí)培訓(xùn)課件
- 《綜合辦崗位職責(zé)》課件
- 學(xué)校與家庭在學(xué)生心理健康中的協(xié)同作用
- 《中醫(yī)望聞問(wèn)切》課件
- 聲帶腫物的護(hù)理教學(xué)查房
- 2023年高考真題-地理(天津卷) 含答案
- 2025年公務(wù)員考試《行測(cè)》模擬題及答案(詳細(xì)解析)
- 2024年黑龍江省牡丹江市中考?xì)v史試卷
評(píng)論
0/150
提交評(píng)論