# برمجة جافا/أساسيات 3
## الخوارزميات

عندما نقوم بكتابة برنامج، فإننا نفعل ذلك لأن هنالك مشكلة نريد حلها ونستخدم الحاسوب لإيجاد ذلك الحل. ولكن حتى نستطيع كتابة برنامج بشكل صحيح فإنه من الأساسي أن نقوم بشيئين أولا:
1) أن نفهم المشكلة بشكل كامل، ونفهم كل مداخلاتها. لأنه بدون فهم صحيح للمشكلة فإننا لا نستطيع أن نكوّن حل صحيح يقوم بحل المشكلة.
2) أن نقوم بتطوير خوارزمية واضحة لحل المشكلة. والخوارزمية ما هي إلا عبارة عن تعريف للأفعال اللازمة لحل المشكلة، وتعريف الترتيب الصحيح لهذه الأفعال.
فمثلا، عندما تستيقظ في الصباح، فإنك تغتسل ثم تغير ملابسك ثم تتناول الفطور وبعدها تذهب للعمل. هذه تعتبر خوارزمية لأنها تعرّف الأفعال اللازمة وترتيبها الصحيح.
بعد أبحاث كثيرة(Bohm and Jacopini)، تم التوصل إلى أنه يمكنك كتابة ما تريد في لغات البرمجة مستخدما أي من التراكيب البرمجية التالية: التسلسل، والاختيار، والدوران. التسلسل هو عبارة عن تنفيذ الأوامر البرمجية بشكل تسلسلي كما هو مكتوب في البرنامج. الاختيار بمكنك من اختيار فعل أو مجموعة أفعال بناء على شرط معين. بينما الدوران يمكنك من تكرار فعل ما عدد محدد من المرات أو بناء على تحقق شرط أو عدمه. في جافا، فإن سير البرنامج الأساسي هو التسلسل ما لم تتوفر جمل معينة تقوم بتغير هذا التسلسل. هذه الجمل تعرف باسم جمل التحكم، والتي هي مسؤولة عن التحكم بترتيب الأفعال. وجمل التحكم في جافا تقسم إلى قسمين:

## 1) جمل الإختيار

و هي جمل تمكنك من اختيار واحد من أكثر من خيار متوفر. وجمل الاختيار في جافا ثلاثة:
1.1) if: جملة if (إذا) تمكنك من القيام بعمل ما إذا تحقق شرط معين ولا تقوم بعمل شيء إذا لم يتحقق الشرط. فمثلا، قد يكون هنالك مقرر دراسي بعلامة نجاح 60، وتريد معرفة ما إذا نجحت في هذا المقرر فإنك تستطيع ذلك باستخدام جملة if
كما يمكنك الملاحظة، فإن جملة if تتكون من كلمة if متبوعة بشرط بين قوسين وتليها جملة الفعل الذي يجب فعله في حالة تحقق الشرط. بخلاف لغة ++C فإن الشرط يجب أن يكون قيمة منطقية تحمل قيمة صح أو خطأ (Boolean of value true or false) ولا يجوز أن يكون قيمة رقمية.
كما يمكن الملاحظة بأننا قمنا بتحريك جملة الفعل إلى اليمين أسفل الشرط، وهذا ليس إجباريا ولكن من المستحسن فعله لأنه يعني أن هذه الجملة تابعة للشرط مما يؤدي إلى سهولة في قراءة البرنامج. (مما يعني أخطاء أقل :) )
جملة System.out.println تأمر الجهاز بأن يقوم بطباعة الجملة الموجودة بين قوسين على الشاشة.
1.2) if ... else: جملة if...else عبارة عن جملة اختيار تمكنك من القيام بعمل ما إذا تحقق شرط معين، والقيام بعمل آخر إذا لم يتحقق الشرط. في مثالنا السابق، يمكننا أن نوسع الفكرة بحيث يقوم الجهاز بطباعة كلمة Passed إذا كان الطالب قد نجح في المقرر وطباعة Fail إذا لم ينجح الطالب.
في جمل الاختيار if وif...else فإنه يمكنك من تعريف أكثر من فعل واحد ليحدث عند تحقق الشرط أو عدمه وذلك بوضع الجمل داخل الأقواس المعقوفة.
كما أنه يمكنك أن تضع جمل داخل بعضها البعض وهذا ما يدعى (Nesting)
مشكلة else المتدلية (Dangling else problem): ماذا يحدث في حالة البرنامج التالي؟
قد يعتقد المبرمج بأنه إذا تحقق الشرط condition1 وcondition2 فإن statement1 ستنفذ، وإذا لم يتحقق condition1 فإن statement2 ستنفذ. ولكن للأسف هذا خطأ، لأنه (مع أن طريقة كتابة البرامج تدل على ذلك) فإن جافا ستفهم البرنامج السابق على أنه:
و هذا يعني أنه عند تحقق condition1 وcondition2 فإن statement1 ستنفذ، ولكن عند تحقق condition1 وعدم تحقق condition2 فإن statement2 ستنفذ، وهذا يعود لسبب أن جافا تربط ال else بأقرب if لها.
و لكن، إفرض أنك تريد كتابة برنامج يقوم بما هو مفروض أن يحدث في البرنامج الأول؟ في هذه الحالة فإنه يجب عليك أن توضح بشكل صريح بأن ال else تتبع ال if الأولى، وذلك عن طريق وضع ال if الثانية داخل الأولى، باستخدام الأقواس المعقوفة. وهذا ما يعرف باسم Block وهو أي شيء داخل قوسين معقوفين.
1.3) switch: وهي جملة شبيهة بعدّة جمل if متداخلة، والهدف منها الاختيار بين عدّة خيارات، فمثلا يمكنك استخدامها عندما تفحص متغير يمكن أن يحمل أكثر من قيمتين وله بناء على ذلك أكثر من تصرفين.

## 2) جمل الدوران

1) while:
2) do...while:
3) for: تستخدم عندما يكون عدد مرات التكرار معلوم الصيغة العمة لها هي for(initial value;condition;inc/dec count) statement مثلا لطباعة الاعداد من 1 الي 10
for(int i=1;i<=10;i++) ٍSystem.out.print(i);
4) foreach: