譚浩強C++課件_2 作用域 存儲類 數組 結構體_第1頁
譚浩強C++課件_2 作用域 存儲類 數組 結構體_第2頁
譚浩強C++課件_2 作用域 存儲類 數組 結構體_第3頁
譚浩強C++課件_2 作用域 存儲類 數組 結構體_第4頁
譚浩強C++課件_2 作用域 存儲類 數組 結構體_第5頁
已閱讀5頁,還剩192頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1作用域和存儲類作用域和存儲類作用域是指程序中所說明的標識符在哪一個區間作用域是指程序中所說明的標識符在哪一個區間內有效,即在哪一個區間內可以使用或引用該標內有效,即在哪一個區間內可以使用或引用該標識符識符。在。在C+中,作用域共分為五類:中,作用域共分為五類:塊作用域、塊作用域、文件作用域、函數原型作用域、函數作用域和類文件作用域、函數原型作用域、函數作用域和類的作用域。的作用域。 2塊作用域塊作用域我們把用花括號括起來的一部分程序稱為一個塊。我們把用花括號括起來的一部分程序稱為一個塊。在塊內說明的標識符,只能在該塊內引用,即其在塊內說明的標識符,只能在該塊內引用,即其作用域在該塊內,開始于

2、標識符的說明處,結束作用域在該塊內,開始于標識符的說明處,結束于塊的結尾處。于塊的結尾處。 在一個函數內部定義的變量或在一個塊中定義的在一個函數內部定義的變量或在一個塊中定義的變量稱為局部變量。變量稱為局部變量。 3在函數內或復合語句內部定義的變量,其作用域是在函數內或復合語句內部定義的變量,其作用域是從定義的位置起到函數體或復合語句的結束從定義的位置起到函數體或復合語句的結束。形參形參也是局部變量。也是局部變量。float f1( int a) int b,c; .float f2( int x, int y) int i, j; .void main(void ) int m, n; .x

3、,y,i,j 有效有效a,b,c有效有效m,n有效有效4主函數主函數main中定義的變量,也只在主函數中有效,中定義的變量,也只在主函數中有效,同樣屬于局部變量同樣屬于局部變量。不同的函數可以使用相同名字的局部變量,它們在不同的函數可以使用相同名字的局部變量,它們在內存中分屬不同的存儲區間,互不干擾。內存中分屬不同的存儲區間,互不干擾。void main(void) int x=10; int x=20; coutxendl; coutxendl;2010 x10 x20定義變量既是在定義變量既是在內存中開辟區間內存中開辟區間5注意:注意:具有塊作用域的標識符在其作用域內,將屏具有塊作用域的標

4、識符在其作用域內,將屏蔽其作用塊包含本塊的同名標識符,即蔽其作用塊包含本塊的同名標識符,即變量名相同,局部更優先。變量名相同,局部更優先。6void main(void) int a=2, b=3, c=5; coutatbtcendl; int a, b=2; a=b+c; coutatbtcendl; c=a-b; coutatbtcendl; a2b3c5 3 57 2 5ab27-12 3 -17void main(void) int a=1,b=2,c=3; +a; c+=+b; int b=4, c; c=b*3; a+=c; cout“first:”atbtcendl; a+=c

5、; cout“second:”atbtcendl; cout“third:”atbtcendl;a=2b=3, c=6b=4c=12a=14a=14,b=4,c=12a=26a=26,b=4,c=12a=26,b=3,c=68文件作用域文件作用域 在函數外定義的變量稱為全局變量。在函數外定義的變量稱為全局變量。全局變量的作用域稱為文件作用域,即在整個文全局變量的作用域稱為文件作用域,即在整個文件中都是可以訪問的。件中都是可以訪問的。 其缺省的作用范圍是其缺省的作用范圍是:從定義全局變量的位置開始從定義全局變量的位置開始到該源程序文件結束到該源程序文件結束。當在塊作用域內的變量與全局變量同名時,

6、當在塊作用域內的變量與全局變量同名時,局部局部變量優先。變量優先。 9p,q有效有效int p=1, q=5;float f1( int a) int b,c; .char c1,c2;main( ) int m, n; .a,b,c有效有效m,n有效有效c1,c2有效有效全局變量全局變量局部變量局部變量全局變量全局變量增加了函數間數據聯系的渠道增加了函數間數據聯系的渠道,在函數調,在函數調用時可以得到多于一個的返回值。用時可以得到多于一個的返回值。104int min;int max (int x, int y) int z; min=(xy)? x : y ; return z; void

7、 main (void) int a,b,c; cinab; c=max (a , b) ; cout“The max is”cendl; cout“ The min is”minb? a:b; return c;void main(void) int a=8; coutmax(a,b)endl;3a5ba88a5bmax (8,5)輸出:輸出:812int x;void cude(void) x=x*x*x ;void main (void) x=5; cude ( ); coutxendl;輸出:輸出: 125輸出:輸出: 5int x=5;x為為013在塊作用域內可通過作用域運算符在塊作

