陣列
Array
輸入、儲存100筆資料,程式怎麼寫?
要宣告100個變數嗎?? a1, a2, a3,…
寫100行輸入指令?
陣列是什麼?
陣列是一串同型態的變數
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]
陣列名稱,命名規則和變數名稱相同
應該取有意義的名稱
陣列怎麼給值(賦值)?
怎麼把一長串的變數都歸零?
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行
使用迴圈可使程式精簡
陣列常搭配迴圈使用
陣列怎麼給值(賦值)?
怎麼讀入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行
要將陣列全部內容輸出,也可用迴圈
找不及格
讀入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則輸出
將輸入資料讀到陣列中
求最小值
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
代表最小值和它的位置
求最小值
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個變數
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
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
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
找眾數(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
只要檢查其他數
是否次數更多
它的次數
出現最多次的數
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
找眾數(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)
出現次數
以最大可能範圍來宣告
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
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: 熱門點播
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: 熱門點播
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: 熱門點播
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: 熱門點播
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: 熱門點播
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: 熱門點播
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: 熱門點播
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: 熱門點播
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: 熱門點播
二維陣列
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行
二維陣列
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 | |
二維陣列
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 |
二維陣列
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 |
二維陣列
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 |
二維陣列
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 |
二維陣列
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 |
矩陣轉置
輸入說明:
一開始有兩個正整數 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