《C語言程序設計》課件第5章_第1頁
《C語言程序設計》課件第5章_第2頁
《C語言程序設計》課件第5章_第3頁
《C語言程序設計》課件第5章_第4頁
《C語言程序設計》課件第5章_第5頁
已閱讀5頁,還剩62頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

第5章數組5.1一維數組

5.2二維數組

5.3字符數組

5.1一維數組

5.1.1一維數組的定義格式

一維數組的定義格式如下:

類型說明符

數組名[常量表達式];

例如,語句“floata[6],b[10];”表示定義了一個可存放6個float類型數據的一維數組a和一個可存放10個float類型數據的一維數組b。

說明:

(1)數組名應符合標識符的命名規則,例如a12、gain_ratio是合法的數組名。

(2)方括號內的常量表達式表示數組元素的個數,即數組長度??梢允钦统A炕蛘统A勘磉_式,也可以是符號常量,但不能包含變量。

(3)數組的數據類型既可以是基本類型,也可以是構造類型等。

(4)?C編譯系統為數組分配連續的內存單元。數組元素的相對次序由下標來表示。數組元素的下標是從0開始的整數。

上面定義的數組a的存儲示意圖如圖5.1所示。圖5.1數組的存儲示意圖5.1.2一維數組的引用

在C語言中不能引用整個數組,只能引用單個數組元素。一個數組元素相當于一個變量,它的使用與同類型的普通變量是相同的。但數組元素特定的引用形式會給編程帶來很多方便。

一維數組元素的引用形式為

數組名[下標]

說明:

(1)數組名后面方括號內是數組下標,下標表示該元素是數組的第幾個元素。數組名后面方括號內的內容只有在數組定義時才是數組的長度,其他時候都是數組下標。

(2)數組元素的下標是整型的常量、變量或表達式。下標的取值范圍是0~數組長度-1的整型值。

(3)?C程序運行時,編譯系統并不檢查數組元素的下標是否越界,需要編程人員自己保證數組元素的下標不要越界。

例如,對于語句“floata[8];intx=2;”,數組元素a[0]、a[6]、a[5+1]、a[x]、a[3*x]都是合法引用;而a[-5]、a[8]、a[5.2]?是非法的引用。注意,a[8]?雖然非法,但是編譯系統不報錯。對a[8]的操作實際是對內存其他空間的操作,因此可能造成嚴重后果。5.1.3一維數組的初始化

數組的初始化就是給數組元素賦初值。數組的初始化操作既可以在數組定義之后進行,也可以在數組定義時進行。

如果在數組定義之后進行初始化操作,則只能對每個數組元素一一賦值。例如:

intarr[10],i;

for(i=0;i<10;i++)arr[i]=i;

如果在定義數組時完成數組的初始化操作,則需要將數組元素的初值依次放在一對花括號中,并用賦值符號與數組連接。定義數組時賦初值的形式為

類型說明符數組名[常量表達式]={初值列表};說明:

(1)花括號內各個初值之間用逗號分隔,數值類型必須與數組類型一致。系統將按初值的排列順序給數組元素賦值。例如,語句“intarr[10]={0,1,2,3,4,5,6,7,8,9};”在定義數組arr的同時,將0、1、2、3、4、5、6、7、8、9依次賦給數組元素arr[0]、arr[1]、arr[2]、arr[3]、arr[4]、arr[5]、arr[6]、arr[7]、arr[8]、arr[9]。

(2)花括號中初值的數量必須小于等于數組長度。當初值數量小于數組長度時,數值型數組的后面沒有初值的元素由系統自動賦值為0。例如,對于語句“intarr[6]={0,1,2};”arr[0]、arr[1]、arr[2]?的值依次為0、1、2,其他元素即arr[3]、arr[4]、arr[5]?的值均為0。

(3)若給數組的所有元素賦初值,可以省略數組的長度。系統會根據所賦初值的個數確定數組的長度。例如,語句“intarr[]={1,2,3,4,5,6,7,8,9,10};”定義數組arr的長度為10,相當于語句“intarr[10]={1,2,3,4,5,6,7,8,9,10};”。

5.1.4一維數組應用舉例

【例5.1】

求10個整數的平均值。

問題分析:首先輸入10個整數,然后對這10個整數求和,再求平均值,最后輸出結果。

程序如下:程序運行結果如圖5.2所示。圖5.2例5.1的運行結果

【例5.2】

編寫程序,找出10個整數中的最小值及其位置。

問題分析:首先輸入10個整數,然后找出其中的最小值及其位置,最后輸出結果。其中最主要的功能是求最小值及其位置,完成這一功能的主要步驟如下:

(1)定義變量min以記錄最小值的位置,即下標號,程序開始時假定第一個數為最小值,也就是位置min為0;

(2)將min位置的數和數組的下一個數進行比較,如果下一個數更小,則更改min值為更小數的位置;

(3)比較完數組中所有的數,位置min上的數就是最小值,否則轉向步驟(2)繼續執行。

假設數組x的10個數依次為3、2、7、1、4、8、5、11、4、9,則尋找最小值及其位置的過程應該為

同樣的方式將x[min]?依次與x[5]、x[6]、x[7]、x[8]、x[9]?相比較。每次比較均為x[min]?小,因此min值不變,最終min的值為3。圖5.3例5.2的運行結果類似地,請思考如何查找一個數列中最大值的位置。

【例5.3】

在遞減的有序數列中,插入一個數x,使得數列仍然有序(如果有相同的數則不插入)。

問題分析:本題相當于在一個有序的數組中尋找合適的位置插入一個元素。問題的解決可分為兩個步驟:

(1)尋找插入位置:由于是遞減的序列,所以插入位置應該是在第一個小于x的數組元素的前面(假定找到的位置為k);

(2)如果第k個元素等于x,則不須插入,否則執行插入操作:

①第k個元素及其后面的元素都后移一位。

②插入元素在k位置。

程序如下:圖5.4例5.3的運行結果請思考:移動元素可不可以從前面的元素開始移動(即先移動插入位置的元素,最后移動最后一個元素)?為什么?如果可以有重復數據,程序該如何編寫?

【例5.4】

用冒泡法對10個數進行排序(由小到大)。冒泡法思路是:從前到后掃描數據序列,比較相鄰兩個數的大小,將小的數調到前頭,大的數沉底。假設對6個數據進行排序的過程如圖5.5所示。圖5.5冒泡法排序原理圖問題分析:假設有6個數據,第一次將8和9進行比較后對調,第二次將9(下沉了一位)和5進行比較后對調……直到所有的數均比較完畢后,9已沉到了最底層,這時,最小的數0上浮了一位,經第一趟(共5次)后,已得到最大的數。然后進行第二趟對余下來的數據進行比較,第二趟要比第一趟少比較1次,即只需4次即可比較出最大的數。依次類推,比較完畢后得到的就是按順序排列的數據。

對10個數排序的程序如下:運行結果如圖5.6所示。圖5.6例5.4的運行結果 5.2二維數組

含有兩個下標的數組稱為二維數組,其中的數據是按照行列的格式排列的,即數據分為若干行、若干列。C語言規定:二維數組的行下標和列下標均是從0開始的。

5.2.1二維數組的定義格式

二維數組的定義格式如下:

類型說明符數組名[常量表達式1][常量表達式2];

例如,語句“intb[4][3];”表示定義了一個具有4行3列的整型數據的二維數組b。說明:

(1)二維數組定義中,數組名、數據類型的定義方式和一維數組相同,不同的只是數組名后面緊跟兩個方括號;兩個常量表達式,常量表達式1表示數組的行數,常量表達式2表示每行數據的個數,即列數。數組的元素個數就是兩個常量表達式之積。

