17. Logika boolean secara mendalam — Solusi PR

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

Soal 1 — Warna default

Soal. Pakai "blue" sebagai cadangan kalau fav kosong.

Cara berpikir. Mulai colour dengan nilai fav. Ganti hanya kalau nilainya "".

Solusi yang dikerjakan.

package main

import "fmt"

func main() {
    fav := "" // coba juga warna sungguhan

    colour := fav
    if colour == "" {
        colour = "blue"
    }

    fmt.Println("Your colour is " + colour)
}

Dengan fav := "" program mencetak:

Your colour is blue

Dengan fav := "red" program mencetak:

Your colour is red

Kesalahan umum.

  • Menulis colour := fav || "blue". || hanya bekerja pada bool, jadi Go berhenti dengan error operator || not defined.
  • Menulis if fav {. String bukan bool. Pemeriksaannya adalah fav == "".
  • Mendeklarasikan colour dengan := di dalam if. Variabelnya lalu hilang di } penutup, seperti yang ditunjukkan Bab 16.

Soal 2 — Tulis maksudmu

Soal. Tunjukkan apakah setiap nilai berbeda dari nilai nol tipenya.

Cara berpikir. Pemeriksaannya tergantung tipe: != 0 untuk int dan != "" untuk string. Bool sudah berupa jawaban, jadi isReady sama sekali tidak butuh perbandingan.

Solusi yang dikerjakan.

package main

import "fmt"

func main() {
    count := 0
    name := ""
    isReady := false
    greeting := "hi"
    level := 1

    fmt.Println(count, count != 0)
    fmt.Printf("%q %v\n", name, name != "")
    fmt.Println(isReady, isReady)
    fmt.Printf("%q %v\n", greeting, greeting != "")
    fmt.Println(level, level != 0)
}

Output:

0 false
"" false
false false
"hi" true
1 true

Kesalahan umum.

  • Menulis count saja sebagai pemeriksaan. Yang tercetak adalah angkanya, bukan bool.
  • Membandingkan lintas tipe, seperti name != 0. Itu error mismatched types.

Soal 3 — Pembagian yang dijaga

Soal. Cetak rata-rata hanya kalau bisa dihitung dan nilainya di atas 20.

Cara berpikir. count > 0 ditaruh lebih dulu, jadi total/count tidak pernah berjalan kalau count bernilai 0. Perbandingannya memakai pembagian bilangan bulat, yang cukup untuk diuji terhadap 20. Rata-rata yang dicetak butuh desimal, jadi kedua angka dikonversi ke float64, seperti di Bab 13.

Solusi yang dikerjakan.

package main

import "fmt"

func main() {
    total := 90
    count := 0 // coba juga 3 dan 10

    if count > 0 && total/count > 20 {
        average := float64(total) / float64(count)
        fmt.Printf("High average: %.2f\n", average)
    } else {
        fmt.Println("no high average")
    }
}

Dengan count := 0, pemeriksaan count > 0 salah, jadi Go melewati pembagian dan mencetak:

no high average

Dengan count := 3 program mencetak:

High average: 30.00

Dengan count := 10, rata-ratanya 9, jadi program kembali mencetak no high average.

Kesalahan umum.

  • Menulis total/count > 20 && count > 0. Pembagian kini berjalan lebih dulu, dan dengan count bernilai 0 program crash dengan panic: runtime error: integer divide by zero.
  • Mencetak total / count dengan %.2f. Itu int, jadi outputnya %!f(int=30). Konversi dulu kedua angkanya.

Tantangan — Nilai pertama yang ada

Soal. Cetak yang pertama dari a, b, c yang tidak kosong.

Cara berpikir. switch tanpa nilai menjalankan case pertama yang kondisinya benar, dan itulah pertanyaannya. default menangani keadaan ketika ketiganya kosong.

Solusi yang dikerjakan.

package main

import "fmt"

func main() {
    a := ""
    b := ""
    c := "third"

    switch {
    case a != "":
        fmt.Println(a)
    case b != "":
        fmt.Println(b)
    case c != "":
        fmt.Println(c)
    default:
        fmt.Println("none")
    }
}

Output:

third

Kesalahan umum.

  • Memakai beberapa if terpisah tanpa else. Setiap variabel yang tidak kosong lalu tercetak, bukan hanya yang pertama.
  • Lupa default, sehingga tidak ada yang tercetak kalau ketiganya kosong.

Selesai?

Sekarang kamu tahu bahwa && dan || menerima bool dan memberikan bool, bahwa keduanya melakukan short-circuit, dan bahwa nilai default berasal dari perbandingan yang ditulis lengkap. Berikutnya adalah Perulangan, cara lain untuk membuat program melakukan lebih dari hal yang sama setiap kali.