C語(yǔ)言程序設(shè)計(jì)課件:函數(shù)和變量_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)課件:函數(shù)和變量_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)課件:函數(shù)和變量_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)課件:函數(shù)和變量_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)課件:函數(shù)和變量_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

函數(shù)和變量第一節(jié)函數(shù)的定義第二節(jié)函數(shù)的參數(shù)傳遞第三節(jié)變量的分類第四節(jié)函數(shù)的作用域第五節(jié)項(xiàng)目任務(wù):輸入輸出子模塊的編程實(shí)現(xiàn)第一節(jié)函數(shù)的定義一、函數(shù)概述在進(jìn)行程序設(shè)計(jì)時(shí),程序員總是將復(fù)雜的問(wèn)題進(jìn)行分解,化整為零,編寫一段小程序就能解決一個(gè)小問(wèn)題,然后將這些小程序拼裝起來(lái)就能解決非常大而復(fù)雜的問(wèn)題。在C語(yǔ)言中,這些小程序統(tǒng)稱為函數(shù),因此,構(gòu)成C語(yǔ)言程序的基本單位就是函數(shù)。圖6.1C語(yǔ)言模塊化程序設(shè)計(jì)示意圖由上圖可以看出,函數(shù)是C源程序的基本模塊,通過(guò)對(duì)函數(shù)模塊的調(diào)用實(shí)現(xiàn)特定的功能。C語(yǔ)言不僅提供了極為豐富的庫(kù)函數(shù),還允許用戶建立自己定義的函數(shù)。庫(kù)函數(shù)是系統(tǒng)定義的,它們的定義分別放在不同的頭文件中,用戶只要用#include文件包含將頭文件包含到程序中即可調(diào)用它們。用戶自己定義的函數(shù)是為解決自己的特定問(wèn)題自行編寫的,用戶可把自己的算法編成一個(gè)個(gè)相對(duì)獨(dú)立的函數(shù)模塊,然后用調(diào)用的方法來(lái)使用函數(shù)。例如:我們前面設(shè)計(jì)的學(xué)生成績(jī)統(tǒng)計(jì)系統(tǒng),這個(gè)系統(tǒng)要能完成學(xué)生信息的輸入、學(xué)生信息的修改、學(xué)生信息的刪除、學(xué)生信息的查找、學(xué)生信息的顯示等功能。根據(jù)程序的功能,可以把整個(gè)程序分成6大模塊,其中,菜單模塊用主函數(shù)實(shí)現(xiàn),其余5個(gè)功能分別用5個(gè)函數(shù)實(shí)現(xiàn),通過(guò)主函數(shù)可以對(duì)另外5個(gè)函數(shù)進(jìn)行調(diào)用來(lái)完成整個(gè)學(xué)生成績(jī)統(tǒng)計(jì)的功能。圖6.2表示了這個(gè)程序的模塊結(jié)構(gòu)。圖6.2學(xué)生成績(jī)統(tǒng)計(jì)程序的模塊結(jié)構(gòu)二、無(wú)參函數(shù)和有參函數(shù)的定義函數(shù)的定義主要是確定函數(shù)的名稱、函數(shù)的類型以及該函數(shù)完成什么功能。(一)無(wú)參函數(shù)的定義當(dāng)調(diào)用函數(shù)時(shí),不需要向函數(shù)提供數(shù)據(jù),則該函數(shù)成為無(wú)參函數(shù)。多數(shù)無(wú)參函數(shù)調(diào)用之后,僅完成某一操作,而不需要帶回一個(gè)結(jié)果,因此,也可以不指明函數(shù)的類型。無(wú)參函數(shù)定義的一般形式如下:函數(shù)名(){

變量聲明部分;執(zhí)行部分;}【案例6-1】編寫一個(gè)函數(shù),輸出“Hello,World!””。#include<stdio.h>display()/*display()是一個(gè)無(wú)參函數(shù)*/{printf(“*********************\n”);printf(“Hello,World!\n”);printf(“*********************\n”);}main(){display();}(二)有參函數(shù)的定義有參函數(shù)定義的一般形式如下:類型標(biāo)識(shí)符函數(shù)名(形式參數(shù)列表)形式參數(shù)聲明{

