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önetimi sisteminizin bu bölümünde, görevleri tamamlandı olarak işaretleme özelliğini uygulayacaksınız. Bu görev, özgün görev verilerini değiştirmek için işaretçi alıcılarının kullanımına odaklanır ve işaretçilerin yapı alanlarını kalıcı olarak güncellemenize nasıl olanak sağladığını gösterir.

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

Üç girdi alacaksınız:

  • Görev sayısını temsil eden bir dize (ör. "4")
  • Şu biçimde görev verilerini içeren bir dize: "name1:status1,name2:status2,name3:status3"; burada status ya "true" ya da "false" değeridir (ör. "Buy groceries:false,Call dentist:true,Finish project:false,Review code:false")
  • Tamamlanacak görevin dizinini temsil eden bir dize (ör. 0 tabanlı dizinleme kullanıldığında üçüncü görev için "2")

Göreviniz şunları yapmaktır:

  1. Önceki görevlerdeki aynı Task yapısını Name (string) ve Completed (bool) alanlarıyla tanımlayın
  2. Parametre olarak bir Task yapıları dilimine işaretçi ve bir dizin (int) alan completeTask adlı bir işlev oluşturun
  3. completeTask işlevinin içinde, verilen dizindeki görevin Completed alanını true olarak değiştirin
  4. Girdi satırlarını düzgün şekilde okumak için bufio.Scanner kullanın:
    • Bir tarayıcı oluşturun: scanner := bufio.NewScanner(os.Stdin)
    • Her girdi satırı için: önce scanner.Scan(), ardından scanner.Text() çağrısını yapı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:
    • Tek tek görev girdilerini elde etmek için girdiyi virgüllere göre ayırın
    • Adı ve durumu ayırmak için her girdiyi iki noktaya göre ayırın
    • Durum dizesini bir boolean değere 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 tamsayıya dönüştürün
  7. completeTask işlevinizi, diliminize bir işaretçi ve dizin ile çağırın
  8. Görevi tamamladıktan sonra, önceki görevdekiyle aynı biçimi kullanarak tüm görevleri 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 tamsayıya dönüştürmek için strconv paketini kullanın. Bu görev, işaretçi alıcılarının özgün veri yapısını değiştirmenize nasıl olanak sağladığını ve işlev döndükten sonra da kalıcı olan görev listenizde kalıcı değişiklikler yapmayı 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

Kendi başına pratik yap: Online Go derleyicisi