📌 أولًا: ما هو الـ Stack؟
الـ Stack (المكدس) هو بنية بيانات (Data Structure) بتشتغل بنظام:
Last In, First Out (LIFO) = "اللي يدخل آخر يخرج أول".
📦 زي كومة أطباق، آخر طبق تحطه فوق هو أول طبق تاخده.
---
📌 ثانيًا: ما هو الـ Call Stack؟
الـ Call Stack هو مكان في الذاكرة بيحتفظ فيه البرنامج بكل الاستدعاءات (calls) للدوال (functions) اللي شغالة في اللحظة دي.
يعني:
كل ما تنادي على دالة → بيتضاف "إطار" (Stack Frame) في الـ call stack.
لما تخلص الدالة → بيتشال الإطار من الـ stack.
---
📌 ثالثًا: ما هو Stack Frame؟
كل دالة بتستدعيها ليها "صندوق خاص" (Stack Frame) بيتخزن فيه:
1. عنوان العودة (Return Address): عشان لما تخلص الدالة يعرف يرجع فين.
2. المتغيرات المحلية (Local Variables) داخل الدالة.
3. البراميترز (Parameters) اللي اتبعتت للدالة.
---
📌 رابعًا: مثال عملي في C++
#include <iostream>
using namespace std;
void funcC() {
int c = 30;
cout << "Inside funcC, c = " << c << endl;
}
void funcB() {
int b = 20;
cout << "Inside funcB, b = " << b << endl;
funcC(); // استدعاء funcC
}
void funcA() {
int a = 10;
cout << "Inside funcA, a = " << a << endl;
funcB(); // استدعاء funcB
}
int main() {
cout << "Program start" << endl;
funcA(); // استدعاء funcA
cout << "Program end" << endl;
return 0;
}
---
🧠 إيه اللي بيحصل في الـ Call Stack؟
1. يبدأ البرنامج في main() → يتضاف Stack Frame خاص بـ main.
2. main استدعى funcA → يتضاف Stack Frame لـ funcA.
3. funcA استدعى funcB → يتضاف Stack Frame لـ funcB.
4. funcB استدعى funcC → يتضاف Stack Frame لـ funcC.
5. funcC خلصت → بيتشال Stack Frame بتاعها.
6. يرجع لـ funcB → يكمل وينتهي → يتم حذفه.
7. يرجع لـ funcA → يكمل وينتهي → يتم حذفه.
8. في الآخر يرجع لـ main → يكمل وينتهي → يتم حذفه.
---
📌 خامسًا: أهمية الـ Call Stack
تتبع الاستدعاءات: يعرف البرنامج أي دالة بتشتغل حاليًا.
إدارة الذاكرة: يخزن المتغيرات المحلية مؤقتًا.
التصحيح (Debugging): لما يحصل خطأ (مثلاً Stack Overflow) المترجم بيطبع "Stack Trace" يوضح سلسلة الاستدعاءات.
---
🎯 الخلاصة:
الـ Call Stack = دفتر متابعة الاستدعاءات للدوال.
كل دالة بتتنادى → ليها صندوق خاص (Stack Frame).
بيتشال الصندوق أول ما الدالة تخلص.
شبيه بكومة أطباق → "آخر دالة تدخل هي أول دالة تخرج".
الـ Stack (المكدس) هو بنية بيانات (Data Structure) بتشتغل بنظام:
Last In, First Out (LIFO) = "اللي يدخل آخر يخرج أول".
📦 زي كومة أطباق، آخر طبق تحطه فوق هو أول طبق تاخده.
---
📌 ثانيًا: ما هو الـ Call Stack؟
الـ Call Stack هو مكان في الذاكرة بيحتفظ فيه البرنامج بكل الاستدعاءات (calls) للدوال (functions) اللي شغالة في اللحظة دي.
يعني:
كل ما تنادي على دالة → بيتضاف "إطار" (Stack Frame) في الـ call stack.
لما تخلص الدالة → بيتشال الإطار من الـ stack.
---
📌 ثالثًا: ما هو Stack Frame؟
كل دالة بتستدعيها ليها "صندوق خاص" (Stack Frame) بيتخزن فيه:
1. عنوان العودة (Return Address): عشان لما تخلص الدالة يعرف يرجع فين.
2. المتغيرات المحلية (Local Variables) داخل الدالة.
3. البراميترز (Parameters) اللي اتبعتت للدالة.
---
📌 رابعًا: مثال عملي في C++
#include <iostream>
using namespace std;
void funcC() {
int c = 30;
cout << "Inside funcC, c = " << c << endl;
}
void funcB() {
int b = 20;
cout << "Inside funcB, b = " << b << endl;
funcC(); // استدعاء funcC
}
void funcA() {
int a = 10;
cout << "Inside funcA, a = " << a << endl;
funcB(); // استدعاء funcB
}
int main() {
cout << "Program start" << endl;
funcA(); // استدعاء funcA
cout << "Program end" << endl;
return 0;
}
---
🧠 إيه اللي بيحصل في الـ Call Stack؟
1. يبدأ البرنامج في main() → يتضاف Stack Frame خاص بـ main.
2. main استدعى funcA → يتضاف Stack Frame لـ funcA.
3. funcA استدعى funcB → يتضاف Stack Frame لـ funcB.
4. funcB استدعى funcC → يتضاف Stack Frame لـ funcC.
5. funcC خلصت → بيتشال Stack Frame بتاعها.
6. يرجع لـ funcB → يكمل وينتهي → يتم حذفه.
7. يرجع لـ funcA → يكمل وينتهي → يتم حذفه.
8. في الآخر يرجع لـ main → يكمل وينتهي → يتم حذفه.
---
📌 خامسًا: أهمية الـ Call Stack
تتبع الاستدعاءات: يعرف البرنامج أي دالة بتشتغل حاليًا.
إدارة الذاكرة: يخزن المتغيرات المحلية مؤقتًا.
التصحيح (Debugging): لما يحصل خطأ (مثلاً Stack Overflow) المترجم بيطبع "Stack Trace" يوضح سلسلة الاستدعاءات.
---
🎯 الخلاصة:
الـ Call Stack = دفتر متابعة الاستدعاءات للدوال.
كل دالة بتتنادى → ليها صندوق خاص (Stack Frame).
بيتشال الصندوق أول ما الدالة تخلص.
شبيه بكومة أطباق → "آخر دالة تدخل هي أول دالة تخرج".
من اين يبدأ تنفيذ البرنامج
من الدول الأساسية
Int main وتعتبر
نقطة الانطلاق entry point
طيب
📌 ما معنى Entry Point؟
Entry Point = هو المكان الأول اللي يبدأ منه تنفيذ البرنامج.
زي "باب البداية" أو "نقطة البداية" اللي المترجم (Compiler) بيخش منها عشان يشغل الكود.
---
📌 في C++
في لغة C++، الـ Entry Point الافتراضية هي الدالة main().
يعني مهما كان عندك دوال أو كلاسات أو ملفات... التنفيذ لازم يبدأ من main.
#include <iostream>
using namespace std;
int main() {
cout << "Program started here!" << endl;
return 0;
}
🔹 هنا:
main هي Entry Point.
المترجم بيروح مباشرةً ليها ويبدأ يقرأ التعليمات منها خطوة بخطوة.
---
📌 طيب إزاي البرنامج يعرف يرجع بعد ما يخلص؟
الدالة main() لازم ترجع قيمة عددية (int).
القيمة دي بتروح لنظام التشغيل (OS) وتوضح إذا كان البرنامج خلص بنجاح ولا حصل خطأ.
return 0; → البرنامج خلص بنجاح.
أي رقم آخر → فيه خطأ أو حالة خاصة.
---
📌 أمثلة واقعية:
1. برنامج بسيط:
int main() {
return 0; // نقطة البداية ونهاية التنفيذ
}
2. مع دوال أخرى:
#include <iostream>
using namespace std;
void sayHello() {
cout << "Hello!" << endl;
}
int main() {
sayHello(); // التنفيذ يبدأ هنا
return 0;
}
🔹 مهما كان فيه دوال ثانية (sayHello) التنفيذ مش هيبدأ بيها، لازم يمر بـ main() الأول.
---
📌 الخلاصة:
Entry Point = المكان اللي يبدأ منه تشغيل البرنامج.
في C++، الـ Entry Point دائمًا هي main().
من خلالها تقدر تستدعي باقي الدوال والكلاسات.
من الدول الأساسية
Int main وتعتبر
نقطة الانطلاق entry point
طيب
📌 ما معنى Entry Point؟
Entry Point = هو المكان الأول اللي يبدأ منه تنفيذ البرنامج.
زي "باب البداية" أو "نقطة البداية" اللي المترجم (Compiler) بيخش منها عشان يشغل الكود.
---
📌 في C++
في لغة C++، الـ Entry Point الافتراضية هي الدالة main().
يعني مهما كان عندك دوال أو كلاسات أو ملفات... التنفيذ لازم يبدأ من main.
#include <iostream>
using namespace std;
int main() {
cout << "Program started here!" << endl;
return 0;
}
🔹 هنا:
main هي Entry Point.
المترجم بيروح مباشرةً ليها ويبدأ يقرأ التعليمات منها خطوة بخطوة.
---
📌 طيب إزاي البرنامج يعرف يرجع بعد ما يخلص؟
الدالة main() لازم ترجع قيمة عددية (int).
القيمة دي بتروح لنظام التشغيل (OS) وتوضح إذا كان البرنامج خلص بنجاح ولا حصل خطأ.
return 0; → البرنامج خلص بنجاح.
أي رقم آخر → فيه خطأ أو حالة خاصة.
---
📌 أمثلة واقعية:
1. برنامج بسيط:
int main() {
return 0; // نقطة البداية ونهاية التنفيذ
}
2. مع دوال أخرى:
#include <iostream>
using namespace std;
void sayHello() {
cout << "Hello!" << endl;
}
int main() {
sayHello(); // التنفيذ يبدأ هنا
return 0;
}
🔹 مهما كان فيه دوال ثانية (sayHello) التنفيذ مش هيبدأ بيها، لازم يمر بـ main() الأول.
---
📌 الخلاصة:
Entry Point = المكان اللي يبدأ منه تشغيل البرنامج.
في C++، الـ Entry Point دائمًا هي main().
من خلالها تقدر تستدعي باقي الدوال والكلاسات.
📌 ما هي أنواع البيانات؟
أنواع البيانات هي الطريقة اللي من خلالها المترجم (Compiler) يعرف حجم البيانات وكيف يخزنها في الذاكرة (RAM)، وأيضًا العمليات المسموح تنفيذها عليها.
---
🟢 1. الأنواع الأساسية (Basic Data Types)
🔹 الأعداد الصحيحة (Integers)
int: يخزن أعداد صحيحة (موجبة أو سالبة).
int age = 20; // مثال: عمر
short int أو short: أصغر من int (يستهلك ذاكرة أقل).
long int أو long: أكبر من int (سعة أكبر).
long long int: أكبر من long.
---
🔹 الأعداد العشرية (Floating Point)
float: أعداد عشرية بدقة متوسطة.
float gpa = 3.5; // مثال: تقدير
double: أعداد عشرية بدقة أعلى.
double pi = 3.14159;
long double: دقة أعلى من double (نادر الاستخدام).
---
🔹 الحروف (Characters)
char: يخزن حرف واحد فقط.
char grade = 'A'; // مثال: تقدير مادة
---
🔹 القيم المنطقية (Boolean)
bool: يخزن قيمة true أو false.
bool isStudent = true;
---
🟢 2. الأنواع المشتقة (Derived Data Types)
هذه أنواع مبنية على الأنواع الأساسية:
Arrays (المصفوفات): مجموعة عناصر من نفس النوع.
int numbers[5] = {1, 2, 3, 4, 5};
Pointers (المؤشرات): تخزن عناوين الذاكرة.
int x = 10;
int* ptr = &x; // المؤشر يخزن عنوان x
Functions (الدوال): ممكن تكون نوع بيانات ترجع قيمة.
---
🟢 3. الأنواع المعرفة من المستخدم (User Defined Data Types)
struct: هيكل لتجميع بيانات مختلفة.
struct Student {
int id;
char name[20];
float gpa;
};
class: مثل struct لكنها أقوى (OOP).
enum: تعريف قيم ثابتة مسماة.
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
---
🟢 4. النوع الفارغ (Void)
void: يعني "لا شيء". غالبًا يستخدم في الدوال التي لا ترجع قيمة.
void sayHello() {
cout << "Hello!" << endl;
}
---
🎯 جدول مبسط للأنواع الأساسية
النوع مثال الحجم التقريبي
int 10 4 بايت
float 3.14 4 بايت
double 3.14159 8 بايت
char 'A' 1 بايت
bool true/false 1 بايت
void لا قيمة —
---
🔑 الخلاصة:
تستخدم int للأعداد الصحيحة.
تستخدم float/double للأعداد العشرية.
تستخدم char للحروف.
تستخدم bool للقيم المنطقية.
تستخدم void للدوال اللي ما بترجعش قيمة.
تقدر تبني أنواعك الخاصة باستخدام struct, class, enum.
أنواع البيانات هي الطريقة اللي من خلالها المترجم (Compiler) يعرف حجم البيانات وكيف يخزنها في الذاكرة (RAM)، وأيضًا العمليات المسموح تنفيذها عليها.
---
🟢 1. الأنواع الأساسية (Basic Data Types)
🔹 الأعداد الصحيحة (Integers)
int: يخزن أعداد صحيحة (موجبة أو سالبة).
int age = 20; // مثال: عمر
short int أو short: أصغر من int (يستهلك ذاكرة أقل).
long int أو long: أكبر من int (سعة أكبر).
long long int: أكبر من long.
---
🔹 الأعداد العشرية (Floating Point)
float: أعداد عشرية بدقة متوسطة.
float gpa = 3.5; // مثال: تقدير
double: أعداد عشرية بدقة أعلى.
double pi = 3.14159;
long double: دقة أعلى من double (نادر الاستخدام).
---
🔹 الحروف (Characters)
char: يخزن حرف واحد فقط.
char grade = 'A'; // مثال: تقدير مادة
---
🔹 القيم المنطقية (Boolean)
bool: يخزن قيمة true أو false.
bool isStudent = true;
---
🟢 2. الأنواع المشتقة (Derived Data Types)
هذه أنواع مبنية على الأنواع الأساسية:
Arrays (المصفوفات): مجموعة عناصر من نفس النوع.
int numbers[5] = {1, 2, 3, 4, 5};
Pointers (المؤشرات): تخزن عناوين الذاكرة.
int x = 10;
int* ptr = &x; // المؤشر يخزن عنوان x
Functions (الدوال): ممكن تكون نوع بيانات ترجع قيمة.
---
🟢 3. الأنواع المعرفة من المستخدم (User Defined Data Types)
struct: هيكل لتجميع بيانات مختلفة.
struct Student {
int id;
char name[20];
float gpa;
};
class: مثل struct لكنها أقوى (OOP).
enum: تعريف قيم ثابتة مسماة.
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
---
🟢 4. النوع الفارغ (Void)
void: يعني "لا شيء". غالبًا يستخدم في الدوال التي لا ترجع قيمة.
void sayHello() {
cout << "Hello!" << endl;
}
---
🎯 جدول مبسط للأنواع الأساسية
النوع مثال الحجم التقريبي
int 10 4 بايت
float 3.14 4 بايت
double 3.14159 8 بايت
char 'A' 1 بايت
bool true/false 1 بايت
void لا قيمة —
---
🔑 الخلاصة:
تستخدم int للأعداد الصحيحة.
تستخدم float/double للأعداد العشرية.
تستخدم char للحروف.
تستخدم bool للقيم المنطقية.
تستخدم void للدوال اللي ما بترجعش قيمة.
تقدر تبني أنواعك الخاصة باستخدام struct, class, enum.
🔹 ما هي أنظمة العد؟
هي طرق مختلفة لتمثيل الأعداد حسب الأساس (Base) المستخدم:
العشري (Decimal – Base 10): الأرقام من 0 → 9 (النظام اللي بنستخدمه في حياتنا).
الثنائي (Binary – Base 2): الأرقام 0 و 1 فقط (يستخدم في الحاسوب).
الثماني (Octal – Base 8): الأرقام من 0 → 7.
السادس عشر (Hexadecimal – Base 16): الأرقام من 0 → 9 والحروف A,B,C,D,E,F (تمثل 10–15).
---
🔹 التحويل بينهم
1. من أي نظام → عشري
اضرب كل رقم × (الأساس^ترتيبه) واجمع.
مثال: (1011)₂ =
1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8+0+2+1 = 11₁₀
---
2. من عشري → أي نظام
قسم العدد على الأساس.
خُذ البواقي من أسفل لأعلى.
مثال: (25)₁₀ إلى ثنائي:
25 ÷ 2 = 12 باقي 1
12 ÷ 2 = 6 باقي 0
6 ÷ 2 = 3 باقي 0
3 ÷ 2 = 1 باقي 1
1 ÷ 2 = 0 باقي 1
→ (11001)₂
---
3. بين ثنائي ↔ ثماني
اجمع كل 3 بتات (من اليمين).
101 110 = (56)₈
---
4. بين ثنائي ↔ سداسي عشر
اجمع كل 4 بتات (من اليمين).
1111 1010 = (FA)₁₆
---
🔹 الاستخدامات
الثنائي (Binary): أساس عمل الكمبيوتر (0/1 = OFF/ON).
العشري (Decimal): الإنسان يستخدمه يوميًا.
الثماني (Octal): كان يستخدم في الأنظمة القديمة وللتبسيط.
السادس عشر (Hexadecimal): شائع في البرمجة لتمثيل العناوين في الذاكرة والألوان في CSS (#FF0000 = أحمر).
---
✅ الخلاصة:
العشري → حياتنا اليومية.
الثنائي → الكمبيوتر.
الثماني → أقدم وأحيانًا اختصار للثنائي.
السادس عشر → برمجة (ذاكرة، ألوان، قيم كبيرة).
هي طرق مختلفة لتمثيل الأعداد حسب الأساس (Base) المستخدم:
العشري (Decimal – Base 10): الأرقام من 0 → 9 (النظام اللي بنستخدمه في حياتنا).
الثنائي (Binary – Base 2): الأرقام 0 و 1 فقط (يستخدم في الحاسوب).
الثماني (Octal – Base 8): الأرقام من 0 → 7.
السادس عشر (Hexadecimal – Base 16): الأرقام من 0 → 9 والحروف A,B,C,D,E,F (تمثل 10–15).
---
🔹 التحويل بينهم
1. من أي نظام → عشري
اضرب كل رقم × (الأساس^ترتيبه) واجمع.
مثال: (1011)₂ =
1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 8+0+2+1 = 11₁₀
---
2. من عشري → أي نظام
قسم العدد على الأساس.
خُذ البواقي من أسفل لأعلى.
مثال: (25)₁₀ إلى ثنائي:
25 ÷ 2 = 12 باقي 1
12 ÷ 2 = 6 باقي 0
6 ÷ 2 = 3 باقي 0
3 ÷ 2 = 1 باقي 1
1 ÷ 2 = 0 باقي 1
→ (11001)₂
---
3. بين ثنائي ↔ ثماني
اجمع كل 3 بتات (من اليمين).
101 110 = (56)₈
---
4. بين ثنائي ↔ سداسي عشر
اجمع كل 4 بتات (من اليمين).
1111 1010 = (FA)₁₆
---
🔹 الاستخدامات
الثنائي (Binary): أساس عمل الكمبيوتر (0/1 = OFF/ON).
العشري (Decimal): الإنسان يستخدمه يوميًا.
الثماني (Octal): كان يستخدم في الأنظمة القديمة وللتبسيط.
السادس عشر (Hexadecimal): شائع في البرمجة لتمثيل العناوين في الذاكرة والألوان في CSS (#FF0000 = أحمر).
---
✅ الخلاصة:
العشري → حياتنا اليومية.
الثنائي → الكمبيوتر.
الثماني → أقدم وأحيانًا اختصار للثنائي.
السادس عشر → برمجة (ذاكرة، ألوان، قيم كبيرة).
👏1
🎯 ما هي الدالة (Function)؟
تخيل معايا إن عندك مصنع:
المصنع ده بياخد مواد خام (مدخلات)
جوه المصنع بيتم عمليات تصنيع (معالجة)
وفي الآخر بيطلعلك منتج جاهز (مخرجات)
نفس الفكرة بالضبط في الدوال في البرمجة.
الدالة عبارة عن جزء من الكود معمول مخصوص عشان يعمل مهمة معينة بدل ما تكرر الكود كتير.
---
🏭 مكونات الدالة (زي المصنع)
1. المدخلات (Parameters / Arguments):
زي المواد الخام اللي بتدخل المصنع.
هي القيم اللي بتبعتها للدالة عشان تشتغل عليها.
2. المعالجة (Process):
الخطوات أو العمليات اللي بتحصل جوه الدالة.
3. المخرجات (Return Value):
المنتج النهائي اللي المصنع بيرجعهولك بعد ما يخلص شغل.
ممكن يكون فيه مخرجات أو لا (في بعض المصانع بس بيعملوا الشغل من غير ما يرجعولك حاجة).
---
🧩 الشكل العام للدالة في C++
نوع_المخرجات اسم_الدالة(نوع_المدخلات1 اسم_المعامل1, نوع_المدخلات2 اسم_المعامل2, ...)
{
// العمليات اللي هتحصل (Body)
return القيمة; // المنتج النهائي
}
---
🎬 مثال بسيط
عايز دالة تجمع عددين:
#include <iostream>
using namespace std;
// دالة بتجمع عددين
int Add(int a, int b) // (int a, int b) دول المواد الخام (المدخلات)
{
int result = a + b; // دي العمليات داخل المصنع
return result; // ده المنتج النهائي اللي بيخرج من المصنع
}
int main()
{
int x = 5, y = 7;
int sum = Add(x, y); // بنبعت المواد الخام (5,7) للمصنع
cout << "The sum is: " << sum << endl; // المنتج النهائي = 12
return 0;
}
🔎 الشرح:
int Add(int a, int b):
int ← نوع المنتج النهائي (هيكون عدد صحيح).
Add ← اسم المصنع (الدالة).
(int a, int b) ← المدخلات (مواد خام).
int result = a + b; ← عملية التصنيع (جمع).
return result; ← بيرجع الناتج (المخرجات).
---
🎭 أنواع الدوال من حيث المدخلات والمخرجات
1. مدخلات + مخرجات:
مثال: دالة تجمع عددين وترجع الناتج.
2. مدخلات فقط (من غير مخرجات):
مثال: دالة تطبع اسمك بس.
void PrintName(string name) // void يعني مفيش مخرجات
{
cout << "Hello " << name << endl;
}
3. مخرجات فقط (من غير مدخلات):
مثال: دالة ترجعلك رقم ثابت أو التاريخ الحالي.
int GetNumber()
{
return 42;
}
4. لا مدخلات ولا مخرجات:
مثال: دالة بس تطبع رسالة.
void SayHello()
{
cout << "Hello, World!" << endl;
}
---
💡 تشبيه بسيط يفيدك كمبتدئ
الدالة = المصنع
Parameters = المواد الخام اللي بيدخلها المصنع
الكود جوه الدالة = خطوات التصنيع
Return value = المنتج النهائي
void = مصنع شغال لكن مش بيرجعلك منتج (مجرد بيعمل حاجة زي طباعة)
لنك فديوهات أن شاء الله تفيدك
https://youtu.be/t6qw8_G0JxA?si=cEMKU8Kqi5JymAYA
https://youtu.be/fdauhXJOuDE?si=sdHvbiMJi9LFf4iY
شويه معلومات
علي الفرق بين
Procedure VS Function
📌 الفرق بين Function و Procedure
1️⃣ التعريف
Function (دالة):
زي مصنع بيرجعلك منتج (قيمة) بعد ما يخلص شغله.
Procedure (إجراء):
زي مصنع خدمة، بيعمل المهمة (يطبع رسالة – يحفظ بيانات – يغير حاجة)، لكن مش بيرجعلك قيمة.
---
2️⃣ نوع الراجع (Return Type)
Function: لازم يكون له نوع راجع (int, float, string …).
Procedure: نوعه void يعني "لا يرجع شيء".
---
3️⃣ التخزين في متغير
Function: ممكن تخزن الناتج في متغير. ✅
int Add(int a, int b) {
return a + b;
}
int main() {
int result = Add(5, 3); // هنا خزّنا الناتج في متغير
cout << result; // يطبع 8
return 0;
}
Procedure: ما ينفعش تخزن لأنها ما بترجعش حاجة. ❌
void PrintSum(int a, int b) {
cout << a + b << endl;
}
int main() {
PrintSum(5, 3); // يطبع 8 لكن مش نقدر نخزنها في متغير
return 0;
}
---
4️⃣ العمليات الحسابية
Function: ينفع تستخدمها جوه عمليات حسابية. ✅
int Square(int x) {
return x * x;
}
int main() {
int total = Square(3) + 5; // 9 + 5 = 14
cout << total;
return 0;
}
Procedure: ما ينفعش تدخلها في عمليات حسابية لأنها ما بترجعش حاجة. ❌
---
🎯 الخلاصة في جملة للمبتدئ
Function = مصنع بيرجعلك منتج، تقدر تخزنه وتعمل عليه عمليات حسابية.
Procedure = مصنع بيعمل شغل بس من غير ما يديك منتج (يعني مش هتخزن حاجة).
تخيل معايا إن عندك مصنع:
المصنع ده بياخد مواد خام (مدخلات)
جوه المصنع بيتم عمليات تصنيع (معالجة)
وفي الآخر بيطلعلك منتج جاهز (مخرجات)
نفس الفكرة بالضبط في الدوال في البرمجة.
الدالة عبارة عن جزء من الكود معمول مخصوص عشان يعمل مهمة معينة بدل ما تكرر الكود كتير.
---
🏭 مكونات الدالة (زي المصنع)
1. المدخلات (Parameters / Arguments):
زي المواد الخام اللي بتدخل المصنع.
هي القيم اللي بتبعتها للدالة عشان تشتغل عليها.
2. المعالجة (Process):
الخطوات أو العمليات اللي بتحصل جوه الدالة.
3. المخرجات (Return Value):
المنتج النهائي اللي المصنع بيرجعهولك بعد ما يخلص شغل.
ممكن يكون فيه مخرجات أو لا (في بعض المصانع بس بيعملوا الشغل من غير ما يرجعولك حاجة).
---
🧩 الشكل العام للدالة في C++
نوع_المخرجات اسم_الدالة(نوع_المدخلات1 اسم_المعامل1, نوع_المدخلات2 اسم_المعامل2, ...)
{
// العمليات اللي هتحصل (Body)
return القيمة; // المنتج النهائي
}
---
🎬 مثال بسيط
عايز دالة تجمع عددين:
#include <iostream>
using namespace std;
// دالة بتجمع عددين
int Add(int a, int b) // (int a, int b) دول المواد الخام (المدخلات)
{
int result = a + b; // دي العمليات داخل المصنع
return result; // ده المنتج النهائي اللي بيخرج من المصنع
}
int main()
{
int x = 5, y = 7;
int sum = Add(x, y); // بنبعت المواد الخام (5,7) للمصنع
cout << "The sum is: " << sum << endl; // المنتج النهائي = 12
return 0;
}
🔎 الشرح:
int Add(int a, int b):
int ← نوع المنتج النهائي (هيكون عدد صحيح).
Add ← اسم المصنع (الدالة).
(int a, int b) ← المدخلات (مواد خام).
int result = a + b; ← عملية التصنيع (جمع).
return result; ← بيرجع الناتج (المخرجات).
---
🎭 أنواع الدوال من حيث المدخلات والمخرجات
1. مدخلات + مخرجات:
مثال: دالة تجمع عددين وترجع الناتج.
2. مدخلات فقط (من غير مخرجات):
مثال: دالة تطبع اسمك بس.
void PrintName(string name) // void يعني مفيش مخرجات
{
cout << "Hello " << name << endl;
}
3. مخرجات فقط (من غير مدخلات):
مثال: دالة ترجعلك رقم ثابت أو التاريخ الحالي.
int GetNumber()
{
return 42;
}
4. لا مدخلات ولا مخرجات:
مثال: دالة بس تطبع رسالة.
void SayHello()
{
cout << "Hello, World!" << endl;
}
---
💡 تشبيه بسيط يفيدك كمبتدئ
الدالة = المصنع
Parameters = المواد الخام اللي بيدخلها المصنع
الكود جوه الدالة = خطوات التصنيع
Return value = المنتج النهائي
void = مصنع شغال لكن مش بيرجعلك منتج (مجرد بيعمل حاجة زي طباعة)
لنك فديوهات أن شاء الله تفيدك
https://youtu.be/t6qw8_G0JxA?si=cEMKU8Kqi5JymAYA
https://youtu.be/fdauhXJOuDE?si=sdHvbiMJi9LFf4iY
شويه معلومات
علي الفرق بين
Procedure VS Function
📌 الفرق بين Function و Procedure
1️⃣ التعريف
Function (دالة):
زي مصنع بيرجعلك منتج (قيمة) بعد ما يخلص شغله.
Procedure (إجراء):
زي مصنع خدمة، بيعمل المهمة (يطبع رسالة – يحفظ بيانات – يغير حاجة)، لكن مش بيرجعلك قيمة.
---
2️⃣ نوع الراجع (Return Type)
Function: لازم يكون له نوع راجع (int, float, string …).
Procedure: نوعه void يعني "لا يرجع شيء".
---
3️⃣ التخزين في متغير
Function: ممكن تخزن الناتج في متغير. ✅
int Add(int a, int b) {
return a + b;
}
int main() {
int result = Add(5, 3); // هنا خزّنا الناتج في متغير
cout << result; // يطبع 8
return 0;
}
Procedure: ما ينفعش تخزن لأنها ما بترجعش حاجة. ❌
void PrintSum(int a, int b) {
cout << a + b << endl;
}
int main() {
PrintSum(5, 3); // يطبع 8 لكن مش نقدر نخزنها في متغير
return 0;
}
---
4️⃣ العمليات الحسابية
Function: ينفع تستخدمها جوه عمليات حسابية. ✅
int Square(int x) {
return x * x;
}
int main() {
int total = Square(3) + 5; // 9 + 5 = 14
cout << total;
return 0;
}
Procedure: ما ينفعش تدخلها في عمليات حسابية لأنها ما بترجعش حاجة. ❌
---
🎯 الخلاصة في جملة للمبتدئ
Function = مصنع بيرجعلك منتج، تقدر تخزنه وتعمل عليه عمليات حسابية.
Procedure = مصنع بيعمل شغل بس من غير ما يديك منتج (يعني مش هتخزن حاجة).
YouTube
8- Programming with C++ , Functions برمجة
البرمجة للمبتدئين باللغة العربية بإستخدام لغة السى بلس بلس
Dr. Mohamed El Desouki - د. محمد الدسوقى
mohamed_eldesouki@hotmail.com
جامعة الأمير سطام بن عبد العزيز - السعودية - الخرج
لطلب الشروحات الخاصة للمجموعات - واتس أب رقم 00966545567593
لا أحل واجبات…
Dr. Mohamed El Desouki - د. محمد الدسوقى
mohamed_eldesouki@hotmail.com
جامعة الأمير سطام بن عبد العزيز - السعودية - الخرج
لطلب الشروحات الخاصة للمجموعات - واتس أب رقم 00966545567593
لا أحل واجبات…
👍1🆒1
#include <iostream>
using namespace std;
void SumNumbers(int a, int b) {
int sum = a + b;
cout << "The sum is: "<<sum<< endl ;
}
int main() {
int x = 5, y = 7;
SumNumbers(x, y);
return 0;
}
using namespace std;
void SumNumbers(int a, int b) {
int sum = a + b;
cout << "The sum is: "<<sum<< endl ;
}
int main() {
int x = 5, y = 7;
SumNumbers(x, y);
return 0;
}
#include <iostream>
using namespace std;
int SumNumbers(int a, int b) {
int sum = a + b;
return sum;
}
int main() {
int x = 5, y = 7;
int result = SumNumbers(x, y);
cout << "The sum is: " << result << endl;
cout << "The sum + 10 = " << SumNumbers(x, y) + 10 << endl;
return 0;
}
using namespace std;
int SumNumbers(int a, int b) {
int sum = a + b;
return sum;
}
int main() {
int x = 5, y = 7;
int result = SumNumbers(x, y);
cout << "The sum is: " << result << endl;
cout << "The sum + 10 = " << SumNumbers(x, y) + 10 << endl;
return 0;
}
int arr[]{ 1,2,3 };
cout << arr << endl;
char Name[] = "ali";
cout << Name; النتيجة 000000C520AFFC18
ali طيب انا في الحالة الاول كتبت اسم الدالة فاعطاني العنوان ام في الحالة الثانية طبع القيم لماذا
الي عنده اي معلومه عن موضوع ده ياريت يبعت
علي الخاص
@Ay01014469594
cout << arr << endl;
char Name[] = "ali";
cout << Name; النتيجة 000000C520AFFC18
ali طيب انا في الحالة الاول كتبت اسم الدالة فاعطاني العنوان ام في الحالة الثانية طبع القيم لماذا
الي عنده اي معلومه عن موضوع ده ياريت يبعت
علي الخاص
@Ay01014469594
✦ إنَّ انشغالك بالتوافه يسرق منك أجمل ما في وقتك، ويبعدك عن النافعات. أرأيتَ لو أن الجوف امتلأ بالطعام الفاسد، فلن يجد مكانًا للطعام النافع إلا قليلًا؟ وكذلك القلب والعقل، إذا امتلآ بما لا ينفع، ضاع فيهما ما هو أنفع وأبقى.
✦ فابتعد يا صديقي عن كل ما يُضيّع عمرك؛ فإن العمر قصير، والعلم والعمل كثير، فلا تفرّط في أيامك بين لهوٍ وعبثٍ، بل اجعلها زادًا ينفعك في دنياك وآخرتك.
✦ واعلم أن الأيام تمضي، والليالي تنقضي، وفي نهاية المطاف لا مفرّ من الموت. فاختر لنفسك ما يستحق أن تبذل فيه وقتك وجهدك، فما أجمل أن تزرع لنفسك أثرًا يبقى بعد الرحيل.
✦ فابتعد يا صديقي عن كل ما يُضيّع عمرك؛ فإن العمر قصير، والعلم والعمل كثير، فلا تفرّط في أيامك بين لهوٍ وعبثٍ، بل اجعلها زادًا ينفعك في دنياك وآخرتك.
✦ واعلم أن الأيام تمضي، والليالي تنقضي، وفي نهاية المطاف لا مفرّ من الموت. فاختر لنفسك ما يستحق أن تبذل فيه وقتك وجهدك، فما أجمل أن تزرع لنفسك أثرًا يبقى بعد الرحيل.
👍2🔥1🕊1💯1
🔹 ما هو الـ Namespace؟
الـ namespace في C# هو حاوية (Container) منطقية تجمع الكلاسات (Classes)، الإنترفيس (Interfaces)، الإنم (Enums)، إلخ…
الهدف منها تنظيم الكود وليس تخزينه فعليًا (يعني مش زي المجلدات في الهارد، بل تقسيم منطقي داخل الكود).
---
🔹 هل هو Container؟
نعم ✅
ممكن نعتبره Container منطقي لأنه يحتوي على أنواع (Types) مثل:
namespace MyApp.Utilities
{
class MathHelper { }
class StringHelper { }
}
هنا الـ MyApp.Utilities هو "وعاء" أو "مساحة أسماء" تحتوي على الكلاسات MathHelper و StringHelper.
---
🔹 لماذا نستخدمه؟ (أهميته)
1. تنظيم الكود: تخلي المشروع مرتب بدل ما تكون كل الكلاسات في نفس المستوى.
2. تجنب التضارب (Name Conflicts):
ممكن يكون عندك Class باسم Logger في أكثر من مكتبة.
بالـ namespace تفرق بينهم:
ProjectA.Logger
ProjectB.Logger
3. تسهيل القراءة والصيانة: تقسيم الكود لمجموعات منطقية.
---
🔹 هل هو زي الـ Folder (مجلد)؟
نوعًا ما نعم من ناحية التنظيم.
لكن الفرق:
المجلد → تنظيم على مستوى الملفات في النظام.
الـ namespace → تنظيم على مستوى الكود داخل المشروع.
وغالبًا VS (Visual Studio) يحاول يخلي أسماء الـ namespaces مطابقة لمسار المجلدات، لكن مو شرط 100%.
---
🔹 مثال عملي:
namespace Company.Project.Data
{
public class DatabaseManager { }
}
namespace Company.Project.Services
{
public class UserService { }
}
هنا نظّمنا الكود:
كل ما يخص الـ Data → في Company.Project.Data
كل ما يخص الـ Services → في Company.Project.Services
---
✅ الخلاصة:
نعم هو Container منطقي للأنواع.
نستخدمه أساسًا لتنظيم الكود وتجنب التعارض بين الأسماء.
---
🔹 هل الـ namespace له نفس المعنى في لغات أخرى؟
الإجابة: المفهوم واحد تقريبًا لكن طريقة التنفيذ تختلف من لغة لأخرى.
الفكرة العامة دائمًا: تنظيم الكود + تجنب تضارب الأسماء (Name Conflicts).
---
📌 أمثلة حسب اللغات:
1. C++
عندها namespace بنفس المعنى تقريبًا.
مثال:
namespace Math {
int Add(int a, int b) { return a + b; }
}
int main() {
int x = Math::Add(2, 3);
}
تستخدم :: للوصول للأنواع داخل namespace.
---
2. Java
ما عندها كلمة namespace، لكن تستخدم الـ packages لنفس الفكرة.
مثال:
package com.company.utils;
public class StringHelper { }
هنا package = namespace في C#.
للوصول تستعمل:
import com.company.utils.StringHelper;
---
3. Python
ما عندها كلمة namespace واضحة، لكن كل ملف (module) يعتبر namespace بحد ذاته.
وأيضًا الـ packages (مجلد يحتوي ملف init.py) تنظم الكود مثل namespaces.
مثال:
import math
print(math.sqrt(16))
هنا math يعتبر namespace يحتوي دوال كثيرة.
---
4. JavaScript / TypeScript
JavaScript ما كان فيها namespace تقليدي، الناس كانت تنظم الكود باستخدام objects.
TypeScript أضافت namespace يشبه C#:
namespace Utils {
export function add(a: number, b: number) {
return a + b;
}
}
console.log(Utils.add(2, 3));
---
✅ الخلاصة:
C#, C++ → عندهم namespace صريح.
Java → تستعمل package.
Python → تستعمل modules/packages.
JS/TS → تعتمد على objects أو namespaces (في TypeScript).
الـ namespace في C# هو حاوية (Container) منطقية تجمع الكلاسات (Classes)، الإنترفيس (Interfaces)، الإنم (Enums)، إلخ…
الهدف منها تنظيم الكود وليس تخزينه فعليًا (يعني مش زي المجلدات في الهارد، بل تقسيم منطقي داخل الكود).
---
🔹 هل هو Container؟
نعم ✅
ممكن نعتبره Container منطقي لأنه يحتوي على أنواع (Types) مثل:
namespace MyApp.Utilities
{
class MathHelper { }
class StringHelper { }
}
هنا الـ MyApp.Utilities هو "وعاء" أو "مساحة أسماء" تحتوي على الكلاسات MathHelper و StringHelper.
---
🔹 لماذا نستخدمه؟ (أهميته)
1. تنظيم الكود: تخلي المشروع مرتب بدل ما تكون كل الكلاسات في نفس المستوى.
2. تجنب التضارب (Name Conflicts):
ممكن يكون عندك Class باسم Logger في أكثر من مكتبة.
بالـ namespace تفرق بينهم:
ProjectA.Logger
ProjectB.Logger
3. تسهيل القراءة والصيانة: تقسيم الكود لمجموعات منطقية.
---
🔹 هل هو زي الـ Folder (مجلد)؟
نوعًا ما نعم من ناحية التنظيم.
لكن الفرق:
المجلد → تنظيم على مستوى الملفات في النظام.
الـ namespace → تنظيم على مستوى الكود داخل المشروع.
وغالبًا VS (Visual Studio) يحاول يخلي أسماء الـ namespaces مطابقة لمسار المجلدات، لكن مو شرط 100%.
---
🔹 مثال عملي:
namespace Company.Project.Data
{
public class DatabaseManager { }
}
namespace Company.Project.Services
{
public class UserService { }
}
هنا نظّمنا الكود:
كل ما يخص الـ Data → في Company.Project.Data
كل ما يخص الـ Services → في Company.Project.Services
---
✅ الخلاصة:
نعم هو Container منطقي للأنواع.
نستخدمه أساسًا لتنظيم الكود وتجنب التعارض بين الأسماء.
---
🔹 هل الـ namespace له نفس المعنى في لغات أخرى؟
الإجابة: المفهوم واحد تقريبًا لكن طريقة التنفيذ تختلف من لغة لأخرى.
الفكرة العامة دائمًا: تنظيم الكود + تجنب تضارب الأسماء (Name Conflicts).
---
📌 أمثلة حسب اللغات:
1. C++
عندها namespace بنفس المعنى تقريبًا.
مثال:
namespace Math {
int Add(int a, int b) { return a + b; }
}
int main() {
int x = Math::Add(2, 3);
}
تستخدم :: للوصول للأنواع داخل namespace.
---
2. Java
ما عندها كلمة namespace، لكن تستخدم الـ packages لنفس الفكرة.
مثال:
package com.company.utils;
public class StringHelper { }
هنا package = namespace في C#.
للوصول تستعمل:
import com.company.utils.StringHelper;
---
3. Python
ما عندها كلمة namespace واضحة، لكن كل ملف (module) يعتبر namespace بحد ذاته.
وأيضًا الـ packages (مجلد يحتوي ملف init.py) تنظم الكود مثل namespaces.
مثال:
import math
print(math.sqrt(16))
هنا math يعتبر namespace يحتوي دوال كثيرة.
---
4. JavaScript / TypeScript
JavaScript ما كان فيها namespace تقليدي، الناس كانت تنظم الكود باستخدام objects.
TypeScript أضافت namespace يشبه C#:
namespace Utils {
export function add(a: number, b: number) {
return a + b;
}
}
console.log(Utils.add(2, 3));
---
✅ الخلاصة:
C#, C++ → عندهم namespace صريح.
Java → تستعمل package.
Python → تستعمل modules/packages.
JS/TS → تعتمد على objects أو namespaces (في TypeScript).
❤4