C語言程序設(shè)計(jì)基礎(chǔ)課件_第1頁(yè)
C語言程序設(shè)計(jì)基礎(chǔ)課件_第2頁(yè)
C語言程序設(shè)計(jì)基礎(chǔ)課件_第3頁(yè)
C語言程序設(shè)計(jì)基礎(chǔ)課件_第4頁(yè)
C語言程序設(shè)計(jì)基礎(chǔ)課件_第5頁(yè)
已閱讀5頁(yè),還剩97頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C語言程序設(shè)計(jì)基礎(chǔ)主講教師:代祖華C語言程序設(shè)計(jì)基礎(chǔ)主講教師:代祖華1主要參考書目《C程序設(shè)計(jì)》(第二版)及配套的程序設(shè)計(jì)題解與設(shè)計(jì)指導(dǎo),譚浩強(qiáng)著,清華大學(xué)出版社?!稄膯栴}到程序—程序設(shè)計(jì)與C語言引論》裘宗燕著,機(jī)械工業(yè)出版社?!冻绦蛟O(shè)計(jì)基礎(chǔ)》及配套的程序設(shè)計(jì)題解與設(shè)計(jì)指導(dǎo)(第二版),吳文虎編著,清華大學(xué)出版社。主要參考書目《C程序設(shè)計(jì)》(第二版)及配套的程序設(shè)計(jì)題解2第4章函數(shù)4.1函數(shù)的定義4.2函數(shù)的調(diào)用4.3變量的作用域與存儲(chǔ)特性4.4函數(shù)間數(shù)據(jù)的傳遞4.5遞歸函數(shù)4.6綜合編程舉例第4章函數(shù)4.1函數(shù)的定義4.2函數(shù)的調(diào)用4.33/*簡(jiǎn)單函數(shù)示例,案例4_1*//*功能:定義一個(gè)求較大數(shù)的函數(shù)并在主函數(shù)中調(diào)用*/intmax(intn1,intn2) /*定義函數(shù)max()*/{return(n1>n2?n1:n2);}main(){intmax(intn1,intn2); /*函數(shù)說明*/intnum1,num2,maxnum;printf("inputtwonumbers:\n");scanf(“%d%d”,&num1,&num2);maxnum=max(num1,num2);printf("max=%d\n",maxnum);getch(); /*使程序暫停,按任一鍵繼續(xù)*/}

/*簡(jiǎn)單函數(shù)示例,案例4_1*/44.1函數(shù)的定義從函數(shù)使用的角度來看,C語言的函數(shù)可以分為兩類:標(biāo)準(zhǔn)庫(kù)函數(shù)和用戶自定義函數(shù)。本章介紹后者。一.標(biāo)準(zhǔn)庫(kù)函數(shù)與頭文件1.TurboC系統(tǒng)提供了400多個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù)(參見附錄五),按功能可以分為:(1)類型轉(zhuǎn)換函數(shù),(2)字符判別與轉(zhuǎn)換函數(shù),(3)字符串處理函數(shù),(4)標(biāo)準(zhǔn)I/O函數(shù),(5)文件管理函數(shù),(6)數(shù)學(xué)運(yùn)算函數(shù)等。

它們的執(zhí)行效率高,用戶需要時(shí),可在程序中直接進(jìn)行調(diào)用。4.1函數(shù)的定義從函數(shù)使用的角度來看,C語言的函數(shù)可以分5

C語言庫(kù)函數(shù)所用到的常量、外部變量、函數(shù)類型和參數(shù)說明,都在相應(yīng)的頭文件(擴(kuò)展名為.h)中聲明,這些文件通常存放在系統(tǒng)目錄tc\include。如:2.頭文件stdio.h文件:標(biāo)準(zhǔn)輸入輸出函數(shù)所用的常量、結(jié)構(gòu)、宏定義、函數(shù)的類型、參數(shù)的個(gè)數(shù)與類型的描述。

(2)math.h文件:與數(shù)學(xué)函數(shù)有關(guān)的常量、結(jié)構(gòu)及相應(yīng)的函數(shù)類型和參數(shù)描述。

(3)string.h文件:與字符串操作函數(shù)有關(guān)的常量、結(jié)構(gòu)以及相應(yīng)的函數(shù)類型和參數(shù)描述。

C語言庫(kù)函數(shù)所用到的常量、外部變量、函數(shù)類型6二.用戶自定義函數(shù)1.函數(shù)分類(從函數(shù)的形式看)無參函數(shù)有參函數(shù)◆函數(shù)定義時(shí)無參數(shù)說明◆調(diào)用無參函數(shù)一般用來執(zhí)行指定的一組操作◆主調(diào)函數(shù)不傳送數(shù)據(jù)給被調(diào)函數(shù)●函數(shù)定義時(shí)定義了一個(gè)或一個(gè)以上的參數(shù)●調(diào)用時(shí)將要處理的數(shù)據(jù)傳送給被調(diào)函數(shù)二.用戶自定義函數(shù)1.函數(shù)分類(從函數(shù)的形式看)無參函數(shù)7定義形式二:函數(shù)值類型名函數(shù)名(形式參數(shù)類型及參數(shù)說明){數(shù)據(jù)說明部分語句}定義形式一:函數(shù)值類型名函數(shù)名(形式參數(shù)列表)形式參數(shù)說明{數(shù)據(jù)說明部分語句}2.函數(shù)定義形式ANSI風(fēng)格如:intmax(n1,n2)intn1,n2;如:intmax(intn1,intn2)定義形式二:定義形式一:2.函數(shù)定義形式ANSI風(fēng)格如:83.函數(shù)由函數(shù)首部與函數(shù)體兩部分構(gòu)成。(1)函數(shù)首部◆函數(shù)首部包括函數(shù)值類型、函數(shù)名、參數(shù)類型及參數(shù)說明.

