1 of 32

陣列

Array

2 of 32

輸入、儲存100筆資料,程式怎麼寫?

要宣告100個變數嗎?? a1, a2, a3,…

寫100行輸入指令?

3 of 32

陣列是什麼?

陣列是一串同型態的變數

int a[10];

double b[5];

一次宣告了10個整數變數

分別是 a[0], a[1], a[2], a[3], a[4]

a[5], a[6], a[7], a[8], a[9]

程式中習慣從0開始數

共10個變數,位置為0~9

a[4]

陣列名稱,命名規則和變數名稱相同

應該取有意義的名稱

4 of 32

陣列怎麼給值(賦值)?

怎麼把一長串的變數都歸零?

int a[100];

a[0]=0;

a[1]=0;

:

:

a[99]=0;

重覆執行

類似的動作

int a[100],i;

for(i=0;i<100;i++){

a[i]=0;

}

100行

3行

使用迴圈可使程式精簡

陣列常搭配迴圈使用

5 of 32

陣列怎麼給值(賦值)?

怎麼讀入100筆整數?

int a[100];

cin >> a[0];

cin >> a[1];

:

:

cin >> a[99];

重覆執行

類似的動作

int a[100],i;

for(i=0;i<100;i++){

cin >> a[i];

}

100行

3行

要將陣列全部內容輸出,也可用迴圈

6 of 32

找不及格

讀入20筆整數,按輸入的順序輸出當中少於60的所有數

int a[20],i;

for(i=0;i<20;i++){

cin >> a[i];

}

for(i=0;i<20;i++){

if(a[i]<60){

cout << a[i] << endl;

}

}

參考答案:

看答案前

請先想想看

重頭檢查,若(if)小於60則輸出

將輸入資料讀到陣列中

7 of 32

求最小值

int a[20],i,min,loc;

for(i=0;i<20;i++){

cin >> a[i];

}

min = a[0];

loc = 0;

for(i=1;i<20;i++){

if(min>a[i]){

min = a[i];

loc = i;

}

}

cout << min << endl << loc+1;

讀入20筆整數,輸出當中最小值為多少,及它是第幾個數

將輸入資料讀到陣列中

min先儲存為第一筆資料

當發現後面有資料更小時

則更新min

loc先記錄為第一筆位置

loc代表最小值的位置(第一筆為0)

並更新loc

由第二筆檢查到最後一筆

min代表最小值大小

第幾個數是位置加1

全部檢查完最後的min, loc

代表最小值和它的位置

8 of 32

求最小值

int a[20],i,min,loc;

for(i=0;i<20;i++){

cin >> a[i];

}

min = a[0];

loc = 0;

for(i=1;i<20;i++){

if(min>a[i]){

min = a[i];

loc = i;

}

}

cout << min << endl << loc+1;

讀入20筆整數,輸出當中最小值為多少,及它是第幾個數

陣列使用時,常需關注

資料和位置的變化

a[4]

資料

位置

4代表第5個變數

9 of 32

j927: 最後倒數

輸入說明:

一開始有一個正整數 N (1<=N<=10),代表後面會出現幾個數字,接下來即是這 N 個整數,最後有一個正整數M。

輸出說明:

請將最後 M 個整數,依原本的順序反向輸出,中間以空格格開。

輸入範例1:

輸入1:

3 1 2 3 2

​

輸出1:

3 2

輸入範例2:

輸入2:

4 2 4 6 8 3

​

輸出2:

8 6 4

10 of 32

j928: 找最大值

輸入說明:

一開始有一個正整數 N (1<=N<=10),代表後面會出現幾個數字,接下來即是這 N 個整數。

輸出說明:

請輸出最大值出現在第幾個位置(位置從 1 開始算),以及它是多少,中間請空一格。

輸入範例1:

輸入1:

3 1 3 2

​

輸出1:

2 3

輸入範例2:

輸入2:

5 444 888 555 777 999

​

輸出2:

5 999

11 of 32

j929: 資料分組

輸入說明:

一開始有一個正整數 N (1<=N<=10),代表後面會出現幾個數字,接下來即是這 N 個整數。最後有一個正整數 M,代表要比較的數。

輸出說明:

請輸出兩個整數,第一個數字為比 M 大的數的個數,第二個數字為比 M 小的數的個數,中間請空一格。

註:出現的數字中,可能會有重覆或是等於 M 的值。

輸入範例1:

輸入1:

3 1 4 3 2

輸出1:

2 1

輸入範例2:

輸入2:

5 5 4 3 2 1 4

​

輸出2:

1 3

12 of 32

找眾數(mode)

讀入20筆整數(範圍在0~100),輸出出現次數最多的數和其次數

int times[101],i,num,mode=0;

for(i=0;i<101;i++){

times[i] = 0;

}

for(i=0;i<20;i++){

cin >> num;

times[num]++;

}

for(i=1;i<101;i++){

if(times[i]>times[mode]){

mode = i;

}

}

cout << mode << endl << times[mode];

將所有數的次數都歸零

眾數(mode)預設為0

存每個數出現的次數

如:times[3]為3出現的次數

重覆讀入20筆數字

並在對應數字的次數+1

記錄各數字出現的總次數

檢查1到100中

如果次數比目前mode多

則更新mode

只檢查1到100

是因為mode已預設是0

只要檢查其他數

是否次數更多

它的次數

出現最多次的數

13 of 32

j930: 一個都不能少

輸入說明:

一開始有兩個正整數 N、M (0<=M<N<=20),N 代表收容人的人數(編號從 1 到 N),M 代表回來的人數,接下來有 M 個正整數,分別代表這 M 位已經回來的收容人編號(不用考慮編號超出範圍或其他錯誤)。

輸出說明:

請將沒有回來的收容人編號從小到大輸出,兩個編號中間請空一格。

輸入範例1:

輸入1:

4 3 1 2 3

​

輸出1:

4

輸入範例2:

輸入2:

5 3 5 3 1

​

輸出2:

2 4

14 of 32

找眾數(mode)

讀入20筆整數(範圍在0~100),輸出出現次數最多的數和其次數

若是數字的範圍不是0~100,是1~100000000的大範圍

要宣告一個times[100000001]的大容量陣列嗎?

但資料內容卻大多是0,只有少數幾個是有數值的

times

[0]

[1]

[2]

[3]

[4]

[5]

…

[100]

​

0

0

1

0

2

0

…

0

Dev-c++ 測試

數值(0~100)

出現次數

以最大可能範圍來宣告

15 of 32

j931: 熱門點播

輸入說明:

一開始有一個正整數 N (1<=N<=20),代表有幾張明信片的點播,接下來有 N 個 1~100000000 的正整數,代表這 N 張明信片所點播的歌曲編號。

輸出說明:

請輸出點播次數最高的歌曲編號,以及它的點播次數(不用考慮最高點播次數的歌曲有兩首以上的情況),中間請空一格。

輸入範例1:

輸入1:

3 10 20 20

​

輸出1:

20 2

輸入範例2:

輸入2:

6 55 33 44 33 22 33

​

輸出2:

33 3

16 of 32

num

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

0

0

0

0

0

0

…

0

times

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

0

0

0

0

0

0

…

0

宣告二個陣列

num存點播的歌曲編號(需先歸零)

times存該歌曲的點播次數(需先歸零)

概念提示

只提示想法,細節靠自己

共只需20個整數的記憶空間

j931: 熱門點播

17 of 32

num

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

0

0

0

0

0

0

…

0

times

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

0

0

0

0

0

0

…

0

概念提示

輸入範例:55 33 44 33 22 33

j931: 熱門點播

18 of 32

num

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

55

0

0

0

0

0

…

0

times

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

1

0

0

0

0

0

…

0

概念提示

輸入範例:55 33 44 33 22 33

讀入的資料先在num中確認是否已存在

若不存在,則加入,在times對應位置加1

j931: 熱門點播

19 of 32

num

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

55

33

0

0

0

0

…

0

times

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

1

1

0

0

0

0

…

0

概念提示

輸入範例:55 33 44 33 22 33

讀入的資料先在num中確認是否已存在

若不存在,則加入,在times對應位置加1

j931: 熱門點播

20 of 32

num

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

55

33

44

0

0

0

…

0

times

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

1

1

1

0

0

0

…

0

概念提示

輸入範例:55 33 44 33 22 33

讀入的資料先在num中確認是否已存在

若不存在,則加入,並在times對應位置加1

j931: 熱門點播

21 of 32

num

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

55

33

44

0

0

0

…

0

times

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

1

2

1

0

0

0

…

0

概念提示

輸入範例:55 33 44 33 22 33

讀入的資料先在num中確認是否已存在

若存在,則在times對應位置加1

j931: 熱門點播

22 of 32

num

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

55

33

44

22

0

0

…

0

times

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

1

2

1

1

0

0

…

0

概念提示

輸入範例:55 33 44 33 22 33

讀入的資料先在num中確認是否已存在

若不存在,則加入,在times對應位置加1

j931: 熱門點播

23 of 32

num

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

55

33

44

22

0

0

…

0

times

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

1

3

1

1

0

0

…

0

概念提示

輸入範例:55 33 44 33 22 33

讀入的資料先在num中確認是否已存在

若不存在,則加入,在times對應位置加1

j931: 熱門點播

24 of 32

num

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

55

33

44

22

0

0

…

0

times

[0]

[1]

[2]

[3]

[4]

[5]

…

[19]

​

1

3

1

1

0

0

…

0

概念提示

輸入範例:55 33 44 33 22 33

在全部資料讀完後

檢查times中最大值的數值及位置

對應的歌曲編號

次數最多

j931: 熱門點播

25 of 32

二維陣列

a[0][0] a[0][1] a[0][2] a[0][3] a[0][4] a[0][5]

int a[5];

int a[5][6];

一維陣列

二維陣列

a[1][0] a[1][1] a[1][2] a[1][3] a[1][4] a[1][5]

a[2][0] a[2][1] a[2][2] a[2][3] a[2][4] a[2][5]

a[3][0] a[3][1] a[3][2] a[3][3] a[3][4] a[3][5]

a[4][0] a[4][1] a[4][2] a[4][3] a[4][4] a[4][5]

第4列第3行,位置是[3][2]

第4列

第3行

26 of 32

二維陣列

int a[20][20],i,j,n;

cin >> n;

for(i=0;i<n;i++){

for(j=0;j<n;j++){

cin >> a[i][j];

}

}

例:讀入方陣(列數=行數)

輸入範例:

3

1 2 3

4 5 6

0 1 2

a

[0]

[1]

[2]

…

[19]

[0]

​

​

​

​

​

[1]

​

​

​

​

​

[2]

​

​

​

​

​

:

​

​

​

​

​

[19]

​

​

​

​

​

n

3

i

​

j

​

27 of 32

二維陣列

int a[20][20],i,j,n;

cin >> n;

for(i=0;i<n;i++){

for(j=0;j<n;j++){

cin >> a[i][j];

}

}

例:讀入方陣(列數=行數)

輸入範例:

3

1 2 3

4 5 6

0 1 2

a

[0]

[1]

[2]

…

[19]

[0]

1

​

​

​

​

[1]

​

​

​

​

​

[2]

​

​

​

​

​

:

​

​

​

​

​

[19]

​

​

​

​

​

n

3

i

0

j

0

28 of 32

二維陣列

int a[20][20],i,j,n;

cin >> n;

for(i=0;i<n;i++){

for(j=0;j<n;j++){

cin >> a[i][j];

}

}

例:讀入方陣(列數=行數)

輸入範例:

3

1 2 3

4 5 6

0 1 2

a

[0]

[1]

[2]

…

[19]

[0]

1

2

​

​

​

[1]

​

​

​

​

​

[2]

​

​

​

​

​

:

​

​

​

​

​

[19]

​

​

​

​

​

n

3

i

0

j

1

29 of 32

二維陣列

int a[20][20],i,j,n;

cin >> n;

for(i=0;i<n;i++){

for(j=0;j<n;j++){

cin >> a[i][j];

}

}

例:讀入方陣(列數=行數)

輸入範例:

3

1 2 3

4 5 6

0 1 2

a

[0]

[1]

[2]

…

[19]

[0]

1

2

3

​

​

[1]

​

​

​

​

​

[2]

​

​

​

​

​

:

​

​

​

​

​

[19]

​

​

​

​

​

n

3

i

0

j

2

30 of 32

二維陣列

int a[20][20],i,j,n;

cin >> n;

for(i=0;i<n;i++){

for(j=0;j<n;j++){

cin >> a[i][j];

}

}

例:讀入方陣(列數=行數)

輸入範例:

3

1 2 3

4 5 6

0 1 2

a

[0]

[1]

[2]

…

[19]

[0]

1

2

3

​

​

[1]

4

​

​

​

​

[2]

​

​

​

​

​

:

​

​

​

​

​

[19]

​

​

​

​

​

n

3

i

1

j

0

31 of 32

二維陣列

int a[20][20],i,j,n;

cin >> n;

for(i=0;i<n;i++){

for(j=0;j<n;j++){

cin >> a[i][j];

}

}

例:讀入方陣(列數=行數)

輸入範例:

3

1 2 3

4 5 6

0 1 2

a

[0]

[1]

[2]

…

[19]

[0]

1

2

3

​

​

[1]

4

5

6

​

​

[2]

0

1

2

​

​

:

​

​

​

​

​

[19]

​

​

​

​

​

n

3

i

2

j

2

32 of 32

矩陣轉置

輸入說明:

一開始有兩個正整數 N、M (0<=M<N<=20),N代表矩陣有幾列,M代表矩陣有幾行, 接下來有N行資料,每行有M個整數,為矩陣的內容。

輸出說明:

請將矩陣列行對調,轉置輸出

輸入範例1:

輸入1:

2 3

1 2 3

4 5 6

​

輸出1:

1 4

2 5

3 6

輸入範例2:

輸入2:

3 2

1 0

3 2

4 8

輸出2:

1 3 4

0 2 8