




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第四章第四章 模塊化程序設(shè)計(函數(shù))模塊化程序設(shè)計(函數(shù))信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所一、模塊化設(shè)計與函數(shù)【例一】#include #include main( ) *主調(diào)函數(shù)* int a,b,c; int max(int,int); *函數(shù)原型* clrscr( ); printf(Input a,b=); scanf(%d,%d,&a,&b); c=max(a,b); printf(max=%dn,c);int max(int x,int y) *被調(diào)函數(shù)* int z; if (xy) z=x; else z=y; return z;信息學(xué)院自動化儀
2、表研究所信息學(xué)院自動化儀表研究所一、模塊化設(shè)計與函數(shù)本章的學(xué)習(xí)第一步要會商啥是函數(shù)?為啥要使用函數(shù)?函數(shù)有哪些類型?似何自已定義一個函數(shù)?似何調(diào)用一個函數(shù)?函數(shù)學(xué)習(xí)的難點是啥?信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所一、模塊化設(shè)計與函數(shù)啥是函數(shù)?為啥要使用函數(shù)?函數(shù)有哪些類型?似何自已定義一個函數(shù)?似何調(diào)用一個函數(shù)?函數(shù)學(xué)習(xí)的難點是啥? 啥是函數(shù)?一個獨站的程序模塊,能夠定義自已的變量(僅在本函數(shù)內(nèi)有效),擁有自已的存儲空間.能夠被其他函數(shù)或自身調(diào)用(主函數(shù)除外). 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所一、模塊化設(shè)計與函數(shù)啥是函數(shù)?為啥要使用函數(shù)?函數(shù)有哪些類型?似何自已定
3、義一個函數(shù)?似何調(diào)用一個函數(shù)?函數(shù)學(xué)習(xí)的難點是啥? 為啥要使用函數(shù)?便于實現(xiàn)模塊化設(shè)計便于團(tuán)隊開發(fā)便于使用現(xiàn)有的或不人的程序模塊提高編程效能在C程序設(shè)計中,往往:將一個大程序分成幾個子程序模塊(自定義函數(shù))將常用功能做成規(guī)格模塊(規(guī)格函數(shù))放在函數(shù)庫中供其他程序調(diào)用 似果把編程比做制造一臺機(jī)器,函數(shù)便好比其零部件.可將這些“零部件”單獨設(shè)計、調(diào)試、檢驗好,用時拿出來裝配,再總體調(diào)試.這些“零部件”能夠是自已設(shè)計制造不人設(shè)計制造此刻的規(guī)格產(chǎn)物信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所一、模塊化設(shè)計與函數(shù)【例二】編寫一個兒童算術(shù)功底檢驗軟件main() char ans = y; clrsc
4、r( ); cover( ); *調(diào)用軟件封面表現(xiàn)函數(shù)* password( ); *調(diào)用密碼查抄函數(shù)* while (ans =y| ans =Y) question( ); *調(diào)用產(chǎn)生咨詢題函數(shù)* answers( ); *調(diào)用同意答復(fù)函數(shù)* marks( ); *調(diào)用評分函數(shù)* results( ); *調(diào)用結(jié)論表現(xiàn)函數(shù)* printf(“是否接著練習(xí)?(YN)n”); ans=getch ( ); printf(“謝謝使用,再見!”); 自定義函數(shù)信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所一、模塊化設(shè)計與函數(shù)【例二】編寫一個兒童算術(shù)功底檢驗軟件main() char ans =
5、y; clrscr( ); cover( ); *調(diào)用軟件封面表現(xiàn)函數(shù)* password( ); *調(diào)用密碼查抄函數(shù)* while (ans =y| ans =Y) question( ); *調(diào)用產(chǎn)生咨詢題函數(shù)* answers( ); *調(diào)用同意答復(fù)函數(shù)* marks( ); *調(diào)用評分函數(shù)* results( ); *調(diào)用結(jié)論表現(xiàn)函數(shù)* printf(是否接著練習(xí)?(YN)n); ans=getch ( ); printf(謝謝使用,再見!);*定義所用函數(shù)*cover() *軟件封面表現(xiàn)函數(shù)*password() *密碼查抄函數(shù)*question() *產(chǎn)生咨詢題函數(shù)*answers
6、() *同意答復(fù)函數(shù)*marks() *評分函數(shù)*results() *結(jié)論表現(xiàn)函數(shù)* n 這些函數(shù)此刻不編程或還不大概編程,可先放空.n 能夠多人合作,每人完成如果干個函數(shù)(模塊化).n 可在另一個源程序文件中定義.信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所一、模塊化設(shè)計與函數(shù)啥是函數(shù)?為啥要使用函數(shù)?函數(shù)有哪些類型?似何自已定義一個函數(shù)?似何調(diào)用一個函數(shù)?函數(shù)學(xué)習(xí)的難點是啥? 函數(shù)有哪些類型?依照函數(shù)的來歷,可分為:庫函數(shù)(規(guī)格函數(shù)) 由系統(tǒng)提供,編程時可直截了當(dāng)使用之自定義函數(shù) 由編程者自已編寫,使用時要“先定義后使用”.(包裝后,也可成為庫函數(shù),供不人使用)依照使用的方式,可分為
7、:無參函數(shù) 有參函數(shù)(函數(shù)內(nèi)需要使用主調(diào)函數(shù)中的信息)信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所一、模塊化設(shè)計與函數(shù)啥是函數(shù)?為啥要使用函數(shù)?函數(shù)有哪些類型?似何自已定義一個函數(shù)?似何調(diào)用一個函數(shù)?函數(shù)學(xué)習(xí)的難點是啥?u 似何自已定義一個函數(shù)? (見后)u 似何調(diào)用一個函數(shù)? (見后)u 函數(shù)部分學(xué)習(xí)的難點是啥?u 函數(shù)的概念u 函數(shù)的指標(biāo)傳遞與返回值 u 遞回算法u 變量的作用域和生活期 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所一、模塊化設(shè)計與函數(shù)函數(shù)使用學(xué)問函數(shù)使用學(xué)問: P144: P144 一個源文件由一個或多個函數(shù)組成一個源文件由一個或多個函數(shù)組成, ,可為多個可為多個
8、C C程序程序公用公用. .C C語言是以源文件為單位而不以函數(shù)為單位履行編語言是以源文件為單位而不以函數(shù)為單位履行編譯的譯的. .一個一個C C程序由一個或多個源(程序)文件組成程序由一個或多個源(程序)文件組成可分不編寫、編譯和調(diào)試可分不編寫、編譯和調(diào)試. .C C程序履行老是從程序履行老是從mainmain函數(shù)最先函數(shù)最先, ,一樣情況下調(diào)用其一樣情況下調(diào)用其它函數(shù)后老是回到它函數(shù)后老是回到mainmain函數(shù)函數(shù), ,末了在末了在 main main函數(shù)中函數(shù)中結(jié)束整個程序的運行結(jié)束整個程序的運行. .全部函數(shù)根基上平行的、彼此獨站的全部函數(shù)根基上平行的、彼此獨站的, ,即在一個函即在
9、一個函數(shù)內(nèi)只能調(diào)用其他函數(shù)數(shù)內(nèi)只能調(diào)用其他函數(shù), ,不能再定義一個函數(shù)(不能再定義一個函數(shù)(嵌套定義)嵌套定義). .一個函數(shù)能夠調(diào)用其他函數(shù)或其自已一個函數(shù)能夠調(diào)用其他函數(shù)或其自已, ,但任何函數(shù)但任何函數(shù)均不可調(diào)用均不可調(diào)用mainmain函數(shù)函數(shù). . 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所二、函數(shù)的定義函數(shù)定義“制造自已的函數(shù)”. P1441、函數(shù)定義的一樣形式 (參見例一) 函數(shù)返回值的信息類型 函數(shù)名(類型名 變量名1,類型名 變量名2,) 表明部分 操作語句 【注重】無形參表的即無參函數(shù).無函數(shù)體的為“空函數(shù)”.似果函數(shù)返回值的信息類型為int,能夠省略之.類型標(biāo)識符形
10、參表信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所二、函數(shù)的定義Windows風(fēng)格函數(shù)名命名用大寫字母開頭的單詞組合而成 變量名形式“名詞”大概“形容詞+名詞”似變量名oldValue與newValue等函數(shù)名形式“動詞”大概“動詞+名詞”(動賓詞組)似函數(shù)名GetMax()等 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所二、函數(shù)的定義把程序操縱權(quán)從函數(shù)返回函數(shù)調(diào)用點有三種方式:履行到函數(shù)結(jié)束的右花括號時(似果函數(shù)沒有返回值);履行到似下語句(似果函數(shù)沒有返回值): return;把返回值返回調(diào)用處(見例一) return 表達(dá)式; 形式: return (x); return (x+y
11、); return (xy?x:y); 語句中圓括號亦可省略.信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所二、函數(shù)的定義【注重】 似果函數(shù)值類型與return語句表達(dá)式值的類型不一致,以函數(shù)類型為準(zhǔn)(數(shù)值型會自動履行類型變形). 似果明白示意不需返回值,應(yīng)使用void作函數(shù)返回值的信息類型,否那么縱然沒有return語句,仍將帶回一個不確定的值(見P149講明). 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所三、函數(shù)的調(diào)用1、庫函數(shù)的調(diào)用 必須在源程序中用include號令將定義該庫函數(shù)的頭文件“見諒進(jìn)來”.調(diào)用方式: 獨站語句 履行某項操縱,似clrscr( );printf(“In
12、put a,b=”);等表達(dá)式中 作運算對象,似 a=sqrt(x)+pow(r,3);c=exp(a); 等 在函數(shù)引用中以實參的形式表現(xiàn),例似 y=cos(tan(x);信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所三、函數(shù)的調(diào)用2、自定義函數(shù)、自定義函數(shù) 自定義函數(shù)和變量一樣自定義函數(shù)和變量一樣,在其主調(diào)函數(shù)中也必須在其主調(diào)函數(shù)中也必須“先表明先表明,后使用后使用”. 似例一中的似例一中的 int max(int,int); *函數(shù)原型函數(shù)原型* 例一中的自定義函數(shù)表明也能夠用以下兩種形例一中的自定義函數(shù)表明也能夠用以下兩種形式式: P153 int max(int x,int y);
13、 (多余多余,因為編譯系統(tǒng)同因為編譯系統(tǒng)同時不查抄指標(biāo)名時不查抄指標(biāo)名) 或或 int max( );(編譯系統(tǒng)將不查抄指標(biāo)類型;(編譯系統(tǒng)將不查抄指標(biāo)類型和指標(biāo)個數(shù))和指標(biāo)個數(shù)) 以下情況時以下情況時,被調(diào)函數(shù)在主調(diào)函數(shù)中能夠不先表明被調(diào)函數(shù)在主調(diào)函數(shù)中能夠不先表明: P154被調(diào)函數(shù)的返回值為整型時函數(shù)值是整型(被調(diào)函數(shù)的返回值為整型時函數(shù)值是整型(int)或字符型(或字符型(char)時時系統(tǒng)自動按整型講明系統(tǒng)自動按整型講明(最好表明);最好表明);被調(diào)函數(shù)的定義表此刻主調(diào)函數(shù)之前時;被調(diào)函數(shù)的定義表此刻主調(diào)函數(shù)之前時;在全部函數(shù)定義之前在全部函數(shù)定義之前,在函數(shù)的外部已做了函數(shù)表在函數(shù)
14、的外部已做了函數(shù)表明時明時.#include float add(float x, float y) float z; z=x+y; return(z);main() float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);被調(diào)函數(shù)表此刻主調(diào)數(shù)之前,不必函數(shù)講明void main() float a,b; int c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %dn,c);max(float x, float y) float z; z=
15、xy?x:y; return(z);使用函數(shù)原型作表明是使用函數(shù)原型作表明是CC的一個重要特點的一個重要特點信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所三、函數(shù)的調(diào)用單向值傳遞調(diào)用函數(shù)時,必須提供全部的指標(biāo)提供的指標(biāo)個數(shù)、類型、次序與定義時一樣有返回值時放到一個數(shù)值表達(dá)式中,似c = max(a,b);做為另一個函數(shù)調(diào)用的指標(biāo),似 c = max(max(a,b),c); printf(%dn, max(a,b);無返回值時函數(shù)調(diào)用表達(dá)式,似display(a,b);信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所main()調(diào)fun()結(jié)束fun()返回保留:返回地址當(dāng)前現(xiàn)場恢復(fù):主調(diào)程
16、序現(xiàn)場返回地址函數(shù)調(diào)用的履行環(huán)節(jié)信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所【例三】使用了Average函數(shù)的main() main()int a = 12;int b = 24;int ave;ave = Average(a, b);printf(Average of %d and %d is %d.n, a, b, ave);int Average(int x, int y) int result; result = (x + y) 2; return result;main() int a = 12; int b = 24; int ave; ave = Average(a, b);
17、 printf();信息傳遞履行次序信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所【例三】 #include * 函數(shù)功能: 統(tǒng)計平均數(shù) 函數(shù)入口指標(biāo): 整型x,存儲第一個運算數(shù)整型y,存儲第二個運算數(shù) 函數(shù)返回值: 平均數(shù)*int Average(int x, int y)int result;result = (x + y) 2;return result;main()int a = 12;int b = 24;int ave = Average(a, b);printf(Average of %d and %d is %d.n, a, b, ave);信息學(xué)院自動化儀表研究所信息學(xué)院自
18、動化儀表研究所【例三】#include int Average(int x, int y); *表明Average()函數(shù)* main()int a = 12;int b = 24;int ave = Average(a, b);printf(Average of %d and %d is %d.n, a, b, ave);* 函數(shù)功能: 統(tǒng)計平均數(shù) 函數(shù)入口指標(biāo): 整型x,存儲第一個運算數(shù) 整型y,存儲第二個運算數(shù) 函數(shù)返回值: 平均數(shù)*int Average(int x, int y)int result;result = (x + y) 2;return result;信息學(xué)院自動化儀表
19、研究所信息學(xué)院自動化儀表研究所三、函數(shù)的調(diào)用3、調(diào)用外部函數(shù)(其他源文件中定義的函數(shù))時 函數(shù)講明語句 extern 函數(shù)名(); 【例二】 文件file1.c中main() int x=80,y=90,c; extern max(); *函數(shù)講明* c=max(x,y)+20; *調(diào)用max函數(shù)* printf(“Max is %dn”,c); 文件files2.c中(與file1.c同目錄)extern max(int a,int b) *extern可省* float c; c=ab?a:b; return c; 注:要做一個 .prj文件才能運行.信息學(xué)院自動化儀表研究所信息學(xué)院自動化
20、儀表研究所在被調(diào)函數(shù)中,又調(diào)用了函數(shù)-嵌套調(diào)用三、函數(shù)的調(diào)用函數(shù)是彼此平行的 ,C語言規(guī)定函數(shù)不能嵌套定義,但能夠嵌套調(diào)用main().a 函數(shù)b函數(shù)信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所#include int fun1(int x,int y);void main(void) int a,b; scanf(“%d%d”,&a,&b); printf(“The result is:%dn”,fun1(a,b) );int fun1(int x,int y) int fun2(int m); return ( fun2(x)+fun2(y) );int fun2(in
21、t m) return (m*m);例例 輸入兩個整數(shù)輸入兩個整數(shù),求平方和求平方和輸入: 3 4輸出: The result is: 25信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所#include int dif(int x,int y,int z); int max(int x,int y,int z); int min(int x,int y,int z);void main() int a,b,c,d; scanf(%d%d%d,&a,&b,&c); d=dif(a,b,c); printf(Max-Min=%dn,d);例例 求三個數(shù)中最大數(shù)和最小數(shù)的差
22、值求三個數(shù)中最大數(shù)和最小數(shù)的差值int dif(int x,int y,int z) return max(x,y,z)-min(x,y,z); int max(int x,int y,int z) int r; r=xy?x:y; return(rz?r:z);int min(int x,int y,int z) int r; r=xy?x:y; return(r1)信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所 遞回函數(shù): 10 (n=1) age(n)= age(n-1)+2 (n1)age(int n) int c; if (n=1) c=10; else c=age(n-1)+2;
23、 return c; main() clrscr( ); printf(%d,age(5);程序似下:請看看單步運行的情況信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所 age(5) c=age(4)+2; return c;age(int n) int c; if (n=1) c=10; else c=age(n-1)+2; return c; 遞回環(huán)節(jié)跟蹤對比: age(4) c=age(3)+2; return c; age(3) c=age(2)+2; return c; age(2) c=age(1)+2; return c; age(1) c=10 return c;c=10c=
24、12c=14c=16c=18信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 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)信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所遞回函數(shù) : 1 (y=1 或 y=x) c(x,y)= c(x-1,y-1)+c(x-1,y)程序似下:main() int i,j,n; clrscr( ); printf(Input n
25、=); scanf(%d,&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=fib(n-1)+fib(n-2); return (f);main() int i,s=0; clrscr( ); for (i=1;i=12;i+) s=s+fib(i); printf(n=12,s=%d,s);結(jié)論:n=12,s=376信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所【例五】運行下列程序,當(dāng)輸入字符序列AB$CDE
26、同時回車時,程序的輸出結(jié)論是啥?#include rev() char c; c=getchar(); if (c=$) printf(%c,c); else rev(); printf(%c,c); main() rev();結(jié)論結(jié)論:$BArev()c=Arev( )輸出Arev()c=Brev( )輸出Brev()c=$輸出$信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所【例六】反向輸出一個整數(shù)(非數(shù)值咨詢題)非數(shù)值咨詢題的對比無法象數(shù)值咨詢題那樣能獵取一個初值和遞回函數(shù)式,但思路是一樣的.對比方式:簡化咨詢題:設(shè)要輸出的正整數(shù)只有一位,那么“反向輸出”咨詢題可簡化為輸出一位整數(shù).對大
27、于10的正整數(shù),邏輯上可分為兩部分:個位上的數(shù)字和個位往常的全部數(shù)字.將個位往常的全部數(shù)字算作一個整體,那么為了反向輸出那個大于10的正整數(shù),可按以下環(huán)節(jié): a、輸出個位上的數(shù)字; b、將個位除外的其他數(shù)字做為一個新的整數(shù),重復(fù)a環(huán)節(jié)的操縱.其中b咨詢題只是對原咨詢題在范圍上履行了縮小遞回.所以,可將反向輸出一個正整數(shù)x的算法回納為: if (x為一位整數(shù)) 輸出x; else 輸出x的個位數(shù)字; 對剩余數(shù)字組成的新整數(shù)重復(fù)“反向輸出”操縱; 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所程序似下:#include void main() void printn(int x); int n;
28、 printf(Input n=); scanf(%d,&n); if (n=0&x=9) printf(%d,x); *如果x為多位整數(shù)* else *輸出其個位,同時形成新的x* printf(%d,x%10); printn(x10); 程序似下:#include void main() void printn(int x); int n; printf(Input n=); scanf(%d,&n); if (n=0&x=9) printf(%d,x); *如果x為多位整數(shù)* else *輸出其個位,同時形成新的x* printf(%d,x%10); p
29、rintn(x10); 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所【例七】漢諾塔(Tower of Hanoi)咨詢題. 也是一個非數(shù)值咨詢題. P161例8.9 對比方式:簡化咨詢題:設(shè)盤子只有一個,那么本咨詢題可簡化為ac.對大于一個盤子的情況,邏輯上可分為兩部分:第n個盤子和除n以外的n-1個盤子.似果將除n以外的n-1個盤子算作一個整體,那么要解決本咨詢題,可按以下環(huán)節(jié): a、將a桿上n-1個盤子借助于c先移到b桿; ab (n-1,a,b,c) b、將a桿上第n個盤子從a移到c桿; ac c、將b桿上n-1個盤子借助a移到c桿. bc (n-1,b,c,a) (借助)信息學(xué)院自
30、動化儀表研究所信息學(xué)院自動化儀表研究所五、變量的存儲類型模塊化設(shè)計要求探索差別模塊(函數(shù)、源文件)間變量的關(guān)系.變量兩大屬性: 信息類型 存儲類不1、信息類型(復(fù)習(xí)) 通過變量講明(定義)來規(guī)定其信息類型: 標(biāo)準(zhǔn) 信息類型關(guān)鍵字 變量名 似 char a; int b,c ; float x,y; 為啥使用變量前要先對其信息類型履行“講明”好比看電影前先買票訂座 預(yù)留存儲空間(似char型為1個字節(jié),int型為2個字節(jié)) 確定存儲方式(似char型存放ASCII值,int型存放補碼值)信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所復(fù)習(xí)信息存儲形式 字符型按ASCII碼存儲,其余以補碼存儲 示
31、意圖 字符型 (字符a) 用一個字節(jié)存放該字符的ASCII值(ASCII值表見附錄D) 整 型 (十進(jìn)制數(shù)25037) 用兩個字節(jié)存放該數(shù)值的補碼 實 型 尾數(shù)(補碼) 指數(shù)(階碼) 注:第一位均為符號位0110000101100001 110011010110000110100010101010 11100110一個變量的信息類型定義后,便規(guī)定了該變量只能存儲相應(yīng)類型的信息.似定義int x,那么x只能存放整型數(shù),似果x=3.14159,會被自動轉(zhuǎn)為整型存放.信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所五、變量的存儲類型變量兩大屬性: 信息類型 存儲類不2、存儲類不 P172 規(guī)定了變量
32、在統(tǒng)計機(jī)內(nèi)部的存放位置決意變量的“壽命”(何時“生”,何時“滅”) 一個完整的變量講明標(biāo)準(zhǔn)似下: 存儲類不 信息類型 變量名 似 static int x , y ;C程序的存儲類不有: register型(寄存器型) auto型(自動變量型) static型(靜態(tài)變量型) extern型(外部變量型)信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所C程序的變量存儲位置變量的生活期 靜態(tài)存儲區(qū)中的變量:與程序“共存亡” 動態(tài)存儲區(qū)中的變量:與函數(shù)“共存亡” 寄存器中的變量:同動態(tài)存儲區(qū)信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所C程序的變量存儲類不變量的生活期 靜態(tài)存儲區(qū)中的變量 與程序“
33、共存亡” 動態(tài)存儲區(qū)中的變量 與函數(shù)“共存亡” 寄存器中的變量 同動態(tài)存儲區(qū) register型(寄存器型)型(寄存器型)變量值存放在運算器的寄存器變量值存放在運算器的寄存器中中存取速度快存取速度快,一樣只許可一樣只許可23個個,且限于且限于char型和型和int型型,往往用于循環(huán)變量(在微機(jī)的往往用于循環(huán)變量(在微機(jī)的Turbo C中現(xiàn)實上自動轉(zhuǎn)為中現(xiàn)實上自動轉(zhuǎn)為auto型)型). auto型(自動變量型)型(自動變量型)變量值存放在主存儲器的動態(tài)變量值存放在主存儲器的動態(tài)存儲區(qū)(堆棧方式);存儲區(qū)(堆棧方式);利益利益同一內(nèi)存區(qū)可被差別同一內(nèi)存區(qū)可被差別變量反復(fù)使用變量反復(fù)使用.以上兩種變
34、量均屬于以上兩種變量均屬于“動態(tài)存儲動態(tài)存儲型型”,即調(diào)用函數(shù)時才為這些變量即調(diào)用函數(shù)時才為這些變量安排單元安排單元,函數(shù)調(diào)用結(jié)束其值自函數(shù)調(diào)用結(jié)束其值自動消散動消散.信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所C程序的變量存儲類不變量的生活期 靜態(tài)存儲區(qū)中的變量 與程序“共存亡” 動態(tài)存儲區(qū)中的變量 與函數(shù)“共存亡” 寄存器中的變量 同動態(tài)存儲區(qū) static型(靜態(tài)變量型)型(靜態(tài)變量型)變量值存放在主存儲器的靜變量值存放在主存儲器的靜態(tài)存儲區(qū)態(tài)存儲區(qū)程序履行最先到結(jié)束程序履行最先到結(jié)束,始終占始終占用該存儲空間用該存儲空間 extern型(外部變量型)型(外部變量型)同上同上,其值可
35、供其他源文件使其值可供其他源文件使用用以上兩種均屬于以上兩種均屬于“靜態(tài)存儲靜態(tài)存儲”性質(zhì)性質(zhì),即從變量定義處最先即從變量定義處最先,在在整個程序履行期間其值都存整個程序履行期間其值都存在(在(都可用都可用!)未講明存儲類不時,函數(shù)內(nèi)定義的變量默信任auto型函數(shù)外定義的變量默信任extern型.信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所六、局部變量與全局變量1、局部變量函數(shù)內(nèi)部或復(fù)合語句內(nèi)定義的變量 auto(默認(rèn)) 所在函數(shù)調(diào)用結(jié)束時,其值自動消散局部變量 register 似不賦初值,取不確定值為初值 static 全部函數(shù)調(diào)用結(jié)束,其值仍保留 似不賦初值,取初值為0(數(shù)值型)或空
36、格(字符型) 全部形參根基上局部變量; 局部變量只在本函數(shù)或本復(fù)合語句內(nèi)才能使用,在此之外不能使用(視為不存在)main函數(shù)也不破例.信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所main() int a=2,i; clrscr( ); for (i=0;i3;i+) printf(%4d,f(a);f(int a) int b=0; static int c=3; b+;c+; return a+b+c; 【例一】求程序運行結(jié)論【例一】求程序運行結(jié)論變量跟蹤 main( ) f函數(shù) a i b c f(a) 2 0 01 4 7 1 01 5 8 2 01 6 9 【結(jié)論】 7 8 9 似
37、果去掉static呢?【結(jié)論】 7 7 7信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所main() int k=4,m=1,p; clrscr(); p=func(k,m); printf(%d,p); p=func(k,m); printf(%d,p);func(int a,int b) static int m=0,i=2; i+=m+1; m=i+a+b; return m; 【例二】求程序運行結(jié)論【例二】求程序運行結(jié)論變量跟蹤 main( ) func函數(shù) k m a b i m 4 1 4 1 23 08 4 1 4 1 312 817 【結(jié)論】 8, 17 似果去掉static
38、呢?【結(jié)論】 8, 8信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所#include main() int a=3, b=2, c=1; int b=5, c=12; c-=b*2; printf(a=%d,b=%d,c=%dn, a, b, c); a+=c; printf(a=%d,b=%d,c=%dn, a, b, c);【例三】求程序運行結(jié)論【例三】求程序運行結(jié)論【結(jié)論】 a=3,b=5,c=2 a=5,b=2,c=1 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所六、局部變量與全局變量 2、全局變量在函數(shù)之外定義的變量 extern(默認(rèn))許可本源文件中其他函數(shù)及其他源文件使用
39、全局變量 static 只限本源文件中使用 全部全局變量加不加static,都屬于靜態(tài)存儲,似不賦初值,取初值為0(數(shù)值型)或空格(字符型)(注重與函數(shù)內(nèi)部定義的static型局部變量的區(qū)不) 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所2、全局變量在函數(shù)之外定義的變量有效作用范疇:從定義變量位置最先直到本源文件結(jié)束似果需要將全局變量的作用范疇擴(kuò)展到整個源文件 法1 全部在源文件開頭處定義 法2 在引用函數(shù)內(nèi),用extern講明 法3 在源文件開頭處,用extern講明【例三】求程序運行結(jié)論extern int x,y; main( ) clrscr(); printf(x=%d,y=%d
40、n,x,y);int x=100,y=200;結(jié)論:x=100,y=200去掉第一行嘗嘗似果要將全局變量作用范疇擴(kuò)展到其他源文件,只需在使用這些變量的文件中對變量用extern加以講明.信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所int a=3,b=5;max(int a,int b) int c; c=ab?a:b; return c; main() int a=8; printf(%dn,max(a,b); 【例四】求程序運行結(jié)論【例四】求程序運行結(jié)論似果主函數(shù)中沒有int a=8,結(jié)論? 【結(jié)論】 5似果讓主函數(shù)中int a=4或a=-1,結(jié)論? 【結(jié)論】 均為 5信息學(xué)院自動化儀表
41、研究所信息學(xué)院自動化儀表研究所void 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é)論【例五】求程序運行結(jié)論似果第二行不加上extern呢? 【結(jié)論】 5,25【結(jié)論】 12,2 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所int a;fun(int i) a+=2*i; return a; main() int a=10; clrscr( ); printf(%d,%dn,fun
42、(a),a); 【例六】求程序運行結(jié)論【例六】求程序運行結(jié)論【結(jié)論】 20,10 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所七、函數(shù)設(shè)計的原那么七、函數(shù)設(shè)計的原那么函數(shù)的功能要單一,不要設(shè)計多用途的函數(shù) 函數(shù)的范圍要小,完量操縱在50行代碼以內(nèi)1986年IBM在OS360的探索結(jié)論:大多數(shù)有錯誤的函數(shù)都大于500行1991年對148,000行代碼的探索表明:小于143行的函數(shù)比更長的函數(shù)更簡單維護(hù)每個函數(shù)只有一個入口和一個出口 向函數(shù)傳遞信息時,完量不使用全局變量 幾個有關(guān)聯(lián)的函數(shù)需要使用全局變量時,全局變量響應(yīng)會見全局變量的函數(shù)放在單獨的一個文件中,與其它文件分不編譯,同時且將該全局變
43、量表明為static(靜態(tài)全局變量) 函數(shù)指標(biāo)的書寫要完整,不要省略指標(biāo)以及返回值的類型和名字,似果沒有,那么用void表明 定義好函數(shù)接口往后,應(yīng)在文件的開頭處履行函數(shù)講明完量少用靜態(tài)局部變量,以幸免使函數(shù)具有“經(jīng)歷”功能 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所八、模塊和鏈接八、模塊和鏈接 將一個程序分化成如果干個模塊,分不放在幾個源文件中,形成一個項目(Project)接著,對每一個源文件分不單獨履行編譯再將它們的意圖代碼連同規(guī)格函數(shù)庫中的函數(shù)鏈接在共同,形成可履行文件. 主模塊main()所在的文件也是一個模塊模塊之間通過彼此調(diào)用函數(shù)和共享全局變量聯(lián)系起來頭文件是聯(lián)系的紐帶 頭
44、文件里對全局變量的表明要加上extern關(guān)鍵字,用以講明該變量為外部變量 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所利益:當(dāng)一個文件中的代碼被修改后,不必對全部程序再一次編譯,從而節(jié)流了程序的編譯時候.使程序更宜于維護(hù),給多個程序員共同編制一個大型項意圖代碼提供了方便手段. 八、模塊和鏈接八、模塊和鏈接 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所程序調(diào)試實例 【例五】 #include int Factorial(int x);main()int x;while (1)*無限循環(huán)無限循環(huán)*printf(Please input x(-1 to quit):);scanf(%d, &
45、amp;x);if (x = -1) break;*循環(huán)出口循環(huán)出口*else printf(The factorial of %d is %d.n, x, Factorial(x);信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所程序調(diào)試實例 【例五】 * 函數(shù)功能函數(shù)功能: 統(tǒng)計統(tǒng)計x的階乘的階乘 函數(shù)入口指標(biāo)函數(shù)入口指標(biāo): 整型整型x 函數(shù)返回值函數(shù)返回值: 整型的結(jié)論整型的結(jié)論*int Factorial(int x)int i, result;for (i=1; i=x; i+)result *= i;return result;信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所八、編
46、譯預(yù)操作編譯預(yù)操作: P187 宏定義 文件見諒 前提編譯 【編譯】C編譯系統(tǒng)對源程序履行:詞法和語法對比,代碼生成,優(yōu)化 .OBJ文件【編譯預(yù)操作】編譯前對源程序履行部分預(yù)加工(改善程序設(shè)計環(huán)境模塊化設(shè)計)編譯預(yù)操作號令均以#開頭,未尾不加分號可表此刻程序的任何位置,其作用范疇:表現(xiàn)點到所在源程序未尾.信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所八、編譯預(yù)操作1、宏定義 標(biāo)準(zhǔn) #define 宏名 宏體 宏名和宏體均為字符串,前者必須吻合標(biāo)識符命名法那么.預(yù)操作時在程序中用宏體替換宏名.注重:能夠用 #undef 宏名 終止該宏名的作用范疇.p189 信息學(xué)院自動化儀表研究所信息學(xué)院自動
47、化儀表研究所八、編譯預(yù)操作定義符號常量【例一】#define M 3#define N (M+1)#define NN N*N2main() clrscr(); printf(NN=%d,NN); printf(5*NN=%dn,5*NN);結(jié)論:NN=8,5*NN=40【會商】 似果第二行改為: #define N M+1 結(jié)論: NN=6,5*NN=18 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所八、編譯預(yù)操作帶指標(biāo)的宏定義 標(biāo)準(zhǔn) #define 宏名(指標(biāo)表) 宏體【例二】#define PI 3.14159#define s(r) PI*r*rmain() float a=1,s
48、um; sum=s(a); printf(r=%.0f,s=%fn,a,sum);結(jié)論:r=1,s=3.141590 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所八、編譯預(yù)操作帶指標(biāo)的宏定義 【例三】#define PT 5.5#define s(A) PT*A*Amain() int a=1,b=2; printf(%4.1fn,s(a+b); 結(jié)論:9.5 【會商】注重s(a+b)不是函數(shù),它不做任何統(tǒng)計(似果是函數(shù),那么s(a+b)為s(3),結(jié)論49.5) s(a+b)=5.51212=9.5 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所八、編譯預(yù)操作帶指標(biāo)的宏定義 【例四】挑
49、選精確答案#include stdio.h#define SUM(y) 1+ymain( ) int x=2; printf(%dn,SUM(5)*x); A) 10 B) 11 C) 12 D) 15結(jié)論:B 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所2、文件見諒 P194#include 規(guī)格方式 只按規(guī)格方式(系統(tǒng)存放C庫函數(shù)頭文件所在目錄)查尋所要見諒的文件 對TC,默認(rèn)只在tcinclude目錄下查尋#include “ ” 先在源文件所在目錄尋指定頭文件,如果無再按規(guī)格方式尋(更保險)信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所3、前提編譯 P196依照前提決意是否編譯某
50、一組語句.常用形式: 似果標(biāo)識符被定義過* 似果標(biāo)識符未被定義過 #ifdef 標(biāo)識符 #ifndef 標(biāo)識符 程序段1 程序段1 *編譯此程序段* #else #else*#else部分可省略* 程序段2 程序段2 *反之,編譯此程序段* #endif #endif *此處指標(biāo)識符用#define等號令定義過.信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所3、前提編譯 P196 #if 表達(dá)式 *似果表達(dá)式為真* 程序段1 *編譯程序段1* #else 程序段2 否那么*編譯程序段2* #endif似果用: if 表達(dá)式 程序段1 else 程序段2亦可實現(xiàn)以上功能,但程序段1,2均要編譯
51、.似果它們對比大,生成的exe文件便非常大. 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所3、前提編譯 P196【例一】#define DEBUG 0main() int a=10,b=20,c; clrscr(); c=ab; #ifdef DEBUG printf(a=%d,b=%dn,a,b); #endif printf(c=%dn,c);結(jié)論:a=10,b=20c=0【會商】 似果#define DEBUG呢? 結(jié)論不變 似果沒有#define行呢? 只輸出c=0 信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所課堂提咨詢: 1、似何推斷一個變量是局部變量仍是全局變量? 2、定義一個變量時,似果沒有規(guī)定存儲類型,其默認(rèn)的存儲類型是啥?3、似果程序中有如此一個語句 static int x; 表此刻程序的差別位置其含義是否一樣?其初值是幾?信息學(xué)院自動化儀表研究所信息學(xué)院自動化儀表研究所課堂提咨詢:4、以下程序運行時犯
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 奉賢區(qū)羽毛球球場施工方案
- 水庫牧道及庫區(qū)清施工方案
- 長沙設(shè)備內(nèi)襯防腐施工方案
- 2025年中國搬運機(jī)器人產(chǎn)業(yè)深度分析、投資前景及發(fā)展趨勢預(yù)測報告
- 生態(tài)補償機(jī)制的建設(shè)與完善策略及實施路徑
- 中西通俗小說賞析知到課后答案智慧樹章節(jié)測試答案2025年春溫州理工學(xué)院
- 2025年電子金融相關(guān)設(shè)備項目建議書
- 數(shù)學(xué)高考備考講義第三章不等式35
- 燈條施工方案模板
- 2025年高三二輪專題復(fù)習(xí)學(xué)案地理(藝體生專用)第26講地區(qū)產(chǎn)業(yè)結(jié)構(gòu)變化與產(chǎn)業(yè)轉(zhuǎn)移
- 高中體育與健康人教版高中必修全一冊(新課標(biāo))第十章體操類運動-技巧模塊計劃
- 云南省主要礦產(chǎn)資源
- 臨床試驗疑難問題解答
- 磁共振基礎(chǔ)知識及3.0T磁共振1
- 酒店概論教案
- 傳統(tǒng)體育養(yǎng)生概論
- 電力建設(shè)工程預(yù)算定額2006版
- 地鐵活塞風(fēng)相關(guān)計算
- DLT5216-2005 35kV~220kV城市地下變電站設(shè)計規(guī)定
- 華彩中國舞教案第四級分享
- SMT鋼網(wǎng)管理規(guī)范
評論
0/150
提交評論