Menu
Coddy logo textTech

הסרת משימה

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

challenge icon

אתגר

קל

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

תקבל שלוש קלטים:

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

עליך לבצע את הפעולות הבאות:

  1. הגדר את אותה מבנה Task מהאתגרים הקודמים, עם השדות Name (מחרוזת) ו-Completed (bool)
  2. צור פונקציה בשם removeTask שמקבלת פרוסה של מבני Task ואינדקס (int) כפרמטרים
  3. בתוך הפונקציה removeTask, החזר פרוסה חדשה שבה המשימה באינדקס הנתון הוסרה באמצעות append כדי לחבר את האיברים שלפני אינדקס היעד ואת אלה שאחריו
  4. נתח את נתוני המשימות מהקלט השני כדי ליצור את פרוסת המשימות שלך:
    • פצל את הקלט לפי פסיקים כדי לקבל רשומות של משימות בודדות
    • עבור כל רשומה, פצל לפי נקודתיים כדי להפריד בין השם לסטטוס
    • המר את מחרוזת הסטטוס לערך בוליאני ("true" הופך ל-true, "false" הופך ל-false)
  5. המר את מחרוזת הקלט השלישית למספר שלם כדי לקבל את אינדקס המשימה
  6. שמור את שם המשימה להסרה לפני הקריאה לפונקציה removeTask
  7. קרא לפונקציה removeTask שלך עם הפרוסה והאינדקס, ושמור את הפרוסה שהוחזרה
  8. לאחר הסרת המשימה, הצג את כל המשימות שנותרו באותו פורמט כמו באתגרים הקודמים:
    • למשימות שהושלמו: "[x] [task_name]"
    • למשימות שלא הושלמו: "[ ] [task_name]"
  9. הדפס הודעת אישור: "Task '[task_name]' removed successfully!"
  10. הדפס את הסיכום המעודכן: "Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"

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

נסו בעצמכם

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

type Task struct {
	Name      string
	Completed bool
}

func completeTask(tasks *[]Task, index int) {
	(*tasks)[index].Completed = true
}

func main() {
	// Read input using bufio.Scanner to handle spaces properly
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	_ = scanner.Text() // Read but don't use the number of tasks
	
	scanner.Scan()
	taskDataStr := scanner.Text()
	
	scanner.Scan()
	indexStr := scanner.Text()
	
	// Parse task data
	taskEntries := strings.Split(taskDataStr, ",")
	tasks := make([]Task, len(taskEntries))
	
	for i, entry := range taskEntries {
		parts := strings.Split(entry, ":")
		if len(parts) >= 2 {
			name := parts[0]
			status := parts[1] == "true"
			tasks[i] = Task{Name: name, Completed: status}
		}
	}
	
	// Convert index string to integer
	index, _ := strconv.Atoi(indexStr)
	
	// Complete the task
	taskName := tasks[index].Name
	completeTask(&tasks, index)
	
	// Display all tasks
	for _, task := range tasks {
		if task.Completed {
			fmt.Printf("[x] %s\n", task.Name)
		} else {
			fmt.Printf("[ ] %s\n", task.Name)
		}
	}
	
	// Print confirmation message
	fmt.Printf("Task '%s' marked as completed!\n", taskName)
	
	// Count completed and incomplete tasks
	completedCount := 0
	for _, task := range tasks {
		if task.Completed {
			completedCount++
		}
	}
	incompleteCount := len(tasks) - completedCount
	
	// Print summary
	fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", len(tasks), completedCount, incompleteCount)
}

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

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