完整版第6章數(shù)組_第1頁
完整版第6章數(shù)組_第2頁
完整版第6章數(shù)組_第3頁
完整版第6章數(shù)組_第4頁
完整版第6章數(shù)組_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、10001004100810201036第6章數(shù)組6.1怎樣定義和引用一維數(shù)組6.1.1怎樣定義一維數(shù)組一般格式:類型數(shù)組名常量表達(dá)式;如:int a10;說明:(1)數(shù)組名的命名規(guī)則遵循C語言的標(biāo)識符;(2)常量表達(dá)式,用來指定該數(shù)組中元素的個數(shù),也就是該數(shù)組的長度。該長度必須在這里是一個常量表達(dá)式(數(shù)字常量、符號常量),不能是變量。由于前面已經(jīng)指定了類型,指定了元素個數(shù)后,該數(shù)組一共占用的空間大小就確定 了,口:上例,a是int型,每個int型在VC中占4字節(jié),而后面又定義了 10 個元素,所以,a共占用了 4*10=40個字節(jié)的空間;(3)可以使用sizeof運算來求出某個數(shù)組占用了多少

2、空間;特別強調(diào),其中常量表達(dá)式不能是變量,如:int n=10;int an;/錯誤,因為n是變量#defi ne N 10int bN;/正確,因為N是符號常量int cN+3;/正確的,因為N+3是常量表達(dá)式對于以下定義:int a10;那么,系統(tǒng)就會在內(nèi)存中劃出一片存儲空間,女口右圖:顯然,每個元素在內(nèi)存中都是連續(xù)的,從而可以 根據(jù)上一個元素的地址,來計算出下一個元素的地址, 假設(shè)a的第0個元素存在1000地址上,那么,a5的 地址:Add(a0)+5*4=1020。而對 ai的地址:Add(ai)=Add(a0+i*4)(4)數(shù)組定義后,元素的排列是從a0開始的,因此定義的int a1

3、0 中, 只有a0a9,并不存在a10這個元素。(5)數(shù)組定義后,其中的每個元素的值都是不確定的(就是不知道值為多 少,也可以說是隨機的),如果想要在定義時就有初值,可以有兩種方法:方法一:用static來修飾,那么,該數(shù)組中的每個元素都會被初始化為0:static int b10;/數(shù)組b中的10個元素每個值都是0int a10;/數(shù)組a中的10個元素值不確定方法二:在定義時,同時給出值,如:int c10=1,2,3;/ 給出了 3 個值如果所給的值比數(shù)組元素少,那么后面的每個元素都會自動初始化成0,如上面的 c 數(shù)組,后面的 c3c9 都是 0(6)前面第 4 點說了,定義的 a10 的

4、元素是從 a0a9 ,沒有 a10 這 個元素,如果在程序中引用了 a10,實際上是一種“越界錯誤”,但是在VC中, 一般還發(fā)現(xiàn)不了。6.1.2 怎樣引用一維數(shù)組元素引用一維數(shù)組元素最常用的方法就是: 數(shù)組名 下標(biāo)如上面定義的:int a10=1,2,3; 現(xiàn)在要引用第 2 個數(shù): a2=123;還可以有別的引用方式:(1)引用時,下標(biāo)可以是變量: for(i=0;i10;i+)ai=2*i;其中的 ai 就是引用;(2) 可以仿照后面的指針進行引用,如要引用a5 元素: *(a+5)=345;6.1.3 一維數(shù)組的初始化一維數(shù)組的通常初始化方式:( 1 )在定義數(shù)組時,全部數(shù)組元素賦予初值,

5、如:int a10=1,2,3,4,5,6,7,8,9,10;如果給出了所有的元素的值, 那么, 在定義時元素的個數(shù)可以省略, 如上面 的a,后面已經(jīng)給了 10個元素的值,那么可以省略10:int a =1,2,3,4,5,6,7,8,9,10;(2)可以只給數(shù)組中的一部分元素賦初值,如:int a10=1,2,3;只給了 3 個元素的值,那么后面所有的元素全部取為 0(3)如果想給數(shù)組每個元素都取為 0, 可以寫為:int a10=0;6.1.4 一維數(shù)組應(yīng)用舉例Eg6.1 :通常引用一維數(shù)組的方式,就是用一個 for 循環(huán),如:int a10;int i;/ 要對 a 進行賦初值,可以用一