8、用域內可通過作用域運算符“:”來引用來引用與局部與局部變量同名變量同名的全局變量。的全局變量。 #include int i= 100;void main(void) int i , j=50; i=18; /訪問訪問局部變量局部變量i :i= :i+4; /訪問全部變量訪問全部變量i j= :i+i; /訪問全部變量訪問全部變量i和局部變量和局部變量j cout”:i=”:in; cout”i=”in; cout”j=”jn;:i=104i=18j=10814函數原型作用域函數原型作用域 在函數原型的參數表中說明的標識符所具有的作在函數原型的參數表中說明的標識符所具有的作用域稱為函數原型作用

9、域,用域稱為函數原型作用域,它從其說明處開始,它從其說明處開始,到函數原型說明的結束處結束到函數原型說明的結束處結束。 float tt(int x , float y); /函數函數tt的原型說明的原型說明 由于所說明的標識符與該函數的定義及調用無關,由于所說明的標識符與該函數的定義及調用無關,所以,所以,可以在函數原型說明中只作參數的類型說可以在函數原型說明中只作參數的類型說明,而省略參量名明,而省略參量名。 float tt (int , float); 15int i=0;int workover(int i) i=(i%i)*(i*i)/(2*i)+4); cout“i=“iendl

10、; return i;int rest (int i) i=i2?5:0; return i;void main(void) int i=5; rest(i/2); cout“i=“iendl; rest(i=i/2); cout“i=“iendl; i= rest(i/2); cout“i=“iendl; workover(i) cout“i=“iendl;i=5i=2i=5i=0i=516存儲類存儲類 外存外存內存內存程序程序程程序序區區靜態存儲區靜態存儲區動態存儲區動態存儲區存放程存放程序代碼序代碼存放變量存放變量需要區分變量的存儲類型需要區分變量的存儲類型17作用域作用域全局變量全局變

11、量局部變量局部變量生存期生存期動態存儲變量動態存儲變量靜態存儲變量靜態存儲變量靜態存儲:在文件運行期間有固定的存儲空間,直到文件靜態存儲:在文件運行期間有固定的存儲空間,直到文件運行結束。運行結束。動態存儲:在程序運行期間根據需要分配存儲空間,動態存儲:在程序運行期間根據需要分配存儲空間,函數函數結束后立即釋放空間結束后立即釋放空間。若一個函數在程序中被調用兩次,。若一個函數在程序中被調用兩次,則每次分配的單元有可能不同。則每次分配的單元有可能不同。程序區程序區靜態存儲區靜態存儲區動態存儲區動態存儲區全局變量全局變量靜態局部變量靜態局部變量動態局部變量動態局部變量18局部變量局部變量的分類的分

12、類動態變量(動態變量(auto):默認,存儲在動態區):默認,存儲在動態區寄存器變量(寄存器變量(register):在):在cpu內部存儲內部存儲靜態局部變量(靜態局部變量(static):存儲在靜態區):存儲在靜態區動態局部變量未被賦值時,動態局部變量未被賦值時,其值為隨機值其值為隨機值。其作用域的函。其作用域的函數或復合語句結束時,數或復合語句結束時,空間被程序收回空間被程序收回。程序執行到靜態局部變量時,為其在靜態區開辟存儲空間,程序執行到靜態局部變量時,為其在靜態區開辟存儲空間,該空間一直被保留,該空間一直被保留,直到程序運行結束。直到程序運行結束。由于存儲在靜態區,靜態局部變量或全

13、局變量未賦初值時,由于存儲在靜態區,靜態局部變量或全局變量未賦初值時,系統自動使之為系統自動使之為0。19int fun(int a) int c; static int b=3; c=a+ b+; return c;void main(void) int x=2, y; y=fun(x); coutyendl; y=fun(x+3); coutyendl;x2ya2b3c5455a5只賦一次初值只賦一次初值c9599輸出:輸出:變量變量b是靜態局部變量,在內存是靜態局部變量,在內存一旦開辟空間,就不會釋放,空一旦開辟空間,就不會釋放,空間值一直保留間值一直保留20int f (int a)

14、int b=0; static int c=3; b=b+1; c=c+1; return a+b+c;void main(void) int a=2,i; for (i=0;i3;i+) coutf(a)endl;i=0a=2b=0, b=1c=3, c=4輸出:輸出:7i=1a=2b=0, b=1c=4, c=5輸出:輸出:8i=2a=2b=0, b=1c=5, c=6輸出:輸出:9789只賦一只賦一次初值次初值21int func (int a, int b) static int m=0, i=2; i+=m+1; m=i+a+b; return m; void main(void)