(2)二維數組只是在邏輯上是二維的,從存儲上看,二維數組仍然存儲在一維線性空間。C語言中,按照行優先方式存儲二維數組,即先存放第0行的元素,再連續存放第1行的元素……例如,上面定義的b是一個4行3列的數組,它在內存中的存儲示意圖如圖5.7所示,它是一維線性存儲空間。圖5.74行3列的數組在內存中的存儲示意圖5.2.2二維數組的引用

二維數組也只能引用單個數組元素,不能引用整個數組。二維數組元素的引用形式為

數組名[下標1][下標2]

二維數組的下標可以是整型的變量、常量或表達式。第一維下標的取值范圍是0~第一維長度?-1,第二維下標的取值范圍是0~第二維長度?-1。例如,在語句“intb[4][3];”之后引用數組b的元素b[0][2]、b[1+1][1]、b[i][j](i、j為整型變量)是合法的引用方式,而b[2][3]、b[1.2][2]、b[6][0]、b[1,2]、b[2],[0]、b(1,2)、b(3)(1)是非法的引用方式?;ɡㄌ杻雀鱾€初值之間用逗號分隔,初值類型必須與數組類型一致。系統自動按數組元素在內存的順序將初值依次賦給相應的元素。數值型數組的初值數量不足時,將0賦給其余數組元素。例如,語句“intx[2][3]={1,2,3,4,5};”之后,系統自動按數組x的元素在內存的順序將初值依次賦給相應的元素,即x[0][0]=1,x[0][1]=2,x[0][2]=3,x[1][0]=4,x[1][1]=5。其余元素被自動賦值為0,如x[1][2]=0。

(2)賦初值時,每一行的初值放在一個花括號中,所有行的初值再放在一個花括號中。具體格式為

類型說明符數組名[常量表達式1][常量表達式2]={{第0行初值列表},{第1行初值列表},…};系統將第一個花括號內數據依次賦值給數組的第0行,將第二個花括號內數據依次賦值給數組的第1行,依次類推。例如,語句“intx[4][4]={{1,2,3,4},{4,5,6},{},{7}};”之后,系統將1、2、3、4依次賦給x[0][0]、x[0][1]、x[0][2]和x[0][3];4、5、6依次賦給x[1][0]、x[1][1]和x[1][2],沒有列出初值的元素系統自動賦0;對應第2行的“{}”,系統給x[2][0]、x[2][1]、x[2][2]和x[2][3]均賦值0;第3行對應{7},則系統將7賦值給x[3][0],而x[3][1]、x[3][2]和x[3][3]均被系統賦值為0。5.2.4二維數組應用舉例

【例5.5】

將一個二維數組行和列元素互換后,存到另一個二維數組中,如圖5.8所示。圖5.8二維數組元素互換示意圖圖5.9例5.5的運行結果

【例5.6】

編寫程序:求一個M行N列的矩陣和一個N行W列的矩陣的乘積。

M行N列的矩陣A與N行W列的矩陣B相乘,乘積矩陣C為M行W列,其元素的計算公式為

程序運行結果如圖5.10所示。圖5.10例5.6的運行結果

【例5.7】

編程序查找矩陣的鞍點并輸出。所謂矩陣的鞍點,就是其值在所在行最小,而在所在列最大的元素。

問題分析:根據鞍點的定義,每行都可能有一個鞍點,所以要逐行查找。查找第i行鞍點的過程可分為兩個步驟:

(1)找出第i行最小值的列位置k。

(2)判斷第i行第k列元素在第k列是否最大。如果最大則是鞍點;如果不是,則第i行中無鞍點。判斷是否為最大值的方式是看是否有比a[i][k]大的值。

程序如下:輸入了以下一個有鞍點矩陣后的運行結果如圖5.11所示。

圖5.11例5.7的運行結果 5.3字符數組

5.3.1字符數組的定義和引用

字符數組是指數組元素為字符型的數組。字符數組的定義、引用、初始化方式和其他類型數組非常類似。但是由于字符數組是文字型數據,因此其使用方式又有不同之處。

一維字符數組的定義格式為

char數組名[常量表達式];

如果需存放多個字符串,則需要定義二維字符數組。二維字符數組的定義格式為