◆函數(shù)值類型指定所定義函數(shù)返回值的類型,可以是簡(jiǎn)單數(shù)據(jù)類型、void類型或構(gòu)造類型等?!霎?dāng)函數(shù)值類型為void時(shí),表示函數(shù)無返回值,相當(dāng)于其它語言的過程。當(dāng)函數(shù)值類型為int時(shí),可省略其類型的說明,建議不使用缺省形式類型說明.◆函數(shù)名是函數(shù)的標(biāo)識(shí)符,遵循C語言標(biāo)識(shí)符的命名規(guī)則,區(qū)分大小寫?!鰹榱伺c調(diào)用函數(shù)提供的實(shí)際參數(shù)區(qū)別開,將函數(shù)定義中的參數(shù)表稱為形式參數(shù)表,簡(jiǎn)稱形參,處在函數(shù)名后的一對(duì)圓括號(hào)中。要特別注意的是,無論函數(shù)是否有形式參數(shù),函數(shù)名后的圓括號(hào)不可省,并且圓括號(hào)之后不能接“;”。3.函數(shù)由函數(shù)首部與函數(shù)體兩部分構(gòu)成。(1)函數(shù)首部◆函9◆函數(shù)體結(jié)束在“}”括號(hào)處。(2)函數(shù)體◆函數(shù)首部之后的花括號(hào)“{}”部分為函數(shù)體?!龊瘮?shù)體內(nèi)數(shù)據(jù)說明部分在前,執(zhí)行語句部分在后?!艉瘮?shù)體中說明的變量是該函數(shù)調(diào)用時(shí)有效的局部變量,執(zhí)行語句是實(shí)際生成命令代碼的部分。■函數(shù)的功能由函數(shù)體內(nèi)的各個(gè)語句的執(zhí)行來實(shí)現(xiàn)。◆空函數(shù)定義時(shí)無參數(shù),{}內(nèi)為空被調(diào)用時(shí),不執(zhí)行任何操作就立即返回。例如:voidprint_report(void){}◆函數(shù)體結(jié)束在“}”括號(hào)處。(2)函數(shù)體◆函數(shù)首部之后的花括104.2函數(shù)的調(diào)用★在C語言的一般函數(shù)體中,可以包含對(duì)其它函數(shù)的調(diào)用,稱為函數(shù)的嵌套調(diào)用,甚至包含對(duì)自身的調(diào)用,稱為函數(shù)的遞歸調(diào)用?!钜粋€(gè)函數(shù)一旦被定義,就可在程序的其它函數(shù)中使用它,這個(gè)過程稱為函數(shù)調(diào)用。一.函數(shù)的一般調(diào)用與聲明函數(shù)名(實(shí)際參數(shù)列表)1.函數(shù)調(diào)用形式函數(shù)調(diào)用的一般形式:4.2函數(shù)的調(diào)用★在C語言的一般函數(shù)體中,可以包含對(duì)其它11◆實(shí)際參數(shù)簡(jiǎn)稱為實(shí)參,參數(shù)之間以逗號(hào)分隔。■函數(shù)調(diào)用時(shí),實(shí)參與形參應(yīng)保持個(gè)數(shù)、次序及類型的一致性,以確保實(shí)參與形參之間數(shù)據(jù)的正確傳遞。◆實(shí)際參數(shù)可以是表達(dá)式、常量、變量(調(diào)用時(shí)必須有確定的值或確定的地址)。■形式參數(shù)必須為變量。■當(dāng)實(shí)際參數(shù)的個(gè)數(shù)、次序、類型與對(duì)應(yīng)形式參數(shù)的個(gè)數(shù)、次序、類型不一致時(shí),系統(tǒng)并不提示錯(cuò)誤,后果卻難以預(yù)測(cè)。2.格式說明◆實(shí)際參數(shù)簡(jiǎn)稱為實(shí)參,參數(shù)之間以逗號(hào)分隔?!龊瘮?shù)調(diào)用時(shí),實(shí)123.C語言中函數(shù)調(diào)用的三種形式:語句調(diào)用表達(dá)式調(diào)用函數(shù)參數(shù)調(diào)用在函數(shù)調(diào)用后加“;”,構(gòu)成一個(gè)語句。調(diào)用函數(shù)的目的可能是執(zhí)行一個(gè)動(dòng)作或完成特定的功能。大多數(shù)函數(shù)的調(diào)用形式。被調(diào)用函數(shù)執(zhí)行的結(jié)果為調(diào)用函數(shù)提供一個(gè)值。調(diào)用函數(shù)通過表達(dá)式接收值。被調(diào)函數(shù)作為某個(gè)函數(shù)的一個(gè)參數(shù)。3.C語言中函數(shù)調(diào)用的三種形式:語句調(diào)用表達(dá)式調(diào)用函數(shù)參數(shù)13main()/*主函數(shù)中采用函數(shù)參數(shù)調(diào)用形式調(diào)用函數(shù)max*/{intx,y,z,m;scanf("%d,%d,%d",&x,&y,&z);printf("max=%d\n",max(max(x,y),z));/*內(nèi)層函數(shù)max2的值作為外層函數(shù)max2的實(shí)參,整個(gè)函數(shù)max2的值又作函數(shù)printf的的實(shí)參*/}例函數(shù)參數(shù)調(diào)用形式調(diào)用函數(shù)max:intmax(intn1,intn2)/*求兩個(gè)數(shù)中較大者*/{inty;y=(n1>n2)?n1:n2;return(y);}main()/*主函數(shù)中采用函數(shù)參數(shù)調(diào)用形式調(diào)用函數(shù)ma144.函數(shù)聲明(函數(shù)說明)◆調(diào)用用戶自定義函數(shù)時(shí),一般調(diào)用函數(shù)和被調(diào)用函數(shù)應(yīng)在同一個(gè)文件中,在調(diào)用函數(shù)中對(duì)被調(diào)用函數(shù)返回值的類型、函數(shù)名稱、函數(shù)形式參數(shù)的類型進(jìn)行說明,這種說明稱為函數(shù)聲明?!龊瘮?shù)聲明的一般形式如下:類型名函數(shù)名(類型1形參1,…,類型n形參n);或類型名函數(shù)名(類型1,類型2,…,類型n);或類型名函數(shù)名();◆函數(shù)聲明是以語句形式出現(xiàn)的,因此其后有語句結(jié)束標(biāo)記“;”?!鋈艉瘮?shù)定義放在主調(diào)函數(shù)之前,遵循先定義后調(diào)用原則,函數(shù)聲明可以省略;若函數(shù)值的類型為整型或字符型,函數(shù)聲明可以省略;若在所有函數(shù)定義之前,已說明函數(shù)類型,函數(shù)聲明也可省略。4.函數(shù)聲明(函數(shù)說明)◆調(diào)用用戶自定義函數(shù)時(shí),一般調(diào)用函15二.形參、實(shí)參與函數(shù)調(diào)用過程形式參數(shù)(簡(jiǎn)稱形參)定義函數(shù)使用的參數(shù)實(shí)際參數(shù)(簡(jiǎn)稱實(shí)參)調(diào)用函數(shù)使用的參數(shù)◆C語言中,采用函數(shù)之間的參數(shù)傳遞方式從實(shí)參向形參傳遞。■C語言函數(shù)的參數(shù)傳遞均采用單向值傳遞方式(或稱復(fù)制方式)?!魡蜗蛑祩鬟f方式是指在函數(shù)調(diào)用時(shí),將實(shí)參之值傳遞給對(duì)應(yīng)的形式參數(shù),使形參具有與實(shí)參相同的值?!霎?dāng)實(shí)參是變量的地址值、指針常量或指針變量時(shí),實(shí)參傳遞給形參的是地址值,同樣是單向值傳遞方式。二.形參、實(shí)參與函數(shù)調(diào)用過程形式參數(shù)定義函數(shù)使用的參數(shù)實(shí)16案例4_2見教材145頁(yè)例4.2作業(yè):教材173頁(yè)4.1題1——5。三、函數(shù)的嵌套調(diào)用C語言允許在調(diào)用一個(gè)函數(shù)過程中又調(diào)用另外一個(gè)函數(shù)。這種調(diào)用方式稱為嵌套調(diào)用。案例4_3見教材147頁(yè)4.4案例4_2見教材145頁(yè)例4.2174.3內(nèi)部變量與外部變量

一、變量的作用域C語言中所有的變量都有自己的作用域。變量說明的位置不同,其作用域也不同,據(jù)此將C語言中的變量分為內(nèi)部變量和外部變量。1、內(nèi)部變量在一個(gè)函數(shù)內(nèi)部說明的變量是內(nèi)部變量,它只在該函數(shù)范圍內(nèi)有效。也就是說,只有在包含變量說明的函數(shù)內(nèi)部,才能使用被說明的變量,在此函數(shù)之外不能使用這些變量。所以內(nèi)部變量也稱“局部變量”。例如:4.3變量的作用域及存儲(chǔ)特性4.3內(nèi)部變量與外部變量一、變量的作用域4.3變18intf1(inta)/*函數(shù)f1*/{intb,c;……} /*a,b,c作用域:僅限于函數(shù)f1()中*/intf2(intx)/*函數(shù)f2*/{inty,z;……} /*x,y,z作用域:僅限于函數(shù)f2()中*/

main(){intm,n;……}/*m,n作用域:僅限于函數(shù)main()中*/intf1(inta)/*函數(shù)f1*/19關(guān)于局部變量的作用域還要說明以下幾點(diǎn):主函數(shù)main()中定義的內(nèi)部變量,只能在主函數(shù)中使用,其它函數(shù)不能使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義的內(nèi)部變量。因?yàn)橹骱瘮?shù)也是一個(gè)函數(shù),與其它函數(shù)是并列關(guān)系。這一點(diǎn)是與其它語言不同的,應(yīng)予以注意。形參變量也是內(nèi)部變量,屬于被調(diào)函數(shù);實(shí)參變量,則是調(diào)用函數(shù)的內(nèi)部變量。允許在不同的函數(shù)中定義同名變量,它們代表不同的對(duì)象,分配不同的單元,互不干擾,也不會(huì)發(fā)生混淆。在復(fù)合語句中也可定義變量,其作用域只在復(fù)合語句范圍內(nèi)。關(guān)于局部變量的作用域還要說明以下幾點(diǎn):20例4-4:voidf1(){intt=2;a*=t;b/=t;}voidmain(){inta,b;printf(”Entera,b:”);scanf(”%d,%d”,&a,&b);f1();/*調(diào)用函數(shù)f1()*/

printf(”a=%d,b=%d”,a,b);}

編譯程序會(huì)提示出錯(cuò):Undefinedsymbol‘a(chǎn)’和Undefinedsymbol‘b’。為什么?例4-4:編譯程序會(huì)提示出錯(cuò):212、外部變量在函數(shù)外部定義的變量稱為外部變量。外部變量不屬于任何一個(gè)函數(shù),其作用域是:從外部變量的定義位置開始,到本文件結(jié)束為止。外部變量可被作用域內(nèi)的所有函數(shù)直接引用,所以外部變量又稱全局變量。例4_5:輸入長(zhǎng)方體的長(zhǎng)(l)、寬(w)、高(h),求長(zhǎng)方體體積及正、側(cè)、頂三個(gè)面的面積。2、外部變量22

/*功能:利用全局變量計(jì)算長(zhǎng)方體的體積及三個(gè)面的面積*/ints1,s2,s3;intvs(inta,int,b,intc){intv; v=a*b*c;s1=a*b;s2=b*c;s3=a*c; returnv;}main(){intv,l,w,h;printf("\ninputlength,widthandheight:");scanf("%d%d%d",&l,&w,&h);v=vs(l,w,h);printf("v=%d,s1=%d,s2=%d,s3=%d\n",v,s1,s2,s3);getch();} /*功能:利用全局變量計(jì)算長(zhǎng)方體的體積及三個(gè)面的面積23對(duì)于全局變量還有以下幾點(diǎn)說明:外部變量可加強(qiáng)函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,但又使這些函數(shù)依賴外部變量,因而使得函數(shù)的獨(dú)立性降低。在同一源文件中,允許外部變量和內(nèi)部變量同名。在內(nèi)部變量的作用域內(nèi),外部變量將被屏蔽而不起作用。外部變量的作用域是從定義點(diǎn)到本文件結(jié)束。如果定義點(diǎn)之前的函數(shù)需要引用這些外部變量時(shí),需要在函數(shù)內(nèi)對(duì)被引用的外部變量進(jìn)行說明。外部變量說明的一般形式為:extern數(shù)據(jù)類型外部變量[,外部變量2……];外部變量的定義和外部變量的說明是兩回事。外部變量的定義,必須在所有的函數(shù)之外,且只能定義一次。而外部變量的說明,出現(xiàn)在要使用該外部變量的函數(shù)內(nèi),而且可以出現(xiàn)多次。對(duì)于全局變量還有以下幾點(diǎn)說明:24作業(yè)1、教材176頁(yè)1、3、42、實(shí)驗(yàn)名稱:函數(shù)實(shí)驗(yàn)內(nèi)容:上機(jī)調(diào)試和運(yùn)行習(xí)題4中的布置作業(yè)、本章例4.43、完成第三章的兩份實(shí)驗(yàn)報(bào)告,并于本周實(shí)驗(yàn)課期間上交。(請(qǐng)轉(zhuǎn)告其他同學(xué))作業(yè)1、教材176頁(yè)1、3、425二、變量的存儲(chǔ)特性(反映變量的生存期)在C語言中,對(duì)變量的存儲(chǔ)類型說明有以下四種:自動(dòng)變量(auto)、寄存器變量(register)、外部變量(extern)、靜態(tài)變量(static)。自動(dòng)變量和寄存器變量屬于動(dòng)態(tài)存儲(chǔ)方式,外部變量和靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ)方式。存儲(chǔ)方式是指變量的存儲(chǔ)空間的分配方式,不同存儲(chǔ)方式的變量對(duì)不同的生命周期。靜態(tài)存儲(chǔ)變量生存期為程序執(zhí)行的整個(gè)過程,在該過程中占有固定的存儲(chǔ)空間,也稱永久存儲(chǔ)。動(dòng)態(tài)存儲(chǔ)變量只生存在程序運(yùn)行的某一段時(shí)間內(nèi),如函數(shù)的形參、函數(shù)中定義的自動(dòng)局部變量,只有當(dāng)程序進(jìn)入該函數(shù)時(shí)才分配存儲(chǔ)空間,函數(shù)執(zhí)行完后,變量的存儲(chǔ)空間又被釋放。二、變量的存儲(chǔ)特性(反映變量的生存期)26(一)局部變量的存儲(chǔ)方式1.靜態(tài)存儲(chǔ)──靜態(tài)局部變量(1)定義格式:static數(shù)據(jù)類型局部變量表;(2)存儲(chǔ)特點(diǎn)靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)。在程序執(zhí)行過程中,即使所在函數(shù)調(diào)用結(jié)束也不釋放。換句話說,在程序執(zhí)行期間,靜態(tài)局部變量始終存在,但其它函數(shù)不能引用它們。定義但不初始化,則自動(dòng)賦以0(整型和實(shí)型)或'\0'(字符型);且每次調(diào)用它們所在的函數(shù)時(shí),不再重新賦初值,只是保留上次調(diào)用結(jié)束時(shí)的值?。?)何時(shí)使用靜態(tài)局部變量需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值。變量只被引用而不改變其值。(一)局部變量的存儲(chǔ)方式272.動(dòng)態(tài)存儲(chǔ)──自動(dòng)局部變量(又稱自動(dòng)變量)(1)定義格式:[auto]數(shù)據(jù)類型變量表; (2)存儲(chǔ)特點(diǎn)自動(dòng)變量屬于動(dòng)態(tài)存儲(chǔ)方式。在函數(shù)中定義的自動(dòng)變量,只在該函數(shù)內(nèi)有效;函數(shù)被調(diào)用時(shí)分配存儲(chǔ)空間,調(diào)用結(jié)束就釋放。在復(fù)合語句中定義的自動(dòng)變量,只在該復(fù)合語句中有效;退出復(fù)合語句后,也不能再使用,否則將引起錯(cuò)誤。定義而不初始化,則其值是不確定的。如果初始化,則賦初值操作是在調(diào)用時(shí)進(jìn)行的,且每次調(diào)用都要重新賦一次初值。變量定義缺省存儲(chǔ)類型說明,系統(tǒng)自動(dòng)將其定義為自動(dòng)存儲(chǔ)類型。2.動(dòng)態(tài)存儲(chǔ)──自動(dòng)局部變量(又稱自動(dòng)變量)28自動(dòng)變量與靜態(tài)局部變量的存儲(chǔ)特性。voidauto_static(void){intvar_auto=0; /*自動(dòng)變量,每次調(diào)用都重新初始化*/staticintvar_static=0;/*靜態(tài)局部變量,只初始化1次*/printf(“var_auto=%d,var_static=%d\n”,var_auto,var_static);++var_auto;++var_static;}main(){inti;for(i=0;i<5;i++)auto_static();} 自動(dòng)變量與靜態(tài)局部變量的存儲(chǔ)特性。29程序運(yùn)行結(jié)果:var_auto=0,var_static=0var_auto=0,var_static=1var_auto=0,var_static=2var_auto=0,var_static=3var_auto=0,var_static=4程序運(yùn)行結(jié)果:303.寄存器存儲(chǔ)──寄存器變量一般情況下,變量的值都是存儲(chǔ)在內(nèi)存中的。為提高執(zhí)行效率,C語言允許將局部變量的值存放到寄存器中,這種變量就稱為寄存器變量。定義格式如下:

