Masukkan Password
27 The Complete Kotlin Course #26- Multiplication Table - Kotlin Tutorials for Beginners
Exercise ini sangat bagus karena sebenarnya bukan sekadar latihan for, tetapi latihan untuk belajar memecah masalah menjadi algoritma.
Exercise 2 — Membuat Tabel Perkalian 1–5
Target akhirnya kira-kira seperti ini:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
Prinsip utamanya:
Nilai setiap cell = baris × kolom
Contohnya:
baris 2, kolom 3
2 × 3 = 6
atau:
baris 5, kolom 5
5 × 5 = 25
1. Jangan langsung berpikir tentang kode
Ini bagian paling penting dari video.
Sebelum menulis Kotlin, kita harus melihat pola masalahnya.
Perhatikan tabel:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
Ada dua hal yang berulang:
Baris
Kita punya:
baris 1
baris 2
baris 3
baris 4
baris 5
Kolom
Di setiap baris juga ada:
kolom 1
kolom 2
kolom 3
kolom 4
kolom 5
Nah, dari sini kita bisa mulai berpikir:
“Ada sesuatu yang berulang di dalam sesuatu yang berulang.”
Itulah tanda kuat bahwa kita membutuhkan nested loop.
2. Kenapa membutuhkan nested loop?
Kita sudah belajar sebelumnya bahwa:
for (i in 1..5) {
println(i)
}
hanya mempunyai satu loop.
Hasilnya:
1
2
3
4
5
Kita hanya berjalan dalam satu dimensi.
Tetapi tabel memiliki dua dimensi:
column
↓
1 2 3 4 5
row 1 ? ? ? ? ?
2 ? ? ? ? ?
3 ? ? ? ? ?
4 ? ? ? ? ?
5 ? ? ? ? ?
Jadi kita membutuhkan:
- loop untuk row
- loop untuk column
Sehingga bentuk pikirannya:
for setiap row
for setiap column
kerjakan sesuatu
Dalam Kotlin:
for (row in 1..5) {
for (column in 1..5) {
// lakukan sesuatu
}
}
Ini disebut nested loop.
3. Cara membaca nested loop
Bagian ini sangat penting.
Misalnya:
for (row in 1..5) {
for (column in 1..5) {
println("$row, $column")
}
}
Jangan berpikir:
“Outer loop jalan sekali, lalu inner loop jalan sekali.”
Bukan begitu.
Yang terjadi adalah:
Ketika row = 1
Inner loop berjalan sampai selesai:
row = 1, column = 1
row = 1, column = 2
row = 1, column = 3
row = 1, column = 4
row = 1, column = 5
Baru kemudian:
row = 2
Inner loop dimulai lagi dari awal:
row = 2, column = 1
row = 2, column = 2
row = 2, column = 3
row = 2, column = 4
row = 2, column = 5
Begitu seterusnya.
Secara visual:
row 1 → column 1, 2, 3, 4, 5
row 2 → column 1, 2, 3, 4, 5
row 3 → column 1, 2, 3, 4, 5
row 4 → column 1, 2, 3, 4, 5
row 5 → column 1, 2, 3, 4, 5
Jadi total operasi:
5 row × 5 column = 25 cell
4. Sekarang lihat bagaimana angka tabel dibuat
Kita tidak perlu menyimpan tabelnya satu per satu.
Kita cukup menemukan rumusnya:
cell = row × column
Contoh:
row = 1, column = 1
1 × 1 = 1
row = 1, column = 2
1 × 2 = 2
row = 2, column = 3
2 × 3 = 6
row = 5, column = 4
5 × 4 = 20
row = 5, column = 5
5 × 5 = 25
Jadi kode sederhananya:
for (row in 1..5) {
for (column in 1..5) {
val product = row * column
print("$product ")
}
println()
}
Hasil:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
5. Mari bedah kodenya satu per satu
Outer loop
for (row in 1..5) {
Artinya:
Ulangi
rowdari 1 sampai 5.
Jadi:
row = 1
row = 2
row = 3
row = 4
row = 5
row adalah iteration variable, bukan constant yang kita deklarasikan sendiri.
6. Inner loop
for (column in 1..5) {
Artinya:
Untuk setiap
row, jalankancolumndari 1 sampai 5.
Jadi ketika:
row = 1
maka:
column = 1
column = 2
column = 3
column = 4
column = 5
Kemudian row berubah menjadi 2 dan column kembali lagi dari 1.
7. Menghitung hasil perkalian
Di dalam inner loop:
val product = row * column
Misalnya:
row = 3
column = 4
maka:
product = 3 * 4
= 12
Kemudian:
print("$product ")
akan mencetak:
12
8. Kenapa menggunakan print(), bukan println()?
Ini bagian yang sangat penting untuk membuat bentuk tabel.
Kalau kita menggunakan:
println(product)
hasilnya akan menjadi:
1
2
3
4
5
2
4
6
8
10
...
Karena setiap println() langsung pindah baris.
Padahal kita ingin:
1 2 3 4 5
berada dalam satu baris.
Maka kita gunakan:
print("$product ")
print() tidak pindah baris.
9. Lalu kenapa ada println() setelah inner loop?
Perhatikan:
for (row in 1..5) {
for (column in 1..5) {
val product = row * column
print("$product ")
}
println()
}
Perhatikan posisi:
println()
Dia berada di luar inner loop, tetapi masih di dalam outer loop.
Artinya:
Setelah semua kolom dalam satu baris selesai dicetak, baru pindah ke baris berikutnya.
Misalnya row pertama:
1 2 3 4 5
inner loop selesai.
Kemudian:
println()
membuat cursor pindah ke baris berikutnya.
Lalu row kedua:
2 4 6 8 10
Kemudian pindah baris lagi.
10. Visualisasi posisi println()
Ini konsep yang perlu benar-benar kamu ingat.
println() di dalam inner loop
for (row in 1..5) {
for (column in 1..5) {
print(column)
println()
}
}
Hasilnya kira-kira:
1
2
3
4
5
1
2
3
4
5
...
Karena setiap column langsung pindah baris.
println() setelah inner loop
for (row in 1..5) {
for (column in 1..5) {
print(column)
}
println()
}
Hasil:
12345
12345
12345
12345
12345
Nah, ini yang kita inginkan untuk membuat tabel.
11. Ada bagian subtitle yang membingungkan: sum
Di transcript, instruktur sempat menggunakan:
var sum = 0
lalu:
sum += row * column
Ini sebenarnya tidak diperlukan untuk membuat tabel perkalian.
Karena tujuan kita adalah:
menghitung nilai setiap cell.
Bukan:
menjumlahkan semua cell.
Kalau kita menggunakan:
var sum = 0
for (row in 1..5) {
for (column in 1..5) {
sum += row * column
}
}
maka sum akan menjadi akumulasi:
1×1 + 1×2 + 1×3 + ... + 5×5
Itu adalah masalah yang berbeda.
Untuk multiplication table, lebih tepat:
val product = row * column
atau bahkan langsung:
print("${row * column} ")
12. sum vs product
Ini penting supaya tidak tertukar.
sum
Biasanya digunakan untuk penjumlahan:
var sum = 0
for (i in 1..5) {
sum += i
}
Hasil:
15
Karena:
1 + 2 + 3 + 4 + 5 = 15
product
Biasanya digunakan untuk hasil perkalian:
val product = row * column
Misalnya:
row = 4
column = 5
product = 4 × 5
= 20
Jadi untuk exercise ini, nama:
product
lebih masuk akal daripada:
sum
13. Kenapa awalnya menggunakan 0..4, kemudian diubah menjadi 1..5?
Ini juga bagian penting dari exercise.
Instruktur awalnya berpikir:
for (row in 0..4)
dan:
for (column in 0..4)
Itu menghasilkan:
0 1 2 3 4
Masalahnya, kalau kita menghitung:
row * column
akan ada banyak angka 0:
0 0 0 0 0
0 1 2 3 4
0 2 4 6 8
...
Padahal tabel yang kita inginkan dimulai dari:
1 2 3 4 5
Jadi kita mengubah range menjadi:
1..5
yang menghasilkan:
1 2 3 4 5
14. Ini bukan karena Kotlin harus selalu mulai dari 1
Jangan sampai mendapatkan kesimpulan:
“Kotlin selalu mulai dari 1.”
Tidak.
Kotlin bisa membuat range dari mana saja:
0..4
atau:
1..5
atau:
10..20
atau:
5 downTo 1
Jadi angka awal bergantung pada kebutuhan algoritma.
Dalam exercise ini kita memilih 1..5 karena tabel perkalian yang diminta adalah 1 sampai 5.
15. Algoritma sebelum kode
Ini sebenarnya inti terbesar dari exercise.
Sebelum menulis Kotlin, kita bisa menulis algoritmanya dengan bahasa manusia:
Langkah 1
Ambil setiap baris dari 1 sampai 5.
Langkah 2
Untuk setiap baris, ambil setiap kolom dari 1 sampai 5.
Langkah 3
Kalikan:
row × column
Langkah 4
Cetak hasilnya tanpa pindah baris.
Langkah 5
Setelah semua kolom selesai, pindah ke baris berikutnya.
Dalam bentuk pseudocode:
untuk setiap row 1 sampai 5:
untuk setiap column 1 sampai 5:
product = row × column
print product
pindah baris
Lalu pseudocode tersebut diterjemahkan ke Kotlin:
for (row in 1..5) {
for (column in 1..5) {
val product = row * column
print("$product ")
}
println()
}
16. Hubungannya dengan materi sebelumnya
Exercise ini sebenarnya menggabungkan banyak materi yang sudah kamu pelajari.
Sebelumnya kita belajar:
Range
1..5
↓
for
for (i in 1..5)
↓
Nested loop
for (row in 1..5) {
for (column in 1..5) {
}
}
↓
Arithmetic
row * column
↓
Variable
val product = row * column
↓
Output
print()
println()
Jadi exercise ini adalah semacam gabungan materi-materi sebelumnya.
17. Cara berpikir yang paling penting
Jangan hanya menghafal:
for (row in 1..5) {
for (column in 1..5) {
print(row * column)
}
}
Yang jauh lebih penting adalah memahami kenapa kita menulis dua loop.
Ketika melihat masalah seperti:
A B C D
A B C D
A B C D
A B C D
kamu harus mulai berpikir:
“Ada baris dan ada kolom.”
Kemudian:
baris → outer loop
kolom → inner loop
Kalau setiap cell memiliki perhitungan:
cell = row × column
maka:
nested loop
↓
row + column
↓
hitung cell
↓
print
18. Contoh tracing sederhana
Misalnya hanya:
for (row in 1..2) {
for (column in 1..3) {
print("${row * column} ")
}
println()
}
Mari ikuti.
row = 1
Column berjalan:
column = 1 → 1 × 1 = 1
column = 2 → 1 × 2 = 2
column = 3 → 1 × 3 = 3
Output:
1 2 3
Kemudian println().
row = 2
column = 1 → 2 × 1 = 2
column = 2 → 2 × 2 = 4
column = 3 → 2 × 3 = 6
Output:
2 4 6
Hasil akhir:
1 2 3
2 4 6
Kalau kamu sudah bisa membayangkan proses ini di kepala, berarti konsep nested loop-mu mulai kuat.
19. Versi kode yang saya rekomendasikan
Untuk exercise ini, saya akan menulisnya sederhana:
fun main() {
for (row in 1..5) {
for (column in 1..5) {
val product = row * column
print("$product ")
}
println()
}
}
Output:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
4 8 12 16 20
5 10 15 20 25
Bahkan bisa dibuat lebih singkat:
fun main() {
for (row in 1..5) {
for (column in 1..5) {
print("${row * column} ")
}
println()
}
}
Untuk sekarang saya lebih menyarankan versi pertama, karena:
val product = row * column
membuat alurnya lebih jelas untuk pemula.
20. Koreksi beberapa bagian subtitle
Ada beberapa hal dalam subtitle yang sebaiknya kamu jangan hafalkan mentah-mentah.
❌ “row sebagai constant”
Lebih tepat:
rowadalah loop variable / iteration variable.
Contoh:
for (row in 1..5)
row dibuat dan dikontrol oleh for.
❌ “Kotlin index mulai dari 0”
Ini terlalu general.
Tidak semua loop Kotlin mulai dari 0.
Contoh:
for (i in 1..5)
jelas mulai dari 1.
Yang sering zero-based adalah index collection, misalnya:
index 0
index 1
index 2
...
Itu konsep yang berbeda.
❌ sum untuk multiplication table
Kurang tepat jika tujuan hanya mencetak setiap hasil perkalian.
Lebih jelas:
val product = row * column
karena kita sedang mendapatkan hasil perkalian, bukan menjumlahkan hasil-hasil perkalian.
❌ “5 × 3 = 50”
Itu jelas kesalahan subtitle/transcript.
Yang benar:
5 × 3 = 15
Sedangkan:
5 × 5 = 25
21. Pola besar yang harus kamu ingat
Untuk sementara, simpan pola ini di kepala:
TABEL
↓
ADA BARIS + KOLOM
↓
NESTED LOOP
↓
OUTER LOOP = ROW
INNER LOOP = COLUMN
↓
HITUNG CELL
↓
ROW × COLUMN
↓
PRINT
Dalam kode:
for (row in 1..5) { // baris
for (column in 1..5) { // kolom
val product = row * column
print("$product ")
}
println() // pindah ke baris berikutnya
}
Inti exercise ini
Kalau ada pola yang memiliki baris dan kolom, pikirkan nested loop.
Dan untuk multiplication table:
Nilai setiap cell =
row * column.
Ini adalah latihan yang sangat bagus untuk mulai membangun algorithmic thinking, bukan sekadar menghafal syntax Kotlin.