Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

تجميع كل الأجزاء

جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 25 من 68.

challenge icon

التحدي

سهل

حان وقت إنهاء تطبيق قائمة المهام. في هذه الخطوة الأخيرة، ستجمع كل ما تعلمته في الدروس السابقة: بنية Task، والدوال addTask وviewAllTasks وcompleteTask وremoveTask، بحيث تُدار بواسطة جلسة من إجراءات القائمة.

ستتلقى ثلاثة مدخلات:

  • سلسلة تحتوي على اسم التطبيق واسم المستخدم، يفصل بينهما فاصلة (مثل: "MyTasks,Alice")
  • سلسلة تحتوي على المهام التي تبدأ بها القائمة، بالتنسيق "name1:status1,name2:status2"، حيث تكون الحالة "true" أو "false" (مثل: "Write report:false,Call dentist:true"). يكون هذا السطر فارغًا عندما تبدأ القائمة فارغة.
  • سلسلة تحتوي على إجراءات الجلسة، تفصل بينها فواصل. يكون الإجراء إما اسمه فقط، أو اسمه ومعامل واحد موصولًا باستخدام | (مثل: "add|Buy groceries,view,complete|2,remove|0,exit"). تنتهي قائمة الإجراءات دائمًا بـ "exit".

تحتوي أسماء المهام على مسافات، لذا اقرأ الأسطر الثلاثة باستخدام bufio.Scanner، كما في الدروس السابقة.

مهمتك هي:

  1. تعريف بنية Task نفسها، مع حقلي Name (من النوع string) وCompleted (من النوع bool)
  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]!". لا يُنفَّذ أي شيء بعد exit.
  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: Bring back addTask, viewAllTasks, completeTask and removeTask
// من الدروس السابقة لهذا المشروع

func main() {
	// إنشاء ماسح لقراءة أسطر الإدخال
	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 عبر الإنترنت