register數(shù)據(jù)類型變量表;(1)只有局部變量才能定義成寄存器變量,即全局變量不行。(2)對(duì)寄存器變量的實(shí)際處理,隨系統(tǒng)而異。例如,微機(jī)上TC將寄存器變量實(shí)際當(dāng)作自動(dòng)變量處理。(3)允許使用的寄存器數(shù)目是有限的,不能定義任意多個(gè)寄存器變量。3.寄存器存儲(chǔ)──寄存器變量31(二)外部變量的存儲(chǔ)方式外部變量屬于靜態(tài)存儲(chǔ)方式:(1)靜態(tài)外部變量──只允許被本源文件中的函數(shù)引用其定義格式為:static數(shù)據(jù)類型外部變量表;*(2)非靜態(tài)外部變量──允許被其它源文件中的函數(shù)引用定義時(shí)缺省static關(guān)鍵字的外部變量,即為非靜態(tài)外部變量。其它源文件中的函數(shù),引用非靜態(tài)外部變量時(shí),需要在引用函數(shù)所在的源文件中進(jìn)行說明:extern數(shù)據(jù)類型外部變量表;注意:在函數(shù)內(nèi)的extern變量說明,表示引用本源文件中的外部變量!而函數(shù)外(通常在文件開頭)的extern變量說明,表示引用其它文件中的外部變量。(二)外部變量的存儲(chǔ)方式32靜態(tài)局部變量和靜態(tài)外部變量同屬靜態(tài)存儲(chǔ)方式,但兩者區(qū)別較大:(1)定義的位置不同。靜態(tài)局部變量在函數(shù)內(nèi)定義,靜態(tài)外部變量在函數(shù)外定義。(2)作用域不同。靜態(tài)局部變量作用域僅限于定義它的函數(shù)內(nèi);雖然生存期為整個(gè)源程序,但其它函數(shù)是不能使用它的。靜態(tài)外部變量作用域?yàn)槎x它的源文件內(nèi);生存期為整個(gè)源程序,但其它源文件中的函數(shù)也是不能使用它的。(3)初始化處理不同。靜態(tài)局部變量,僅在第1次調(diào)用它所在的函數(shù)時(shí)被初始化,當(dāng)再次調(diào)用定義它的函數(shù)時(shí),不再初始化,而是保留上1次調(diào)用結(jié)束時(shí)的值。而靜態(tài)外部變量是在函數(shù)外定義的,其當(dāng)前值由最近1次給它賦值的操作決定。靜態(tài)局部變量和靜態(tài)外部變量同屬靜態(tài)存儲(chǔ)方式,但兩者區(qū)別較大:334.4函數(shù)間的數(shù)據(jù)傳遞

所謂函數(shù)間的數(shù)據(jù)傳遞的是指主調(diào)函數(shù)向被調(diào)函數(shù)傳送數(shù)據(jù)及被調(diào)函數(shù)向主調(diào)函數(shù)返回?cái)?shù)據(jù)的過程。4.4函數(shù)間的數(shù)據(jù)傳遞所謂函數(shù)間的數(shù)據(jù)傳34函數(shù)間數(shù)據(jù)傳遞的的三種形式:參數(shù)傳遞return語句全局變量傳值方式:傳址方式:將被調(diào)用函數(shù)執(zhí)行的結(jié)果作為函數(shù)返回值提供給調(diào)用函數(shù)。調(diào)用函數(shù)通過表達(dá)式接收值。利用全局變量的全局作用域特性實(shí)現(xiàn)數(shù)據(jù)在函數(shù)間的傳遞實(shí)參的值傳遞給形參變量(單向傳遞)實(shí)參的地址傳遞給形參變量函數(shù)間數(shù)據(jù)傳遞的的三種形式:參數(shù)傳遞return語句全局變量35一、傳值方式1.特點(diǎn)在函數(shù)調(diào)用過程中,形參的值如果發(fā)生變化,不會(huì)改變實(shí)參的值。2.例程4_6見教材151例4.5二、傳址方式1.特點(diǎn)函數(shù)調(diào)用過程中,實(shí)參與形參對(duì)應(yīng)同一個(gè)內(nèi)存單元,故形參的值如果發(fā)生變化,會(huì)改變實(shí)參的值。2.例程4_7見教材151例4.63.傳址方式下定義函數(shù)形參時(shí),形參變量須為能接收地址的指針變量或數(shù)組。一、傳值方式36三、利用全局變量的函數(shù)間數(shù)據(jù)傳遞1.特點(diǎn)函數(shù)欲處理的數(shù)據(jù)可由全局變量帶入函數(shù)體內(nèi),函數(shù)執(zhí)行的結(jié)果也可由全局變量帶出函數(shù)。2.例程4.8見教材153頁(yè)例4.73.為提高函數(shù)的獨(dú)立性,程序設(shè)計(jì)時(shí)應(yīng)避免使用全局變量在函數(shù)間傳遞數(shù)據(jù)。四、思考1.可用于主調(diào)函數(shù)向被調(diào)函數(shù)傳遞數(shù)據(jù)的方式有哪些?2.可用于被調(diào)函數(shù)向主調(diào)函數(shù)傳遞數(shù)據(jù)的方式有哪些?三、利用全局變量的函數(shù)間數(shù)據(jù)傳遞37五、編程舉例例程4.9:有一個(gè)一維數(shù)組,用于保存10個(gè)學(xué)生的成績(jī),請(qǐng)編程計(jì)算平均成績(jī)并排序。編程要求:請(qǐng)?jiān)O(shè)計(jì)四個(gè)函數(shù),分別用于完成數(shù)組元素?cái)?shù)據(jù)的輸入(函數(shù)名input)、平均成績(jī)的計(jì)算(函數(shù)名average)、成績(jī)排序(升序,函數(shù)名sort)、數(shù)組元素的輸出(函數(shù)名output);main()函數(shù)調(diào)用以上函數(shù)完成題意要求。五、編程舉例38floatinput(floatarray[],intn);floataverage(floatarray[],intn);floatsort(floatarray[],intn);floatoutput(floatarray[],intn);main(){floatscore[10],aver;inti;input(score,10);aver=average(score,10);output(score,10);printf("averagescoreis%5.2f\n",aver);sort(score,10);output(score,10);}floatinput(floatarray[],int39作業(yè)1.教材174頁(yè)開始6—10題;2.教材176頁(yè)編程題8、19作業(yè)1.教材174頁(yè)開始6—10題;40函數(shù)的遞歸調(diào)用是指,一個(gè)函數(shù)在它的函數(shù)體內(nèi),直接或間接地調(diào)用它自身。C語言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,調(diào)用函數(shù)又是被調(diào)用函數(shù),執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身。為了防止遞歸調(diào)用無終止地進(jìn)行,必須在函數(shù)內(nèi)有終止遞歸調(diào)用的手段。常用的辦法是加條件判斷,滿足某種條件后就不再作遞歸調(diào)用,然后逐層返回。4.5函數(shù)的遞歸調(diào)用函數(shù)的遞歸調(diào)用是指,一個(gè)函數(shù)在它的函數(shù)體內(nèi),直接或間接地調(diào)用41

直接在函數(shù)內(nèi)調(diào)用自己為直接遞歸,通過別的函數(shù)調(diào)用自己為間接遞歸。voida()

{......

a();

......

}voida()

{......

b();......

}

voidb()

{......

a();

......

}

遞歸在解決某些問題中,是一個(gè)十分有用的方法。因?yàn)橛械膯栴}它本身就是遞歸定義的;此外,它可以使某些看起來不易解決的問題變得容易解決,寫出的程序較簡(jiǎn)短。直接在函數(shù)內(nèi)調(diào)用自己為直接遞歸,通過別的函數(shù)42例程4.10:用遞歸方法求n!

由于n!=n*(n-1)!是遞歸定義所以求n!(n-1)!

(n-1)!(n-2)!

(n–2)!(n-3)!

……

1!的問題,

根據(jù)公式有1!=1。

