البرمجة

التحكم بالتدفق في لغة C

التعابير المنطقية والتحكم بالتدفق في لغة C

مقدمة

تُعتبر لغة C من أقدم وأقوى لغات البرمجة التي أثرت بشكل جذري في تطوير نظم التشغيل، المترجمات، وبرمجيات الأنظمة. تمتاز هذه اللغة ببساطتها وسرعتها وفعاليتها العالية، وتُستخدم في الكثير من التطبيقات بدءًا من البرمجيات منخفضة المستوى كبرمجيات الأجهزة إلى البرمجيات عالية المستوى مثل الأنظمة التفاعلية.

أحد أهم الركائز التي تُبنى عليها البرمجة في لغة C هو التحكم في تدفق البرنامج واتخاذ القرارات من خلال التعابير المنطقية وبُنى التحكم بالتدفق. دون هذه البُنى، سيكون تنفيذ البرامج تسلسليًا فقط، وهو ما يقيد قدرة البرامج على الاستجابة للمدخلات أو الحالات المختلفة.

في هذا المقال المطوّل، سنتناول بشكل موسّع وعميق التعابير المنطقية وكيفية استخدامها، وبُنى التحكم بالتدفق المختلفة مثل العبارات الشرطية والحلقات التكرارية، مع أمثلة عملية وشرح تفصيلي لكل جزء، بما يوفر مرجعًا شاملاً للمبرمجين المبتدئين والمحترفين على حد سواء.


أولاً: التعابير المنطقية في لغة C

تعريف التعبير المنطقي

التعبير المنطقي (Logical Expression) هو تعبير ينتج عنه قيمة منطقية: إما صحيحة (true) أو خاطئة (false). في لغة C، تُعبر القيم المنطقية بالأعداد: الصفر (0) يُمثل “false”، وأي قيمة غير الصفر تُعتبر “true”.

العوامل المنطقية (Logical Operators)

فيما يلي أهم العوامل المنطقية التي تُستخدم في كتابة التعابير المنطقية:

العامل الاسم الوظيفة
&& AND المنطقي يرجع true إذا كانت جميع التعابير صحيحة
` `
! NOT المنطقي يعكس القيمة المنطقية للتعبير (true تصبح false والعكس صحيح)

أمثلة على التعابير المنطقية

c
int x = 10, y = 5; if (x > 0 && y > 0) { printf("القيم موجبة\n"); } if (x == 10 || y == 0) { printf("إما x تساوي 10 أو y تساوي 0\n"); } if (!(x < y)) { printf("x ليست أصغر من y\n"); }

الأولوية (Precedence) في التعبير المنطقي

في حال وجود أكثر من عامل منطقي، يتم تطبيق القواعد التالية:

  1. العامل ! له أولوية أعلى من && و ||.

  2. العامل && له أولوية أعلى من ||.

  3. الأقواس () تُستخدم لتحديد الأولوية يدويًا.


ثانيًا: التحكم في تدفق البرنامج (Control Flow)

أهمية التحكم في التدفق

بدون التحكم في تدفق التنفيذ، فإن التعليمات البرمجية في لغة C تُنفذ خطًا تلو الآخر بشكل متسلسل. من خلال استخدام أدوات التحكم في التدفق، يستطيع البرنامج اتخاذ قرارات، تكرار تعليمات معينة، أو تخطي أجزاء من الكود.


العبارات الشرطية (Conditional Statements)

1. عبارة if

تُستخدم if لتنفيذ كتلة من الكود فقط إذا تحقق شرط معين.

c
if (x > y) { printf("x أكبر من y\n"); }

2. عبارة if...else

تُستخدم لتوفير مسارين بديلين حسب تحقق الشرط أو لا.

c
if (x > y) { printf("x أكبر من y\n"); } else { printf("x أصغر أو يساوي y\n"); }

3. عبارة if...else if...else

تُستخدم لتوفير عدة حالات محتملة.

c
if (x > y) { printf("x أكبر من y\n"); } else if (x < y) { printf("x أصغر من y\n"); } else { printf("x يساوي y\n"); }

4. العبارة switch

تُستخدم في الحالات التي تعتمد على مقارنة قيمة واحدة مع عدة قيم ثابتة.

c
int option = 2; switch (option) { case 1: printf("الخيار الأول\n"); break; case 2: printf("الخيار الثاني\n"); break; default: printf("خيار غير معروف\n"); }

ملاحظة: يجب استخدام break للخروج من كل حالة، وإلا سينتقل التنفيذ إلى الحالات التالية (fall-through).


