تخطَّ إلى المحتوى

المصفوفات والنصوص في C

الدرس 6 من 10 · C

المصفوفة (Array) في C مجموعة من القيم من نفس النوع، مخزنة متجاورة في الذاكرة، تحت اسم واحد. وفي C هناك مفاجأة: النصوص نفسها ليست نوعاً خاصاً، بل مصفوفات من الحروف! في هذا الدرس ستتعلم المصفوفات بأنواعها، وكيف تتعامل مع النصوص.

int scores[4] = {85, 92, 78, 64};
printf("%d\n", scores[0]);
scores[1] = 95;
printf("%d\n", scores[1]);
الناتج
85
95
  • int scores[4]: مصفوفة من 4 أعداد صحيحة.
  • الترقيم يبدأ من صفر: أول عنصر scores[0]، وآخر عنصر scores[3].
  • حجم المصفوفة ثابت لا يتغير بعد تعريفها.

تخيّل المصفوفة مثل عربات قطار متصلة: كل عربة بجانب الأخرى مباشرة في الذاكرة، ولكل عربة رقم.

C لا تخزن عدد العناصر مع المصفوفة. لكن يمكن حسابه بـ sizeof:

int size = sizeof(scores) / sizeof(scores[0]);
printf("عدد العناصر: %d\n", size);
الناتج
عدد العناصر: 4

sizeof(scores) حجم المصفوفة كلها بالبايت (4 عناصر × 4 بايت = 16)، و sizeof(scores[0]) حجم عنصر واحد (4)، والقسمة تعطي عدد العناصر.

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.

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.

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");
}
الناتج
6
1 2 3
4 5 6

grid[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);
الناتج
Sara
4
S
Sara Ali
  • النص مصفوفة char، ويُطبع بـ %s.
  • كل نص في C ينتهي بحرف خفي اسمه حرف النهاية '\0'، وبه تعرف الدوال أين ينتهي النص.
  • strlen: طول النص بدون حرف النهاية.
  • strcat: تُلحق نصاً بنهاية آخر. لهذا جعلنا حجم name 20، ليتسع للإضافة.

دليل حرف النهاية:

char word[] = "Hi";
printf("%zu\n", sizeof(word));
الناتج
3

حرفان فقط، لكن المصفوفة حجمها 3: الحرف الثالث هو '\0'.

مقارنة النصوص: لا تستخدم == مع النصوص في C، بل strcmp، التي تُرجع صفراً عندما يتطابق النصان: strcmp("abc", "abc") == 0 نتيجتها 1 أي صحيح.

  1. أنشئ مصفوفة بدرجات 6 طلاب، واطبع المتوسط وأقل درجة وعدد الناجحين (50 فأكثر).
  2. اكتب دالة void doubleAll(int arr[], int size) تضاعف كل عناصر المصفوفة، ثم اطبع المصفوفة في main لتتأكد أن الأصل تغيّر.
  3. اكتب برنامجاً يطبع نصاً معكوساً حرفاً حرفاً (من آخر حرف إلى أوله) باستخدام strlen وحلقة.
  4. تحدٍّ: اكتب دالة تعد مرات ظهور حرف معين في نص.
  • تجاوز حدود المصفوفة: C لا تحذرك، وقد يحدث سلوك غريب أو انهيار. راجع شروط الحلقات.
  • مصفوفة نص أصغر من اللازم: تذكّر مكاناً إضافياً لحرف النهاية، ومساحة كافية قبل strcat.
  • مقارنة النصوص بـ ==: تقارن العناوين لا المحتوى. استخدم strcmp.

سؤال

كم بايتاً تشغل المصفوفة char s[] = "Cat";؟

سؤال

ماذا يحدث في C عند قراءة arr[10] من مصفوفة فيها 4 عناصر فقط؟

  • int a[4] = {...} مصفوفة ثابتة الحجم، والترقيم من صفر حتى size - 1.
  • sizeof(a) / sizeof(a[0]) يحسب عدد العناصر، ومرّر الحجم للدوال كمعامل.
  • C لا تفحص حدود المصفوفات، فراجع شروط حلقاتك بعناية.
  • النصوص مصفوفات char تنتهي بالحرف '\0'، ودوالها في string.h: strlen و strcat و strcmp.