再反過來依次求出2!,3!……直到最后求出n!。例程4.10:用遞歸方法求n!由于n!=43/*功能:通過函數(shù)的遞歸調(diào)用計(jì)算階乘*/longpower(intn){longf;if(n>1)f=power(n-1)*n;elsef=1;return(f);}/*功能:通過函數(shù)的遞歸調(diào)用計(jì)算階乘*/44main(){intn;longy;printf("inputainteagernumber:");scanf("%d",&n);y=power(n);printf("\n%d!=%ld\n",n,y);getch();} 運(yùn)行結(jié)果舉例:inputainteagernumber:33!=6運(yùn)行過程分析main()45例程4.11見158頁(yè)使用遞歸解決的問題應(yīng)滿足兩個(gè)基本條件:(1)遞歸問題的轉(zhuǎn)化。有些問題不能直接求解或難以求解,但它可以轉(zhuǎn)化為一個(gè)遞歸問題,這個(gè)遞歸問題相對(duì)于原問題簡(jiǎn)單或更接近解決方法。(2)轉(zhuǎn)化的終止條件。原問題到遞歸問題的轉(zhuǎn)化是有條件的、次數(shù)是有限的,不能無限次數(shù)地轉(zhuǎn)化下去。這個(gè)終止條件也稱為邊界條件,相當(dāng)于遞推關(guān)系中的初始條件。例程4.11見158頁(yè)46例1見教材165頁(yè)例4.17例2見教材171頁(yè)例4.184.6綜合編程舉例例1見教材165頁(yè)例4.174.6綜合編程舉例471.1原始問題來源于印度與世界末日有關(guān)的民間傳說,大意是:在印度北部佛教圣地的圣廟里,安放著一塊黃銅板,板上插著三根寶石針.印度教的主神梵天在創(chuàng)造世界的時(shí)候,在其中的一根針上從下到上放置了64片金片,這就是所謂的漢諾塔(又稱梵塔).不論白天和黑夜,都有一個(gè)值班的僧侶按照梵天規(guī)定的法則,把這些金片在三根針上移來移去.1.1原始問題48梵天的法則是:一次只能移一片,并且要求不管是在哪根針上,小片必須總是在大片的上面.當(dāng)所有64片金片都從梵天創(chuàng)造世界時(shí)所放置的那根針移到另外一根針上時(shí),世界就將在一陣霹靂聲中毀滅,梵塔、廟宇和眾生都將同歸于盡.梵天的法則是:一次只能移一片,并且要求不管是在哪491.2抽象的數(shù)學(xué)問題將這個(gè)傳說抽象為數(shù)學(xué)問題是:有3根針A、B、C.起初A針上有64個(gè)盤子,盤子的大小不等,大的在下,小的在上;B、C針上無盤子。要求把這64個(gè)盤子從A針移到C針,在移動(dòng)的過程中可以借助于B針,但有兩個(gè)限制:(1)每次只允許移動(dòng)一個(gè)盤子;(2)任何時(shí)候3根針上都必須保持大盤在下,小盤在上.請(qǐng)編程序顯示出移動(dòng)的步驟.漢諾塔問題已成為組合數(shù)學(xué)、人工智能、計(jì)算機(jī)科學(xué)以及規(guī)劃中遞歸問題的典型例子,并由此產(chǎn)生了各種各樣成熟的算法.漢諾塔問題還有圖論、二叉樹等多種解法。1.2抽象的數(shù)學(xué)問題50教材176頁(yè)編程題9、13、17作業(yè)教材176頁(yè)編程題9、13、17作業(yè)51C語言程序設(shè)計(jì)基礎(chǔ)主講教師:代祖華C語言程序設(shè)計(jì)基礎(chǔ)主講教師:代祖華52主要參考書目《C程序設(shè)計(jì)》(第二版)及配套的程序設(shè)計(jì)題解與設(shè)計(jì)指導(dǎo),譚浩強(qiáng)著,清華大學(xué)出版社。《從問題到程序—程序設(shè)計(jì)與C語言引論》裘宗燕著,機(jī)械工業(yè)出版社?!冻绦蛟O(shè)計(jì)基礎(chǔ)》及配套的程序設(shè)計(jì)題解與設(shè)計(jì)指導(dǎo)(第二版),吳文虎編著,清華大學(xué)出版社。主要參考書目《C程序設(shè)計(jì)》(第二版)及配套的程序設(shè)計(jì)題解53第4章函數(shù)4.1函數(shù)的定義4.2函數(shù)的調(diào)用4.3變量的作用域與存儲(chǔ)特性4.4函數(shù)間數(shù)據(jù)的傳遞4.5遞歸函數(shù)4.6綜合編程舉例第4章函數(shù)4.1函數(shù)的定義4.2函數(shù)的調(diào)用4.354/*簡(jiǎn)單函數(shù)示例,案例4_1*//*功能:定義一個(gè)求較大數(shù)的函數(shù)并在主函數(shù)中調(diào)用*/intmax(intn1,intn2) /*定義函數(shù)max()*/{return(n1>n2?n1:n2);}main(){intmax(intn1,intn2); /*函數(shù)說明*/intnum1,num2,maxnum;printf("inputtwonumbers:\n");scanf(“%d%d”,&num1,&num2);maxnum=max(num1,num2);printf("max=%d\n",maxnum);getch(); /*使程序暫停,按任一鍵繼續(xù)*/}

/*簡(jiǎn)單函數(shù)示例,案例4_1*/554.1函數(shù)的定義從函數(shù)使用的角度來看,C語言的函數(shù)可以分為兩類:標(biāo)準(zhǔn)庫(kù)函數(shù)和用戶自定義函數(shù)。本章介紹后者。一.標(biāo)準(zhǔn)庫(kù)函數(shù)與頭文件1.TurboC系統(tǒng)提供了400多個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù)(參見附錄五),按功能可以分為:(1)類型轉(zhuǎn)換函數(shù),(2)字符判別與轉(zhuǎn)換函數(shù),(3)字符串處理函數(shù),(4)標(biāo)準(zhǔn)I/O函數(shù),(5)文件管理函數(shù),(6)數(shù)學(xué)運(yùn)算函數(shù)等。

它們的執(zhí)行效率高,用戶需要時(shí),可在程序中直接進(jìn)行調(diào)用。4.1函數(shù)的定義從函數(shù)使用的角度來看,C語言的函數(shù)可以分56

C語言庫(kù)函數(shù)所用到的常量、外部變量、函數(shù)類型和參數(shù)說明,都在相應(yīng)的頭文件(擴(kuò)展名為.h)中聲明,這些文件通常存放在系統(tǒng)目錄tc\include。如:2.頭文件stdio.h文件:標(biāo)準(zhǔn)輸入輸出函數(shù)所用的常量、結(jié)構(gòu)、宏定義、函數(shù)的類型、參數(shù)的個(gè)數(shù)與類型的描述。

(2)math.h文件:與數(shù)學(xué)函數(shù)有關(guān)的常量、結(jié)構(gòu)及相應(yīng)的函數(shù)類型和參數(shù)描述。

(3)string.h文件:與字符串操作函數(shù)有關(guān)的常量、結(jié)構(gòu)以及相應(yīng)的函數(shù)類型和參數(shù)描述。

C語言庫(kù)函數(shù)所用到的常量、外部變量、函數(shù)類型57二.用戶自定義函數(shù)1.函數(shù)分類(從函數(shù)的形式看)無參函數(shù)有參函數(shù)◆函數(shù)定義時(shí)無參數(shù)說明◆調(diào)用無參函數(shù)一般用來執(zhí)行指定的一組操作◆主調(diào)函數(shù)不傳送數(shù)據(jù)給被調(diào)函數(shù)●函數(shù)定義時(shí)定義了一個(gè)或一個(gè)以上的參數(shù)●調(diào)用時(shí)將要處理的數(shù)據(jù)傳送給被調(diào)函數(shù)二.用戶自定義函數(shù)1.函數(shù)分類(從函數(shù)的形式看)無參函數(shù)58定義形式二:函數(shù)值類型名函數(shù)名(形式參數(shù)類型及參數(shù)說明){數(shù)據(jù)說明部分語句}定義形式一:函數(shù)值類型名函數(shù)名(形式參數(shù)列表)形式參數(shù)說明{數(shù)據(jù)說明部分語句}2.函數(shù)定義形式ANSI風(fēng)格如:intmax(n1,n2)intn1,n2;如:intmax(intn1,intn2)定義形式二:定義形式一:2.函數(shù)定義形式ANSI風(fēng)格如:593.函數(shù)由函數(shù)首部與函數(shù)體兩部分構(gòu)成。(1)函數(shù)首部◆函數(shù)首部包括函數(shù)值類型、函數(shù)名、參數(shù)類型及參數(shù)說明.

