[計(jì)算機(jī)軟件及應(yīng)用]C語(yǔ)言程序設(shè)計(jì)第5章ppt課件_第1頁(yè)
[計(jì)算機(jī)軟件及應(yīng)用]C語(yǔ)言程序設(shè)計(jì)第5章ppt課件_第2頁(yè)
[計(jì)算機(jī)軟件及應(yīng)用]C語(yǔ)言程序設(shè)計(jì)第5章ppt課件_第3頁(yè)
[計(jì)算機(jī)軟件及應(yīng)用]C語(yǔ)言程序設(shè)計(jì)第5章ppt課件_第4頁(yè)
[計(jì)算機(jī)軟件及應(yīng)用]C語(yǔ)言程序設(shè)計(jì)第5章ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩71頁(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)介

1、第五章第五章 模塊化程序設(shè)計(jì)函數(shù)模塊化程序設(shè)計(jì)函數(shù)集美大學(xué)計(jì)算機(jī)根底教研室2l教學(xué)目的與要求掌握函數(shù)的定義和調(diào)用掌握函數(shù)參數(shù)的傳遞方式領(lǐng)會(huì)變量存儲(chǔ)類型的概念及各種存儲(chǔ)型變量的生存期和有效范圍領(lǐng)會(huì)函數(shù)的嵌套調(diào)用與遞歸調(diào)用理解帶參數(shù)的main函數(shù)l重點(diǎn)與難點(diǎn)函數(shù)定義、調(diào)用、聲明等根本概念函數(shù)的嵌套調(diào)用與遞歸調(diào)用數(shù)組作為函數(shù)的參數(shù)變量的存儲(chǔ)類別與作用域有參宏與無(wú)參宏的定義與應(yīng)用文件包含的根本概念23一、模塊化設(shè)計(jì)與函數(shù)一、模塊化設(shè)計(jì)與函數(shù)l把大型軟件按照規(guī)定的原那么劃分成一個(gè)個(gè)較小的、相對(duì)獨(dú)立但又互相關(guān)聯(lián)的模塊,叫做模塊化設(shè)計(jì)。l1965年,G.A.Miller在他的著名文章“奇妙的數(shù)字72人類信息

2、處理才能的限度中指出,普通人分辨或記憶同一類信息的不同品種或等級(jí)的數(shù)量一般不超過(guò)59項(xiàng)。這說(shuō)明,要使人的智力能足以管理好程序,應(yīng)該堅(jiān)持模塊化設(shè)計(jì)。正如不分段的長(zhǎng)篇文章可能使讀者感到頭痛一樣,大型的單模塊軟件不僅可讀性差,可靠性也常常難以保證。lC語(yǔ)言中,模塊化設(shè)計(jì)的重要工具是“自定義函數(shù)。34一、模塊化設(shè)計(jì)與函數(shù)一、模塊化設(shè)計(jì)與函數(shù)【例一】輸出任一兩數(shù)中較大者#include #include /*根本輸入輸出函數(shù)clrscr getch等*/main /*主調(diào)函數(shù)*/ int a,b,c; int maxint,int; /*函數(shù)原型*/ clrscr ; printfInput a,b=;

3、 scanf%d,%d,&a,&b; c=maxa,b; printfmax=%dn,c;int maxint x,int y /*被調(diào)函數(shù)*/ int z; if xy z=x; else z=y; return z;45一、模塊化設(shè)計(jì)與函數(shù)一、模塊化設(shè)計(jì)與函數(shù)本章的學(xué)習(xí)首先要討論什么是函數(shù)?為什么要使用函數(shù)?函數(shù)有哪些類型?如何自己定義一個(gè)函數(shù)?如何調(diào)用一個(gè)函數(shù)?函數(shù)學(xué)習(xí)的難點(diǎn)是什么?56一、模塊化設(shè)計(jì)與函數(shù)一、模塊化設(shè)計(jì)與函數(shù)什么是函數(shù)?為什么要使用函數(shù)?函數(shù)有哪些類型?如何自己定義一個(gè)函數(shù)?如何調(diào)用一個(gè)函數(shù)?函數(shù)學(xué)習(xí)的難點(diǎn)是什么? 什么是函數(shù)?一個(gè)獨(dú)立的程序模塊,可以定

4、義自己的變量?jī)H在本函數(shù)內(nèi)有效,擁有自己的存儲(chǔ)空間??梢员黄渌瘮?shù)或自身調(diào)用主函數(shù)除外。 67一、模塊化設(shè)計(jì)與函數(shù)一、模塊化設(shè)計(jì)與函數(shù)什么是函數(shù)?為什么要使用函數(shù)?函數(shù)有哪些類型?如何自己定義一個(gè)函數(shù)?如何調(diào)用一個(gè)函數(shù)?函數(shù)學(xué)習(xí)的難點(diǎn)是什么? 為什么要使用函數(shù)?u 便于實(shí)現(xiàn)模塊化設(shè)計(jì)u 便于團(tuán)隊(duì)開(kāi)發(fā)u 便于使用現(xiàn)有的或別人的程序模塊進(jìn)步編程效能在C程序設(shè)計(jì)中,通常: 將一個(gè)大程序分成幾個(gè)子程序模塊自定義函數(shù) 將常用功能做成標(biāo)準(zhǔn)模塊標(biāo)準(zhǔn)函數(shù)放在函數(shù)庫(kù)中供其他程序調(diào)用 假如把編程比做制造一臺(tái)機(jī)器,函數(shù)就好比其零部件。l可將這些“零部件單獨(dú)設(shè)計(jì)、調(diào)試、測(cè)試好,用時(shí)拿出來(lái)裝配,再總體調(diào)試。l這些“零部件

