3 العنصر الثالث : سلسلة تعلم الجافا من الصفر "هياكل البينات"

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

1 العنصر الأول: سلسلة تعلم لغة الجافا من الصفر " تعريف ".

2 العنصر الثاني : سلسلة تعلم الجافا من الصفر "أساسيات الجافا".

ستجد  امثلة  برمجية  في اخر  التدوينة 

3 العنصر الثالث : سلسلة  تعلم الجافا من الصفر "هياكل  البينات"

1- دالة الشرطية في الجافا Java if-else

في  لغة الجافا كباقي لغات البرمجة تحتاج الى  تحديد  مواقف للكي يتخذها  البرنامج  في حالة استوفاء  الشرط او  عدم استوفائه  تقريبا اتقانك  لدالة الشرطية  هو اساس انفتاحك على عالم البرمجة  وتحقيق تقدم  ملحوظ في مشوارك البرمجي  بحيث يمكنك  تحقيق برامج بشروط  قوية  من خلال هذه الدالة التي توفر كل من الحماية للبرنامج والحماية لترجمة لغة الالة  من الانسان 

}(if(condition
  //اذا ما تحقق الشرط سيعمل الكود المراد تشغيله
}

في  الغالب يقوم المبرمجون بوضح حالات الاجابة في عدم استوفاء  الشرط  كرسالة منبثقة  تخبر المستخدم بفشل الدخول او عدم استوفاء مستحقات  الحقول الى اخره  

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

شرح  منطقي  لدالة if  


public class TestClass
 }   (public static void main(String[] args
      int totalMarks=55;
    }  (if(totalMarks>50
       ; ("لقد نجحت في الامتحان !!")System.out.print
   { 
{
    {

المخرج سيكون كالتالي :  لقد نجحت في الامتحان !!

في  البرنامح  الذي قمنا  بكتابته  حددنا  شرط وهو 50 وقلنا  اذا  ما استوفى شرط 50 او فمافوق فانه  ناجج في الامتحان وفي حالة  عدم استوفائه  فاننا لم  نحددها  بعد ويمك اضافة else   لتحديد  عدم استوفاء الشرط 

if(الشرط المرادالتحقق){
في حالة استوفاء  الشرط
}else{
في حالة  عدم استوفاء  الشرط 
}

في هذا  المثال سنظع على سبيل  التغيير نتيجة  تبين  عدم استوفاء شرط الدالة  لكي يظهر لكم الفرق 

public class TestClass {
    public static void main(String[] args) {
      int totalMarks=48;
      if(totalMarks>50){
        System.out.print("لقد نجحت في  الامتحان");
      }
      else {
        System.out.print("لقد  فشلت في الامتحان");
      }
    }
  }

المخرج سيكون كالتالي: لقد  فشلت في الامتحان

اضن ان فكرة الدالة  if قد  اتضحت امامكم  ومدا سهولة استخدامها  وقوة استخدمها فهي دالة  تستخدم في اغلب  البرامج المكتبية  والخاصة بالويب ان لم اجزم ف99% من البرامج حول العالم لا تخلو من هذه الدالة  وعني  استخدمها كثيرا من اجل  حماية برامجي من افراط المستخدم حتى لا تتعطل اجهزتهم وهم يستخدمون برامجي ..   


لنفترض انك  تريد  في الجافا ان تضع اكثر من شرط وفي حالة عدم استوفاء  الشرط الاول تنظر  للشرط التالي  وهكذا دواليك ،  لنضع  مثال انك تريد  توظيف موضف في محلك التجاري وانت  تضع بعض  الشروط  منها  ان يكون الموظف  اكثر من 18 سنة  ان لم يستوفي هذا الشرط ان يكون هذا الموظف يتقن اكثر من 3 لغات  اجنبية ان لم يستوفي هذا  الشرط ان  يكون للموظف خبرة في ميدان  التجارة  والى اخره  في حالة  عدم استوفاء كل هذه  الشرط   تقوم برفض طلب توظيفه وهنا  نتحدث عن  هذه الدالة  

if...else if

مثال لهذه الدالة 

if(الشرط الاول){
    //في حالة استوفاء الشرط الاول
  }else if(الشرط  الثاني){
    //في حالة عدم استوفاء الشرط الاول  
  }
  else if(الشرط الثالث){
    //في حالة عدم استوفاءالشرط الاول والثاني 
    }
  ...
  else{
    //في حالة  عدم استوفاء جميع الشروط  يبقى هذا هو الحل الاخير
  }


كما  قلت في مثال الموظف يتخد البرنامج  الخاص بهذه الدالة  اكثر من حالة استوفاء  الشرط وبطبيعة الحال نضع  حالة عدم استوفاء جميع الشروط لكي  يكون لبرنامجنا نتيجة ما  تعرفك  علي نوع عدم استوفاء الشرط  

في هذا المثال البرمجي لدينا  عدة شروط لقبول التلاميذ في صفوف معينة  وفي حالة استوفاء الشروط سيتم قبول الطالب  في صف محدد  حسب درجة  امتحانه  وفي حالة عدم استوفاء تلك الشروط ستظهر له  رسالة فشل في النجاح  


public class TestClass {
    public static void main(String[] args) {
      int totalMarks=64;
      if(totalMarks>=80){
        System.out.print("انت مع الطلاب الاوائل");
      }
      else if (totalMarks>=60  & & totalMarks < 80 ){
        System.out.print("انت مع الطلاب المتوسطين");
      }
      else if (totalMarks>=40 & & totalMarks < 60){
        System.out.print("النتيجة ضعيفة لكنك ناجح");
      }
      else {
        System.out.print("الفشل  في الامتحان عدم القبول  في  الكلية  ");
      }
    }
  }


في هذا  الشرط  وضعنا  نقطة محددة وهي 64 في المتغير   ثم قمنا  بمقارنتها مع الشرط الاول وهو 80 نقطة  في حالة استوفاء  الطالب ستظهر رسالة  انت مع الطلاب الاوائل   وفي حالة عدم استوفاء ذلك الشرط  وكانت نتيجة الطالب  اكثر من 60 واقل من 80  سيتم وضعه مع طلاب متوسطين  من نفس  المستوى   انت مع الطلاب المتوسطين     وفي حالة كانت نتيجته اقل من 60 واكثر من 40  فهو ناجح في  الامتحان لكنه  غير مقبول في الكلية  وربما عليه اعادة الامتحان  اوالالتحاق بصفوف للدعم  وهناك الحالة الاخيرة  وهي عدم استوفاء جميع الشروط  وهو اخر شرط 40 نقطة  فان الطالب مرفوض  في الكلية  وغير مقبول وتكون الرسالة كالتالي الفشل  في الامتحان عدم القبول  في  الكلية

في ما  يخص  الدوال  الشرطية فاتمنا  اني  اوفيت شرحي فيها ان  كان اي تساؤلات تفضل اخي  الكريم ..  

2 -  الحلقة المفرغة  for loop

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

for (initialization; termination;     increment) {
    statement(s)
}


في الحلقة  المفرغة   توجد ثلاث عناصر اساسية  التهيئة  والانتهاء والتصاعدية او التناقصية 

التهيئة  initialization  :يتم تنفيذ  الكود  قبل بدآ  الحلقة  

الانتهاء  termination    : هنا يتم تنفيذ شرط  الخاص بالحلقة المفرغة  اما  مقارنة او تحقق شرط محدد 

التصاعدي او التناقصي increment     :يتم تنفيذها في كل مرة بعد تنفيذ الحلقة



حتى لا يكون الامر مربك  ساشرحه في كود  مع  نتيجة برمجية لكي  يبين عمل الحلقة  المفرغة  

public class TestClass {
    public static void main(String[] args) {
      int counter = 4;
            for (int cnt = 1; cnt < = counter; cnt++) {
                System.out.println("Current value of cnt is: " + cnt);
            }
    }
  }
  

كما  في الكود  وضعت  متغير conter  وحدد 4 كقيمة لهذا  المتغير ثم قمت بانشاء حلقة  تبدا  العد من واحد في  التهيئة int cnt = 1   وقمت بوضع  مقارنة في الانهاء او الشرط ان يكون المتغير cnt  اصغر او يساوي conter  واخبرته ان يقوم بالعد  تصاعدي cnt++   بهذه الطريقة  ستكون النتيجة  

 
Current value of i is: 1
Current value of i is: 2
Current value of i is: 3
Current value of i is: 4


جرب ان  تقوم بتغيير   القيمة    وتشغيل البرنامج وحاول ان  تعطي  قيمة اكبر وتغير التصاعدية بالتناقصي  cnt--  ولاحظ التغيير  في البرنامج كيف سيصبح بعض  التغييرات في القيم سيوضح  لك  اخي  الكريم  فكرة عمل  الحلقة المفرغة 

 لكي تبني  حلقة مفرغة لا نهائية في الجافا فقط عليك  كتابة الكود التالي :  

for ( ; ; ) {
    System.out.println("Infinite Loop!!!");
}


الان  سنتكلم عن الدور  الاساسي  في الحلقة المفرغة  واكثر استخدام لها  في  البرمجيات  ، في الحقيقة  تتوافق الحلقة المفرغة  مع المصفوفات  وتادي دور  فعال وسريع فكل مصفوفة لا تستغني عن  حلقة  مفرغة  حتى يكون  العمل متقن  رايت عدة لغات  تتعامل مع المصفوفات  بشكل مختلف كالاستغناء عن الحلقة المفرغة لكن الجافا  تاكد اخي الكريم انك ستحتاجها  فيكل برنامج يستخدم مصفوفة  


قواعد عليك  التعامل معها  عند المصفوفة  الرقم  واحد يساوي 0  فالالة  تعتبر  الرقم صفر تعداد فعند وضعك مصفوفة  تاكد ان  الرقم  واحد هو  0  والرقم 2 هو 1  والرقم 3 هو 2 وهي دواليك  

شكل  المصفوفة  

 int[] arr = {2,4,8,16};

الحلقة  المفرغة  مع المصفوفة  تسهل العملية  

public class TestClass {
    public static void main(String[] args) {
      int[] arr = {2,4,8,16};
      for(int i=0; i < arr.length; i++){
      System.out.println(arr[i]);
      }
    }
  }

كما تلاحظ  اخي  الكريم  انه  عند  وضع  الكود  في  برنامجك سيكون  الناتج  كالاتي :  

2

4

8

16

فلغة الالة  تعتمد  الرقم  0 كانطلاقة  للعد  وليس كالانسان يعتمد الرقم  1 للبدأ في  العد  

2 <===== 0

4<===== 1

8<===== 2

16<===== 3

ارجو ان  تكون الفكرة  قد  وصلت  حتى  نقوم بتطوير الكود قليلا حاول ان  تجرب  الكود التالي :  

public class TestClass {
    public static void main(String[] args) {
      int[] arr = {2,4,8,16};
      for(int i:arr){
        System.out.println(i);
      }
    }
}

ما  الذي تغير ؟  

تقريبا  لا شيء  فقط اختصرنا  الكود لاننا نستهدم مصفوفة  ولا يوجد  شرط  محدد لبداية التهئية  او انهاء  ولا تصاعديا فقط وضع البرنامج نفس المصفوفة  مررناها من arr  الى i  فالحلقة المفرغة  تضع لكل عنصر داخل  المصفوفة  قيمة  تطبعها  في نهاية البرنامج   مثال لكل  عضو عدد  محدد  ولكل منهم قيمة محدد تقوم الحلقة المفرغة بوضع  تلك  القيمة لكل عضو محدد  مع انها تقوم بالعد  من 0 للعضو رقم 1 و1 للعضو رقم  2 وهي دواليك  ...  التمرن  والتعامل مع  عدة مشاكل برمجية  ستساعدك على فهم الحلقات المفرغة  .. 

3 الحلقة المفرغة while  loop

في الحياة   اليومية  نقوم بحل مشكلة ما  بعمل معين لمدة معينة او لعدد معين  من المرات  حتى يتم  الغرض  كذالك في عالم الالة يمكنك  كتابة كود 10000 مرة  او يمكنك فقط  تخصيص حصة محددة لعمل ذلك  على  سبيل  المثال قمت ببناء برنامج 

Accept تم قبول هذا  المستخد للمرة الاولى
Add it to the total
Accept تم قبول هذا  المستخد للمرة الثانية 
Add it to the total
Accept تم قبول هذا  المستخد للمرة الثالثة
Add it to the total
......
......
......
Accept تم قبول هذا  المستخد للمرة 999
Add it to the total
Accept تم قبول هذا  المستخد للمرة 1000
Add it to the total

وفي حالة ثانية  يمكنني   الاعتماد عن  الالة  

LoopStatement(1000 times){
    Accept تم قبول هذا  المستخد
    Add it to the total
  }

النتيجة  هي نفسها وكل الطريقتين  صحيحة في معالجة المشكلة  عدا الطريقة الاولى  مكلفة  للوقت  والجهد  والطريقة الثانية  مختصرة للوقت وجعلتني اقضي عدة ثواني بدل ساعات  من العمل ، هو نفس عمل   الحلقة المفرغة while  loop

while (condition){
    statements;
 }

في هذه الدالة  الخاصة بالحلقة المفرغة  عليك  تحديد الشرط  وتحديد  عدم استفاء الشرط للخروج من الدالة وعدم  الوقوع في دالة لا نهائية  

class TestClass
{
  public static void main (String[] args)
  {
    int cnt = 1;
    while (cnt < = 5)
    {
      System.out.println("The value of cnt is : " + cnt);
      cnt = cnt + 1;
    }
  }
}

المخرج سكون  كالتالي :

The value of cnt is : 1
The value of cnt is : 2
The value of cnt is : 3
The value of cnt is : 4
The value of cnt is : 5


حتى الى  هنا  الدالة  واضحة  وهملها واضح  جرب اخي  الكريم تغيير   القيمة  واعد تشغيل  البرنامج  لفهم الدالة بشكل اوضح قبل  الاستمرارفي   الشرح  

do....while loop 

تشبه do....while loop كثيرا while loop  في  العمل عدا  ان  هذه الاخيرة  تعمل  بشكل معاكس  فهي تقارن هيكلية الحلقة في حالة استوفائها  الشرط  

do {
    statements;
  } while (condition);


مثال: 

class TestClass
{
  public static void main (String[] args)
  {
    boolean enter=false;
    do
    {
      System.out.println("Enter in do..while loop");
    }while (enter);
  }
}


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

4 -  تغيير  الحالة  switch statement

يعتبر تغيير  الحالة او المواقف خيار  افضل  كتخمين او برامج التخمينية  او عمليات حوسبية  انت  تجهل نتيجتها وتريد  ان  تحصل على  نتيجة مرضية او قريبة  فان  تغير  الحالات هوافضل خيار حيث يعمل  مع أنواع البيانات البدائية بايت ، والقصير ، و char ، و int. كما أنه يعمل مع الأنواع التي تم تعدادها ، وفئة String ، وعدد قليل من الفئات الخاصة التي تلتف أنواعًا بدائية معينة: Character ، Byte ، Short ، and Integer

switch(expression) {
    case n:
      code block
      break;
    case n:
      code block
      break;
    default:
      default code block
  }

مثال برمجي :

class TestClass
{
  public static void main (String[] args)
  {
    int inDay = 2;
    String day;
    switch (inDay) {
      case 1:  day = "الاثنين";
               break;
      case 2:  day = "الثلاثاء";
               break;
      case 3:  day = "الاربعاء";
               break;
      case 4:  day = "الخميس";
               break;
      case 5:  day = "الجمعة";
               break;
      case 6:  day = "السبت";
               break;
      case 7:  day = "الاحد";
               break;
      default: day = "مدخل فارغ";
               break;
    }
    System.out.println("اليوم هو: " + day);
  }
}

 كما  نرى ان المدخل عبارة  عن ايام  الاسبوع وتقوم باختيار  الاجابة الاقرب او التي تعتبرها الافضل سيكون المخرج هو يوم الثلاثاء كما تم اختياره

switch case in string 

هنا مثال اخر  عن الدالة  واستخدمها على string  

class TestClass
{
  public static void main (String[] args)
  {
    String inGrade = "A";
    String message;
    switch (inGrade) {
      case "A+":
         message = "Excellent !!";
         break;
      case "A":
         message = "Very Good !!";
         break;
      case "B":
         message = "Good  !!";
         break;
      case "C":
         message = "Passed  !!";
         break;
      case "D":
         message = "Failed  !!";
         break;
      default: message = "Invalid entry";
         break;
    }
    System.out.println(message);
  }
}

قمنا  باختيار المتغير string واخترنا  ثم  حجزنا  متغير message  بدون قيمة  وقمنا  باعطاء البرنامج عدة خيارات  في  switch  لكي  يحدد  افضل اجابة  متواجدة في  البرنامج  مع العلم اننا حددناها  في  A   البرنامج تلقائيا يقوم بالبحث عن النتيجة المرجوة  ويضهرها داخل متغير  message 

5 - التوقف والاستمرار في الحالة break statements

الجافا ليست بها  go to  او  تخطي او الرجوع مثل  اللغات البرمجية الاخرى الاانه من المستحسن  تخطي بعض  البرمجيات  في الكود  وافضل طريقة  هي  break  مثال 



حتى يكون الامر واضح  شرح 

class TestClass
{
  public static void main (String[] args)
  {
    int cnt = 1;
    while (cnt < = 5)
    {
      if (cnt==3)
      break;
      System.out.println("The value of cnt is : " + cnt);
      cnt = cnt + 1;
    }
      System.out.println("The value of cnt is : " + cnt);
  }
}

المرخج سيكون كالتالي :  

The value of cnt is : 1
The value of cnt is : 2
The value of cnt is : 3


ان عملية العد  تصل الى  العدد  5 لكننا اوقفنها واخترنا  التوقف عند 3  احيانا يكون البرنامج  يصل الى  نتيجة في وقت او حالا ت محددة  وقد يستغرق وقت اكبر لاعطاء  النتيجة  رغم انه قد حصل عليها  في الحالة رقم 3  فلما سنحتاجه ليقارن  حتى الحالة 5  ،  عني  انا  افضل  ان يستمر  حتى الحالة 5  لكي اتاكد  من تمام العمل  فالخيار  في المستقبل ان شاء الله  متاح  لك  اخي  الكريم 

Continue 

في حالة  الاستمرار  بعد التوقف يتيح  لك البنامح  تجاوز  حالات  محدد من البرنامج ربما  انت  لا تريد  المستخدم الوصول لها  او الحصول عليها او  تريد هذه النتيجة  التي تعرف قيمتها  الحوسبية الا تكون داخل  الحلقة المفرغة  

مثال برمجي  يوضح  بشكل اكبر :  

class TestClass
{
  public static void main (String[] args)
  {
    int cnt = 0;
    while (cnt < 5){
      cnt = cnt + 1;
      if (cnt==3)
      continue;
      System.out.println("The value of cnt is : " + cnt);
    }
  }
}

النتيجة  :  

The value of cnt is : 1
The value of cnt is : 2
The value of cnt is : 4
The value of cnt is : 5

كما تلاحظ اخي  المتدرب  انه قام  بتجاوز  مرحلة  من الحلقة  او مرحلة  من البرنامح  وهي  المرحلة الثالثة  بهذه الطريقة  تستطيع ان تخفي او تظهر ما تريده للمستخدم  مثال قمت ببرمجته في احد التطبيقات الخاصة بسطح المكتب ، ما قمت ببنائه هو شاشة استقبال مع  progress bar  تقوم هذه الاخيرة بالعد  من 1  الى 100% ,وخلال ذلك  العد  يقوم البرنامج  بتهيئة  الملفات الضرورية  والتاكد من وجود الملفات  والتحديثات  وغيرها  من الاعمال  التي تم حفظهاخلال العمل  بالبرنامج  الprogressbar  التي بنيتها قمت ببنائها بخاصية  break  و Continue  

واقوم باضهار رسائل مخصصة  في حالة تواجد  عذر ما  او اقوم بتجاوز بعض الحالات الاستثنائية  كعدم حفظ البينات التي عمل عليها وفي حالة  تواجدها  يتم  الاستعانة بها  ستجد هذا  المشروع  على  موقع github  وهو مبرمج بلغة برمجية اخرى وضعت مثال عن البرنامج  حتى  لا اشتت انتباهكم  ومساركم في تعلم الجافا 

6- الاستثناء  في  الجافا exeption

في  الحقيقة  برمجة باكثر من  لغة برمجية  وفي محاولتي  للاتصال  بقواعد بينات بعيدة او عمل عن بعد قد تكون له صلة  بالداتا عبر الويب او  محلي  localhost لا اجد  اي ide  يقوم  بتوقيف برنمجي وينصحني باستخدام exeption  لحماية  الداتا او حماية طريقة الترجمة من الانسان الى الالة واخبارها ان  هذه البينات  حساسة  وقابلة للتلف  بل اني اجزم اخي  الكريم  انك ستسخدمها  اثناء  التعديل والاضافة  والحدف   والاتصال  بالبينات  


هذه الصورة  قد تجعلك  تقفل ide  وتبتعد  عن البرمجة لانها مزعجة جدا للمبرمجين   وتعتب ثورة الغضب  واحساس بفشلك في ترجمة لغة البشر للالة  هناتنبع  حل  يسما  الاستثناء  وتقوم  باستثناء  المشكلة  لتكون اكثر تحديدا  



في اغلب لغات البرمجية ستجد نفس الهيكلة  التابعة للاستثناء  وهي كالتالي

try{
    //statements that may cause an exception
  }catch(ExceptionClass ex){}

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

class TestClass
{
  public static void main (String[] args)
  {
    int value=10/0;//an integer "sadik" throws exception
    System.out.println("next line...");
  }
}

المخرج سيكون كالتالي : 

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at TestClass.main(Main.java:5)

هيا لنظف للكود  استثناء 

class TestClass
{
  public static void main (String[] args)
  {
    try{
      int value=10/0;//an integer "sadik" throws exception
    }catch(ArithmeticException ea){
    System.out.println(ea);
    //you can handle exception in this block
      System.out.println("Exception Handle here !!");
    }
    System.out.println("next line...");
  }
}

المخرج 

java.lang.ArithmeticException: / by sadik
Exception Handle here !!
next line...

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

أمثلة  وبرامج  للجافا ستجدها  في  الرابط  التالي  حاول تقليدها وكتابتها  بتغيير  القيم  حتى  تتعود  على البرمجة  


https://www.facebook.com/notes/384952869591985










































Post a Comment

0 Comments