المصفوفات والنصوص في C
المصفوفة (Array) في C مجموعة من القيم من نفس النوع، مخزنة متجاورة في الذاكرة، تحت اسم واحد. وفي C هناك مفاجأة: النصوص نفسها ليست نوعاً خاصاً، بل مصفوفات من الحروف! في هذا الدرس ستتعلم المصفوفات بأنواعها، وكيف تتعامل مع النصوص.
تعريف مصفوفة
Section titled “تعريف مصفوفة”int scores[4] = {85, 92, 78, 64};printf("%d\n", scores[0]);scores[1] = 95;printf("%d\n", scores[1]);8595int scores[4]: مصفوفة من 4 أعداد صحيحة.- الترقيم يبدأ من صفر: أول عنصر
scores[0]، وآخر عنصرscores[3]. - حجم المصفوفة ثابت لا يتغير بعد تعريفها.
تخيّل المصفوفة مثل عربات قطار متصلة: كل عربة بجانب الأخرى مباشرة في الذاكرة، ولكل عربة رقم.
كم عنصراً في المصفوفة؟
Section titled “كم عنصراً في المصفوفة؟”C لا تخزن عدد العناصر مع المصفوفة. لكن يمكن حسابه بـ sizeof:
int size = sizeof(scores) / sizeof(scores[0]);printf("عدد العناصر: %d\n", size);عدد العناصر: 4sizeof(scores) حجم المصفوفة كلها بالبايت (4 عناصر × 4 بايت = 16)، و sizeof(scores[0]) حجم عنصر واحد (4)، والقسمة تعطي عدد العناصر.
المرور على المصفوفة
Section titled “المرور على المصفوفة”int sum = 0;int max = scores[0];for (int i = 0; i < size; i++) { sum += scores[i]; if (scores[i] > max) max = scores[i];}printf("المجموع: %d\n", sum);printf("الأكبر: %d\n", max);المجموع: 322الأكبر: 95لاحظ الشرط i < size وليس <=، لأن آخر رقم هو size - 1.
القيم الأولية
Section titled “القيم الأولية”int counts[5] = {0};int partial[5] = {1, 2};{0}: كل العناصر أصفار.{1, 2}: أول عنصرين 1 و 2، والباقي أصفار تلقائياً.
فتطبع حلقة على counts القيم 0 0 0 0 0، وعلى partial القيم 1 2 0 0 0.
تمرير المصفوفة لدالة
Section titled “تمرير المصفوفة لدالة”double average(int arr[], int size) { int sum = 0; for (int i = 0; i < size; i++) { sum += arr[i]; } return (double) sum / size;}printf("المتوسط: %.2f\n", average(scores, size));المتوسط: 80.50لاحظ أننا مررنا الحجم كمعامل منفصل، لأن الدالة لا تستطيع معرفته وحدها. وعلى عكس المتغيرات العادية، المصفوفة لا تُنسخ عند تمريرها: الدالة تستقبل عنوان أول عنصر، فإذا عدّلت عناصرها، يتغير الأصل.
المصفوفات ثنائية الأبعاد
Section titled “المصفوفات ثنائية الأبعاد”int grid[2][3] = { {1, 2, 3}, {4, 5, 6}};printf("%d\n", grid[1][2]);for (int r = 0; r < 2; r++) { for (int c = 0; c < 3; c++) { printf("%d ", grid[r][c]); } printf("\n");}61 2 34 5 6grid[1][2]: الصف الثاني، العمود الثالث. مثل جدول بصفوف وأعمدة.
النصوص: مصفوفات من الحروف
Section titled “النصوص: مصفوفات من الحروف”#include <string.h>
char name[20] = "Sara";printf("%s\n", name);printf("%zu\n", strlen(name));printf("%c\n", name[0]);strcat(name, " Ali");printf("%s\n", name);Sara4SSara Ali- النص مصفوفة
char، ويُطبع بـ%s. - كل نص في C ينتهي بحرف خفي اسمه حرف النهاية
'\0'، وبه تعرف الدوال أين ينتهي النص. strlen: طول النص بدون حرف النهاية.strcat: تُلحق نصاً بنهاية آخر. لهذا جعلنا حجمname20، ليتسع للإضافة.
دليل حرف النهاية:
char word[] = "Hi";printf("%zu\n", sizeof(word));3حرفان فقط، لكن المصفوفة حجمها 3: الحرف الثالث هو '\0'.
مقارنة النصوص: لا تستخدم == مع النصوص في C، بل strcmp، التي تُرجع صفراً عندما يتطابق النصان: strcmp("abc", "abc") == 0 نتيجتها 1 أي صحيح.
جرّب بنفسك
Section titled “جرّب بنفسك”- أنشئ مصفوفة بدرجات 6 طلاب، واطبع المتوسط وأقل درجة وعدد الناجحين (50 فأكثر).
- اكتب دالة
void doubleAll(int arr[], int size)تضاعف كل عناصر المصفوفة، ثم اطبع المصفوفة فيmainلتتأكد أن الأصل تغيّر. - اكتب برنامجاً يطبع نصاً معكوساً حرفاً حرفاً (من آخر حرف إلى أوله) باستخدام
strlenوحلقة. - تحدٍّ: اكتب دالة تعد مرات ظهور حرف معين في نص.
أخطاء شائعة
Section titled “أخطاء شائعة”- تجاوز حدود المصفوفة: C لا تحذرك، وقد يحدث سلوك غريب أو انهيار. راجع شروط الحلقات.
- مصفوفة نص أصغر من اللازم: تذكّر مكاناً إضافياً لحرف النهاية، ومساحة كافية قبل
strcat. - مقارنة النصوص بـ ==: تقارن العناوين لا المحتوى. استخدم
strcmp.
اختبر نفسك
Section titled “اختبر نفسك”سؤال
كم بايتاً تشغل المصفوفة char s[] = "Cat";؟
ثلاثة حروف، بالإضافة إلى حرف النهاية الخفي '\0' الذي ينتهي به كل نص في C.
سؤال
ماذا يحدث في C عند قراءة arr[10] من مصفوفة فيها 4 عناصر فقط؟
C لا تفحص حدود المصفوفات، والمسؤولية عليك كمبرمج، وتجاوزها من أخطر الأخطاء.
الخلاصة
Section titled “الخلاصة”int a[4] = {...}مصفوفة ثابتة الحجم، والترقيم من صفر حتىsize - 1.sizeof(a) / sizeof(a[0])يحسب عدد العناصر، ومرّر الحجم للدوال كمعامل.- C لا تفحص حدود المصفوفات، فراجع شروط حلقاتك بعناية.
- النصوص مصفوفات
charتنتهي بالحرف'\0'، ودوالها فيstring.h:strlenوstrcatوstrcmp.