الحلقات التكرارية (Loops)

تُستخدم الحلقات لتكرار تنفيذ مجموعة من التعليمات بناءً على شرط منطقي.

1. الحلقة while

c
int i = 0; while (i < 5) { printf("%d\n", i); i++; }

2. الحلقة do...while

تُنفذ الكود أولاً ثم تتحقق من الشرط.

c
int i = 0; do { printf("%d\n", i); i++; } while (i < 5);

3. الحلقة for

الحلقة الأكثر استخدامًا، تُستخدم عندما يكون عدد التكرارات معروفًا.

c
for (int i = 0; i < 5; i++) { printf("%d\n", i); }

أوامر التحكم داخل الحلقات

– الأمر break

يُستخدم للخروج الفوري من الحلقة أو من عبارة switch.

c
for (int i = 0; i < 10; i++) { if (i == 5) break; printf("%d\n", i); }

– الأمر continue

يُستخدم لتخطي التكرار الحالي والانتقال إلى التكرار التالي.

c
for (int i = 0; i < 10; i++) { if (i % 2 == 0) continue; printf("%d\n", i); }

المقارنة بين العبارات الشرطية والحلقات

العنصر العبارات الشرطية الحلقات
الاستخدام اتخاذ قرارات تكرار تنفيذ تعليمات
أمثلة رئيسية if, else if, else, switch for, while, do...while
الشرط المنطقي شرط يُحدد المسار شرط يُحدد استمرار التكرار
وجود عدة مسارات نعم لا، غالبًا مسار واحد متكرر

استخدام التعابير المنطقية مع الحلقات والشرط

غالبًا ما تُستخدم التعابير المنطقية لتحديد شروط الحلقات أو العبارات الشرطية. هذه التعابير تُمكن البرنامج من التفاعل مع المستخدم أو البيانات بشكل ديناميكي.

مثال توضيحي:

c
int age; printf("أدخل عمرك: "); scanf("%d", &age); if (age >= 18 && age <= 60) { printf("مؤهل للعمل\n"); } else { printf("غير مؤهل للعمل\n"); }

نصائح عند استخدام التحكم في التدفق والتعابير المنطقية

  1. استخدام الأقواس حتى في حالة تعبير شرطي واحد لزيادة الوضوح.

  2. عدم الإفراط في التعشيش (Nesting) لأنه يؤدي إلى صعوبة في القراءة.

  3. تبسيط الشروط واستخدام متغيرات منطقية إذا لزم الأمر.

  4. التحقق من الحلقات اللا نهائية خاصة في while و do...while.

  5. التعليق الجيد للكود يجعل فهم مسار التدفق أسهل عند العودة إليه لاحقًا.


مثال تطبيقي متكامل

البرنامج التالي يطلب من المستخدم إدخال رقم ويُحدد ما إذا كان موجبًا، سالبًا، أو صفرًا، ثم يطلب عدد تكرارات لطباعة الرقم ويطبع الأرقام المتتالية منه:

c
#include int main() { int num, count; printf("أدخل رقمًا: "); scanf("%d", &num); if (num > 0) { printf("الرقم موجب\n"); } else if (num < 0) { printf("الرقم سالب\n"); } else { printf("الرقم هو صفر\n"); } printf("أدخل عدد التكرارات: "); scanf("%d", &count); for (int i = 0; i < count; i++) { printf("الرقم + %d = %d\n", i, num + i); } return 0; }

خاتمة

التحكم بالتدفق والتعابير المنطقية من الركائز الجوهرية لأي برنامج مكتوب بلغة C. فبدونهما، يصبح البرنامج مجرد سلسلة جامدة من التعليمات التي لا تتفاعل مع الظروف أو المدخلات. من خلال الاستخدام الفعّال للعبارات الشرطية، الحلقات، والتعابير المنطقية، يمكن للبرنامج أن يصبح أكثر ذكاءً، تفاعلية، وفعالية.

تعلم كيفية بناء الشروط والتحكم بالتدفق في لغة C يُعد خطوة أساسية لكل من يسعى إلى إتقان البرمجة سواء على مستوى المبتدئين أو المطورين المحترفين العاملين في أنظمة مدمجة، تطوير نظم التشغيل، أو غيرها من المجالات التقنية الحساسة.


المراجع:

  • Kernighan, B. W., & Ritchie, D. M. (1988). The C Programming Language. Prentice Hall.

  • King, K. N. (2008). C Programming: A Modern Approach. W. W. Norton & Company.