5、可以是自己設(shè)計(jì)制造/別人設(shè)計(jì)制造/如今的標(biāo)準(zhǔn)產(chǎn)品78一、模塊化設(shè)計(jì)與函數(shù)一、模塊化設(shè)計(jì)與函數(shù)【例二】編寫一個(gè)兒童算術(shù)才能測(cè)試軟件main char ans = y; clrscr ; cover ; /*調(diào)用軟件封面顯示函數(shù)*/ password ; /*調(diào)用密碼檢查函數(shù)*/ while ans =y| ans =Y question ; /*調(diào)用產(chǎn)生題目函數(shù)*/ answers ; /*調(diào)用承受答復(fù)函數(shù)*/ marks ; /*調(diào)用評(píng)分函數(shù)*/ results ; /*調(diào)用結(jié)果顯示函數(shù)*/ printf“是否繼續(xù)練習(xí)?Y/Nn; ans=getch ; printf“謝謝使用,再見(jiàn)!; 自定

6、義函數(shù)89一、模塊化設(shè)計(jì)與函數(shù)一、模塊化設(shè)計(jì)與函數(shù)【例二】編寫一個(gè)兒童算術(shù)才能測(cè)試軟件main char ans = y; clrscr ; cover ; /*調(diào)用軟件封面顯示函數(shù)*/ password ; /*調(diào)用密碼檢查函數(shù)*/ while ans =y| ans =Y question ; /*調(diào)用產(chǎn)生題目函數(shù)*/ answers ; /*調(diào)用承受答復(fù)函數(shù)*/ marks ; /*調(diào)用評(píng)分函數(shù)*/ results ; /*調(diào)用結(jié)果顯示函數(shù)*/ printf是否繼續(xù)練習(xí)?Y/Nn; ans=getch ; printf謝謝使用,再見(jiàn)!;/*定義所用函數(shù)*/cover /*軟件封面顯示函數(shù)

7、*/password /*密碼檢查函數(shù)*/question /*產(chǎn)生題目函數(shù)*/answers /*承受答復(fù)函數(shù)*/marks /*評(píng)分函數(shù)*/results /*結(jié)果顯示函數(shù)*/ n 這些函數(shù)如今不編程或還不會(huì)編程,可先放空。n 可以多人合作,每人完成假設(shè)干個(gè)函數(shù)模塊化。n 可在另一個(gè)源程序文件中定義。Lets try910一、模塊化設(shè)計(jì)與函數(shù)一、模塊化設(shè)計(jì)與函數(shù)什么是函數(shù)?為什么要使用函數(shù)?函數(shù)有哪些類型?如何自己定義一個(gè)函數(shù)?如何調(diào)用一個(gè)函數(shù)?函數(shù)學(xué)習(xí)的難點(diǎn)是什么? 函數(shù)有哪些類型?根據(jù)函數(shù)的來(lái)源,可分為:u庫(kù)函數(shù)標(biāo)準(zhǔn)函數(shù) 由系統(tǒng)提供,編程時(shí)可直接使用之u自定義函數(shù) 由編程者自己編寫,使

8、用時(shí)要“先定義后使用根據(jù)使用的方式,可分為:u無(wú)參函數(shù) u有參函數(shù)函數(shù)內(nèi)需要使用主調(diào)函數(shù)中的數(shù)據(jù)1011一、模塊化設(shè)計(jì)與函數(shù)一、模塊化設(shè)計(jì)與函數(shù)什么是函數(shù)?為什么要使用函數(shù)?函數(shù)有哪些類型?如何自己定義一個(gè)函數(shù)?如何調(diào)用一個(gè)函數(shù)?函數(shù)學(xué)習(xí)的難點(diǎn)是什么?u 如何自己定義一個(gè)函數(shù)? 見(jiàn)后u 如何調(diào)用一個(gè)函數(shù)? 見(jiàn)后u 函數(shù)部分學(xué)習(xí)的難點(diǎn)是什么? 函數(shù)的概念 形參/實(shí)參/返回值的概念 遞歸算法 變量的作用域和生存期 1112一、模塊化設(shè)計(jì)與函數(shù)一、模塊化設(shè)計(jì)與函數(shù)函數(shù)使用常識(shí): 一個(gè)源文件由一個(gè)或多個(gè)函數(shù)組成,可為多個(gè)C程序公用。lC語(yǔ)言是以源文件為單位而不以函數(shù)為單位進(jìn)展編譯的。l一個(gè)C程序由一個(gè)

