Menu
CoddyTech

Menyelesaikan Tugas

Termasuk bagian Logika & Alur dalam perjalanan GO di Coddy. Pelajaran 23 dari 68.

challenge icon

Tantangan

Mudah

Di 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:

  1. Definisikan struct Task yang sama seperti pada tantangan sebelumnya, dengan field Name (string) dan Completed (bool)
  2. Buat fungsi bernama completeTask yang menerima pointer ke slice berisi struct Task dan indeks (int) sebagai parameter
  3. Di dalam fungsi completeTask, ubah field Completed dari tugas pada indeks yang diberikan menjadi true
  4. Gunakan bufio.Scanner untuk membaca baris input dengan benar:
    • Buat scanner: scanner := bufio.NewScanner(os.Stdin)
    • Untuk setiap baris input: panggil scanner.Scan(), lalu scanner.Text()
    • Dengan begitu, nama tugas yang mengandung spasi akan terbaca dengan benar
  5. 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" menjadi true, "false" menjadi false)
  6. Ubah string input ketiga menjadi integer untuk mendapatkan indeks tugas
  7. Panggil fungsi completeTask dengan pointer ke slice-mu dan indeks tersebut
  8. 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]"
  9. Cetak pesan konfirmasi: "Task '[task_name]' marked as completed!"
  10. 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

Latihan sendiri: Compiler Go online