/Java Programming: Let's Master 6/ii

Java Programming: Let's Master 6/ii

اتكلمنا (المرة اللي فاتت) عن ال arrays وطريقة إعلانها في الجافا وبعض عمليات المعالجة عليها،، والنهاردا معادنا مع عمليات المعالجة الأكثر تعقيداً في التعامل مع الarrays زي طرق البحث داخل array وخوارزميات ترتيب الarrays..

6.7.SearchingArrays

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

6.7.1.TheLinearSearchApproach

الطريقة دى عادية جدا يعني عندنا قيمة عاوزين نعرف هي موجودة فى array ولا لا،، بنقارنها بكل عنصر من عناصر ال array لحد نهايتها و بكدة بنعرف هل العنصر موجود ولا لا.. و دة كود لميثود ال linear search بترجع رقم ال index اللى هتلاقى فية القيمة اللى عاوزينها و لو ملقيتش القيمة دى هترجع -1

و ممكن نجرب الميثود دى باستخدام الجمل دى و القيم دى و طبعا مننساش ال main method

هنا فى اسوء الظروف الكومبايلر هيضطر يقارن list.length مقارنة يعنى على عدد الارقام اللى بنبحث فيها

6.7.2.TheBinarySearchApproach

و دى الطريقة التانية الطريقة دى بتشترط ان لازم قيمة العناصر تكون مترتبة لانها بتستفاد من الترتيب دة فى تقليل عدد المقارنات فلو كانت العناصر مترتبة يبقى نستخدم الطريقة دى لانها افضل بكتير من الطريقة اللى فاتت و هنعرف السبب
فى الطريقة دى بنقارن القيمة اللى عاوزين نلاقيها بالعنصر اللى فى النص
•لو لقينا العدد اللى بندور علية اصغر من قيمة العنصر يبقى هنكمل بحث فى الجزء الاول
•لو كان بيساوى العنصر اللى فى النص يبقى البحث خلص
•انما لو لقينا العدد اللى بندور علية اكبر من قيمة العنصر يبقى هنكمل بحث فى الجزء الاخير
هنلاحظ اننا بفرض ان عدد العناصر كان n يبقى فى اسوء الحالات هنضطر نقارن log2n مرة يعنى لو كان عندنا 1024 عنصر هنقارن 10 مرات بس و هي دى قوة الطريقة دى
الصورة دى بتوضح مثال مجموعة ارقام و احنا بندور على رقم11

ال binary search هو ميثود بترجع ال index بتاع المكان اللى لقت فية الرقم يا اما لو الرقم مش موجود بترجع المكان اللى المفروض يتحط فية المكان بالطريقة مختلفة – (المكان اللى المفروض يتحط فية + 1) يعنى فى المثال اللى فات بفرض اننا بندور على 5 مش هنلاقيها يبقى المفروض الميثود ترجعلنا -3
و دة الكود للميثود

نلاحظ فى الكود اللى فات ان لو ال high<low معنى كدة ان الرقم مش موجود فبنطلع من الميثود
و ممكن نجرب الكود اللى فات باستخدام الجمل دى

ملحوظة: طريقة ال linear search كويسة فى حالة ان الارقام اللى هنبحث فيها مش كتير او لو كانت مش مرتبة انما فى حالة لو الارقام مرتبة يبقى ال binary search افضل.

6.8.SortingArrays

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

6.8.1.SelectionSort

دى طريقة من طريق الترتيب المعروفة, بفرض اننا عاوزين نرتب مجموعة ارقام ترتيب تصاعدى ال selection sort بيمر على كل الاعداد و بينقل اكبر رقم فى اخر المجموعة و بعد كدة بيمر على الاعداد اللى اتبقت مرة تانية و يشوف اكبر رقم فى الارقام اللى اتبقت و ينقلة قبل الاخير و يمر مرة تالتة و ينقل الرقم الاكبر فى اللى اتبقوا قبل قبل الاخير و يعمل كدة لحد ما الاعداد كلها تترتب.
و فى الصورة مثال يوضح فكرة ال selection sort
فى اول مرة مرينا على الاعداد كلها لقينا ان رقم 9 هو الاكبر عملنا تبديل ما بينه و بين الرقم الاخير بعد كدة مرينا على الاعداد كلها ما عدا الرقم الاخير لقينا ان 8 هو الاكبر نقلناه فى المكان قبل الاخير و هكذا لحد ما رتبنا كل الارقام

