تعلم C++ من الصفر، دليل عملي شامل للطلاب الجامعيين

فريق زدني فريق زدني 20 يناير 2026
6 دقائق للقراءة
تعلم C++ من الصفر، دليل عملي شامل للطلاب الجامعيين

إذا كنت طالب جامعي في تخصص علوم الحاسب أو هندسة البرمجيات أو تقنية المعلومات، فالأرجح أن لغة C++ واحدة من أوائل اللغات اللي راح تدرسها. وإذا وصلت لهذا المقال، فأنت تبحث عن شرح واضح وعملي بالعربي يساعدك تفهم الأساسيات بدون تعقيد.

في هذا الدليل، راح نمشي معك خطوة بخطوة من الصفر: من تجهيز بيئة التطوير وكتابة أول برنامج، مرورًا بالمتغيرات والشروط والحلقات والمصفوفات والدوال، وصولًا إلى مقدمة في المؤشرات والبرمجة كائنية التوجه (OOP). كل شيء مشروح بأمثلة عملية وتعليقات بالعربي.

📋 ملخص سريع

  • لماذا C++ مهمة لطلاب الحاسب وأين تُستخدم
  • تجهيز بيئة التطوير: المترجم ومحرر الأكواد
  • المتغيرات وأنواع البيانات (int, float, double, char, string, bool)
  • الإدخال والإخراج باستخدام cin و cout
  • العمليات الحسابية والمنطقية وعمليات المقارنة
  • الشروط (if/else, switch) والحلقات (for, while, do-while)
  • المصفوفات والنصوص
  • الدوال: التعريف، المعاملات، القيم المُرجعة
  • مقدمة في المؤشرات (Pointers) والمراجع (References)
  • مقدمة في البرمجة كائنية التوجه (OOP)
  • نصائح عملية لاجتياز مادة C++ بنجاح

لماذا C++ مهمة لطلاب الحاسب

لغة C++ طورها Bjarne Stroustrup في بداية الثمانينات كامتداد للغة C، وإلى اليوم تُعتبر من أقوى لغات البرمجة وأكثرها استخدامًا في المجالات التالية:

  • المواد الجامعية الأساسية: كثير من الجامعات تعتمد C++ في مواد مثل برمجة 1 و 2، هياكل البيانات، والخوارزميات
  • البرمجة التنافسية: أغلب المتسابقين في مسابقات مثل ICPC و Codeforces يستخدمون C++ لأنها سريعة ومرنة
  • برمجة الأنظمة: أنظمة التشغيل، محركات الألعاب، برامج التشغيل (drivers)، والأنظمة المدمجة (embedded systems) كلها تعتمد على C++
  • الأداء العالي: لأنها قريبة من العتاد (hardware)، تعطيك تحكم كامل في الذاكرة والأداء
  • أساس قوي: فهم C++ يسهّل عليك تعلم أي لغة ثانية مثل Java أو Python أو C#

باختصار، C++ ليست مجرد مادة تعدّيها وتنساها. هي أساس يُبنى عليه فهمك للبرمجة والأنظمة بشكل عام.

تجهيز بيئة التطوير

قبل ما تكتب أي سطر كود، تحتاج شيئين: مترجم (Compiler) ومحرر أكواد أو بيئة تطوير (IDE).

أولًا: تثبيت المترجم

المترجم هو البرنامج اللي يحوّل كودك المكتوب بلغة C++ إلى برنامج قابل للتنفيذ.

على Windows:

تثبيت MinGW

  1. حمّل MinGW من الموقع الرسمي mingw-w64.org
  2. ثبّته واختر المسار الافتراضي
  3. أضف مسار bin الخاص بـ MinGW إلى متغير البيئة PATH
  4. افتح Command Prompt واكتب:
g++ --version

إذا ظهر رقم الإصدار، فالتثبيت تم بنجاح.

على Mac:

xcode-select --install

على Linux (Ubuntu/Debian):

sudo apt update && sudo apt install g++

ثانيًا: اختيار بيئة التطوير (IDE)

أشهر الخيارات لطلاب C++:

  • VS Code، مجاني وخفيف، يحتاج إضافة C/C++ من Microsoft. الأكثر شيوعًا حاليًا
  • Code::Blocks، مجاني ومصمم خصيصًا لـ C++، يأتي مع مترجم جاهز
  • Dev-C++، بسيط وسهل الاستخدام، مناسب جدًا للمبتدئين
  • CLion، احترافي من JetBrains، مجاني للطلاب بحساب أكاديمي

