計(jì)算機(jī)二級(jí)C語言-第7章函數(shù)全解課件_第1頁
計(jì)算機(jī)二級(jí)C語言-第7章函數(shù)全解課件_第2頁
計(jì)算機(jī)二級(jí)C語言-第7章函數(shù)全解課件_第3頁
計(jì)算機(jī)二級(jí)C語言-第7章函數(shù)全解課件_第4頁
計(jì)算機(jī)二級(jí)C語言-第7章函數(shù)全解課件_第5頁
已閱讀5頁,還剩97頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第七章函數(shù)第七章函數(shù)1該章的學(xué)習(xí)內(nèi)容學(xué)點(diǎn)什么哪?掌握函數(shù)原型(prototype)及其,函數(shù)定義和函數(shù)原型說明的方法及二者的區(qū)別。掌握函數(shù)的參數(shù)傳遞方式與函數(shù)調(diào)用方法。理解掌握變量的作用域和存儲(chǔ)類的概念。該章的學(xué)習(xí)內(nèi)容學(xué)點(diǎn)什么哪?掌握函數(shù)原型(prototype)21.通過C語言的學(xué)習(xí),牢固樹立起函數(shù)的概念,及其使用規(guī)則。2.理解函數(shù)的作用域及其存儲(chǔ)類及其自動(dòng)變量與靜態(tài)局部變量在應(yīng)用中的區(qū)別。*3.在實(shí)際應(yīng)用中,學(xué)習(xí)和體會(huì)采用結(jié)構(gòu)化設(shè)計(jì)方法(模塊化)解決問題的思想。本章的學(xué)習(xí)難點(diǎn)1.通過C語言的學(xué)習(xí),牢固樹立起函數(shù)的概念,及其使用規(guī)則。3本章目錄函數(shù)1.1.函數(shù)有關(guān)概念及其分類1.2.函數(shù)的定義1.3.函數(shù)的返回值1.4.函數(shù)的調(diào)用與參數(shù)傳遞1.5.函數(shù)原型的說明*宏定義變量的作用域和存儲(chǔ)類*模塊化程序設(shè)計(jì)方法*應(yīng)用設(shè)計(jì)實(shí)例多文件方式組織的程序本章目錄函數(shù)4概述

一個(gè)較大的程序一般應(yīng)分為若干個(gè)程序模塊,每一個(gè)模塊用來實(shí)現(xiàn)一定的功能。所有的高級(jí)語言中都有子程序這個(gè)概念,用子程序來實(shí)現(xiàn)模塊功能。在C語言中,子程序的作用是由函數(shù)來完成的。一個(gè)C程序可由一個(gè)主函數(shù)和若干個(gè)函數(shù)構(gòu)成。由主函數(shù)調(diào)用其它函數(shù),其它函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。

概述一個(gè)較大的程序一般應(yīng)分為若干個(gè)程序模塊,5程序設(shè)計(jì)中,常將一些常用的功能模塊編寫成函數(shù),放在函數(shù)庫中供公共選用。要善于用函數(shù),以減少重復(fù)編程的工作量。C語言提倡把一個(gè)大問題劃分成許多個(gè)小塊,每一小塊編制一個(gè)函數(shù)。這樣C程序是由許多小函數(shù)而不是由少量大函數(shù)構(gòu)成。這樣作的好處:各部分充分獨(dú)立,任務(wù)單一,便于書寫和調(diào)試。有些小函數(shù)還可以作為構(gòu)件,被別的程序利用。概述程序設(shè)計(jì)中,常將一些常用的功能模塊編寫成函數(shù),6C程序工程源程序文件1源程序文件2源程序文件3編譯預(yù)處理命令全局變量聲明函數(shù)1函數(shù)n…函數(shù)首部函數(shù)體局部變量聲明執(zhí)行語句C程序的基本結(jié)構(gòu)C程序工程源程序文件1源程序文件2源程序文件3編譯預(yù)處理命令7mainabcdeifghegh程序中函數(shù)調(diào)用示意圖mainabcdeifghegh程序中函數(shù)調(diào)用示意圖8基本思想:將一個(gè)大的程序按功能分割成一些小模塊.特點(diǎn):各模塊相對(duì)獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡(jiǎn)單控制了程序設(shè)計(jì)的復(fù)雜性提高元件的可靠性縮短開發(fā)周期避免程序開發(fā)的重復(fù)勞動(dòng)易于維護(hù)和功能擴(kuò)充開發(fā)方法:

自上向下,逐步分解,分而治之模塊化程序設(shè)計(jì)基本思想:將一個(gè)大的程序按功能分割成一些小模塊.模塊化程序設(shè)9C是模塊化程序設(shè)計(jì)語言規(guī)則必須有且只能有一個(gè)名為main的主函數(shù)C程序的執(zhí)行總是從main函數(shù)開始,在main中結(jié)束。函數(shù)不能嵌套定義,可以嵌套調(diào)用C是模塊化程序設(shè)計(jì)語言規(guī)則必須有且只能有一個(gè)名為main的主10函數(shù)的基本概念(1)

project——工程:是由一個(gè)或多個(gè)C程序源文件組成。一個(gè)源程序是由一個(gè)或多個(gè)函數(shù)組成。一個(gè)源程序是一個(gè)編譯單位,即以源程序?yàn)閱挝贿M(jìn)行編譯,而不是以函數(shù)為單位進(jìn)行編譯。其擴(kuò)展名為.h或.c。(3)C程序的執(zhí)行從main()函數(shù)開始。沒有main()函數(shù)的程序,不能執(zhí)行。調(diào)用其他函數(shù)后流程回到main函數(shù),在main函數(shù)結(jié)束整個(gè)程序運(yùn)行。main函數(shù)是系統(tǒng)定義的。(4)主函數(shù)可以調(diào)用任意子函數(shù),而子函數(shù)不能調(diào)用主函數(shù)。

