📌 ما هي أنواع البيانات؟
أنواع البيانات هي الطريقة اللي من خلالها المترجم (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
تحسين الكود
🎯 الفكرة العامة
تحسين الكود (Code Optimization) معناه إنك تخلي برنامجك:
1. أسرع في التنفيذ.
2. يستهلك ذاكرة أقل.
3. أسهل في القراءة والفهم (قابلية الصيانة).
---
🪜 الخطوات مع الشرح
1. فهم المشكلة قبل كتابة الكود
قبل ما تبدأ تكتب، لازم تفكر: إيه اللي البرنامج هيعمله بالظبط؟
لو فهمت كويس، هتكتب كود مختصر وواضح.
🔹 مثال:
بدل ما تعمل برنامج يضرب رقمين بطريقة معقدة، تقدر تكتبها في سطر واحد.
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
cout << "الناتج = " << a * b << endl;
return 0;
}
---
2. استخدام المتغيرات بشكل مناسب
متخزنش بيانات مش محتاجها.
استخدم النوع المناسب:
int للأعداد الصحيحة.
double للأعداد العشرية.
char للحروف.
🔹 مثال (غير محسن):
double x = 5; // مش لازم double هنا
🔹 مثال (محسن):
int x = 5; // كافي ويوفر ذاكرة
---
3. تجنب التكرار في الكود
لو عندك كود بيتكرر، حوله إلى دالة (function).
🔹 مثال (غير محسن):
#include <iostream>
using namespace std;
int main() {
int a = 5, b = 3;
cout << "مجموعهم = " << a + b << endl;
int c = 10, d = 7;
cout << "مجموعهم = " << c + d << endl;
return 0;
}
🔹 مثال (محسن باستخدام دالة):
#include <iostream>
using namespace std;
int sum(int x, int y) {
return x + y;
}
int main() {
cout << "مجموعهم = " << sum(5, 3) << endl;
cout << "مجموعهم = " << sum(10, 7) << endl;
return 0;
}
---
4. استخدام الحلقات بدل التكرار اليدوي
لو محتاج تنفذ نفس العملية عدة مرات، استعمل loop.
🔹 مثال (غير محسن):
cout << "مرحبا" << endl;
cout << "مرحبا" << endl;
cout << "مرحبا" << endl;
🔹 مثال (محسن باستخدام for loop):
for (int i = 0; i < 3; i++) {
cout << "مرحبا" << endl;
}
---
5. التفكير في الخوارزميات
الكود مش بس كتابة أوامر، لازم تختار الطريقة (الخوارزمية) الأفضل.
مثال: عايز تدور على رقم في مصفوفة:
البحث الخطي (linear search): يمر على كل عنصر (أبطأ).
البحث الثنائي (binary search): أسرع بكثير، لكن يحتاج المصفوفة تكون مرتبة.
🔹 مثال للبحث الخطي:
#include <iostream>
using namespace std;
int main() {
int arr[] = {1, 4, 7, 9, 12};
int size = 5, target = 9;
bool found = false;
for (int i = 0; i < size; i++) {
if (arr[i] == target) {
cout << "الرقم موجود في الفهرس: " << i << endl;
found = true;
break;
}
}
if (!found) cout << "الرقم غير موجود" << endl;
return 0;
}
---
6. تنسيق الكود ليكون مقروء
سيب مسافات بين الأسطر.
سمي المتغيرات بأسماء واضحة:
sum أفضل من s
numberOfStudents أفضل من n
---
7. التجربة والتحسين
بعد ما تكتب الكود، جربه وشوف الأداء.
لو بطيء أو معقد، فكر إزاي تختصر أو تغير الخوارزمية.
---
✅ الخلاصة
تحسين الكود بيكون في 3 مستويات:
1. الكتابة البسيطة والواضحة.
2. استخدام الموارد بشكل مناسب (ذاكرة + وقت).
3. اختيار الخوارزمية الأفضل.
🎯 الفكرة العامة
تحسين الكود (Code Optimization) معناه إنك تخلي برنامجك:
1. أسرع في التنفيذ.
2. يستهلك ذاكرة أقل.
3. أسهل في القراءة والفهم (قابلية الصيانة).
---
🪜 الخطوات مع الشرح
1. فهم المشكلة قبل كتابة الكود
قبل ما تبدأ تكتب، لازم تفكر: إيه اللي البرنامج هيعمله بالظبط؟
لو فهمت كويس، هتكتب كود مختصر وواضح.
🔹 مثال:
بدل ما تعمل برنامج يضرب رقمين بطريقة معقدة، تقدر تكتبها في سطر واحد.
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
cout << "الناتج = " << a * b << endl;
return 0;
}
---
2. استخدام المتغيرات بشكل مناسب
متخزنش بيانات مش محتاجها.
استخدم النوع المناسب:
int للأعداد الصحيحة.
double للأعداد العشرية.
char للحروف.
🔹 مثال (غير محسن):
double x = 5; // مش لازم double هنا
🔹 مثال (محسن):
int x = 5; // كافي ويوفر ذاكرة
---
3. تجنب التكرار في الكود
لو عندك كود بيتكرر، حوله إلى دالة (function).
🔹 مثال (غير محسن):
#include <iostream>
using namespace std;
int main() {
int a = 5, b = 3;
cout << "مجموعهم = " << a + b << endl;
int c = 10, d = 7;
cout << "مجموعهم = " << c + d << endl;
return 0;
}
🔹 مثال (محسن باستخدام دالة):
#include <iostream>
using namespace std;
int sum(int x, int y) {
return x + y;
}
int main() {
cout << "مجموعهم = " << sum(5, 3) << endl;
cout << "مجموعهم = " << sum(10, 7) << endl;
return 0;
}
---
4. استخدام الحلقات بدل التكرار اليدوي
لو محتاج تنفذ نفس العملية عدة مرات، استعمل loop.
🔹 مثال (غير محسن):
cout << "مرحبا" << endl;
cout << "مرحبا" << endl;
cout << "مرحبا" << endl;
🔹 مثال (محسن باستخدام for loop):
for (int i = 0; i < 3; i++) {
cout << "مرحبا" << endl;
}
---
5. التفكير في الخوارزميات
الكود مش بس كتابة أوامر، لازم تختار الطريقة (الخوارزمية) الأفضل.
مثال: عايز تدور على رقم في مصفوفة:
البحث الخطي (linear search): يمر على كل عنصر (أبطأ).
البحث الثنائي (binary search): أسرع بكثير، لكن يحتاج المصفوفة تكون مرتبة.
🔹 مثال للبحث الخطي:
#include <iostream>
using namespace std;
int main() {
int arr[] = {1, 4, 7, 9, 12};
int size = 5, target = 9;
bool found = false;
for (int i = 0; i < size; i++) {
if (arr[i] == target) {
cout << "الرقم موجود في الفهرس: " << i << endl;
found = true;
break;
}
}
if (!found) cout << "الرقم غير موجود" << endl;
return 0;
}
---
6. تنسيق الكود ليكون مقروء
سيب مسافات بين الأسطر.
سمي المتغيرات بأسماء واضحة:
sum أفضل من s
numberOfStudents أفضل من n
---
7. التجربة والتحسين
بعد ما تكتب الكود، جربه وشوف الأداء.
لو بطيء أو معقد، فكر إزاي تختصر أو تغير الخوارزمية.
---
✅ الخلاصة
تحسين الكود بيكون في 3 مستويات:
1. الكتابة البسيطة والواضحة.
2. استخدام الموارد بشكل مناسب (ذاكرة + وقت).
3. اختيار الخوارزمية الأفضل.
👍1
🎯 يعني إيه Big O ؟
هي طريقة بنقيس بيها سرعة الخوارزمية (أو الكود) لما حجم البيانات يكبر.
يعني: لو عندك بيانات صغيرة ممكن أي كود يشتغل بسرعة، لكن لو البيانات بقت كبيرة جدًا، هنا بنشوف الكود هيبطأ قد إيه.
---
🪜 المستويات الأساسية اللي لازم المبتدئ يعرفها
1. O(1) — ثابت
التنفيذ بياخد نفس الوقت مهما كان حجم البيانات.
مثال: الوصول لعنصر في المصفوفة.
int arr[5] = {1,2,3,4,5};
cout << arr[2]; // دايما سريع
---
2. O(n) — خطي
الوقت بيزيد مع زيادة حجم البيانات.
مثال: المرور على كل عناصر المصفوفة.
for (int i = 0; i < n; i++) {
cout << arr[i];
}
---
3. O(n²) — تربيعي
كل ما البيانات تكبر، الوقت يكبر بسرعة كبيرة جدًا.
بيظهر غالبًا مع الحلقات المتداخلة.
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << i << "," << j << endl;
}
}
---
4. O(log n) — لوغاريتمي
وقت التنفيذ بيزيد ببطء شديد مع كبر البيانات.
مثال: البحث الثنائي (Binary Search).
// لازم المصفوفة تكون مرتبة
int binarySearch(int arr[], int n, int target) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
---
📌 الخلاصة للمبتدئ
O(1): سريع جدًا (زي فتح درج معين في دولاب).
O(n): تمشي على كل العناصر (زي تعد الطلاب واحد واحد).
O(n²): كل طالب يقارن مع كل طالب (عدد العمليات ينفجر بسرعة).
O(log n): تقسم وتدور (زي البحث في كتاب بفتح النص كل مرة).
هي طريقة بنقيس بيها سرعة الخوارزمية (أو الكود) لما حجم البيانات يكبر.
يعني: لو عندك بيانات صغيرة ممكن أي كود يشتغل بسرعة، لكن لو البيانات بقت كبيرة جدًا، هنا بنشوف الكود هيبطأ قد إيه.
---
🪜 المستويات الأساسية اللي لازم المبتدئ يعرفها
1. O(1) — ثابت
التنفيذ بياخد نفس الوقت مهما كان حجم البيانات.
مثال: الوصول لعنصر في المصفوفة.
int arr[5] = {1,2,3,4,5};
cout << arr[2]; // دايما سريع
---
2. O(n) — خطي
الوقت بيزيد مع زيادة حجم البيانات.
مثال: المرور على كل عناصر المصفوفة.
for (int i = 0; i < n; i++) {
cout << arr[i];
}
---
3. O(n²) — تربيعي
كل ما البيانات تكبر، الوقت يكبر بسرعة كبيرة جدًا.
بيظهر غالبًا مع الحلقات المتداخلة.
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cout << i << "," << j << endl;
}
}
---
4. O(log n) — لوغاريتمي
وقت التنفيذ بيزيد ببطء شديد مع كبر البيانات.
مثال: البحث الثنائي (Binary Search).
// لازم المصفوفة تكون مرتبة
int binarySearch(int arr[], int n, int target) {
int left = 0, right = n - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
---
📌 الخلاصة للمبتدئ
O(1): سريع جدًا (زي فتح درج معين في دولاب).
O(n): تمشي على كل العناصر (زي تعد الطلاب واحد واحد).
O(n²): كل طالب يقارن مع كل طالب (عدد العمليات ينفجر بسرعة).
O(log n): تقسم وتدور (زي البحث في كتاب بفتح النص كل مرة).
👍1
🔹 في الغالب نعرّف المتغيرات زي العمر (age) باستخدام int بدل short، حتى لو العمر ما يحتاج رقم كبير.
السبب:
المعالجات الحديثة (32-بت و 64-بت) مصممة تشتغل أسرع مع int (4 بايت) مقارنة بـ short (2 بايت).
حتى لو كتبت short، المعالج بيرفعه داخليًا إلى int عشان يعمل العمليات الحسابية → وبالتالي short مش أسرع، بل أحيانًا أبطأ.
فرق الحجم (2 بايت vs 4 بايت) مش مهم حاليًا إلا لو بتتعامل مع ملايين القيم وعايز توفر ذاكرة.
الخلاصة:
نستخدم int كخيار افتراضي لأنه أوضح وأسرع.
نحتاج short أو unsigned short فقط لما يكون عندنا سبب محدد (زي ضغط في الذاكرة أو عمل برمجة مدمجة Embedded).
المعلومة دي ذكرها
@Abdou_1428
واول مرة اسمعها وبرده أظن في ناس زي
بجد ربنا يكرمك ويوفقك ❤️☺️
السبب:
المعالجات الحديثة (32-بت و 64-بت) مصممة تشتغل أسرع مع int (4 بايت) مقارنة بـ short (2 بايت).
حتى لو كتبت short، المعالج بيرفعه داخليًا إلى int عشان يعمل العمليات الحسابية → وبالتالي short مش أسرع، بل أحيانًا أبطأ.
فرق الحجم (2 بايت vs 4 بايت) مش مهم حاليًا إلا لو بتتعامل مع ملايين القيم وعايز توفر ذاكرة.
الخلاصة:
نستخدم int كخيار افتراضي لأنه أوضح وأسرع.
نحتاج short أو unsigned short فقط لما يكون عندنا سبب محدد (زي ضغط في الذاكرة أو عمل برمجة مدمجة Embedded).
المعلومة دي ذكرها
@Abdou_1428
واول مرة اسمعها وبرده أظن في ناس زي
بجد ربنا يكرمك ويوفقك ❤️☺️
❤🔥3👍1