💡 نصيحة

إذا كنت مبتدئ تمامًا، ابدأ بـ Code::Blocks لأنه يأتي مع المترجم جاهز ولا يحتاج إعدادات إضافية. وإذا الدكتور يستخدم بيئة معينة في المحاضرات، استخدم نفسها، لا تعقّد حياتك في البداية.

أول برنامج: Hello World

// أول برنامج لك بلغة C++
#include <iostream>  // مكتبة الإدخال والإخراج
using namespace std; // عشان ما نكتب std:: قبل كل أمر

int main() {
    cout << "مرحبًا بالعالم!" << endl;
    return 0; // يعني البرنامج انتهى بنجاح
}

احفظ الملف باسم hello.cpp ثم ترجمه وشغّله:

g++ hello.cpp -o hello
./hello

لنفهم كل سطر:

  • #include <iostream>: نستورد مكتبة الإدخال والإخراج
  • using namespace std;: عشان نستخدم cout و cin مباشرة بدون كتابة std:: قبلها
  • int main(): نقطة البداية لأي برنامج C++
  • cout << "نص": طباعة نص على الشاشة
  • endl: نزول سطر جديد
  • return 0: إنهاء البرنامج بنجاح

المتغيرات وأنواع البيانات

المتغير (Variable) هو مكان في الذاكرة تخزّن فيه قيمة معينة. في C++، لازم تحدد نوع البيانات لكل متغير عند تعريفه.

أنواع البيانات الأساسية

#include <iostream>
#include <string>
using namespace std;

int main() {
    // عدد صحيح
    int age = 21;

    // عدد عشري (دقة عادية)
    float gpa = 3.75f;

    // عدد عشري (دقة مزدوجة - أكثر دقة)
    double pi = 3.14159265;

نكمل تعريف بقية أنواع البيانات: الحروف والنصوص والقيم المنطقية:

    // حرف واحد
    char grade = 'A';

    // نص (سلسلة محارف)
    string name = "أحمد";

    // قيمة منطقية (صح أو خطأ)
    bool passed = true;

بعد تعريف المتغيرات، نطبع قيمها باستخدام cout:

    // طباعة القيم
    cout << "الاسم: " << name << endl;
    cout << "العمر: " << age << endl;
    cout << "المعدل: " << gpa << endl;
    cout << "التقدير: " << grade << endl;
    cout << "ناجح: " << passed << endl;

    return 0;
}

ℹ️ الفرق بين float و double

كلاهما يخزّن أعداد عشرية، لكن double أدق (يخزّن حوالي 15 رقم عشري مقابل 7 لـ float). في الحالات العادية، استخدم double لأنه الافتراضي في C++. استخدم float فقط إذا كنت تحتاج توفير ذاكرة.

الثوابت (Constants)

إذا كانت عندك قيمة ما تتغير، عرّفها كثابت باستخدام const:

const double TAX_RATE = 0.15;    // نسبة الضريبة - لا يمكن تغييرها
const int MAX_STUDENTS = 40;     // أقصى عدد طلاب

الإدخال والإخراج (Input/Output)

#include <iostream>
#include <string>
using namespace std;

int main() {
    string name;
    int age;
    double gpa;

    // الإخراج - طباعة على الشاشة
    cout << "أدخل اسمك: ";

    // الإدخال - قراءة من المستخدم
    cin >> name;

    cout << "أدخل عمرك: ";
    cin >> age;

بعد قراءة البيانات، نطبع النتائج باستخدام cout:

    cout << "أدخل معدلك: ";
    cin >> gpa;

    // طباعة النتائج
    cout << "مرحبًا " << name << "!" << endl;
    cout << "عمرك: " << age << " سنة" << endl;
    cout << "معدلك: " << gpa << endl;

    return 0;
}

⚠️ مشكلة شائعة مع cin

إذا كنت تريد قراءة نص يحتوي على مسافات (مثل “محمد أحمد”)، استخدم getline(cin, name) بدلًا من cin >> name، لأن cin >> تتوقف عند أول مسافة. وإذا استخدمت cin >> قبل getline، أضف cin.ignore() بينهما لتجنب مشاكل القراءة.

العمليات (Operators)

العمليات الحسابية

int a = 10, b = 3;

