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 x untuk kedua perulangan. x di dalam menyembunyikan x di 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 error mismatched types. Konversi dengan strconv.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, bukan star <= 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.