變量聲明部分;執(zhí)行部分;}【案例6-2】定義一個(gè)max函數(shù),求兩個(gè)整數(shù)中較大的一個(gè)整數(shù)。#include<stdio.h>main(){intmax(intx,inty);/*聲明函數(shù),說(shuō)明本函數(shù)中要調(diào)用的函數(shù)max()在本函數(shù)后面定義*/

intnumber1,number2;intm;printf("輸入兩個(gè)整數(shù):");scanf("%d%d",&number1,&number2);m=max(number1,number2);/*調(diào)用max函數(shù),并把得到的函數(shù)返回值存入變量m中*/printf("兩個(gè)數(shù)之中較大的數(shù)為:%d",m);}intmax(intx,inty)/*自定義函數(shù),求兩個(gè)數(shù)中的較大數(shù),定義了兩個(gè)整型的形式參數(shù)x和y*/{intz;z=x>y?x:y;return((z);}程序說(shuō)明:(1)這個(gè)程序由兩個(gè)函數(shù)組成,一個(gè)是主函數(shù)main(),一個(gè)是自定義函數(shù)max(),max()函數(shù)的功能是求x、y之中較大的數(shù),并將較大的數(shù)返回,總之,一個(gè)C程序可以由若干函數(shù)組成,其中必須有且僅有一個(gè)主函數(shù)main()。C程序總是從主函數(shù)開始執(zhí)行(不管它在程序中的什么位置),而其他函數(shù)只能被調(diào)用。(2)程序中的#include是將要用到的庫(kù)函數(shù)的頭文件包含到程序中來(lái),這個(gè)程序中因?yàn)橛玫搅藰?biāo)準(zhǔn)輸入輸出函數(shù)scanf()和printf(),才使用#include<stdio.h>。(3)函數(shù)名前的類型標(biāo)識(shí)符說(shuō)明了函數(shù)的類型,max函數(shù)的數(shù)據(jù)類型為int型,這也說(shuō)明該函數(shù)有返回值,而返回值的類型是int型。(4)如果形式參數(shù)不止一個(gè),那么每個(gè)形式參數(shù)之間則以逗號(hào)分隔。(5)如果把intmax(intx,inty)寫成intmax(intx,y)是錯(cuò)誤的,因此,即使多個(gè)形式參數(shù)的類型一致,也要單獨(dú)定義。(6)如果被調(diào)用函數(shù)在調(diào)用函數(shù)的后面定義,則必須在調(diào)用函數(shù)中進(jìn)行聲明。函數(shù)聲明的一般形式為:類型標(biāo)識(shí)符函數(shù)名([形參表列]);如:本例的intmax(intx,inty);三、函數(shù)調(diào)用的方式在程序中是通過(guò)對(duì)函數(shù)的調(diào)用來(lái)執(zhí)行函數(shù)體的,其過(guò)程與其它語(yǔ)言的子程序調(diào)用相似。C語(yǔ)言中,函數(shù)調(diào)用的一般形式為:函數(shù)名(實(shí)際參數(shù)列表)如果是調(diào)用無(wú)參函數(shù),則實(shí)際參表列可以沒(méi)有,但括弧不能省略。實(shí)際參數(shù)表中的參數(shù)可以是常數(shù),變量或其它構(gòu)造類型數(shù)據(jù)及表達(dá)式。各實(shí)參之間用逗號(hào)分隔,實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類型應(yīng)一致。在C語(yǔ)言中,可以用以下幾種方式調(diào)用函數(shù):1.函數(shù)表達(dá)式:函數(shù)作為表達(dá)式中的一項(xiàng)出現(xiàn)在表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運(yùn)算。這種方式要求函數(shù)是有返回值的。例如:z=max(x,y)是一個(gè)賦值表達(dá)式,把max的返回值賦予變量z。2.函數(shù)語(yǔ)句:函數(shù)調(diào)用的一般形式加上分號(hào)即構(gòu)成函數(shù)語(yǔ)句。例如:printf("%d",a);scanf("%d",&b);都是以函數(shù)語(yǔ)句的方式調(diào)用函數(shù)。這時(shí)不要求函數(shù)帶回值,只要求函數(shù)完成一定的操作。3.函數(shù)實(shí)參:函數(shù)作為另一個(gè)函數(shù)調(diào)用的實(shí)際參數(shù)出現(xiàn)。這種情況是把該函數(shù)的返回值作為實(shí)參進(jìn)行傳送,因此要求該函數(shù)必須是有返回值的。例如:printf("%d",max(x,y));即是把max調(diào)用的返回值又作為printf函數(shù)的實(shí)參來(lái)使用的。四、對(duì)被調(diào)用函數(shù)的聲明在一個(gè)函數(shù)中調(diào)用另一函數(shù)(即被調(diào)用函數(shù))需要具備哪些條件呢?首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)(是庫(kù)函數(shù)或用戶自己定義的函數(shù))。但只有這一條件還不夠。如果使用庫(kù)函數(shù),一般還應(yīng)該在本文件開頭用#include命令將用到的庫(kù)函數(shù)的頭文件包含到程序中來(lái)。例如,前面程序中已經(jīng)用過(guò)的:#include"stdio.h",其中"stdio.h"是一個(gè)“頭文件”,stdio是Standardinput&output的縮寫,意為“標(biāo)準(zhǔn)輸入輸出”。在stdio.h中放了輸入輸出庫(kù)函數(shù)所用到的一些宏定義信息。如果不包含“stdio.h”文件中的信息就無(wú)法使用輸入輸出庫(kù)中的函數(shù)。同樣如果用到數(shù)學(xué)庫(kù)中的函數(shù),應(yīng)該用#include"math.h"。如果使用用戶自己定義的函數(shù),而且該函數(shù)與調(diào)用它的函數(shù)(即主調(diào)函數(shù))在同一個(gè)文件中,一般還應(yīng)該在調(diào)函數(shù)中對(duì)被調(diào)用函數(shù)的返回值類型作說(shuō)明。這種類型說(shuō)明的一般形式為:函數(shù)類型被調(diào)用函數(shù)的函數(shù)名(類型1參數(shù)名1,類型2參數(shù)名2);C語(yǔ)言規(guī)定:以下幾種情況,可以不必在調(diào)用函數(shù)前對(duì)被調(diào)函數(shù)作說(shuō)明。1.若函數(shù)的值是整型或字符型,可以不必進(jìn)行說(shuō)明,系統(tǒng)對(duì)它們自動(dòng)按整型說(shuō)明。但是使用這種方法時(shí),系統(tǒng)無(wú)法對(duì)參數(shù)的類型做檢查。若調(diào)用函數(shù)時(shí)參數(shù)使用不當(dāng),在編譯時(shí)也不會(huì)報(bào)錯(cuò)。因此,為了程序清晰和安全,建議都加以說(shuō)明為好。2.若被調(diào)函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,則不必加以說(shuō)明了。3.若已在所有函數(shù)定義之前,在文件的開頭,在函數(shù)的外部已說(shuō)明了函數(shù)類型,則在主調(diào)函數(shù)中不必對(duì)所調(diào)用的函數(shù)再作類型說(shuō)明。除了以上三種情況外,都應(yīng)該按上述介紹的方法對(duì)所調(diào)用函數(shù)的返回值作類型說(shuō)明,否則編譯時(shí)就會(huì)出現(xiàn)錯(cuò)誤?!景咐?-3】編寫一個(gè)求三個(gè)數(shù)均值的函數(shù),要求如下:函數(shù)名:average;參數(shù)分別是:doublea,doubleb,doublec;返回值類型:double。函數(shù)功能:要求函數(shù)返回a,b,c三個(gè)浮點(diǎn)數(shù)的均值。#include<stdio.h>main(){floataverage(floata,floatb,floatc);/*對(duì)被調(diào)函數(shù)的說(shuō)明*/floatx,y,z,c;printf("請(qǐng)輸入三個(gè)浮點(diǎn)數(shù):");scanf("%f,%f",&x,&y,&z);c=average(x,y,z);/*調(diào)用函數(shù)aveage求三個(gè)浮點(diǎn)數(shù)的平均值*/printf("三個(gè)浮點(diǎn)數(shù)的平均值是:%f",c);}floataverage(floata,floatb,floatc)/*定義average函數(shù)*/{floatave;ave=(a+b+c)/3.0;return(ave);}【注意】主函數(shù)中的ave變量要定義float類型,average函數(shù)的類型也為float類型。第二節(jié)函數(shù)的參數(shù)傳遞在程序中,如果僅僅用函數(shù)代替一個(gè)語(yǔ)句序列,那么函數(shù)的作用就不大了。一般情況下,常常要求同一個(gè)函數(shù)可以根據(jù)不同的數(shù)據(jù),進(jìn)行相同的處理之后得到不同的結(jié)果,這樣,函數(shù)與函數(shù)之間通常要傳遞數(shù)據(jù)和計(jì)算結(jié)果。C語(yǔ)言中采用參數(shù)、返回值和全局變量三種方式進(jìn)行數(shù)據(jù)傳遞。主調(diào)函數(shù)與被調(diào)函數(shù)之間是雙向傳遞數(shù)據(jù),當(dāng)調(diào)用函數(shù)時(shí),通過(guò)函數(shù)的參數(shù),主調(diào)函數(shù)為形參提供數(shù)據(jù),調(diào)用結(jié)束時(shí),被調(diào)函數(shù)通過(guò)返回語(yǔ)句將函數(shù)的運(yùn)行結(jié)果(稱為返回值)帶回主調(diào)函數(shù)中,函數(shù)之間還可以通過(guò)使用全局變量,在一個(gè)函數(shù)內(nèi)使用其他函數(shù)中的某些變量的結(jié)果,本節(jié)僅討論函數(shù)的參數(shù)傳遞和函數(shù)的返回值,一、形式參數(shù)和實(shí)際參數(shù)形式參數(shù)(簡(jiǎn)稱“形參”)是指定義函數(shù)時(shí),跟在函數(shù)名后的小括號(hào)內(nèi)的變量名。實(shí)際參數(shù)(簡(jiǎn)稱“實(shí)參”)則是指調(diào)用函數(shù)時(shí),跟在函數(shù)名后的小括號(hào)內(nèi)的表達(dá)式。在C語(yǔ)言中,實(shí)參向形參傳送的方式是“值傳遞”。C語(yǔ)言函數(shù)參數(shù)采用“值傳遞”的方法,其含義是:在調(diào)用函數(shù)時(shí),將實(shí)參變量的值取出來(lái),復(fù)制給形參變量,使形參變量在數(shù)值上與實(shí)參變量相等,在函數(shù)內(nèi)部使用從實(shí)參中復(fù)制來(lái)的值進(jìn)行處理。C語(yǔ)言中的實(shí)參可以是一個(gè)表達(dá)式,調(diào)用時(shí)先計(jì)算表達(dá)式的值,再將結(jié)果(值)復(fù)制到形參對(duì)應(yīng)的存儲(chǔ)單元中,一旦函數(shù)執(zhí)行完畢,這些存儲(chǔ)單元所保存的值不再保留。形式參數(shù)是函數(shù)的局部變量,僅在函數(shù)內(nèi)部才有意義,不能用它來(lái)傳遞函數(shù)的結(jié)果。實(shí)參與形參的個(gè)數(shù)必須相同,順序一致,并且實(shí)參與對(duì)應(yīng)的形參類型應(yīng)相同或賦值兼容。值傳遞的優(yōu)點(diǎn)在于被調(diào)用的函數(shù)不可能改變主調(diào)函數(shù)中變量的值,而只能改變它的局部的臨時(shí)副本。這樣就可以避免被調(diào)用函數(shù)的操作對(duì)調(diào)用函數(shù)中的變量可能產(chǎn)生的副作用。前面的案例6-2和6-3都是采用值傳遞的方式進(jìn)行參數(shù)傳遞的?!景咐?-4】分析如下的程序代碼,看看結(jié)果如何?若在主函數(shù)中變量a=5,b=10,編寫一個(gè)函數(shù)交換主函數(shù)中兩個(gè)變量的值,使變量a=10,b=5。#include<stdio.h>voidswap(intx,inty){inttemp;/*借助臨時(shí)變量交換兩個(gè)形參變量x和y的值*/temp=x;x=y;y=temp;}main(){inta,b;a=5;b=10;/*說(shuō)明兩個(gè)變量并賦初值*/printf("beforeswapa=%d,b=%d\n",a,b);swap(a,b);/*用變量a和b作為實(shí)際參數(shù)調(diào)用函數(shù)*/printf("afterswapa=%d,b=%d\n",a,b);}程序說(shuō)明:在程序中調(diào)用swap時(shí),實(shí)參變量a和b的值傳遞給了形參變量x和y,并且在函數(shù)的內(nèi)部完成了x和y值的交換,但是形參變量x和y與實(shí)參變量a和b各自使用自己的內(nèi)存區(qū)域,他們之間僅僅在參數(shù)傳遞時(shí)進(jìn)行了數(shù)值的傳遞,所以變量x和y的變化并不影響變量a和b。因此,在主程序中變量a,b的值還是沒(méi)有變化?!鞠胍幌搿咳绾尾拍芡瓿勺兞縜和b的值的互換呢?二、函數(shù)的返回值通常,希望通過(guò)函數(shù)調(diào)用使主調(diào)函數(shù)能得到一個(gè)確定的值,這就是函數(shù)的返回值。函數(shù)的返回值用return語(yǔ)句來(lái)實(shí)現(xiàn)返回語(yǔ)句格式:return(表達(dá)式);或return表達(dá)式;下面對(duì)函數(shù)返回值作一些說(shuō)明:1、函數(shù)中可以有多個(gè)return語(yǔ)句,執(zhí)行到哪一個(gè)return語(yǔ)句,就從哪一個(gè)return語(yǔ)句返回。Return語(yǔ)句后面的括弧也可以不要,如:returnx;它與return(x)是相同的。2、return只能返回一個(gè)值,而不能返回多個(gè)值。下面的使用是錯(cuò)誤的:return(x,y);試圖讓一個(gè)函數(shù)返回兩個(gè)值,從數(shù)學(xué)上也是講不通的。3、函數(shù)值的類型。既然函數(shù)有返回值,這個(gè)值當(dāng)然應(yīng)屬于某個(gè)確定的類型,因此應(yīng)當(dāng)在定義函數(shù)時(shí)指定函數(shù)值的類型。例如:intmax(x,y);函數(shù)值為整型,charstr(c1,c2);函數(shù)值為字符型floatmin(x,y);函數(shù)值為浮點(diǎn)型。C語(yǔ)言規(guī)定,凡不加類型說(shuō)明的函數(shù),一律自動(dòng)按整型處理。return(表達(dá)式)語(yǔ)句中的表達(dá)式值的類型應(yīng)與定義函數(shù)時(shí)函數(shù)的類型一致。如果不一致,以定義函數(shù)時(shí)規(guī)定的函數(shù)類型為準(zhǔn)進(jìn)行類型轉(zhuǎn)換。4、如果函數(shù)中沒(méi)有return語(yǔ)句,并不代表函數(shù)沒(méi)有返回值,只能說(shuō)明函數(shù)的返回值是一個(gè)不確定的數(shù)5、為了明確規(guī)定函數(shù)沒(méi)有返回值,可以用void關(guān)鍵字來(lái)定義函數(shù),表示“無(wú)類型”。如下:voidecholine(){}這樣函數(shù)就絕對(duì)沒(méi)有返回值了。一般情況下,如果函數(shù)沒(méi)有返回值,一定要將函數(shù)定義為void類型的。三、數(shù)組作函數(shù)參數(shù)前面幾節(jié)中,我們使用的函數(shù)參數(shù)均是簡(jiǎn)單變量,如int型、float型、char型等。函數(shù)參數(shù)除了可以是簡(jiǎn)單變量之外,還可以是數(shù)組。數(shù)組作函數(shù)參數(shù)分兩種情形,一種是數(shù)組元素作函數(shù)參數(shù),另一種則是數(shù)組名作函數(shù)參數(shù)。(一)數(shù)組元素作函數(shù)參數(shù)數(shù)組元素就是下標(biāo)變量,它與普通變量并無(wú)區(qū)別。因此它作為函數(shù)實(shí)參使用與普通變量是完全相同的,在發(fā)生函數(shù)調(diào)用時(shí),把作為實(shí)參的數(shù)組元素的值傳送給形參,實(shí)現(xiàn)單向的值傳送?!景咐?-5】判別一個(gè)整數(shù)數(shù)組中各元素的值,若大于0則輸出該值,若小于等于0則輸出0值。分析:首先定義一個(gè)無(wú)返回值函數(shù)output,并說(shuō)明其形參n為整型變量。在函數(shù)體中根據(jù)n值輸出相應(yīng)的結(jié)果。在main函數(shù)中用一個(gè)for語(yǔ)句輸入數(shù)組各元素,每輸入一個(gè)就以該元素作實(shí)參調(diào)用一次output函數(shù),即把數(shù)組元素a[i]的值傳送給形參n,供output函數(shù)使用。#include<stdio.h>voidoutput(intn){if(n>0)printf("%d",n);

elseprintf("0");}voidmain(){inta[5];inti;printf("請(qǐng)輸入5個(gè)整數(shù):\n");for(i=0;i<5;i++){scanf("%d",&a[i]);output(a[i]);/*函數(shù)的參數(shù)是數(shù)組元素*/}}(二)數(shù)組名作函數(shù)參數(shù)前面已經(jīng)討論過(guò),在變量作函數(shù)參數(shù)時(shí),所進(jìn)行的值傳送是單向的。即只能從實(shí)參傳向形參,不能從形參傳回實(shí)參。形參的初值和實(shí)參相同,而形參的值發(fā)生改變后,實(shí)參并不變化,兩者的終值是不同的。而當(dāng)用數(shù)組名作函數(shù)參數(shù)時(shí),情況則不同。由于實(shí)際上形參和實(shí)參為同一數(shù)組,因此當(dāng)形參數(shù)組發(fā)生變化時(shí),實(shí)參數(shù)組也隨之變化。當(dāng)然這種情況不能理解為發(fā)生了“雙向”的值傳遞。但從實(shí)際情況來(lái)看,調(diào)用函數(shù)之后實(shí)參數(shù)組的值將由于形參數(shù)組值的變化而變化?!景咐?-6】數(shù)組student中存放了一個(gè)學(xué)生5門課程的成績(jī),求平均成績(jī)。#include<stdio.h>floatave(floats[5])/*求平均值*/{inti;floatave1,sum=s[0];for(i=1;i<5;i++)sum=sum+s[i];ave1=sum/5;returnave1;}voidmain(){floatscore[5],average;inti;printf("\n輸入5門課的成績(jī):\n");for(i=0;i<5;i++)scanf("%f",&score[i]);average=ave(score);/*以數(shù)組名為實(shí)參調(diào)用ave函數(shù)*/printf("平均分?jǐn)?shù)是:%5.2f",average);}【注意】①程序中用數(shù)組名作函數(shù)實(shí)參,函數(shù)ave的形參也定義為數(shù)組。注意,應(yīng)在主調(diào)函數(shù)和被調(diào)用函數(shù)中分別定義數(shù)組,例中s是形參數(shù)組名,score是實(shí)參數(shù)組名,分別在其所在函數(shù)中定義,不能只在一方定義。②數(shù)組名作函數(shù)參數(shù)時(shí),實(shí)參和形參都應(yīng)為數(shù)組名,此時(shí),實(shí)參與形參的傳遞為“地址傳遞”,所謂地址傳遞是指在調(diào)用函數(shù)時(shí),系統(tǒng)并沒(méi)有給形參數(shù)組分配新的存儲(chǔ)空間,而只是將實(shí)參數(shù)組的首地址傳送給形參數(shù)組,使形參數(shù)組與實(shí)參數(shù)組共用同一數(shù)組空間。第三節(jié)變量的分類一、變量的作用域變量的作用域是指變量的有效范圍。C語(yǔ)言允許把一個(gè)大的程序分成幾個(gè)文件,每個(gè)文件分別包含若干函數(shù),各個(gè)文件可以分別進(jìn)行編譯,然后再鏈接到一起形成一個(gè)完整的可執(zhí)行文件。程序中各個(gè)函數(shù)之間的通信可以通過(guò)參數(shù)傳遞來(lái)實(shí)現(xiàn),也可以通過(guò)使用公共的數(shù)據(jù)來(lái)實(shí)現(xiàn)。那么,哪些數(shù)據(jù)可以被各個(gè)函數(shù)共用而哪些數(shù)據(jù)又不能共用呢?這就涉及到變量的作用范圍問(wèn)題。根據(jù)變量的作用范圍的不同,可將變量分為局部變量和全局變量。(一)局部變量局部變量是指在函數(shù)內(nèi)部或程序塊內(nèi)定義的變量。局部變量只在定義它的函數(shù)或程序塊內(nèi)有效。在函數(shù)內(nèi)定義的變量以及形式參數(shù)均是局部變量。【案例6-7】有關(guān)局部變量的例子。分析:在程序中兩個(gè)num變量都是局部變量,只在本身函數(shù)里可見。因此,在兩個(gè)函數(shù)出現(xiàn)同名的變量不會(huì)互相干擾。#include<stdio.h>voidadd(int);main(){intnum=5;add(num);printf("\n%d",num);/*輸出5*/}voidadd(intnum){num++;printf("%d",num);/*輸出6*/}【試一試】運(yùn)行程序,看看你的結(jié)果是否正確。(二)全局變量在函數(shù)外部定義的變量,從其的定義位置開始,到本文件結(jié)束為止的所有函數(shù)都可以直接引用,所以這種變量又稱為全局變量或外部變量。例如:a、b的作用范圍x、y的作用范圍intx,y;main(){/*...*/}inta,b;fun1(){a、b的作用范圍x、y的作用范圍/*...*/}fun2(){/*...*/}對(duì)于具有全局作用域的變量,我們可以在程序的任何位置訪問(wèn)它們。當(dāng)一個(gè)變量是在所有函數(shù)的外部聲明,也就是在程序的開頭聲明,那么這個(gè)變量就是全局變量?!景咐?-8】有關(guān)全局變量的例子。#include<stdio.h>voidadd();intnum=10;/*num是一個(gè)全局變量*/main(){add();printf("\n%d",num);/*輸出11*/}voidadd(){num++;printf("%d",num);/*輸出11*/}【說(shuō)明】上面的main()和add()里面,并沒(méi)有聲明num,但是在最后輸出的時(shí)候卻要求輸出num,這是由于在程序的開始聲明了num是全局變量,也就是在所有函數(shù)里都可以使用這個(gè)變量。這時(shí)候一個(gè)函數(shù)里改變了變量的值,其他函數(shù)里的值也會(huì)出現(xiàn)影響。上面的例子輸出都是11,因?yàn)樵赼dd()函數(shù)里改變了num的值,由于num是全局變量,就好象它們兩個(gè)函數(shù)共用一個(gè)變量,所以在main()函數(shù)里的num也隨之改變了。二、變量的存儲(chǔ)類型在C語(yǔ)言中,對(duì)變量的存儲(chǔ)類型說(shuō)明有以下四種:自動(dòng)變量(auto)、寄存器變量(register)、外部變量(extern)、靜態(tài)變量(static)。(一)Auto變量1.定義定義格式:[auto]數(shù)據(jù)類型變量表;例如:inta;autointb;2.說(shuō)明(1)自動(dòng)變量屬于動(dòng)態(tài)存儲(chǔ)方式。在函數(shù)中定義的自動(dòng)變量,只在該函數(shù)內(nèi)有效;函數(shù)被調(diào)用時(shí)分配存儲(chǔ)空間,調(diào)用結(jié)束就釋放。在復(fù)合語(yǔ)句中定義的自動(dòng)變量,只在該復(fù)合語(yǔ)句中有效;退出復(fù)合語(yǔ)句后,也不能再使用,否則將引起錯(cuò)誤。(2)定義但不初始化,則其值是不確定的。如果初始化,則賦初值操作是在調(diào)用時(shí)進(jìn)行的,且每次調(diào)用都要重新賦一次初值。(3)由于自動(dòng)變量的作用域和生存期,都局限于定義它的個(gè)體內(nèi)(函數(shù)或復(fù)合語(yǔ)句),因此不同的個(gè)體中允許使用同名的變量而不會(huì)混淆。即使在函數(shù)內(nèi)定義的自動(dòng)變量,也可與該函數(shù)內(nèi)部的復(fù)合語(yǔ)句中定義的自動(dòng)變量同名。(二)Static變量1.定義定義格式:static數(shù)據(jù)類型內(nèi)部變量表;例如:staticintb;2.說(shuō)明(1)靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ)。在程序執(zhí)行過(guò)程中,即使所在函數(shù)調(diào)用結(jié)束也不釋放。即在程序執(zhí)行期間,靜態(tài)內(nèi)部變量始終存在,但其它函數(shù)是不能引用它們的。(2)定義但不初始化,則自動(dòng)賦以“0”(整型和實(shí)型)或'\0'(字符型);且每次調(diào)用它們所在的函數(shù)時(shí),不再重新賦初值,只是保留上次調(diào)用結(jié)束時(shí)的值?。?)需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值或變量只被引用而不改變其值,可以使用靜態(tài)內(nèi)部變量(4)靜態(tài)全局變量,只能在本文件中的各個(gè)函數(shù)中使用,其他文件中的函數(shù)不能使用。(三)Register變量一般情況下,變量的值都是存儲(chǔ)在內(nèi)存中的。為提高執(zhí)行效率,C語(yǔ)言允許將局部變量的值存放到寄存器中,這種變量就稱為寄存器變量。定義格式如下:1.定義

register數(shù)據(jù)類型變量表;2.說(shuō)明(1)只有局部變量才能定義成寄存器變量,即全局變量不行。(2)允許使用的寄存器數(shù)目是有限的,不能定義任意多個(gè)寄存器變量。(四)Extern變量1.定義定義格式:extern數(shù)據(jù)類型變量表;例如:externinta;2.說(shuō)明(1)在一個(gè)程序文件中,后面定義的全局變量,前面函數(shù)中要使用時(shí),必須把該變量說(shuō)明為extern變量。(2)在多文件程序中,一個(gè)文件中定義的全局變量,其他文件中要使用時(shí),必須把該變量說(shuō)明為extern變量。第四節(jié)函數(shù)的作用域一般情況下,函數(shù)可以被其他的所有函數(shù)調(diào)用,即:可以把函數(shù)看作是全局的。但如果一個(gè)函數(shù)被聲明成靜態(tài)的,則該函數(shù)只能在定義它的文件中被調(diào)用,而其他文件中的函數(shù)則不能調(diào)用它。根據(jù)函數(shù)是否能被其他文件調(diào)用,可將函數(shù)分為內(nèi)部函數(shù)和外部函數(shù)。一、內(nèi)部函數(shù)(局部函數(shù))1.概念如果一個(gè)函數(shù)只能被本文件中其他函數(shù)調(diào)用,而不能被其他文件中的函數(shù)調(diào)用,則該函數(shù)被稱為內(nèi)部函數(shù)。2.定義定義格式:static數(shù)據(jù)類型函數(shù)名(變量表);例如:staticintfunc(inta,intb);3.說(shuō)明內(nèi)部函數(shù)又稱靜態(tài)函數(shù)。使用內(nèi)部函數(shù),可以使函數(shù)只局限于所在文件,如果在不同的文件中有同名的內(nèi)部函數(shù),互不干擾。二、外部函數(shù)(全局函數(shù))1.概念如果一個(gè)函數(shù)能被本文件和其他文件中的函數(shù)調(diào)用,則該函數(shù)為外部函數(shù)。2.定義定義格式:[extern]數(shù)據(jù)類型函數(shù)名(變量表);例如:externintfunc(inta,intb);3.說(shuō)明一般定義函數(shù)時(shí),前面都不加extern,此時(shí)函數(shù)默認(rèn)為外部函數(shù),外部函數(shù)在其他文件中調(diào)用時(shí),需用extern進(jìn)行聲明。第五節(jié)項(xiàng)目任務(wù):輸入輸出子模塊的編程實(shí)現(xiàn)【項(xiàng)目案例】輸入輸出子模塊的編程實(shí)現(xiàn)分析:前幾章中,我們完成了一些簡(jiǎn)單的成績(jī)管理功能,現(xiàn)在我們采用模塊化程序設(shè)計(jì)的思想來(lái)對(duì)它進(jìn)行一些修改。我們將在main函數(shù)中實(shí)現(xiàn)菜單顯示及選擇功能,而學(xué)生成績(jī)的輸入和顯示功能則分別用函數(shù)來(lái)實(shí)現(xiàn),再把程序模塊像搭積木一樣裝配起來(lái)形成一個(gè)完整的系統(tǒng)。#defineN30#include"stdio.h"/*I/O函數(shù)*/#include"conio.h"/*屏幕操作函數(shù)*/intnumber[N];charname[N][9];floatmark[N][6];voidshuru()/*定義輸入學(xué)生信息的函數(shù)*/{inti;charch;printf("%10s%10s%10s%10s%10s%10s%10s\n","學(xué)號(hào)","姓名","語(yǔ)文","數(shù)學(xué)","英語(yǔ)","物理","化學(xué)");for(i=0;i<N;i++){printf("\n請(qǐng)輸入學(xué)號(hào):");scanf

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論