子函數(shù)的地位是平等的,相互獨(dú)立,相互無從屬關(guān)系,可以相互調(diào)用。子函數(shù)可以直接或間接地自己調(diào)用自己,即遞歸調(diào)用。(2)C語言程序源文件由函數(shù)組成函數(shù)的概念是C語言結(jié)構(gòu)程序設(shè)計(jì)思想的體現(xiàn)。主函數(shù):包括一個(gè)且僅有一個(gè)——main()。其他函數(shù):可以有,也可以沒有,可以有一個(gè),也可以有多個(gè)。函數(shù)的基本概念(1)project——工程:是由一個(gè)11使用庫函數(shù)應(yīng)注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供:printf、scanf、getchar、putchar等用戶自定義函數(shù):由用戶按需要寫的函數(shù)。從用戶角度看:函數(shù)的分類(1)使用庫函數(shù)應(yīng)注意:從用戶角度看:函數(shù)的分類(1)12無參函數(shù):在調(diào)用無參函數(shù)時(shí),主調(diào)函數(shù)并不將數(shù)據(jù)送給被調(diào)函數(shù),一般用來執(zhí)行指定的一組操作。無參函數(shù)可以帶回或不帶回函數(shù)值,但一般以不帶回函數(shù)值居多。有參函數(shù):在調(diào)用函數(shù)時(shí),在主調(diào)函數(shù)和被調(diào)函數(shù)之間有參數(shù)傳遞,也就是說主調(diào)函數(shù)可以將數(shù)據(jù)傳給被調(diào)函數(shù)使用,被調(diào)用函數(shù)中的數(shù)據(jù)也可以帶回來供主調(diào)函數(shù)使用。從函數(shù)的形式看:max(intx,inty){…..}max(){…..}無參函數(shù):在調(diào)用無參函數(shù)時(shí),主調(diào)函數(shù)并不將數(shù)據(jù)送給被調(diào)函數(shù)13有返回值函數(shù):此類函數(shù)被調(diào)用執(zhí)行完后將向調(diào)用者返回一個(gè)執(zhí)行結(jié)果,稱為函數(shù)返回值。必須在函數(shù)定義和函數(shù)說明中明確返回值的類型。無返回值函數(shù):此類函數(shù)用于完成某項(xiàng)特定的處理任務(wù),執(zhí)行完成后不向調(diào)用者返回函數(shù)值??疹愋偷恼f明符為“void”從函數(shù)的返回值形式看:intmax(){return表達(dá)式;}voidmax(){……..}有返回值函數(shù):此類函數(shù)被調(diào)用執(zhí)行完后將向調(diào)用者返回一個(gè)執(zhí)行結(jié)14函數(shù)的定義(1)傳統(tǒng)風(fēng)格函數(shù)定義:

類型

函數(shù)名(形參表列)形參說明{

說明部分 語句}形參表列是用逗號(hào)分隔的形參,形參又稱為形式參數(shù)、啞元、虛參、虛擬參數(shù)。在形參說明中,說明形參表中每個(gè)形參的類型。類型:函數(shù)類型,用來說明本函數(shù)返回值的類型。當(dāng)函數(shù)返回值是整型或不要求返回值時(shí),可省略類型說明。無返回值可用“空類型”—void函數(shù)定義時(shí)的參數(shù)稱為行參;函數(shù)調(diào)用時(shí)的參數(shù)稱為實(shí)參。函數(shù)的定義(1)傳統(tǒng)風(fēng)格函數(shù)定義:形參表列是用逗號(hào)分15(2)函數(shù)的現(xiàn)代定義方式類型函數(shù)名(形參說明表列){說明部分語句}函數(shù)體 將形參說明包含到形參列表中,即在列出形參的同時(shí),說明形參類型。形參列表:類型參數(shù)1,類型參數(shù)2,…,類型參數(shù)n傳統(tǒng)定義舉例現(xiàn)代定義舉例intadd(x,y)intadd(intx,inty)intx,y;{……{……}}(2)函數(shù)的現(xiàn)代定義方式類型函數(shù)名(形參說明表列)函數(shù)體161.無參函數(shù)類型標(biāo)識(shí)符函數(shù)名(){說明部分語句}類型標(biāo)識(shí)符:表示返回值類型7.2.1函數(shù)的定義Hello(){printf("Hello,world\n");}例如:定義一個(gè)函數(shù)說明:這里,只把main改為Hello作為函數(shù)名,其余不變。Hello函數(shù)是一個(gè)無參函數(shù),當(dāng)被其它函數(shù)調(diào)用時(shí),輸出Helloworld字符串。1.無參函數(shù)類型標(biāo)識(shí)符函數(shù)名()7.2.1函17類型標(biāo)識(shí)符函數(shù)名(形參表列){說明部分語句}2.有參函數(shù)例:求二數(shù)之最大值

intmax(intx,inty){intz;

z=x>y?x:y;return(z);}注意:出現(xiàn)return,語句,返回值一般與函數(shù)類型一致。類型標(biāo)識(shí)符函數(shù)名(形參表列)18合法標(biāo)識(shí)符函數(shù)返回值類型缺省int型無返回值void函數(shù)體函數(shù)類型函數(shù)名(形參類型說明表){ 說明部分 語句部分}例有參函數(shù)(現(xiàn)代風(fēng)格)intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)(現(xiàn)代風(fēng)格)intmax(intx,y){intz;z=x>y?x:y;return(z);}例空函數(shù)dummy(){}函數(shù)體為空例無參函數(shù)printstar(){printf(“**********\n”);}或printstar(void){printf(“**********\n”);}合法標(biāo)識(shí)符函數(shù)返回值類型函數(shù)體函數(shù)類型函數(shù)名(形參193.可以有“空函數(shù)”

類型說明符函數(shù)名(){}例如:dummy(){}調(diào)用此函數(shù)時(shí),什么工作也不做,沒有任何實(shí)際作用。在主調(diào)函數(shù)中寫上“dummy();”表明“這里要調(diào)用一個(gè)函數(shù)”,而現(xiàn)在這個(gè)函數(shù)沒有起作用,等以后擴(kuò)充函數(shù)功能時(shí)補(bǔ)充上。3.可以有“空函數(shù)”20函數(shù)定義說明(1)一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)組成。一個(gè)源程序文件是一個(gè)編譯單位,即以源程序?yàn)閱挝贿M(jìn)行編譯,而不是以函數(shù)為單位進(jìn)行編譯。(2)一個(gè)C程序由一個(gè)或多個(gè)源程序文件組成。對(duì)較大的程序,一般不希望全放在一個(gè)文件中,而將函數(shù)和其他內(nèi)容(如預(yù)定義)分別放在若干個(gè)源文件中,再由若干源文件組成一個(gè)C程序。這樣可以分別編寫、分別編譯,提高調(diào)度效率。一個(gè)源文件可以為多個(gè)C程序公用。函數(shù)定義說明(1)一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)組成。一個(gè)21函數(shù)定義說明(3)C程序的執(zhí)行從main函數(shù)開始,調(diào)用其他函數(shù)后流程回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。main函數(shù)是系統(tǒng)定義的。(4)所有函數(shù)都是平行的,即在定義函數(shù)時(shí)是互相獨(dú)立的,一個(gè)函數(shù)并不從屬于另一函數(shù),即函數(shù)不能嵌套定義,函數(shù)間可以互相調(diào)用,但不能調(diào)用main函數(shù)。函數(shù)定義說明(3)C程序的執(zhí)行從main函數(shù)開始,調(diào)用其他22程序舉例1定義求兩個(gè)整數(shù)和的函數(shù)。intadd(intx,inty){intz;z=x+y;return(z);}程序舉例1定義求兩個(gè)整數(shù)和的函數(shù)。intadd(int23intmax(intx1,intx2,intx3){intmax;if(x1>x2)max=x1;elsemax=x2;if(max<x3)max=x3;

return(max);

}

編寫函數(shù),求三個(gè)整型參數(shù)的最大值。

程序舉例2/*定義函數(shù)的返回值類型,函數(shù)名,形參*//*通過比較得到三個(gè)數(shù)的最大值放到max中*//*返回運(yùn)算結(jié)果*/intmax(intx1,intx2,intx3)編24函數(shù)的返回值功能將被調(diào)函數(shù)中的結(jié)果值返回給主調(diào)函數(shù)。語句return(返回值表達(dá)式)或return表達(dá)式;或return;舉例intadd(intx,inty){intz;z=x+y;return(z);}函數(shù)的返回值功能將被調(diào)函數(shù)中的結(jié)果值返回給主調(diào)函數(shù)。語句re25

(1)函數(shù)的返回值是通過函數(shù)中的return語句獲得的。return語句將被調(diào)用函數(shù)中的一個(gè)確定值帶回主調(diào)函數(shù)中去。如果需要從被調(diào)用函數(shù)帶回一個(gè)函數(shù)值(供主調(diào)函數(shù)使用),被調(diào)用函數(shù)中必須包含return語句。如果不需要從被調(diào)用函數(shù)帶回函數(shù)值,可以不要return語句。一個(gè)函數(shù)中可以有一個(gè)以上的return語句,執(zhí)行到哪一個(gè)return語句,哪一個(gè)語句起作用。return語句后面的括弧也可以不要,如returnz;它與“return(z);”等價(jià)。說明:說明:26例如,max(intx,inty){intz;z=x>y?x∶y;return(z);}

函數(shù)max可以改寫如下:max(intx,inty){return(x>y?x∶y);}(2)return后面的值可以是一個(gè)表達(dá)式這樣的函數(shù)體更為簡(jiǎn)短,只用一個(gè)return語句就把求值和返回都解決了。例如,函數(shù)max可以改寫如下:(2)return后面的值可27(3)函數(shù)值的類型。既然函數(shù)有返回值,這個(gè)值當(dāng)然應(yīng)屬于某一個(gè)確定的類型,應(yīng)當(dāng)在定義函數(shù)時(shí)指定函數(shù)值的類型。C語言規(guī)定,凡不加類型說明的函數(shù),一律自動(dòng)按整型處理。

在定義函數(shù)時(shí)對(duì)函數(shù)值說明的類型一般應(yīng)該和return語句中的表達(dá)式類型一致。例如,例2中用隱含方式指定max函數(shù)值為整型,而變量z也被指定為整型,通過return語句把z的值作為max的函數(shù)值,由max帶回主調(diào)函數(shù)。z的類型與max函數(shù)的類型是一致的,是正確的。(4)若無return語句,遇到函數(shù)結(jié)束的“}”時(shí),自動(dòng)返回調(diào)用函數(shù)(3)函數(shù)值的類型。既然函數(shù)有返回值,這個(gè)值當(dāng)然應(yīng)屬于某一28

(5)如果函數(shù)值的類型和return語句中表達(dá)式的值不一致,則以函數(shù)類型為準(zhǔn)。對(duì)數(shù)值型數(shù)據(jù),可以自動(dòng)進(jìn)行類型轉(zhuǎn)換。即函數(shù)類型決定返回值的類型。main(){floata,b;intc;scanf(“%f,%f,”&a,&b); max(floatx,floaty);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;/*z為實(shí)型變量*/z=x>y?x∶y;return(z);}運(yùn)行情況如下:1.5,2.5Maxis2(5)如果函數(shù)值的類型和return語句29printstar(){printf("**********");}main(){inta;a=printstar();printf("%d",a);}(6)無返回值的函數(shù)返回后帶回不確定值輸出:10voidprintstar(){printf("**********");}main(){inta;

a=printstar();printf("%d",a);}編譯錯(cuò)誤!printstar()(6)無返回值的函數(shù)返回后帶回不確定30程序舉例2下面add函數(shù)的功能是求兩個(gè)參數(shù)的和,并將和值返回調(diào)用函數(shù)。函數(shù)中的錯(cuò)誤是:voidadd(floata,floatb) {floatc;c=a+b;returnc;}voidadd(floata,floatb)floatadd(floata,floatb)程序舉例2下面add函數(shù)的功能是求兩個(gè)參數(shù)的和,并將317.3函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式為

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

如果是調(diào)用無參函數(shù),則“實(shí)參表列”可以沒有,但括弧不能省略。如果實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù)間用逗號(hào)隔開。實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類型應(yīng)一致。實(shí)參與形參按順序?qū)?yīng),一一傳遞數(shù)據(jù)。7.3函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式為32函數(shù)調(diào)用方式調(diào)用方式函數(shù)調(diào)用語句函數(shù)表達(dá)式函數(shù)參數(shù)print_star(n);voidprint_star(intn){inti;for(i=1;i<=n;i++)printf("*");}x=max(a,b)+5;x=max(max(a,b),c);函數(shù)調(diào)用方式調(diào)用方式函數(shù)調(diào)用語句函數(shù)表達(dá)式函數(shù)參數(shù)prin33

1.函數(shù)語句把函數(shù)調(diào)用作為一個(gè)語句。如hello();這時(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ù)max是表達(dá)式的一部分,它的值乘2再賦給c。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三者最大的。又如:printf(“%d”,max(a,b));也是把max(a,b)作為printf函數(shù)的一個(gè)參數(shù)。1.函數(shù)語句34調(diào)用函數(shù)的過程是:①為函數(shù)的所有形參分配內(nèi)存單元。②計(jì)算各個(gè)實(shí)參表達(dá)式的值,一一對(duì)應(yīng)的賦值給相應(yīng)形參(若是無參函數(shù),上述過程不執(zhí)行)。③進(jìn)入函數(shù)體,執(zhí)行函數(shù)中的語句,實(shí)現(xiàn)函數(shù)的功能。④執(zhí)行到return語句時(shí),計(jì)算return語句中表達(dá)式的值(若是無返回值函數(shù),本項(xiàng)不做),返回到主調(diào)函數(shù)。⑤釋放形參及本函數(shù)內(nèi)的局部變量所占內(nèi)存,繼續(xù)執(zhí)行主調(diào)函數(shù)中的后繼語句。調(diào)用函數(shù)的過程是:35形式參數(shù)和實(shí)際參數(shù)在調(diào)用函數(shù)時(shí),大多數(shù)情況下,主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。這就是前面提到的有參函數(shù)。前面已提到:在定義函數(shù)時(shí)函數(shù)名后面括弧中的變量名稱為“形式參數(shù)”(簡(jiǎn)稱“形參”),在主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括弧中的參數(shù)(可以是一個(gè)表達(dá)式)稱為“實(shí)際參數(shù)”(簡(jiǎn)稱“實(shí)參”)。形式參數(shù)和實(shí)際參數(shù)在調(diào)用函數(shù)時(shí),大多數(shù)情36參數(shù)傳遞主調(diào)函數(shù)向被調(diào)函數(shù)傳值的方式:賦值調(diào)用

把實(shí)參的值賦給形參。賦地址調(diào)用

