שילוב כל החלקים
חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 25 מתוך 68.
אתגר
קלהגיע הזמן להשלים את יישום רשימת המשימות שלך. בשלב האחרון הזה תחבר את כל מה שלמדת בשיעורים הקודמים: את המבנה Task, את addTask, את viewAllTasks, את completeTask ואת removeTask, המופעלים באמצעות רצף של פעולות בתפריט.
תקבל שלוש שורות קלט:
- מחרוזת עם שם היישום ושם המשתמש, המופרדים בפסיק (לדוגמה,
"MyTasks,Alice") - מחרוזת עם המשימות שברשימה בתחילתה, בפורמט
"name1:status1,name2:status2", כאשר status הוא"true"או"false"(לדוגמה,"Write report:false,Call dentist:true"). השורה הזו ריקה כאשר הרשימה מתחילה ריקה. - מחרוזת עם פעולות הרצף, המופרדות בפסיקים. פעולה היא השם שלה בלבד, או השם שלה ופרמטר אחד המחוברים באמצעות
|(לדוגמה,"add|Buy groceries,view,complete|2,remove|0,exit"). רשימת הפעולות תמיד מסתיימת ב-"exit".
שמות המשימות כוללים רווחים, לכן קרא את כל שלוש השורות באמצעות bufio.Scanner, כמו בשיעורים הקודמים.
עליך:
- להגדיר את אותו מבנה
Taskעם השדותName(מחרוזת) ו-Completed(בוליאני) - להחזיר את ארבע הפונקציות שכבר כתבת, עם אותן חתימות:
addTask(tasks []Task, taskName string) []TaskviewAllTasks(tasks []Task), שמדפיסה"[x] [task_name]"עבור משימה שהושלמה ו-"[ ] [task_name]"עבור משימה שעדיין פתוחהcompleteTask(tasks *[]Task, index int)removeTask(tasks []Task, index int) []Task
- לבנות את הרשימה ההתחלתית מהקלט השני, ולזכור ששורה ריקה פירושה רשימה ריקה
- להדפיס את הודעת הפתיחה ואת התפריט, בדיוק כמו בשלב הראשון של הפרויקט:
"Welcome to [app_name], [user_name]!""1. Add Task""2. View Tasks""3. Complete Task""4. Remove Task""5. Exit""Current tasks: [count]"
- להריץ את הפעולות לפי הסדר. כל פעולה מדפיסה תחילה את הכותרת שלה:
"add": להדפיס"--- ADD TASK ---", להוסיף את המשימה ששמה מופיע בפרמטר, ואז להדפיס"Task '[task_name]' added!""view": להדפיס"--- VIEW TASKS ---", להציג כל משימה באמצעותviewAllTasks, ואז להדפיס את שורת הסיכום"complete": להדפיס"--- COMPLETE TASK ---", לסמן את המשימה באותו אינדקס כהושלמה, ואז להדפיס"Task '[task_name]' marked as completed!""remove": להדפיס"--- REMOVE TASK ---", להסיר את המשימה באותו אינדקס, ואז להדפיס"Task '[task_name]' removed successfully!""exit": להדפיס"--- EXIT ---", אחר כך"Final list:", אחר כך את הרשימה כולה, אחר כך את שורת הסיכום, ולבסוף"Goodbye, [user_name]!". לאחר היציאה לא מתבצעת שום פעולה נוספת.
- האינדקסים מתחילים ב-0, כמו בשיעורים הקודמים. כאשר האינדקס של
"complete"או"remove"נמצא מחוץ לטווח הרשימה, יש להדפיס במקום זאת"Invalid task number"ולהשאיר את הרשימה ללא שינוי. - שורת הסיכום היא זו שכבר מוכרת לך:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
השתמש בחבילה strings כדי לפצל את שורות הקלט, ובחבילה strconv כדי להמיר אינדקס למספר. השלב האחרון הזה מדגים כיצד הפונקציות הקטנות שכתבת אחת־אחת מצטרפות לתוכנית עובדת.
נסו בעצמכם
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
// TODO: להחזיר את addTask, viewAllTasks, completeTask ו־removeTask
// מהשיעורים הקודמים בפרויקט הזה
func main() {
// ליצור scanner לקריאת שורות קלט
scanner := bufio.NewScanner(os.Stdin)
// לקרוא את שם היישום ואת שם המשתמש
scanner.Scan()
names := scanner.Text()
// לקרוא את המשימות שהרשימה מתחילה איתן
scanner.Scan()
taskData := scanner.Text()
// לקרוא את הפעולות של ההפעלה
scanner.Scan()
actionData := scanner.Text()
// TODO: להשלים את המימוש
// 1. לפצל את names לפי "," כדי לקבל את שם היישום ואת שם המשתמש
// 2. לבנות את פרוסת המשימות ההתחלתית מתוך taskData
// 3. להדפיס את הודעת הפתיחה, את התפריט ואת מספר המשימות הנוכחי
// 4. לבצע את כל הפעולות ב־actionData לפי הסדר, ולהדפיס תחילה את הכותרת של כל פעולה
}
כל השיעורים ביחידה לוגיקה וזרימת התוכנית
1בקרת זרימה מתקדמת
switch עם `fallthrough`יציאה מלולאות מקוננותהמשך לולאה מסוימתהצהרת `goto`סיכום – שליטה מתקדמת בלולאות4פרויקט: רשימת משימות פשוטה
הגדרת הפרויקטהוספת משימה2מבנים ושיטות
הגדרת שיטות במבניםמקבלי ערךמקבלי מצביעבחירת מקבליםשיטות לעומת פונקציותסיכום — התנהגות המבנים5מפות לעומק
מפות של Structsמצביעים כערכים במפהבדיקה אם מפות הן nilהשוואת מפותסיכום - מונה תדירות מילים8פרויקט: ניהול מלאי פשוט
סקירת הפרויקטבדיקת המלאיתרגלו בעצמכם: קומפיילר Go אונליין