Array 2D
Di pelajaran sebelumnya, array-mu hanya punya satu baris — seperti deretan loker. Tapi bagaimana kalau kamu mau menyimpan data dalam bentuk tabel? Misalnya, nilai 5 siswa untuk 3 mata pelajaran? Nah, kamu butuh array 2 dimensi!
Analogi: Spreadsheet atau Papan Catur
Kamu pasti pernah lihat spreadsheet (Excel/Google Sheets), kan? Data disusun dalam baris dan kolom. Setiap sel punya alamat: baris ke-berapa, kolom ke-berapa.
Array 2D persis seperti itu!
Array 2D "nilai" (3 baris x 4 kolom):
Kolom 0 Kolom 1 Kolom 2 Kolom 3
┌─────────┬─────────┬─────────┬─────────┐
Baris 0 │ 85 │ 90 │ 78 │ 92 │
├─────────┼─────────┼─────────┼─────────┤
Baris 1 │ 76 │ 88 │ 95 │ 82 │
├─────────┼─────────┼─────────┼─────────┤
Baris 2 │ 90 │ 72 │ 85 │ 88 │
└─────────┴─────────┴─────────┴─────────┘
Akses: nilai[1][2] = 95 (baris 1, kolom 2)
Atau bayangkan papan catur — 8 baris dan 8 kolom. Setiap kotak punya posisi: papan[baris][kolom].
Deklarasi Array 2D
// Deklarasi tanpa inisialisasi
int matrix[3][4]; // 3 baris, 4 kolom
// Deklarasi dengan inisialisasi
int nilai[3][4] = {
{85, 90, 78, 92}, // baris 0
{76, 88, 95, 82}, // baris 1
{90, 72, 85, 88} // baris 2
};
// Semua elemen jadi 0
int kosong[3][4] = {};
Akses elemen: namaArray[baris][kolom]
nilai[0][0]= 85 (baris 0, kolom 0)nilai[1][2]= 95 (baris 1, kolom 2)nilai[2][3]= 88 (baris 2, kolom 3)
Contoh 1: Array 2D Pertamaku
#include <iostream>
int main() {
int tabel[2][3] = {
{1, 2, 3},
{4, 5, 6}
};
// Akses elemen satu per satu
std::cout << "Baris 0, Kolom 0: " << tabel[0][0] << std::endl;
std::cout << "Baris 0, Kolom 2: " << tabel[0][2] << std::endl;
std::cout << "Baris 1, Kolom 1: " << tabel[1][1] << std::endl;
// Ubah elemen
tabel[1][2] = 99;
std::cout << "Setelah diubah, [1][2]: " << tabel[1][2] << std::endl;
return 0;
}
Output:
Baris 0, Kolom 0: 1
Baris 0, Kolom 2: 3
Baris 1, Kolom 1: 5
Setelah diubah, [1][2]: 99
Contoh 2: Nested Loop untuk Traverse
Untuk menelusuri semua elemen array 2D, kamu butuh nested loop — loop dalam loop:
#include <iostream>
int main() {
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
int baris = 3;
int kolom = 4;
for (int i = 0; i < baris; i++) {
for (int j = 0; j < kolom; j++) {
std::cout << matrix[i][j] << "\t";
}
std::cout << std::endl;
}
return 0;
}
Output:
1 2 3 4
5 6 7 8
9 10 11 12
Pola nested loop untuk array 2D: loop luar (i) menelusuri baris, loop dalam (j) menelusuri kolom. Ini seperti membaca buku — kiri ke kanan (kolom), lalu pindah baris baru.
Contoh 3: Matriks Nilai Siswa
Contoh paling relevan buat kamu — tabel nilai beberapa siswa untuk beberapa mata pelajaran:
#include <iostream>
#include <string>
int main() {
const int SISWA = 4;
const int MAPEL = 3;
std::string namaSiswa[SISWA] = {"Andi", "Budi", "Citra", "Dewi"};
std::string namaMapel[MAPEL] = {"MTK", "IPA", "BIndo"};
int nilai[SISWA][MAPEL] = {
{85, 90, 78}, // Andi
{76, 88, 92}, // Budi
{92, 75, 85}, // Citra
{88, 82, 90} // Dewi
};
// Cetak tabel
std::cout << "=== TABEL NILAI ===" << std::endl;
std::cout << "Nama\t";
for (int j = 0; j < MAPEL; j++) {
std::cout << namaMapel[j] << "\t";
}
std::cout << "Rata2" << std::endl;
std::cout << "-----------------------------------" << std::endl;
for (int i = 0; i < SISWA; i++) {
std::cout << namaSiswa[i] << "\t";
int total = 0;
for (int j = 0; j < MAPEL; j++) {
std::cout << nilai[i][j] << "\t";
total += nilai[i][j];
}
double rataRata = static_cast<double>(total) / MAPEL;
std::cout << rataRata << std::endl;
}
return 0;
}
Output:
=== TABEL NILAI ===
Nama MTK IPA BIndo Rata2
-----------------------------------
Andi 85 90 78 84.3333
Budi 76 88 92 85.3333
Citra 92 75 85 84
Dewi 88 82 90 86.6667
Contoh 4: Input Array 2D dari User
#include <iostream>
int main() {
const int BARIS = 2;
const int KOLOM = 3;
int data[BARIS][KOLOM];
// Input
std::cout << "Masukkan " << BARIS * KOLOM << " angka:" << std::endl;
for (int i = 0; i < BARIS; i++) {
for (int j = 0; j < KOLOM; j++) {
std::cout << "data[" << i << "][" << j << "] = ";
std::cin >> data[i][j];
}
}
// Output
std::cout << std::endl << "Tabel yang dimasukkan:" << std::endl;
for (int i = 0; i < BARIS; i++) {
for (int j = 0; j < KOLOM; j++) {
std::cout << data[i][j] << "\t";
}
std::cout << std::endl;
}
return 0;
}
Output (contoh):
Masukkan 6 angka:
data[0][0] = 10
data[0][1] = 20
data[0][2] = 30
data[1][0] = 40
data[1][1] = 50
data[1][2] = 60
Tabel yang dimasukkan:
10 20 30
40 50 60
Contoh 5: Papan Tic-Tac-Toe
Array 2D sempurna untuk papan permainan!
#include <iostream>
int main() {
char papan[3][3] = {
{'X', 'O', 'X'},
{' ', 'X', 'O'},
{'O', ' ', 'X'}
};
std::cout << "=== TIC-TAC-TOE ===" << std::endl;
std::cout << " 0 1 2" << std::endl;
for (int i = 0; i < 3; i++) {
std::cout << i << " ";
for (int j = 0; j < 3; j++) {
std::cout << "[" << papan[i][j] << "]";
if (j < 2) std::cout << " ";
}
std::cout << std::endl;
}
// Cek apakah posisi kosong
int baris, kolom;
std::cout << std::endl << "Masukkan posisi (baris kolom): ";
std::cin >> baris >> kolom;
if (baris >= 0 && baris < 3 && kolom >= 0 && kolom < 3) {
if (papan[baris][kolom] == ' ') {
papan[baris][kolom] = 'O';
std::cout << "Berhasil menempatkan O!" << std::endl;
} else {
std::cout << "Posisi sudah terisi!" << std::endl;
}
} else {
std::cout << "Posisi di luar papan!" << std::endl;
}
return 0;
}
Output (contoh input “1 0”):
=== TIC-TAC-TOE ===
0 1 2
0 [X] [O] [X]
1 [ ] [X] [O]
2 [O] [ ] [X]
Masukkan posisi (baris kolom): 1 0
Berhasil menempatkan O!
Contoh 6: Peta Grid Sederhana
#include <iostream>
int main() {
// 0 = jalan, 1 = tembok, 2 = pintu, 3 = harta
int peta[5][5] = {
{1, 1, 2, 1, 1},
{0, 0, 0, 0, 1},
{1, 0, 1, 0, 1},
{1, 0, 1, 0, 0},
{1, 1, 1, 1, 3}
};
std::cout << "=== PETA DUNGEON ===" << std::endl;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
switch (peta[i][j]) {
case 0: std::cout << ". "; break; // jalan
case 1: std::cout << "# "; break; // tembok
case 2: std::cout << "D "; break; // pintu
case 3: std::cout << "$ "; break; // harta
}
}
std::cout << std::endl;
}
std::cout << std::endl;
std::cout << "Keterangan:" << std::endl;
std::cout << "# = Tembok" << std::endl;
std::cout << ". = Jalan" << std::endl;
std::cout << "D = Pintu" << std::endl;
std::cout << "$ = Harta" << std::endl;
return 0;
}
Output:
=== PETA DUNGEON ===
# # D # #
. . . . #
# . # . #
# . # . .
# # # # $
Keterangan:
# = Tembok
. = Jalan
D = Pintu
$ = Harta
Contoh 7: Transpose Matriks (Bonus)
Transpose artinya menukar baris menjadi kolom dan sebaliknya:
#include <iostream>
int main() {
const int BARIS = 2;
const int KOLOM = 3;
int asli[BARIS][KOLOM] = {
{1, 2, 3},
{4, 5, 6}
};
int transpose[KOLOM][BARIS]; // Ukuran terbalik!
// Proses transpose
for (int i = 0; i < BARIS; i++) {
for (int j = 0; j < KOLOM; j++) {
transpose[j][i] = asli[i][j];
}
}
// Cetak asli
std::cout << "Matriks asli (" << BARIS << "x" << KOLOM << "):" << std::endl;
for (int i = 0; i < BARIS; i++) {
for (int j = 0; j < KOLOM; j++) {
std::cout << asli[i][j] << "\t";
}
std::cout << std::endl;
}
// Cetak transpose
std::cout << std::endl;
std::cout << "Matriks transpose (" << KOLOM << "x" << BARIS << "):" << std::endl;
for (int i = 0; i < KOLOM; i++) {
for (int j = 0; j < BARIS; j++) {
std::cout << transpose[i][j] << "\t";
}
std::cout << std::endl;
}
return 0;
}
Output:
Matriks asli (2x3):
1 2 3
4 5 6
Matriks transpose (3x2):
1 4
2 5
3 6
Kunci transpose: transpose[j][i] = asli[i][j]. Index baris dan kolom ditukar! Matriks 2x3 menjadi 3x2.
Kesalahan Umum
1. Tertukar baris dan kolom
int matrix[3][4]; // 3 baris, 4 kolom
// SALAH — akses kolom 4 padahal hanya ada 0-3
// matrix[0][4] = 10; // Out of bounds!
// BENAR
matrix[0][3] = 10; // Kolom terakhir
2. Loop salah batas
int m[3][4];
// SALAH — batas loop tertukar!
for (int i = 0; i < 4; i++) { // harusnya < 3 (baris)
for (int j = 0; j < 3; j++) { // harusnya < 4 (kolom)
std::cout << m[i][j];
}
}
// BENAR
for (int i = 0; i < 3; i++) { // baris: 0, 1, 2
for (int j = 0; j < 4; j++) { // kolom: 0, 1, 2, 3
std::cout << m[i][j];
}
}
3. Lupa bahwa deklarasi harus [baris][kolom]
// Membaca: 3 baris, 4 kolom
int tabel[3][4];
// Akses: tabel[nomor_baris][nomor_kolom]
tabel[2][3] = 99; // Baris ke-3, kolom ke-4
Latihan
Latihan 1: Buat program yang menyimpan nilai 3 siswa untuk 4 mata pelajaran dalam array 2D. Hitung dan tampilkan rata-rata setiap siswa dan rata-rata setiap mata pelajaran.
Latihan 2: Buat papan permainan 4x4 berisi angka 1-16. Tampilkan papan dengan format tabel yang rapi. Lalu minta user memasukkan posisi (baris, kolom) dan tampilkan angka di posisi tersebut.
Latihan 3: Buat program yang menjumlahkan dua matriks 2x3. Minta user menginput kedua matriks, lalu tampilkan hasil penjumlahan. Ingat: penjumlahan matriks = elemen di posisi yang sama dijumlahkan.
Untuk Latihan 1, kamu butuh dua proses: loop per baris (untuk rata-rata siswa) dan loop per kolom (untuk rata-rata mata pelajaran). Rata-rata per kolom sedikit lebih tricky — loop luar di kolom, loop dalam di baris.
Akses Elemen Array 2D
Nested Loop Array 2D
#include <iostream> int main() { int m[2][3] = {{1, 2, 3}, {4, 5, 6}}; for (int i = 0; i < ; i++) { for (int j = 0; j < ; j++) { std::cout << m[i][j] << "\t"; } std::cout << std::endl; } return 0; }
Ringkasan
| Konsep | Penjelasan |
|---|---|
| Array 2D | Array berbentuk tabel: baris x kolom |
| Deklarasi | int m[baris][kolom]; |
| Akses elemen | m[i][j] — baris i, kolom j |
| Inisialisasi | Pakai kurung kurawal bertingkat: {{...}, {...}} |
| Traverse | Nested loop: loop luar = baris, loop dalam = kolom |
| Jumlah elemen | baris x kolom (misal 3x4 = 12 elemen) |
| Transpose | Tukar baris dan kolom: t[j][i] = m[i][j] |
| Contoh penggunaan | Tabel nilai, papan permainan, peta grid, matriks |
Array 2D membuka banyak kemungkinan — dari tabel nilai sampai game sederhana! Tapi baik array 1D maupun 2D punya satu keterbatasan: ukurannya tetap dan harus ditentukan saat compile. Di pelajaran berikutnya, kamu akan belajar std::vector — array yang bisa berubah ukuran secara dinamis!