把實(shí)參的地址付給形參。在被調(diào)函數(shù)中,用該地址訪問主調(diào)函數(shù)中的實(shí)參。實(shí)參形參調(diào)用返回單向值傳遞參數(shù)傳遞主調(diào)函數(shù)向被調(diào)函數(shù)傳值的方式:賦值調(diào)用實(shí)參形參調(diào)用返37C語言中,函數(shù)調(diào)用是值傳遞方式,即函數(shù)的實(shí)際參數(shù)和形式參數(shù)之間的數(shù)據(jù)傳遞方向是單向的,只能由實(shí)際參數(shù)傳遞給形式參數(shù),而不能由形式參數(shù)傳遞給實(shí)際參數(shù),是實(shí)際參數(shù)向形式參數(shù)單向賦值的關(guān)系。在內(nèi)存中,形式參數(shù)與實(shí)際參數(shù)占用不同的內(nèi)存單元。當(dāng)調(diào)用函數(shù)時(shí),給形式參數(shù)分配內(nèi)存單元,將實(shí)際參數(shù)的值賦值給形式參數(shù),調(diào)用后,形式參數(shù)單元釋放,實(shí)際參數(shù)仍保留調(diào)用前的值,形式參數(shù)值的變化不影響實(shí)際參數(shù)。函數(shù)參數(shù)及其傳遞方式C語言中,函數(shù)調(diào)用是值傳遞方式,即函數(shù)的實(shí)際參數(shù)和形式參數(shù)之38調(diào)用結(jié)束:35a:b:例5.6交換兩個(gè)數(shù)#include<stdio.h>main(){inta=3,b=5;printf(“a=%d,\tb=%d\n",a,b);printf("swapped:\n");

swap(a,b);printf(“a=%d,\tb=%d\n",a,b);}swap(intx,inty){inttemp;temp=x;x=y;y=temp;}35a:b:調(diào)用前:調(diào)用35x:y:35a:b:swap:temp35a:b:x:35y:353temp=xx=yy=temp調(diào)用結(jié)束:35a:b:例5.6交換兩個(gè)數(shù)35a:b:39程序舉例分析一下程序,寫出運(yùn)行結(jié)果。#include<stdio.h>main(){inta=5,b=10;printf("a=%d,b=%d\n",a,b);fun(a,b); /*函數(shù)調(diào)用*/printf("a=%d,b=%d\n",a,b);}intfun(intx,inty)/*現(xiàn)代風(fēng)格函數(shù)定義*/{x=3;y=3;return;}a=5,b=10a=5,b=10程序舉例分析一下程序,寫出運(yùn)行結(jié)果。#include<s40

main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf(“Maxis%d",c);}max(intx,inty)/*定義有參函數(shù)max*/{intz;z=x>y?x∶y;return(z);}運(yùn)行情況如下:7,8Maxis8形參實(shí)參c=max(a,b);(main函數(shù))(max函數(shù))max(intx,inty){intz;z=x>y?x:y;return(z);}程序舉例形參實(shí)參c=max(a,b);(main函數(shù))(max函41說明:實(shí)參必須有確定的值形參必須指定類型形參與實(shí)參類型一致,個(gè)數(shù)相同若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)換———函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放說明:42例計(jì)算x的立方#include<stdio.h>floatcube(floatx){return(x*x*x);}main(){floata,product;printf("Pleaseinputvalueofa:");scanf("%f",&a);product=cube(a);printf(”Cubeof%.4fis%.4f\n",a,product);}xaproduct××××1.21.21.728程序舉例例計(jì)算x的立方#include<stdio.h>xap43在一個(gè)函數(shù)中調(diào)用另一函數(shù)(即被調(diào)用函數(shù))需要具備哪些條件呢?(1)首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)(是庫函數(shù)或用戶自己定義的函數(shù))。(2)如果使用庫函數(shù),一般還應(yīng)該在本文件開頭用#include命令將調(diào)用有關(guān)庫函數(shù)時(shí)所需用到的信息“包含”到本文件中來。例如,#include<stdio.h>其中“stdio.h”是一個(gè)“頭文件”。在stdio.h文件中放了輸入輸出庫函數(shù)所用到的一些宏定義信息。如果不包含“stdio.h”文件中的信息,就無法使用輸入輸出庫中的函數(shù)。在一個(gè)函數(shù)中調(diào)用另一函數(shù)(即被調(diào)用函數(shù))44(3)如果使用用戶自己定義的函數(shù),而且該函數(shù)與調(diào)用它的函數(shù)(即主調(diào)函數(shù))在同一個(gè)文件中,一般還應(yīng)該在主調(diào)函數(shù)中對(duì)被調(diào)用的函數(shù)作聲明,即向編譯系統(tǒng)聲明將要調(diào)用此函數(shù),并將有關(guān)信息通知編譯系統(tǒng)。例:對(duì)被調(diào)用的函數(shù)作聲明。floatadd(floatx,floaty);/*對(duì)被調(diào)用函數(shù)的聲明*/main(){floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty)/*函數(shù)首部*/{floatz;/*函數(shù)體*/z=x+y;return(z);}

(3)如果使用用戶自己定義的函數(shù),而且該45注意:對(duì)函數(shù)的“定義”和“聲明”不是一回事。“定義”是指對(duì)函數(shù)功能的確立,包括指定函數(shù)名,函數(shù)值類型、形參及其類型、函數(shù)體等,它是一個(gè)完整的、獨(dú)立的函數(shù)單位。

“聲明”的作用則是把函數(shù)的名字、函數(shù)類型以及形參的類型、個(gè)數(shù)和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時(shí)系統(tǒng)按此進(jìn)行對(duì)照檢查(例如函數(shù)名是否正確,實(shí)參與形參的類型和個(gè)數(shù)是否一致)。從程序中可以看到對(duì)函數(shù)的聲明與函數(shù)定義中的第1行(函數(shù)首部)基本上是相同的。因此可以簡(jiǎn)單地照寫已定義的函數(shù)的首部,再加一個(gè)分號(hào),就成為了對(duì)函數(shù)的“聲明”。其實(shí),在函數(shù)聲明中也可以不寫形參名,而只寫形參的類型。如:floatadd(float,float);

注意:對(duì)函數(shù)的“定義”和“聲明”不是一回事。46

