Menu
Coddy logo textTech

סימון משימה כהושלמה

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 23 מתוך 68.

challenge icon

אתגר

קל

בחלק הזה של מערכת ניהול המשימות שלך, תממש את האפשרות לסמן משימות כהושלמו. האתגר הזה מתמקד בשימוש במקבלי מצביע כדי לשנות את נתוני המשימה המקוריים, ומדגים כיצד מצביעים מאפשרים לעדכן שדות במבנה באופן קבוע.

הערה חשובה: מכיוון ששמות משימות עשויים להכיל רווחים (כמו "Buy groceries"), תצטרך להשתמש ב־bufio.Scanner כדי לקרוא שורות קלט שלמות. הפונקציה fmt.Scanf מפסיקה לקרוא ברווח הראשון, ולכן שמות משימות עם רווחים לא ייקראו כראוי. השתמש ב־bufio.NewScanner(os.Stdin) וקרא ל־scanner.Scan() ולאחר מכן ל־scanner.Text() כדי לקרוא שורות שלמות.

תקבל שלושה נתוני קלט:

  • מחרוזת המייצגת את מספר המשימות (למשל, "4")
  • מחרוזת המכילה נתוני משימות בפורמט: "name1:status1,name2:status2,name3:status3", כאשר status הוא "true" או "false" (למשל, "Buy groceries:false,Call dentist:true,Finish project:false,Review code:false")
  • מחרוזת המייצגת את האינדקס של המשימה שיש להשלים (למשל, "2" עבור המשימה השלישית, באינדקס שמתחיל ב־0)

עליך:

  1. להגדיר את אותו מבנה Task מהאתגרים הקודמים, עם השדות Name (string) ו־Completed (bool)
  2. ליצור פונקציה בשם completeTask שמקבלת פרמטרים: מצביע לפרוסה של מבני Task ואינדקס (int)
  3. בתוך הפונקציה completeTask, לשנות את השדה Completed של המשימה באינדקס הנתון ל־true
  4. להשתמש ב־bufio.Scanner כדי לקרוא כראוי את שורות הקלט:
    • ליצור סורק: scanner := bufio.NewScanner(os.Stdin)
    • עבור כל שורת קלט: לקרוא ל־scanner.Scan() ואז ל־scanner.Text()
    • כך מובטח ששמות משימות עם רווחים ייקראו כראוי
  5. לנתח את נתוני המשימות מהקלט השני כדי ליצור את פרוסת המשימות שלך:
    • לפצל את הקלט לפי פסיקים כדי לקבל את רשומות המשימות הבודדות
    • עבור כל רשומה, לפצל לפי נקודתיים כדי להפריד בין השם למצב
    • להמיר את מחרוזת המצב לערך בוליאני ("true" הופך ל־true, "false" הופך ל־false)
  6. להמיר את מחרוזת הקלט השלישית למספר שלם כדי לקבל את אינדקס המשימה
  7. לקרוא לפונקציה completeTask שלך עם מצביע לפרוסה שלך ועם האינדקס
  8. לאחר השלמת המשימה, להציג את כל המשימות באותו פורמט כמו באתגר הקודם:
    • עבור משימות שהושלמו: "[x] [task_name]"
    • עבור משימות שלא הושלמו: "[ ] [task_name]"
  9. להדפיס הודעת אישור: "Task '[task_name]' marked as completed!"
  10. להדפיס את הסיכום המעודכן: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

השתמש בחבילה strconv כדי להמיר את מחרוזת האינדקס למספר שלם. האתגר הזה מדגים כיצד מקבלי מצביע מאפשרים לך לשנות את מבנה הנתונים המקורי, ולבצע שינויים קבועים ברשימת המשימות שלך שנשמרים גם לאחר שהפונקציה מסתיימת.

נסו בעצמכם

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

כל השיעורים ביחידה לוגיקה וזרימת התוכנית

תרגלו בעצמכם: קומפיילר Go אונליין