Menu
Coddy logo textTech

Görev Tamamlama

Coddy'nin GO Journey'sinin Mantık ve Akış bölümünün bir parçası — ders 23 / 68.

challenge icon

Görev

Kolay

Görev yönetim sisteminizin bu bölümünde, görevleri tamamlandı olarak işaretleme özelliğini uygulayacaksınız. Bu zorluk, orijinal görev verilerini değiştirmek için işaretçi alıcılarını (pointer receivers) kullanmaya odaklanarak, işaretçilerin struct alanlarını kalıcı olarak güncellemenize nasıl olanak tanıdığını gösterir.

Önemli Not: Görev adları boşluk içerebileceğinden (örneğin "Buy groceries"), tüm girdi satırlarını okumak için bufio.Scanner kullanmanız gerekecektir. fmt.Scanf fonksiyonu ilk boşlukta okumayı durdurur, bu da boşluk içeren görev adlarını bozar. Tam satırları okumak için bufio.NewScanner(os.Stdin) kullanın ve scanner.Scan() ardından scanner.Text() fonksiyonlarını çağırın.

Üç girdi alacaksınız:

  • Görev sayısını temsil eden bir dize (örneğin, "4")
  • Şu formatta görev verilerini içeren bir dize: "name1:status1,name2:status2,name3:status3"; burada durum "true" veya "false" şeklindedir (örneğin, "Buy groceries:false,Call dentist:true,Finish project:false,Review code:false")
  • Tamamlanacak görevin dizinini (index) temsil eden bir dize (örneğin, üçüncü görev için 0 tabanlı dizin kullanarak "2")

Göreviniz şunları yapmaktır:

  1. Önceki zorluklardaki Name (string) ve Completed (bool) alanlarına sahip aynı Task struct'ını tanımlayın
  2. Parametre olarak bir Task struct dilimi (slice) işaretçisi ve bir dizin (int) alan completeTask adında bir fonksiyon oluşturun
  3. completeTask fonksiyonu içinde, verilen dizindeki görevin Completed alanını true olarak değiştirin
  4. Girdi satırlarını düzgün okumak için bufio.Scanner kullanın:
    • Bir tarayıcı oluşturun: scanner := bufio.NewScanner(os.Stdin)
    • Her girdi satırı için: scanner.Scan() ve ardından scanner.Text() çağırın
    • Bu, boşluk içeren görev adlarının doğru okunmasını sağlar
  5. Görev diliminizi oluşturmak için ikinci girdideki görev verilerini ayrıştırın:
    • Bireysel görev girişlerini almak için girdiyi virgüllere göre bölün
    • Her giriş için, ad ve durumu ayırmak üzere iki noktaya göre bölün
    • Durum dizesini bir boolean'a dönüştürün ("true" değeri true, "false" değeri false olur)
  6. Görev dizinini elde etmek için üçüncü girdi dizesini bir tam sayıya dönüştürün
  7. Diliminize bir işaretçi ve dizin ile completeTask fonksiyonunuzu çağırın
  8. Görevi tamamladıktan sonra, tüm görevleri önceki zorlukla aynı formatı kullanarak görüntüleyin:
    • Tamamlanan görevler için: "[x] [task_name]"
    • Tamamlanmamış görevler için: "[ ] [task_name]"
  9. Bir onay mesajı yazdırın: "Task '[task_name]' marked as completed!"
  10. Güncellenmiş özeti yazdırın: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

Dizin dizesini bir tam sayıya dönüştürmek için strconv paketini kullanın. Bu zorluk, işaretçi alıcılarının orijinal veri yapısını değiştirmenize nasıl olanak tanıdığını ve görev listenizde fonksiyon döndükten sonra da kalıcı olan değişiklikler yapmanızı nasıl sağladığını gösterir.

Kendin dene

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)
}

Mantık ve Akış bölümündeki tüm dersler