函數(shù)聲明又稱為函數(shù)原型(functionprototype)。作用:主要是利用它在程序的編譯階段對(duì)調(diào)用函數(shù)的合法性進(jìn)行全面檢查。函數(shù)原型的一般形式為(1)函數(shù)類型函數(shù)名(參數(shù)類型1,參數(shù)類型2……);(2)函數(shù)類型函數(shù)名(參數(shù)類型1參數(shù)名1,參數(shù)類型2參數(shù)名2……);例如:(1)floatadd(float,float);(2)floatadd(floatx,floaty);函數(shù)聲明函數(shù)聲明又稱為函數(shù)原型(functionprotot47說明:(1)實(shí)際上,如果在函數(shù)調(diào)用之前,沒有對(duì)函數(shù)作聲明,則編譯系統(tǒng)會(huì)把笫一次遇到的該函數(shù)形式(函數(shù)定義或函數(shù)調(diào)用)作為函數(shù)的聲明,并將函數(shù)類型默認(rèn)為int型。使用這種方法時(shí),系統(tǒng)無法對(duì)參數(shù)的類型做檢查。若調(diào)用函數(shù)時(shí)參數(shù)使用不當(dāng),在編譯時(shí)也不會(huì)報(bào)錯(cuò)。因此,為了程序清晰和安全,建議都加以聲明為好。(2)如果被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前,可以不必加以聲明。因?yàn)榫幾g系統(tǒng)已經(jīng)先知道了已定義的函數(shù)類型,會(huì)根據(jù)函數(shù)首部提供的信息對(duì)函數(shù)的調(diào)用作正確性檢查。(3)如果被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之后,必須加以聲明。因?yàn)榫幾g系統(tǒng)不知道此函數(shù)的存在。說明:48例函數(shù)說明舉例main(){floata,b;intc;scanf("%f,%f",&a,&b);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;z=x>y?x:y;return(z);}int型函數(shù)可不作函數(shù)說明/*ch7_5.c*/floatadd(floatx,floaty){floatz;z=x+y;return(z);}main(){floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}被調(diào)函數(shù)出現(xiàn)在主調(diào)函數(shù)之前,不必函數(shù)說明/**/main(){floatadd(float,float);/*functiondeclaration*/floata,b,c;scanf("%f,%f",&a,&b);c=add(a,b);printf("sumis%f",c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}floatadd();例函數(shù)說明舉例main()int型函數(shù)可不作函數(shù)說明/*49對(duì)于函數(shù)的位置:對(duì)于非int函數(shù),調(diào)用單位的位置要在被調(diào)用單位在下面,否則編譯產(chǎn)生錯(cuò)誤。解決方法是:在調(diào)用單位加上被調(diào)用函數(shù)的聲(說)明。voidf(){…}main(){…f();…}voidf(){…}main(){…f();…}voidf(){…}main(){voidf();…f();…}對(duì)于函數(shù)的位置:voidf()main()void50程序舉例4輸入兩個(gè)整數(shù),求其中最大者并打印。#include<stdio.h>main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b); /*函數(shù)調(diào)用*/printf("max=%d",c);}intmax(intx,inty)/*現(xiàn)代風(fēng)格函數(shù)定義*/{return();}x>y?x:y程序舉例4輸入兩個(gè)整數(shù),求其中最大者并打印。#include51第七章函數(shù)第七章函數(shù)52該章的學(xué)習(xí)內(nèi)容學(xué)點(diǎn)什么哪?掌握函數(shù)原型(prototype)及其,函數(shù)定義和函數(shù)原型說明的方法及二者的區(qū)別。掌握函數(shù)的參數(shù)傳遞方式與函數(shù)調(diào)用方法。理解掌握變量的作用域和存儲(chǔ)類的概念。該章的學(xué)習(xí)內(nèi)容學(xué)點(diǎn)什么哪?掌握函數(shù)原型(prototype)531.通過C語言的學(xué)習(xí),牢固樹立起函數(shù)的概念,及其使用規(guī)則。2.理解函數(shù)的作用域及其存儲(chǔ)類及其自動(dòng)變量與靜態(tài)局部變量在應(yīng)用中的區(qū)別。*3.在實(shí)際應(yīng)用中,學(xué)習(xí)和體會(huì)采用結(jié)構(gòu)化設(shè)計(jì)方法(模塊化)解決問題的思想。本章的學(xué)習(xí)難點(diǎn)1.通過C語言的學(xué)習(xí),牢固樹立起函數(shù)的概念,及其使用規(guī)則。54本章目錄函數(shù)1.1.函數(shù)有關(guān)概念及其分類1.2.函數(shù)的定義1.3.函數(shù)的返回值1.4.函數(shù)的調(diào)用與參數(shù)傳遞1.5.函數(shù)原型的說明*宏定義變量的作用域和存儲(chǔ)類*模塊化程序設(shè)計(jì)方法*應(yīng)用設(shè)計(jì)實(shí)例多文件方式組織的程序本章目錄函數(shù)55概述

一個(gè)較大的程序一般應(yīng)分為若干個(gè)程序模塊,每一個(gè)模塊用來實(shí)現(xiàn)一定的功能。所有的高級(jí)語言中都有子程序這個(gè)概念,用子程序來實(shí)現(xiàn)模塊功能。在C語言中,子程序的作用是由函數(shù)來完成的。一個(gè)C程序可由一個(gè)主函數(shù)和若干個(gè)函數(shù)構(gòu)成。由主函數(shù)調(diào)用其它函數(shù),其它函數(shù)也可以互相調(diào)用。同一個(gè)函數(shù)可以被一個(gè)或多個(gè)函數(shù)調(diào)用任意多次。

概述一個(gè)較大的程序一般應(yīng)分為若干個(gè)程序模塊,56程序設(shè)計(jì)中,常將一些常用的功能模塊編寫成函數(shù),放在函數(shù)庫中供公共選用。要善于用函數(shù),以減少重復(fù)編程的工作量。C語言提倡把一個(gè)大問題劃分成許多個(gè)小塊,每一小塊編制一個(gè)函數(shù)。這樣C程序是由許多小函數(shù)而不是由少量大函數(shù)構(gòu)成。這樣作的好處:各部分充分獨(dú)立,任務(wù)單一,便于書寫和調(diào)試。有些小函數(shù)還可以作為構(gòu)件,被別的程序利用。概述程序設(shè)計(jì)中,常將一些常用的功能模塊編寫成函數(shù),57C程序工程源程序文件1源程序文件2源程序文件3編譯預(yù)處理命令全局變量聲明函數(shù)1函數(shù)n…函數(shù)首部函數(shù)體局部變量聲明執(zhí)行語句C程序的基本結(jié)構(gòu)C程序工程源程序文件1源程序文件2源程序文件3編譯預(yù)處理命令58mainabcdeifghegh程序中函數(shù)調(diào)用示意圖mainabcdeifghegh程序中函數(shù)調(diào)用示意圖59基本思想:將一個(gè)大的程序按功能分割成一些小模塊.特點(diǎn):各模塊相對(duì)獨(dú)立、功能單一、結(jié)構(gòu)清晰、接口簡(jiǎn)單控制了程序設(shè)計(jì)的復(fù)雜性提高元件的可靠性縮短開發(fā)周期避免程序開發(fā)的重復(fù)勞動(dòng)易于維護(hù)和功能擴(kuò)充開發(fā)方法:

自上向下,逐步分解,分而治之模塊化程序設(shè)計(jì)基本思想:將一個(gè)大的程序按功能分割成一些小模塊.模塊化程序設(shè)60C是模塊化程序設(shè)計(jì)語言規(guī)則必須有且只能有一個(gè)名為main的主函數(shù)C程序的執(zhí)行總是從main函數(shù)開始,在main中結(jié)束。函數(shù)不能嵌套定義,可以嵌套調(diào)用C是模塊化程序設(shè)計(jì)語言規(guī)則必須有且只能有一個(gè)名為main的主61函數(shù)的基本概念(1)

