18. Perulangan — Solusi PR

File solusi .go ada di exercises/18/homework/solutions/.

Soal 1 — Menghitung sampai 20

Soal. Cetak 1 sampai 20 dengan for yang hanya punya kondisi.

Cara berpikir. Bentuk ini butuh nilai awal sebelum perulangan, kondisi berhenti, dan perubahan di dalam isi perulangan. Mulai dari 1, berhenti setelah 20, tambah 1 setiap putaran.

Solusi yang dikerjakan.

package main

import "fmt"

func main() {
    i := 1
    for i <= 20 {
        fmt.Println(i)
        i++
    }
}

Kesalahan umum.

  • Lupa i++. Kondisinya tetap benar selamanya, jadi perulangan tidak pernah berakhir. Tekan Ctrl + C untuk menghentikannya.
  • Memakai i < 20, lalu kehilangan 20. <= menyertakan titik akhirnya.

Soal 2 — Tabel perkalian 7

Soal. Cetak 7 * i = result untuk i dari 1 sampai 12.

Cara berpikir. for tiga bagian dari 1 sampai 12. Setiap putaran mencetak satu baris dari i dan 7*i.

Solusi yang dikerjakan.

package main

import "fmt"

func main() {
    for i := 1; i <= 12; i++ {
        fmt.Printf("7 * %d = %d\n", i, 7*i)
    }
}

Kesalahan umum.

  • Menulis i < 12. Itu berhenti di 11 dan kehilangan baris terakhir.
  • Tertukar antara 7*i (yang dicetak) dan i (penghitung).

Soal 3 — Berhenti di ambang batas

Soal. Tambahkan 1, 2, 3, ... ke sebuah total. Berhenti begitu melebihi 100. Cetak penghitung dan totalnya.

Cara berpikir. Dua variabel: penghitung yang naik 1 setiap putaran, dan total yang naik sebesar penghitung. Pemeriksaan keluar, total > 100, masuk ke dalam sebagai if dengan break, yang cocok dengan for kosong. Kedua variabel dideklarasikan sebelum perulangan, karena baris terakhir mencetaknya sesudah perulangan.

Solusi yang dikerjakan.

package main

import "fmt"

func main() {
    i := 1
    total := 0

    for {
        total += i
        if total > 100 {
            break
        }
        i++
    }

    fmt.Printf("Stopped at i = %d with total = %d\n", i, total)
}

Jumlah 1+2+...+14 = 105 adalah total pertama di atas 100, jadi outputnya:

Stopped at i = 14 with total = 105

Kesalahan umum.

  • Menulis i++ sebelum menambah ke total. Itu menambahkan i berikutnya, bukan yang sekarang. Urutkan dengan sengaja.
  • Menaruh break setelah i++. Maka i yang tercetak satu lebih besar dari nilai yang membuat total melewati 100. Keduanya bisa jalan; yang penting disengaja.
  • Menulis for i := 1; ; i++ lalu mencetak i setelah perulangan. Variabel yang dideklarasikan di baris for tidak ada setelah perulangan, dan Go berhenti dengan undefined: i.

Tantangan — Jumlah 1..N

Soal. Baca n, jumlahkan 1..n dengan perulangan for, bandingkan dengan rumus n * (n + 1) / 2.

Cara berpikir. Perulangan for dari 1 sampai dan termasuk n menambahkan setiap penghitung ke total. Rumus untuk n bilangan bulat positif pertama adalah n * (n + 1) / 2. Cetak keduanya, pastikan cocok.

Solusi yang dikerjakan.

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    reader := bufio.NewReader(os.Stdin)

    fmt.Print("Enter a positive whole number n: ")
    text, _ := reader.ReadString('\n')
    n, _ := strconv.Atoi(strings.TrimSpace(text))

    total := 0
    for i := 1; i <= n; i++ {
        total += i
    }

    fmt.Printf("Sum from 1 to %d is %d\n", n, total)
    fmt.Println("Formula gives", n*(n+1)/2)
}

Output, dengan mengetik 10:

Enter a positive whole number n: 10
Sum from 1 to 10 is 55
Formula gives 55

Kedua angka adalah int, jadi / adalah pembagian bilangan bulat. Di sini itu aman, karena n * (n + 1) selalu genap. Mengetik teks memberikan 0, seperti peringatan Bab 15, dan perulangannya sama sekali tidak berjalan:

Enter a positive whole number n: abc
Sum from 1 to 0 is 0
Formula gives 0

Kesalahan umum.

  • Menulis i < n. Itu berhenti di n - 1 dan memberikan jawaban yang salah. Pakai i <= n untuk menyertakan n.
  • Lupa mengisi total dengan 0 sebelum perulangan. Mendeklarasikannya di dalam perulangan juga salah, karena ia mulai lagi dari 0 setiap putaran dan tidak ada setelahnya.
  • Menulis rumus tanpa tanda kurung. Urutan operasi itu penting, dan 1/2 bernilai 0 pada pembagian bilangan bulat:
n := 10
fmt.Println(n*n + 1/2) // 100

Selesai?

Sekarang kamu bisa mengulang pekerjaan dengan setiap bentuk for. Berikutnya, Perulangan bersarang menyusun perulangan untuk membuat kisi, dan Pola perulangan menamai pekerjaan yang paling sering dilakukan perulangan. Lalu mini-proyek Bagian 4, Game Tebak Angka dan Batu-Gunting-Kertas, menggabungkan keputusan dan pengulangan.