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

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

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

challenge icon

التحدي

سهل

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

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

  • سلسلة نصية تحتوي على بيانات المخزون الأولية بالتنسيق "product1:price1:quantity1,product2:price2:quantity2,product3:price3:quantity3" (على سبيل المثال، "Laptop:999.99:5,Mouse:25.50:15,Keyboard:75.00:8")
  • سلسلة نصية تحتوي على تسلسل لعمليات القائمة بالتنسيق "operation1,operation2,operation3" حيث يمكن أن تكون العمليات "check"، أو "add"، أو "update"، أو "report"، أو "exit" (على سبيل المثال، "check,add,update,report,exit")
  • سلسلة نصية تحتوي على معلمات العمليات بالتنسيق "param1|param2|param3" حيث تتوافق كل معلمة مع العملية في نفس الموضع (على سبيل المثال، "Mouse|Monitor:299.99:10|Laptop:5|full,10")

مهمتك هي:

  1. استخدم نفس هيكل Product من الدروس السابقة مع حقول Price (float64) و Quantity (int)
  2. قم بتحليل المدخل الأول وتهيئة خريطة المخزون ببيانات المنتج الموجودة
  3. اعرض رسالة بدء تشغيل النظام:
    • "=== INVENTORY MANAGEMENT SYSTEM ==="
    • "System initialized with [number_of_products] products"
    • "Starting interactive session..."
  4. قم بتحليل المدخل الثاني للحصول على تسلسل العمليات المطلوب تنفيذها
  5. قم بتحليل المدخل الثالث للحصول على المعلمات لكل عملية
  6. لكل عملية في التسلسل، اعرض رأس العملية وقم بالإجراء المقابل:
    • لـ "check": اعرض "--- STOCK CHECK ---" وتحقق من مخزون المنتج المحدد
    • لـ "add": اعرض "--- ADD ITEM ---" وأضف المنتج المحدد
    • لـ "update": اعرض "--- UPDATE STOCK ---" وحدث مخزون المنتج المحدد
    • لـ "report": اعرض "--- GENERATE REPORT ---" وأنشئ التقرير المحدد
    • لـ "exit": اعرض "--- SYSTEM EXIT ---" وأظهر معلومات الخروج
  7. قم بتنفيذ دالة checkStock التي تعيد الكمية والخطأ كما في الدروس السابقة
  8. قم بتنفيذ دالة addNewItem التي تضيف المنتجات وتعيد خطأ كما في الدروس السابقة
  9. قم بتنفيذ دالة updateStock التي تحدث الكميات وتعيد خطأ كما في الدروس السابقة
  10. قم بتنفيذ دالة generateReport التي تنشئ التقارير كما في الدروس السابقة
  11. لعملية "check":
    • استخدم المعلمة كاسم للمنتج المراد التحقق منه
    • اعرض: "Checking stock for: [product_name]"
    • إذا تم العثور عليه: "Stock level: [quantity] units"
    • إذا لم يتم العثور عليه: "Product not found in inventory"
  12. لعملية "add":
    • قم بتحليل المعلمة بالتنسيق "product_name:price:quantity"
    • اعرض: "Adding new product: [product_name]"
    • إذا نجحت: "Product added successfully"
    • إذا فشلت: "Failed to add product: [error_message]"
  13. لعملية "update":
    • قم بتحليل المعلمة بالتنسيق "product_name:change"
    • اعرض: "Updating stock for: [product_name]"
    • إذا نجحت وكان التغيير موجباً: "Added [change] units. New stock: [new_quantity]"
    • إذا نجحت وكان التغيير سالباً: "Removed [absolute_change] units. New stock: [new_quantity]"
    • إذا فشلت: "Update failed: [error_message]"
  14. لعملية "report":
    • قم بتحليل المعلمة بالتنسيق "report_type,threshold"
    • اعرض: "Generating [report_type] report with threshold [threshold]"
    • قم بإنشاء وعرض التقرير الكامل كما في الدروس السابقة
  15. لعملية "exit":
    • اعرض إحصائيات المخزون النهائية:
      • "Final inventory status:"
      • "Total products: [total_products]"
      • "Total items: [total_items]"
      • "Total value: $[total_value]"
    • اعرض: "Session completed successfully"
    • اعرض: "Thank you for using the Inventory Management System"
  16. بعد كل عملية (باستثناء الخروج)، اعرض: "Operation completed. Continuing to next operation..."

استخدم حزمة strings لتقسيم سلاسل الإدخال، وحزمة strconv لتحويل السلاسل إلى أرقام، وحزمة errors لمعالجة الأخطاء، وحزمة fmt للإخراج المنسق، وحزمة sort للفرز الأبجدي. قم بتنسيق جميع الأسعار والقيم إلى منزلتين عشريتين. يوضح هذا التحدي كيفية إنشاء نظام تفاعلي كامل يدمج مكونات وظيفية متعددة في تجربة مستخدم متماسكة مع معالجة مناسبة للأخطاء وإدارة الحالة.

جرّب بنفسك

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

type Task struct {
	Name      string
	Completed bool
}

func removeTask(tasks []Task, index int) []Task {
	return append(tasks[:index], tasks[index+1:]...)
}

func main() {
	// Read input using bufio.Scanner to handle spaces properly
	scanner := bufio.NewScanner(os.Stdin)
	
	scanner.Scan()
	_ = scanner.Text() // Read but don't use the number of tasks
	
	scanner.Scan()
	taskData := scanner.Text()
	
	scanner.Scan()
	indexStr := scanner.Text()
	
	// Parse task data
	taskEntries := strings.Split(taskData, ",")
	var tasks []Task
	
	for _, entry := range taskEntries {
		parts := strings.Split(entry, ":")
		if len(parts) >= 2 {
			name := parts[0]
			status := parts[1] == "true"
			tasks = append(tasks, Task{Name: name, Completed: status})
		}
	}
	
	// Convert index string to integer
	index, _ := strconv.Atoi(indexStr)
	
	// Store the name of the task to be removed
	removedTaskName := tasks[index].Name
	
	// Remove the task
	tasks = removeTask(tasks, index)
	
	// Display remaining tasks
	completedCount := 0
	for _, task := range tasks {
		if task.Completed {
			fmt.Printf("[x] %s\n", task.Name)
			completedCount++
		} else {
			fmt.Printf("[ ] %s\n", task.Name)
		}
	}
	
	// Print confirmation message
	fmt.Printf("Task '%s' removed successfully!\n", removedTaskName)
	
	// Print summary
	totalCount := len(tasks)
	incompleteCount := totalCount - completedCount
	fmt.Printf("Total: %d tasks (%d completed, %d remaining)\n", totalCount, completedCount, incompleteCount)
}

جميع دروس Logic & Flow