project——工程:是由一個(gè)或多個(gè)C程序源文件組成。一個(gè)源程序是由一個(gè)或多個(gè)函數(shù)組成。一個(gè)源程序是一個(gè)編譯單位,即以源程序?yàn)閱挝贿M(jìn)行編譯,而不是以函數(shù)為單位進(jìn)行編譯。其擴(kuò)展名為.h或.c。(3)C程序的執(zhí)行從main()函數(shù)開始。沒有main()函數(shù)的程序,不能執(zhí)行。調(diào)用其他函數(shù)后流程回到main函數(shù),在main函數(shù)結(jié)束整個(gè)程序運(yùn)行。main函數(shù)是系統(tǒng)定義的。(4)主函數(shù)可以調(diào)用任意子函數(shù),而子函數(shù)不能調(diào)用主函數(shù)。

子函數(shù)的地位是平等的,相互獨(dú)立,相互無從屬關(guān)系,可以相互調(diào)用。子函數(shù)可以直接或間接地自己調(diào)用自己,即遞歸調(diào)用。(2)C語言程序源文件由函數(shù)組成函數(shù)的概念是C語言結(jié)構(gòu)程序設(shè)計(jì)思想的體現(xiàn)。主函數(shù):包括一個(gè)且僅有一個(gè)——main()。其他函數(shù):可以有,也可以沒有,可以有一個(gè),也可以有多個(gè)。函數(shù)的基本概念(1)project——工程:是由一個(gè)62使用庫函數(shù)應(yīng)注意:1、函數(shù)功能2、函數(shù)參數(shù)的數(shù)目和順序,及各參數(shù)意義和類型3、函數(shù)返回值意義和類型4、需要使用的包含文件標(biāo)準(zhǔn)函數(shù)(庫函數(shù)):由系統(tǒng)提供:printf、scanf、getchar、putchar等用戶自定義函數(shù):由用戶按需要寫的函數(shù)。從用戶角度看:函數(shù)的分類(1)使用庫函數(shù)應(yīng)注意:從用戶角度看:函數(shù)的分類(1)63無參函數(shù):在調(diào)用無參函數(shù)時(shí),主調(diào)函數(shù)并不將數(shù)據(jù)送給被調(diào)函數(shù),一般用來執(zhí)行指定的一組操作。無參函數(shù)可以帶回或不帶回函數(shù)值,但一般以不帶回函數(shù)值居多。有參函數(shù):在調(diào)用函數(shù)時(shí),在主調(diào)函數(shù)和被調(diào)函數(shù)之間有參數(shù)傳遞,也就是說主調(diào)函數(shù)可以將數(shù)據(jù)傳給被調(diào)函數(shù)使用,被調(diào)用函數(shù)中的數(shù)據(jù)也可以帶回來供主調(diào)函數(shù)使用。從函數(shù)的形式看:max(intx,inty){…..}max(){…..}無參函數(shù):在調(diào)用無參函數(shù)時(shí),主調(diào)函數(shù)并不將數(shù)據(jù)送給被調(diào)函數(shù)64有返回值函數(shù):此類函數(shù)被調(diào)用執(zhí)行完后將向調(diào)用者返回一個(gè)執(zhí)行結(jié)果,稱為函數(shù)返回值。必須在函數(shù)定義和函數(shù)說明中明確返回值的類型。無返回值函數(shù):此類函數(shù)用于完成某項(xiàng)特定的處理任務(wù),執(zhí)行完成后不向調(diào)用者返回函數(shù)值??疹愋偷恼f明符為“void”從函數(shù)的返回值形式看:intmax(){return表達(dá)式;}voidmax(){……..}有返回值函數(shù):此類函數(shù)被調(diào)用執(zhí)行完后將向調(diào)用者返回一個(gè)執(zhí)行結(jié)65函數(shù)的定義(1)傳統(tǒng)風(fēng)格函數(shù)定義:

類型

函數(shù)名(形參表列)形參說明{

說明部分 語句}形參表列是用逗號(hào)分隔的形參,形參又稱為形式參數(shù)、啞元、虛參、虛擬參數(shù)。在形參說明中,說明形參表中每個(gè)形參的類型。類型:函數(shù)類型,用來說明本函數(shù)返回值的類型。當(dāng)函數(shù)返回值是整型或不要求返回值時(shí),可省略類型說明。無返回值可用“空類型”—void函數(shù)定義時(shí)的參數(shù)稱為行參;函數(shù)調(diào)用時(shí)的參數(shù)稱為實(shí)參。函數(shù)的定義(1)傳統(tǒng)風(fēng)格函數(shù)定義:形參表列是用逗號(hào)分66(2)函數(shù)的現(xiàn)代定義方式類型函數(shù)名(形參說明表列){說明部分語句}函數(shù)體 將形參說明包含到形參列表中,即在列出形參的同時(shí),說明形參類型。形參列表:類型參數(shù)1,類型參數(shù)2,…,類型參數(shù)n傳統(tǒng)定義舉例現(xiàn)代定義舉例intadd(x,y)intadd(intx,inty)intx,y;{……{……}}(2)函數(shù)的現(xiàn)代定義方式類型函數(shù)名(形參說明表列)函數(shù)體671.無參函數(shù)類型標(biāo)識(shí)符函數(shù)名(){說明部分語句}類型標(biāo)識(shí)符:表示返回值類型7.2.1函數(shù)的定義Hello(){printf("Hello,world\n");}例如:定義一個(gè)函數(shù)說明:這里,只把main改為Hello作為函數(shù)名,其余不變。Hello函數(shù)是一個(gè)無參函數(shù),當(dāng)被其它函數(shù)調(diào)用時(shí),輸出Helloworld字符串。1.無參函數(shù)類型標(biāo)識(shí)符函數(shù)名()7.2.1函68類型標(biāo)識(shí)符函數(shù)名(形參表列){說明部分語句}2.有參函數(shù)例:求二數(shù)之最大值

intmax(intx,inty){intz;

z=x>y?x:y;return(z);}注意:出現(xiàn)return,語句,返回值一般與函數(shù)類型一致。類型標(biāo)識(shí)符函數(shù)名(形參表列)69合法標(biāo)識(shí)符函數(shù)返回值類型缺省int型無返回值void函數(shù)體函數(shù)類型函數(shù)名(形參類型說明表){ 說明部分 語句部分}例有參函數(shù)(現(xiàn)代風(fēng)格)intmax(intx,inty){intz;z=x>y?x:y;return(z);}例有參函數(shù)(現(xiàn)代風(fēng)格)intmax(intx,y){intz;z=x>y?x:y;return(z);}例空函數(shù)dummy(){}函數(shù)體為空例無參函數(shù)printstar(){printf(“**********\n”);}或printstar(void){printf(“**********\n”);}合法標(biāo)識(shí)符函數(shù)返回值類型函數(shù)體函數(shù)類型函數(shù)名(形參703.可以有“空函數(shù)”

類型說明符函數(shù)名(){}例如:dummy(){}調(diào)用此函數(shù)時(shí),什么工作也不做,沒有任何實(shí)際作用。在主調(diào)函數(shù)中寫上“dummy();”表明“這里要調(diào)用一個(gè)函數(shù)”,而現(xiàn)在這個(gè)函數(shù)沒有起作用,等以后擴(kuò)充函數(shù)功能時(shí)補(bǔ)充上。3.可以有“空函數(shù)”71函數(shù)定義說明(1)一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)組成。一個(gè)源程序文件是一個(gè)編譯單位,即以源程序?yàn)閱挝贿M(jìn)行編譯,而不是以函數(shù)為單位進(jìn)行編譯。(2)一個(gè)C程序由一個(gè)或多個(gè)源程序文件組成。對(duì)較大的程序,一般不希望全放在一個(gè)文件中,而將函數(shù)和其他內(nèi)容(如預(yù)定義)分別放在若干個(gè)源文件中,再由若干源文件組成一個(gè)C程序。這樣可以分別編寫、分別編譯,提高調(diào)度效率。一個(gè)源文件可以為多個(gè)C程序公用。函數(shù)定義說明(1)一個(gè)源程序文件由一個(gè)或多個(gè)函數(shù)組成。一個(gè)72函數(shù)定義說明(3)C程序的執(zhí)行從main函數(shù)開始,調(diào)用其他函數(shù)后流程回到main函數(shù),在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。main函數(shù)是系統(tǒng)定義的。(4)所有函數(shù)都是平行的,即在定義函數(shù)時(shí)是互相獨(dú)立的,一個(gè)函數(shù)并不從屬于另一函數(shù),即函數(shù)不能嵌套定義,函數(shù)間可以互相調(diào)用,但不能調(diào)用main函數(shù)。函數(shù)定義說明(3)C程序的執(zhí)行從main函數(shù)開始,調(diào)用其他73程序舉例1定義求兩個(gè)整數(shù)和的函數(shù)。intadd(intx,inty){intz;z=x+y;return(z);}程序舉例1定義求兩個(gè)整數(shù)和的函數(shù)。intadd(int74intmax(intx1,intx2,intx3){intmax;if(x1>x2)max=x1;elsemax=x2;if(max<x3)max=x3;

return(max);

}

編寫函數(shù),求三個(gè)整型參數(shù)的最大值。

程序舉例2/*定義函數(shù)的返回值類型,函數(shù)名,形參*//*通過比較得到三個(gè)數(shù)的最大值放到max中*//*返回運(yùn)算結(jié)果*/intmax(intx1,intx2,intx3)編75函數(shù)的返回值功能將被調(diào)函數(shù)中的結(jié)果值返回給主調(diào)函數(shù)。語句return(返回值表達(dá)式)或return表達(dá)式;或return;舉例intadd(intx,inty){intz;z=x+y;return(z);}函數(shù)的返回值功能將被調(diào)函數(shù)中的結(jié)果值返回給主調(diào)函數(shù)。語句re76

(1)函數(shù)的返回值是通過函數(shù)中的return語句獲得的。return語句將被調(diào)用函數(shù)中的一個(gè)確定值帶回主調(diào)函數(shù)中去。如果需要從被調(diào)用函數(shù)帶回一個(gè)函數(shù)值(供主調(diào)函數(shù)使用),被調(diào)用函數(shù)中必須包含return語句。如果不需要從被調(diào)用函數(shù)帶回函數(shù)值,可以不要return語句。一個(gè)函數(shù)中可以有一個(gè)以上的return語句,執(zhí)行到哪一個(gè)return語句,哪一個(gè)語句起作用。return語句后面的括弧也可以不要,如returnz;它與“return(z);”等價(jià)。說明:說明:77例如,max(intx,inty){intz;z=x>y?x∶y;return(z);}

函數(shù)max可以改寫如下:max(intx,inty){return(x>y?x∶y);}(2)return后面的值可以是一個(gè)表達(dá)式這樣的函數(shù)體更為簡(jiǎn)短,只用一個(gè)return語句就把求值和返回都解決了。例如,函數(shù)max可以改寫如下:(2)return后面的值可78(3)函數(shù)值的類型。既然函數(shù)有返回值,這個(gè)值當(dāng)然應(yīng)屬于某一個(gè)確定的類型,應(yīng)當(dāng)在定義函數(shù)時(shí)指定函數(shù)值的類型。C語言規(guī)定,凡不加類型說明的函數(shù),一律自動(dòng)按整型處理。

在定義函數(shù)時(shí)對(duì)函數(shù)值說明的類型一般應(yīng)該和return語句中的表達(dá)式類型一致。例如,例2中用隱含方式指定max函數(shù)值為整型,而變量z也被指定為整型,通過return語句把z的值作為max的函數(shù)值,由max帶回主調(diào)函數(shù)。z的類型與max函數(shù)的類型是一致的,是正確的。(4)若無return語句,遇到函數(shù)結(jié)束的“}”時(shí),自動(dòng)返回調(diào)用函數(shù)(3)函數(shù)值的類型。既然函數(shù)有返回值,這個(gè)值當(dāng)然應(yīng)屬于某一79

(5)如果函數(shù)值的類型和return語句中表達(dá)式的值不一致,則以函數(shù)類型為準(zhǔn)。對(duì)數(shù)值型數(shù)據(jù),可以自動(dòng)進(jìn)行類型轉(zhuǎn)換。即函數(shù)類型決定返回值的類型。main(){floata,b;intc;scanf(“%f,%f,”&a,&b); max(floatx,floaty);c=max(a,b);printf("Maxis%d\n",c);}max(floatx,floaty){floatz;/*z為實(shí)型變量*/z=x>y?x∶y;return(z);}運(yùn)行情況如下:1.5,2.5Maxis2(5)如果函數(shù)值的類型和return語句80printstar(){printf("**********");}main(){inta;a=printstar();printf("%d",a);}(6)無返回值的函數(shù)返回后帶回不確定值輸出:10voidprintstar(){printf("**********");}main(){inta;

a=printstar();printf("%d",a);}編譯錯(cuò)誤!printstar()(6)無返回值的函數(shù)返回后帶回不確定81程序舉例2下面add函數(shù)的功能是求兩個(gè)參數(shù)的和,并將和值返回調(diào)用函數(shù)。函數(shù)中的錯(cuò)誤是:voidadd(floata,floatb) {floatc;c=a+b;returnc;}voidadd(floata,floatb)floatadd(floata,floatb)程序舉例2下面add函數(shù)的功能是求兩個(gè)參數(shù)的和,并將827.3函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式為

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

如果是調(diào)用無參函數(shù),則“實(shí)參表列”可以沒有,但括弧不能省略。如果實(shí)參表列包含多個(gè)實(shí)參,則各參數(shù)間用逗號(hào)隔開。實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類型應(yīng)一致。實(shí)參與形參按順序?qū)?yīng),一一傳遞數(shù)據(jù)。7.3函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式為83函數(shù)調(diào)用方式調(diào)用方式函數(shù)調(diào)用語句函數(shù)表達(dá)式函數(shù)參數(shù)print_star(n);voidprint_star(intn){inti;for(i=1;i<=n;i++)printf("*");}x=max(a,b)+5;x=max(max(a,b),c);函數(shù)調(diào)用方式調(diào)用方式函數(shù)調(diào)用語句函數(shù)表達(dá)式函數(shù)參數(shù)prin84

