סימון משימה כהושלמה
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 23 מתוך 68.
אתגר
קלבחלק הזה של מערכת ניהול המשימות שלך, תממש את האפשרות לסמן משימות כהושלמו. האתגר הזה מתמקד בשימוש במקבלי מצביע כדי לשנות את נתוני המשימה המקוריים, ומדגים כיצד מצביעים מאפשרים לעדכן שדות במבנה באופן קבוע.
הערה חשובה: מכיוון ששמות משימות עשויים להכיל רווחים (כמו "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)
עליך:
- להגדיר את אותו מבנה
Taskמהאתגרים הקודמים, עם השדותName(string) ו־Completed(bool) - ליצור פונקציה בשם
completeTaskשמקבלת פרמטרים: מצביע לפרוסה של מבניTaskואינדקס (int) - בתוך הפונקציה
completeTask, לשנות את השדהCompletedשל המשימה באינדקס הנתון ל־true - להשתמש ב־
bufio.Scannerכדי לקרוא כראוי את שורות הקלט:- ליצור סורק:
scanner := bufio.NewScanner(os.Stdin) - עבור כל שורת קלט: לקרוא ל־
scanner.Scan()ואז ל־scanner.Text() - כך מובטח ששמות משימות עם רווחים ייקראו כראוי
- ליצור סורק:
- לנתח את נתוני המשימות מהקלט השני כדי ליצור את פרוסת המשימות שלך:
- לפצל את הקלט לפי פסיקים כדי לקבל את רשומות המשימות הבודדות
- עבור כל רשומה, לפצל לפי נקודתיים כדי להפריד בין השם למצב
- להמיר את מחרוזת המצב לערך בוליאני (
"true"הופך ל־true,"false"הופך ל־false)
- להמיר את מחרוזת הקלט השלישית למספר שלם כדי לקבל את אינדקס המשימה
- לקרוא לפונקציה
completeTaskשלך עם מצביע לפרוסה שלך ועם האינדקס - לאחר השלמת המשימה, להציג את כל המשימות באותו פורמט כמו באתגר הקודם:
- עבור משימות שהושלמו:
"[x] [task_name]" - עבור משימות שלא הושלמו:
"[ ] [task_name]"
- עבור משימות שהושלמו:
- להדפיס הודעת אישור:
"Task '[task_name]' marked as completed!" - להדפיס את הסיכום המעודכן:
"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)
}כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין