הסרת משימה
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 24 מתוך 68.
אתגר
קלבחלק הזה של מערכת ניהול המשימות שלך, תממש את האפשרות להסיר משימות מהרשימה שלך. האתגר הזה מתמקד במניפולציה של פרוסות באמצעות הפונקציה append כדי לבנות מחדש פרוסה ללא איבר מסוים, ומדגים כיצד להסיר פריטים ממבנה הנתונים שלך לצמיתות.
תקבל שלוש קלטים:
- מחרוזת שמייצגת את מספר המשימות (למשל,
"4") - מחרוזת שמכילה נתוני משימות בפורמט:
"name1:status1,name2:status2,name3:status3", כאשר הסטטוס הוא"true"או"false"(למשל,"Buy groceries:false,Call dentist:true,Finish project:false,Review code:true") - מחרוזת שמייצגת את האינדקס של המשימה להסרה (למשל,
"1"עבור המשימה השנייה, באמצעות אינדקס שמתחיל ב-0)
עליך לבצע את הפעולות הבאות:
- הגדר את אותה מבנה
Taskמהאתגרים הקודמים, עם השדותName(מחרוזת) ו-Completed(bool) - צור פונקציה בשם
removeTaskשמקבלת פרוסה של מבניTaskואינדקס (int) כפרמטרים - בתוך הפונקציה
removeTask, החזר פרוסה חדשה שבה המשימה באינדקס הנתון הוסרה באמצעותappendכדי לחבר את האיברים שלפני אינדקס היעד ואת אלה שאחריו - נתח את נתוני המשימות מהקלט השני כדי ליצור את פרוסת המשימות שלך:
- פצל את הקלט לפי פסיקים כדי לקבל רשומות של משימות בודדות
- עבור כל רשומה, פצל לפי נקודתיים כדי להפריד בין השם לסטטוס
- המר את מחרוזת הסטטוס לערך בוליאני (
"true"הופך ל-true,"false"הופך ל-false)
- המר את מחרוזת הקלט השלישית למספר שלם כדי לקבל את אינדקס המשימה
- שמור את שם המשימה להסרה לפני הקריאה לפונקציה
removeTask - קרא לפונקציה
removeTaskשלך עם הפרוסה והאינדקס, ושמור את הפרוסה שהוחזרה - לאחר הסרת המשימה, הצג את כל המשימות שנותרו באותו פורמט כמו באתגרים הקודמים:
- למשימות שהושלמו:
"[x] [task_name]" - למשימות שלא הושלמו:
"[ ] [task_name]"
- למשימות שהושלמו:
- הדפס הודעת אישור:
"Task '[task_name]' removed successfully!" - הדפס את הסיכום המעודכן:
"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)
}כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין