Langsung ke konten
Belajar C++

Array 2D

35 menit Pemula

Tujuan Pembelajaran

  • Memahami konsep array 2D sebagai tabel baris x kolom
  • Mendeklarasikan dan menginisialisasi array 2D
  • Mengakses elemen dengan dua index: baris dan kolom
  • Menggunakan nested loop untuk menelusuri array 2D
  • Membuat program matriks nilai dan papan permainan sederhana

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

Diberikan array: int tabel[2][3] = {{1, 2, 3}, {4, 5, 6}}. Apa nilai dari tabel[1][2]?

Nested Loop Array 2D

Lengkapi program berikut agar mencetak semua elemen matriks 2x3. Output harus persis: 1\t2\t3\n4\t5\t6
#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

KonsepPenjelasan
Array 2DArray berbentuk tabel: baris x kolom
Deklarasiint m[baris][kolom];
Akses elemenm[i][j] — baris i, kolom j
InisialisasiPakai kurung kurawal bertingkat: {{...}, {...}}
TraverseNested loop: loop luar = baris, loop dalam = kolom
Jumlah elemenbaris x kolom (misal 3x4 = 12 elemen)
TransposeTukar baris dan kolom: t[j][i] = m[i][j]
Contoh penggunaanTabel 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!