版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第五章第五章 模塊化程序設(shè)計函數(shù)模塊化程序設(shè)計函數(shù)集美大學計算機根底教研室2l教學目的與要求掌握函數(shù)的定義和調(diào)用掌握函數(shù)參數(shù)的傳遞方式領(lǐng)會變量存儲類型的概念及各種存儲型變量的生存期和有效范圍領(lǐng)會函數(shù)的嵌套調(diào)用與遞歸調(diào)用理解帶參數(shù)的main函數(shù)l重點與難點函數(shù)定義、調(diào)用、聲明等根本概念函數(shù)的嵌套調(diào)用與遞歸調(diào)用數(shù)組作為函數(shù)的參數(shù)變量的存儲類別與作用域有參宏與無參宏的定義與應用文件包含的根本概念23一、模塊化設(shè)計與函數(shù)一、模塊化設(shè)計與函數(shù)l把大型軟件按照規(guī)定的原那么劃分成一個個較小的、相對獨立但又互相關(guān)聯(lián)的模塊,叫做模塊化設(shè)計。l1965年,G.A.Miller在他的著名文章“奇妙的數(shù)字72人類信息
2、處理才能的限度中指出,普通人分辨或記憶同一類信息的不同品種或等級的數(shù)量一般不超過59項。這說明,要使人的智力能足以管理好程序,應該堅持模塊化設(shè)計。正如不分段的長篇文章可能使讀者感到頭痛一樣,大型的單模塊軟件不僅可讀性差,可靠性也常常難以保證。lC語言中,模塊化設(shè)計的重要工具是“自定義函數(shù)。34一、模塊化設(shè)計與函數(shù)一、模塊化設(shè)計與函數(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è)計與函數(shù)一、模塊化設(shè)計與函數(shù)本章的學習首先要討論什么是函數(shù)?為什么要使用函數(shù)?函數(shù)有哪些類型?如何自己定義一個函數(shù)?如何調(diào)用一個函數(shù)?函數(shù)學習的難點是什么?56一、模塊化設(shè)計與函數(shù)一、模塊化設(shè)計與函數(shù)什么是函數(shù)?為什么要使用函數(shù)?函數(shù)有哪些類型?如何自己定義一個函數(shù)?如何調(diào)用一個函數(shù)?函數(shù)學習的難點是什么? 什么是函數(shù)?一個獨立的程序模塊,可以定
4、義自己的變量僅在本函數(shù)內(nèi)有效,擁有自己的存儲空間??梢员黄渌瘮?shù)或自身調(diào)用主函數(shù)除外。 67一、模塊化設(shè)計與函數(shù)一、模塊化設(shè)計與函數(shù)什么是函數(shù)?為什么要使用函數(shù)?函數(shù)有哪些類型?如何自己定義一個函數(shù)?如何調(diào)用一個函數(shù)?函數(shù)學習的難點是什么? 為什么要使用函數(shù)?u 便于實現(xiàn)模塊化設(shè)計u 便于團隊開發(fā)u 便于使用現(xiàn)有的或別人的程序模塊進步編程效能在C程序設(shè)計中,通常: 將一個大程序分成幾個子程序模塊自定義函數(shù) 將常用功能做成標準模塊標準函數(shù)放在函數(shù)庫中供其他程序調(diào)用 假如把編程比做制造一臺機器,函數(shù)就好比其零部件。l可將這些“零部件單獨設(shè)計、調(diào)試、測試好,用時拿出來裝配,再總體調(diào)試。l這些“零部件
5、可以是自己設(shè)計制造/別人設(shè)計制造/如今的標準產(chǎn)品78一、模塊化設(shè)計與函數(shù)一、模塊化設(shè)計與函數(shù)【例二】編寫一個兒童算術(shù)才能測試軟件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)用承受答復函數(shù)*/ marks ; /*調(diào)用評分函數(shù)*/ results ; /*調(diào)用結(jié)果顯示函數(shù)*/ printf“是否繼續(xù)練習?Y/Nn; ans=getch ; printf“謝謝使用,再見!; 自定
6、義函數(shù)89一、模塊化設(shè)計與函數(shù)一、模塊化設(shè)計與函數(shù)【例二】編寫一個兒童算術(shù)才能測試軟件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)用承受答復函數(shù)*/ marks ; /*調(diào)用評分函數(shù)*/ results ; /*調(diào)用結(jié)果顯示函數(shù)*/ printf是否繼續(xù)練習?Y/Nn; ans=getch ; printf謝謝使用,再見!;/*定義所用函數(shù)*/cover /*軟件封面顯示函數(shù)
7、*/password /*密碼檢查函數(shù)*/question /*產(chǎn)生題目函數(shù)*/answers /*承受答復函數(shù)*/marks /*評分函數(shù)*/results /*結(jié)果顯示函數(shù)*/ n 這些函數(shù)如今不編程或還不會編程,可先放空。n 可以多人合作,每人完成假設(shè)干個函數(shù)模塊化。n 可在另一個源程序文件中定義。Lets try910一、模塊化設(shè)計與函數(shù)一、模塊化設(shè)計與函數(shù)什么是函數(shù)?為什么要使用函數(shù)?函數(shù)有哪些類型?如何自己定義一個函數(shù)?如何調(diào)用一個函數(shù)?函數(shù)學習的難點是什么? 函數(shù)有哪些類型?根據(jù)函數(shù)的來源,可分為:u庫函數(shù)標準函數(shù) 由系統(tǒng)提供,編程時可直接使用之u自定義函數(shù) 由編程者自己編寫,使
8、用時要“先定義后使用根據(jù)使用的方式,可分為:u無參函數(shù) u有參函數(shù)函數(shù)內(nèi)需要使用主調(diào)函數(shù)中的數(shù)據(jù)1011一、模塊化設(shè)計與函數(shù)一、模塊化設(shè)計與函數(shù)什么是函數(shù)?為什么要使用函數(shù)?函數(shù)有哪些類型?如何自己定義一個函數(shù)?如何調(diào)用一個函數(shù)?函數(shù)學習的難點是什么?u 如何自己定義一個函數(shù)? 見后u 如何調(diào)用一個函數(shù)? 見后u 函數(shù)部分學習的難點是什么? 函數(shù)的概念 形參/實參/返回值的概念 遞歸算法 變量的作用域和生存期 1112一、模塊化設(shè)計與函數(shù)一、模塊化設(shè)計與函數(shù)函數(shù)使用常識: 一個源文件由一個或多個函數(shù)組成,可為多個C程序公用。lC語言是以源文件為單位而不以函數(shù)為單位進展編譯的。l一個C程序由一個
9、或多個源程序文件組成可分別編寫、編譯和調(diào)試。lC程序執(zhí)行總是從main函數(shù)開場,一般情況下調(diào)用其它函數(shù)后總是回到main函數(shù),最后在 main函數(shù)中完畢整個程序的運行。l所有函數(shù)都是平行的、互相獨立的,即在一個函數(shù)內(nèi)只能調(diào)用其他函數(shù),不能再定義一個函數(shù)嵌套定義。l一個函數(shù)可以調(diào)用其他函數(shù)或其本身,但任何函數(shù)均不可調(diào)用main函數(shù)。 1213二、函數(shù)的定義二、函數(shù)的定義函數(shù)定義“制造自己的函數(shù)。 P1041、函數(shù)定義的一般形式 參見例二 函數(shù)返回值的數(shù)據(jù)類型 函數(shù)名類型名 變量名1,類型名 變量名2, 聲明部分 處理語句 【注意】無形參表的即無參函數(shù)。無函數(shù)體的為“空函數(shù)。假如函數(shù)返回值的數(shù)據(jù)類
10、型為int,可以省略之。 類型標識符形參表1314二、函數(shù)的定義二、函數(shù)的定義把程序控制權(quán)從函數(shù)返回函數(shù)調(diào)用點有三種方法:l執(zhí)行到函數(shù)完畢的右花括號時假如函數(shù)沒有返回值;l執(zhí)行到如下語句假如函數(shù)沒有返回值: return;l把返回值返回調(diào)用處見例一 return 表達式; 形式: return x; return x+y; return xy?x:y; 語句中圓括號亦可省略。1415二、函數(shù)的定義二、函數(shù)的定義【注意】 假如函數(shù)值類型與return語句表達式值的類型不一致,以函數(shù)類型為準數(shù)值型會自動進展類型轉(zhuǎn)換。 假如明確表示不需返回值,應使用void作函數(shù)返回值的數(shù)據(jù)類型,否那么即使沒有re
11、turn語句,仍將帶回一個不確定的值見P107說明。 1516三、函數(shù)的調(diào)用三、函數(shù)的調(diào)用1、庫函數(shù)的調(diào)用 必須在源程序中用include命令將定義該庫函數(shù)的頭文件“包含進來。調(diào)用方式: 獨立語句 執(zhí)行某項操作,如clrscr , printf“Input a,b=等表達式中 作運算對象,如 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、 多余,因為編譯系統(tǒng)并不檢查參數(shù)名 或 int max ;編譯系統(tǒng)將不檢查參數(shù)類型和參數(shù)個數(shù) 以下情況時,被調(diào)函數(shù)在主調(diào)函數(shù)中可以不先聲明: l被調(diào)函數(shù)的返回值為整型時函數(shù)值是整型int或字符型char時系統(tǒng)自動按整型說明;l被調(diào)函數(shù)的定義出如今主調(diào)函數(shù)之前時l在所有函數(shù)定義之前,在函數(shù)的外部已做了函數(shù)聲明時 調(diào)用方式同庫函數(shù)。1718三、函數(shù)的調(diào)用三、函數(shù)的調(diào)用3、調(diào)用外部函數(shù)其他源文件中定義的函數(shù)時 函數(shù)說明語句 extern 函數(shù)名; 【例二】 文件file1.c中main int x=80,y=90,c; extern max; /*函數(shù)說明*/ 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; 注:要做一個 .prj文件才能運行。1819三、函數(shù)的調(diào)用三、函數(shù)的調(diào)用main f1=fx1; f2=fx2; x=rootx1,x2; 例 嵌套調(diào)用關(guā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對應的fx值xpoint 根據(jù)所給x1,x2值計算弦與x軸的交點rootx1,x2 根據(jù)所給x1,x2值求近似根2122四、函數(shù)的遞歸調(diào)用四、函數(shù)的遞歸調(diào)用1、遞歸的概念 l直接遞歸調(diào)用直接遞歸調(diào)用 調(diào)用函數(shù)的過程中又調(diào)用該函數(shù)本身l間接遞歸調(diào)用間接遞歸調(diào)用 調(diào)用f1函數(shù)的過程中調(diào)用f2函數(shù),而f2中又需要調(diào)
15、用f1。 以上均為無終止遞歸調(diào)用。 為此,一般要用if語句來控制使遞歸過程到某一條件滿足時完畢。2223四、函數(shù)的遞歸調(diào)用四、函數(shù)的遞歸調(diào)用2、遞歸算法 類似于數(shù)學證明中的反推法,從后一結(jié)果與前一結(jié)果的關(guān)系中尋找其規(guī)律性。 歸納法可以分為:n遞推法 從初值出發(fā),歸納出新值與舊值間直到最后值為止存在的關(guān)系。 要求通過分析得到: 初值+遞推公式 編程:通過循環(huán)控制構(gòu)造實現(xiàn)循環(huán)的終值是最后值n遞歸法 從結(jié)果出發(fā),歸納出后一結(jié)果與前一結(jié)果直到初值為止存在的關(guān)系。 要求通過分析得到: 初值+遞歸函數(shù) 編程:設(shè)計一個函數(shù)遞歸函數(shù),這個函數(shù)不斷使用下一級值調(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的表達式; 返回結(jié)果return;fx fx-1 main fn fx-1 fx-2 fx-2 fx-3 fx0 fx0= 2425【例一】 用遞歸法求n!分析比較: 實際上,遞歸程序分兩個階段執(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個人,第5個人說他比第4個人大2歲,第4個人說他對第3個人大2歲,第3個人說他對第2個人大2歲,第2個人說他比第1個人大2歲,第1個人說他10歲。求第5個人多少歲。 P158例8.7 通過分析,設(shè)計遞歸函數(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;程序如下:請看看單步運行的情況2829 age5 c=age4+2; return c;ageint n int c; if n=1 c=10; else c=agen-1+2; return c; 遞歸過程跟蹤分析: 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個值 對第x行第y列(不計左側(cè)空格時) 其值可用以下遞歸函數(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【例五例五】運行以下程序,當輸入字符序列運行以下程序,當輸入字符序列AB$CDEAB$CDE并回車時,程序的輸出結(jié)果是什么?并回車時,程序的輸出結(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【例六例六】反向輸出一個整數(shù)非數(shù)值問題反向輸出一個整數(shù)非數(shù)值問題非數(shù)值問題的分析無法象數(shù)值問題那樣能得出一個初值和遞歸函數(shù)式,但思路是一樣的。分析方法:簡化問題:設(shè)要輸出的正整數(shù)只有一位,那么“反向輸出問題可簡化為輸出一位整數(shù)。對大于10的正整數(shù),邏輯上可分為兩部分:個位上的數(shù)字和個位以前的全部數(shù)字。將個位以前的全部數(shù)字看成一個整體,那么為了反向輸出這個大于10的正
22、整數(shù),可按以下步驟: a、輸出個位上的數(shù)字; b、將個位除外的其他數(shù)字作為一個新的整數(shù),重復a步驟的操作。其中b問題只是對原問題在規(guī)模上進展了縮小遞歸。所以,可將反向輸出一個正整數(shù)x的算法歸納為: if x為一位整數(shù) 輸出x; else 輸出x的個位數(shù)字; 對剩余數(shù)字組成的新整數(shù)重復“反向輸出操作; 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 /*輸出其個位,并形成新的x*/ pr
23、intf%d,x%10; printnx/10; 3536【例七例七】漢諾塔漢諾塔Tower of HanoiTower of Hanoi問題。問題。 也是一個非數(shù)值問題。也是一個非數(shù)值問題。 P113例4.10 分析方法:簡化問題:設(shè)盤子只有一個,那么本問題可簡化為ab。對于大于一個盤子的情況,邏輯上可分為兩部分:第n個盤子和除n以外的n-1個盤子。假如將除n以外的n-1個盤子看成一個整體,那么要解決本問題,可按以下步驟: a、將a桿上n-1個盤子借助于b先移到c桿; ac n-1,a,c,b b、將a桿上第n個盤子從a移到b桿; ab c、將c桿上n-2個盤子借助a移到b桿。 cb n-2
24、,c,b,a 3637五五、數(shù)組作為函數(shù)參數(shù)、數(shù)組作為函數(shù)參數(shù)1、用數(shù)組元素作函數(shù)實參 P164此時可把數(shù)組元素看作普通變量單向的值傳送。p 特點: 主調(diào)函數(shù)中的實參數(shù)組元素 帶下標 被調(diào)函數(shù)中的形參普通變量p 調(diào)用結(jié)果:形參值的變化對實參值無影響 二者分占不同內(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個數(shù)值,并調(diào)用功能函數(shù)求其正數(shù)的算術(shù)平方根之和。3839什么是單向什么是單向“值傳送方式?值傳送方式?3940五五、數(shù)組作為函數(shù)參數(shù)、數(shù)組作為函數(shù)參數(shù)2、用數(shù)組名作函數(shù)實參 P165 假設(shè) int a6; 那么數(shù)組名a表示數(shù)組的起始地址。 所以用數(shù)組名,實際上是把實參數(shù)組的起始地址“傳給形參數(shù)組。p本質(zhì):對應的數(shù)組元素不是形參與實參共享同一段內(nèi)存單元所謂“雙向的地址傳送。p特點: 主調(diào)函數(shù)中的實參數(shù)組名不帶下標 被調(diào)函數(shù)中的形參數(shù)組名或數(shù)組定義式p調(diào)用結(jié)果:兩數(shù)組同下標者為同值。4041【例二例二】以下程序的運行結(jié)果是什么?以下程序的
26、運行結(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ù)中定義;2、形參數(shù)組可不定義大小用空方格;3、二者大小可一致或不一致C編譯程序不檢查形參, 但注意引用形參時不要超過實參界。結(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【例三例三】分析以下程序的運行結(jié)果。分析以下程序的運行結(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【討論】如何通過數(shù)組技術(shù)將一列數(shù)據(jù)中最大或最小的數(shù)移前或移后?4344六六、變量的存儲類型、變量的存儲類型l模塊化設(shè)計要求研究不同模塊函數(shù)、源文件
28、間變量的關(guān)系。l變量兩大屬性: 數(shù)據(jù)類型 存儲類別1、數(shù)據(jù)類型復習 通過變量說明定義來規(guī)定其數(shù)據(jù)類型: 格式 數(shù)據(jù)類型關(guān)鍵字 變量名 如 char a; int b,c ; float x,y; 為什么使用變量前要先對其數(shù)據(jù)類型進展“說明好比看電影前先買票訂座 預留存儲空間如char型為1個字節(jié),int型為2個字節(jié) 確定存儲方式如char型存放ASCII值,int型存放補碼值4445復習 數(shù)據(jù)存儲形式 字符型按ASCII碼存儲,其余以補碼存儲 示意圖 字符型 (字符a) 用一個字節(jié)存放該字符的ASCII值(ASCII值表見P374) 整 型 (十進制數(shù)25037) 用兩個字節(jié)存放該數(shù)值的補碼
29、實 型 尾數(shù)(補碼) 指數(shù)(階碼) 注:第一位均為符號位0110000101100001 110011010110000110100010101010 11100110一個變量的數(shù)據(jù)類型定義后,就規(guī)定了該變量只能存儲相應類型的數(shù)據(jù)。如定義int x,那么x只能存放整型數(shù),假如x=3.14159,會被自動轉(zhuǎn)為整型存放。4546六六、變量的存儲類型、變量的存儲類型l變量兩大屬性: 數(shù)據(jù)類型 存儲類別2、存儲類別 P115 規(guī)定了變量在計算機內(nèi)部的存放位置決定變量的“壽命何時“生,何時“滅 一個完好的變量說明格式如下: 存儲類別 數(shù)據(jù)類型 變量名 如 static int x , y ;C程序的存儲
30、類別有: register型存放器型 auto型自動變量型 static型靜態(tài)變量型 extern型外部變量型4647C C程序的變量存儲位置程序的變量存儲位置變量的生存期 靜態(tài)存儲區(qū)中的變量:與程序“共存亡 動態(tài)存儲區(qū)中的變量:與函數(shù)“共存亡 存放器中的變量:同動態(tài)存儲區(qū)4748C C程序的變量存儲類別程序的變量存儲類別變量的生存期 靜態(tài)存儲區(qū)中的變量 與程序“共存亡 動態(tài)存儲區(qū)中的變量 與函數(shù)“共存亡 存放器中的變量 同動態(tài)存儲區(qū) register型存放器型型存放器型變量值存放在運算器的存放器中存取速度快,一般只允許23個,且限于char型和int型,通常用于循環(huán)變量在微機的Turbo C
31、中實際上自動轉(zhuǎn)為auto型。 auto型自動變量型型自動變量型變量值存放在主存儲器的動態(tài)存儲區(qū)堆棧方式;優(yōu)點同一內(nèi)存區(qū)可被不同變量反復使用。以上兩種變量均屬于“動態(tài)存儲型,即調(diào)用函數(shù)時才為這些變量分配單元,函數(shù)調(diào)用完畢其值自動消失。4849C C程序的變量存儲類別程序的變量存儲類別變量的生存期 靜態(tài)存儲區(qū)中的變量 與程序“共存亡 動態(tài)存儲區(qū)中的變量 與函數(shù)“共存亡 存放器中的變量 同動態(tài)存儲區(qū) static型靜態(tài)變量型型靜態(tài)變量型變量值存放在主存儲器的靜態(tài)存儲區(qū)程序執(zhí)行開場至完畢,始終占用該存儲空間 extern型外部變量型型外部變量型同上,其值可供其他源文件使用以上兩種均屬于“靜態(tài)存儲性質(zhì),
32、即從變量定義處開場,在整個程序執(zhí)行期間其值都存在都可用!未說明存儲類別時,函數(shù)內(nèi)定義的變量默認為auto型函數(shù)外定義的變量默認為extern型。4950七、部分變量與全局變量七、部分變量與全局變量 P121 1、部分變量函數(shù)內(nèi)部或復合語句內(nèi)定義的變量 auto默認 所在函數(shù)調(diào)用完畢時,其值自動消失部分變量 register 如不賦初值,取不確定值為初值 static 所有函數(shù)調(diào)用完畢,其值仍保存 如不賦初值,取初值為0數(shù)值型或空格字符型 所有形參都是部分變量; 部分變量只在本函數(shù)或本復合語句內(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; 【例一】求程序運行結(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; 【例二】求程序運行結(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;【例二】求程序運行結(jié)果【結(jié)果】 a
35、=3,b=5,c=2 a=5,b=2,c=1 5354七、部分變量與全局變量七、部分變量與全局變量 P121 2、全局變量在函數(shù)之外定義的變量 extern默認允許根源文件中其他函數(shù)及其他源文件使用 全局變量 static 只限根源文件中使用 所有全局變量加不加static,都屬于靜態(tài)存儲,如不賦初值,取初值為0數(shù)值型或空格字符型注意與函數(shù)內(nèi)部定義的static型部分變量的區(qū)別 54552 2、全局變量、全局變量在函數(shù)之外定義的變量在函數(shù)之外定義的變量l有效作用范圍:從定義變量位置開場直到根源文件完畢l假如需要將全局變量的作用范圍擴展至整個源文件 法1 全部在源文件開頭處定義 法2 在引用函數(shù)
36、內(nèi),用extern說明 法3 在源文件開頭處,用extern說明【例三】求程序運行結(jié)果extern int x,y; main clrscr; printfx=%d,y=%dn,x,y;int x=100,y=200;結(jié)果:x=100,y=200去掉第一行試試假如要將全局變量作用范圍擴展到其他源文件,只需在使用這些變量的文件中對變量用extern加以說明。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; 【例四】求程序運行結(jié)果假如主函數(shù)中沒有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;【例五】求程序運行結(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; 【例六】求程序運行結(jié)果【結(jié)
38、果】 20,10 5859七、編譯預處理七、編譯預處理l編譯預處理: P127 宏定義 文件包含 條件編譯 【編譯】C編譯系統(tǒng)對源程序進展:詞法和語法分析,代碼生成,優(yōu)化 .OBJ文件【編譯預處理】編譯前對源程序進展一些預加工改善程序設(shè)計環(huán)境/模塊化設(shè)計l編譯預處理命令均以#開頭,未尾不加分號l可出如今程序的任何位置,其作用范圍:出現(xiàn)點至所在源程序未尾。5960八、編譯預處理八、編譯預處理1、宏定義 格式 #define 宏名 宏體 宏名和宏體均為字符串,前者必須符合標識符命名規(guī)那么。預處理時在程序中用宏體交換宏名。注意:可以用 #undef 宏名 終止該宏名的作用范圍。 6061八、編譯預處
39、理八、編譯預處理定義符號常量【例一】#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八、編譯預處理八、編譯預處理帶參數(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八、編譯預處理八、編譯預處理帶參數(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ù),它不做任何計算假如是函數(shù),那么sa+b為s3,結(jié)果49.5 sa+b=5.51212=9.5 6364八、編譯預處理八、編譯預處理帶參數(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 標準方式 只按標準方式系統(tǒng)存放C庫函數(shù)頭文件所在目錄查找所要包含的文件 對TC,默認只在tcinclude目錄下查找l#include “ “ 先在源文件所在目錄找指定頭文件,假設(shè)無再按標準方式找更保險65663、條件編譯、條件編譯 l根據(jù)條件決定是否編譯某一組語句。常用形式: 假如標識符被定義過* 假如標識符未被定義過 #ifdef 標識符 #ifndef 標識符 程序段1 程序段1 /*編譯此程序段*/ #else #e
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度出租車公司股權(quán)轉(zhuǎn)讓與綠色出行推廣協(xié)議4篇
- 上海車位購買協(xié)議范本(2024版)版B版
- 二零二五版廢舊設(shè)備買賣及環(huán)境評估協(xié)議3篇
- 二零二五年度食堂承包與營養(yǎng)搭配服務合同3篇
- 2025年生物科技企業(yè)部分股權(quán)增資擴股合同3篇
- 2025年鮮羊奶行業(yè)新型經(jīng)銷商合作模式合同范本3篇
- 二零二五年度原創(chuàng)動漫角色形象知識產(chǎn)權(quán)歸屬協(xié)議下載2篇
- 二零二五年空壓機設(shè)備銷售與安裝驗收合同2篇
- 2025年度高速公路服務區(qū)智能停車場車位租用合同范本
- 2025年度個人跨境電商擔保代理合同4篇
- 青島版二年級下冊三位數(shù)加減三位數(shù)豎式計算題200道及答案
- GB/T 12723-2024單位產(chǎn)品能源消耗限額編制通則
- GB/T 16288-2024塑料制品的標志
- 麻風病防治知識課件
- 干部職級晉升積分制管理辦法
- TSG ZF003-2011《爆破片裝置安全技術(shù)監(jiān)察規(guī)程》
- 2024年代理記賬工作總結(jié)6篇
- 電氣工程預算實例:清單與計價樣本
- VOC廢氣治理工程中電化學氧化技術(shù)的研究與應用
- 煤礦機電設(shè)備培訓課件
- 高考寫作指導議論文標準語段寫作課件32張
評論
0/150
提交評論