1.函數(shù)語句把函數(shù)調(diào)用作為一個(gè)語句。如hello();這時(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ù)max是表達(dá)式的一部分,它的值乘2再賦給c。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三者最大的。又如:printf(“%d”,max(a,b));也是把max(a,b)作為printf函數(shù)的一個(gè)參數(shù)。1.函數(shù)語句85調(diào)用函數(shù)的過程是:①為函數(shù)的所有形參分配內(nèi)存單元。②計(jì)算各個(gè)實(shí)參表達(dá)式的值,一一對(duì)應(yīng)的賦值給相應(yīng)形參(若是無參函數(shù),上述過程不執(zhí)行)。③進(jìn)入函數(shù)體,執(zhí)行函數(shù)中的語句,實(shí)現(xiàn)函數(shù)的功能。④執(zhí)行到return語句時(shí),計(jì)算return語句中表達(dá)式的值(若是無返回值函數(shù),本項(xiàng)不做),返回到主調(diào)函數(shù)。⑤釋放形參及本函數(shù)內(nèi)的局部變量所占內(nèi)存,繼續(xù)執(zhí)行主調(diào)函數(shù)中的后繼語句。調(diào)用函數(shù)的過程是:86形式參數(shù)和實(shí)際參數(shù)在調(diào)用函數(shù)時(shí),大多數(shù)情況下,主調(diào)函數(shù)和被調(diào)用函數(shù)之間有數(shù)據(jù)傳遞關(guān)系。這就是前面提到的有參函數(shù)。前面已提到:在定義函數(shù)時(shí)函數(shù)名后面括弧中的變量名稱為“形式參數(shù)”(簡(jiǎn)稱“形參”),在主調(diào)函數(shù)中調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括弧中的參數(shù)(可以是一個(gè)表達(dá)式)稱為“實(shí)際參數(shù)”(簡(jiǎn)稱“實(shí)參”)。形式參數(shù)和實(shí)際參數(shù)在調(diào)用函數(shù)時(shí),大多數(shù)情87參數(shù)傳遞主調(diào)函數(shù)向被調(diào)函數(shù)傳值的方式:賦值調(diào)用

把實(shí)參的值賦給形參。賦地址調(diào)用

把實(shí)參的地址付給形參。在被調(diào)函數(shù)中,用該地址訪問主調(diào)函數(shù)中的實(shí)參。實(shí)參形參調(diào)用返回單向值傳遞參數(shù)傳遞主調(diào)函數(shù)向被調(diào)函數(shù)傳值的方式:賦值調(diào)用實(shí)參形參調(diào)用返88C語言中,函數(shù)調(diào)用是值傳遞方式,即函數(shù)的實(shí)際參數(shù)和形式參數(shù)之間的數(shù)據(jù)傳遞方向是單向的,只能由實(shí)際參數(shù)傳遞給形式參數(shù),而不能由形式參數(shù)傳遞給實(shí)際參數(shù),是實(shí)際參數(shù)向形式參數(shù)單向賦值的關(guān)系。在內(nèi)存中,形式參數(shù)與實(shí)際參數(shù)占用不同的內(nèi)存單元。當(dāng)調(diào)用函數(shù)時(shí),給形式參數(shù)分配內(nèi)存單元,將實(shí)際參數(shù)的值賦值給形式參數(shù),調(diào)用后,形式參數(shù)單元釋放,實(shí)際參數(shù)仍保留調(diào)用前的值,形式參數(shù)值的變化不影響實(shí)際參數(shù)。函數(shù)參數(shù)及其傳遞方式C語言中,函數(shù)調(diào)用是值傳遞方式,即函數(shù)的實(shí)際參數(shù)和形式參數(shù)之89調(diào)用結(jié)束:35a:b:例5.6交換兩個(gè)數(shù)#include<stdio.h>main(){inta=3,b=5;printf(“a=%d,\tb=%d\n",a,b);printf("swapped:\n");

swap(a,b);printf(“a=%d,\tb=%d\n",a,b);}swap(intx,inty){inttemp;temp=x;x=y;y=temp;}35a:b:調(diào)用前:調(diào)用35x:y:35a:b:swap:temp35a:b:x:35y:353temp=xx=yy=temp調(diào)用結(jié)束:35a:b:例5.6交換兩個(gè)數(shù)35a:b:90程序舉例分析一下程序,寫出運(yùn)行結(jié)果。#include<stdio.h>main(){inta=5,b=10;printf("a=%d,b=%d\n",a,b);fun(a,b); /*函數(shù)調(diào)用*/printf("a=%d,b=%d\n",a,b);}intfun(intx,inty)/*現(xiàn)代風(fēng)格函數(shù)定義*/{x=3;y=3;return;}a=5,b=10a=5,b=10程序舉例分析一下程序,寫出運(yùn)行結(jié)果。#include<s91

main(){inta,b,c;scanf("%d,%d",&a,&b);c=max(a,b);printf(“Maxis%d",c);}max(intx,inty)/*定義有參函數(shù)max*/{intz;z=x>y?x∶y;return(z);}運(yùn)行情況如下:7,8Maxis8形參實(shí)參c=max(a,b);(main函數(shù))(max函數(shù))max(intx,inty){intz;z=x>y?x:y;return(z);}程序舉例形參實(shí)參c=max(a,b);(main函數(shù))(max函92說明:實(shí)參必須有確定的值形參必須指定類型形參與實(shí)參類型一致,個(gè)數(shù)相同若形參與實(shí)參類型不一致,自動(dòng)按形參類型轉(zhuǎn)換———函數(shù)調(diào)用轉(zhuǎn)換形參在函數(shù)被調(diào)用前不占內(nèi)存;函數(shù)調(diào)用時(shí)為形參分配內(nèi)存;調(diào)用結(jié)束,內(nèi)存釋放說明:93例計(jì)算x的立方#include<stdio.h>floatcube(floatx){return(x*x*x);}main(){floata,product;printf("Pleaseinputvalueofa:");scanf("%f",&a);product=cube(a);printf(”Cubeof%.4fis%.4f\n",a,product);}xaproduct××××1.21.21.728程序舉例例計(jì)算x的立方#include<stdio.h>xap94在一個(gè)函數(shù)中調(diào)用另一函數(shù)(即被調(diào)用函數(shù))需要具備哪些條件呢?(1)首先被調(diào)用的函數(shù)必須是已經(jīng)存在的函數(shù)(是庫函數(shù)或用戶自己定義的函數(shù))。(2)如果使用庫函數(shù),一般還應(yīng)該在本文件開頭用#include命令將調(diào)用有關(guān)庫函數(shù)時(shí)所需用到的信息“包含”到本文件中來。例如,#include<stdio.h>其中“stdio.h”是一個(gè)“頭文件”。在stdio.h文件中放了輸入輸出庫函數(shù)所用到的一些宏定義信息。如果不包含“stdio.h”文件中的信息,就無法使用輸入輸出庫中的函數(shù)。在一個(gè)函數(shù)中調(diào)用另一函數(shù)(即被調(diào)用函數(shù))95(3)如果使用用戶自己定義的函數(shù),而且該函數(shù)與調(diào)用它的函數(shù)(即主調(diào)函數(shù))在同

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論