Menyelesaikan Tugas
Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 23 dari 68.
Tantangan
MudahDi bagian sistem manajemen tugas ini, kamu akan menerapkan kemampuan untuk menandai tugas sebagai selesai. Tantangan ini berfokus pada penggunaan penerima pointer untuk mengubah data tugas asli, serta menunjukkan bagaimana pointer memungkinkan kamu memperbarui field struct secara permanen.
Catatan penting: Karena nama tugas dapat berisi spasi (seperti "Buy groceries"), kamu perlu menggunakan bufio.Scanner untuk membaca seluruh baris input. Fungsi fmt.Scanf berhenti membaca pada spasi pertama, sehingga nama tugas yang mengandung spasi tidak akan terbaca dengan benar. Gunakan bufio.NewScanner(os.Stdin) dan panggil scanner.Scan(), lalu scanner.Text() untuk membaca seluruh baris.
Kamu akan menerima tiga input:
- String yang mewakili jumlah tugas (misalnya,
"4") - String yang berisi data tugas dalam format:
"name1:status1,name2:status2,name3:status3", dengan status berupa"true"atau"false"(misalnya,"Buy groceries:false,Call dentist:true,Finish project:false,Review code:false") - String yang mewakili indeks tugas yang akan diselesaikan (misalnya,
"2"untuk tugas ketiga, menggunakan indeks berbasis 0)
Tugasmu adalah:
- Definisikan struct
Taskyang sama seperti pada tantangan sebelumnya, dengan fieldName(string) danCompleted(bool) - Buat fungsi bernama
completeTaskyang menerima pointer ke slice berisi structTaskdan indeks (int) sebagai parameter - Di dalam fungsi
completeTask, ubah fieldCompleteddari tugas pada indeks yang diberikan menjaditrue - Gunakan
bufio.Scanneruntuk membaca baris input dengan benar:- Buat scanner:
scanner := bufio.NewScanner(os.Stdin) - Untuk setiap baris input: panggil
scanner.Scan(), laluscanner.Text() - Dengan begitu, nama tugas yang mengandung spasi akan terbaca dengan benar
- Buat scanner:
- Uraikan data tugas dari input kedua untuk membuat slice tugas:
- Pisahkan input berdasarkan koma untuk mendapatkan setiap entri tugas
- Untuk setiap entri, pisahkan berdasarkan titik dua untuk memisahkan nama dan status
- Ubah string status menjadi boolean (
"true"menjaditrue,"false"menjadifalse)
- Ubah string input ketiga menjadi integer untuk mendapatkan indeks tugas
- Panggil fungsi
completeTaskdengan pointer ke slice-mu dan indeks tersebut - Setelah menyelesaikan tugas, tampilkan semua tugas dengan format yang sama seperti pada tantangan sebelumnya:
- Untuk tugas yang selesai:
"[x] [task_name]" - Untuk tugas yang belum selesai:
"[ ] [task_name]"
- Untuk tugas yang selesai:
- Cetak pesan konfirmasi:
"Task '[task_name]' marked as completed!" - Cetak ringkasan yang diperbarui:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
Gunakan package strconv untuk mengubah string indeks menjadi integer. Tantangan ini menunjukkan bagaimana penerima pointer memungkinkan kamu mengubah struktur data asli, sehingga perubahan pada daftar tugasmu bersifat permanen dan tetap ada setelah fungsi selesai dijalankan.
Coba sendiri
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
func viewAllTasks(tasks []Task) {
for _, task := range tasks {
if task.Completed {
fmt.Printf("[x] %s\n", task.Name)
} else {
fmt.Printf("[ ] %s\n", task.Name)
}
}
}
func main() {
var numTasksStr string
fmt.Scanln(&numTasksStr)
numTasks, _ := strconv.Atoi(numTasksStr)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
taskData := scanner.Text()
var tasks []Task
taskEntries := strings.Split(taskData, ",")
for _, entry := range taskEntries {
parts := strings.Split(entry, ":")
if len(parts) >= 2 {
name := parts[0]
completed, _ := strconv.ParseBool(parts[1])
task := Task{
Name: name,
Completed: completed,
}
tasks = append(tasks, task)
}
}
viewAllTasks(tasks)
completedCount := 0
for _, task := range tasks {
if task.Completed {
completedCount++
}
}
incompleteCount := numTasks - completedCount
fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", numTasks, completedCount, incompleteCount)
}Semua pelajaran di Logika & Alur
1Alur Kontrol Lanjutan
switch dengan `fallthrough`Keluar dari Perulangan BersarangMelanjutkan Perulangan TertentuPernyataan `goto`Rangkuman, Kontrol Perulangan Lanjutan4Proyek: Daftar Tugas Sederhana
Menyiapkan ProyekMenambahkan Tugas2Struct dan Method
Mendefinisikan Method pada StructPenerima NilaiPenerima PointerMemilih PenerimaMethod vs FungsiRekap: Perilaku Struct5Map secara Mendalam
Map Berisi StructPointer sebagai Nilai MapMenguji Map NilMembandingkan MapRingkasan: Penghitung Frekuensi Kata8Proyek: Inventaris Sederhana
Gambaran Umum ProyekMemeriksa Stok3Interface (Dasar)
Apa Itu Interface?Mendefinisikan InterfaceMengimplementasikan InterfaceMenggunakan Tipe InterfaceInterface KosongType AssertionType SwitchRingkasan: Bentuk dan PerilakuLatihan sendiri: Compiler Go online