و دلوقتى هنشوف الكود اللى ينفز الكلام دة لترتيب array من النوع double

و ممكن نجرب الكود اللى فات بالجمل دى

6.8.2.InsertionSort

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

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

و دة الكود اللى بينفز ال insertion sort

و ممكن نستخدم الجمل دى علشان نجرب الكود

 

6.9.TheArraysClass

فى كلاس فى لغة الجافا اسمة java.util.Arrays فية methods كتير جاهزة مخصصة لل arrays لترتيبها او البحث فيها او للمقارنة او حاجات تانية كتير
و ممكن نشوف استخدام لميثود الترتيب و نستخدمها بالشكل دة

او نستخدمها بالشكل دة علشان نرتب مجموعة حروف

ملحوظة: فى methods كتير فى الكلاس دة معمولها overloading
و فى ميثود تانية بتنفز كود ال binary search زي ما شرحناه قبل كدة و لازم طبعا تكون ال array مرتبة تصاعدى و ممكن نستخدمها بالطريقة دى


 

و دى للبحث عن حرف من مجموعة حروف

و هيكون الناتج من الاكواد اللى فاتت


 

و ممكن نستخدم ميثود تانية اسمها equals علشان نعرف اذا كان 2 array بيساووا بعض ولا لا و ال arrays بتساوى بعض فى حالة ان محتوياتهم بتساوى بعضو هنقول مثال يوضح استخدامها

فى المثال دة list1 بتساوى list2 لان محتوياتهم زي بعض انما list1 مش بتساوى list3 لان محتوياتهم مختلفة
و فى ميثود تانية اسمها fill ممكن لو استخدمناها نملى array او جزء منها برقم معين و دة مثال يبين استخدامها

6.10.Two-DimensionalArrays

احنا فى الجزء اللى قبل كدة استخدمنا ال array العادية 1-D array لتمثيل صف من الارقام او الحروف او اي نوع فى الجزء دة هنشوف نوع تانى من ال arrays ميختلفش كتير عن القديم الفرق ان النوع الجديد array ثنائية الابعاد 2-dimensional array او ممكن نقول عنها انها array of arrays و هي ممكن تمثل ارقام فى شكل المصفوفة (مكونة من صفوف و اعمدة)

6.10.1.DeclaringVariablesofTwo-DimensionalArraysandCreatingTwo-DimensionalArrays

و دى الطريقة عشان نعرف للكومبايلر array ثنائية الابعاد

 

or

و زي ما قولنا قبل كدة ان استخدام الطريقة الاولى افضل لتعريف ال arrays
و دة مثال لتعريف 2-D array من النوع integer

و الخطوة التانية خجز مكان فى الميمورى للـ reference اللى عملناه بالطريقة دى

قبل كدة كان علشان اتعامل مع عناصر ال array كنت باستخدم رقم لل index علشان احدد العنصر اللى هاتعامل معاه انما فى ال 2-D array باستخدم رقمين رقم يرمز للصف و رقم يرمز للعامود و الرسمة دى هتوضح الكلام دة

علشان نحدد العنصر اللى فية القيمة 7 فى الشكل b استخدمنا رقم يرمز للصف و هو الـ 2 و رقم يرمز للعامود و هو الـ 1

و ممكن نستخدم طريقة نقدر بيها نعرف ال 2-D array و نحطلها قيم ابتدائية الكود اللى جي هو كود لانشاء ال 2-D array اللى فى الرسمة اللى فاتت (c)

الكود اللى فى الشكل a يكافئ الكود اللى فى الشكلb

6.10.2.ObtainingtheLengthsofTwo-DimensionalArrays

ال 2-D array هي فى الحقيقة array عادية ولاكن كل عنصر مكون من array تانية علشان كدة ممكن نقول على ال 2-D array انها array of arrays طول ال array هو عبارة عن عدد العناصر اللى موجودة فيها
و هنقول مثال عشان نوضح الكلام دة بفرض اننا عرفنا 2-D array بالشكل دة

