ملف مخصص لحمير مثل الدب

مسار مرتب لتعلم C++ من الصفر

افهم الفكرة، شوف المثال، ثم حل السؤال.

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

#include <iostream>
using namespace std;
int main() {
cout << "Learn C++";
return 0;
}
9مواضيع أساسية
18أمثلة كود
90سؤال مع حل

خطة الدراسة المقترحة

1. افهم الهيكلتعرف على شكل برنامج C++ وكيف يطبع البيانات.
2. خزّن البياناتاستخدم الأنواع المناسبة للأرقام والحروف.
3. تحكم بالمنطقاستعمل العمليات، الشروط، switch، والحلقات والرسم بالنجوم لحل مسائل.
4. نظّم الحلاجمع البيانات في arrays واكتب functions قابلة لإعادة الاستخدام.
01

Basics - الأساسيات

شكل البرنامج والطباعة والإدخال

? الشرح

برنامج C++ يبدأ غالبا من الدالة main(). نستخدم #include <iostream> حتى نستعمل cout للطباعة وcin للإدخال. جملة return 0; تعني أن البرنامج انتهى بنجاح.

كل تعليمة في C++ تنتهي بفاصلة منقوطة ;، وهذا خطأ شائع عند المبتدئين.
تريكات امتحان
  • cout يستخدم << للطباعة، أما cin يستخدم >> للإدخال. عكسهم من أشهر الفخاخ.
  • cin >> name يقرأ كلمة واحدة فقط؛ إذا كتبت اسما فيه فراغ سيأخذ أول كلمة فقط.
  • نسيان ; بعد التعليمة يسبب خطأ ترجمة، لكن لا نضعها بعد بداية بلوك مثل int main() {.
  • endl ينزل سطرا جديدا، و"\n" يعمل نفس الفكرة غالبا في مسائل الطباعة.

ex أمثلة

مثال 1: طباعة جملة
#include <iostream>
#include <string>
using namespace std;

int main() {
    cout << "Hello C++";
    return 0;
}
مثال 2: إدخال اسم وطباعة ترحيب
#include <iostream>
using namespace std;

int main() {
    string name;
    cout << "Enter your name: ";
    cin >> name;
    cout << "Welcome " << name;
    return 0;
}

Q أسئلة مع الحلول

سؤال 1: اكتب برنامج يطبع اسمك وعمرك في سطرين.
#include <iostream>
using namespace std;

int main() {
    cout << "Name: Ahmad" << endl;
    cout << "Age: 18";
    return 0;
}
سؤال 2: اقرأ رقم من المستخدم ثم اطبعه.
#include <iostream>
using namespace std;

int main() {
    int number;
    cin >> number;
    cout << "You entered: " << number;
    return 0;
}
02

Data Types - أنواع البيانات

int, double, char, long

? الشرح

المتغير هو مكان في الذاكرة نخزن فيه قيمة. نوع المتغير يحدد نوع القيمة: int للأعداد الصحيحة، double للأعداد العشرية، char لحرف واحد، وlong للأعداد الصحيحة الكبيرة.

اختيار النوع المناسب يجعل الكود أوضح ويمنع فقدان أجزاء من البيانات، مثل الجزء العشري في الأرقام.
تريكات امتحان
  • 5 / 2 الناتج 2 إذا كان الطرفان int، وليس 2.5.
  • للحصول على قسمة عشرية اجعل أحد الطرفين double مثل 5.0 / 2.
  • char يأخذ حرفا واحدا بين علامات مفردة مثل 'A'، وليس "A".
  • الأرقام الكبيرة قد لا تكفيها int، لذلك نستخدم long أو غالبا long long.

ex أمثلة

مثال 1: تعريف متغيرات مختلفة
#include <iostream>
using namespace std;

int main() {
    int age = 20;
    double grade = 92.5;
    char section = 'A';
    long population = 9500000;

    cout << age << endl;
    cout << grade << endl;
    cout << section << endl;
    cout << population;
    return 0;
}
مثال 2: حساب السعر بعد الضريبة
#include <iostream>
using namespace std;

int main() {
    double price = 80.0;
    double tax = 0.16;
    double total = price + (price * tax);

    cout << "Total = " << total;
    return 0;
}

Q أسئلة مع الحلول

سؤال 1: عرف متغيرات تمثل عدد طلاب، معدل، وحرف شعبة.
#include <iostream>
using namespace std;

int main() {
    int students = 30;
    double average = 84.7;
    char group = 'B';

    cout << students << endl;
    cout << average << endl;
    cout << group;
    return 0;
}
سؤال 2: لماذا نستخدم double بدل int للعلامات التي فيها كسور؟

لأن int يخزن أعدادا صحيحة فقط، بينما double يحفظ الأرقام العشرية مثل 91.5.

03

Arithmetic Operators - العمليات الحسابية

+, -, *, /, %

? الشرح

العمليات الحسابية تستخدم لإجراء حسابات داخل البرنامج: الجمع +، الطرح -، الضرب *، القسمة /، وباقي القسمة %.

العملية % تعمل مع الأعداد الصحيحة، وتفيد مثلا لمعرفة إذا كان الرقم زوجيا أو فرديا.
تريكات امتحان
  • الأولوية: * و/ و% قبل + و-. استخدم الأقواس إذا بدك تتحكم بالترتيب.
  • x++ يستخدم قيمة x القديمة ثم يزيدها، أما ++x يزيدها أولا ثم يستخدمها.
  • x = x + 3 تساوي x += 3، وهذا يظهر كثيرا في الحلقات.
  • % لا تستخدم مع double في C++، بل مع الأعداد الصحيحة.

ex أمثلة

مثال 1: العمليات الأساسية
#include <iostream>
using namespace std;

int main() {
    int a = 10, b = 3;

    cout << a + b << endl;
    cout << a - b << endl;
    cout << a * b << endl;
    cout << a / b << endl;
    cout << a % b;
    return 0;
}
مثال 2: مساحة مستطيل
#include <iostream>
using namespace std;

int main() {
    double width = 5.5;
    double height = 3.0;
    double area = width * height;

    cout << "Area = " << area;
    return 0;
}

Q أسئلة مع الحلول

سؤال 1: اكتب برنامج يحسب مجموع رقمين يدخلهما المستخدم.
#include <iostream>
using namespace std;

int main() {
    int x, y;
    cin >> x >> y;
    cout << "Sum = " << x + y;
    return 0;
}
سؤال 2: اكتب شرطا لمعرفة إذا كان الرقم زوجيا باستخدام باقي القسمة.
if (number % 2 == 0) {
    cout << "Even";
} else {
    cout << "Odd";
}
04

Conditional Statements - الجمل الشرطية

if, else if, else

? الشرح

الجمل الشرطية تجعل البرنامج يختار بين أكثر من مسار. إذا كان الشرط صحيحا تنفذ أوامر معينة، وإذا كان خطأ يمكن تنفيذ أوامر أخرى باستخدام else. أما else if فتستخدم لفحص أكثر من احتمال.

المقارنة في C++ تستخدم == للمساواة، وليس = لأن هذه تستخدم للإسناد.
تريكات امتحان
  • if (x = 5) ليست مقارنة؛ هذه تسند 5 داخل x ثم تعتبر الشرط صحيحا لأن 5 ليس صفرا.
  • if (x = 0) يسند صفر، وبعدها الشرط يكون false.
  • أي رقم غير صفر داخل الشرط يعتبر true، والصفر فقط يعتبر false.
  • else ترتبط بأقرب if قبلها إذا ما استخدمت الأقواس، لذلك الأقواس تقلل اللبس.
  • لا تكتب فاصلة منقوطة مباشرة بعد الشرط مثل if (x > 0); لأنها تجعل جسم الشرط منفصلا عنه.

ex أمثلة

مثال 1: ناجح أم راسب
#include <iostream>
using namespace std;

int main() {
    int mark;
    cin >> mark;

    if (mark >= 50) {
        cout << "Pass";
    } else {
        cout << "Fail";
    }

    return 0;
}
مثال 2: تقدير العلامة
#include <iostream>
using namespace std;

int main() {
    int mark;
    cin >> mark;

    if (mark >= 90) {
        cout << "Excellent";
    } else if (mark >= 75) {
        cout << "Very Good";
    } else if (mark >= 50) {
        cout << "Pass";
    } else {
        cout << "Fail";
    }

    return 0;
}

Q أسئلة مع الحلول

سؤال 1: اكتب برنامج يطبع Positive إذا كان الرقم أكبر من صفر.
#include <iostream>
using namespace std;

int main() {
    int number;
    cin >> number;

    if (number > 0) {
        cout << "Positive";
    }

    return 0;
}
سؤال 2: اكتب برنامج يقارن بين رقمين ويطبع الأكبر.
#include <iostream>
using namespace std;

int main() {
    int a, b;
    cin >> a >> b;

    if (a > b) {
        cout << a;
    } else if (b > a) {
        cout << b;
    } else {
        cout << "Equal";
    }

    return 0;
}
05

Switch Statement - جملة switch

switch, case, break, default

? الشرح

نستخدم switch عندما نريد مقارنة قيمة واحدة مع عدة احتمالات ثابتة. كل احتمال نكتبه داخل case، وإذا لم يطابق أي احتمال ينفذ default. غالبا نضع break في نهاية كل case حتى لا يكمل البرنامج تنفيذ الحالات التي بعدها.

switch مناسبة عندما تفحص قيمة محددة مثل رقم يوم، رقم خيار، أو حرف عملية حسابية. أما الشروط المركبة مثل x > 50 فالأفضل لها if.
تريكات امتحان
  • إذا نسيت break سيحدث fall-through، أي سينفذ البرنامج الـ case التالية أيضا.
  • default ليست إجبارية، لكنها مهمة للتعامل مع القيم غير المتوقعة.
  • القيم داخل case يجب أن تكون ثابتة، مثل case 1: أو case 'A':.
  • لا تكتب شرطا داخل case مثل case x > 5:؛ هذا مكانه if وليس switch.
  • تستطيع استخدام char مع switch، مثل آلة حاسبة تعتمد على '+' و'-'.

ex أمثلة

مثال 1: اختيار يوم حسب الرقم
#include <iostream>
using namespace std;

int main() {
    int day;
    cin >> day;

    switch (day) {
        case 1:
            cout << "Sunday";
            break;
        case 2:
            cout << "Monday";
            break;
        default:
            cout << "Invalid day";
    }

    return 0;
}
مثال 2: آلة حاسبة بسيطة
#include <iostream>
using namespace std;

int main() {
    double a, b;
    char op;
    cin >> a >> op >> b;

    switch (op) {
        case '+':
            cout << a + b;
            break;
        case '-':
            cout << a - b;
            break;
        default:
            cout << "Unknown operator";
    }

    return 0;
}

Q أسئلة مع الحلول

06

Loops - الحلقات

for, while, do-while

? الشرح

الحلقات تستخدم لتكرار أوامر بدل كتابتها مرات كثيرة. نستخدم for عندما نعرف عدد التكرارات غالبا، وwhile عندما يعتمد التكرار على شرط، وdo-while عندما نريد تنفيذ الكود مرة واحدة على الأقل قبل فحص الشرط.

انتبه لتحديث العداد داخل الحلقة؛ نسيانه قد يؤدي إلى حلقة لا تنتهي.
تريكات امتحان
  • for (int i = 0; i < n; i++) تكرر n مرات، من 0 إلى n - 1.
  • for (int i = 1; i <= n; i++) تكرر أيضا n مرات، لكن من 1 إلى n.
  • do-while تنفذ مرة واحدة على الأقل حتى لو الشرط خطأ من البداية.
  • نسيان i++ أو أي تحديث للعداد داخل while قد يعمل حلقة لا نهائية.
  • وجود ; بعد رأس الحلقة مثل while (x < 5); فخ خطير لأنه يجعل جسم الحلقة فارغا.

ex أمثلة

مثال 1: for لطباعة الأرقام من 1 إلى 5
#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 5; i++) {
        cout << i << endl;
    }

    return 0;
}
مثال 2: while و do-while
#include <iostream>
using namespace std;

int main() {
    int x = 1;

    while (x <= 3) {
        cout << x << endl;
        x++;
    }

    int y = 1;
    do {
        cout << y << endl;
        y++;
    } while (y <= 3);

    return 0;
}

Q أسئلة مع الحلول

سؤال 1: اطبع الأعداد الزوجية من 2 إلى 10 باستخدام for.
#include <iostream>
using namespace std;

int main() {
    for (int i = 2; i <= 10; i += 2) {
        cout << i << endl;
    }

    return 0;
}
سؤال 2: اجمع الأرقام من 1 إلى n باستخدام while.
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    int i = 1;
    int sum = 0;

    while (i <= n) {
        sum += i;
        i++;
    }

    cout << "Sum = " << sum;
    return 0;
}
07

Star Patterns - الرسم بالنجوم

nested for, rows, columns, spaces

? الشرح

أفكار رسم النجوم تعتمد غالبا على حلقات متداخلة: الحلقة الخارجية تمثل الصفوف rows، والحلقة الداخلية تمثل الأعمدة columns. بعد انتهاء كل صف نطبع endl حتى نبدأ صفا جديدا.

قاعدة ذهبية: قبل كتابة الكود، ارسم الشكل على ورقة وحدد لكل صف كم نجمة وكم فراغ. بعدها حوّل العلاقة إلى شرط أو عدد تكرارات.
تريكات امتحان
  • المربع الكامل: عدد النجوم في كل صف ثابت ويساوي n.
  • المثلث القائم المتزايد: في الصف رقم row نطبع row نجوم.
  • المثلث المقلوب: في الصف رقم row نطبع n - row + 1 نجوم.
  • الهرم يحتاج فراغات قبل النجوم: عدد الفراغات غالبا n - row وعدد النجوم 2 * row - 1.
  • الأشكال الفارغة تعتمد على شروط الحدود مثل أول صف، آخر صف، أول عمود، آخر عمود.

