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 erroroperator || not defined. - Menulis
if fav {. String bukan bool. Pemeriksaannya adalahfav == "". - Mendeklarasikan
colourdengan:=di dalamif. 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
countsaja sebagai pemeriksaan. Yang tercetak adalah angkanya, bukan bool. - Membandingkan lintas tipe, seperti
name != 0. Itu errormismatched 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 dengancountbernilai0program crash denganpanic: runtime error: integer divide by zero. - Mencetak
total / countdengan%.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
ifterpisah tanpaelse. 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.