cout << a + b << endl;  // الجمع: 13
cout << a - b << endl;  // الطرح: 7
cout << a * b << endl;  // الضرب: 30
cout << a / b << endl;  // القسمة الصحيحة: 3 (بدون كسور لأن النوع int)
cout << a % b << endl;  // باقي القسمة: 1

// للحصول على نتيجة عشرية
double result = (double)a / b;  // 3.33333

عمليات المقارنة

int x = 5, y = 10;

cout << (x == y) << endl;  // يساوي: 0 (false)
cout << (x != y) << endl;  // لا يساوي: 1 (true)
cout << (x > y)  << endl;  // أكبر من: 0
cout << (x < y)  << endl;  // أصغر من: 1
cout << (x >= y) << endl;  // أكبر من أو يساوي: 0
cout << (x <= y) << endl;  // أصغر من أو يساوي: 1

العمليات المنطقية

bool a = true, b = false;

cout << (a && b) << endl;  // AND (و): false - لازم الاثنين true
cout << (a || b) << endl;  // OR (أو): true - يكفي واحد true
cout << (!a) << endl;      // NOT (نفي): false - يعكس القيمة

عمليات الزيادة والنقصان

int counter = 5;
counter++;   // زيادة بواحد - الآن counter = 6
counter--;   // نقصان بواحد - الآن counter = 5
counter += 3; // زيادة بثلاثة - الآن counter = 8
counter *= 2; // ضرب في اثنين - الآن counter = 16

الشروط (Conditionals)

if / else if / else

#include <iostream>
using namespace std;

int main() {
    double gpa;
    cout << "أدخل معدلك: ";
    cin >> gpa;

بعد قراءة المعدل من المستخدم، نتحقق من قيمته باستخدام سلسلة شروط:

    // التحقق من المعدل وتحديد التقدير
    if (gpa >= 4.5) {
        cout << "ممتاز مرتفع" << endl;
    } else if (gpa >= 3.75) {
        cout << "ممتاز" << endl;
    } else if (gpa >= 2.75) {
        cout << "جيد جدًا" << endl;
    } else if (gpa >= 2.0) {
        cout << "جيد" << endl;
    } else {
        cout << "تحتاج تحسين" << endl;
    }

    return 0;
}

switch

جملة switch مفيدة لما تقارن متغير واحد بعدة قيم محددة:

#include <iostream>
using namespace std;

int main() {
    int day;
    cout << "أدخل رقم اليوم (1-7): ";
    cin >> day;

    switch (day) {
        case 1:
            cout << "الأحد" << endl;
            break;
        case 2:
            cout << "الإثنين" << endl;
            break;
        case 3:
            cout << "الثلاثاء" << endl;
            break;

ونكمل بقية أيام الأسبوع مع الحالة الافتراضية للأرقام غير الصحيحة:

        case 4:
            cout << "الأربعاء" << endl;
            break;
        case 5:
            cout << "الخميس" << endl;
            break;
        case 6:
            cout << "الجمعة" << endl;
            break;
        case 7:
            cout << "السبت" << endl;
            break;
        default:
            cout << "رقم غير صحيح!" << endl;
    }

    return 0;
}

⚠️ لا تنسَ break!

إذا نسيت كلمة break بعد كل حالة (case) في switch، التنفيذ راح يستمر للحالة اللي بعدها تلقائيًا. هذا خطأ شائع جدًا يسبب نتائج غير متوقعة.

الشروط والحلقات في C++ مش واضحة لك؟

نشرح لك if/else و switch و loops بأمثلة عملية تناسب واجبك. أرسل لنا السؤال ونمشي معك خطوة بخطوة.

اطلب شرح الآن

الحلقات (Loops)

حلقة for

تُستخدم عندما تعرف عدد التكرارات مسبقًا:

// طباعة الأرقام من 1 إلى 10
for (int i = 1; i <= 10; i++) {
    cout << i << " ";
}
cout << endl;
// الخرج: 1 2 3 4 5 6 7 8 9 10

// حساب مجموع الأرقام من 1 إلى 100
int sum = 0;
for (int i = 1; i <= 100; i++) {
    sum += i;
}
cout << "المجموع: " << sum << endl; // 5050

حلقة while

تُستخدم عندما لا تعرف عدد التكرارات مسبقًا:

#include <iostream>
using namespace std;

int main() {
    int password;
    int correctPassword = 1234;

    // استمر بطلب كلمة المرور حتى يدخلها صحيحة
    cout << "أدخل كلمة المرور: ";
    cin >> password;

    while (password != correctPassword) {
        cout << "خطأ! حاول مرة أخرى: ";
        cin >> password;
    }

    cout << "تم الدخول بنجاح!" << endl;

    return 0;
}

حلقة do-while

مثل while لكن تضمن تنفيذ الكود مرة واحدة على الأقل:

#include <iostream>
using namespace std;

int main() {
    int choice;

    do {
        cout << "=== القائمة ===" << endl;
        cout << "1. عرض الدرجات" << endl;
        cout << "2. إضافة درجة" << endl;
        cout << "3. حساب المعدل" << endl;
        cout << "0. خروج" << endl;
        cout << "اختيارك: ";
        cin >> choice;

داخل الحلقة نستخدم switch لتنفيذ العملية المطلوبة حسب اختيار المستخدم:

        switch (choice) {
            case 1: cout << "عرض الدرجات..." << endl; break;
            case 2: cout << "إضافة درجة..." << endl; break;
            case 3: cout << "حساب المعدل..." << endl; break;
            case 0: cout << "إلى اللقاء!" << endl; break;
            default: cout << "اختيار غير صحيح" << endl;
        }
    } while (choice != 0);

    return 0;
}

💡 متى تستخدم كل حلقة؟

  • for: عندما تعرف عدد التكرارات (مثل: طباعة 10 أرقام، المرور على عناصر مصفوفة)
  • while: عندما لا تعرف متى ستتوقف (مثل: انتظار إدخال صحيح من المستخدم)
  • do-while: مثل while لكن تريد التنفيذ مرة واحدة على الأقل (مثل: عرض قائمة خيارات)

المصفوفات (Arrays)

المصفوفة هي مجموعة من العناصر من نفس النوع مخزّنة بشكل متتالي في الذاكرة.

المصفوفة الأحادية

#include <iostream>
using namespace std;

int main() {
    // تعريف مصفوفة من 5 عناصر
    int grades[5] = {85, 92, 78, 95, 88};

    // طباعة كل العناصر
    cout << "الدرجات:" << endl;
    for (int i = 0; i < 5; i++) {
        cout << "الطالب " << i + 1 << ": " << grades[i] << endl;
    }

بعد طباعة العناصر، نحسب المتوسط ونبحث عن أعلى درجة:

    // حساب المتوسط
    int sum = 0;
    for (int i = 0; i < 5; i++) {
        sum += grades[i];
    }
    double average = (double)sum / 5;
    cout << "المتوسط: " << average << endl;

    // البحث عن أعلى درجة
    int maxGrade = grades[0];
    for (int i = 1; i < 5; i++) {
        if (grades[i] > maxGrade) {
            maxGrade = grades[i];
        }
    }
    cout << "أعلى درجة: " << maxGrade << endl;

    return 0;
}

المصفوفة الثنائية الأبعاد

#include <iostream>
using namespace std;

int main() {
    // مصفوفة 3 صفوف × 4 أعمدة (مثلا: 3 طلاب و 4 مواد)
    int grades[3][4] = {
        {85, 90, 78, 92},  // درجات الطالب الأول
        {88, 76, 95, 80},  // درجات الطالب الثاني
        {91, 85, 82, 88}   // درجات الطالب الثالث
    };

نستخدم حلقتين متداخلتين للمرور على الصفوف والأعمدة وطباعة الدرجات:

    // طباعة الدرجات
    for (int i = 0; i < 3; i++) {
        cout << "الطالب " << i + 1 << ": ";
        for (int j = 0; j < 4; j++) {
            cout << grades[i][j] << "\t";
        }
        cout << endl;
    }

    return 0;
}

النصوص (Strings)

#include <iostream>
#include <string>
using namespace std;

int main() {
    string firstName = "محمد";
    string lastName = "أحمد";

    // دمج النصوص
    string fullName = firstName + " " + lastName;
    cout << "الاسم الكامل: " << fullName << endl;

    // طول النص
    cout << "عدد الأحرف: " << fullName.length() << endl;

    // الوصول لحرف معين
    string greeting = "Hello";
    cout << "أول حرف: " << greeting[0] << endl; // H

يمكنك أيضًا البحث داخل النصوص واستخراج أجزاء منها:

    // البحث في نص
    string text = "Welcome to C++ programming";
    if (text.find("C++") != string::npos) {
        cout << "تم العثور على C++!" << endl;
    }

    // استخراج جزء من النص
    string sub = text.substr(11, 3); // من الموقع 11 بطول 3
    cout << "الجزء: " << sub << endl; // C++

    return 0;
}

