C++: أساسيات المصفوفات
آخر تحديث: 2026-08-26
في الدروس الساببة، كان كل متغير يستطيع تخزين قيمة واحدة فقط.
لكن إذا كنت تحتاج لتخزين 100 نتيجة طالب، لا يمكنك تعريف 100 متغير، أليس كذلك؟
المصفوفات تحل هذه المشكلة — كتلة ذاكرة متجاورة تستخدم لتخزين قيم متعددة من نفس النوع.
1. ما هي المصفوفة؟
(1) 1.1 المصفوفات في الحياة اليومية
| تشبيه من الحياة | المقابل البرمجي |
|---|---|
| صف صناديق بريد (كل واحد برقم مختلف) | مصفوفة (كل عنصر له فهرس مختلف) |
| كرتون بيض (12 بيضة، مرقمة 1-12) | مصفوفة (12 عنصر، فهارس 0-11) |
خصائص المصفوفات:
- جميع العناصر من نفس النوع (جميعها
int، أو جميعهاdouble) - ذاكرة متجاورة (العناصر مخزنة واحدة بعد الأخرى)
- الفهارس تبدأ من 0 (ليس من 1!)
(2) 1.2 لماذا نحتاج المصفوفات؟
بدون مصفوفات (مثال سيئ):
▶ مثال 2: تطبيق برمجي أساسي (صعوبة ⭐)
#include <iostream>
int main() {
int score1 = 90;
int score2 = 85;
int score3 = 92;
// ... need to declare 100 variables!
return 0;
}
الخرج:
(Program output)
بالمصفوفات (مثال جيد):
#include <iostream>
int main() {
int scores[100]; // array that can hold 100 integers
// use loop to assign values
for (int i = 0; i < 100; i++) {
scores[i] = 0;
}
return 0;
}
2. تعريف المصفوفة وتهيئتها
(1) 2.1 تعريف مصفوفة
الصياغة:
Type arrayName[Number of elements];
مثال:
int scores[5]; // array that can hold 5 integers
double prices[10]; // array that can hold 10 doubles
char letters[26]; // array that can hold 26 chars
💡 نقطة مهمة: فهارس المصفوفة تبدأ من 0، لذا scores[5] لها فهارس من 0 إلى 4 (ليس 1 إلى 5).
(2) 2.2 تهيئة مصفوفة
الطريقة 1: التهيئة عند التعريف
int scores[5] = {90, 85, 92, 78, 88};
الطريقة 2: تهيئة جزئية
int scores[5] = {90, 85}; // only initialize first two, rest become 0 automatically
الطريقة 3: دع المترجم يستنتج الحجم
int scores[] = {90, 85, 92, 78, 88}; // compiler infers size as 5
💡 نصيحة: الطريقة 3 موصى بها — إذا غيّرت محتوى المصفوفة لاحقًا، لا تحتاج لتحديث الحجم يدويًا.
3. الوصول إلى عناصر المصفوفة
(1) 3.1 قراءة العناصر
الصياغة:
arrayName[Index]
مثال:
#include <iostream>
int main() {
int scores[5] = {90, 85, 92, 78, 88};
std::cout << "First score: " << scores[0] << std::endl; // 90
std::cout << "Third score: " << scores[2] << std::endl; // 92
std::cout << "Last score: " << scores[4] << std::endl; // 88
return 0;
}
(2) 3.2 تعديل العناصر
#include <iostream>
int main() {
int scores[5] = {90, 85, 92, 78, 88};
scores[1] = 95; // change second score to 95
std::cout << "Modified second score: " << scores[1] << std::endl; // 95
return 0;
}
4. اجتياز مصفوفة
(1) 4.1 الاجتياز بحلقة for
#include <iostream>
int main() {
int scores[5] = {90, 85, 92, 78, 88};
std::cout << "All scores: " << std::endl;
for (int i = 0; i < 5; i++) {
std::cout << "No. " << i + 1 << " Score: " << scores[i] << std::endl;
}
return 0;
}
💡 نقطة مهمة: عند اجتياز مصفوفة، شرط الحلقة عادةً i < array_size، بدلًا من i <= array_size - 1 (الأول أقل عرضة للخطأ).
5. حجم المصفوفة
(1) 5.1 حساب عدد العناصر بـ sizeof
#include <iostream>
int main() {
int scores[5] = {90, 85, 92, 78, 88};
int size = sizeof(scores) / sizeof(scores[0]); // calculate array size
std::cout << "Array size:" << size << std::endl; // 5
return 0;
}
كيف تعمل:
sizeof(scores)— إجمالي بايتات المصفوفة بالكامل (5 × 4 = 20 بايت)sizeof(scores[0])— بايتات عنصر واحد (4 بايت)- القسمة تعطي عدد العناصر
💡 نصيحة: هذه الطريقة تعمل فقط مع المصفوفات الفعلية، وليس المؤشرات (ستُغطى لاحقًا).
6. المصفوفات كمعلمات دالة
(1) 6.1 المشكلة: المصفوفات تتحول إلى مؤشرات
عند تمرير مصفوفة إلى دالة، تتحول إلى مؤشر (تفقد معلومات الحجم).
#include <iostream>
// array as parameter, need to pass size
void printArray(int arr, int size) {
for (int i = 0; i < size; i++) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
}
int main() {
int scores[5] = {90, 85, 92, 78, 88};
printArray(scores, 5); // pass array name (which is address of first element)
return 0;
}
💡 نقطة مهمة: عند تمرير مصفوفة كمعلمة، يجب تمرير الحجم أيضًا.
7. الأخطاء الشائعة
(1) 7.1 خروج المصفوفة عن الحدود
مثال خطأ:
#include <iostream>
int main() {
int scores[5] = {90, 85, 92, 78, 88};
std::cout << scores[5] << std::endl; // ERROR: out of bounds! max index is 4
return 0;
}
العاقبة: قراءة قيم عشوائية، أو انهيار البرنامج.
💡 نصيحة: C++ لا تتحقق تلقائيًا من حدود المصفوفة! هذا أحد أسباب سرعة C++، لكنه أيضًا مصدر شائع للأخطاء.
(2) 7.2 استخدام متغير كحجم مصفوفة (قبل C++11)
مثال خطأ (قبل C++11):
#include <iostream>
int main() {
int n = 5;
int scores[n]; // ERROR (before C++11): array size must be compile-time constant
return 0;
}
الطريقة الصحيحة (مدعومة بعد C++11):
#include <iostream>
int main() {
int n = 5;
int scores[n]; // OK (after C++11): Variable Length Array (VLA) supported
return 0;
}
💡 نهج أفضل: استخدم std::vector (ستُغطى لاحقًا)، الذي يدعم الأحجام الديناميكية.
8. تطبيق: حساب المعدل
▶ مثال 1: حساب المعدل (صعوبة ⭐⭐)
#include <iostream>
#include <iomanip>
int main() {
int scores[5] = {90, 85, 92, 78, 88};
int sum = 0;
// calculate total score
for (int i = 0; i < 5; i++) {
sum += scores[i];
}
// calculate average score
double average = static_cast<double>(sum) / 5;
std::cout << std::fixed << std::setprecision(2);
std::cout << "Total: " << sum << std::endl;
std::cout << "Average: " << average << std::endl;
return 0;
}
الخرج:
Total: 433
Average: 86.60
❓ أسئلة شائعة
▶ مثال 3: اجتياز المصفوفة (صعوبة ⭐)
#include <iostream>
int main() {
int scores[] = {85, 92, 78, 90, 88};
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += scores[i];
}
double avg = sum / 5.0;
std::cout << "Average: " << avg << std::endl;
return 0;
}
الخرج:
Average: 86.6
{}، وعدد العناصر يمكن حسابه باستخدام sizeof(arr) / sizeof(arr[0]).
📖 ملخص
- المصفوفات هي كتلة ذاكرة متجاورة تستخدم لتخزين قيم متعددة من نفس النوع
- فهارس المصفوفة تبدأ من 0
- تعريف مصفوفة:
Type arrayName[Size]; - تهيئة مصفوفة:
Type arrayName = {val1, val2, ...}; - الوصول إلى العناصر:
arrayName[Index] - اجتياز مصفوفة: استخدم حلقة
for - عند تمريرها كمعلمة، المصفوفات تتحول إلى مؤشرات وتتطلب تمرير الحجم بشكل منفصل
📝 تمارين
-
أساسي (صعوبة ⭐): عرّف مصفوفة
doubleلتخزين 5 أسعار، ثم استخدم حلقة لحساب السعر الإجمالي. -
متوسط (صعوبة ⭐⭐): اكتب دالة
int findMax(int arr, int size)تجد القيمة القصوى في مصفوفة. اختبرها فيmain. -
تحدي (صعوبة ⭐⭐⭐): اكتب برنامجًا يتيح للمستخدم إدخال 10 أعداد صحيحة، يخزنها في مصفوفة، ثم:
-
يجد القيمتين الصغرى والعظمى
-
يحسب المعدل
-
يُخرج جميع النتائج فوق المعدل
- المصفوفة: مجموعة ذاكرة متجاورة من عناصر من نفس النوع
- الفهارس تبدأ من 0؛ يجب تحديد الحجم عند التعريف
- قائمة تهيئة المصفوفة
{}يمكنها حذف الحجم - اجتياز المصفوفات بحلقات for بالفهارس
- اسم المصفوفة هو عنوان العنصر الأول ولا يمكن تعديله
9. 🚀 الخطوة التالية
الآن بعد أن تعلمت أساسيات المصفوفات، لنتابع إلى المصفوفات متعددة الأبعاد (الدرس 17) — التعامل مع البيانات الجدولية (مثل المصفوفات، لوحات الألعاب).