من الجملة اللى فاتت ممكن نقول ان x[0], x[1], x[2] هما 1-D arrays عاديين خالص ولاكن x[0] مثلا هي نفسها 1-D array تانية مكونة من x[0][0], x[0][1], x[0][2], x[0][3] و بكدة يبقى
x.length = 3
x[0].length = x[1].length = x[2].length = 4
و الصورة دى توضح المثال دة اكتر

6.10.3.RaggedArrays

زي ما قولنا ان كل صف فى ال 2-D array هو نفسة 1-D array و اللى هنقولة جديدة فى الجزء ده ان ال 2-D array ممكن يبقى لكل صف فيها طول مختلف يعنى مش لكل الصفوف طول ثابت و فى الحالة دى يبقى اسمها ragged array و دة مثال على الجزء دة

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

و نضيف القيم بالطريقة دى

 

ملحوظة: ممكن نعرف عدد الصفوف لل 2-D array و عدد الاعمدة تتعرف فى جملة لوحدها و طريقة تعريف عدد الصفوف بس باستخدام new int[5][]

6.10.4.ProcessingTwo-DimensionalArrays

بفرض اننا عرفنا ال array دى

هنقول شوية امثلة على ال array دى توضحلنا ازاي ممكن نتعامل مع ال 2-D arrays
1.هنحط فيها قيم ابتدائية من 1 الى 99 باستخدام الكود دة

2.هنطبع عناصرها بالكود دة

3.جمع كل عناصر ال array و تسجيلها فى متغير اسمة total

4.جمع كل العناصر فى عامود محدد (العامود رقم 0 مثلا) بالكود دة

5.حساب مجموع كل صف و ايجاد اكبر مجموع مابينهم


6.10.5.Example:GradingaMultiple-ChoiceTest

تطبيق هام جدا:
زي ما اتعودنا لازم بنعمل تطبيق كل مقال،، دة مثال هنفهم منة حاجات كتير فى المثال دة عندنا 10 اسئلة (اختيارات متعددة) و 8 طلاب و عندنا 2-D array متسجل فيها اجابات الطلاب على الأسئلة و عندنا الاجابة الصحيحة للاسئلة المفروض ان الكود يقارن اجابة كل طالب بالاجابة الصحيحة و فى الاخر يقولنا كل طالب جاوب كام سؤال صح
الصورة دى تبين اجابات الطلاب

و الصورة دى تبين الاجابة الصحيحة

و دة الكود للبرنامج


 

و دة شكل الناتج من البرنامج

6.10.6.Example:ComputingTaxes

دة مثال تانى لحساب الضرائب باستخدام ال arrays فى 6 نسب لحساب الضرائب لكل نسبة شريحة معينة على حسب دخل الفرد بتتحسب نسبة الضرائب،، التطبيق دا كويس جدا وفي فكرة قوية أوي برجاء الإطلاع عليها من المرجع Introduction to Java Programming النقطة 6.10.6 لمعرفة تفاصيل الشرائح الضريبية قبل قراءة كود البرنامج.

6.11. Multidimensional Arrays

فى الجزء اللى فات اتكلمنا عن ال 2-dimensional array فى الجزء دة هنتكلم عن ال n-dimensional arrays التعامل معاها زي التعامل مع ال 2-D arrays مع فرق ان n=>3 و ده مثال لتعريف 3-D array

ال multidimensional array هي عبارة عن array عادية كل عنصر array تانية

6.11.1.Example:ComputingStudentScores

المثال دة هيوضحلنا ال multidimensional arrays فية درجات عدد من الطلاب فى 5 امتحانات كل امتحان مكون من جزئين هنسجل الدرجة فى ال arrays بحيث ان الرقم الاول بيدل عل الطالب و الرقم التانى بيدل على رقم الامتحان و الرقم التالت بيدل على الجزء الاول او الجزء التانى و البرنامج يحسب مجموع كل طالب فى كل الامتحانات.

و هيكون دة الناتج

و بكدة نكون خلصنا Chapter 6 Arrays وخلصنا كمان Part 1 من المرجع بتاعنا ، وبإذن الله بداية من المقال الجاي هنبدأ نتكلم عن ال Object Oriented Programming – OOP او البرمجة باستخدام الكائنات لو صحّت الترجمة ،حيث اني لا اميل الى ترجمة مصطلحات البرمجة الى العربية .

Thanks CAT Reloaded

Thanks a lot CATaZine

om4rezz