6、個 for 循環(huán)進行: for(i=0;i10;i+)/i 是從 0 開始,到 9 結(jié)束,用的是 10,不能用 =10ai=2*i;/如果要用戶輸入10個元素進行賦初值,可以用scanffor(i=0;i=0;i-)ai=2*i;/要處理數(shù)組a,實際上只能對a中的元素一個一個進行,無法進行整體操 作,如:for(i=0;i10;i+)ai=ai*2;/輸出數(shù)組,也是一個元素一個元素進行輸出,通常也是用一個 for :for(i=0;i10;i+)printf(%5d,ai);/每個元素占5個位置,從而在屏幕上對齊Eg6.2 :已知有一個數(shù)組a如下:int a10=1,2,3,4,5,6,7,8

7、,9,10;現(xiàn)在要將a數(shù)組逆置,就是原來a0的值變成a9的值等。方法一:再定義一個數(shù)組b,其大小與a相同,將a中的元素反過來賦值給 b,從而b就達(dá)到了 a的逆置,再將a拷貝回去即可。如下圖所示:0123456789123456789100123456789b那么b0的值來自于a9,而b3的值來自于a6,ai的值來自 于b9-i,這樣,可以編程如下:for(i=0;i10;i+)bi=a9-i;再將b拷回去:for(i=0;i10;i+)ai=bi;方法二:不需要數(shù)組b,直接在a中進行,實際上只需要讓a0與a9進 行交換,a1與a8進行交換,ai與a9-i進行交換便可,注意這個交換只能交換一次,

8、不能重復(fù)交換,也就是說,要控制循環(huán)的次數(shù),對于10個元素來說,只要交換5對元素,對于有n個元素來說,要交換n/2對元素:int t;for(i=0;i=5;j-) aj+1=aj;用變量表示,n表示原來數(shù)組a中的元素個數(shù),k表示要插入的元素位置, 可得:for(j=n-1;j=k;j-) aj+1=aj;最后一步,就是將元素x插入到ak位置上去:ak=x;完整的代碼如下:void mai n()int a20=49,27,36,58,64,19,72,86,31;int n=9;/數(shù)組a中原來有9個數(shù)int k=5;/向第k個位置中插入元素xint x=99;/欲插入的元素值int i,j;p

9、rintf(n插入前,數(shù)組 a:);for(i=0;i =k;j-)/從ak這個元素開始,每個元素向后挪動一個位置,注意要從后往前開始挪動aj+1=aj;ak=x;/元素x插入到ak中。n+;/元素個數(shù)加1printf(n插入手,數(shù)組 a:);for(i=0;i n ;i+)prin tf(%5d,ai);putchar(n);Eg6.4 :刪除:從數(shù)組中指定位置刪除一個元素,如,原來的數(shù)組a:int a20=49,27,36,58,64,19,72,86,31;現(xiàn)在要刪除a中的第5個位置的元素19,效果如下:a20=49,27,36,58,64,19,72,86,31;01234567891

10、9492736586419728631012345678919492736586472863131顯然,需要挪動的元素個數(shù)為:9-5-1 (原來數(shù)組中元素個數(shù)-要插入的位置 -1 ),這些元素應(yīng)該是:a6、a7、a8這3個元素,就是先將a6移動到a5, 再將a7移動到a6上,以此類推,aj應(yīng)該移動到aj-1個位置上去,可得 如下的程序段:for(j=k+1;j n ;j+)aj-1=aj;n-;Eg6.5 :用數(shù)組求Fibonacci數(shù)列問題,打印出前20個元素,并求和Fibonacci 數(shù)列是:1,1,2,3,5,8,顯然,可以讓a0=1,a1=1,從a2開始,每個元素都為前面兩個元素的和,