الدوال (Functions)

الدالة هي كتلة من الكود تنفّذ مهمة محددة. بدل ما تكرر نفس الكود عدة مرات، تكتبه مرة واحدة في دالة وتستدعيها متى ما احتجت.

تعريف واستدعاء الدوال

#include <iostream>
using namespace std;

// دالة بدون قيمة مُرجعة (void)
void printLine(int length) {
    for (int i = 0; i < length; i++) {
        cout << "-";
    }
    cout << endl;
}

// دالة تُرجع قيمة
double calculateAverage(int grades[], int size) {
    int sum = 0;
    for (int i = 0; i < size; i++) {
        sum += grades[i];
    }
    return (double)sum / size;
}

وهنا دوال إضافية: واحدة تتحقق من كون العدد زوجي وأخرى تُرجع الأكبر بين عددين:

// دالة تتحقق من كون العدد زوجي
bool isEven(int number) {
    return number % 2 == 0;
}

// دالة تُرجع الأكبر بين عددين
int getMax(int a, int b) {
    if (a > b) return a;
    else return b;
}

نستدعي جميع الدوال في main لنرى نتائجها:

int main() {
    printLine(30);

    int grades[] = {85, 92, 78, 95, 88};
    cout << "المتوسط: " << calculateAverage(grades, 5) << endl;

    cout << "هل 4 زوجي؟ " << isEven(4) << endl;    // 1 (true)
    cout << "هل 7 زوجي؟ " << isEven(7) << endl;    // 0 (false)
    cout << "الأكبر: " << getMax(15, 22) << endl;   // 22

    printLine(30);

    return 0;
}

التمرير بالقيمة والتمرير بالمرجع

#include <iostream>
using namespace std;

// التمرير بالقيمة - نسخة من المتغير
void doubleByValue(int x) {
    x = x * 2;
    // التغيير لا يؤثر على المتغير الأصلي
}

// التمرير بالمرجع - المتغير نفسه
void doubleByReference(int &x) {
    x = x * 2;
    // التغيير يؤثر على المتغير الأصلي
}

نختبر الفرق بين الطريقتين في main:

int main() {
    int num = 5;

    doubleByValue(num);
    cout << "بعد التمرير بالقيمة: " << num << endl;    // 5 - ما تغيّر

    doubleByReference(num);
    cout << "بعد التمرير بالمرجع: " << num << endl;     // 10 - تغيّر!

    return 0;
}

متى تستخدم التمرير بالمرجع؟ استخدم التمرير بالمرجع (&) في حالتين: أولًا عندما تريد الدالة تعدّل القيمة الأصلية، وثانيًا عندما تمرر متغيرات كبيرة (مثل مصفوفات أو كائنات) لتجنب نسخها في الذاكرة وتحسين الأداء.

واجب الدوال والمصفوفات صعب عليك؟

الدوال والمصفوفات من أكثر المواضيع اللي يحتاج فيها الطلاب مساعدة. أرسل واجبك ونوضّح لك طريقة الحل.

أرسل واجبك

المؤشرات والمراجع (Pointers & References)

المؤشرات من أهم المفاهيم في C++ واللي تميزها عن كثير من اللغات الأخرى. المؤشر هو متغير يخزّن عنوان متغير آخر في الذاكرة.

المؤشرات (Pointers)

#include <iostream>
using namespace std;

int main() {
    int age = 21;

    // & تعطيك عنوان المتغير في الذاكرة
    cout << "قيمة age: " << age << endl;
    cout << "عنوان age: " << &age << endl;

    // * تعرّف مؤشر يخزّن عنوان
    int *ptr = &age;

بعد تعريف المؤشر، نستخدمه للوصول إلى القيمة وتعديلها:

    cout << "قيمة المؤشر (العنوان): " << ptr << endl;
    cout << "القيمة المخزنة في العنوان: " << *ptr << endl;  // 21

    // تغيير القيمة عبر المؤشر
    *ptr = 25;
    cout << "age بعد التعديل عبر المؤشر: " << age << endl;  // 25

    return 0;
}

المراجع (References)

المرجع هو اسم بديل (alias) لمتغير موجود:

int original = 10;
int &ref = original;  // ref هو اسم ثاني لنفس المتغير

ref = 20;
cout << original << endl;  // 20 - تغيّرت لأن ref و original نفس الشيء

💡 لا تقلق من المؤشرات

المؤشرات ممكن تبدو معقدة في البداية، وهذا طبيعي. المهم تفهم الفكرة الأساسية: المؤشر يخزّن عنوان في الذاكرة وليس قيمة مباشرة. مع الممارسة، راح تتضح الصورة أكثر. ركّز على فهم المفهوم الآن ولا تحاول تحفظ كل التفاصيل.

مقدمة في البرمجة كائنية التوجه (OOP)

البرمجة كائنية التوجه (Object-Oriented Programming) هي طريقة لتنظيم الكود عن طريق تجميع البيانات والدوال المرتبطة فيها في وحدة واحدة تسمى كلاس (Class).

الكلاس والكائن

#include <iostream>
#include <string>
using namespace std;

// تعريف كلاس الطالب
class Student {
private:
    // البيانات - خاصة لا يمكن الوصول لها مباشرة من الخارج
    string name;
    int id;
    double gpa;

public:
    // الدالة البانية (Constructor) - تُنفذ عند إنشاء كائن جديد
    Student(string n, int i, double g) {
        name = n;
        id = i;
        gpa = g;
    }

بعد الدالة البانية، نضيف دوال الوصول (Getters) والتعديل (Setters) ودالة العرض:

    // دوال الوصول (Getters)
    string getName() { return name; }
    int getId() { return id; }
    double getGpa() { return gpa; }

    // دوال التعديل (Setters)
    void setGpa(double newGpa) {
        if (newGpa >= 0 && newGpa <= 5.0) {
            gpa = newGpa;
        } else {
            cout << "معدل غير صالح!" << endl;
        }
    }

ثم نضيف دالة display لعرض بيانات الطالب ونغلق الكلاس:

    // دالة لعرض بيانات الطالب
    void display() {
        cout << "الاسم: " << name << endl;
        cout << "الرقم الجامعي: " << id << endl;
        cout << "المعدل: " << gpa << endl;
    }
};

الآن نستخدم الكلاس في main لإنشاء كائنات والتعامل معها:

int main() {
    // إنشاء كائن (Object) من الكلاس
    Student s1("سارة", 441001234, 4.25);
    Student s2("خالد", 441005678, 3.80);

    // استدعاء الدوال
    s1.display();
    cout << "---" << endl;
    s2.display();

    // تعديل المعدل عبر setter
    s2.setGpa(4.0);
    cout << "\nبعد التعديل:" << endl;
    s2.display();

    return 0;
}

مفاهيم OOP الأساسية

التغليف (Encapsulation): إخفاء البيانات وجعل الوصول لها عبر دوال محددة فقط. في المثال أعلاه، gpa من نوع private ولا يمكن تغييره إلا عبر setGpa اللي تتحقق من صحة القيمة أولًا.

الوراثة (Inheritance): إنشاء كلاس جديد يرث خصائص ودوال كلاس موجود:

// الكلاس الأب
class Person {
protected:
    string name;
    int age;

public:
    Person(string n, int a) : name(n), age(a) {}

    void introduce() {
        cout << "أنا " << name << " وعمري " << age << " سنة" << endl;
    }
};

الآن ننشئ كلاس UniversityStudent الذي يرث من Person ويضيف خاصية التخصص:

// الكلاس الابن - يرث من Person
class UniversityStudent : public Person {
private:
    string major;

public:
    UniversityStudent(string n, int a, string m)
        : Person(n, a), major(m) {}

    void showDetails() {
        introduce(); // دالة موروثة من الأب
        cout << "التخصص: " << major << endl;
    }
};

تعدد الأشكال (Polymorphism): نفس الدالة تتصرف بطرق مختلفة حسب نوع الكائن. ستتعمق في هذه المفاهيم أكثر في مادة البرمجة كائنية التوجه (OOP).

ℹ️ OOP في مادة C++

في مادة برمجة 1 أو مقدمة C++، غالبًا يُطلب منك فهم أساسيات الكلاسات والكائنات والتغليف فقط. الوراثة وتعدد الأشكال والكلاسات المجردة عادة تُغطى بتفصيل أكبر في مادة برمجة 2 أو مادة OOP المستقلة.

المؤشرات والـ OOP معقّدة عليك؟ عادي، الكل يمر بهذا

المؤشرات والبرمجة كائنية التوجه من أصعب أجزاء C++. نبسّطها لك بأمثلة واقعية ونساعدك تجتاز المادة بثقة.

تواصل معنا

أخطاء شائعة يقع فيها المبتدئون

1. نسيان الفاصلة المنقوطة

// خطأ - راح يعطيك compilation error
cout << "مرحبا"

// صح
cout << "مرحبا";

2. الخلط بين = و ==

int x = 5;

// هذا تعيين - يضع القيمة 10 في x
x = 10;

// هذا مقارنة - يتحقق هل x يساوي 10
if (x == 10) { ... }

3. تجاوز حدود المصفوفة

int arr[3] = {1, 2, 3};
// العناصر: arr[0], arr[1], arr[2]
cout << arr[3]; // خطأ! تجاوزت الحدود - سلوك غير متوقع

في C++ هذا الخطأ خطير لأن المترجم لن يعطيك تحذير، البرنامج ببساطة يقرأ من مكان خاطئ في الذاكرة.

4. نسيان break في switch

// بدون break، التنفيذ يستمر للحالة التالية
switch (x) {
    case 1:
        cout << "واحد";
        // نسيت break هنا!
    case 2:
        cout << "اثنين";
        break;
}
// إذا x = 1، سيطبع: واحداثنين

5. استخدام متغير بدون تهيئة

int x;          // لم يُعطَ قيمة ابتدائية
cout << x;      // قيمة عشوائية (garbage value) - نتيجة غير متوقعة

6. الحلقات اللا نهائية

// خطأ - i لن يتغير أبدًا
int i = 0;
while (i < 10) {
    cout << i;
    // نسيت i++ - حلقة لا نهائية!
}

نصائح لاجتياز مادة C++ بنجاح

  • اكتب الكود بيدك: لا تكتفِ بقراءة الأمثلة. افتح المحرر واكتب كل مثال بنفسك وجرّب تعديله
  • افهم رسائل الأخطاء: المترجم يخبرك بالضبط ما المشكلة ورقم السطر. اقرأ الرسالة قبل ما تبحث في Google
  • قسّم المشكلة لخطوات: إذا الواجب يبدو معقد، قسّمه لمهام صغيرة وحل كل واحدة لوحدها
  • استخدم الورقة والقلم: قبل ما تكتب كود، ارسم الخطوات على ورقة. خصوصًا للحلقات والمصفوفات
  • مارس يوميًا: نصف ساعة كل يوم أفضل من 5 ساعات يوم الاختبار
  • حل تمارين إضافية: مواقع مثل HackerRank و LeetCode فيها تمارين مرتبة حسب المستوى
  • لا تنسخ الحل: إذا واجهتك مشكلة، حاول بنفسك أولًا. النسخ ما يعلّمك شيء ويضرّك في الاختبار
  • راجع مفاهيم المؤشرات: كثير من الطلاب يتعثرون فيها. خصص وقت إضافي لفهمها بالأمثلة العملية

💡 نصيحة ذهبية

البرمجة مثل السباحة، لا يمكنك تعلمها بالقراءة فقط. لازم تنزل الماء وتمارس. كل خطأ تواجهه وتحله هو درس جديد يقرّبك من الفهم الحقيقي. لا تيأس إذا ما اشتغل الكود من أول مرة. هذا طبيعي حتى عند المحترفين.

الخلاصة

في هذا المقال غطينا أساسيات لغة C++ اللي تحتاجها كطالب جامعي: من تجهيز البيئة إلى المتغيرات والشروط والحلقات والمصفوفات والدوال، مع مقدمة في المؤشرات والبرمجة كائنية التوجه. هذه المفاهيم هي الأساس اللي ستبني عليه في المواد المتقدمة مثل هياكل البيانات والخوارزميات.

المفتاح هو الممارسة المستمرة. كل يوم اكتب كود، جرّب أشياء جديدة، وحل تمارين. وإذا كنت تبحث عن مصادر إضافية، اطلع على أفضل مصادر تعلم البرمجة المجانية.

واجب C++ واقفك؟ نساعدك تفهمه وتحله

من المؤشرات إلى الكلاسات والـ OOP، أرسل لنا واجبك ونشرح لك الحل خطوة بخطوة عشان تتعلم وتنجز بثقة.

أرسل واجبك على واتساب
هل تحتاج خصوصي؟