تجميع كل الأجزاء
جزء من قسم Logic & Flow في رحلة GO على Coddy — الدرس 25 من 68.
التحدي
سهلأكمل نظام إدارة المخزون الخاص بك عن طريق إنشاء برنامج رئيسي شامل يدمج جميع الوظائف التي قمت ببنائها في الدروس السابقة. يجمع هذا التحدي النهائي بين تهيئة المخزون، والتحقق من المخزون، وإضافة العناصر، وتحديثات المخزون، وإنشاء التقارير في واجهة سطر أوامر كاملة مع تنقل يعتمد على القائمة.
ستتلقى ثلاثة مدخلات:
- سلسلة نصية تحتوي على بيانات المخزون الأولية بالتنسيق
"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")
مهمتك هي:
- استخدم نفس هيكل
Productمن الدروس السابقة مع حقولPrice(float64) وQuantity(int) - قم بتحليل المدخل الأول وتهيئة خريطة المخزون ببيانات المنتج الموجودة
- اعرض رسالة بدء تشغيل النظام:
"=== INVENTORY MANAGEMENT SYSTEM ===""System initialized with [number_of_products] products""Starting interactive session..."
- قم بتحليل المدخل الثاني للحصول على تسلسل العمليات المطلوب تنفيذها
- قم بتحليل المدخل الثالث للحصول على المعلمات لكل عملية
- لكل عملية في التسلسل، اعرض رأس العملية وقم بالإجراء المقابل:
- لـ
"check": اعرض"--- STOCK CHECK ---"وتحقق من مخزون المنتج المحدد - لـ
"add": اعرض"--- ADD ITEM ---"وأضف المنتج المحدد - لـ
"update": اعرض"--- UPDATE STOCK ---"وحدث مخزون المنتج المحدد - لـ
"report": اعرض"--- GENERATE REPORT ---"وأنشئ التقرير المحدد - لـ
"exit": اعرض"--- SYSTEM EXIT ---"وأظهر معلومات الخروج
- لـ
- قم بتنفيذ دالة
checkStockالتي تعيد الكمية والخطأ كما في الدروس السابقة - قم بتنفيذ دالة
addNewItemالتي تضيف المنتجات وتعيد خطأ كما في الدروس السابقة - قم بتنفيذ دالة
updateStockالتي تحدث الكميات وتعيد خطأ كما في الدروس السابقة - قم بتنفيذ دالة
generateReportالتي تنشئ التقارير كما في الدروس السابقة - لعملية
"check":- استخدم المعلمة كاسم للمنتج المراد التحقق منه
- اعرض:
"Checking stock for: [product_name]" - إذا تم العثور عليه:
"Stock level: [quantity] units" - إذا لم يتم العثور عليه:
"Product not found in inventory"
- لعملية
"add":- قم بتحليل المعلمة بالتنسيق
"product_name:price:quantity" - اعرض:
"Adding new product: [product_name]" - إذا نجحت:
"Product added successfully" - إذا فشلت:
"Failed to add product: [error_message]"
- قم بتحليل المعلمة بالتنسيق
- لعملية
"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]"
- قم بتحليل المعلمة بالتنسيق
- لعملية
"report":- قم بتحليل المعلمة بالتنسيق
"report_type,threshold" - اعرض:
"Generating [report_type] report with threshold [threshold]" - قم بإنشاء وعرض التقرير الكامل كما في الدروس السابقة
- قم بتحليل المعلمة بالتنسيق
- لعملية
"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"
- اعرض إحصائيات المخزون النهائية:
- بعد كل عملية (باستثناء الخروج)، اعرض:
"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
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكيات