12. String — Solusi PR

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

Soal 1 — Inisial

Soal. Cetak inisial seperti K.R. dari nama depan dan nama belakang.

Cara berpikir. Huruf pertama sebuah nama, sebagai string, adalah name[:1]. Gabungkan potongan-potongannya dengan + dan titik.

Solusi yang dikerjakan.

package main

import "fmt"

func main() {
    first := "Keiko"
    last := "Raharja"

    fmt.Println(first[:1] + "." + last[:1] + ".")
}

Output:

K.R.

Kesalahan umum.

  • Memakai first[1:2], bukan first[:1]. Indeks 1 adalah posisi kedua. Posisi pertama selalu di indeks 0.
  • Memakai first[0] (indeks), bukan first[:1] (slice). Indeks memberikan byte, dan + tidak bisa menyambung byte dengan string.

Soal 2 — Baris stat

Soal. Gunakan fmt.Printf untuk menghasilkan Keiko Lv 7 HP 95.

Cara berpikir. Tiga nilai, tiga penanda di dalam string: %s untuk nama, %d untuk level, %d untuk HP. Label (Lv, HP) dan spasi antar bagian ada di dalam string itu sendiri.

Solusi yang dikerjakan.

package main

import "fmt"

func main() {
    name := "Keiko"
    level := 7
    hp := 95

    fmt.Printf("%s  Lv %d   HP %d\n", name, level, hp)
}

Output:

Keiko  Lv 7   HP 95

Dua spasi setelah %s dan tiga spasi setelah level sesuai dengan output yang diminta.

Kesalahan umum.

  • Memakai fmt.Println dengan penanda. fmt.Println tidak membacanya, jadi %s dicetak sebagai teks %s.
  • Memakai + untuk menyambung string dan int. Go berhenti dengan error mismatched types. fmt.Printf menerima angka secara langsung.

Soal 3 — Puisi tiga baris dalam satu panggilan

Soal. Satu panggilan fmt.Println, tiga baris output, dipisahkan oleh \n.

Cara berpikir. Di dalam string bertanda kutip ganda, \n adalah karakter baris baru, jadi satu string dengan dua \n tercetak sebagai tiga baris. Komentarnya harus menjelaskan mengapa: fmt.Println menulis apa pun yang diberikan, dan string ini sudah berisi karakter baris baru.

Solusi yang dikerjakan.

package main

import "fmt"

func main() {
    fmt.Println("Code is poetry,\nbugs are typos,\nfix them and ship.")
    // Satu panggilan tetap menghasilkan tiga baris karena string itu sendiri berisi
    // dua karakter \n, dan masing-masing memulai baris baru di terminal.
}

Output:

Code is poetry,
bugs are typos,
fix them and ship.

Kesalahan umum.

  • Menulis \\n, bukan \n. Dua garis miring terbalik berarti garis miring terbalik biasa diikuti huruf n, yang bukan baris baru.
  • Memakai backtick dengan \n di dalamnya. Dalam raw string, \n tetap dua karakter itu.

Tantangan — Huruf terakhir

Soal. Cetak tiga karakter terakhir dengan slice, dan panjangnya dengan len.

Cara berpikir. Go tidak punya indeks negatif. Tiga byte terakhir dimulai di len(word)-3, dan menghilangkan stop berarti sampai akhir.

Solusi yang dikerjakan.

package main

import "fmt"

func main() {
    word := "programming"

    fmt.Println(word[len(word)-3:])
    fmt.Println(len(word))
}

Output:

ing
11

Karena len(word)-3 dihitung dari katanya sendiri, baris yang sama berfungsi untuk kata apa pun dengan minimal tiga huruf — tidak perlu menghitung.

Kesalahan umum.

  • Menulis word[-3:]. Go berhenti dengan invalid argument: index -3 (constant of type int) must not be negative.
  • Menulis word[len(word)-3] tanpa :. Indeks memberikan satu byte, yang dicetak sebagai angka, bukan tiga huruf terakhir.
  • Menulis word[len(word):], yaitu slice dari akhir sampai akhir. Hasilnya string kosong.

Selesai?

Berikutnya Angka dan matematika, lalu Bekerja dengan teks dan Mendapatkan input, kemudian mini-proyek Bagian 3.