◆函數(shù)值類型指定所定義函數(shù)返回值的類型,可以是簡(jiǎn)單數(shù)據(jù)類型、void類型或構(gòu)造類型等?!霎?dāng)函數(shù)值類型為void時(shí),表示函數(shù)無返回值,相當(dāng)于其它語言的過程。當(dāng)函數(shù)值類型為int時(shí),可省略其類型的說明,建議不使用缺省形式類型說明.◆函數(shù)名是函數(shù)的標(biāo)識(shí)符,遵循C語言標(biāo)識(shí)符的命名規(guī)則,區(qū)分大小寫?!鰹榱伺c調(diào)用函數(shù)提供的實(shí)際參數(shù)區(qū)別開,將函數(shù)定義中的參數(shù)表稱為形式參數(shù)表,簡(jiǎn)稱形參,處在函數(shù)名后的一對(duì)圓括號(hào)中。要特別注意的是,無論函數(shù)是否有形式參數(shù),函數(shù)名后的圓括號(hào)不可省,并且圓括號(hào)之后不能接“;”。3.函數(shù)由函數(shù)首部與函數(shù)體兩部分構(gòu)成。(1)函數(shù)首部◆函60◆函數(shù)體結(jié)束在“}”括號(hào)處。(2)函數(shù)體◆函數(shù)首部之后的花括號(hào)“{}”部分為函數(shù)體?!龊瘮?shù)體內(nèi)數(shù)據(jù)說明部分在前,執(zhí)行語句部分在后?!艉瘮?shù)體中說明的變量是該函數(shù)調(diào)用時(shí)有效的局部變量,執(zhí)行語句是實(shí)際生成命令代碼的部分?!龊瘮?shù)的功能由函數(shù)體內(nèi)的各個(gè)語句的執(zhí)行來實(shí)現(xiàn)?!艨蘸瘮?shù)定義時(shí)無參數(shù),{}內(nèi)為空被調(diào)用時(shí),不執(zhí)行任何操作就立即返回。例如:voidprint_report(void){}◆函數(shù)體結(jié)束在“}”括號(hào)處。(2)函數(shù)體◆函數(shù)首部之后的花括614.2函數(shù)的調(diào)用★在C語言的一般函數(shù)體中,可以包含對(duì)其它函數(shù)的調(diào)用,稱為函數(shù)的嵌套調(diào)用,甚至包含對(duì)自身的調(diào)用,稱為函數(shù)的遞歸調(diào)用?!钜粋€(gè)函數(shù)一旦被定義,就可在程序的其它函數(shù)中使用它,這個(gè)過程稱為函數(shù)調(diào)用。一.函數(shù)的一般調(diào)用與聲明函數(shù)名(實(shí)際參數(shù)列表)1.函數(shù)調(diào)用形式函數(shù)調(diào)用的一般形式:4.2函數(shù)的調(diào)用★在C語言的一般函數(shù)體中,可以包含對(duì)其它62◆實(shí)際參數(shù)簡(jiǎn)稱為實(shí)參,參數(shù)之間以逗號(hào)分隔?!龊瘮?shù)調(diào)用時(shí),實(shí)參與形參應(yīng)保持個(gè)數(shù)、次序及類型的一致性,以確保實(shí)參與形參之間數(shù)據(jù)的正確傳遞?!魧?shí)際參數(shù)可以是表達(dá)式、常量、變量(調(diào)用時(shí)必須有確定的值或確定的地址)?!鲂问絽?shù)必須為變量?!霎?dāng)實(shí)際參數(shù)的個(gè)數(shù)、次序、類型與對(duì)應(yīng)形式參數(shù)的個(gè)數(shù)、次序、類型不一致時(shí),系統(tǒng)并不提示錯(cuò)誤,后果卻難以預(yù)測(cè)。2.格式說明◆實(shí)際參數(shù)簡(jiǎn)稱為實(shí)參,參數(shù)之間以逗號(hào)分隔?!龊瘮?shù)調(diào)用時(shí),實(shí)633.C語言中函數(shù)調(diào)用的三種形式:語句調(diào)用表達(dá)式調(diào)用函數(shù)參數(shù)調(diào)用在函數(shù)調(diào)用后加“;”,構(gòu)成一個(gè)語句。調(diào)用函數(shù)的目的可能是執(zhí)行一個(gè)動(dòng)作或完成特定的功能。大多數(shù)函數(shù)的調(diào)用形式。被調(diào)用函數(shù)執(zhí)行的結(jié)果為調(diào)用函數(shù)提供一個(gè)值。調(diào)用函數(shù)通過表達(dá)式接收值。被調(diào)函數(shù)作為某個(gè)函數(shù)的一個(gè)參數(shù)。3.C語言中函數(shù)調(diào)用的三種形式:語句調(diào)用表達(dá)式調(diào)用函數(shù)參數(shù)64main()/*主函數(shù)中采用函數(shù)參數(shù)調(diào)用形式調(diào)用函數(shù)max*/{intx,y,z,m;scanf("%d,%d,%d",&x,&y,&z);printf("max=%d\n",max(max(x,y),z));/*內(nèi)層函數(shù)max2的值作為外層函數(shù)max2的實(shí)參,整個(gè)函數(shù)max2的值又作函數(shù)printf的的實(shí)參*/}例函數(shù)參數(shù)調(diào)用形式調(diào)用函數(shù)max:intmax(intn1,intn2)/*求兩個(gè)數(shù)中較大者*/{inty;y=(n1>n2)?n1:n2;return(y);}main()/*主函數(shù)中采用函數(shù)參數(shù)調(diào)用形式調(diào)用函數(shù)ma654.函數(shù)聲明(函數(shù)說明)◆調(diào)用用戶自定義函數(shù)時(shí),一般調(diào)用函數(shù)和被調(diào)用函數(shù)應(yīng)在同一個(gè)文件中,在調(diào)用函數(shù)中對(duì)被調(diào)用函數(shù)返回值的類型、函數(shù)名稱、函數(shù)形式參數(shù)的類型進(jìn)行說明,這種說明稱為函數(shù)聲明?!龊瘮?shù)聲明的一般形式如下:類型名函數(shù)名(類型1形參1,…,類型n形參n);或類型名函數(shù)名(類型1,類型2,…,類型n);或類型名函數(shù)名();◆函數(shù)聲明是以語句形式出現(xiàn)的,因此其后有語句結(jié)束標(biāo)記“;”?!鋈艉瘮?shù)定義放在主調(diào)函數(shù)之前,遵循先定義后調(diào)用原則,函數(shù)聲明可以省略;若函數(shù)值的類型為整型或字符型,函數(shù)聲明可以省略;若在所有函數(shù)定義之前,已說明函數(shù)類型,函數(shù)聲明也可省略。4.函數(shù)聲明(函數(shù)說明)◆調(diào)用用戶自定義函數(shù)時(shí),一般調(diào)用函66二.形參、實(shí)參與函數(shù)調(diào)用過程形式參數(shù)(簡(jiǎn)稱形參)定義函數(shù)使用的參數(shù)實(shí)際參數(shù)(簡(jiǎn)稱實(shí)參)調(diào)用函數(shù)使用的參數(shù)◆C語言中,采用函數(shù)之間的參數(shù)傳遞方式從實(shí)參向形參傳遞。■C語言函數(shù)的參數(shù)傳遞均采用單向值傳遞方式(或稱復(fù)制方式)?!魡蜗蛑祩鬟f方式是指在函數(shù)調(diào)用時(shí),將實(shí)參之值傳遞給對(duì)應(yīng)的形式參數(shù),使形參具有與實(shí)參相同的值?!霎?dāng)實(shí)參是變量的地址值、指針常量或指針變量時(shí),實(shí)參傳遞給形參的是地址值,同樣是單向值傳遞方式。二.形參、實(shí)參與函數(shù)調(diào)用過程形式參數(shù)定義函數(shù)使用的參數(shù)實(shí)67案例4_2見教材145頁(yè)例4.2作業(yè):教材173頁(yè)4.1題1——5。三、函數(shù)的嵌套調(diào)用C語言允許在調(diào)用一個(gè)函數(shù)過程中又調(diào)用另外一個(gè)函數(shù)。這種調(diào)用方式稱為嵌套調(diào)用。案例4_3見教材147頁(yè)4.4案例4_2見教材145頁(yè)例4.2684.3內(nèi)部變量與外部變量

一、變量的作用域C語言中所有的變量都有自己的作用域。變量說明的位置不同,其作用域也不同,據(jù)此將C語言中的變量分為內(nèi)部變量和外部變量。1、內(nèi)部變量在一個(gè)函數(shù)內(nèi)部說明的變量是內(nèi)部變量,它只在該函數(shù)范圍內(nèi)有效。也就是說,只有在包含變量說明的函數(shù)內(nèi)部,才能使用被說明的變量,在此函數(shù)之外不能使用這些變量。所以內(nèi)部變量也稱“局部變量”。例如:4.3變量的作用域及存儲(chǔ)特性4.3內(nèi)部變量與外部變量一、變量的作用域4.3變69intf1(inta)/*函數(shù)f1*/{intb,c;……} /*a,b,c作用域:僅限于函數(shù)f1()中*/intf2(intx)/*函數(shù)f2*/{inty,z;……} /*x,y,z作用域:僅限于函數(shù)f2()中*/