15、int k=4, m=1, p; p=func(k, m); coutpendl; p=func(k, m); coutpendl;func( 4, 1)a=4, b=1m=0, i=2i=3m=3+4+1=8func( 4, 1)a=4, b=1m=8, i=3i=3+8+1=12m=12+4+1=17輸出:輸出:8,1722int q(int x) int y=1; static int z=1; z+=z+y+; return x+z;void main(void) coutq(1)t; coutq(2)t; coutq(3)am; c=a*b; couta“*”b“=“cendl; d

16、= power(m); couta“*”m“=“dendl; 文件文件file2.c中的內容為:中的內容為:extern int a;int power (int n ) int i, y=1; for (i=1; iy)? x : y ; return z; void main (void ) int a,b,c; cinab; c=max (a+b , a*b) ; cout“The max is”cendl; 29使用內聯函數時應注意以下幾點:使用內聯函數時應注意以下幾點:1、C+中,除在函數體內含有循環,中,除在函數體內含有循環,switch分支和復雜嵌分支和復雜嵌套的套的if語句外,

17、所有的函數均可定義為內聯函數。語句外,所有的函數均可定義為內聯函數。2、內聯函數也要定義在前,調用在后。形參與實參之間、內聯函數也要定義在前,調用在后。形參與實參之間的關系與一般的函數相同。的關系與一般的函數相同。3、對于用戶指定的內聯函數,編譯器是否作為內聯函數、對于用戶指定的內聯函數,編譯器是否作為內聯函數來處理由編譯器自行決定。說明內聯函數時,只是請求編來處理由編譯器自行決定。說明內聯函數時,只是請求編譯器當出現這種函數調用時,作為內聯函數的擴展來實現,譯器當出現這種函數調用時,作為內聯函數的擴展來實現,而不是命令編譯器要這樣去做。而不是命令編譯器要這樣去做。4、正如前面所述,內聯函數的

18、實質是采用空間換取時間,、正如前面所述,內聯函數的實質是采用空間換取時間,即可加速程序的執行,當出現多次調用同一內聯函數時,即可加速程序的執行,當出現多次調用同一內聯函數時,程序本身占用的空間將有所增加。如上例中,內聯函數僅程序本身占用的空間將有所增加。如上例中,內聯函數僅調用一次時,并不增加程序占用的存儲間。調用一次時,并不增加程序占用的存儲間。30具有缺省參數值和參數個數可變的函數具有缺省參數值和參數個數可變的函數在在C+中定義函數時,允許給參數指定一個缺中定義函數時,允許給參數指定一個缺省的值。省的值。在調用函數時,若明確給出了這種實在調用函數時,若明確給出了這種實參的值,則使用相應實參

19、的值;若沒有給出相參的值,則使用相應實參的值;若沒有給出相應的實參,則使用缺省的值。(舉例說明)應的實參,則使用缺省的值。(舉例說明) 31int fac(int n=2) int t=1; for(int i=1;i=n;i+) t=t*i; return t;void main(void) cout fac(6) endl;輸出:輸出:720fac( )輸出:輸出:232int area(int long=4 , int width=2) return long* width;void main(void ) int a=8, b=6; cout area(a,b) endl; cout

20、area(a) endl; cout area( ) endl; 4816833使用具有缺省參數的函數時,應注意以下幾點:使用具有缺省參數的函數時,應注意以下幾點:1.不可以靠左邊缺省不可以靠左邊缺省 2.函數原型說明時可以不加變量名函數原型說明時可以不加變量名 float v(float,float=10,float=20);int area(int long , int width=2)int area(int long =4, int width)3.只能在前面定義一次缺省值只能在前面定義一次缺省值,即原型說明時定義,即原型說明時定義了缺省值,后面函數的定義不可有缺省值。了缺省值,后面函

21、數的定義不可有缺省值。錯誤!錯誤!34參數個數可變的函數到目前為止,在定義函數時,都明確規定了函數的參數個數及類型。在調用函數時,實參的個數必須與形參相同。在調用具有缺省參數值的函數時,本質上,實參的個數與形參的個數仍是相同的,由于參數具有缺省值,因此,在調用時可省略。在某些應用中,在定義在某些應用中,在定義函數時,并不能確定函數的參數個數,參數的個數在調時才能確定函數時,并不能確定函數的參數個數,參數的個數在調時才能確定。在C+中允許定義參數個數可變的函數。 35首先,必須包含頭文件“stdarg.h”,因為要用到里面的三個庫函數 va_start( )、va_arg( )和va_end(

22、)。其次,要說明一個va_list類型的變量。va_list與int,float類同,它是C+系統預定義的一個數據類型(非float),只有通過這種類型的變量才能從實際參數表中取出可變有參數。如:va_list ap;ab.ap(va_list)變量(可變參數)va_start(ap,b):初始化va_arg(ap,int):依次取參數va_end(ap):正確結束36va_start():有兩個參數,va_start(ap,b); b即為可變參數前的最后一個確定的參數。va_arg():有兩個參數,va_arg(ap,int) int即為可變參數的數據類型名。int temp;temp=va

