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

ملخص - سلوك الـ Struct

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

challenge icon

التحدي

سهل

في هذا التحدي، ستتدرب على تنفيذ كل من مستقبلي القيمة (value receivers) ومستقبلي المؤشر (pointer receivers) من خلال إنشاء نظام بسيط لإدارة المستطيلات. ستقوم بإنشاء هيكل Rectangle وتعريف نوعين مختلفين من الطرق (methods) التي توضح متى يجب استخدام كل نوع من أنواع المستقبلات.

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

  • سلسلة نصية تمثل عرض المستطيل (مثلاً، "5.0")
  • سلسلة نصية تمثل ارتفاع المستطيل (مثلاً، "3.0")
  • سلسلة نصية تمثل عامل القياس (مثلاً، "2.0")

مهمتك هي:

  1. تعريف هيكل Rectangle بحقلين: Width (float64) و Height (float64)
  2. إنشاء طريقة تسمى area مع مستقبل قيمة (value receiver) تقوم بحساب وإرجاع مساحة المستطيل (العرض × الارتفاع)
  3. إنشاء طريقة تسمى scale مع مستقبل مؤشر (pointer receiver) تقوم بضرب كل من العرض والارتفاع في عامل القياس المعطى
  4. تحليل المدخلات لإنشاء مثيل من Rectangle
  5. طباعة المساحة الأولية باستخدام التنسيق: "Initial area: [area]"
  6. استدعاء طريقة scale مع عامل القياس
  7. طباعة المساحة بعد القياس باستخدام التنسيق: "Scaled area: [area]"

يجب عرض قيم المساحة كأرقام صحيحة عندما تكون كذلك (مثلاً، 15 بدلاً من 15.0)، ولكن مع منازل عشرية عند الضرورة (مثلاً، 15.5). يوضح هذا التحدي المبدأ الأساسي: استخدم مستقبلي القيمة للطرق التي تقرأ البيانات فقط (مثل حساب المساحة) ومستقبلي المؤشر للطرق التي تعدل الهيكل الأصلي (مثل تغيير أبعاد القياس).

جرّب بنفسك

package main

import (
	"fmt"
	"strconv"
)

// TODO: قم بتعريف هيكل Rectangle هنا

// TODO: قم بتنفيذ دالة المساحة (area method) مع مستقبل القيمة (value receiver) هنا

// TODO: قم بتنفيذ دالة القياس (scale method) مع مستقبل المؤشر (pointer receiver) هنا

func main() {
	// قراءة المدخلات
	var widthStr string
	var heightStr string
	var scaleStr string
	fmt.Scanln(&widthStr)
	fmt.Scanln(&heightStr)
	fmt.Scanln(&scaleStr)
	
	// تحويل المدخلات إلى float64
	width, _ := strconv.ParseFloat(widthStr, 64)
	height, _ := strconv.ParseFloat(heightStr, 64)
	scaleFactor, _ := strconv.ParseFloat(scaleStr, 64)
	
	// TODO: قم بإنشاء كائن Rectangle وقم بتنفيذ الحل أدناه
	
	// طباعة المساحة الأولية
	// fmt.Printf("Initial area: %.0f\n", initialArea) // استخدم هذا التنسيق للمخرجات
	
	// تغيير حجم المستطيل
	
	// طباعة المساحة بعد تغيير الحجم
	// fmt.Printf("Scaled area: %.0f\n", scaledArea) // استخدم هذا التنسيق للمخرجات
}

جميع دروس Logic & Flow