9、或多個(gè)源程序文件組成可分別編寫、編譯和調(diào)試。lC程序執(zhí)行總是從main函數(shù)開(kāi)場(chǎng),一般情況下調(diào)用其它函數(shù)后總是回到main函數(shù),最后在 main函數(shù)中完畢整個(gè)程序的運(yùn)行。l所有函數(shù)都是平行的、互相獨(dú)立的,即在一個(gè)函數(shù)內(nèi)只能調(diào)用其他函數(shù),不能再定義一個(gè)函數(shù)嵌套定義。l一個(gè)函數(shù)可以調(diào)用其他函數(shù)或其本身,但任何函數(shù)均不可調(diào)用main函數(shù)。 1213二、函數(shù)的定義二、函數(shù)的定義函數(shù)定義“制造自己的函數(shù)。 P1041、函數(shù)定義的一般形式 參見(jiàn)例二 函數(shù)返回值的數(shù)據(jù)類型 函數(shù)名類型名 變量名1,類型名 變量名2, 聲明部分 處理語(yǔ)句 【注意】無(wú)形參表的即無(wú)參函數(shù)。無(wú)函數(shù)體的為“空函數(shù)。假如函數(shù)返回值的數(shù)據(jù)類

10、型為int,可以省略之。 類型標(biāo)識(shí)符形參表1314二、函數(shù)的定義二、函數(shù)的定義把程序控制權(quán)從函數(shù)返回函數(shù)調(diào)用點(diǎn)有三種方法:l執(zhí)行到函數(shù)完畢的右花括號(hào)時(shí)假如函數(shù)沒(méi)有返回值;l執(zhí)行到如下語(yǔ)句假如函數(shù)沒(méi)有返回值: return;l把返回值返回調(diào)用處見(jiàn)例一 return 表達(dá)式; 形式: return x; return x+y; return xy?x:y; 語(yǔ)句中圓括號(hào)亦可省略。1415二、函數(shù)的定義二、函數(shù)的定義【注意】 假如函數(shù)值類型與return語(yǔ)句表達(dá)式值的類型不一致,以函數(shù)類型為準(zhǔn)數(shù)值型會(huì)自動(dòng)進(jìn)展類型轉(zhuǎn)換。 假如明確表示不需返回值,應(yīng)使用void作函數(shù)返回值的數(shù)據(jù)類型,否那么即使沒(méi)有re

11、turn語(yǔ)句,仍將帶回一個(gè)不確定的值見(jiàn)P107說(shuō)明。 1516三、函數(shù)的調(diào)用三、函數(shù)的調(diào)用1、庫(kù)函數(shù)的調(diào)用 必須在源程序中用include命令將定義該庫(kù)函數(shù)的頭文件“包含進(jìn)來(lái)。調(diào)用方式: 獨(dú)立語(yǔ)句 執(zhí)行某項(xiàng)操作,如clrscr , printf“Input a,b=等表達(dá)式中 作運(yùn)算對(duì)象,如 a=sqrtx+powr,3,c=expa 等1617三、函數(shù)的調(diào)用三、函數(shù)的調(diào)用2、自定義函數(shù) 自定義函數(shù)和變量一樣,在其主調(diào)函數(shù)中也必須“先聲明,后使用。 如例一中的 int maxint,int; /*函數(shù)原型*/ 例一中的自定義函數(shù)聲明也可以用以下兩種形式: int maxint x,int y;

12、 多余,因?yàn)榫幾g系統(tǒng)并不檢查參數(shù)名 或 int max ;編譯系統(tǒng)將不檢查參數(shù)類型和參數(shù)個(gè)數(shù) 以下情況時(shí),被調(diào)函數(shù)在主調(diào)函數(shù)中可以不先聲明: l被調(diào)函數(shù)的返回值為整型時(shí)函數(shù)值是整型int或字符型char時(shí)系統(tǒng)自動(dòng)按整型說(shuō)明;l被調(diào)函數(shù)的定義出如今主調(diào)函數(shù)之前時(shí)l在所有函數(shù)定義之前,在函數(shù)的外部已做了函數(shù)聲明時(shí) 調(diào)用方式同庫(kù)函數(shù)。1718三、函數(shù)的調(diào)用三、函數(shù)的調(diào)用3、調(diào)用外部函數(shù)其他源文件中定義的函數(shù)時(shí) 函數(shù)說(shuō)明語(yǔ)句 extern 函數(shù)名; 【例二】 文件file1.c中main int x=80,y=90,c; extern max; /*函數(shù)說(shuō)明*/ c=maxx,y+20; /*調(diào)用ma

13、x函數(shù)*/ printf“Max is %dn,c; 文件files2.c中與file1.c同目錄extern maxint a,int b /*extern可省*/ float c; c=ab?a:b; return c; 注:要做一個(gè) .prj文件才能運(yùn)行。1819三、函數(shù)的調(diào)用三、函數(shù)的調(diào)用main f1=fx1; f2=fx2; x=rootx1,x2; 例 嵌套調(diào)用關(guān)系簡(jiǎn)化 float ffloat x float xpointfloat x1,float x2 y= 調(diào)用fx1、fx2float rootfloat x1,float x2; y1=fx1 x=xpointx1,x2

14、 y=fx4、函數(shù)的嵌套調(diào)用 1920三、函數(shù)的調(diào)用三、函數(shù)的調(diào)用4、函數(shù)的嵌套調(diào)用 例8.6嵌套調(diào)用關(guān)系示意圖2021例 模塊劃劃分情況main n根據(jù)輸入的x1,x2判斷是否有根n假設(shè)有,調(diào)用求根函數(shù)root n輸出結(jié)果fx根據(jù)所給x值,求y=x3-5x2+16x-80返回y值,即與x對(duì)應(yīng)的fx值xpoint 根據(jù)所給x1,x2值計(jì)算弦與x軸的交點(diǎn)rootx1,x2 根據(jù)所給x1,x2值求近似根2122四、函數(shù)的遞歸調(diào)用四、函數(shù)的遞歸調(diào)用1、遞歸的概念 l直接遞歸調(diào)用直接遞歸調(diào)用 調(diào)用函數(shù)的過(guò)程中又調(diào)用該函數(shù)本身l間接遞歸調(diào)用間接遞歸調(diào)用 調(diào)用f1函數(shù)的過(guò)程中調(diào)用f2函數(shù),而f2中又需要調(diào)

15、用f1。 以上均為無(wú)終止遞歸調(diào)用。 為此,一般要用if語(yǔ)句來(lái)控制使遞歸過(guò)程到某一條件滿足時(shí)完畢。2223四、函數(shù)的遞歸調(diào)用四、函數(shù)的遞歸調(diào)用2、遞歸算法 類似于數(shù)學(xué)證明中的反推法,從后一結(jié)果與前一結(jié)果的關(guān)系中尋找其規(guī)律性。 歸納法可以分為:n遞推法 從初值出發(fā),歸納出新值與舊值間直到最后值為止存在的關(guān)系。 要求通過(guò)分析得到: 初值+遞推公式 編程:通過(guò)循環(huán)控制構(gòu)造實(shí)現(xiàn)循環(huán)的終值是最后值n遞歸法 從結(jié)果出發(fā),歸納出后一結(jié)果與前一結(jié)果直到初值為止存在的關(guān)系。 要求通過(guò)分析得到: 初值+遞歸函數(shù) 編程:設(shè)計(jì)一個(gè)函數(shù)遞歸函數(shù),這個(gè)函數(shù)不斷使用下一級(jí)值調(diào)用自身,直到結(jié)果處選擇控制構(gòu)造。2324四、函數(shù)的

16、遞歸調(diào)用四、函數(shù)的遞歸調(diào)用2、遞歸算法其一般形式是:在主函數(shù)中用終值n調(diào)用遞歸函數(shù),而在遞歸函數(shù)中:遞歸函數(shù)名f參數(shù)x if n=初值 結(jié)果=; else 結(jié)果=含fx-1的表達(dá)式; 返回結(jié)果return;fx fx-1 main fn fx-1 fx-2 fx-2 fx-3 fx0 fx0= 2425【例一】 用遞歸法求n!分析比較: 實(shí)際上,遞歸程序分兩個(gè)階段執(zhí)行 回推調(diào)用:欲求n! 先求 n-1! n-2! 1! 假設(shè)1!,回推完畢。 遞推回代:知道1!2!可求出3! n!2526程序如下:程序如下:main int n; float s; float fac; clrscr; prin

17、tfInput n=; scanf%d,&n; s=facn; printf%d!=%.0f,n,s;float facint x int f; if x=0|x=1 f=1; else f=facx-1*x; return f; 2627【例二】有5個(gè)人,第5個(gè)人說(shuō)他比第4個(gè)人大2歲,第4個(gè)人說(shuō)他對(duì)第3個(gè)人大2歲,第3個(gè)人說(shuō)他對(duì)第2個(gè)人大2歲,第2個(gè)人說(shuō)他比第1個(gè)人大2歲,第1個(gè)人說(shuō)他10歲。求第5個(gè)人多少歲。 P158例8.7 通過(guò)分析,設(shè)計(jì)遞歸函數(shù)如下: 10 n=1 agen= agen-1+2 n12728 遞歸函數(shù): 10 (n=1) age(n)= age(n-1)+2

18、(n1)ageint n int c; if n=1 c=10; else c=agen-1+2; return c; main clrscr ; printf%d,age5;程序如下:請(qǐng)看看單步運(yùn)行的情況2829 age5 c=age4+2; return c;ageint n int c; if n=1 c=10; else c=agen-1+2; return c; 遞歸過(guò)程跟蹤分析: age4 c=age3+2; return c; age3 c=age2+2; return c; age2 c=age1+2; return c; age1 c=10 return c;c=10c=12

19、c=14c=16c=182930 1 1 1 1 1 1 1 2 1 1 2 1 1 3 3 1 1 3 3 1 1 4 6 4 1 1 4 6 4 1 1 5 10 10 5 11 5 10 10 5 1 分析: 若起始行為第1行則: 第x行有x個(gè)值 對(duì)第x行第y列(不計(jì)左側(cè)空格時(shí)) 其值可用以下遞歸函數(shù)表示: 1 (y=1 或 y=x) c(x,y)= c(x-1,y-1)+c(x-1,y)3031遞歸函數(shù) : 1 y=1 或 y=x cx,y= cx-1,y-1+cx-1,y程序如下:main int i,j,n; clrscr ; printfInput n=; scanf%d,&am

20、p;n; for i=1;i=n;i+ for j=0;j=n-i;j+ printf ; for j=1;j1程序如下:fib int n int f; if n=1|n=2 f=1; else f=fibn-1+fibn-2; return f;main int i,s=0; clrscr ; for i=1;i=12;i+ s=s+fibi; printfn=12,s=%d,s;結(jié)果:n=12,s=3763233【例五例五】運(yùn)行以下程序,當(dāng)輸入字符序列運(yùn)行以下程序,當(dāng)輸入字符序列AB$CDEAB$CDE并回車時(shí),程序的輸出結(jié)果是什么?并回車時(shí),程序的輸出結(jié)果是什么?#include re

21、v char c; c=getchar; if c=$ printf%c,c; else rev; printf%c,c; main rev;結(jié)果:$BArevc=Arev 輸出Arevc=Brev 輸出Brevc=$輸出$3334【例六例六】反向輸出一個(gè)整數(shù)非數(shù)值問(wèn)題反向輸出一個(gè)整數(shù)非數(shù)值問(wèn)題非數(shù)值問(wèn)題的分析無(wú)法象數(shù)值問(wèn)題那樣能得出一個(gè)初值和遞歸函數(shù)式,但思路是一樣的。分析方法:簡(jiǎn)化問(wèn)題:設(shè)要輸出的正整數(shù)只有一位,那么“反向輸出問(wèn)題可簡(jiǎn)化為輸出一位整數(shù)。對(duì)大于10的正整數(shù),邏輯上可分為兩部分:個(gè)位上的數(shù)字和個(gè)位以前的全部數(shù)字。將個(gè)位以前的全部數(shù)字看成一個(gè)整體,那么為了反向輸出這個(gè)大于10的正

22、整數(shù),可按以下步驟: a、輸出個(gè)位上的數(shù)字; b、將個(gè)位除外的其他數(shù)字作為一個(gè)新的整數(shù),重復(fù)a步驟的操作。其中b問(wèn)題只是對(duì)原問(wèn)題在規(guī)模上進(jìn)展了縮小遞歸。所以,可將反向輸出一個(gè)正整數(shù)x的算法歸納為: if x為一位整數(shù) 輸出x; else 輸出x的個(gè)位數(shù)字; 對(duì)剩余數(shù)字組成的新整數(shù)重復(fù)“反向輸出操作; 3435程序如下:#include void main void printnint x; int n; printfInput n=; scanf%d,&n; if n=0&x=9 printf%d,x; /*假設(shè)x為多位整數(shù)*/ else /*輸出其個(gè)位,并形成新的x*/ pr

23、intf%d,x%10; printnx/10; 3536【例七例七】漢諾塔漢諾塔Tower of HanoiTower of Hanoi問(wèn)題。問(wèn)題。 也是一個(gè)非數(shù)值問(wèn)題。也是一個(gè)非數(shù)值問(wèn)題。 P113例4.10 分析方法:簡(jiǎn)化問(wèn)題:設(shè)盤子只有一個(gè),那么本問(wèn)題可簡(jiǎn)化為ab。對(duì)于大于一個(gè)盤子的情況,邏輯上可分為兩部分:第n個(gè)盤子和除n以外的n-1個(gè)盤子。假如將除n以外的n-1個(gè)盤子看成一個(gè)整體,那么要解決本問(wèn)題,可按以下步驟: a、將a桿上n-1個(gè)盤子借助于b先移到c桿; ac n-1,a,c,b b、將a桿上第n個(gè)盤子從a移到b桿; ab c、將c桿上n-2個(gè)盤子借助a移到b桿。 cb n-2

24、,c,b,a 3637五五、數(shù)組作為函數(shù)參數(shù)、數(shù)組作為函數(shù)參數(shù)1、用數(shù)組元素作函數(shù)實(shí)參 P164此時(shí)可把數(shù)組元素看作普通變量單向的值傳送。p 特點(diǎn): 主調(diào)函數(shù)中的實(shí)參數(shù)組元素 帶下標(biāo) 被調(diào)函數(shù)中的形參普通變量p 調(diào)用結(jié)果:形參值的變化對(duì)實(shí)參值無(wú)影響 二者分占不同內(nèi)存。3738【例一例一】以下程序的功能是什么?以下程序的功能是什么? #include main int i; float sum=0,x10; float meanfloat,int; clrscr; fori=0;i0 printf%f的平方根是:%fn,a,sqrta; return sqrta; else printfx%d=

25、%fn,i,a; return 0.0; 在主函數(shù)中輸入10個(gè)數(shù)值,并調(diào)用功能函數(shù)求其正數(shù)的算術(shù)平方根之和。3839什么是單向什么是單向“值傳送方式?值傳送方式?3940五五、數(shù)組作為函數(shù)參數(shù)、數(shù)組作為函數(shù)參數(shù)2、用數(shù)組名作函數(shù)實(shí)參 P165 假設(shè) int a6; 那么數(shù)組名a表示數(shù)組的起始地址。 所以用數(shù)組名,實(shí)際上是把實(shí)參數(shù)組的起始地址“傳給形參數(shù)組。p本質(zhì):對(duì)應(yīng)的數(shù)組元素不是形參與實(shí)參共享同一段內(nèi)存單元所謂“雙向的地址傳送。p特點(diǎn): 主調(diào)函數(shù)中的實(shí)參數(shù)組名不帶下標(biāo) 被調(diào)函數(shù)中的形參數(shù)組名或數(shù)組定義式p調(diào)用結(jié)果:兩數(shù)組同下標(biāo)者為同值。4041【例二例二】以下程序的運(yùn)行結(jié)果是什么?以下程序的

26、運(yùn)行結(jié)果是什么?fint b ,int n int i,t; t=0; for i=1;i=n;i+ t=t+bi; return t;main int x,a =1,2,3,4,6; x=fa,a3; printf%dn,x; 注意1、形參數(shù)組和實(shí)參數(shù)組應(yīng)分別在各自函數(shù)中定義;2、形參數(shù)組可不定義大小用空方格;3、二者大小可一致或不一致C編譯程序不檢查形參, 但注意引用形參時(shí)不要超過(guò)實(shí)參界。結(jié)果:154142什么是雙向的什么是雙向的“地址傳送方式?地址傳送方式?fint b ,int n int i,t; t=0; for i=1;i=n;i+ t=t+bi; return t;main i

27、nt x,a =1,2,3,4,6; x=fa,a3; printf%dn,x; 本質(zhì)是共享同一段內(nèi)存單元4243【例三例三】分析以下程序的運(yùn)行結(jié)果。分析以下程序的運(yùn)行結(jié)果。main int a5= 5,10,-7,3,7 ,i; sorta,5; for i=0;i5;i+ printf%d ,ai;sortint x ,int n int j,t; for j=0;jxj+1 t=xj;xj=xj+1; xj+1=t; 結(jié)果:5 7 3 7 10【討論】如何通過(guò)數(shù)組技術(shù)將一列數(shù)據(jù)中最大或最小的數(shù)移前或移后?4344六六、變量的存儲(chǔ)類型、變量的存儲(chǔ)類型l模塊化設(shè)計(jì)要求研究不同模塊函數(shù)、源文件

28、間變量的關(guān)系。l變量?jī)纱髮傩裕?數(shù)據(jù)類型 存儲(chǔ)類別1、數(shù)據(jù)類型復(fù)習(xí) 通過(guò)變量說(shuō)明定義來(lái)規(guī)定其數(shù)據(jù)類型: 格式 數(shù)據(jù)類型關(guān)鍵字 變量名 如 char a; int b,c ; float x,y; 為什么使用變量前要先對(duì)其數(shù)據(jù)類型進(jìn)展“說(shuō)明好比看電影前先買票訂座 預(yù)留存儲(chǔ)空間如char型為1個(gè)字節(jié),int型為2個(gè)字節(jié) 確定存儲(chǔ)方式如char型存放ASCII值,int型存放補(bǔ)碼值4445復(fù)習(xí) 數(shù)據(jù)存儲(chǔ)形式 字符型按ASCII碼存儲(chǔ),其余以補(bǔ)碼存儲(chǔ) 示意圖 字符型 (字符a) 用一個(gè)字節(jié)存放該字符的ASCII值(ASCII值表見(jiàn)P374) 整 型 (十進(jìn)制數(shù)25037) 用兩個(gè)字節(jié)存放該數(shù)值的補(bǔ)碼

29、實(shí) 型 尾數(shù)(補(bǔ)碼) 指數(shù)(階碼) 注:第一位均為符號(hào)位0110000101100001 110011010110000110100010101010 11100110一個(gè)變量的數(shù)據(jù)類型定義后,就規(guī)定了該變量只能存儲(chǔ)相應(yīng)類型的數(shù)據(jù)。如定義int x,那么x只能存放整型數(shù),假如x=3.14159,會(huì)被自動(dòng)轉(zhuǎn)為整型存放。4546六六、變量的存儲(chǔ)類型、變量的存儲(chǔ)類型l變量?jī)纱髮傩裕?數(shù)據(jù)類型 存儲(chǔ)類別2、存儲(chǔ)類別 P115 規(guī)定了變量在計(jì)算機(jī)內(nèi)部的存放位置決定變量的“壽命何時(shí)“生,何時(shí)“滅 一個(gè)完好的變量說(shuō)明格式如下: 存儲(chǔ)類別 數(shù)據(jù)類型 變量名 如 static int x , y ;C程序的存儲(chǔ)

30、類別有: register型存放器型 auto型自動(dòng)變量型 static型靜態(tài)變量型 extern型外部變量型4647C C程序的變量存儲(chǔ)位置程序的變量存儲(chǔ)位置變量的生存期 靜態(tài)存儲(chǔ)區(qū)中的變量:與程序“共存亡 動(dòng)態(tài)存儲(chǔ)區(qū)中的變量:與函數(shù)“共存亡 存放器中的變量:同動(dòng)態(tài)存儲(chǔ)區(qū)4748C C程序的變量存儲(chǔ)類別程序的變量存儲(chǔ)類別變量的生存期 靜態(tài)存儲(chǔ)區(qū)中的變量 與程序“共存亡 動(dòng)態(tài)存儲(chǔ)區(qū)中的變量 與函數(shù)“共存亡 存放器中的變量 同動(dòng)態(tài)存儲(chǔ)區(qū) register型存放器型型存放器型變量值存放在運(yùn)算器的存放器中存取速度快,一般只允許23個(gè),且限于char型和int型,通常用于循環(huán)變量在微機(jī)的Turbo C

31、中實(shí)際上自動(dòng)轉(zhuǎn)為auto型。 auto型自動(dòng)變量型型自動(dòng)變量型變量值存放在主存儲(chǔ)器的動(dòng)態(tài)存儲(chǔ)區(qū)堆棧方式;優(yōu)點(diǎn)同一內(nèi)存區(qū)可被不同變量反復(fù)使用。以上兩種變量均屬于“動(dòng)態(tài)存儲(chǔ)型,即調(diào)用函數(shù)時(shí)才為這些變量分配單元,函數(shù)調(diào)用完畢其值自動(dòng)消失。4849C C程序的變量存儲(chǔ)類別程序的變量存儲(chǔ)類別變量的生存期 靜態(tài)存儲(chǔ)區(qū)中的變量 與程序“共存亡 動(dòng)態(tài)存儲(chǔ)區(qū)中的變量 與函數(shù)“共存亡 存放器中的變量 同動(dòng)態(tài)存儲(chǔ)區(qū) static型靜態(tài)變量型型靜態(tài)變量型變量值存放在主存儲(chǔ)器的靜態(tài)存儲(chǔ)區(qū)程序執(zhí)行開(kāi)場(chǎng)至完畢,始終占用該存儲(chǔ)空間 extern型外部變量型型外部變量型同上,其值可供其他源文件使用以上兩種均屬于“靜態(tài)存儲(chǔ)性質(zhì),

32、即從變量定義處開(kāi)場(chǎng),在整個(gè)程序執(zhí)行期間其值都存在都可用!未說(shuō)明存儲(chǔ)類別時(shí),函數(shù)內(nèi)定義的變量默認(rèn)為auto型函數(shù)外定義的變量默認(rèn)為extern型。4950七、部分變量與全局變量七、部分變量與全局變量 P121 1、部分變量函數(shù)內(nèi)部或復(fù)合語(yǔ)句內(nèi)定義的變量 auto默認(rèn) 所在函數(shù)調(diào)用完畢時(shí),其值自動(dòng)消失部分變量 register 如不賦初值,取不確定值為初值 static 所有函數(shù)調(diào)用完畢,其值仍保存 如不賦初值,取初值為0數(shù)值型或空格字符型 所有形參都是部分變量; 部分變量只在本函數(shù)或本復(fù)合語(yǔ)句內(nèi)才能使用,在此之外不能使用視為不存在main函數(shù)也不例外。5051main int a=2,i; cl

33、rscr ; for i=0;i3;i+ printf%4d,fa;fint a int b=0; static int c=3; b+;c+; return a+b+c; 【例一】求程序運(yùn)行結(jié)果變量跟蹤 mainmain f f函數(shù)函數(shù) a i a i b b f fa a 2 0 01 4 7 1 01 5 8 2 01 6 9 【結(jié)果】 7 8 9 假如去掉static呢?【結(jié)果】 7 7 75152main int k=4,m=1,p; clrscr; p=funck,m; printf%d,p; p=funck,m; printf%d,p;funcint a,int b static

34、 int m=0,i=2; i+=m+1; m=i+a+b; return m; 【例二】求程序運(yùn)行結(jié)果變量跟蹤 mainmain func func函數(shù)函數(shù) k m a b m i 4 1 4 1 08 23 4 1 4 1 817 312 【結(jié)果】 8, 17 假如去掉static呢?【結(jié)果】 8, 85253#include main int a=3, b=2, c=1; int b=5, c=12; c-=b*2; printfa=%d,b=%d,c=%dn, a, b, c; a+=c; printfa=%d,b=%d,c=%dn, a, b, c;【例二】求程序運(yùn)行結(jié)果【結(jié)果】 a

35、=3,b=5,c=2 a=5,b=2,c=1 5354七、部分變量與全局變量七、部分變量與全局變量 P121 2、全局變量在函數(shù)之外定義的變量 extern默認(rèn)允許根源文件中其他函數(shù)及其他源文件使用 全局變量 static 只限根源文件中使用 所有全局變量加不加static,都屬于靜態(tài)存儲(chǔ),如不賦初值,取初值為0數(shù)值型或空格字符型注意與函數(shù)內(nèi)部定義的static型部分變量的區(qū)別 54552 2、全局變量、全局變量在函數(shù)之外定義的變量在函數(shù)之外定義的變量l有效作用范圍:從定義變量位置開(kāi)場(chǎng)直到根源文件完畢l假如需要將全局變量的作用范圍擴(kuò)展至整個(gè)源文件 法1 全部在源文件開(kāi)頭處定義 法2 在引用函數(shù)

