




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第七章函數(shù)調(diào)用
本章要點(diǎn)函數(shù)的概念函數(shù)的定義與調(diào)用函數(shù)的遞歸調(diào)用變量的作用域函數(shù)的作用域
主要內(nèi)容7.1函數(shù)概述
7.2函數(shù)定義的一般形式
7.3函數(shù)參數(shù)和函數(shù)的值
7.4函數(shù)的調(diào)用
7.5函數(shù)的嵌套調(diào)用
主要內(nèi)容7.6函數(shù)的遞歸調(diào)用
7.7數(shù)組作為函數(shù)參數(shù)
7.8變量的作用域--局部變量和全局變量
7.9變量的存儲(chǔ)方式和生存期
7.10關(guān)于變量的聲明和定義
7.11內(nèi)部函數(shù)和外部函數(shù)7.1函數(shù)概述
一個(gè)C程序可由一個(gè)主函數(shù)和若干個(gè)其他函數(shù)構(gòu)成。一個(gè)較大的程序可分為若干個(gè)程序模塊,每一個(gè)模塊用來(lái)實(shí)現(xiàn)一個(gè)特定的功能。在高級(jí)語(yǔ)言中用子程序?qū)崿F(xiàn)模塊的功能。子程序由函數(shù)來(lái)完成。
函數(shù)間的調(diào)用關(guān)系:由主函數(shù)調(diào)用其他函數(shù),其他函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。例7.1函數(shù)調(diào)用的簡(jiǎn)單例子#include<stdio.h>voidmain(){voidprintstar();/*對(duì)printstar函數(shù)聲明*/voidprint_message();/*對(duì)print_message函數(shù)聲明*/printstar();/*調(diào)用printstar函數(shù)*/
print_message();/*調(diào)用print_message函數(shù)*/printstar();/*調(diào)用printstar函數(shù)*/}voidprintstar()/*定義printstar函數(shù)*/{printf("****************\n");}voidprint_message()/*定義print_message函數(shù)*/{printf("Howdoyoudo!\n");}運(yùn)行情況如下:****************Howdoyoudo!****************
說(shuō)明:
1.一個(gè)C程序由一個(gè)或多個(gè)程序模塊組成,每一個(gè)程序模塊作為一個(gè)源程序文件。對(duì)于較大的程序,通常將程序內(nèi)容分別放在若干個(gè)源文件中,再由若干源程序文件組成一個(gè)C程序。這樣便于分別編寫、分別編譯,提高調(diào)試效率。一個(gè)源程序文件可以為多個(gè)C程序公用。
說(shuō)明:
2.一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)以及其他有關(guān)內(nèi)容(如命令行、數(shù)據(jù)定義等)組成。一個(gè)源程序文件是一個(gè)編譯單位,在程序編譯時(shí)是以源程序文件為單位進(jìn)行編譯的,而不是以函數(shù)為單位進(jìn)行編譯的。說(shuō)明:
3.C程序的執(zhí)行是從main函數(shù)開始的,如果在main函數(shù)中調(diào)用其他函數(shù),在調(diào)用后流程返回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。
說(shuō)明:
4.所有函數(shù)都是平行的,即在定義函數(shù)時(shí)是分別進(jìn)行的,是互相獨(dú)立的。一個(gè)函數(shù)并不從屬于另一函數(shù),即函數(shù)不能嵌套定義。函數(shù)間可以互相調(diào)用,但不能調(diào)用main函數(shù)。main函數(shù)是系統(tǒng)調(diào)用的。說(shuō)明:5.從用戶使用的角度看,函數(shù)有兩種:①
標(biāo)準(zhǔn)函數(shù),即庫(kù)函數(shù)。這是由系統(tǒng)提供的,用戶不必自己定義這些函數(shù),可以直接使用它們。不同的C系統(tǒng)提供的庫(kù)函數(shù)的數(shù)量和功能會(huì)有一些不同,但許多基本的函數(shù)是共同的。②用戶自己定義的函數(shù)。用以解決用戶的專門需要。說(shuō)明:6.從函數(shù)的形式看,函數(shù)分兩類:①無(wú)參函數(shù)。無(wú)參函數(shù)一般用來(lái)執(zhí)行指定的一組操作。在調(diào)用無(wú)參函數(shù)時(shí),主調(diào)函數(shù)不向被調(diào)用函數(shù)傳遞數(shù)據(jù)。②有參函數(shù)。主調(diào)函數(shù)在調(diào)用被調(diào)用函數(shù)時(shí),通過(guò)參數(shù)向被調(diào)用函數(shù)傳遞數(shù)據(jù)。7.2函數(shù)定義的一般形式
7.2.1.為什么要定義函數(shù)C語(yǔ)言規(guī)定,在程序中用到的所有函數(shù),必須“先定義,后使用”。定義函數(shù)包括以下幾個(gè)內(nèi)容:⒈指定函數(shù)的名字,以便以后按名調(diào)用。⒉指定函數(shù)的類型,函數(shù)值的類型。⒊指定函數(shù)的參數(shù)的名字和類型,以便在調(diào)用函數(shù)時(shí)向它們傳遞數(shù)據(jù)。對(duì)無(wú)參函數(shù)不需要這項(xiàng)。⒋指定函數(shù)應(yīng)當(dāng)執(zhí)行什么操作,也就是函數(shù)是做什么的,即函數(shù)的功能。這是最重要的。7.2函數(shù)定義的一般形式
7.2.1.為什么要定義函數(shù)
對(duì)于C編譯系統(tǒng)提供的庫(kù)函數(shù),是由編譯系統(tǒng)事先定義好的,程序設(shè)計(jì)者不必自已定義,只需#include命令把有關(guān)的頭文件包含到本文件模塊中即可。例如,在程序中若用到數(shù)學(xué)函數(shù)(如sqrt,fabs,sin,cos等),就必須在本文件模塊的開頭寫上:
#include<math.h>7.2函數(shù)定義的一般形式7.2.2怎樣定義無(wú)參函數(shù)定義無(wú)參函數(shù)的一般形式為:類型標(biāo)識(shí)符函數(shù)名(){
聲明部分
語(yǔ)句部分}7.2函數(shù)定義的一般形式7.2.3怎樣定義有參函數(shù)定義有參函數(shù)的一般形式為:類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)表列){
聲明部分
語(yǔ)句部分}例如:intmax(intx,inty){intz;/*函數(shù)體中的聲明部分*/z=x>y?x∶y;
return(z);}
7.2函數(shù)定義的一般形式7.2.4定義空函數(shù)定義空函數(shù)的一般形式為:類型標(biāo)識(shí)符函數(shù)名(){}例如:voiddummy(){}主調(diào)函數(shù)調(diào)用空函數(shù)時(shí),只表明這里要調(diào)用一個(gè)函數(shù),但函數(shù)本身什么工作也不做等,以后擴(kuò)充函數(shù)功能時(shí)補(bǔ)充上。7.3函數(shù)參數(shù)和函數(shù)的值7.3.1形式參數(shù)和實(shí)際參數(shù)
形式參數(shù):函數(shù)名后面括弧中的變量名稱為“形式參數(shù)”(簡(jiǎn)稱“形參”);實(shí)際參數(shù):主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括弧中的參數(shù)(可以是一個(gè)表達(dá)式)稱為“實(shí)際參數(shù)”(簡(jiǎn)稱“實(shí)參”);函數(shù)返回值:return后面的括弧中的值作為函數(shù)帶回的值(稱函數(shù)返回值)。
主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞的關(guān)系。在不同的函數(shù)之間傳遞數(shù)據(jù),可以使用的方法有:參數(shù):通過(guò)形式參數(shù)和實(shí)際參數(shù)返回值:用return語(yǔ)句返回計(jì)算結(jié)果全局變量:外部變量例7.2輸入兩個(gè)整數(shù),要求用一個(gè)函數(shù)求出其中的大者,并在主函數(shù)中輸出此值。
#include<stdio.h>voidmain(){intmax(intx,inty);
/*對(duì)max函數(shù)的聲明*/inta,b,c;
scanf("%d,%d",&a,&b);c=max(a,b);
printf("Maxis%d",c);}
intmax(intx,inty)/*定義有參函數(shù)max*/{
intz;z=x>y?x∶y;
return(z);}
運(yùn)行情況如下:7,8↙Max
is
8
通過(guò)函數(shù)調(diào)用,可使兩個(gè)函數(shù)中的數(shù)據(jù)發(fā)生聯(lián)系。關(guān)于形參與實(shí)參的說(shuō)明:1.
在定義函數(shù)中指定的形參,在未出現(xiàn)函數(shù)調(diào)用時(shí),它們并不占內(nèi)存中的存儲(chǔ)單元。只有在發(fā)生函數(shù)調(diào)用時(shí),函數(shù)max中的形參才被分配內(nèi)存單元。在調(diào)用結(jié)束后,形參所占的內(nèi)存單元也被釋放。2.
實(shí)參可以是常量、變量或表達(dá)式,例如:
max(3,a+b);但要求它們有確定的值。在調(diào)用時(shí)將實(shí)參的值賦給形參。3.在被定義的函數(shù)中,必須指定形參的類型。4.實(shí)參與形參的類型應(yīng)相同或賦值兼容。5.
實(shí)參向形參的數(shù)據(jù)傳遞是單向“值傳遞”,只能由實(shí)參傳給形參,而不能由形參傳回來(lái)給實(shí)參。在調(diào)用函數(shù)時(shí),給形參分配存儲(chǔ)單元,并將實(shí)參對(duì)應(yīng)的值傳遞給形參,調(diào)用結(jié)束后,形參單元被釋放,實(shí)參單元仍保留并維持原值。7.3函數(shù)參數(shù)和函數(shù)的值7.3.2函數(shù)的返回值函數(shù)的返回值是通過(guò)函數(shù)調(diào)用使主調(diào)函數(shù)得到的確定值。例如:例8.2中,max(2,3)的值是3,max(5,2)的值是5。賦值語(yǔ)句將這個(gè)函數(shù)值賦給變量c。說(shuō)明:
1.函數(shù)的返回值是通過(guò)函數(shù)中的return語(yǔ)句獲得的。一個(gè)函數(shù)中可以有一個(gè)以上的return語(yǔ)句,執(zhí)行到哪一個(gè)return語(yǔ)句,哪一個(gè)語(yǔ)句起作用。return語(yǔ)句后面的括弧也可以不要例如:
“returnz;”等價(jià)于“return(z);”return后面的值可以是一個(gè)表達(dá)式。例如:
max(intx,inty){
return(x>y?x:y);
}2.函數(shù)的返回值應(yīng)當(dāng)屬于某一個(gè)確定的類型,在定義函數(shù)時(shí)指定函數(shù)返回值的類型。例如:下面是3個(gè)函數(shù)的首行:int
max(floatx,floaty)/*函數(shù)值為整型*/char
letter(charc1,charc2)/*函數(shù)值為字符型*/
double
min(intx,inty)/*函數(shù)值為雙精度型
*/
注意:凡不加類型說(shuō)明的函數(shù),自動(dòng)按整型處理。3.在定義函數(shù)時(shí)指定的函數(shù)類型一般應(yīng)該和return語(yǔ)句中的表達(dá)式類型一致。如果函數(shù)值的類型和return語(yǔ)句中表達(dá)式的值不一致,則以函數(shù)類型為準(zhǔn)。對(duì)數(shù)值型數(shù)據(jù),可以自動(dòng)進(jìn)行類型轉(zhuǎn)換。即函數(shù)類型決定返回值的類型。4.對(duì)于不帶回值的函數(shù),應(yīng)當(dāng)用“void”定義函數(shù)為“無(wú)類型”(或稱“空類型”)。此時(shí)在函數(shù)體中不得出現(xiàn)return語(yǔ)句。
例7.3返回值類型與函數(shù)類型不同#include<stdio.h>voidmain(){intmax(floatx,floaty);
floata,b;
intc;
scanf("%f,%f,",&a,&b);c=max(a,b);
printf("Maxis%d\n",c);}intmax(floatx,floaty){floatz;/*z為實(shí)型變量*/
z=x>y?x∶y;
return(z);}運(yùn)行情況如下:1.5,2.5↙
Maxis2
7.4函數(shù)的調(diào)用
7.4.1函數(shù)調(diào)用的一般形式函數(shù)調(diào)用的一般形式為:
函數(shù)名(實(shí)參表列)說(shuō)明:1.如果是調(diào)用無(wú)參函數(shù),則“實(shí)參表列”可以沒(méi)有,但括弧不能省略。2.如果實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù)間用逗號(hào)隔開。實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類型應(yīng)匹配。實(shí)參與形參按順序?qū)?yīng),向形參傳遞數(shù)據(jù)。如果實(shí)參表列包括多個(gè)實(shí)參,對(duì)實(shí)參求值的順序并不是確定的,有的系統(tǒng)按自左至右順序求實(shí)參的值,有的系統(tǒng)則按自右至左順序。例如:
printf(″%d,%d″,i,++i);
若i的原值為3,在VC++6.0環(huán)境下運(yùn)行的結(jié)果不是“3,4”,而為“4,4”。因?yàn)榘醋杂叶箜樞颍惹?+i得4,再向左進(jìn)行,此時(shí)的i已是4了。如果想輸出3和4,應(yīng)寫成:
i=3;j=i++;printf(”%d,%d”,i,j);7.4函數(shù)的調(diào)用7.4.2函數(shù)調(diào)用的方式1.函數(shù)語(yǔ)句把函數(shù)調(diào)用作為一個(gè)語(yǔ)句。這時(shí)不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。2.函數(shù)表達(dá)式函數(shù)出現(xiàn)在一個(gè)表達(dá)式中,這種表達(dá)式稱為函數(shù)表達(dá)式。這時(shí)要求函數(shù)帶回一個(gè)確定的值以參加表達(dá)式的運(yùn)算。例如:c=2*max(a,b);
按函數(shù)在程序中出現(xiàn)的位置來(lái)分,可以有以下三種函數(shù)調(diào)用方式:
3.函數(shù)參數(shù)函數(shù)調(diào)用作為一個(gè)函數(shù)的實(shí)參。例如:m=max(a,max(b,c));其中max(b,c)是一次函數(shù)調(diào)用,它的值作為max另一次調(diào)用的實(shí)參。m的值是a、b、c三者中的最大者。7.4函數(shù)的調(diào)用
7.4.3對(duì)被調(diào)用函數(shù)的聲明和函數(shù)原型在一個(gè)函數(shù)中調(diào)用另一函數(shù)(即被調(diào)用函數(shù))需要具備哪些條件呢?1.首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)(是庫(kù)函數(shù)或用戶自己定義的函數(shù))。但光有這一條件還不夠。3.如果使用用戶自己定義的函數(shù),而該函數(shù)的位置在調(diào)用它的函數(shù)(即主調(diào)函數(shù))的后面,應(yīng)該在主調(diào)函數(shù)中對(duì)被調(diào)用的函數(shù)作聲明。2.如果使用庫(kù)函數(shù),還應(yīng)該在本文件開頭用#include命令將調(diào)用有關(guān)庫(kù)函數(shù)時(shí)所需用到的信息“包含”到本文件中來(lái)。
例7.4對(duì)被調(diào)用的函數(shù)作聲明#include<stdio.h>voidmain(){floatadd(floatx,floaty);
/*對(duì)被調(diào)用函數(shù)add的聲明*/
floata,b,c;
scanf("%f,%f",&a,&b);
c=add(a,b);printf("sumis%f\n",c);}floatadd(floatx,floaty)/*函數(shù)首部*/{floatz;/*函數(shù)體*/z=x+y;
return(z);}運(yùn)行情況如下:3.6,6.5↙
Sumis10.100000函數(shù)原型的一般形式為:1.函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2……);2.函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)名1,參數(shù)類型2,參數(shù)名2……);聲明的作用是把函數(shù)名、函數(shù)參數(shù)的個(gè)數(shù)和參數(shù)類型等信息通知編譯系統(tǒng),以便在遇到函數(shù)調(diào)用時(shí),編譯系統(tǒng)能正確識(shí)別函數(shù)并檢查調(diào)用是否合法。注意:函數(shù)的“定義”和“聲明”不是一回事。函數(shù)的定義是指對(duì)函數(shù)功能的確立,包括指定函數(shù)名,函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個(gè)完整的、獨(dú)立的函數(shù)單位。函數(shù)的聲明的作用則是把函數(shù)的名字、函數(shù)類型以及形參的類型、個(gè)數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對(duì)照檢查。它不包含函數(shù)體。
說(shuō)明:
(1)如果被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,可以不必加以聲明。(2)如果已在文件的開頭(在所有函數(shù)之前),已對(duì)本文件中所調(diào)用的函數(shù)進(jìn)行了聲明,則在各函數(shù)中不必對(duì)其所調(diào)用的函數(shù)再作聲明。
例7.5(例7.4的改寫)#include<stdio.h>floatadd(floatx,floaty)/*函數(shù)首部*/{floatz;
z=x+y;
return(z);}voidmain(){/*不必再對(duì)add函數(shù)作聲明*/ floata,b,c;
scanf("%f,%f",&a,&b);
c=add(a,b);printf("sumis%f\n",c);}
7.5函數(shù)的嵌套調(diào)用嵌套定義就是在定義一個(gè)函數(shù)時(shí),其函數(shù)體內(nèi)又包含另一個(gè)函數(shù)的完整定義。在主函數(shù)中調(diào)用一個(gè)max_4函數(shù)來(lái)求4個(gè)整數(shù)中的最大數(shù)。然后在max_4函數(shù)中再調(diào)用一個(gè)max_2函數(shù)來(lái)求2個(gè)整數(shù)中的最大數(shù)。最后在主函數(shù)中輸出結(jié)果。方法:例7.6輸入4個(gè)整數(shù),找出其中最大的數(shù)。用函數(shù)的嵌套調(diào)用來(lái)處理。#include<stdio.h>voidmain(){intmax_4(inta,intb,intc,intd);/*max_4函數(shù)的聲明*/inta,b,c,d,max;printf("Pleaseenter4intergernumbers:");scanf("%d%d%d%d",&a,&b,&c,&d);max=max_4(a,b,c,d);/*調(diào)用max_4函數(shù)*/printf("max=%d\n",max);}intmax_4(inta,intb,intc,intd)/*max_4函數(shù)的定義*/{intmax_2(int,int);/*max_2函數(shù)的聲明*/intm;
m=max_2(a,b);/*調(diào)用max_2函數(shù)*/m=max_2(m,c);/*調(diào)用max_2函數(shù)*/m=max_2(m,d);/*調(diào)用max_2函數(shù)*/return(m);/*函數(shù)返回值是4個(gè)數(shù)中的最大者*/}intmax_2(a,b)/*max_4函數(shù)的定義*/intmax_2(a,b){if(a>b)returna;elsereturnb;/*函數(shù)返回值是a和b中的大者*/}運(yùn)行情況如下:Pleaseenter4intergernumbers:1145–540↙max=457.6函數(shù)的遞歸調(diào)用
在調(diào)用一個(gè)函數(shù)的過(guò)程中又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。C語(yǔ)言的特點(diǎn)之一就在于允許函數(shù)的遞歸調(diào)用。例如:
intf(intx){inty,z;z=f(y);/*在執(zhí)行f函數(shù)的過(guò)程中又要調(diào)用f函數(shù)*/return(2*z);}例7.7:
有5個(gè)人坐在一起,問(wèn)第5個(gè)人多少歲?他說(shuō)比第4個(gè)人大2歲。問(wèn)第4個(gè)人歲數(shù),他說(shuō)比第3個(gè)人大2歲。問(wèn)第3個(gè)人,又說(shuō)比第2個(gè)人大2歲。問(wèn)第2個(gè)人,說(shuō)比第1個(gè)人大2歲。最后問(wèn)第1個(gè)人,他說(shuō)是10歲。請(qǐng)問(wèn)第5個(gè)人多大。age(5)=age(4)+2age(4)=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10可以用數(shù)學(xué)公式表述如下:age(n)=10(n=1)age(n-1)+2(n>1)可以用一個(gè)函數(shù)來(lái)描述上述遞歸過(guò)程:intage(intn)/*求年齡的遞歸函數(shù)*/
{intc;/*c用作存放函數(shù)的返回值的變量*/
if(n==1)c=10;
elsec=age(n-1)+2;
return(c);}運(yùn)行結(jié)果如下:18用一個(gè)主函數(shù)調(diào)用age函數(shù),求得第5人的年齡。#include<stdio.h>voidmain(){printf(″%d″,age(5));}例7.8用遞歸方法求n!
求n!也可以用遞歸方法,即5!等于4!×5,而4?。剑?!×4…1?。剑薄?捎孟旅娴倪f歸公式表示:n!︳
=1(n=0,1)
︳=n·(n-1)?。ǎ睿荆保┏绦蛉缦拢?/p>
#include<stdio.h>voidmain(){longfac(intn);/*對(duì)fac函數(shù)的聲明*/intn;longy;printf("inputanintegernumber:");scanf("%d",&n);y=fac(n);printf("%d!=%ld\n",n,y);}longfac(intn)/*定義fac函數(shù)*/{longf;if(n<0) printf("n<0,dataerror!");elseif(n==0,n==1) f=1;elsef=fac(n-1)*n;return(f);}運(yùn)行情況如下:inputanintegernunber:10↙
10!=3628800例7.9Hanoi(漢諾塔)問(wèn)題:由上面的分析可知:將n個(gè)盤子從A座移到C座可以分解為以下3個(gè)步驟:1.將A上n-1個(gè)盤借助C座先移到B座上。2.把A座上剩下的一個(gè)盤移到C座上。3.將n-1個(gè)盤從B座借助于A座移到C座上。程序如下:#include<stdio.h>voidmain(){voidhanoi(intn,charone,chartwo,charthree);
/*對(duì)hanoi函數(shù)的聲明*/intm;printf("inputthenumberofdiskes:");scanf(“%d”,&m);printf("Thesteptomoveing%ddiskes:\n",m);hanoi(m,'A','B','C');}voidhanoi(intn,charone,chartwo,charthree)
/*定義hanoi函數(shù),將n個(gè)盤從one座借助two座,移到three座*/{voidmove(charx,chary);/*對(duì)move函數(shù)的聲明*/if(n==1)move(one,three);else{hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);}}voidmove(charx,chary)/*定義move函數(shù)*/{printf(“%c-->%c\n",x,y);}運(yùn)行情況如下:inputthenumberofdiskes:3↙
Thestepstonoving3diskes:
A-->CA-->BC-->BA-->CB-->AB-->CA-->C
7.7數(shù)組作為函數(shù)參數(shù)7.7.1數(shù)組元素作函數(shù)實(shí)參
由于實(shí)參可以是表達(dá)式,而數(shù)組元素可以是表達(dá)式的組成部分,因此數(shù)組元素可以作為函數(shù)的實(shí)參,與用變量作實(shí)參一樣,是單向傳遞,即“值傳送”方式。例7.10
有兩個(gè)數(shù)組a和b,各有10個(gè)元素,將它們對(duì)應(yīng)地逐個(gè)相比(即a[0]與b[0]比,a[1]與b[1]比……)。如果a數(shù)組中的元素大于b數(shù)組中的相應(yīng)元素的數(shù)目多于b數(shù)組中元素大于a數(shù)組中相應(yīng)元素的數(shù)目(例如,a[i]>b[i]6次,b[i]>a[i]3次,其中i每次為不同的值),則認(rèn)為a數(shù)組大于b數(shù)組,并分別統(tǒng)計(jì)出兩個(gè)數(shù)組相應(yīng)元素大于、等于、小于的次數(shù)。#include<stdio.h>voidmain(){intlarge(intx,inty);/*函數(shù)聲明*/inta[10],b[10],i,n=0,m=0,k=0;
printf(″e(cuò)nterarraya∶\n″);
for(i=0;i<10;i++=)scanf(″%d″,&a[i]);
printf(″\n″);
printf(″e(cuò)nterarrayb∶\n″);
for(i=0;i<10;i++=)scanf(″%d″,&b[i]);
printf(″\n″);
for(i=0;i<10;i++)
{if(large(a[i],b[i])==1)n=n+1;
elseif(large(a[i],b[i])==0)m=m+1;
elsek=k+1;}printf("a[i]>b[i]%dtimes\na[i]=b[i]%dtimes\na[i]<b[i]%dtimes\n",n,m,k);if(n>k)printf("arrayaislargerthanarrayb\n");elseif(n<k)printf("arrayaissmallerthanarrayb\n");
elseprintf("arrayaisequaltoarrayb\n");}large(intx,inty){intflag;
if(x>y)flag=1;
elseif(x<y)flag=-1;
elseflag=0;
return(flag);}運(yùn)行情況如下:
enterarraya:
1357986420↙
enterarrayb∶
5389–1–35604↙
a[i]>b[i]4timesa[i]=b[i]1timesa[i]<b[i]5times
arrayaissmallerthannarrayb7.7數(shù)組作為函數(shù)參數(shù)7.7.2數(shù)組名作函數(shù)參數(shù)
可以用數(shù)組名作函數(shù)參數(shù),此時(shí)形參應(yīng)當(dāng)用數(shù)組名或用指針變量。例7.11有一個(gè)一維數(shù)組score,內(nèi)放10個(gè)學(xué)生成績(jī),求平均成績(jī)。#include<stdio.h>voidmain(){floataverage(floatarray[10]);/*函數(shù)聲明*/floatscore[10],aver;
inti;
printf(″input10scores:\n″);
for(i=0;i<10;i++=
scanf(″%f″,&score[i]);
printf(″\n″);
aver=average(score);
printf(″averagescoreis%5.2f\n″,aver);}floataverage(floatarray[10]){inti;
floataver,sum=array[0];
for(i=1;i<10;i++=)sum=sum+array[i];aver=sum/10;
return(aver);}運(yùn)行情況如下:input10scores:
100567898.576879967.57597↙
averagescoreis83.40
例7.12編寫一個(gè)函數(shù),用來(lái)分別求數(shù)組score_1和數(shù)組score_2各元素的平均值。
#include<stdio.h>voidmain(){floataverage(floatarray[],intn)
floatscore_1[5]={98.5,97,91.5,60,55};
floatscore_2[10]={67.5,89.5,99,69.5,
77,89.5,76.5,54,60,99.5};
printf(“theaverageofclassAis%6.2f\n”,
average(score_1,5));printf(“theaverageofclassBis%6.2f\n”,
average(score_2,10));
}floataverage(floatarray[],intn){inti;
floataver,sum=array[0];
for(i=1;i<n;i++=
sum=sum+array[i];
aver=sum/n;
return(aver);}運(yùn)行結(jié)果如下:theaverageofclassAis80.40TheaverageofclassBis78.20例7.13用選擇法對(duì)數(shù)組中10個(gè)整數(shù)按由小到大排序。所謂選擇法就是先將10個(gè)數(shù)中最小的數(shù)與a[0]對(duì)換;再將a[1]到a[9]中最小的數(shù)與a[1]對(duì)換……每比較一輪,找出一個(gè)未經(jīng)排序的數(shù)中最小的一個(gè)。共比較9輪。未排序時(shí)的情況:a[0]a[1]a[2]a[3]a[4]36194將5個(gè)數(shù)中最小的數(shù)1與a[0]對(duì)換:16394將余下的4個(gè)數(shù)中最小的數(shù)3與a[1]對(duì)換
13694將余下的3個(gè)數(shù)中最小的數(shù)4與a[2]對(duì)換
13496將余下的2個(gè)數(shù)中最小的數(shù)6與a[3]對(duì)換,至此完成排序
13469程序?qū)嵗?include<stdio.h>voidmain(){voidsort(intarray[],intn);inta[10],i;
printf(″e(cuò)nterthearray\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″);}voidsort(intarray[],intn){inti,j,k,t;
for(i=0;i<n-1;i++){k=i;
for(j=i+1;j<n;j++)
if(array[j]<array[k]=k=j;t=array[k];
array[k]=array[i];array[i]=t
}}運(yùn)行結(jié)果如下:enterarray:57–321–436732133510↙Thesortedarray:–43–3057213351673217.7數(shù)組作為函數(shù)參數(shù)7.7.3用多維數(shù)組名作函數(shù)參數(shù)
多維數(shù)組元素可以作函數(shù)參數(shù),這點(diǎn)與用一維數(shù)組元素作函數(shù)參數(shù)的情況類似。也可以用多維數(shù)組名作為函數(shù)的實(shí)參和形參,在被調(diào)用函數(shù)中對(duì)形參數(shù)組定義時(shí)可以指定每一維的大小,也可以省略第一維的大小說(shuō)明。例7.14有一個(gè)3×4的二維數(shù)組,設(shè)計(jì)一個(gè)函數(shù),用來(lái)求二維數(shù)組中所有元素中的最大值。程序如下:#include<stdio.h>voidmain(){max_value(intarray[][4]);int[3][4]={{1,3,5,7},{2,4,6,8},{15,17,34,12}};
printf(″maxvalueis%d\n″,
max_value(a));}
算法:先使變量max的初值為二維數(shù)組中第一個(gè)元素的值,然后將二維數(shù)組中各個(gè)元素的值與max相比,每次比較后都把“大者”存放在max中,全部元素比較完后,max的值就是所有元素的最大值。max_value(intarray[][4]){inti,j,k,max;
max=array[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++=
if(array[i][j]>max)
max=array[i][j];
return(max);}
運(yùn)行結(jié)果如下:Maxvalueis347.8變量的作用域--局部變量和全局變量7.8.1局部變量
在一個(gè)函數(shù)內(nèi)部定義的變量是內(nèi)部變量,它只在本函數(shù)范圍內(nèi)有效,也就是說(shuō)只有在本函數(shù)內(nèi)才能使用它們,在此函數(shù)以外是不能使用這些變量的。這稱為“局部變量”。floatf1(inta)/*函數(shù)f1*/{intb,c;…a、b、c有效}charf2(intx,inty)/*函數(shù)f2*/{inti,j;x、y、i、j有效}voidmain()/*主函數(shù)*/{intm,n;…m、n有效}
主函數(shù)中定義的變量只在主函數(shù)中有效,而不因?yàn)樵谥骱瘮?shù)中定義而在整個(gè)文件或程序中有效。主函數(shù)也不能使用其他函數(shù)中定義的變量。(2)不同函數(shù)中可以使用相同名字的變量,它們代表不同的對(duì)象,互不干擾。(3)形式參數(shù)也是局部變量。(4)在一個(gè)函數(shù)內(nèi)部,可以在復(fù)合語(yǔ)句中定義變量,這些變量只在本復(fù)合語(yǔ)句中有效,這種復(fù)合語(yǔ)句也稱為“分程序”或“程序塊”。voidmain(){inta,b;…{intc;c=a+b;c在此范圍內(nèi)有效a,b在此范圍內(nèi)有效
…}…}
7.8變量的作用域--局部變量和全局變量7.8.2全局變量在函數(shù)內(nèi)定義的變量是局部變量,而在函數(shù)之外定義的變量稱為外部變量,外部變量是全局變量(也稱全程變量)。全局變量可以為本文件中其他函數(shù)所共用。它的有效范圍為從定義變量的位置開始到本源文件結(jié)束。intp=1,q=5;/*外部變量*/floatf1(inta)/*定義函數(shù)f1*/{intb,c;…}charc1,c2;/*外部變量*/charf2(intx,inty)/*定義函數(shù)f2*/{inti,j;全局變量p,q的作用范圍
…全局變量c1,c2的作用范圍}voidmain()/*主函數(shù)*/{intm,n;…}
例7.15有一個(gè)一維數(shù)組,內(nèi)放10個(gè)學(xué)生成績(jī),寫一個(gè)函數(shù),求出平均分、最高分和最低分。#include<stdio.h>floatMax=0,Min=0;/*全局變量*/voidmain(){floataverage(floatarray[],intn);floatave,score[10];
inti;
for(i=0;i<10;i++)
scanf(″%f″,&score[i]);
ave=average(score,10);
printf(“max=%6.2f\nmin=%6.2f\naverage=%6.2f\n“,Max,Min,ave);
}floataverage(floatarray[],intn)
/*定義函數(shù),形參為數(shù)組*/{inti;
floataver,sum=array[0];
Max=Min=array[0];
for(i=1;i<n;i++){if(array[i]>Max)Max=array[i];
elseif(array[i]<Min)Min=array[i];
sum=sum+array[i];}
aver=sum/n;
return(aver);}運(yùn)行情況如下:9945789710067.589926643↙max=100.00min=43.00average=77.65
建議不在必要時(shí)不要使用全局變量,原因如下:①全局變量在程序的全部執(zhí)行過(guò)程中都占用存儲(chǔ)單元,而不是僅在需要時(shí)才開辟單元。②使用全局變量過(guò)多,會(huì)降低程序的清晰性。在各個(gè)函數(shù)執(zhí)行時(shí)都可能改變外部變量的值,程序容易出錯(cuò)。因此,要限制使用全局變量。③它降低函數(shù)的通用性,因?yàn)楹瘮?shù)在執(zhí)行時(shí)要依賴于其所在的外部變量。如果將一個(gè)函數(shù)移到另一個(gè)文件中,還要將有關(guān)的外部變量及其值一起移過(guò)去。但若該外部變量與其他文件的變量同名時(shí),就會(huì)出現(xiàn)問(wèn)題,降低了程序的可靠性和通用性。一般要求把C程序中的函數(shù)做成一個(gè)封閉體,除了可以通過(guò)“實(shí)參——形參”的渠道與外界發(fā)生聯(lián)系外,沒(méi)有其他渠道。例7.16外部變量與局部變量同名#include<stdio.h>inta=3,b=5;/*a,b為外部變量*/a,b作用范圍voidmain(){inta=8;/*a為局部變量*/局部變量a作用范圍
printf(″%d″,max(a,b));全局變量b的作用范圍
}max(inta,intb)/*a,b為局部變量*/
{intc;c=a>b?a∶b;形參a、b作用范圍
return(c);
}運(yùn)行結(jié)果為
8
7.9變量的存儲(chǔ)方式和生存期
從變量的作用域(即從空間)角度來(lái)分,可以分為全局變量和局部變量。從變量值的生存期(即存在的時(shí)間)角度來(lái)分,又可以分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。
7.9變量的存儲(chǔ)方式和生存期
所謂靜態(tài)存儲(chǔ)方式是指在程序運(yùn)行期間由系統(tǒng)分配固定的存儲(chǔ)空間的方式。動(dòng)態(tài)存儲(chǔ)方式則是在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。這個(gè)存儲(chǔ)空間可以分為三部分:
1.程序區(qū)2.靜態(tài)存儲(chǔ)區(qū)3.動(dòng)態(tài)存儲(chǔ)區(qū)在C語(yǔ)言中每一個(gè)變量和函數(shù)有兩個(gè)屬性:數(shù)據(jù)類型和數(shù)據(jù)的存儲(chǔ)類別。7.9變量的存儲(chǔ)方式和生存期7.9.1局部變量的存儲(chǔ)類別1.auto變量:函數(shù)中的局部變量,如不專門聲明st
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 仙桃職業(yè)學(xué)院《材料基礎(chǔ)化學(xué)實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 山西省同煤二中2025屆高三年級(jí)第一次教學(xué)質(zhì)量診斷性聯(lián)合考試語(yǔ)文試題含解析
- 三亞市白沙黎族自治縣2025年數(shù)學(xué)三下期末經(jīng)典試題含解析
- 山東省寧陽(yáng)縣市級(jí)名校2024-2025學(xué)年初三第二學(xué)期月考試卷(二)英語(yǔ)試題含答案
- 山東省濰坊市高密市2025屆初三年級(jí)第二學(xué)期調(diào)研考試數(shù)學(xué)試題含解析
- 廈門理工學(xué)院《社會(huì)救助與社會(huì)福利》2023-2024學(xué)年第二學(xué)期期末試卷
- 南通科技職業(yè)學(xué)院《工程光學(xué)設(shè)計(jì)(雙語(yǔ))》2023-2024學(xué)年第二學(xué)期期末試卷
- 江蘇省啟東匯龍中學(xué)2025年初三第二次調(diào)研考試(物理試題文)試卷含解析
- 山東濱州陽(yáng)信縣2025屆初三10份綜合模擬檢測(cè)試題含解析
- 綠色能源新能源汽車充電樁場(chǎng)地租賃與智能充電設(shè)備安裝協(xié)議
- 籃球比賽計(jì)分表word版
- 上古卷軸5所有任務(wù)代碼
- 2000年40個(gè)部門投入產(chǎn)出表
- 《教師職業(yè)道德》全書word版
- 唯美復(fù)古風(fēng)人間煙火氣相冊(cè)宣傳模板課件
- 高空作業(yè)安全會(huì)議記錄內(nèi)容
- 合同制消防員績(jī)效考核細(xì)則詳解
- 00510秘書實(shí)務(wù)-自考整合版
- [復(fù)習(xí)]邊坡客土吹附施工方案
- 門禁一卡通系統(tǒng)解決方案
- 煤礦機(jī)電運(yùn)輸專業(yè)質(zhì)量標(biāo)準(zhǔn)化管理制度
評(píng)論
0/150
提交評(píng)論