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

ملخص - سجلات الطلاب

جزء من قسم Object Oriented Programming في رحلة GO على Coddy — الدرس 51 من 107.

challenge icon

التحدي

سهل

لنقم ببناء نظام لسجلات الطلاب يوضح مفهوم التغليف (encapsulation) بشكل صحيح. ستقوم بإنشاء هيكل لإدارة الطلاب حيث يتم حماية البيانات الأكاديمية الحساسة مع توفير وصول محكوم من خلال دوال مصممة جيداً.

ستقوم بتنظيم الكود الخاص بك عبر ملفين:

  • student.go: قم بإنشاء هيكل Student يحمي المعلومات الحساسة مع كشف البيانات العامة الآمنة. يجب أن يكون Name الخاص بالطالب مصدراً (يمكن الوصول إليه علناً)، ولكن يجب أن يكون grade (من نوع float64) و studentID (من نوع string) غير مصدرين لحماية هذه المعلومات الحساسة.

    قم بتنفيذ ما يلي:

    • منشئ (constructor) باسم NewStudent(name, id string, initialGrade float64) *Student يقوم بإنشاء طالب. يجب تعيين الدرجة الأولية فقط إذا كانت بين 0 و 100 (شاملة)؛ خلاف ذلك، اجعل القيمة الافتراضية 0.
    • دالة جلب (getter) باسم Grade() float64 تعيد الدرجة الحالية.
    • دالة جلب (getter) باسم StudentID() string تعيد معرف الطالب.
    • دالة تعيين (setter) باسم SetGrade(newGrade float64) bool تقوم بتحديث الدرجة فقط إذا كانت القيمة الجديدة بين 0 و 100 (شاملة). تعيد true إذا تم تحديث الدرجة، و false خلاف ذلك.
    • دالة Summary() string تعيد التنسيق التالي: [Name] (ID: [studentID]) - Grade: [grade]
  • main.go: اقرأ معلومات الطالب من المدخلات، وأنشئ طالباً باستخدام المنشئ، ثم قم بإجراء عمليات على الدرجات. اعرض ملخص الطالب بعد الإنشاء وبعد كل محاولة تحديث للدرجة.

سيتم توفير المدخلات التالية:

  • السطر 1: اسم الطالب
  • السطر 2: معرف الطالب
  • السطر 3: الدرجة الأولية
  • السطر 4: الدرجة الجديدة الأولى المراد تعيينها
  • السطر 5: الدرجة الجديدة الثانية المراد تعيينها

بعد إنشاء الطالب، اطبع ملخصه. ثم حاول إجراء كل تحديث للدرجة — إذا نجح، اطبع الملخص المحدث؛ وإذا رُفض، اطبع Invalid grade rejected. قم بتنسيق جميع قيم الدرجات بمنزلتين عشريتين.

على سبيل المثال، إذا كانت المدخلات Emma Wilson، STU001، 85.5، 92.0، و 150، يجب أن يكون مخرجك:

Emma Wilson (ID: STU001) - Grade: 85.50
Emma Wilson (ID: STU001) - Grade: 92.00
Invalid grade rejected

يفشل التحديث الأخير لأن 150 خارج النطاق الصالح. تفرض دالة التعيين (setter) هذه القاعدة، مما يحافظ على صحة بيانات الطالب. لاحظ كيف لا يمكن الوصول إلى studentID و grade مباشرة أبداً — يجب أن يستخدم الكود الخارجي دوال الجلب والتعيين للتفاعل مع هذه البيانات المحمية.

جرّب بنفسك

package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)

	// قراءة اسم الطالب
	name, _ := reader.ReadString('\n')
	name = strings.TrimSpace(name)

	// قراءة الرقم التعريفي للطالب
	id, _ := reader.ReadString('\n')
	id = strings.TrimSpace(id)

	// قراءة الدرجة الأولية
	initialGradeStr, _ := reader.ReadString('\n')
	initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)

	// قراءة الدرجة الجديدة الأولى
	newGrade1Str, _ := reader.ReadString('\n')
	newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)

	// قراءة الدرجة الجديدة الثانية
	newGrade2Str, _ := reader.ReadString('\n')
	newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)

	// TODO: إنشاء طالب جديد باستخدام منشئ NewStudent

	// TODO: طباعة ملخص الطالب بعد الإنشاء

	// TODO: محاولة تحديث الدرجة الأولى
	// إذا نجحت العملية، اطبع الملخص المحدث
	// إذا تم الرفض، اطبع "Invalid grade rejected"

	// TODO: محاولة تحديث الدرجة الثانية
	// إذا نجحت العملية، اطبع الملخص المحدث
	// إذا تم الرفض، اطبع "Invalid grade rejected"

	// Hint: استخدم fmt.Sprintf مع %.2f لتنسيق الدرجات في Summary()
	_ = newGrade1 // قم بإزالة هذا السطر عند استخدام المتغير
	_ = newGrade2 // قم بإزالة هذا السطر عند استخدام المتغير
}

جميع دروس Object Oriented Programming