ex أمثلة

مثال 1: مربع نجوم كامل
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    for (int row = 1; row <= n; row++) {
        for (int col = 1; col <= n; col++) {
            cout << "*";
        }
        cout << endl;
    }

    return 0;
}
مثال 2: هرم نجوم
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    for (int row = 1; row <= n; row++) {
        for (int space = 1; space <= n - row; space++) {
            cout << " ";
        }
        for (int star = 1; star <= 2 * row - 1; star++) {
            cout << "*";
        }
        cout << endl;
    }

    return 0;
}

Q أسئلة مع الحلول

08

Arrays - المصفوفات

تخزين عدة قيم من نفس النوع

? الشرح

المصفوفة تخزن أكثر من قيمة من نفس النوع تحت اسم واحد. يبدأ ترقيم العناصر من صفر، لذلك أول عنصر هو arr[0] وليس arr[1].

إذا كان حجم المصفوفة 5، فآخر فهرس هو 4. الوصول إلى فهرس خارج الحجم يسبب أخطاء غير متوقعة.
تريكات امتحان
  • أول عنصر في المصفوفة هو arr[0]، وليس arr[1].
  • إذا كان الحجم 5 فآخر فهرس هو 4. الفهرس arr[5] خارج المصفوفة.
  • في الحلقات مع arrays نكتب غالبا i < size وليس i <= size.
  • عند البحث عن أكبر قيمة، ابدأ بـ arr[0] وليس صفر دائما؛ لأن كل الأرقام قد تكون سالبة.

ex أمثلة

مثال 1: تعريف مصفوفة وطباعة عناصرها
#include <iostream>
using namespace std;

int main() {
    int numbers[5] = {10, 20, 30, 40, 50};

    for (int i = 0; i < 5; i++) {
        cout << numbers[i] << endl;
    }

    return 0;
}
مثال 2: إدخال علامات وحساب المعدل
#include <iostream>
using namespace std;

int main() {
    double marks[4];
    double sum = 0;

    for (int i = 0; i < 4; i++) {
        cin >> marks[i];
        sum += marks[i];
    }

    cout << "Average = " << sum / 4;
    return 0;
}

Q أسئلة مع الحلول

سؤال 1: اكتب برنامج يقرأ 5 أرقام ويطبع مجموعها.
#include <iostream>
using namespace std;

int main() {
    int numbers[5];
    int sum = 0;

    for (int i = 0; i < 5; i++) {
        cin >> numbers[i];
        sum += numbers[i];
    }

    cout << "Sum = " << sum;
    return 0;
}
سؤال 2: اطبع أكبر رقم في مصفوفة حجمها 5.
#include <iostream>
using namespace std;

int main() {
    int arr[5] = {7, 12, 3, 25, 9};
    int maxValue = arr[0];

    for (int i = 1; i < 5; i++) {
        if (arr[i] > maxValue) {
            maxValue = arr[i];
        }
    }

    cout << "Max = " << maxValue;
    return 0;
}
09

Functions - الدوال

تنظيم الكود وإعادة استخدامه

? الشرح

الدالة هي جزء مستقل من الكود ينفذ مهمة محددة. نستخدم الدوال لتقليل التكرار وتنظيم البرنامج. يمكن للدالة أن تستقبل قيم تسمى parameters، ويمكن أن ترجع قيمة باستخدام return.

إذا كانت الدالة لا ترجع قيمة نكتب نوعها void، أما إذا كانت ترجع رقما صحيحا فنكتب int.
تريكات امتحان
  • إذا نوع الدالة int أو double لازم ترجع قيمة مناسبة باستخدام return.
  • void لا ترجع قيمة، لذلك لا تكتب return number; داخلها.
  • المتغيرات داخل الدالة محلية؛ لا تستطيع استخدامها خارج الدالة إلا إذا رجعتها أو أرسلتها لدالة أخرى.
  • ترتيب وأنواع القيم عند استدعاء الدالة لازم يطابق parameters. مثلا add(2, 3) يناسب int add(int a, int b).

ex أمثلة

مثال 1: دالة تطبع رسالة
#include <iostream>
using namespace std;

void printWelcome() {
    cout << "Welcome to C++" << endl;
}

int main() {
    printWelcome();
    printWelcome();
    return 0;
}
مثال 2: دالة ترجع مجموع رقمين
#include <iostream>
using namespace std;

int add(int a, int b) {
    return a + b;
}

int main() {
    int result = add(4, 6);
    cout << "Result = " << result;
    return 0;
}

Q أسئلة مع الحلول

سؤال 1: اكتب دالة ترجع مربع عدد.
#include <iostream>
using namespace std;

int square(int number) {
    return number * number;
}

int main() {
    cout << square(5);
    return 0;
}
سؤال 2: اكتب دالة تستقبل علامتين وترجع المعدل.
#include <iostream>
using namespace std;

double average(double mark1, double mark2) {
    return (mark1 + mark2) / 2;
}

int main() {
    cout << average(80, 90);
    return 0;
}