23、_arg(ap,int);va_end():完成收尾工作。va_end(ap);在調用參數個數可變的函數時,必定有一個參數指明可變參數的個數或總的實參個數。如第一個參數值為總的實際參數的個數。37使用參數數目可變的函數時要注意以下幾點:1、在定義函數時,固定參數部分必須放在參數表的前面,可變參數在后面,并用省略號“.”表示可變參數。在函數調用時,可以沒有可變的參數。2、必須使用函數va_start()來初始化可變參數,為取第一個可變的參數作好準備工作;使用函數va_arg()依次取各個可變的參數值;最后用函數va_end()做好結束工作,以便能正確地返回。3、在調用參數個數可變的函數時,必定有

24、一個參數指明可變參數的個數或總的實參個數。38函數的重載函數的重載所謂函數的重載是指完成不同功能的函數可以具所謂函數的重載是指完成不同功能的函數可以具有有相同的函數名相同的函數名。 C+的編譯器是根據的編譯器是根據函數的實參函數的實參來確定應該調用來確定應該調用哪一個函數的。哪一個函數的。 int fun(int a, int b) return a+b; int fun (int a) return a*a; void main(void) coutfun(3,5)endl; coutfun(5)endl;82539 1、定義的重載函數必須具有定義的重載函數必須具有不同的參數個數不同的參數個

25、數,或或不同的參數類型不同的參數類型。只有這樣編譯系統才有可能。只有這樣編譯系統才有可能根據不同的參數去調用不同的重載函數。根據不同的參數去調用不同的重載函數。2、僅返回值不同時,不能定義為重載函數。、僅返回值不同時,不能定義為重載函數。即僅函數的類型不同,不能定義為重載函數即僅函數的類型不同,不能定義為重載函數 int fun(int a, int b) return a+b; float fun (int a,int b) return (float) a*a; void main(void) coutfun(3,5)endl; coutfun(3,5)x;coutsin(x)endl;c

26、outsin(x,x)endl;coutsin(x,10)endl;sin(x,x)sin(x,10)不同的參不同的參數類型數類型41int add(int a,int b,int c)return a+b+c; int add(int a,int b)return a+b; void main(void)cout3+5=add(3,5)endl;cout3+5+8=add(3,5,8)endl;不同的參不同的參數個數數個數42高級語言編譯過程高級語言編譯過程源程序源程序(文本文件)(文本文件)*.CPP目標文件目標文件(二進制文件二進制文件)*.OBJ可執行文件可執行文件(二進制文件)(二進

27、制文件)*.EXE庫文件庫文件(各種函數)(各種函數)編譯編譯連接連接編譯預處理編譯預處理C語言提供的編譯預處理的功能有以下三種:語言提供的編譯預處理的功能有以下三種:宏定義宏定義文件包含文件包含條件編譯條件編譯編譯預處理編譯預處理 43宏定義宏定義不帶參數的宏定義不帶參數的宏定義用一個指定的標識符(即名字)來代表一個字符串,用一個指定的標識符(即名字)來代表一個字符串,以后凡在程序中碰到這個標識符的地方都用以后凡在程序中碰到這個標識符的地方都用字符串字符串來代替來代替。這個標識符稱為這個標識符稱為宏名宏名,編譯前編譯前的替代過程稱為的替代過程稱為“宏展開宏展開”。# define 標識符標識

28、符 字符串字符串44#define PRICE 30 void main(void) int num, total; /*定義變量定義變量*/ num=10; /*變量賦值變量賦值*/ total=num*PRICE; couttotal=“totalendl;編譯前用編譯前用30替代替代編譯程序將宏定義的內容認為是編譯程序將宏定義的內容認為是字符串字符串,沒有任,沒有任何實際的物理意義。何實際的物理意義。451、宏展開只是一個簡單的、宏展開只是一個簡單的“物理物理”替換,不做替換,不做語語法檢查法檢查,不是一個語句,不是一個語句,其后不加分號其后不加分號“;”注意:注意:2、#define命

29、令出現在函數的外面,其有效范圍為命令出現在函數的外面,其有效范圍為定義處至本源文件結束。可以用定義處至本源文件結束。可以用# undef命令終止宏命令終止宏定義的作用域。定義的作用域。#define G 9.8void main(void ).# undef Gint max(int a,int b). 463、對程序中用雙引號括起來的字符串內容,即使、對程序中用雙引號括起來的字符串內容,即使與宏名相同,也不進行置換。與宏名相同,也不進行置換。4、在進行宏定義中,可以用已定義的宏名,進行、在進行宏定義中,可以用已定義的宏名,進行層層置換。層層置換。47# define R 3.0# defin

30、e PI 3.1415926# define L 2*PI*R# define S PI*R*Rvoid main(void) cout“L=“L“ S=”Sxy; area=S(x, y); /* area=x*y; */形式參數形式參數實際參數實際參數宏定義宏定義宏調用宏調用定義的宏定義的宏實參代入后還原實參代入后還原49按按#define命令行中指定的字符串從左至右進行置換命令行中指定的字符串從左至右進行置換宏名,字符串中的宏名,字符串中的形參以相應的實參代替形參以相應的實參代替,字符串,字符串中的非形參字符保持不變。中的非形參字符保持不變。#define S(a, b) a*barea

31、=S(3,2)3*2機械機械地將實參代入地將實參代入宏定義的形參形式宏定義的形參形式S(a,b)等同于等同于 a*bS(3,2)等同于等同于 3*250#define PI 3.1415926#define S(r) PI*r*rvoid main(void) float a, area, b; a=3.6; b=4.0; area=S(a); cout“r=“a“narea=”areaendl;S(r)PI*r*rS(a)PI*a*aPI*a*a編譯前機械替換,編譯前機械替換,實參形參一一對應實參形參一一對應51#define PI 3.1415926#define S(r) PI*r*rv

32、oid main(void) float a, area, b; a=1; b=2; area=S(a+b); cout“r=“a“narea=”areaendl;S(r)PI*r*rS(a+b)PI*a+b*a+b編譯前機械替換,編譯前機械替換,實參形參一一對應實參形參一一對應宏展開時實參不運宏展開時實參不運算,不作語法檢查算,不作語法檢查#define S(r) PI*(r)*(r)S(a+b)PI*(a+b)*(a+b)錯誤錯誤52定義宏時在宏名與帶參數的括弧間不能有空格。定義宏時在宏名與帶參數的括弧間不能有空格。#define S_ (r) P*r*r 帶參數的宏與函數調用的區別帶參數

33、的宏與函數調用的區別相同:有實參、形參,代入調用。相同:有實參、形參,代入調用。不同之處:不同之處:1、函數調用先求表達式的值,然后代入形參函數調用先求表達式的值,然后代入形參,而宏只是,而宏只是機械替換機械替換。2、函數調用時形參、實參進行類型定義函數調用時形參、實參進行類型定義,而宏不需要,而宏不需要,只是作為只是作為字符串替代字符串替代。3、函數調用是在運行程序時進行的,其目標代碼短,但函數調用是在運行程序時進行的,其目標代碼短,但程序執行時間長程序執行時間長。而宏調用是在編譯之前完成的,運行時。而宏調用是在編譯之前完成的,運行時已將代碼替換進程序中,目標代碼長,執行時間稍快。已將代碼替

34、換進程序中,目標代碼長,執行時間稍快。一般用宏表示實時的、短小的表達式。一般用宏表示實時的、短小的表達式。53#define A 3#define B(a) (A+1)*a)執行執行 x=3*(A+B(7); 后,后, x的值為的值為:93#define neg(x) (-x)+1)int neg( int x)return x+1; void main(void) int y; y=neg(1); cout“y=“yendl;y=0編譯前機械替換,編譯前機械替換,實參形參一一對應實參形參一一對應(-1)+1)54文件包含文件包含一個源文件可以將另外一個源文件的全部內容包含進來,一個源文件可以

35、將另外一個源文件的全部內容包含進來,即將另外的文件包含到本文件之中。即將另外的文件包含到本文件之中。# include “文件名文件名”file1.cppBA#include “file2.cpp”ABfile1.cppfile2.cpp55注意:注意:1、文件名是、文件名是C的源文件名,是文本文件,后綴名可的源文件名,是文本文件,后綴名可以任選。以任選。*.cpp *.h2、一個、一個#include語句只能指定一個被包含文件。語句只能指定一個被包含文件。3、文件名用雙引號或尖括號括起來。、文件名用雙引號或尖括號括起來。4、包含后所有源文件編譯為一個可執行文件。包含后所有源文件編譯為一個可執

36、行文件。56條件編譯條件編譯C語言允許有選擇地對程序的某一部分進行編譯。語言允許有選擇地對程序的某一部分進行編譯。也就是對一部分源程序指定編譯條件。也就是對一部分源程序指定編譯條件。源程序源程序可以將部分源程序可以將部分源程序不不轉換為機器碼轉換為機器碼57條件編譯有以下幾種形式:條件編譯有以下幾種形式:1、 # ifdef 標識符標識符 程序段程序段1 # else 程序段程序段2 # end if當標識符已被定義過(用當標識符已被定義過(用#define定義定義),則對程序段,則對程序段1進行編譯,進行編譯,否則編譯程序段否則編譯程序段2.# define DEBUG.# ifdef DE

37、BUG coutxtyendl;# endif標識符標識符582、 # ifndef 標識符標識符 程序段程序段1 # else 程序段程序段2 # endif與形式與形式1相反,當標識符沒有被相反,當標識符沒有被定義過(用定義過(用#define定義定義),則對,則對程序段程序段1進行編譯,否則編譯程進行編譯,否則編譯程序段序段2。# define DEBUG.# ifndef DEBUG coutxtyendl;# endif調試完后加調試完后加#define DEBUG,則不輸出,則不輸出調試信息。調試信息。593、 # if 表達式表達式 程序段程序段1 # else 程序段程序段2

38、# endif當表達式為真當表達式為真(非零非零),編譯程序段編譯程序段1,表達式,表達式為零,編譯程序段為零,編譯程序段2。# define DEBUG 1.# if DEBUG coutxtyendl;# endif調試完后改為調試完后改為 #define DEBUG 0,則不輸出調試信息。,則不輸出調試信息。采用條件編譯后,可以使機器代碼程序縮短。采用條件編譯后,可以使機器代碼程序縮短。60以下程序的運行結果是:以下程序的運行結果是:#define DEBUGvoid main(void) int a=14, b=15, c; c=a/b; # ifdef DEBUG cout“a=“o

39、cta“ b=“bendl; # endif cout“c=“deccx1; /從鍵盤輸入從鍵盤輸入x0 do x0=x1; x1=x0-(x0*x0-a)/(2*x0) ; / while (fabs(x1-x0)=1e-6) ;cout”x=”x1endl;)0 x(f)0 x(f0 x1x舊值算本次循環的新值舊值算本次循環的新值上一循環的新值成為本次循環的舊值上一循環的新值成為本次循環的舊值662、弦截法、弦截法f(x)xyx1、在、在x軸上取兩點軸上取兩點x1和和x2, 要確保要確保x1與與x2之間有且只有方程唯一的解之間有且只有方程唯一的解。x1x2f(x1)f(x2)2、x1與與x

40、2分別與分別與f(x)相交于相交于y1=f(x1)、y2=f(x2)。3、做直線通過、做直線通過y1、y2與與x軸交于軸交于x0點。點。x0 x2x04、若、若|f(x0)|滿足給定的精度,則滿足給定的精度,則x0即是方程的解,否則,若即是方程的解,否則,若f(x0)*f(x1)0,則方程的解應在,則方程的解應在x2與與x0之間,令之間,令x1=x0,繼續,繼續做做2 ,直至滿足精度為止。直至滿足精度為止。) 1x(f)2x(f) 1x(f*2x)2x(f*1x0 x67用兩分法求方程的根。用兩分法求方程的根。 x3-5x2+16x-80=0) 1x(f)2x(f) 1x(f*2x)2x(f*

41、1x0 x#include float f (float x)return x*x*x-5*x*x+16*x-80;float xpoint(float x1,float x2) float x0; x0=(x1*f(x2)-x2*f(x1)/(f(x2)-f(x1); return x0;void main(void ) float x1,x2, x0, f0, f1, f2; do coutx1x2; f1=f(x1); f2=f(x2); while (f1*f20); do x0=xpoint(x1,x2); f0=f(x0); if (f0*f1) 0) x1=x0;f1=f0; e

42、lse x2=x0; f2=f0; while (fabs(f0)=0.0001); cout”x=” x0endl;輸入輸入x,輸出,輸出f(x)輸入輸入x1,x2,輸出,輸出x0判斷輸入是否合法判斷輸入是否合法683、兩分法、兩分法f(x)xyx1、在、在x軸上取兩點軸上取兩點x1和和x2, 要確保要確保x1與與x2之間有且只有方程之間有且只有方程唯一的解唯一的解。x1x22、求出、求出x1,x2的中點的中點x0。x0 x2x03、若、若|f(x0)|滿足給定的精度,則滿足給定的精度,則x0即是方程的解,否則,即是方程的解,否則,若若f(x0)*f(x1)0,則方程的解應在,則方程的解應在

43、x2與與x0之間,令之間,令x1=x0,繼續做,繼續做2 ,直至滿足精度為止。直至滿足精度為止。x0=(x1+x2)/269用兩分法求方程的根。用兩分法求方程的根。 x3-5x2+16x-80=0#include float f (float x)return x*x*x-5*x*x+16*x-80;void main(void ) float x1,x2, x0, f0, f1, f2; do coutx1x2; f1=f(x1); f2=f(x2); while (f1*f20); do x0=(x1+x2)/2; f0=f(x0); if (f0*f1) 0) x1=x0;f1=f0;

44、else x2=x0;f2=f0; while (fabs(f0)=0.0001); cout”x=” x0endl;輸入輸入x,輸出,輸出f(x)判斷輸入是否合法判斷輸入是否合法x0=(x1+x2)/2求求x1與與x2的中點的中點70int q(int x) int y=1; static int z=1; z+=z+y+; return x+z;void main(void) coutq(1)t; coutq(2)t; coutq(3)eps; n+) s+=t; t=n*t/(2*n+1); return _ ;main( ) double x; coutx; cout “=“=10)

45、f(n/10); coutnendl;void main(void) f(12345);11212312341234573void main(void) char s; cin.get(s); while(s!=n) switch(s-2) case 0: case 1: couts+4; case 2: couts+4;break; case 3: couts+3; default: couts+2; break; cin.get(s); coutendl; 輸入:輸入:234754545555565774第六章第六章 數組數組 75一維數組的定義和引用一維數組的定義和引用 數組是同一類型的