char數組名[常量表達式1][常量表達式2];字符數組元素也可通過數組名和下標引用。

字符數組也可以在定義時初始化,方法和其他類型的數組一樣,例如:

charstr1[3][8]={{'r','e','d'},{'y','e','l','l','o','w'},{'g','r','e','e','n'}};

注意:若沒有對字符數組全部元素賦值,編譯系統會對剩余的元素自動賦值為空字符??兆址?\0'來表示,它是ASCII碼值為0的字符,表示什么都不做,也不顯示。

在定義字符數組之后,只能逐個給數組元素賦值,例如:

charstr2[8];

str2[0]='a';str2[1]='b';str2[2]='c';str2[3]='d';

對字符數組元素的操作只要符合字符類型的操作規則即可。圖5.12例5.8的運行結果如果輸入“AF5ab#$djaxf!”,則程序的運行結果如圖5.13所示。圖5.13例5.9的運行結果5.3.2字符串和字符數組

1.字符串的表示

編程者用字符數組處理字符串時,關心的不是數組的長度,而是有效字符串的長度。C語言中不保存字符串的長度,因此需要在字符串末尾加字符串結束標志

空字符'\0'以表示字符串結束。對于字符串常量,編譯系統處理時會自動在字符串末尾處加上'\0'。因此,含有n個字符的字符串常量在內存中占n+1個字節的空間,第n+1個字節存放'\0'。例如,"s"表示含有一個字母s的字符串,在內存保存的是字母s和空字符'\0'的ASCII碼值,占兩個字節。""表示空串,在內存中保存的是空字符'\0'的ASCII碼值,占一個字節。""表示一個含有一個空格的字符串,在內存中占兩個字節;''表示空格字符,在內存中占一個字節。圖5.14例5.10的運行結果

2.字符串常量賦給字符數組

若在定義字符數組的同時賦初值,則可將字符串常量賦給該字符數組。例如:

charc[20]={"Thegreatwall"};

習慣上可以省略花括號,上面定義寫為

charc[20]="Thegreatwall";

數組c在內存中存儲的示意圖如圖5.15所示。圖5.15數組c在內存中存儲示意圖說明:

(1)若定義字符數組時完成賦初值,則可以在定義中省略數組的長度。系統會根據所賦字符串常量的實際長度來確定字符數組的長度。如上述定義也可寫為

charc[]="Thegreatwall";

系統會自動確定數組c的長度為15。

(2)字符串常量末尾處有系統自動加的結束標志'\0',所以要求數組長度比字符串長度至少大1。例如:

charc[14]="Thegreatwall";

這條語句中數組c不能滿足字符串長度。

(3)除了數組定義時可以將字符串直接付給字符數組外,其他時刻只能對元素進行賦值。例如,不能用語句“c="string";”對字符數組c賦值。圖5.16例5.11的運行結果

(注意這里Γ??是四個未知字符造成的)

charstr1[]="Thisisastring";和charstr2[]={'T','h','i','s','','i','s','','a','','s','t','r','i','n','g','\0'}是等效的,在內存中存儲了字符串?"Thisisastring"?和一個?'\0',數組長度都為17。但charstr3[]={'T','h','i','s','','i','s','','a','','s','t','r','i','n','g'?}這條語句在內存中存放了'T'、'h'、'i'、's'、''、'i'、's'、''、'a'、''、's'、't'、'r'、'i'、'n'、'g'?共16個字符,數組長度為16。因為輸出str3時沒有找到結束標志,超出了數組范圍,所以輸出了四個未知字符。5.3.3常用字符串處理函數

為了簡化程序設計的復雜度,C語言提供了大量處理字符串的庫函數。這里僅介紹幾個常用的函數。

1.字符串輸入函數gets

1)格式

gets(字符數組)

2)功能

接收從鍵盤輸入的一個字符串(可包含空格)并存放在字符數組中。函數的返回值是字符數組的起始地址。

溫馨提示

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

評論

0/150

提交評論