Menu
Coddy logo textTech

שילוב כל החלקים

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

challenge icon

אתגר

קל

הגיע הזמן להשלים את יישום רשימת המשימות שלך. בשלב האחרון הזה תחבר את כל מה שלמדת בשיעורים הקודמים: את המבנה 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, כמו בשיעורים הקודמים.

עליך:

  1. להגדיר את אותו מבנה Task עם השדות Name (מחרוזת) ו-Completed (בוליאני)
  2. להחזיר את ארבע הפונקציות שכבר כתבת, עם אותן חתימות:
    • addTask(tasks []Task, taskName string) []Task
    • viewAllTasks(tasks []Task), שמדפיסה "[x] [task_name]" עבור משימה שהושלמה ו-"[ ] [task_name]" עבור משימה שעדיין פתוחה
    • completeTask(tasks *[]Task, index int)
    • removeTask(tasks []Task, index int) []Task
  3. לבנות את הרשימה ההתחלתית מהקלט השני, ולזכור ששורה ריקה פירושה רשימה ריקה
  4. להדפיס את הודעת הפתיחה ואת התפריט, בדיוק כמו בשלב הראשון של הפרויקט:
    • "Welcome to [app_name], [user_name]!"
    • "1. Add Task"
    • "2. View Tasks"
    • "3. Complete Task"
    • "4. Remove Task"
    • "5. Exit"
    • "Current tasks: [count]"
  5. להריץ את הפעולות לפי הסדר. כל פעולה מדפיסה תחילה את הכותרת שלה:
    • "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]!". לאחר היציאה לא מתבצעת שום פעולה נוספת.
  6. האינדקסים מתחילים ב-0, כמו בשיעורים הקודמים. כאשר האינדקס של "complete" או "remove" נמצא מחוץ לטווח הרשימה, יש להדפיס במקום זאת "Invalid task number" ולהשאיר את הרשימה ללא שינוי.
  7. שורת הסיכום היא זו שכבר מוכרת לך: "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 לפי הסדר, ולהדפיס תחילה את הכותרת של כל פעולה
}

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

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