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

إكمال مهمة

جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 23 من 68.

challenge icon

التحدي

سهل

في هذا الجزء من نظام إدارة المهام الخاص بك، ستقوم بتنفيذ القدرة على تحديد المهام كمكتملة. يركز هذا التحدي على استخدام مستقبلات المؤشرات (pointer receivers) لتعديل بيانات المهام الأصلية، مما يوضح كيف تسمح لك المؤشرات بتحديث حقول الهياكل (struct fields) بشكل دائم.

ملاحظة هامة: نظراً لأن أسماء المهام قد تحتوي على مسافات (مثل "Buy groceries")، ستحتاج إلى استخدام bufio.Scanner لقراءة أسطر كاملة من المدخلات. تتوقف وظيفة fmt.Scanf عن القراءة عند أول مسافة، مما قد يؤدي إلى تجزئة أسماء المهام التي تحتوي على مسافات. استخدم bufio.NewScanner(os.Stdin) واستدعِ scanner.Scan() متبوعة بـ scanner.Text() لقراءة أسطر كاملة.

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

  • سلسلة نصية تمثل عدد المهام (مثلاً، "4")
  • سلسلة نصية تحتوي على بيانات المهام بالتنسيق التالي: "name1:status1,name2:status2,name3:status3" حيث تكون الحالة إما "true" أو "false" (مثلاً، "Buy groceries:false,Call dentist:true,Finish project:false,Review code:false")
  • سلسلة نصية تمثل فهرس (index) المهمة المراد إكمالها (مثلاً، "2" للمهمة الثالثة، باستخدام الفهرسة التي تبدأ من 0)

مهمتك هي:

  1. تعريف نفس هيكل Task من التحديات السابقة مع حقول Name (string) و Completed (bool)
  2. إنشاء وظيفة تسمى completeTask تأخذ مؤشراً إلى شريحة (slice) من هياكل Task وفهرساً (int) كمعاملات
  3. داخل وظيفة completeTask، قم بتعديل حقل Completed للمهمة عند الفهرس المعطى إلى true
  4. استخدم bufio.Scanner لقراءة أسطر المدخلات بشكل صحيح:
    • أنشئ ماسحاً ضوئياً: scanner := bufio.NewScanner(os.Stdin)
    • لكل سطر مدخلات: استدعِ scanner.Scan() ثم scanner.Text()
    • هذا يضمن قراءة أسماء المهام التي تحتوي على مسافات بشكل صحيح
  5. قم بتحليل بيانات المهام من المدخل الثاني لإنشاء شريحة المهام الخاصة بك:
    • قسم المدخلات بواسطة الفواصل للحصول على إدخالات المهام الفردية
    • لكل إدخال، قسم بواسطة النقطتين الرأسيتين لفصل الاسم والحالة
    • حول سلسلة الحالة النصية إلى قيمة منطقية ("true" تصبح true، و "false" تصبح false)
  6. حول سلسلة الفهرس النصية (المدخل الثالث) إلى عدد صحيح للحصول على فهرس المهمة
  7. استدعِ وظيفة completeTask مع مؤشر إلى شريحتك والفهرس
  8. بعد إكمال المهمة، اعرض جميع المهام باستخدام نفس التنسيق من التحدي السابق:
    • للمهام المكتملة: "[x] [task_name]"
    • للمهام غير المكتملة: "[ ] [task_name]"
  9. اطبع رسالة تأكيد: "Task '[task_name]' marked as completed!"
  10. اطبع الملخص المحدث: "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)
}

جميع دروس Logic & Flow