خطة الدراسة المقترحة
Basics - الأساسيات
شكل البرنامج والطباعة والإدخالالشرح
برنامج C++ يبدأ غالبا من الدالة main(). نستخدم #include <iostream> حتى نستعمل cout للطباعة وcin للإدخال. جملة return 0; تعني أن البرنامج انتهى بنجاح.
- cout يستخدم << للطباعة، أما cin يستخدم >> للإدخال. عكسهم من أشهر الفخاخ.
- cin >> name يقرأ كلمة واحدة فقط؛ إذا كتبت اسما فيه فراغ سيأخذ أول كلمة فقط.
- نسيان ; بعد التعليمة يسبب خطأ ترجمة، لكن لا نضعها بعد بداية بلوك مثل int main() {.
- endl ينزل سطرا جديدا، و"\n" يعمل نفس الفكرة غالبا في مسائل الطباعة.
أمثلة
#include <iostream>
#include <string>
using namespace std;
int main() {
cout << "Hello C++";
return 0;
}
#include <iostream>
using namespace std;
int main() {
string name;
cout << "Enter your name: ";
cin >> name;
cout << "Welcome " << name;
return 0;
}
أسئلة مع الحلول
سؤال 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;
}
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.
أمثلة
#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;
}
#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;
}
أسئلة مع الحلول
سؤال 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.
Arithmetic Operators - العمليات الحسابية
+, -, *, /, %الشرح
العمليات الحسابية تستخدم لإجراء حسابات داخل البرنامج: الجمع +، الطرح -، الضرب *، القسمة /، وباقي القسمة %.
- الأولوية: * و/ و% قبل + و-. استخدم الأقواس إذا بدك تتحكم بالترتيب.
- x++ يستخدم قيمة x القديمة ثم يزيدها، أما ++x يزيدها أولا ثم يستخدمها.
- x = x + 3 تساوي x += 3، وهذا يظهر كثيرا في الحلقات.
- % لا تستخدم مع double في C++، بل مع الأعداد الصحيحة.
أمثلة
#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;
}
#include <iostream>
using namespace std;
int main() {
double width = 5.5;
double height = 3.0;
double area = width * height;
cout << "Area = " << area;
return 0;
}
أسئلة مع الحلول
سؤال 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";
}
Conditional Statements - الجمل الشرطية
if, else if, elseالشرح
الجمل الشرطية تجعل البرنامج يختار بين أكثر من مسار. إذا كان الشرط صحيحا تنفذ أوامر معينة، وإذا كان خطأ يمكن تنفيذ أوامر أخرى باستخدام else. أما else if فتستخدم لفحص أكثر من احتمال.
- if (x = 5) ليست مقارنة؛ هذه تسند 5 داخل x ثم تعتبر الشرط صحيحا لأن 5 ليس صفرا.
- if (x = 0) يسند صفر، وبعدها الشرط يكون false.
- أي رقم غير صفر داخل الشرط يعتبر true، والصفر فقط يعتبر false.
- else ترتبط بأقرب if قبلها إذا ما استخدمت الأقواس، لذلك الأقواس تقلل اللبس.
- لا تكتب فاصلة منقوطة مباشرة بعد الشرط مثل if (x > 0); لأنها تجعل جسم الشرط منفصلا عنه.
أمثلة
#include <iostream>
using namespace std;
int main() {
int mark;
cin >> mark;
if (mark >= 50) {
cout << "Pass";
} else {
cout << "Fail";
}
return 0;
}
#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;
}
أسئلة مع الحلول
سؤال 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;
}
Switch Statement - جملة switch
switch, case, break, defaultالشرح
نستخدم switch عندما نريد مقارنة قيمة واحدة مع عدة احتمالات ثابتة. كل احتمال نكتبه داخل case، وإذا لم يطابق أي احتمال ينفذ default. غالبا نضع break في نهاية كل case حتى لا يكمل البرنامج تنفيذ الحالات التي بعدها.
- إذا نسيت break سيحدث fall-through، أي سينفذ البرنامج الـ case التالية أيضا.
- default ليست إجبارية، لكنها مهمة للتعامل مع القيم غير المتوقعة.
- القيم داخل case يجب أن تكون ثابتة، مثل case 1: أو case 'A':.
- لا تكتب شرطا داخل case مثل case x > 5:؛ هذا مكانه if وليس switch.
- تستطيع استخدام char مع switch، مثل آلة حاسبة تعتمد على '+' و'-'.
أمثلة
#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;
}
#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;
}
أسئلة مع الحلول
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); فخ خطير لأنه يجعل جسم الحلقة فارغا.
أمثلة
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 5; i++) {
cout << i << endl;
}
return 0;
}
#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;
}
أسئلة مع الحلول
سؤال 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;
}
Star Patterns - الرسم بالنجوم
nested for, rows, columns, spacesالشرح
أفكار رسم النجوم تعتمد غالبا على حلقات متداخلة: الحلقة الخارجية تمثل الصفوف rows، والحلقة الداخلية تمثل الأعمدة columns. بعد انتهاء كل صف نطبع endl حتى نبدأ صفا جديدا.
- المربع الكامل: عدد النجوم في كل صف ثابت ويساوي n.
- المثلث القائم المتزايد: في الصف رقم row نطبع row نجوم.
- المثلث المقلوب: في الصف رقم row نطبع n - row + 1 نجوم.
- الهرم يحتاج فراغات قبل النجوم: عدد الفراغات غالبا n - row وعدد النجوم 2 * row - 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;
}
#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;
}
أسئلة مع الحلول
Arrays - المصفوفات
تخزين عدة قيم من نفس النوعالشرح
المصفوفة تخزن أكثر من قيمة من نفس النوع تحت اسم واحد. يبدأ ترقيم العناصر من صفر، لذلك أول عنصر هو arr[0] وليس arr[1].
- أول عنصر في المصفوفة هو arr[0]، وليس arr[1].
- إذا كان الحجم 5 فآخر فهرس هو 4. الفهرس arr[5] خارج المصفوفة.
- في الحلقات مع arrays نكتب غالبا i < size وليس i <= size.
- عند البحث عن أكبر قيمة، ابدأ بـ arr[0] وليس صفر دائما؛ لأن كل الأرقام قد تكون سالبة.
أمثلة
#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;
}
#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;
}
أسئلة مع الحلول
سؤال 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;
}
Functions - الدوال
تنظيم الكود وإعادة استخدامهالشرح
الدالة هي جزء مستقل من الكود ينفذ مهمة محددة. نستخدم الدوال لتقليل التكرار وتنظيم البرنامج. يمكن للدالة أن تستقبل قيم تسمى parameters، ويمكن أن ترجع قيمة باستخدام return.
- إذا نوع الدالة int أو double لازم ترجع قيمة مناسبة باستخدام return.
- void لا ترجع قيمة، لذلك لا تكتب return number; داخلها.
- المتغيرات داخل الدالة محلية؛ لا تستطيع استخدامها خارج الدالة إلا إذا رجعتها أو أرسلتها لدالة أخرى.
- ترتيب وأنواع القيم عند استدعاء الدالة لازم يطابق parameters. مثلا add(2, 3) يناسب int add(int a, int b).
أمثلة
#include <iostream>
using namespace std;
void printWelcome() {
cout << "Welcome to C++" << endl;
}
int main() {
printWelcome();
printWelcome();
return 0;
}
#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;
}
أسئلة مع الحلول
سؤال 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;
}