36、內(nèi),用extern說(shuō)明 法3 在源文件開(kāi)頭處,用extern說(shuō)明【例三】求程序運(yùn)行結(jié)果extern int x,y; main clrscr; printfx=%d,y=%dn,x,y;int x=100,y=200;結(jié)果:x=100,y=200去掉第一行試試假如要將全局變量作用范圍擴(kuò)展到其他源文件,只需在使用這些變量的文件中對(duì)變量用extern加以說(shuō)明。5556int a=3,b=5;maxint a,int b int c; c=ab?a:b; return c; main int a=8; printf%dn,maxa,b; 【例四】求程序運(yùn)行結(jié)果假如主函數(shù)中沒(méi)有int a=8,結(jié)果?

37、【結(jié)果】 5假如讓主函數(shù)中int a=4或a=-1,結(jié)果? 【結(jié)果】 均為 55657void num extern int x,y; int a=15,b=10; x=a-b; y=a+b;int x,y;main int a=7,b=5; x=a+b; y=a-b; num; printf%d,%dn,x,y;【例五】求程序運(yùn)行結(jié)果假如第二行不加上extern呢? 【結(jié)果】 5,25【結(jié)果】 12,2 5758int a;funint i a+=2*i; return a; main int a=10; clrscr ; printf%d,%dn,funa,a; 【例六】求程序運(yùn)行結(jié)果【結(jié)

38、果】 20,10 5859七、編譯預(yù)處理七、編譯預(yù)處理l編譯預(yù)處理: P127 宏定義 文件包含 條件編譯 【編譯】C編譯系統(tǒng)對(duì)源程序進(jìn)展:詞法和語(yǔ)法分析,代碼生成,優(yōu)化 .OBJ文件【編譯預(yù)處理】編譯前對(duì)源程序進(jìn)展一些預(yù)加工改善程序設(shè)計(jì)環(huán)境/模塊化設(shè)計(jì)l編譯預(yù)處理命令均以#開(kāi)頭,未尾不加分號(hào)l可出如今程序的任何位置,其作用范圍:出現(xiàn)點(diǎn)至所在源程序未尾。5960八、編譯預(yù)處理八、編譯預(yù)處理1、宏定義 格式 #define 宏名 宏體 宏名和宏體均為字符串,前者必須符合標(biāo)識(shí)符命名規(guī)那么。預(yù)處理時(shí)在程序中用宏體交換宏名。注意:可以用 #undef 宏名 終止該宏名的作用范圍。 6061八、編譯預(yù)處

39、理八、編譯預(yù)處理定義符號(hào)常量【例一】#define M 3#define N M+1#define NN N*N/2main clrscr; printfNN=%d,NN; printf5*NN=%dn,5*NN;結(jié)果:NN=8,5*NN=40【討論】 假如第二行改為: #define N M+1 結(jié)果: NN=6,5*NN=18 6162八、編譯預(yù)處理八、編譯預(yù)處理帶參數(shù)的宏定義 格式 #define 宏名參數(shù)表 宏體【例二】#define PI 3.14159#define sr PI*r*rmain float a=1,sum; sum=sa; printfr=%.0f,s=%fn,a,

40、sum;結(jié)果:r=1,s=3.141590 6263八、編譯預(yù)處理八、編譯預(yù)處理帶參數(shù)的宏定義 【例三】#define PT 5.5#define sA PT*A*Amain int a=1,b=2; printf%4.1fn,sa+b; 結(jié)果:9.5 【討論】注意sa+b不是函數(shù),它不做任何計(jì)算假如是函數(shù),那么sa+b為s3,結(jié)果49.5 sa+b=5.51212=9.5 6364八、編譯預(yù)處理八、編譯預(yù)處理帶參數(shù)的宏定義 【例四】選擇正確答案#include stdio.h#define SUMy 1+ymain int x=2; printf%dn,SUM5*x; A 10 B 11 C 12 D 15結(jié)果:B 64652 2、文件包含、文件包含 P134l#include 標(biāo)準(zhǔn)方式 只按標(biāo)準(zhǔn)方式系統(tǒng)存放C庫(kù)函數(shù)頭文件所在目錄查找所要包含的文件 對(duì)TC,默認(rèn)只在tcinclude目錄下查找l#include “ “ 先在源文件所在目錄找指定頭文件,假設(shè)無(wú)再按標(biāo)準(zhǔn)方式找更保險(xiǎn)65663、條件編譯、條件編譯 l根據(jù)條件決定是否編譯某一組語(yǔ)句。常用形式: 假如標(biāo)識(shí)符被定義過(guò)* 假如標(biāo)識(shí)符未被定義過(guò) #ifdef 標(biāo)識(shí)符 #ifndef 標(biāo)識(shí)符 程序段1 程序段1 /*編譯此程序段*/ #else #e

溫馨提示

  • 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)論