19. Perulangan bersarang — Solusi PR
File solusi .go ada di
exercises/19/homework/solutions/.
Soal 1 — Persegi panjang dari tanda pagar
Soal. Blok # selebar 5 dan setinggi
3.
Cara berpikir. Perulangan luar = baris (3).
Perulangan dalam = kolom (5): bangun satu baris berisi lima
#, lalu cetak.
Solusi yang dikerjakan.
package main
import "fmt"
func main() {
for row := 1; row <= 3; row++ {
line := ""
for col := 1; col <= 5; col++ {
line += "#"
}
fmt.Println(line)
}
}Output:
#####
#####
#####
Soal 2 — Pasangan koordinat
Soal. Cetak setiap (x, y) untuk x dan y
dari 1 sampai 3.
Cara berpikir. Untuk setiap x, telusuri
setiap y. Isi perulangan mencetak satu pasangan per baris,
jadi soal ini tidak butuh pembangunan string.
Solusi yang dikerjakan.
package main
import "fmt"
func main() {
for x := 1; x <= 3; x++ {
for y := 1; y <= 3; y++ {
fmt.Printf("(%d, %d)\n", x, y)
}
}
}Output:
(1, 1)
(1, 2)
(1, 3)
(2, 1)
(2, 2)
(2, 3)
(3, 1)
(3, 2)
(3, 3)
Kesalahan umum.
- Memakai
xuntuk kedua perulangan.xdi dalam menyembunyikanxdi luar, jadi pasangannya menjadi(1, 1),(2, 2),(3, 3), sebanyak tiga kali. Setiap perulangan butuh namanya sendiri.
Soal 3 — Tabel perkalian
Soal. Kisi perkalian 5×5.
Cara berpikir. Bentuknya sama dengan kisi di bab ini, dengan kedua perulangan berakhir di 5.
Solusi yang dikerjakan.
package main
import (
"fmt"
"strconv"
)
func main() {
for row := 1; row <= 5; row++ {
line := ""
for col := 1; col <= 5; col++ {
line += strconv.Itoa(row*col) + "\t"
}
fmt.Println(line)
}
}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
Kesalahan umum.
- Menulis
line += row * col. String dan int tidak bisa disambung, jadi Go berhenti dengan errormismatched types. Konversi denganstrconv.Itoa. - Menulis
string(row * col). Seperti peringatan Bab 14, itu memberikan karakter yang tersimpan di bawah angka itu, bukan digitnya.
Tantangan — Segitiga siku-siku
Soal. Segitiga 6 baris dengan baris n
berisi n bintang, lalu terbalik.
Cara berpikir. Perulangan dalam berjalan
row kali pada kedua segitiga. Hanya perulangan luar yang
berubah: naik dari 1 ke 6, lalu turun dari 6 ke 1.
Solusi yang dikerjakan.
package main
import "fmt"
func main() {
// membesar
for row := 1; row <= 6; row++ {
line := ""
for star := 1; star <= row; star++ {
line += "*"
}
fmt.Println(line)
}
// mengecil
for row := 6; row >= 1; row-- {
line := ""
for star := 1; star <= row; star++ {
line += "*"
}
fmt.Println(line)
}
}Output:
*
**
***
****
*****
******
******
*****
****
***
**
*
Keduanya hanya berbeda pada arah perulangan luar:
for row := 1; row <= 6; row++ naik,
for row := 6; row >= 1; row-- turun. Perulangan dalamnya
sama persis.
Kesalahan umum.
- Memakai nilai akhir tetap untuk perulangan dalam, seperti
star <= 6, bukanstar <= row. Nilai akhir tetap memberikan persegi panjang; segitiga datang dari mengikat hitungan dalam dengan baris saat itu.
Selesai?
Kamu bisa membuat kisi dan bentuk dari perulangan di dalam perulangan. Bab terakhir Bagian 4, Pola perulangan, menamai pekerjaan yang paling sering dilakukan perulangan: menjumlahkan, menghitung, mencari, menandai, dan membaca input sampai benar.