القائمة الرئيسية

الصفحات

تعلم الجافا - جمل التكرار Looping Statements - الجزء الثاني

تعلم الجافا - جمل التكرار Looping Statements - الجزء الثاني

تعلم الجافا - جمل التكرار Looping Statements - الجزء اثاني

جملة التكرار for Statement

على الرغم من استخدام كلا من لغة الجافا و الـ C++ نفس التركيب العام لحلقة التكرار for , إلا إن هناك اختلافا جوهريا بين اللغتين قد يؤدي إلى وقوع البعض ممن اعتادوا لغة C++ في أخطاء لغوية قواعدية تمنع تنفيذ حلقة التكرار.

 وهو ما سنسلط عليه الضوء عبر حلقتنا هذه بعد التعرف على الصيغة الهامة لجملة التكرار for في لغة الجافا.

for (Initialization;Termination;Increment or Decrement)
Java_Statement;

كما تلاحظ, تبدأ صيغة حلقة التكرار بـ for وهي كلمة مجوزة تدل على حلقة تكرار, يتبعها القوس الذي يضم عناصر اعدادات الحلقة الأساسية, وهي على النحو الآتي:

  • initialization وهي للتصريح عن المتغير الذي سيشكل محور عداد حلقة التكرار Counter ومن الممكن إن يكون متغير عددي أو متغير حرفي, ويجب إن تتضمن عملية التصريح, إسناده المتغير بقيمة مبدئية Start Value تدل على بداية عداد الحلقة.
    تشكل تعليمة التصريح Initialization وجه الاختلاف الوحيد بين حلقة التكرار for الخاصة بالجافا وتلك الخاصة بلغة C++ بحيث تشترط علينا الجافا إن يكون المكان الوحيد للتصريح عن عداد الحلقة داخل قوس حلقة التكرار.
  •  ولا يمكن بأي حال من الأحوال التصريح عن العداد خارج الحلقة وحتى لو كان المتغير محور العداد مصرح عنه على انه متغير عام فلا يمكن استخدامه كعداد خاص بحلقة التكرار for أما لغة C++ فتسمح لنا استخدام المتغيرات العامة بكل حرية كما أنها تسمح لنا بالتصريح عن المتغير محور عدادا الحلقة قبل حلقة التكرار. 
  • والحقيقة إن الأفضلية في هذا الاختلاف تصب في مصلحة لغة الجافا, فعندما نلتزم بالتصريح عن عداد الحلقة ونعتبره متغير محلي خاص بحلقة التكرار, نضمن عدم تأثره بأي تعليمة برمجية خارج جسم الحلقة.
  • Termination القيمة النهائية وهي عبارة تعليمة برمجية, تتضمن شرط مقارنة متغير عداد الحلقة بالقيمة النهائية للعداد Condition , ويمكننا استخدام كافة عملية المقارنة المتعارف عليه مثل المساواة أو إشارة اكبر من أو اصغر من أو يساوي.. وهكذا.
  • Increment or Decrement يختص النصر الثالث من قوس اعدادات حلقة for بتحديد معدل عملية الزيادة أو النقصان التي ستتم على متغير عداد الحلقة من اجل تحديد القيمة التالية للعداد.
  •  Next Value وهنا يمكننا استخدام عمليات إسناد المتغير بنتيجة عملية حسابية أو من خلال عملية الزيادة أو النقصان بواحد.

بعد تحديد عناصر اعدادات حلقة for يمكننا المباشرة بصياغة التعليمة البرمجية التي نرغب بتنفيذها ثم تكرار تنفيذها, هذا طبعا إذا كانت التعليمة البرمجية منفردة.

 أما في حال كانت التعليمية البرمجية مركبة من عدت تعليمات, عندها يجب علينا استخدام البنية الخاصة بالتعليمة المركبة والتي تتمثل بقوس البداية الأكبر } ثم التعليمات وفي النهاية قوس النهاية الأكبر { كما هو مبين في الصيغة التالية:

 

for (Initialization;Termination;Increment or Decrement)
{ Java_Statement_1; Java_Statement_2;
}//end of for
.............. Java_Statement_N;

الية تنفيذ حلقة for

Class For_Stat
{
public static void main(String[] args)
{
//---------------
for(int i=0 ; i <= 10 ;i++ )
System.Out.Println(i);
}//end main
}// end class

تتلخص فكرة المثال أعلاه بطباعة الأعداد من صفر إلى عشرة وبتحليل قوس اعدادات حلقة التكرار.

 لاحظ إننا صرحنا عن المتغير I من الهيئة Int بالقيمة البدائية صفر ليعمل كعداد للحلقة ثم حددنا القيمة النهائية وشرط توقف التكرار عندما تتجاوز قيمة I القيمة, عشرة بمعنى آخر ستسمر تنفيذ الحلقة طالما إن قيمة I اقل من أو تساوي عشرة. 

أما معدل زيادة عداد الحلقة فكان الزيادة بواحد في كل مرة تنفيذ فيها الحلقة.

تبدأ آلية تنفيذ البرنامج السابق بتسجيل قيمة المتغير I ضمن مسجل خاص ثم التحقق من شرط التوقف فإذا وجد صحيحا نخرج من حلقة التكرار دون تنفيذ أي تعليمة برمجة تابعة للحلقة.

 أما إذا لم يتحقق شرط التوقف عندها نقوم بتنفيذ تعليمة الطباعة. وبعد ذلك نعود إلى اعدادات حلقة for وتحديدا إلى العنصر الثالث " الزيادة أو النقصان على العداد" ليتم تطبيق عملية الزيادة وتسجيل القيمة الجديدة لعداد الحلقة. 

لنعود بعدها إلى العنصر الثاني " شرط التوقف والتحقق من القيمة النهائية لعداد الحلقة.. وهكذا يستمر تكرار تنفيذ تعليمات الحلقة حتى يتحقق شرط التوقف لنخرج عندها من حلقة التكرار.

استخدام عداد حرفي char

ليس شرط إن يكون المتغير محور عداد الحلقة من صيغة الأعداد الصحيحة, إذ يمكننا استخدام المتغيرات الحرفية كعداد لحلقة التكرار for كما هو مبين في المثال التالي:

Class For_Stat
{
public static void main(String []args)
{
//----------
for(char i='a';i<='z';++i)
{
System.Out.Print(i);
System.Out.Print("");
}//--end of for statement
}//end main
}//end class

وفقا للتعليمة البرمجية أعلاه, تتم طباعة سلسلة الحروف a--> z يفصل بينها فراغ واحد. لاحظ عند إسناد القيمة الابتدائية للمتغير الحرف يجب إن توضع القيمة بين علامات الاقتباس الأحادية Quotation

قد تبدو عملية الزيادة بواحد على المتغير الحرفي غير مألوفة, إذ الغالبية منا تعلم بان شان عملية الزيادة بواحد إن تزيد قيمة المتغير بقيمة واحدة, فهل من المنطق إن نضيف واحد إلى حرف؟

الحقيقة إن تطبيق عملية الزيادة بواحد على المتغير الحرفي يتخللها عملية تحويل ذاتية يتكفل بها المترجم بحيث يتم تحويل المتغير الحرفي إلى نظام الترميز ASCII Code الذي يمثل كل حرف بقيمة عددية معينة بحسب لغة المتغير الحرفي وحالة الحرف إذا كان كبير أو صغير, على سبيل المثال يقابل الحرف a في نظام الـ ASCII الرقم 97 وعندما تطبق عليه عملية الزيادة بواحد نحصل على قيمة الـ ASCII الجديدة 98 والتي تعود للحرف b وهكذا حتى نهاية سلسلة الحروف.

تقودنا فكرة المثال السابق لصياغة برنامج يتكفل بإخراج القيمة المقابلة لكل حرف في نظام الـ ASCII , وهنا لن نحتاج لإجراء أكثر من إجراء تعديل بسيط على المثال أعلاه ليصبح على النحو التالي:

Class For_Stat
{
public static void main(string[]args)
{
//----------
for(char i='a';i<='z';++i)

{
System.Out.Printl(i+"the Ascii is:"+(int)i);
}//--end of for statemen
}//end main
}//end class

كما في الصيغة البرمجية المعدلة, بم نغير شيئا على تعليمة الطباعة سوى تحويل الحرف إلى ما يقابله بنظام الـ ASCII بطريقة يدوية وهي التحويل من حرف إلى رقم بهيئة int.

أنت الان في اول موضوع

تعليقات

التنقل السريع