46、一組值(數組是同一類型的一組值(10個個 char 或或15個個 int) ,在內存中順序存放在內存中順序存放。 整個數組共用一個名字,而其中的每一項又稱整個數組共用一個名字,而其中的每一項又稱為一個元素。為一個元素。一、定義方式:一、定義方式:類型說明符類型說明符 數組名數組名常量表達式常量表達式; int a4; / 表明表明a數組由數組由4個個int型元素組成型元素組成 定義類型定義類型數組名稱數組名稱元素個數元素個數76 int a4; / 表明表明a數組由數組由4個個int型元素組成型元素組成 其元素分別為:其元素分別為:a0, a1, a2, a3 其序號從其序號從0開始開始。若存

47、放首地址為。若存放首地址為2000H,則在,則在內存中為:內存中為:a3a2a1a02010H200CH2008H2004H2000HC+不允許對數組的大小作動態的定義,不允許對數組的大小作動態的定義,即即數組的數組的大小不能是變量大小不能是變量,必須是常量,必須是常量。必須是常數必須是常數77如果要根據不同的數值改變數組的大小,可如果要根據不同的數值改變數組的大小,可用常量表達式。如:用常量表達式。如:#define SIZE 50void main(void) int artSIZE; .78二、一維數組元素的引用二、一維數組元素的引用數組必須先定義,具體引用時(賦值、運算、輸出)其元數組

48、必須先定義,具體引用時(賦值、運算、輸出)其元素素等同于變量等同于變量。void main(void ) int i, a10; for ( i=0; i=0 ; i-) coutait; cout=3) 2113853211.f7f6f5f5f4f3f2f1f0f i=f i-1+f i-2void main (void) int i; int f 20=1,1; for (i=2 ; i20 ; i+ ) f i=f i-1+f i-2; for ( i=0; i20; i+) if (i%5= =0) cout“n”; coutf it; 82下面程序的運行結果是:下面程序的運行結果是:

49、void main(void) int a6, i; for (i=1; i3)%5 ; coutait; iai3440-4隨機隨機a5a4a3a2a1a0輸出:輸出:-4 0 4 4 31-42034445383排序算法排序算法用起泡法對用起泡法對6個數排序(由小到大)個數排序(由小到大)將相鄰的兩個數兩兩比較,將小的調到前頭。將相鄰的兩個數兩兩比較,將小的調到前頭。985420895420859420854920854290854209第一趟第一趟循環循環5次次584209548209542809第二趟第二趟循環循環4次次854209543089543089453089435089430

50、589第三趟第三趟循環循環3次次84430589340589304589304589第四趟第四趟循環循環2次次034589第五趟第五趟循環循環1次次總結:總結:n次數次數趟數趟數j(1n-1)54321n-j12345共有共有6個數個數for (j=1; j=n-1; j+) for (i=1; iai+1) t=ai; ai=ai+1; ai+1=t; 85一般,元素的序號從一般,元素的序號從0開始,因此,程序可以變動如下:開始,因此,程序可以變動如下:for (j=0; jn-1; j+) for (i=0; iai+1) t=ai; ai=ai+1; ai+1=t; 86二維數組的定義和

51、引用二維數組的定義和引用一、定義方式:一、定義方式: 類型說明符類型說明符 數組名數組名常量表達式常量表達式常量表達式常量表達式;int a34; 其元素分別為:其元素分別為:a00, a01, a02, a03, a10, a11, a12, a13, a20, a21, a22, a23 表明表明a數組由數組由34個個int型元素組成型元素組成 定義類型定義類型數組名數組名行數行數列數列數87其行列的序號均其行列的序號均從從0開始開始。若存放首地址為。若存放首地址為2000H,則在內存中為:則在內存中為:a00a01a02a03a10 a11a12a13a20a21a22a232000H2

52、008H2010H 2014H201cH 2020H2028H 202cH即在內存中,多維數組依然是即在內存中,多維數組依然是直線順序直線順序排列的,排列的,第第一個元素位于最低地址處。一個元素位于最低地址處。其元素分別為:其元素分別為:a00, a01, a02, a03, a10, a11, a12, a13, a20, a21, a22, a23 88二、二維數組的引用二、二維數組的引用與一維數組一樣,二維數與一維數組一樣,二維數組必須先定義,其維數必組必須先定義,其維數必須是常量。具體引用時須是常量。具體引用時(賦值、運算、輸出)其(賦值、運算、輸出)其元素等同于變量。元素等同于變量。

53、void main(void) int a23, i, j; cout“Input 2*3 numbersn”; for (i=0; i2; i+) /* 輸入輸入 */ for(j=0; jaij; for (i=0; i2; i+) /* 輸出輸出 */ for(j=0; j3; j+) coutaijt; cout“n”; 輸入:輸入:1 2 3 4 5 6輸出:輸出: _ _ _1_ _ _2_ _ _3 _ _ _4_ _ _5_ _ _6定義定義賦值賦值輸出輸出89三、二維數組的初始化三、二維數組的初始化在定義數組的同時給數組元素賦值。即在編譯階段在定義數組的同時給數組元素賦值。即

54、在編譯階段給數組所在的內存賦值。給數組所在的內存賦值。1、分行賦值、分行賦值int a34=1,2,3,4,5,6,7,8,9,10,11,12;2、順序賦值、順序賦值int a34=1,2,3,4,5,6,7,8,9,10,11,12; /依次賦值依次賦值 903、部分賦值、部分賦值int a34=1,5,9; /* a00=1, a10=5, a20=9 其余元素為其余元素為0 */int a34=0,1,5; /* a00=0, a01=1, a10=5 */ 100050009000010050000000914、分行或全部賦值時,分行或全部賦值時,可以省略第一維,第二維可以省略第一維

55、,第二維不可省。不可省。int a 4=1,2,5,6,7,8,9,10,11,12; 5、不能給數組整體賦值,只能一個一個地賦值。、不能給數組整體賦值,只能一個一個地賦值。 6、用、用static 定義的數組不賦初值,系統均默認其為定義的數組不賦初值,系統均默認其為0。static int a23;int a23=1,2,3,.,12;92void main(void) int a33, i, j; for (i=0; i3; i+) for (j=0; j3; j+) if (i= =2) aij=ai-1ai-1j+1; else aij=j; coutaijt; cout“n”; i=

56、0 a00=0 a01=1 a02=2i=1 a10=0 a11=1 a12=2a20=a1a10+1=a10+1=1i=2a21=a1a11+1=a11+1=2a22=a1a12+1=a12+1=3輸出:輸出:_ _ _0_ _ _1_ _ _ 2 _ _ _0_ _ _1_ _ _ 2 _ _ _1_ _ _2_ _ _ 393有一個有一個3 34 4的矩陣,要求編程序求出其中值最大的矩陣,要求編程序求出其中值最大的那個元素的值,以及其所在的行號和列號。的那個元素的值,以及其所在的行號和列號。 先考慮解此問題的思路。從若干個數中求最大者先考慮解此問題的思路。從若干個數中求最大者的方法很多,

57、我們現在采用的方法很多,我們現在采用“打擂臺打擂臺”算法。如算法。如果有若干人比武,先有一人站在臺上,再上去一果有若干人比武,先有一人站在臺上,再上去一人與其交手,敗者下臺,勝者留臺上。第三個人人與其交手,敗者下臺,勝者留臺上。第三個人再上臺與在臺上者比,同樣是敗者下臺,勝者留再上臺與在臺上者比,同樣是敗者下臺,勝者留臺上。如此比下去直到所有人都上臺比過為止。臺上。如此比下去直到所有人都上臺比過為止。最后留在臺上的就是勝者。最后留在臺上的就是勝者。94程序模擬這個方法,開始時把程序模擬這個方法,開始時把a00a00的的值賦給變量值賦給變量maxmax,maxmax就是開始時的擂主,就是開始時的

58、擂主,然后讓下一個元素與它比較,將二者中然后讓下一個元素與它比較,將二者中值大者保存在值大者保存在maxmax中,然后再讓下一個元中,然后再讓下一個元素與新的素與新的maxmax比,直到最后一個元素比完比,直到最后一個元素比完為止。為止。maxmax最后的值就是數組所有元素中最后的值就是數組所有元素中的最大值。的最大值。95max=a00; /使使max開始時取開始時取a00的值的值 for (i=0;i=2;i+) /從第從第0行到第行到第2行行 for (j=0;jmax)/如果某元素大于如果某元素大于max max=aij; /max將取該元素的值將取該元素的值 row=i; /記下該元

59、素的行號記下該元素的行號i colum=j; /記下該元素的列號記下該元素的列號j coutrowtcolumtmaxendl;96將數組行列式互換。將數組行列式互換。12356789147258369for (i=0; i3; i+) for (j=0; j3; j+) t=aij; aij=aji; aji=t; for (i=0; i3; i+) for (j=0; ji; j+) t=aij; aij=aji; aji=t; 97打印楊輝三角形打印楊輝三角形1 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1aij=ai-1j-1+ai-1j98void main

60、(void)static int n2,i,j,k;for(i=0;i2;i+)nj+=ni+i+1;coutnktnk+endl;2 199以下程序用于從鍵盤上輸入若干個學生的成績,統計出平以下程序用于從鍵盤上輸入若干個學生的成績,統計出平均成績,并輸出低于平均成績的學生成績。均成績,并輸出低于平均成績的學生成績。輸入負數結束輸入負數結束void main() float x100,sum=0, ave,a; int n=0,i; couta; ave=sum/n;cout“ave=“aveendl;for( i=0; _;i+) if(_) cout“x“i“”xiaa=0sum+=an+

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論