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

مراجعة - نظام سجلات الطلاب

جزء من قسم البرمجة كائنية التوجه في رحلة C++ على Coddy. الدرس 39 من 104.

حان الوقت لتطبيق معرفتك بالتغليف عمليًا! في هذا التحدي، ستبني نظام سجلات الطلاب يوضّح الاستخدام السليم لمحدّدات الوصول، وإخفاء المعلومات، والفئات المتداخلة.

سيدير نظامك بيانات الطلاب باستخدام مبادئ التغليف التالية:

  • أعضاء بيانات خاصة لحماية المعلومات الحساسة مثل الدرجات ومعرّفات الطلاب
  • واجهة عامة تتضمن دوال الحصول ومُعيّنات مضبوطة
  • فئة متداخلة لتمثيل درجات المقررات الفردية، مع إبقاء هذه التفاصيل التنفيذية محصورة داخل فئة الطالب

إليك البنية التي ستنفّذها:

class Student {
public:
    class Grade {    // فئة متداخلة لدرجات المقررات
        // ...
    };
    
    // واجهة عامة للتفاعل مع بيانات الطالب
    
private:
    std::string name;
    int studentId;
    // مجموعة من الدرجات
};

يجمع هذا التحدي كل ما ورد في هذا الفصل: اختيار مستويات الوصول المناسبة، وإخفاء تفاصيل التنفيذ خلف واجهة واضحة، واستخدام الفئات المتداخلة لتنظيم الأنواع المرتبطة. فكّر مليًا في ما ينبغي أن يكون متاحًا وما ينبغي أن يظل مخفيًا.

challenge icon

التحدي

سهل

لنَبْنِ نظامًا لسجلات Student يجمع كل ما تعلمته عن التغليف. ستنشئ نظامًا تكون فيه بيانات الطلاب محمية بشكل صحيح، وتتم إدارة الدرجات من خلال فئة متداخلة، وتحدث جميع التفاعلات عبر واجهة عامة نظيفة.

ستنشئ ملفين لتنظيم التعليمات البرمجية:

  • Student.h: عرّف فئة Student توضّح التغليف الصحيح باستخدام فئة Grade متداخلة.

    يجب أن تخزّن فئة Grade المتداخلة (المُعلنة في القسم العام من Student) اسم المقرر (سلسلة نصية) والدرجة (عددًا عشريًا). امنحها مُنشئًا يأخذ القيمتين، ووفّر طريقتي getCourseName() وgetScore() للوصول إلى البيانات. تحافظ فئة Grade على خصوصية بياناتها؛ وعلى الرغم من أنها متداخلة داخل Student، فإنها تظل تحافظ على تغليفها الخاص.

    يجب أن تحتوي فئة Student على أعضاء خاصة لاسم الطالب (سلسلة نصية)، ومعرّف الطالب (عدد صحيح)، وcollection من مؤشرات Grade. وفّر ما يلي:

    • مُنشئًا يأخذ الاسم ومعرّف الطالب
    • دالتي Getter هما getName() وgetStudentId() (وكلاهما const)
    • طريقة addGrade(const std::string& course, double score) تنشئ كائن Grade جديدًا وتضيفه إلى سجل الطالب (أضِف فقط إذا كانت الدرجة between 0 و100 شاملًا)
    • طريقة getAverageGrade() (const) تحسب متوسط جميع الدرجات وتُعيده، أو تعيد 0.0 إذا لم توجد أي درجات
    • طريقة displayRecord() (const) تعرض السجل الكامل للطالب

    لا تنسَ تنظيف الدرجات المخصّصة dynamically في المُدمّر، وinclude حواجز التضمين المناسبة لملف الترويسة.

  • main.cpp: اقرأ اسم الطالب، ومعرّف الطالب، وثلاث درجات لمقررات من الإدخال. سيتكون تنسيق الإدخال من خمسة أسطر: الاسم، ثم المعرّف، ثم ثلاثة أسطر يحتوي كل منها على اسم مقرر ودرجة تفصل بينهما مسافة (مثلًا: Math 95.5).

    أنشئ كائن Student باستخدام الاسم والمعرّف، ثم أضف الدرجات الثلاث، وبعد ذلك اعرض السجل الكامل.

    يجب أن يكون تنسيق الإخراج للطريقة displayRecord() كما يلي:

    Student: <name> (ID: <id>)
    Grades:
      <course1>: <score1>
      <course2>: <score2>
      <course3>: <score3>
    Average: <average>

نسّق جميع الدرجات والمتوسط بمنزلة عشرية واحدة باستخدام std::fixed وstd::setprecision(1) من <iomanip>. حوّل المعرّف باستخدام std::stoi() والدرجات باستخدام std::stod().

يجمع هذا التحدي بين أعضاء البيانات الخاصة، وGetters العامة، وSetters المضبوطة مع التحقق، وفئة متداخلة: حيث تعمل جميعها معًا لإنشاء نظام سجلات طلابي جيد التغليف.

جرّب بنفسك

#include <iostream>
#include <string>
#include <sstream>
#include "Student.h"

int main() {
    // اقرأ اسم الطالب
    std::string name;
    std::getline(std::cin, name);
    
    // اقرأ معرف الطالب
    std::string idStr;
    std::getline(std::cin, idStr);
    int studentId = std::stoi(idStr);
    
    // اقرأ ثلاث درجات للمواد (الصيغة: "CourseName Score")
    std::string line1, line2, line3;
    std::getline(std::cin, line1);
    std::getline(std::cin, line2);
    std::getline(std::cin, line3);
    
    // TODO: حلّل كل سطر لاستخراج اسم المادة والدرجة
    // استخدم std::stod() لتحويل سلاسل الدرجات إلى doubles
    
    // TODO: أنشئ كائن Student بالاسم والمعرف
    
    // TODO: أضف الدرجات الثلاث جميعها إلى الطالب
    
    // TODO: اعرض سجل الطالب الكامل
    
    return 0;
}
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C++ عبر الإنترنت