嵌入式C語言基礎編程—5年程式設計師給你講一二維數組,精品課

it百科大學堂 發佈 2020-05-16T05:34:03+00:00

本文主要是對C基礎編程關於一二維數組的初步講解,後續會深入講解C高級相關的概念(C大神可先略過)。 本人近期會陸續上傳IT編程相關的資料和視頻教程,可以關注一下互相交流:C C++ Java python linux ARM 嵌入式 物聯網等。

本文主要是對C基礎編程關於一二維數組的初步講解,後續會深入講解C高級相關的概念(C大神可先略過)。 本人近期會陸續上傳IT編程相關的資料和視頻教程,可以關注一下互相交流:C C++ Java python linux ARM 嵌入式 物聯網等。想學編程的朋友進入主頁即可看到相關教程和資料。

本文主要講述的內容為:

1.0一維數組的定義和引用

1.1一維數組的定義方式

1.2一維數組元素的引用

1.3一維數組的初始化

1.4一維數組程序舉例

2.0二維數組的定義和引用

2.1二維數組的定義

2.2二維數組元素的引用

2.3二維數組的初始化

2.4二維數組程序舉例

在程序設計中,為了處理方便,把具有相同類型的若干變量按有序的形式組織起來。這些 按序排列的同類數據元素的集合稱為數組。在C語言中,數組屬於構造數據類型。一個數組 可以分解為多個數組元素,這些數組元素可以是基本數據類型或是構造類型。因此按數組元 素的類型不同,數組又可分為數值數組、字符數組、指針數組、結構數組等各種類別。本章 介紹數值數組和字符數組,其餘的在以後各章陸續介紹。

7.1 一維數組的定義和引用

7.1.1 一維數組的定義方式

在C語言中使用數組必須先進行定義。一維數組的定義方式為:

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

其中:

類型說明符是任一種基本數據類型或構造數據類型。 數組名是用戶定義的數組標識符。

方括號中的常量表達式表示數據元素的個數,也稱為數組的長度。 例如:

int a[10]; 說明整型數組 a,有 10 個元素。

float b[10], c[20]; 說明實型數組 b,有 10 個元素,實型數組 c,有 20 個元素。 char ch[20]; 說明字符數組 ch,有 20 個元素。

對於數組類型說明應注意以下幾點:

1) 數組的類型實際上是指數組元素的取值類型。對於同一個數組,其所有元素的數據類型 都是相同的。

2) 數組名的書寫規則應符合標識符的書寫規定

3)數組名不能與其它變量名相同。例如:

是錯誤的。

4) 方括號中常量表達式表示數組元素的個數,如 a[5]表示數組 a 有 5 個元素。但是其下標從 0 開始計算。因此 5 個元素分別為 a[0],a[1],a[2],a[3],a[4]。

5) 不能在方括號中用變量來表示元素的個數, 但是可以是符號常數或常量表達式。例如:

是合法的。

但是下述說明方式是不推薦使用。


註:C99 標準支持變長數組(VLA),上述定義在支持 C99 標準的編譯器下都是沒有問題的。但是考慮到程序的移植性,不要使用變長數組。

6) 允許在同一個類型說明中,說明多個數組和多個變量。不推薦。 例如:

int a, b, c, d, k1[10], k2[20];

7.1.2 一維數組元素的引用


數組元素是組成數組的基本單元。數組元素也是一種變量, 其標識方法為數組名後跟一個下標。下標表示了元素在數組中的順序號。

數組元素的一般形式為: 數組名[下標]

其中下標只能為整型常量或整型表達式。如為小數時,C 編譯將自動取整。例如:

a[5]

a[i+j]

a[i++]

都是合法的數組元素。

數組元素通常也稱為下標變量。必須先定義數組, 才能使用下標變量。在C語言中只能逐個地使用下標變量,而不能一次引用整個數組。

例如,輸出有 10 個元素的數組必須使用循環語句逐個輸出各下標變量: for(i=0; i<10; i++)

printf("%d", a[i]);

而不能用一個語句輸出整個數組。下 面 的 寫 法 是 錯 誤 的 : printf("%d", a);

【例 7.1】

【例 7.2】


本例中用一個循環語句給 a 數組各元素送入奇數值,然後用第二個循環語句輸出各個奇數。在第一個 for 語句中,表達式 3 省略了。在下標變量中使用了表達式 i++,用以修改循環變量。當然第二個 for 語句也可以這樣作,C語言允許用表達式表示下標。 程序中最後一個 printf 語句輸出了兩次 a[5]的值,可以看出當下標不為整數時將自動取整。

7.1.3 一維數組的初始化

給數組賦值的方法除了用賦值語句對數組元素逐個賦值外,還可採用初始化賦值和動態 賦值的方法。

數組初始化賦值是指在數組定義時給數組元素賦予初值。數組初始化是在編譯階段進行 的。這樣將減少運行時間,提高效率。