11、也就是說,ai=ai-1+ai-2; 這個i應(yīng)該從2開始到19結(jié)束??删幊倘缦拢篿nt a30;int i,sum=0;a0=1;a1=1;sum+=a0+a1;for(i=2;i20;i+) ai=ai-1+ai-2; sum+=ai;printf(”前 20 個 Fibonacci 數(shù)列為:n);for(i=0;ia10-a20-a30-a40-a11-a21-a39-a49那么在這種存放方式下,a27的地址=1000+(7*5+2)*4 也就是說, aij 的地址 Add(aij)=1000+(j*5+i)*46.1.2 怎樣引用二維數(shù)組引用二維數(shù)組需要給出行下標(biāo)和列下標(biāo)來,如:a23=

12、123;6.1.3 二維數(shù)組的初始化(1 )在定義時進行:int a35=1,2,3,4,5, 6,7,8,9,10, 11,12,13,14,15;(2)在定義時,也可以只用一個大括號:int a35=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15(3)也可以在定義時,只給某些元素賦初值,如:int a35=1,2,6,11,12,13,14;那么,像 a02 、a13 等元素的初值系統(tǒng)會自動取為 0(4)還可以在定義時,只給某些行取初值:int a35=1,2,11,12,13,14;則第 1 行中的所有元素全部取為 0(5)如果給初值時,已經(jīng)明確給出了幾行,那么定

13、義時行號可以省略,如: int a 5=1,2,6, 11,12,13,14;已經(jīng)明確給了 3行的值,那么行數(shù) 3可以省略(6) 如果將所有的元素全部給了值,且不是用若干個 來表示行,也可以 省略行號,如:int a 5=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15因為已經(jīng)給了 15 個元素,且每行有 5 個元素,那么系統(tǒng)會自動取 3 行,但 是,如果給的不是 15個元素,而是 17個元素,那么系統(tǒng)知道,應(yīng)該取 4 行,且 后面的 3 個元素自動取為 0.(7) 如果在定義時,沒有取初值,那么可以在程序用一般用一個二重循環(huán) 進行賦值,如:int a510;int i,

14、j;for(i=0;i5;i+)/04 行for(j=0;j10;j+)/09 列aij=i+j;(8) 在輸出一個二維數(shù)組時,通常會每行占一行,就是說,需要控制輸出 格式:for(i=0;i5;i+)/04 行for(j=0;j10;j+)/09 列printf(%5d,aij);putchar(n); / 換行6.1.4 二維數(shù)組應(yīng)用舉例Eg6.8 用二維數(shù)組輸出楊輝三角,所謂楊輝三角,就是每個元素都等于其 上一行的對應(yīng)元素及其前一元素的和:111121133 1146 4 11510 10 5 1可以用二維數(shù)組實現(xiàn),第0行不用,且每行的第 0列也不用,從第 1行開始, 第 1 列取為 1

15、 ,然后后面每個元素均為前一行的對應(yīng)元素的和,如:aij=ai-1j+ai-1j-1且第 i 行應(yīng)該有 i 個元素,可得下圖:int a2020=0; / 全部初始化為 0int i,j;a11=1;for(i=2;i=10;i+)for(j=1;j=i;j+)/第i行,只需要計算i個元素aij=ai-1j+ai-1j-1;/下面開始打印這個楊輝三角for(i=1;i=10;i+)for(j=1;j=i;j+)prin tf(%7d,aij);putchar(n);8000000000010011001210013310000012364570123456789Eg 6.9用二維數(shù)組計算矩陣:

16、(1)矩陣的查找(2)矩陣的和(3)矩陣的積(4)行列互換先看查找,從一個二維數(shù)組中,查找一個指定的值(最大值、最小值、指定 的元素值等),如有如下的二維數(shù)組:int a34=49,56,23,64,78,61,19,41,23,38,88,97;則最大值為97,其位置為:第2行的第3個最小值為19,位置為第1行的第2個仍然可以使用二維數(shù)組,先假定 a00是最大值maxint max,l_max_i,l_max_j;/ 分別表示最大值及其位置max=a00;l_max_i=0;l_max_j=0;for(i=0;i3;i+)for(j=0;jmax) max=aij; l_max_i=i; l

17、_max_j=j;如果要找 x=78:int l_x_i,l_x_j;int x=78;int flag=0;/ 先假定沒找到for(i=0;i3;i+)for(j=0;j4;j+)if(aij=x)l_x_i=i;l_x_j=j;flag=1;break;if(flag=1)break; / 已經(jīng)找到,直接退出該循環(huán)if(flag=1)/ 找到了,輸出相應(yīng)的信息else/ 沒找到,此時的 l_x_i 和 l_x_j 沒有意義6.3 字符數(shù)組在定義一維數(shù)組時,如果類型為 char 型,那么這個一維數(shù)組就是是字符數(shù) 組,如:int a10;char s10;字符數(shù)組與int型數(shù)組沒有本質(zhì)的區(qū)別,

18、與int型數(shù)組類似,可以進行上面 的操作。但是,字符數(shù)組如果在末尾加一個0之后,該字符數(shù)組就有更多的應(yīng)用。如:char s120=Chi nese;char s220=C,h,i, n,e,s,e;char s3 = C,h,i, n,e,s,e;char s47= C,h,i, n,e,s,e;char s58= C,h,i, n,e,s,e;char s6 =Chi nese;其中s3沒有指定數(shù)組的大小,系統(tǒng)會自動去數(shù)后面的數(shù)(7個),那么,S3 就取成7個char型大小,所以s3與s4是等價的。對于s5來說,后面只有7個字符,但是前面大小為8,則有一個a7沒有 初值,系統(tǒng)會自動取為0,所以s5相當(dāng)于:char s58= C,h,i, n,e,s,e,0;對于s2來說,大小為20個元素,顯然,后面有13個0:chars220=C,h,i, n,e,s,e,0,0,0,0,0,0,0,0,0

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論