ملخص - فهم المؤشرات
جزء من قسم Fundamentals في رحلة GO على Coddy. الدرس 66 من 109.
التحدي
متوسطفي هذا التحدي، ستقوم ببناء نظام بسيط لإدارة المخزون لمتجر صغير. ستستخدم المؤشرات (pointers) لتحديث كميات المخزون، وحساب القيم، وتتبع التغييرات.
أكمل الوظائف الثلاث أدناه:
-
updateQuantity(quantity *int, change int) (int, bool)
قم بتعديل القيمة الموجودة فيquantityعن طريق إضافةchange(قيمة سالبة للمبيعات، وموجبة لإعادة التعبئة).
إذا كانت النتيجة ستصبح أقل من0، فقم بتعيين*quantityإلى0بدلاً من ذلك.
قم بإرجاع الكمية الجديدة وقيمة منطقية (boolean) تكونtrueإذا أصبح العنصر الآن خارج المخزون (*quantity == 0). -
calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64
احسبtotalValueكـfloat64(quantity) * price.
إذا كانتtotalValueأكبر من*highestValue، فقم بتحديث*highestValueوتعيين*mostValuableItemإلىitemNameباستخدام المؤشرات.
أرجعtotalValue. -
displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64)
اطبع اسم كل عنصر، وكميته (المستخرجة من المؤشر الخاص به)، وقيمته المحسوبة باستخدامfmt.Printf.
التنسيق:Apples: 10 (Value: $5.00)— استخدم%.2fللأسعار.
المخرجات المتوقعة للمخزون الأولي هي:
Initial Inventory: Apples: 10 (Value: $5.00) Oranges: 15 (Value: $10.50) Bananas: 8 (Value: $2.40) Total inventory value: $17.90 Most valuable item: Oranges
نصيحة: استخدم *quantity لقراءة أو كتابة القيمة التي يشير إليها المؤشر. على سبيل المثال، *quantity += change يقوم بتعديل المتغير الأصلي مباشرة.
جرّب بنفسك
package main
import "fmt"
// updateQuantity تقوم بتحديث كمية عنصر ما وتعيد الكمية الجديدة
// وما إذا كان العنصر قد نفد من المخزون (الكمية = 0)
func updateQuantity(quantity *int, change int) (int, bool) {
// TODO: قم بتحديث مؤشر الكمية وإرجاع القيمة الجديدة وحالة نفاد المخزون
return 0, false
}
// calculateValue تحسب القيمة الإجمالية لعنصر بناءً على الكمية والسعر
// وتقوم أيضاً بتحديث mostValuableItem إذا كان هذا العنصر أكثر قيمة
func calculateValue(itemName string, quantity int, price float64, mostValuableItem *string, highestValue *float64) float64 {
// TODO: احسب القيمة الإجمالية، وحدث mostValuableItem إذا لزم الأمر، وأرجع القيمة الإجمالية
return 0.0
}
// displayInventory تطبع تفاصيل المخزون
// تستخدم المؤشرات للسماح للدالة بعرض البيانات في الوقت الفعلي
func displayInventory(apples, oranges, bananas *int, applePrice, orangePrice, bananaPrice float64) {
fmt.Printf("Apples: %d (Value: $%.2f)\n", *apples, float64(*apples) * applePrice)
fmt.Printf("Oranges: %d (Value: $%.2f)\n", *oranges, float64(*oranges) * orangePrice)
fmt.Printf("Bananas: %d (Value: $%.2f)\n", *bananas, float64(*bananas) * bananaPrice)
}
func main() {
// تهيئة المخزون
apples := 10
oranges := 15
bananas := 8
// الأسعار
applePrice := 0.5 // $0.50 لكل وحدة
orangePrice := 0.7 // $0.70 لكل وحدة
bananaPrice := 0.3 // $0.30 لكل وحدة
// تتبع العنصر الأكثر قيمة
var mostValuableItem string
var highestValue float64
// عرض المخزون الأولي
fmt.Println("Initial Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// حساب القيم الأولية والعثور على العنصر الأكثر قيمة
appleValue := calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
orangeValue := calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
bananaValue := calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
fmt.Printf("Most valuable item: %s\n\n", mostValuableItem)
// محاكاة بعض المبيعات
fmt.Println("Processing sales...")
_, applesOutOfStock := updateQuantity(&apples, -4) // بيع 4 تفاحات
_, orangesOutOfStock := updateQuantity(&oranges, -8) // بيع 8 برتقالات
_, bananasOutOfStock := updateQuantity(&bananas, -10) // محاولة بيع 10 موزات (أكثر مما لدينا)
// التحقق مما إذا كان أي من العناصر قد نفد
if applesOutOfStock {
fmt.Println("Apples are out of stock!")
}
if orangesOutOfStock {
fmt.Println("Oranges are out of stock!")
}
if bananasOutOfStock {
fmt.Println("Bananas are out of stock!")
}
// عرض المخزون المحدث
fmt.Println("\nUpdated Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// إعادة تعيين تتبع العنصر الأكثر قيمة لإعادة الحساب
mostValuableItem = ""
highestValue = 0
// إعادة حساب القيم
appleValue = calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
orangeValue = calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
bananaValue = calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
fmt.Printf("Most valuable item: %s\n\n", mostValuableItem)
// إعادة تزويد المخزون
fmt.Println("Restocking...")
updateQuantity(&apples, 5) // إضافة 5 تفاحات
updateQuantity(&oranges, 10) // إضافة 10 برتقالات
updateQuantity(&bananas, 12) // إضافة 12 موزة
// عرض المخزون النهائي
fmt.Println("\nFinal Inventory:")
displayInventory(&apples, &oranges, &bananas, applePrice, orangePrice, bananaPrice)
// إعادة تعيين تتبع العنصر الأكثر قيمة للحساب النهائي
mostValuableItem = ""
highestValue = 0
// حساب القيمة النهائية
appleValue = calculateValue("Apples", apples, applePrice, &mostValuableItem, &highestValue)
orangeValue = calculateValue("Oranges", oranges, orangePrice, &mostValuableItem, &highestValue)
bananaValue = calculateValue("Bananas", bananas, bananaPrice, &mostValuableItem, &highestValue)
fmt.Printf("Total inventory value: $%.2f\n", appleValue+orangeValue+bananaValue)
fmt.Printf("Most valuable item: %s\n", mostValuableItem)
}جميع دروس Fundamentals
4معاملات المقارنة والمعاملات المنطقية
معاملات المقارنة - الجزء 1معاملات المقارنة - الجزء 2معامل AND المنطقيمعامل OR المنطقيمعامل NOT المنطقيأساسيات أولوية المعاملاتملخص - إجراء المقارنات7تدفق التحكم: الحلقات التكرارية
شرح حلقة `for`حلقة `for` - أساسياتحلقة `for` - بشرط فقطالكلمة المفتاحية `break`الكلمة المفتاحية `continue`الحلقات المتداخلةملخص - تكرار العمليات2المتغيرات وأنواع البيانات الأساسية
ما هو المتغير؟استنتاج النوع باستخدام `:=`الأعداد الصحيحة (int)أرقام الفاصلة العائمةالقيم المنطقية (Booleans)النصوص (Strings)القيم الصفريةالثوابتقواعد التسميةملخص - المتغيرات والأنواع5الإدخال والإخراج الأساسي
المخرجات المنسقةرموز التنسيقطباعة الأنواعالحصول على مدخلات المستخدم الأساسيةملخص - الإدخال والإخراج8الدوال
فهم الدوالالتصريح عن دالةاستدعاء الدوالمعاملات الدالةإرجاع قيمة واحدةإرجاع قيم متعددةقيم الإرجاع المسماةأساسيات نطاق الدالةملخص - إنشاء كود قابل لإعادة الاستخدام3المعاملات الأساسية
المعاملات الحسابيةمعامل القسمةمعامل باقي القسمةمعامل التعيينمعاملات التعيين المركبةالزيادة والنقصانملخص - الحسابات6تدفق التحكم: الجمل الشرطية
جملة `if`الكلمة المفتاحية `else`الكلمة المفتاحية `else if`تظليل المتغيرات في `if`تهيئة المتغيراتجملة `switch``switch` مع التعبيرات`switch` بدون تعبيرالكلمة المفتاحية `fallthrough`ملخص - اتخاذ القراراتتدرّب بنفسك: مترجم Go عبر الإنترنت