main(){intm,n;……}/*m,n作用域:僅限于函數(shù)main()中*/intf1(inta)/*函數(shù)f1*/70關(guān)于局部變量的作用域還要說明以下幾點(diǎn):主函數(shù)main()中定義的內(nèi)部變量,只能在主函數(shù)中使用,其它函數(shù)不能使用。同時(shí),主函數(shù)中也不能使用其它函數(shù)中定義的內(nèi)部變量。因?yàn)橹骱瘮?shù)也是一個(gè)函數(shù),與其它函數(shù)是并列關(guān)系。這一點(diǎn)是與其它語言不同的,應(yīng)予以注意。形參變量也是內(nèi)部變量,屬于被調(diào)函數(shù);實(shí)參變量,則是調(diào)用函數(shù)的內(nèi)部變量。允許在不同的函數(shù)中定義同名變量,它們代表不同的對(duì)象,分配不同的單元,互不干擾,也不會(huì)發(fā)生混淆。在復(fù)合語句中也可定義變量,其作用域只在復(fù)合語句范圍內(nèi)。關(guān)于局部變量的作用域還要說明以下幾點(diǎn):71例4-4:voidf1(){intt=2;a*=t;b/=t;}voidmain(){inta,b;printf(”Entera,b:”);scanf(”%d,%d”,&a,&b);f1();/*調(diào)用函數(shù)f1()*/

printf(”a=%d,b=%d”,a,b);}

編譯程序會(huì)提示出錯(cuò):Undefinedsymbol‘a(chǎn)’和Undefinedsymbol‘b’。為什么?例4-4:編譯程序會(huì)提示出錯(cuò):722、外部變量在函數(shù)外部定義的變量稱為外部變量。外部變量不屬于任何一個(gè)函數(shù),其作用域是:從外部變量的定義位置開始,到本文件結(jié)束為止。外部變量可被作用域內(nèi)的所有函數(shù)直接引用,所以外部變量又稱全局變量。例4_5:輸入長(zhǎng)方體的長(zhǎng)(l)、寬(w)、高(h),求長(zhǎng)方體體積及正、側(cè)、頂三個(gè)面的面積。2、外部變量73

/*功能:利用全局變量計(jì)算長(zhǎng)方體的體積及三個(gè)面的面積*/ints1,s2,s3;intvs(inta,int,b,intc){intv; v=a*b*c;s1=a*b;s2=b*c;s3=a*c; returnv;}main(){intv,l,w,h;printf("\ninputlength,widthandheight:");scanf("%d%d%d",&l,&w,&h);v=vs(l,w,h);printf("v=%d,s1=%d,s2=%d,s3=%d\n",v,s1,s2,s3);getch();} /*功能:利用全局變量計(jì)算長(zhǎng)方體的體積及三個(gè)面的面積74對(duì)于全局變量還有以下幾點(diǎn)說明:外部變量可加強(qiáng)函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,但又使這些函數(shù)依賴外部變量,因而使得函數(shù)的獨(dú)立性降低。在同一源文件中,允許外部變量和內(nèi)部變量同名。在內(nèi)部變量的作用域內(nèi),外部變量將被屏蔽而不起作用。外部變量的作用域是從定義點(diǎn)到本文件結(jié)束。如果定義點(diǎn)之前的函數(shù)需要引用這些外部變量時(shí),需要在函數(shù)內(nèi)對(duì)被引用的外部變量進(jìn)行說明。外部變量說明的一般形式為:extern數(shù)據(jù)類型外部變量[,外部變量2……];外部變量的定義和外部變量的說明是兩回事。外部變量的定義,必須在所有的函數(shù)之外,且只能定義一次。而外部變量的說明,出現(xiàn)在要使用該外部變量的函數(shù)內(nèi),而且可以出現(xiàn)多次。對(duì)于全局變量還有以下幾點(diǎn)說明:75作業(yè)1、教材176頁(yè)1、3、42、實(shí)驗(yàn)名稱:函數(shù)實(shí)驗(yàn)內(nèi)容:上機(jī)調(diào)試和運(yùn)行習(xí)題4中的布置作業(yè)、本章例4.43、完成第三章的兩份實(shí)驗(yàn)報(bào)告,并于本周實(shí)驗(yàn)課期間上交。(請(qǐng)轉(zhuǎn)告其他同學(xué))作業(yè)1、教材176頁(yè)1、3、476二、變量的存儲(chǔ)特性(反映變量的生存期)在C語言中,對(duì)變量的存儲(chǔ)類型說明有以下四種:自動(dòng)變量(auto)、寄存器變量(register)、外部變量(extern)、靜態(tài)變量(static)。自動(dòng)變量和寄存器變量屬于動(dòng)態(tài)存儲(chǔ)方式,外部變量和靜態(tài)內(nèi)部變量屬于靜態(tài)存儲(chǔ)方式。存儲(chǔ)方式是指變量的存儲(chǔ)空間的分配方式,不同存儲(chǔ)方式的變量對(duì)不同的生命周期。靜態(tài)存儲(chǔ)變量生存期為程序執(zhí)行的整個(gè)過程,在該過程中占有固定的存儲(chǔ)空間,也稱永久存儲(chǔ)。動(dòng)態(tài)存儲(chǔ)變量只生存在程序運(yùn)行的某一段時(shí)間內(nèi),如函數(shù)的形參、函數(shù)中定義的自動(dòng)局部變量,只有當(dāng)程序進(jìn)入該函數(shù)時(shí)才分配存儲(chǔ)空間,函數(shù)執(zhí)行完后,變量的存儲(chǔ)空間又被釋放。二、變量的存儲(chǔ)特性(反映變量的生存期)77(一)局部變量的存儲(chǔ)方式1.靜態(tài)存儲(chǔ)──靜態(tài)局部變量(1)定義格式:static數(shù)據(jù)類型局部變量表;(2)存儲(chǔ)特點(diǎn)靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)。在程序執(zhí)行過程中,即使所在函數(shù)調(diào)用結(jié)束也不釋放。換句話說,在程序執(zhí)行期間,靜態(tài)局部變量始終存在,但其它函數(shù)不能引用它們。定義但不初始化,則自動(dòng)賦以0(整型和實(shí)型)或'\0'(字符型);且每次調(diào)用它們所在的函數(shù)時(shí),不再重新賦初值,只是保留上次調(diào)用結(jié)束時(shí)的值?。?)何時(shí)使用靜態(tài)局部變量需要保留函數(shù)上一次調(diào)用結(jié)束時(shí)的值。變量只被引用而不改變其值。(一)局部變量的存儲(chǔ)方式782.動(dòng)態(tài)存儲(chǔ)──自動(dòng)局部變量(又稱自動(dòng)變量)(1)定義格式:[auto]數(shù)據(jù)類型變量表; (2)存儲(chǔ)特點(diǎn)自動(dòng)變量屬于動(dòng)態(tài)存儲(chǔ)方式。在函數(shù)中定義的自動(dòng)變量,只在該函數(shù)內(nèi)有效;函數(shù)被調(diào)用時(shí)分配存儲(chǔ)空間,調(diào)用結(jié)束就釋放。在復(fù)合語句中定義的自動(dòng)變量,只在該復(fù)合語句中有效;退出復(fù)合語句后,也不能再使用,否則將引起錯(cuò)誤。定義而不初始化,則其值是不確定的。如果初始化,則賦初值操作是在調(diào)用時(shí)進(jìn)行的,且每次調(diào)用都要重新賦一次初值。變量定義缺省存儲(chǔ)類型說明,系統(tǒng)自動(dòng)將其定義為自動(dòng)存儲(chǔ)類型。2.動(dòng)態(tài)存儲(chǔ)──自動(dòng)局部變量(又稱自動(dòng)變量)79自動(dòng)變量與靜態(tài)局部變量的存儲(chǔ)特性。voidauto_static(void){intvar_auto=0; /*自動(dòng)變量,每次調(diào)用都重新初始化*/staticintvar_static=0;/*靜態(tài)局部變量,只初始化1次*/printf(“var_auto=%d,var_static=%d\n”,var_auto,var_static);++var_auto;++var_static;}main(){inti;for(i=0;i<5;i++)auto_static();} 自動(dòng)變量與靜態(tài)局部變量的存儲(chǔ)特性。80程序運(yùn)行結(jié)果:var_auto=0,var_static=0var_auto=0,var_static=1var_auto=0,var_static=2var_auto=0,var_static=3var_auto=0,var_static=4程序運(yùn)行結(jié)果:813.寄存器存儲(chǔ)──寄存器變量一般情況下,變量的值都是存儲(chǔ)在內(nèi)存中的。為提高執(zhí)行效率,C語言允許將局部變量的值存放到寄存器中,這種變量就稱為寄存器變量。定義格式如下:

register數(shù)據(jù)類型變量表;(1)只有局部變量才能定義成寄存器變量,即全局變量不行。(2)對(duì)寄存器變量的實(shí)際處理,隨系統(tǒng)而異。例如,微機(jī)上TC將寄存器變量實(shí)際當(dāng)作自動(dòng)變量處理。(3)允許使用的寄存器數(shù)目是有限的,不能定義任意多個(gè)寄存器變量。3.寄存器存儲(chǔ)──寄存器變量82(二)外部變量的存儲(chǔ)方式外部變量屬于靜態(tài)存儲(chǔ)方式:(1)靜態(tài)外部變量──只允許被本源文件中的函數(shù)引用其定義格式為:static數(shù)據(jù)類型外部變量表;*(2)非靜態(tài)外部變量──允許被其它源文件中的函數(shù)引用定義時(shí)缺省static關(guān)鍵字的外部變量,即為非靜態(tài)外部變量。其它源文件中的函數(shù),引用非靜態(tài)外部變量時(shí),需要在引用函數(shù)所在的源文件中進(jìn)行說明:extern數(shù)據(jù)類型外部變量表;注意:在函數(shù)內(nèi)的extern變量說明,表示引用本源文件中的外部變量!而函數(shù)外(通常在文件開頭)的extern變量說明,表示引用其它文件中的外部變量。(二)外部變量的存儲(chǔ)方式83靜態(tài)局部變量和靜態(tài)外部變量同屬靜態(tài)存儲(chǔ)方式,但兩者區(qū)別較大:(1)定義的位置不同。靜態(tài)局部變量在函數(shù)內(nèi)定義,靜態(tài)外部變量在函數(shù)外定義。(2)作用域不同。靜態(tài)局部變量作用域僅限于定義它的函數(shù)內(nèi);雖然生存期為整個(gè)源程序,但其它函數(shù)是不能使用它的。靜態(tài)外部變量作用域?yàn)槎x它的源文件內(nèi);生存期為整個(gè)源程序,但其它源文件中的函數(shù)也是不能使用它的。(3)初始化處理不同。靜態(tài)局部變量,僅在第1次調(diào)用它所在的函數(shù)時(shí)被初始化,當(dāng)再次調(diào)用定義它的函數(shù)時(shí),不再初始化,而是保留上1次調(diào)用結(jié)束時(shí)的值。而靜態(tài)外部變量是在函數(shù)外定義的,其當(dāng)前值由最近1次給它賦值的操作決定。靜態(tài)局部變量和靜態(tài)外部變量同屬靜態(tài)存儲(chǔ)方式,但兩者區(qū)別較大:844.4函數(shù)間的數(shù)據(jù)傳遞

所謂函數(shù)間的數(shù)據(jù)傳遞的是指主調(diào)函數(shù)向被調(diào)函數(shù)傳送數(shù)據(jù)及被調(diào)函數(shù)向主調(diào)函數(shù)返回?cái)?shù)據(jù)的過程。4.4函數(shù)間的數(shù)據(jù)傳遞所謂函數(shù)間的數(shù)據(jù)傳85函數(shù)間數(shù)據(jù)傳遞的的三種形式:參數(shù)傳遞return語句全局變量傳值方式:傳址方式:將被調(diào)用函數(shù)執(zhí)行的結(jié)果作為函數(shù)返回值提供給調(diào)用函數(shù)。調(diào)用函數(shù)通過表達(dá)式接收值。利用全局變量的全局作用域特性實(shí)現(xiàn)數(shù)據(jù)在函數(shù)間的傳遞實(shí)參的值傳遞給形參變量(單向傳遞)實(shí)參的地址傳遞給形參變量函數(shù)間數(shù)據(jù)傳遞的的三種形式:參數(shù)傳遞return語句全局變量86一、傳值方式1.特點(diǎn)在函數(shù)調(diào)用過程中,形參的值如果發(fā)生變化,不會(huì)改變實(shí)參的值。2.例程4_6見教材151例4.5二、傳址方式1.特點(diǎn)函數(shù)調(diào)用過程中,實(shí)參與形參對(duì)應(yīng)同一個(gè)內(nèi)存單元,故形參的值如果發(fā)生變化,會(huì)改變實(shí)參的值。2.例程4_7見教材151例4.63.傳址方式下定義函數(shù)形參時(shí),形參變量須為能接收地址的指針變量或數(shù)組。一、傳值方式87三、利用全局變量的函數(shù)間數(shù)據(jù)傳遞1.特點(diǎn)函數(shù)欲處理的數(shù)據(jù)可由全局變量帶入函數(shù)體內(nèi),函數(shù)執(zhí)行的結(jié)果也可由全局變量帶出函數(shù)。2.例程4.8見教材153頁(yè)例4.73.為提高函數(shù)的獨(dú)立性,程序設(shè)計(jì)時(shí)應(yīng)避免使用全局變量在函數(shù)間傳遞數(shù)據(jù)。四、思考1.可用于主調(diào)函數(shù)向被調(diào)函數(shù)傳遞數(shù)據(jù)的方式有哪些?2.可用于被調(diào)函數(shù)向主調(diào)函數(shù)傳遞數(shù)據(jù)的方式有哪些?三、利用全局變量的函數(shù)間數(shù)據(jù)傳遞88五、編程舉例例程4.9:有一個(gè)一維數(shù)組,用于保存10個(gè)學(xué)生的成績(jī),請(qǐng)編程計(jì)算平均成績(jī)并排序。編程要求:請(qǐng)?jiān)O(shè)計(jì)四個(gè)函數(shù),分別用于完成數(shù)組元素?cái)?shù)據(jù)的輸入(函數(shù)名input)、平均成績(jī)的計(jì)算(函數(shù)名average)、成績(jī)排序(升序,函數(shù)名sort)、數(shù)組元素的輸出(函數(shù)名output);main()函數(shù)調(diào)用以上函數(shù)完成題意要求。五、編程舉例89floatinput(floatarray[],intn);floataverage(floatarray[],intn);floatsort(floatarray[],intn);floatoutput(floatarray[],intn);main(){floatscore[10],aver;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論