初始化賦值的一般形式為:

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

其中在{ }中的各數據值即為各元素的初值,各值之間用逗號間隔。例如:

int a[10]={ 0,1,2,3,4,5,6,7,8,9 };

相當於 a[0]=0;a[1]=1...a[9]=9;

C語言對數組的初始化賦值還有以下幾點規定:

1) 可以只給部分元素賦初值。

當{ }中值的個數少於元素個數時,只給前面部分元素賦值。例如:

int a[10]={0,1,2,3,4};

表示只給 a[0]~a[4]5 個元素賦值,而後 5 個元素自動賦 0 值。

2) 只能給元素逐個賦值,不能給數組整體賦值。 例如給十個元素全部賦 1 值,只能寫為:

int a[10]={1,1,1,1,1,1,1,1,1,1};

而不能寫為:

int a[10]=1;

3) 如給全部元素賦值,則在數組說明中, 可以不給出數組元素的個數。例如:

int a[5]={1,2,3,4,5};

可寫為:

int a[]={1,2,3,4,5};

7.1.4 一維數組程序舉例


可以在程序執行過程中,對數組作動態賦值。這時可用循環語句配合 scanf 函數逐個對數組元素賦值。

【例 7.3】

本例程序中第一個 for 語句逐個輸入 10 個數到數組 a 中。 然後把 a[0]送入 max 中。在第二個 for 語句中,從 a[1]到 a[9]逐個與 max 中的內容比較,若比 max 的值大,則把該下標變量送入 max 中,因此 max 總是在已比較過的下標變量中為最大者。比較結束,輸出 max 的值。

【例 7.5】


本例程序中用了兩個並列的for 循環語句,在第二個for 語句中又嵌套了一個循環語句。第一個 for 語句用於輸入 10 個元素的初值。第二個 for 語句用於排序。本程序的排序採用逐個比較的方法進行。在 i 次循環時,把第一個元素的下標 i 賦於 p,而把該下標變量值 a[i] 賦於 q。然後進入小循環,從 a[i+1]起到最後一個元素值逐個與 a[i]作比較,有比 a[i]大者則將其下標送 p,元素值送 q。一次循環結束後,p 即為最大元素的下標,q 則為該元素值。若此時 i≠p,說明 p,q 值均已不是進入小循環之前所賦之值,則交換 a[i]和 a[p]之值。 此時 a[i]為已排序完畢的元素。輸出該值之後轉入下一次循環。對 i+1 以後各個元素排序。

7.2 二維數組的定義和引用

7.2.1 二維數組的定義

前面介紹的數組只有一個下標,稱為一維數組,其數組元素也稱為單下標變量。在實際 問題中有很多量是二維的或多維的,因此C語言允許構造多維數組。多維數組元素有多個下 標,以標識它在數組中的位置,所以也稱為多下標變量。本小節只介紹二維數組,多維數組 可由二維數組類推而得到。

二維數組定義的一般形式是:

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

其中常量表達式 1 表示第一維下標的長度,常量表達式 2 表示第二維下標的長度。例如:

int a[3][4];

說明了一個三行四列的數組,數組名為 a,其下標變量的類型為整型。該數組的下標變量共有 3×4 個,即:

a[0][0],a[0][1],a[0][2],a[0][3]

a[1][0],a[1][1],a[1][2],a[1][3]

a[2][0],a[2][1],a[2][2],a[2][3]

二維數組在概念上是二維的,即是說其下標在兩個方向上變化,下標變量在數組中的位置也處於一個平面之中,而不是象一維數組只是一個向量。但是,實際的硬體存儲器卻是連續編址的,也就是說存儲器單元是按一維線性排列的。 如何在一維存儲器中存放二維數組, 可有兩種方式:一種是按行排列, 即放完一行之後順次放入第二行。另一種是按列排列, 即放完一列之後再順次放入第二列。在C語言中,二維數組是按行排列的。

即:

先存放 a[0]行,再存放 a[1]行,最後存放 a[2]行。每行中有四個元素也是依次存放。由於數組 a 說明為 int 類型,該類型占兩個字節的內存空間,所以每個元素均占有兩個字節)。

7.2.2 二維數組元素的引用


二維數組的元素也稱為雙下標變量,其表示的形式為:

數組名[下標][下標]

其中下標應為整型常量或整型表達式。例如:

a[3][4]

表示 a 數組三行四列的元素。

下標變量和數組說明在形式中有些相似,但這兩者具有完全不同的含義。數組說明的方 括號中給出的是某一維的長度,即可取下標的最大值;而數組元素中的下標是該元素在數組 中的位置標識。前者只能是常量,後者可以是常量,變量或表達式。

【例 7.6】一個學習小組有 5 個人,每個人有三門課的考試成績。求全組分科的平均成績和各科總平均成績。


可設一個二維數組 a[5][3]存放五個人三門課的成績。再設一個一維數組 v[3]存放所求得各分科平均成績,設變量 average 為全組各科總平均成績。編程如下:


程序中首先用了一個雙重循環。在內循環中依次讀入某一門課程的各個學生的成績,並把這些成績累加起來,退出內循環後再把該累加成績除以 5 送入 v[i]之中,這就是該門課程的平均成績。外循環共循環三次,分別求出三門課各自的平均成績並存放在 v 數組之中。退出外循環之後,把 v[0],v[1],v[2]相加除以 3 即得到各科總平均成績。最後按題意輸出各個成績。

7.2.3 二維數組的初始化

二維數組初始化也是在類型說明時給各下標變量賦以初值。二維數組可按行分段賦值,

也可按行連續賦值。

例如對數組 a[5][3]:

1) 按行分段賦值可寫為:

int a[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85,87,90},{76,77,85} };

2) 按行連續賦值可寫為:

int a[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90,76,77,85};

這兩種賦初值的結果是完全相同的。

【例 7.7】

對於二維數組初始化賦值還有以下說明:

1) 可以只對部分元素賦初值,未賦初值的元素自動取 0 值。例如:

int a[3][3]={{1},{2},{3}};

是對每一行的第一列元素賦值,未賦值的元素取 0 值。 賦值後各元素的值為:

1 0 0

2 0 0

3 0 0

int a [3][3]={{0,1},{0,0,2},{3}};

賦值後的元素值為:

0 1 0

0 0 2

3 0 0

2) 如對全部元素賦出值,則第一維的長度可以不給出。 例如:

int a[3][3]={1,2,3,4,5,6,7,8,9};

可以寫為:

int a[][3]={1,2,3,4,5,6,7,8,9};

3) 數組是一種構造類型的數據。二維數組可以看作是由一維數組的嵌套而構成的。設 一維數組的每個元素都又是一個數組,就組成了二維數組。當然,前提是各元素類 型必須相同。根據這樣的分析,一個二維數組也可以分解為多個一維數組。C語言 允許這種分解。

如二維數組 a[3][4],可分解為三個一維數組,其數組名分別為:

a[0]

a[1]

a[2]

對這三個一維數組不需另作說明即可使用。這三個一維數組都有 4 個元素,例如: 一維數組 a[0]的元素為 a[0][0],a[0][1],a[0][2],a[0][3]。

必須強調的是,a[0],a[1],a[2]不能當作下標變量使用,它們是數組名,不是一個 單純的下標變量。

7.2.4 二維數組程序舉例


7.3 程序舉例


【例 7.8】在二維數組 a 中選出各行最大的元素組成一個一維數組 b。

b=(87 108 37)

本題的編程思路是,在數組 A 的每一行中尋找最大的元素,找到之後把該值賦予數組 B 相應的元素即可。程序如下:


程序中第一個 for 語句中又嵌套了一個 for 語句組成了雙重循環。外循環控制逐行處理, 並把每行的第 0 列元素賦予 l。進入內循環後,把 l 與後面各列元素比較,並把比 l 大者賦予 l。內循環結束時 l 即為該行最大的元素,然後把 l 值賦予 b[i]。等外循環全部完成時, 數組 b 中已裝入了 a 各行中的最大值。後面的兩個 for 語句分別輸出數組 a 和數組 b。

【例 7.9】輸入五個國家的名稱按字母順序排列輸出。

本題編程思路如下:五個國家名應由一個二維字符數組來處理。然而C語言規定可以把 一個二維數組當成多個一維數組處理。 因此本題又可以按五個一維數組處理, 而每一個一維數組就是一個國家名字符串。用字符串比較函數比較各一維數組的大小,並排序,輸出結 果即可。

編程如下:

本程序的第一個 for 語句中,用 gets 函數輸入五個國家名字符串。上面說過C語言允許把一個二維數組按多個一維數組處理,本程序說明 cs[5][20]為二維字符數組,可分為五個一維數組 cs[0],cs[1],cs[2],cs[3],cs[4]。因此在 gets 函數中使用 cs[i]是合法的。 在第二個 for 語句中又嵌套了一個 for 語句組成雙重循環。這個雙重循環完成按字母順序排序的工作。在外層循環中把字符數組 cs[i]中的國名字符串拷貝到數組 st 中,並把下標 i 賦予P。進入內層循環後,把 st 與 cs[i]以後的各字符串作比較,若有比 st 小者則把該字符串拷貝到 st 中,並把其下標賦予 p。內循環完成後如 p 不等於 i 說明有比 cs[i]更小的字符串出現,因此交換 cs[i]和 st 的內容。至此已確定了數組 cs 的第 i 號元素的排序值。然後輸出該字符串。在外循環全部完成之後即完成全部排序和輸出。

關鍵字: