RSS

Tag Archives: programming

Java Programming: Let's master (8/i)

Java Programming: Let's master (8/i)

Chapter 8 – Strings & Text I-O

8.1. Introduction

النهاردة معادنا في شابتر سهل أول وممتع ومهم،، هنتكلم فيه عن كل ما يخص الـ Strings والـCharacters  وهنغطي كمان جزء الـ Text I/O أو ما يسمى بقراءة وإدخال النصوص إن صحّت الترجمة، حيث لا أميل لترجمة المصطلحات دي بالعربية.. المهم

في البداية طبعا عاوزين نعرف يعني ايه string ؟؟

هو عبارة عن تسلسل من الحروف. في معظم لغات البرمجة بيعامل الـ string معاملة الarray of chars ولكن في الجافا بنعامل الـ string معاملة ال object . فيه عندنا تلات كلاسات بيتعاملوا مع الـ string وهما :

String, StringBuilder, and StringBuffer

لو التعامل هيبقي فقط لتخزين والتعامل مع الـ string في الحالة دي كلاس الـ String اختيار موفق ولكنه مش بيسمح بالتعديل علي الـ string . في حالة استخدامنا للكلاسين التانيين StringBuilder & StringBuffer نقدر نعمل strings ونقدر نعدلهم والتعامل هيبقي مرن .

8.2. The String Class

كلاس java.lang.String بيكون string من تسلسل مجموعة من الحروف. احنا اتعاملنا قبل كده مع المتغير اللي من نوع String زي مثلا ميثود println(String s) والـ compiler بياخد الـ string variable وبيقوم محوله لـ string object وبيتعامل معاه علي الأساس ده.

كلاس الـ String بيحتوي علي 11 constructor واكتر من اربعين ميثود بيعملوا وظائف متعددة زي مقارنة محتويات الـ strings والبحث عن string معين داخل string ووالتعامل مع الناتج الجديد وتحويل الحروف من حالة ال capital لحالة الـ small او من الـ uppercase للـ lowercase .

8.2.1. Constructing a String

طيب ازاي اعمل   String object؟

عندنا اربع طرق كلهم بيعملوا string جديد

1-    اول طريقة هتعامل مع الـ string علي انه object وبخلقه زي اي object :

2-    تاني طريقة اني اديله الـ stringLiteral علطول :

3-    تالت طريقة اني اعامل الـ string عادي كأنه متغير عادي (ودي الطريقة الشائعة):

4-    اخر طريقة اني اعرفه علي انه array زي كده

ملحوظة ::

فيه فرق بين String variable , String object , String value ولكن لأن الفروق بسيطة جدا فحاليا هنتعامل معاهم علي انهم واحد ونتجاهل الفروق دي مؤقتا وهنستخدم كلمة string بدل منهم.

8.2.2. Immutable Strings and Interned Strings

كلمة immutable string معناها انه لا يمكن تغييره او تعديله مثلا لو كتبنا الكود ده ياتري قيمة الString هتتغير؟؟

الإجابة هي لأ القيمة مش هتتغير. الجملة الأولي هتخلق String object وتحط فيه قيمة “java” وتدي الـ Reference بتاعه للمتغير s وفي الجملة التانية هييجي يحط القيمة الجديدة في نفس المتغير مش هينفع زي مااحنا شايفين:

لأن الـ String قيمته مش بتتغير الجافا بتوفر طريقة لتوفير استهلاك الـ memory  عن طريق استخدام ميثود اسمها intern() زي كده :

النتيجة هتبقي كده:

هنلاقي ان s, s2, s3 كلهم عبارة عن interned string فكلهم ساووا بعض لكن s1 لما قارناها بـ s طلعت مش بتساويها لأنهم اتنين objects مختلفين مع انهم بيحملوا نفس القيمة.

8.2.3. String Comparisons

احيانا بنحتاج نقارن قيمة اتنين string ببعض بإستخدام (==) :

ولكن الطريق دي بتشوف هل string1 و string2 بيشاوروا علي نفس الـ object ولا لأ. علشان نقارن بين القيم اللي بداخل string1 و string2 بنستخدم ميثود اسمها equals زي كده

ملحوظة::

مش معني ان اتنين strings بيحملوا نفس القيمة انهم يبقوا بيشوروا علي نفس الـ object ممكن يبقوا بيحملوا نفس القيمة ولكن كل واحد بيحمل reference لـ object مختلف عن التاني زي كده

في اول جملة هيبقي الناتج false لأنهم بيحملوا reference لأتنين object مختلفين ولكن في الجملة التانية هترجع true لأنهم بيحملوا فعلا نفس القيمة وهي “Welcome to Java” .

فيه برده ميثود اسمها compareTo ودي بتقارن بين اتنين string وبتبقي زي كده :

الميثود دي بترجع 0 لو s1 بيساوي s2 وبترجع قيمة اقل من 0 لو s1 اقل من s2 وبترجع قيمة اكبر من 0 لو s1 اكبر من s2  .

ونلاحظ برده ان نتيجة المقارنة بتعتمد علي ترتيب الحروف الأبجدي نفسه يعني بفرض ان عندنا s1 فيه “abc” وعندنا s2 فيه “abg” نتيجة المقارنة هتبقي -4 . هنيجي نقارن اول حرف من s1 واول حرف من s2 اللي هو “a” هيطلع متساويين فيه وبالمثل في التاني ولكن في الحرف التالت هنلاحظ  ان في ترتيب الحروف ال”c” بتقل عن ال”g” بـ 4 حروف فالنتيجة هتطلع -4 .

تنبيه:: يرجي عدم استخدام علامات المقارنة العادية (<,>,<=,>=) في حالة الـ String ولكن يتم استخدام ميثود compareTo فقط.

برده فيه ميثودس كتير ممكن نحتاجها زي equalsIgnoreCase بتقارن ولكن بتتجاهل حالة الحروف من حيث انهم uppercase او lowercase وميثود regionMatches بتقارن جزء فقط من الـ string وليس الstring كله وفيه برده ميثود str.startsWith(prefix) بتختبر هل الـ string ده بيبتدي بالقيمة الفلانية ولا لأ وميثود str.endsWith(suffix) بتختبر هل الـ string ده بينتهي بالقيمة الفلانية ولا لأ.

8.2.4. String Length and Retrieving Individual Characters

من الممكن معرفة طول الـ string عن طريق استخدام ميثود length() زي message.length() ودي بترجع طول الـ string .

ميثود تانية s.charAt(index) بترجع حرف معين من الـ String والـ index بيكون رقم بين الـ 0 وبين s.length() – 1 يعني message.charAt(0) هترجع “w” زي كده :

تنبيه :: لازم نراعي ان الـ index بيبقي اقصي قيمة ليه هي s.length()-1 وده لأن الـ index في حالة الـ string بيبدأ من 0 ومش من 1ولو كتبناها s.length() بس هيطلع StringIndexOutOfBoundsException  .

ملحوظة :: ميثود length موجودة اصلا في الـ array  وبنستخدمها هنا لنفس السبب ولكن هنا بنقول s.length()  وبترجع عدد الحروف في الـ string وفي حالة الـ array بنقول a.length وبترجع عدد العناصر في الـ array.

8.2.5. String Concatenation

ممكن نستخدم ميثود concat لدمج اتنين string زي كده:

وممكن برده الطريقة دي:

String myString = message + ” and ” + “HTML” ;

ونقدر نستخدم + لنفس الغرض لدمج اكتر من string مع بعض والأرقام كمان وفي حالة الأرقام بيتحول الرقم لـ string وبعد كده يندمج مع الـ string الأصلي ولازم نراعي ان في المعادلة دي لازم اي طرف يكون نوعه string وإلا الدمج مش هيتم.

8.2.6. Obtaining Substrings

احنا استخدمنا ميثود charAt() لإسترجاع حرف من string ولكن لو عاوزين نرجع اكتر من حرف بنستخدم ميثود substring وبيبقي ليها شكلين :

–         public String substring(int beginIndex, int endIndex

بترجع string جديد عبارة عن جزء مقتطع من الـ string الأصلي وبحددله بداية التقطيع beginIndex ونهايته endIndex زي المثال ده :

–         التقطيع والنهاية بتبقي لنهاية الـ string زي كده :


 

والنتيجة هتكون كده:    “Welcome to HTML”

8.2.7. String Conversions

صحيح ان بمجرد عمل الـ string مش بقدر اعدل في قيمته لكن اقدر اعمل string جديد بإستخدام toLowerCase, toUpperCase, trim, and replace كلهم بيرجعوا String جديد  :

–         toLowerCase, toUpperCase بيرجعوا String جديد بتتبدل فيه حروف الأصلي سواء من الupper لل lower او العكس.

–         trim بتشيل اي مساحات بين الحروف .

–         replace بتبدل اي حرف في كل مرة وجوده بحرف تاني

8.2.8. Finding a Character or a Substring in a String

ممكن نستخدم ميثودس زي indexOf  و  lastIndexOfللبحث عن حرف او مجموعة حروف بداخل اي string .فيه عندنا اربع صور لميثود indexOf() وميثود lastIndexOf():

بترجع الـ index بتاع الحرف ch لو ظهر مرة واحدة بس والindex بتاع اخر ظهور للحرف في حالة تكراره وبترجع -1 في حالة عدم وجود الحرف نهائي وبنستخدمها كده مثلا indexOf(‘a’) .

بترجع الـ index بتاع الحرف من اول الـ fromIndex

بترجع الـ index بتاع اول حرف في str في حالة وجوده مرة واحدة فقط واخر index لأول حرف في حالة تكرار الstr كله وبيرجع -1 في حالة عدم وجود Str
/p>

بترجع الـ index بتاع اول حرف في str من اول fromIndex .

امثلة :

8.2.9. Conversion Between Strings and Arrays

الـ string  مش array ولكن ممكن احوله لـ array والعكس صحيح. علشان احول من String لـ array بنستخدم ميثود toCharArray زي كده :

هيبقي عندنا chars[0]=”J” , chars[1]=”a”, chars[2]=”v”, chars[3]=”a”

لو عاوزين نحول من array لـ string هنستخدم الـ constructor ده String(char[]) :

أو

8.2.10. Converting Characters and Numeric Values to Strings

علشان نقدر نحول اي قيمة عددية لـ string بنستخدم الميثود المناسبة لنوع القيمة العددية يعني مثلا Double.parseDouble(str) بنستخدمها في حالة المتغير اللي من نوع Double وميثود Integer.parseInt(str) في حالة المتغير اللي من نوع int .

8.2.11. Example: Checking Palindromes

مثال عندنا ده برنامج بيختبر اي string هل هو palindrome ولا لأ؟

الـ string بيكون palindrome لو اتقري من اليمين زي الشمال زي مثلا “mom” او “dad” او “noon”

لو جينا نفكر في فكرة للبرنامج اول حاجة عمل متغيرين low و high عبارة عن index اول واخر حرف في الـ string ومبدئيا low قيمته 0 والـ high قيمته s.length()-1 وبيقارن الـ low مع الـ high لو هما نفس الحرف بيزود الـ low بواحد ويقلل الـ high بواحد ويقارنهم تاني وهكذا لحد اخر الString وبنطلع من اللووب لو الـlow بقي اكبر من الـ high او في حالة ان الحرفين مختلفين.

احنا لحد هنا نكون اتعرفنا على كلاس String و StringBuilder وعرفنا أهم عمليات المعالجة اللي ممكن تتم على String أو charArray

في النهاية عايز أوضح ان الجافا بتتعامل مع الString على انه أوبجكت وبتعتبره reference dataType ..

ومعادنا المرة الجاية ان شاء الله نتكلم عن كلاس Character والجزء الخاص بـ Text I/O..

It’s totally free to share

Thanks, CATReloaded

Thanks, CATaZine

Om4rezz

 
Leave a comment

Posted by on March 26, 2012 in Featured, Programming, Software

 

Tags: , , ,

Java Programming: Let's Master (7/ii)

Java Programming: Let's Master (7/ii)

Java Programming: Let’s Master 7/ii

احنا اتكلمنا المرة اللي فاتت عن مصطلحات كانت جديدة علينا زي كلاس وأوبجكت وكيفية اشتقاق اوبجكت من كلاس عن طريق الـ constructor ومقدمة عن لغة الـ UML وطريقة تمثيل الكلاسات بها.. وان شاء الله معادنا النهاردا نكمل في الـOOP  ونكمل شابتر 7.

7.6. Static Variables, Constants, and Methods

المتغير اللي عملناه قبل كده بأسم radius ده بنسميه Instance variable بمعني انه بيتبع object واحد فقط من الكلاس زي كده :


كلا من الـ radius بتاع circle1 والـ radius بتاع circle2 مفصولين عن بعض و اي تغيير بيحصل في اي واحد فيهم التاني مش بيتأثر بيه خالص والعكس صحيح.
لو عاوزين نخلي المتغيرات تتشارك في نفس الداتا بنعرفهم علي انهم static وده معناه ان كل المتغيرات بتشترك في مساحة عامة من الميموري واي تغيير بيحصل في اي واحد منهم بيأثر علي الباقي. وبالمثل زي ما فيه static variables فيه برده static methods ودي بقدر اناديها من غير مااعمل object من الكلاس. وده لأنها مش بتخص أوبجكت بعينه، لا، بتكون على مستوى الكلاس.
لو جينا نعدل علي كلاس الcircle  ونزود متغير static هنسميه numberOfObjects هنستخدمه في عد عدد المتغيرات اللي تم عملها في الكلاس. بمعني ان لما عملنا اول object كان numberOfObjects  بيساوي 1 وهكذا وهنعمل ميثود static وهنسميها getNumberOfObjects()  ودي رسمة ال UML للكلاس ونلاحظ ان المتغيرات والميثودس الstatic  تحتها خط :


علشان اعرف متغير او ميثود علي انهم static بكتب كلمة static قبل تعريف نوع المتغير او الميثود زي كده :


لأن المتغيرات الثابتة بتبقي متاحة لكل الobjects  في الكلاس فكان لازم انها تتعرف علي انها final static  ومثال عليهم المتغير PI في كلاس الMath :

وبكده هيبقي شكل كلاس الcircle كده :

 

وده الكلاس اللي هنختبر بيه القيم :

 

Visibility Modifiers

الجافا بتوفر modifiers كتير علشان التحكم في المتغيرات والداتا ومن اشهرهم ال public و ال private .
– Public : وده الوضع العام يعني زي مامعناه بيقول كده اي كلاس يقدر يشوف البيانات والمتغيرات والميثودس الخاصين بالكلاس ده.
– Private : وبرده زي مامعناه بيقول مفيش اي كلاس يقدر يشوف او يتعامل مع بيانات او متغيرات او ميثودس الكلاس ده. يعني المتغيرات أو الميثودس دي تخص الكلاس اللي هي مُعلنة فقط.
– لو لم يتم تحديد اي modifier إذا في الحالة دي بس اللي يقدر يشوف ويتعامل مع المتغيرات والبيانات والميثودس الخاصة بالكلاس ده هما الكلاسات اللي معاه في نفس الpackage فقط لا غير وبيبقي اسم الmodifier في الحالة دي إما default او protected.
وده مثال علي الكلام ده عملنا 3 كلاس c1,c2 and c3 :

هنلاحظ هنا ان c1 و c2 موجودين في نفس الpackage واللي اسمها p1 وc3 موجود في package تانية واللي اسمها p2 .
الvisibality modifiers  مهمتهم الأساسية هي تحديد صلاحيات الكلاسات المختلفة مع بعضهم البعض وده طبعا بيوفر حماية للبيانات. بالمختصر مفيش اي قيود من اي نوع داخل الكلاس الواحد بمعني ان الكلاس يقدر يتحكم في كل البيانات والمتغيرات والميثودس الموجوده فيه. زي كده :

7.8. Data Field Encapsulation

في بعض الأحيان بيكون من الأحسن ان قيمة المتغير تكون محمية قدر الإمكان وعلشان اوفر الحماية دي بعرف المتغيرات علي انها private وده مايسمي بال data field encapsulation وبكده امنع اي كلاس انه يغير في قيمة المتغيرات.


نلاحظ هنا اننا لما بنتعامل مع متغير private بنستخدم اتنين ميثود مهمين جدا وهما set() علشان احط فيه قيمة واسمها برده setter او mutator وبنستخدم ميثود get() علشان اخد قيمة المتغير واسمها برده getter او accssor.

*************************************************

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

إحنا قولنا إن احنا بنعمل متغير private ودا بغرض حماية المتغيرات من العبث، أو إن كلاس تاني يغير قيم المتغيرات دي،، بس أنا أكيد هحتاج المتغيرات دي وانا شغال في كلاسات تانية، وفي الواقع انا هنا عندي مشكلة لأني فعلا مش هقدر انادي على المتغيرات دي في كلاس تاني غير الكلاس اللي هي متعرفة فيه!!

المثال أو المشكلة:

انا دلوقتي في القاهرة، وعايز أوصل معلومة معينة لواحد في المنصورة، بس المشكلة إن انا مش عارف أشوف الواحد اللي في المنصورة دا، عشان هو private .. يعني مش بيخرج برا المنصورة..

الحل:

إني أدور على حد من المنصورة يكون public .. يعني بيخرج برا المنصورة، هيخرج من المنصورة وانا هشوفه في القاهرة وأعرف انادي عليه من هنا، وهبعت معاه المعلومة للشخص اللي في المنصورة اللي هو private .. طبعا هتقولي الحد التاني هيشوف الأول ازاي إذا كان الأول private؟؟ هقولك لا طبعا هيشوفه، لأنه الحد التاني دا من المنصورة برضه، بس public يعني بيخرج من المنصورة يتشاف برا، لكن هو من المنصورة أصلا وبيشوف كل الناس اللي في المنصورة حتى لو private..

تمام أوي كدا..

يلا بسرعة نرجع للبرمجة والجافا:

بالظبط المشكلة اللي انا حكيتها دي هي اللي عندنا في الجافا فيما يخص الـ encapsulation

انا عايز متغير private في كلاس تاني،، بس انا مش عارف انادي عليه من هنا، فهبعتله المعلومة مع ميثود public معاه في نفس الكلاس بتاعه، ولكن زي ما قولت، الميثود public ، فهقدر أشوفها من عندي وأبعت المعلومة معاها للمتغير الprivate..

يارب تكون المعلومة وصلت، ويكون المثال واضح..

الجزء دا مهم جدا يا جماعة،، اللي عنده فيه استفسار يبلغني

*************************************************

7.9. Immutable Objects and Classes

لما بنعمل object ومحتوياته مش بنقدر نغيرها بيبقي اسمه في الحالة دي immutable object والكلاس اللي هو موجود فيه بيبقي اسمه immutable class بمعني اننا لو شيلنا ميثود set() من الكلاس ده معناه اننا مش هنقدر ندخل اي قيم للobject .

Passing Objects to Methods

احنا كنا عرفنا ازاي نـpass  قيمة او متغير لميثود طيب هل ممكن ابعت او pass الobject  بنفس الطريقة؟؟؟ الإجابة ممكن طبعا وهعامله معاملة الarray  بالظبط لأنه ال object بيحمل reference  لمكان ال object ده في الميموري زي ماقولنا قبل كده. وده مثال :


7.12. The this Keyword

احيانا بيفضل اننا بدل ما نعمل كل شوية object ونحجز مساحة من الميموري وكده اننا نعمل object ولكن بيكون hidden بإستخدام كلمة this وبيعامل معاملة الobject العادي وبنستخدمها في ميثود ال set زي كده :

  1. Class Abstraction and Encapsulation

زي مااتعلمنا في شابتر الميثودس ازاي نفصل جسم الميثود عن باقي الكلاس نقدر نعمل كده برده بس علي مستوي ال كلاسات وبعضها وده بيبقي اسمه abstraction وفي الطريقة دي بنعرف بنوصف بس الكلاس بيعمل ايه والuser بيستخدم المتغيرات والميثودس اللازمة ووصف الكلاس مع شغل الuser عليه بيعملوا مايسمي بال class’s contract وده طبعا بيتيح للمستخدم انه يستخدم الكلاس من غير ما يعرف اتكتب ازاي بمعني ان المتغيرات والميثودس بتبقي مخفية وده مايسمي بال encapsulation .

وبكده نكون خلصنا شابتر 7، وأخدنا فكرة موسعة أكتر عن البرمجة بتقنية الـ OOP في الجافا.

وبحب دايما أقول ان اللي هيفهم OOP تمام،، هيكون متميز في مراحل الكورس الجاية زي الـ  GUI  وغيرها..

ودايما بقول إن الـ OOP طريقة تفكير أكتر من إنها تحصيل دراسي..

أي استفسارات انا موجود

It’s totally free to share

Thx, CATaZine

Thx, CATReloaded

Om4rezz

 
2 Comments

Posted by on March 14, 2012 in Featured, Programming, Software

 

Tags: , ,

Java programming: Let's master(6/i)

Java programming: Let's master(6/i)

فى الشابتر دة هنعرف ان شاء الله يعنى اية array و ازاي نتعامل معاها و اهميتها بالنسبة لنا اية فى شغل البرمجة،، ممكن حد يشوف ان الكلام عن الarray كده اتأخر،، بس طبعا دا مقصود،، كان لازم يجي بعد الmethods وال loops عشان معظم عمليات المعالجة اللي بتتم على الarrays بتتم بالloops والmethods..

6.2.ArrayBasics

بفرض اننا عاوزين نسجل 10 ارقام من النوع double و نستخدمهم فى الكود بتاعنا و كلهم لهم علاقة ببعض قبل كدة كنا هنفكر اننا نعرف 10 متغيرات من النوع double و نسجل فى كل متغير القيمة اللى عاوزين نسجلها و طبعا دة صعب طيب بفرض انهم مكانوش 10 متغيرات كانوا مثلا 100 او 1000 متغير اكيد الموضوع هيبقى اصعب بكتير. ال arrays وفرت علينا الموضوع دة يبقى نقدر نقول عن ال array انها مجموعة متغيرات من نفس النوع.

6.2.1.DeclaringArrayVariables

فى الجزء دة هنعرف ازاي نعرف ال array reference
علشان نستخدم ال array فى اي كود لازم الاول نعرف متغير بيكون reference لل array اللى هنستخدمها و نعرف نوع الداتا اللى المؤشر دة بيشاور عليها.
و طريقة تعريف ال array بالشكل دة

 


 

و الطريقة الاولى الكل بيستخدمها اكتر من التانية و دة مثال لطريقة كتابة الطريقتين:


 

6.2.2.CreatingArrays

فى الجزء اللى فات عرفنا ال array reference و نوع الداتا اللى هتتخزن فى ال array بس لحد دلوقتى محجزناش مكان فى الميمورى لها يعنى ال reference مش بيشاور على حاجة فى الميمورى و بكدة يبقى قيمتة null و نفهم من كدة ان ماقدرش احط فى ال array اي داتا فى الجزء دة بقى هنتعلم ازاي انشئ ال array (احجزلها مكان فى الميمورى)علشان اقدر استخدمها بعد كدة.
و طريقة حجز مكان فى الميمورى لل reference بالشكل دة

 

 

الجملة اللى فاتت بتعمل حاجتين
1.انشئنا ال array باستخدام new dataType[arraySize] و نلاحظ اننا بين الاقواس بنكتب المساحة اللى احنا عاوزينها يعنى لو عاوزين نسجل 10 ارقام فى ال array هيبقى ال arraySize = 10.
2.حددنا reference لل array كنا معرفينة قبل كدة
زي ما شوفنا قبل كدة علشان استخدم array كان لازم اعمل خطوتين الاولى انى اعرف ال reference و ال data type و التانية انى انشئ ال array نفسها احنا ممكن ندمج الخطوتين دول فى امر واحد بالشكل دة

 

و دة مثال يوضحلنا الطريقة دى

 

 

فى الامر اللى فات انشئنا array هيتسجل فيها بيانات من النوع double و قولنا انها مكونة من 10 عناصر و ان ال reference لها اسمة myList.
و الصورة دى توضح المثال اللى فات و متسجل فيها ال 10 قيم

ملحوظة: myList هو فى الحقيقة reference لـ array من النوع double مكونة من 10 عناصر بس احنا ممكن بدل ما نقول كل الكلام دة نقول ان myList هي array و نهمل الفرق بين ال reference و الـ array. ودا طبعا مجازاً بس..

6.2.3.ArraySizeandDefaultValues

اما بنحجز مكان فى الميمورى لل array لازم بنحدد مساحتها باننا نكتب عدد العناصر اللى ممكن نخزنها فيها و بعد ما بيتم انشائها مبينفعش نغير مساحتها و ممكن نعرف مساحة اي array باستخدام arrayRefVar.length فى المثال اللى فات myList.length تساوى 10.
اول ما بننشئ ال array قبل ما نحط فيها القيم اللى عاوزينها بيكون متسجل فيها قيم ابتدائية و هي لو ال array هيتخزن فيها اي نوع من الارقام يبقى 0 انما لو هيتسجل فيها حروف يبقى ‘u0000’ و لو كانت من النوع Boolean هيتسجل فيها false.

6.2.4.ArrayIndexedVariables

ممكن نتنقل بين عناصر ال array و نستخدم اي عنصر باستخدام ال index و هو بنظام 0-based و دة معناه ان العد بيبدأ من الصفر و نلاحظ ان ال index هو اللى بيتكتب بين الاقواس اللى بالشكل دة[] بعد اسم ال array بالفورم دى

نفهم من الكلام اللى فات ان لو ال array مساحتها arrayRefVar.length يبقى هتبدأ ب 0 و تنتهى بـ arrayRefVar.length-1 فى المثال اللى فات (فى الصورة) mylist فيها 10 عناصر من النوع double يبدئوا من 0 و ينتهوا عند العنصر رقم 9.
بعد ما بننشئ ال array ممكن نستخدم عناصرها باستخدام ال indexed variable زي ما كنا بنستخدم ال variable العادى و دة مثال على الكلام دة


 

و هنقول مثال تانى هنستخدم فية ال loop عشان نحط قيمة فى كل عنصر من عناصر ال array ال index الخاص بيها يعنى myList[0] هنحط فيها 0 و myList[1] هنحط فيها 1 و هكذا


 

6.2.5.ArrayInitializers

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


 

و دة مثال عليها

 

الجملة اللى فاتت بتكافئ مجموعة الجمل دى


 

 بس اكيد الطريقة المختصرة دى مش هتفيدنا لو عدد عناصر ال array كبير  .نلاحظ ان فى الطريقة اللى فاتت ماستخدمناش كلمة new و لازم نعرف ان لو استخدمنا الطريقة دى يبقى لازم نعرف ال array و ننشئها و نحطلها القيم كل دة فى جملة واحدة انما لو عملنا الحاجات دى على اكتر من جملة هيبقى syntax error و البرنامج مش هيشتغل زي الكود اللى هنقولة دة كود خطأ

 

6.2.6.ProcessingArrays

احنا لو عاوزين نعمل اي عمليات على عناصر ال array بنستخدم ال for loop و دة لسببين مهمين
*لان كل عناصر ال array من نفس النوع و اي فى اغلب الاحوال اي عملية بتتم عليهم بتكون بنفس الطريقة باستخدام التكرار
*لان حجم ال array بيكون معروف من الاول فطبيعى اننا نستخدم ال for loop.
و دة مثال يبينلنا ازاي نحط قيم عشوائية فى ال array

 

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


 

فى المثال اللى فات طبعنا ال array و كانت من النوع double و كان لازم نستخدم الloop  لكن لو عندنا array من النوع char ممكن اطبعها على طول باستخدام امر الطباعة بالطريقة دى :

 


 

هنقول مثال تانى نجمع كل عناصر ال array و نحط الناتج فى متغير من النوع double و اسمة total فى الاول حطينا لة قيمة ابتدائية 0 و مع تكرار اللوب هنبدأ نجمع العناصر لل array عنصر عنصر من ال index يساوى 0 لحد نهايتها (حجمها – 1 )

 

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

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

 

نلاحظ فى الكود اللى فات ان لو اكبر قيمة لعنصر اتكررت فى ال array المتغير indexOfMax هيتسجل فية ال index الاصغر ما بينهم يعنى بفرض ان myList[3] = 33.5 و myList[7]=33.5 و كانت 33.5 اكبر قيمة يبقى المتغير indexOfMax هيتسجل فية 3.

6.2.7.foreachLoops

فى ال JDK 1.5 ظهر شكل جديد من ال for loop معروف باسم foreach loop او enhanced for loop و دة ممكن اما نستخدمة نعمل العمليات على كل عناصر ال array من غير ما نستخدم ال index. و دة الشكل العام لها

و دة مثال يوضحلنا ازاي نطبع كل عناصر ال array باستخدام foreach

 


 

فى المثال اللى فات ممكن نقرى الكود بالشكل دة (لكل عنصر من عناصر myList اطبع العنصر دة) المتغير element لازم ياخد نفس ال data type زي ال array نفسها.

6.2.8.Example:TestingArrays

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

و هيكون دة شكل ال messages اللى اليوزر هيتعامل معاهم

6.2.9.Example:AssigningGrades

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

اعلى درجة – 10 تقدير A
اعلى درجة – 20 تقدير B
اعلى درجة – 30 تقدير C
اعلى درجة – 40 تقدير D
اقل من كدة تقدير F
بعد كدة هتظهر رسالة للمستخدم بأرقام الطلاب و درجة كل طالب و التقدير
و دة الكود

و دى شاشات التعامل مع اليوزر

6.3.CopyingArrays

بفرض اننا عاوزين ننسخ array ممكن نستخدم ( = ) بالطريقة دى
List2 = list1;
بس الطريقة دى فى الحقيقة مش بتنسخ ال array هي بتخلى ال reference اللى اسمة list2 يشاور على ال array فى الميمورى اللى بيشاور عليها ال reference اللى اسمة list1 و بكدة يبقى ال array اللى كان بيشاور عليها list2 مفيش reference بيشاور عليها و بقت مجرد مساحة مشغولة فى الميمورى مش بنستفيد منها و بيتم حزفها لوحدها من ال garbage collector فى ال Java Virtual Machine يبقى list1 و list2 بيشاوروا على array واحدة مش 2 array و طبعا كدة لو غيرنا حاجة فى list1 هنلاقي نفس الحاجة اتغيرت فى list2
و الصورة دى هتوضح الكلام اللى قولناه

ولاكن فى 3 طرق تانية ممكن بيها ننسخ ال arrays
•نعمل لووب و ننسخ عنصر عنصر من عناصر ال array.
•فى ميثود موجودة فى System class اسمها arraycopy بتمكنا اننا ننسخ ال array.
•ممكن نستخدم clone method لنسخ ال arrays بس لسة هنعرفها فى شابتر 9.
الكود دة هيبينلنا ازاي نستخدم اللوب لنسخ ال array

و دة شكل ال arraycopy method يبين ال arguments بتاعتها

sourceArray هنا بنكتب اسم ال array اللى عاوزين ننسخها
srcPos هنا بنكتب اول عنصر عاوزين نبدأ فى نسخة
targetArray وهنا بنكتب اسم ال array الجديدة
tarPos هنا بقى بنكتب اول عنصر هيبدأ فية التسجيل فى ال array الجديدة
length دة عدد العناصر اللى هننسخها
لو استخدمنا الطريقة دى فى نسخ ال arrays لازم ناخد بالنا ان ال array الجديدة لازم نعرفها و نحدد حجمها قبل استخدامها فى الميثود.

6.4.PassingArraystoMethods

زي ما كنا بنبعت variables من اي نوع لل methods بردو ممكن نبعت ال arrays لل method و دة مثال ل array بتطبع عناصر array من النوع integer.

و الامر اللى هنكتبة هننادى فية ال method اللى عملناها و نلاحظ ان ال array اللى بعتناها مالهاش reference لاننا مش هنستخدمها فى الكود مرة تانية.

 

اما بنبعت ال variables العادية لل method بنبعت القيمة بس و دة بيبقى اسمة Pass by value انما لو بعتنا array هنبعت ال reference نفسة بتاع ال array و دة بيبقى اسمة Pass by reference
المثال دة بيوضح الكلام اللى فات


 

فى المثال اللى فات دة عملنا ميثود اسمها m بتستقبل 2 arguments الاول integer و التانى reference ل array من النوع integer و المفروض انها بتغير قيمة المتغير الاول للقيمة 1001 و بتغير قيمة اول عنصر من عناصر ال array للقيمة 5555 و ملهاش return اما نعملها call فى ال main method هنلاقى ان بعد ما اتنفزت قيمة المتغير الاول ماتغيرتش انما قيمة العنصر الاول فى ال array اتغيرت و دة بسبب انها call-by-reference يعنى لو غيرنا حاجة فى ال array بداخل الميثود ال array الاصلية هتتغير.
ملحوظة: ممكن نبعت عنصر من عناصر ال array لميثود و هنتعامل معاه كأنة متغير عادى و مش كأنة عنصر فى array
و دة مثال هيوضحلنا فكرة الموضوع كلة هو فية 2 ميثود تبديل ارقام الاولى بتاخد متغيرين من النوع integer بتبدل قيمهم و الثانية بتاخد array من النوع integer بتبدل قيمة اوى عنصرين بردو ونشوف الكود

و هيكون دة شكل ال output

نلاحظ ان اما بعتنا اول عنصرين فى ال array كانهم متغيرات عادية للميثود قيمة العناصر اتغيرت فى الميثود بس انما فى بقية الكود قيمتهم ماتغيرتش و دة لان الميثود حجزت مكان فى الميمورى للمتغيرات الخاصة بيها يبقى اما هتغير قيمة اي حاجة هتتغير فى الميمورى الخاصة بالميثود انما الميمورى الاصلية مش هتتغير, انما اما بعتنا ال reference لل array و غيرنا قيمة اول عنصرين قيمة اول عنصرين اتغيرت فى الكود كلة لان بالطريقة دى الميثود بتغير فى الميمورى الاصلية بتاعة ال array.

6.5.ReturninganArrayfromaMethod

احنا اتكلمنا على ازاي نبعت array للـ methods دلوقتى هنتكلم ازاي نعمل return لــ array فى ال method
دة كود هيوضحلنا ازاي نعمل return ل array فى الكود دة عبارة عن method بتستقبل array و تقلبها و ترجع ال array مقلوبة

نلاحظ اننا عملنا return للـ reference بتاع ال array اللى عملناها جوا الميثود و علشان نستخدم الميثود دى لازم اننا نستقبل ال return دة فى reference لـ array من نفس النوع بالشكل دة

6.5.1.Example:CountingtheOccurrencesofEachLetter

دة مثال فى الاول بينشئ 100 حرف عشوائى و بعد كدة بيحسب و عليك :
•اول خطوة اننا هنكتب ال 100 حرف و نسجلهم فى array مكونة من 100 عنصر باستخدام الميثود getRandomLowerCaseLetter() اللى موجودة فى الكلاس RandomCharacter
•احسب عدد تكرار كل حرف و اسجلة بردو فى array مكونة من 26 عنصر(عدد حروف اللغة الانجليزية)
و الصورة دى هتبينيلنا ال arrays اللى هنستخدمها :

و دة الكود :

و دة شكل الناتج :

شرح طريقة عد الحروف: احنا بنمر على كل حرف من ال 100 حرف و بنطرح حرف ال a من كل حرف و ناتج الطرح اكيد هيرجعلنا ترتيب الحرف فى الحروف الابجدية بفرض الحرف كان c يبقى c – a = 2 و بكدة نزود counts[2] بواحد لانها هي اللى بتدل على تكرار الحرف c و بنعمل كدة لكل الحروف الطريقة دى وفرت علينا كتييييير اوى لان لو ماستخدمنهاش كان هيبقى البديل اننا نمر على كل حرف ونشوفة يساوى a ولا يساوى b ولا يساوى c…………… لنهاية الحروف

6.6. Variable-Length Argument Lists

فى JDK 1.5 ممكن نبعت ل method مجموعة arguments عددها مش محددينة بشرط انهم يكونوا من نفس النوع و بنعمل كدة باننا بنزود 3 نقط بعد نوع ال argumentss باستخدام الطريقة دى
typeName… parameterName
فى الحالة دى الـ arguments بيبقى اسمها Variable-Length Argument و ال جافا بتتعامل معاها كانها array فهي اما بتلاقى اننا استخدمنا الموضوع دة بتنشئ array و تحط فيها قيم المتغيرات اللى بعتناهلها مع اختلاف اننا ممكن نبعت للميثود مجموعة متغيرات عادية باي عدد او نبعتلها array
و دة مثال هيوضحلنا الموضوع :

إحنا لحد هنا اتكلمنا عن الarrays  بشكل تفصيلي واتكلمنا عن معظم عمليات المعالجة اللي بتتم عليها ودا كان الجزء الأول من الدرس السادس.. والمرة الجاية في الجزء التاني هيكون معادنا مع العمليات الأكثر تعقيدا في التعامل مع الarrays زي ترتيب array  أو البحث على عناصر داخل array ودي مجموعة algorithms مهمة جدا عشان تبقى محترف في التعامل مع الarrays وطبعا الalgorithms والتيكنيكات دي لا غنى عنها في سوق العمل أو القوالب التجارية للبرمجيات..

Thanks a lot CATReloaded

Thanks a lot CATaZine

Om4rezz

 
3 Comments

Posted by on February 13, 2012 in Featured, Programming, Software

 

Tags: , ,

Java Programming let's master(5)

Java Programming let's master(5)

Introduction To Java Programming

Chapter 5

الشابتر اللي فات اتكلمنا عن الجمل التكرارية loops في الجافا والنهاردة معادنا في الكلام عن الـ Methods.

احنا قبل كده قابلتنا ميثودس زي( System.out.println و JOptionPane.showMessageDiolg )

ودلوقتي جه وقت اننا نعرف معني الميثود.
* الميثود : هي مجموعة من الجمل اللي مع بعض بينفذوا وظيفة ما.

* الميثود دي بمعني تاني عبارة عن كلمة الجافا عارفاها بتنفذ وظيفة معينة.

* في ميثودس جاهزة في مكتبة الجافا زي( System.out.println ) وممكن احنا نعمل ميثودس بنفسنا.

مثلا ميثود زي( System.out.println ) في الحقيقة هي علشان تطبع جملة علي الشاشة بتنفذ مجموعة من الجمل وفي الشابتر ده هنتعلم نعمل الميثودس الخاصة بينا ونستخدمها في برامجنا.

5.2. Creating a Method

الشكل العام لأي ميثود في الجافا هو ده :

 

وجايبلنا مثال عملي هنشرح عليه مكونات اي ميثود والمثال عبارة عن ميثود بتحسب الرقم الأكبر بين رقمين وبترجعه :

في البداية الheader  بيعرف فيه ال modifiers , return value type , method name & parameters :  modifier  بيكون استخدامه اختياري وهو بيعرف الcompiler  ازاي ينادي الميثود واحنا هنستخدم ال static modifier  طول الشابتر ده .
:return value type : وده بيبقي نوع القيمة اللي هترجع من الميثود وفي بعض الأحيان مش بنحتاج ان الميثود ترجع حاجة في الحالة دي هيبقي ال return value type بيكون void زي ميثود الmain .
Parameters: ودول بيبقوا المتغيرات اللي بعرفهم في ال header بتاع الميثود ولما باجي انادي الميثود ببعت قيمتهم. اسم الميثود مع الparameters بيكون ما يعرف بـ Method Signature وموضوع الparameters بيبقي اختياري يعني ممكن احطهم او لأ علي حسب الغرض من الميثود.
في المثال اللي فوق ده هنلاقي عندنا في جسم الميثود الجمل اللي المفروض الميثود هتنفذها وهي عبارة عن جملة مقارنة بين الرقمين انهي واحد فيهم اكبر من التاني وفي الأخر جملة ال return وفيها القيمة المطلوب انها ترجع من الميثود واللي لما الميثود بتتنفذ بتنتهي بجملة ال return دي.
ملحوظة :: في بعض لغات البرمجة الأخري تسمي الميثودس بال functions & procedures والميثود اللي بترجع قيمة اسمها function واللي مش بترجع قيمة (void) اسمها procedure . لكن في الجافا الاتنين اسمهم ميثودس.
ملحوظة :: لما بنيجي نعرف ال parameters لأي ميثود مش بندمج النوع لأكتر من parameter يعني مثلا مينفعش اقول int num1,num2 ولكن لازم تكون int num1,int num2.

5.3. Calling a Method

في السكشن اللي فات اتعلمنا ازاي نعمل ميثود طيب ازاي اناديها او انفذها؟
لو الميثود بتاعتنا بترجع قيمة لما بنيجي نناديها بنرجع القيمة اللي جاية منها في متغير من نفس نوع return value type زي كده :

 

الأمر ده بينادي الميثود max وبيرجع الناتج في المتغير larger وممكن طريقة تانية برده :

 

ودي بتطبع الناتج من الميثود.
في حالة ان الميثود بتكون من نوع void يعني مش بترجع حاجة مش هستخدم متغير علشان ارجع الناتج فيه ولكن هناديها علطول زي كده :

 

ملحوظة :: لو مش مهتمين قوي بالناتج اللي راجع من الميثود اللي مش من نوع void ممكن نناديها زي اللي من نوع  void بس الناتج سيتم إهماله .

لما البرنامج بيجيي يتنفذ وبيجي علي جملة نداء الميثود بيروح لجسم الميثود ويبدأ في تنفيذ الجمل اللي فيها وبتنتهي الميثود إما بجملة ال return او لما توصل لقوس النهاية بتاعها.
مثال كامل فيه الميثود اللي عملناها فوق :

 

في البداية عملنا ميثود ال main بتاعتنا وهي زيها زي اي ميثود ولكن بتتنفذ عن طريق ال java virtual machine .
لو حللنا ميثود ال main هنلاقيها عادية زي اي ميثود ال modifiers بيكونوا public , static وال return value type بيكون void واسمها بيكون main وال parameters هو واحد من نوع String[] والنوع ده بيسمي array وهيتشرح الشابتر الجاي بإذن الله.
وللعلم ان اي ميثود بيتم ندائها او استدعائها داخل ميثود الmain.
لما بيوصل للسطر السادس ويلاقي جملة استدعاء الميثود اللي اسمها max بيوقف ويروح علي مكان مانا عارفتها في الكود ويبدأ ينفذ اللي في الجسم بتاعها فبيقوم حاطط القيمة اللي في المتغير i في المتغير num1 والقيمة اللي في المتغير j في المتغير num2 وبينفذ الجمل اللي في جسم الميثود max ولما بيوصل لجملة الreturn بيوصل لنهاية الميثود ويرجع الناتج في المتغير k زي الشكل ده :

ملحوظة :: جملة الreturn  لابد من وجودها في الميثود اللي مش من نوع void زي المثال ده هنلاقي ان الكود سليم ولكن هيطلع error بسبب ان في الحالة الأولي ممكن الميثود مترجعش اي حاجة ولحل المشكلة دي ممكن نحذف الشرط الأخير لأنه بالعقل طالما ال n مش اكبر من الصفر ولا بتساويه تبقي اكيد اصغر وبكده تبقي الميثود اكيد هترجع قيمة.

ملحوظة :: من اهم اسباب عمل الميثودس هي اعادة الأستخدام (reuse) يعني بمعني اني عملتها في الكلاس اللي اسمه TestMax وممكن اناديها في اي كلاس تاني بطريقة اني بكتب اسم الكلاس . اسم الميثود زي كده TestMax.max()

5.3.1. Call Stacks

في كل مرة بتتنفذ اي ميثود كل المتغيرات وال parameters بتتخزن في مكان في الميموري بيسمي stack وبيخزن العناصر او المتغيرات بسياسة last in – first out ولما ميثود بتنادي ميثود تانية الstack  بيجهز ليها مساحة هي كمان.

last in – first out دي سياسة في علم الQueuing Theory أو نظرية الطوابير ان صحت الترجمة، ودي سياسة معالجة معناها ان (القيمة الأخيرة تدخل – فالقيمة الأولى تخرج).

5.4. void Method Example

في السكشن ده هنعرف ازاي نعمل ميثود من نوع void وازاي نناديها اولا هنشوف مثال هنعمل فيه ميثود printGrade  بتحسب التقدير علي حسب المجموع :

ولإن الميثود printGrade من نوع void لما جينا نناديها استخدمنا جملة عادية statement وبتنتهي طبعا ب (;).
ملحوظة :: جملة ال return مش بتتحط في الميثودس اللي من نوع void ولكن ممكن احطها لو انا بس عاوز اخلص الميثود واطلع منها يعني ممكن استخدامها كنهاية للميثود..

5.5. Passing Parameters by Values

من اكتر نقاط القوة في اي ميثود هي قدرتها علي التعامل مع ال parameters وبنلاحظ ان لما بنيجي ننادي الميثود لازم نراعي اننا بنبعت المتغيرات بنفس الترتيب اللي بنيت بيه الميثود وحددت فيها الparameters  وده بيسمي parameter order association  علي سبيل المثال ميثود بتطبع رسالة معينة عدد معين من المرات :

 

لما نيجي نناديها بنقول nPrintln(“hello”,3) علشان نطبع كلمة hello تلات مرات واللي بيحصل انه بيبعت hello للمتغير message والرقم 3 للمتغير n ومينفعش ابدل بينهم لأنه هيبقي error
ملحوظة :: لازم نراعي توافق الأنواع عند ارسال المتغيرات لأي ميثود ونلاحظ ان مينفعش هنا نعمل casting يعني نغير النوع لازم من وجود توافق بين اللي ببعته للميثود وبين اللي انا معرفه في الميثود.
لما باجي ابعت قيم ده مايسمي pass by value ولكن لو حبيت ابعت متغيرات للميثود في الواقع انا ببعت قيمهم وبس للميثود لكن القيمة نفسها مش بتتغير زي المثال ده واللي بنعمل فيه ميثود بتبدل بين قيم المتغيرين اللي فيها ولكن قيم المتغيرات الأصلية لم تتغير او تتأثر بالتبديل :

 

قبل ماننفذ الميثود swap كانت قيمة num1 is 1 & num2 is 2 وبعد ماخلصنا الميثود وطلعنا قيمهم برده فضلت زي ماهي ولم تتأثر ولكن قيمهم اتبعتت ل n1 , n2 ودول اللي الميثود اتعاملت معاهم.
بما معناه قيم المتغيرات اللي ببعتها للميثود لا تتأثر بالعمليات داخل الميثود نفسها .

5.6. Overloading Methods

ميثود ال max اللي عملناها قبل كده بتطلعلي الأكبر من رقمين من نوع int . طيب افرض انه انا عاوز اختبر الأكبر بين رقمين من نوع double ؟ في الحالة دي هعمل ميثود تانية بتاخد في ال parameters متغيرين من نوع double زي كده :

لو حبيت انفذ الميثود اللي اسمها max وبتاخد متغيرين من نوع int هبعتلها متغيرين او قيمتين من نوع int ولو حبيت انفذ الميثود اللي بتاخد متغيرين من نوع double هبعتلها متغيرين او قيمتين من نوع double وده اللي بيسمي Method Overloading بما معناه انه فيه اتنين ميثودس بنفس الأسم ولكن بياخدوا parameters من انواع مختلفة في نفس الكلاس وال compiler بيعرف انت قاصد انهي نوع من الطريقة اللي بتنادي بيها الميثود .
في المثال ده هنعمل تلات ميثودس الاولي بتحسب الأكبر بين رقمين int والتانية بتحسب الأكبر بين رقمين double والتالتة بتحسب الأكبر بين تلات ارقام double :

 

ممكن واحد يسأل طيب انا ممكن انفذ الميثود بالمنظر ده  max(2, 2.5) ؟ ولو فعلا اتنفذت انهي ميثود هي اللي هتتنفذ ؟
الإجابة علي السؤال الأول هي نعم فعلا هتتنفذ والإجابة علي السؤال التاني هو الميثود اللي هتتنفذ هتبقي الميثود اللي بتاخد متغيرات من نوع double وده لأن الcompiler بيعتبر ان ال 2 قيمة double .
طيب حد هيقول طب ليه لما بنفذ max(2,3) مش بينفذ برده الميثود اللي بتاخد المتغيرات double؟
هقول ان الcompiler لما بيجي ينفذ بيختار اقرب ميثود مطابقة للمدخلات اللي انا كاتبها وفي حالة الmax(2,3) هتكون اقرب ميثود هي اللي بتاخد المتغيرات int .
ملحوظة :: عمل ال method overloading بيسهل الكود جدا لأنه بيخلي الميثود اللي بتقوم بوظائف متشابهة كلهم بنفس الأسم وده منطقي.
ملحوظة :: لعمل method overloading لابد من تغيير نوع ال parameters فقط وليس الأسم او ال modifiers او return value type .
ملحوظة :: في بعض الأحيان بيكون فيه غموض حتي علي ال compiler انه يعرف انهي ميثود هيتم تنفيذها وفي الحالة دي بيطلع compilation error :

 

5.8. The Scope of Variables

الscope  بتاع المتغير هو الجزء اللي في الكود واللي فيه بتعامل مع المتغير يعني بعمل عليه عملية او بغير قيمته . المتغير اللي بعرفه بداخل اي ميثود بيبقي اسمه local variable والتعامل معاه بيبقي من اول السطر اللي بيتعرف فيه لحد نهاية جسم الميثود اللي اتعرف فيها ولازم اعرفه قبل مااتعامل معاه .وجدير بالذكر ان ال parameters بتوع اي ميثود يعتبروا local variables .
مثال المتغير اللي متعرف وواخد قيمة ابتدائية في تعريف اول لووب له وضع معين والمتغير اللي متعرف بداخل اللووب له وضع تاني في التعامل بيبدأ من سطر تعريفه لحد نهاية اللوب اللي هو متعرف فيها :

ممكن اني اكرر اسم الlocal variable  في اكتر من لووب او ميثود مثلا ولكن مينفعش اكرر اسم local variable بداخل نفس اللوب او الميثود :

ملحوظة :: مينفعش اعرف متغير بداخل ميثود او لووب واتعامل معاه بره اللوب او الميثود لأن ده هيديني error زي كده :

 

وده هيطلع error لأن المتغير i مش متعرف بره اللوب .

5.9. The Math Class

كلاس ال Math بيحتوي علي الميثودس المطلوبة لعمل العمليات الرياضية الأساسية. احنا استخدمنا منها مثلا Math.random() لحساب اعداد عشوائية و Math.pow() لحساب الأس بين رقمين فيه غيرهم ميثودس كتير . لو قسمناهم علي حسب عملهم هيبقوا:

5.9.1. Trigonometric Methods

او الدوال المثلثية ودي بتتعامل مع العمليات علي الزوايا زي كده:

كل ميثود بتاخد parameter واحد فقط وبترجع قيمة من نوع double والparameter بيمثل زاوية بالتقدير الدائري وللتحويل من التقدير الدائري للستيني بنضرب القيمة في PI/180 وفيه ميثود جاهزة بتحول من الدائري للستيني واسمها toRadians(double angdeg) والعكس toDegrees(double angrad) وبعض الأمثلة عليهم:

 

5.9.2. Exponent Methods

او الدوال الأسية ودي خاصة بعمليات الأس واللوغاريتمات بين عددين :

 

ملحوظة :: في ميثود sqrt نراعي ان X لازم تكون عدد موجب.
امثلة عليهم :

 

5.9.3. The Rounding Methods

او الدوال التقريبية وهما :

بيتم تقريب الرقم لأقرب رقم عشري ليه

public static double ceil(double x)

 بيتم تقريب الرقم لأقرب رقم عشري ولكن الأقل وليس الأعلي 

public static double floor(double x)

 بيتم تقريب الرقم لأقرب رقم عشري ليه ولو كان قريب من رقمين بيكون الناتج الرقم الزوجي . 

public static double rint(double x)
public static int round(float x) /** Return (int)Math.floor(x + 0.5). */
public static long round(double x)  /** Return (long)Math.floor(x + 0.5). */

ودول امثلة عليهم :

 

 

5.9.4. The min, max, and abs Methods

كمان فيه تلاتة ميثودس موجودين في كلاس Math واحدة بترجع الأكبر بين
رقمين وواحدة بترجع الأصغر وواحدة بترجع الabsolute value او القسمة المطلقة لرقم معين وامثلة عليهم :

 

5.9.5. The random Method

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

والصيغة العامة ليها :

ملحوظة :: مش لازم كل الكلاسات تبقي فيها main method كلاسات زي Math , JOptionPane مفيهومش ميثود main وده لأنهم معمولين علشان كلاسات تانية تستخدم الميثودس اللي فيهم .

5.11. Method Abstraction and Stepwise Refinement

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

 

طبعا اول سؤال اكيد اي حد هيسأله لنفسه هعمل البرنامج ده ازاي؟؟؟
ممكن نبدأ بالكود علطول من اول خطوة لحد اصغر خطوة . بس اعتقد ده حل صعب قوي واحتمال الخطا فيه كبير جدا .
حل تاني اني اقسم الكود إلي خطوات واهتم بكل خطوة علي حدي لحد مااخلص المشكلة كلها وده اللي هنعمله هنا :
الحل مقسوم لجزئين : الأول ازاي اخد الدخل من المستخدم والتاني ازاي اطبع التقويم وطبعا الخطوة دي اكيد هتتقسم برده لخطوات اصغر ولو فكرنا نعمل رسم تحليلي للخطوات هيبقي كده :

طيب جميل جدا اول خطوة اللي هي ازاي اقري الدخل من المستخدم سهلة هنعملها بالطريقة المعروفة بإستخدام()JOptionPane.showInputDialog .
المشكلة التانية اللي هي طباعة التقويم نقسمها لخطوتين تانيين الأولي طباعة عنوان الشهر والتانية طباعة التقويم نفسه .
في صورة الناتج لو لاحظنا شكل الخرج هنلاقي انه عبارة عن اسم الشهر والسنة وبعدين خط فاصل ويعدين أيام الأسبوع في الشهر المطلوب يعني لازم نيجيب الأول اسم الشهر وده بنيجبه من الميثود ()getMonthName .
علشان اقدر اطبع التقويم للشهر لازم اعرف اول يوم في الشهر ()getStartDay والشهر فيه كام يوم ()getNumberOfDaysInMonth  مثلا شهر ديسمبر سنة 2005 فيه 31 يوم اول يوم فيه كان يوم الخميس .

طيب جميل جدا اول خطوة اللي هي ازاي اقري الدخل من المستخدم سهلة هنعملها بالطريقة المعروفة بإستخدام()JOptionPane.showInputDialog .
المشكلة التانية اللي هي طباعة التقويم نقسمها لخطوتين تانيين الأولي طباعة عنوان الشهر والتانية طباعة التقويم نفسه .
في صورة الناتج لو لاحظنا شكل الخرج هنلاقي انه عبارة عن اسم الشهر والسنة وبعدين خط فاصل ويعدين أيام الأسبوع في الشهر المطلوب يعني لازم نيجيب الأول اسم الشهر وده بنيجبه من الميثود()getMonthName .
علشان اقدر اطبع التقويم للشهر لازم اعرف اول يوم في الشهر ()getStartDay والشهر فيه كام يوم()getNumberOfDaysInMonth  مثلا شهر ديسمبر سنة 2005 فيه 31 يوم اول يوم فيه كان يوم الخميس .

طيب ازاي اعرف اول يوم في الشهر كان ايه؟
فيه اكتر من طريقة اسهلهم اني استخدم كلاسات Calendar & Gregorian Calendar . طريقة تانية افرض اننا نعرف ان اول يوم في شهر يناير سنة 1800 كان يوم الأربعاء (startDay1800() = 3) وممكن احسب عدد الأيام من اول يوم في شهر يناير سنة 1800 لحد الشهر المطلوب (totalNumberOf Days) واول يوم في الشهر المطلوب هيبقي (totalNumberOfDays + startDay1800) % 7 وقسمنا علي 7 لأن الأسبوع فيه سبع ايام. وبكده ()getStartDay هيطلع منها ()getTotalNumberOfDays .
لما بنيجي نحسب عدد الأيام المفروض اعرف السنة كبيسة ولا لأ ()isLeapYear ولازم اعرف كل شهر فيه كام يوم ()getNumberOfDaysInMonth

وبكده ابقي حليت المشكلة وده هيبقي الشكل الكامل للحل :

ملحوظة مهمة جدا:: انا شرحت البرنامج دا بالذات عشان بجد فيه فكرة راقية جدا في الجافا وتطبيق أكثر من رائع على تكنيك الencapsulation  واللي هيفهم البرنامج دا يبقى حط رجله على الطريق بشكل كبير وهيرتاح جدا في الأوبجكت أورينتد OOP  بعد كده، واللي مش هيفهم البرنامج دا، انا معاه في أي استفسارات لحد ما نفهمه سوا.. وأتنمى بجد أقدر افيده..الكود جاي في السكشن الجاي 5.11.2

5.11.2. Top-Down or Bottom-Up Implementation

دلوقتي احنا فكرنا ازاي نفكر في الكود نيجي بقي للكود نفسه وانا بكتب الكود بعتبر ان اي مشكلة فرعية تلقائيا بتتحول لميثود في الكود ممكن طبعا تكون اسهل من انها تتعمل في ميثود لوحدها إذن يبقي علي حسب الكود هنتعامل وطبعا المعيار الوحيد في الأختيار ان الكود يكون اسهل في فهمه .
ممكن نطبق في الكود طريقة من اتنين إما Top-Down وفي الطريقة دي بنكتب الكود من اول ميثود لأخر ميثود ولكن من فوق لتحت علي اساس الرسمة التوضيحية للبرنامج اللي فوق والطريقة التانية Bottom-Up ودي العكس بتبدأ من تحت لفوق .
شكل البرنامج في النهاية هيبقي كده :

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

5.12. (Optional) Packages

الكلاسات المتاشبهة او المرتبطة مع بعضها بتتحط في مايسمي ال package او الحزمة وفيه اربع اسباب لأستخدام الpackages :
1- علشان اعرف احدد مكان كلاس معين علي اساس اني مجمع كل الكلاسات المتشابهة في package واحدة .
2- علشان ميحصلش لغبطة في اسامي الكلاسات يعني ممكن يبقي فيه كلاسين بنفس الأسم فعلشان ميحصلش لغبطة بحط كل واحد في package .
3- لما بجمع الكلاسات المتشابهة في package واحدة بيبقي اسهل اني اوزعهم او اتعامل معاهم.
4- كمان الpackage بتوفر حماية للكلاسات اللي فيها من حيث مين يقدر يقراهم او يقراهم ويعدل فيهم وهكذا .

5.12.1. Package-Naming Conventions

اسم الpackage  بيبقي اسم فريد علشان مايتكررش وتحصل مشاكل وممكن اعمل package بداخل package وبنادي الكلاس اللي فيها زي كلاس Math بناديه كده java.lang.Math يعني كلاس Math موجود في الpackage اللي اسمها lang واللي موجودة في الpackage اللي اسمها java .

5.12.3. Putting Classes into Packages

ازاي احط اي كلاس في الpackage ؟
بنعرف في اول سطر في البرنامج اسم الpackage اللي الكلاس ده انا عاوز احطه فيها :

5.12.4. Using Classes from Packages

طيب ازاي استخدم اي كلاس موجود في package ؟
بنعمل جملة import في بداية الكود للpackage المطلوبة واللي بتحتوي علي الكلاس اللي انا عاوزه زي كده :

 

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

 

Thanks a lot CATReloaded

Thanks CATazine

Om4rezz

 
Leave a comment

Posted by on February 7, 2012 in Featured, Programming, Software

 

Tags: , ,

Python: Part(7)

Python: Part(7)

في المرة اللي فاتت اتكلمنا عن ال(Conditional Statements ) وعرفنا ازاي نكتب الكود بتاعها وازاي نتعامل معاها .المرادي ان شاء الله هنتكلم عن ال(loop) بما اننا مادينهاش اهمية كبيرة المرة اللي فاتت او ما اتكملناش عنها تقريبا. ومقالة النهارده هحاول انها تبقى صغيرة عشان مندخلش في مواضيع تانية دلوقتي وهنكتفي بشرح ال(loops) النهارده .

قبل ما نتلكم عن ال(loops) تعالوا نعرف ليه احنا محتاجينها ؟

طبعا في البرمجة ممكن تحتاج انك تكرر جملة معينة اكتر من مرة . او تكرر سؤال معين اكتر من مرة او تعمل اي حاجة اكتر من مرة وبدل ما تكتب الكود بعدد المرات اللي عاوزه يتكرر ، هتكتبها مرة واحدة في (loop) وهي تتنفذ بعدد المرات اللي انت عاوزها .

في البايثون في نوعين من ال(loops)

1- while loop

2- for loop

لحد هنا كلام حلو وجميل .تعالوا بقى نشوف ازاي هنتعامل مع ال(loops) وايه الفرق بين كل نوع منهم .

 

اللي جاي دا مثال بيطبع الارقام من (1-100) بس هنعملها مرتين .. المرة الاولى هنكتب الجمل بايدينا والمرة التانية هنستخدم ال(loop) في البايثون وهنعرف ازاي نتعامل معاه .

المثال الاول :

طبعا الكود مكتوب باختصار بس المفروض انه مكتوب 100 مرة .ودا هيبقى ال(output) بتاع الكود اللي فات:

طيب بما اننا اتعلمنا البايثون عشان نكتب كود سهل ومنظم وصغير، الطبيعي اننا مش هنعمل الطريقة اللي فاتت دي في الشغل ، فأكيد هنستخدم ال(loop)

تعالوا بقى ناخد اول نوع من انواع ال(loops) :

While Loop :

بكل بساطة هنكتب الشرط وبعد كدا هنكتب اللي عاوزينه يتنفذ . وطول ما الشرط متحقق ، الكود هيفضل يتنفذ ويتكرر . تعالوا ننفذ المثال اللي فات بس المرادي باستخدام ال(while loop)

وطبعا هيكون نفس الناتج . هيطبعلنا الارقام من (1-100) وكل رقم في سطر .

ودا مثال تاني ل(while loop) :

هنا عملنا (loop) بياخد اسم من اليوزر ويطبعه – بطريقة ال (String Substitution) ودي اتعلمناها قبل كدا- وتفضل تكرر ال(loop) طول ما ال(name —> null) . يعني لو فضلت تضغط على (Enter) الكود هيفضل يتكرر طول ما انت لسة مدخلتش قيمة للمتغير .ولما تدخل قمية للمتغير بتاعك هيتنفذ ويطلع من ال(loop).

ناخد مثال تالت عشان الفكرة تثبت 🙂

البرنامج دا مكتوب في ال( ipython ) ودا بردو اتكلمنا عنه قبل كدا في الجزء الاول من سلسلة البايثون

 

 

هنا عملنا كاونتر ، وطول ما الكاونتر اقل من 10 البرنامج هيطبع (حاصل جمع القيمة اللي متخزنة في الكاونتر +الرقم اللي بيزيد معايا كل مرة) وهيطبع كل ناتج في سطر بردو .

 

كدا احنا بقينا بنعرف نعمل (loop) ونخلي الكود يتنفذ كذا مرة طيب ايه لازمة النوع التاني بقى من ال(loops) ؟

ال(while loop) بتنفذ بلوك معين من الكود بعدد معين من المرات طول ما شرط التكرار متحقق ، بس احيانا المبرمج بيحتاج انه يكرر الكود بتاعه بشكل معين أو بترتيب معين المبرمج هو اللي بيحدده ، عشان كدا ال(for loop) اتعملت .

FOR LOOP

مثال :

هنا احنا ادينا للبرنامج (list) وسمينها (x) وخليناه يتعامل معاها بال(for loop) وقولناله اطبع العناصر اللي جوا ال(list).

ودا هيكون ال(output) :

ممكن ناخد مثال تاني على ال(for loop) وهو بيتعامل مع ال(Dictionary) :

نفس الحكاية هنا ، عملنا (dictionary) وخلينا ال(for loop) تشتغل عليها بحيث انها تطبعلنا ال (key) وال(value).

ناخد المثال التالت والأخير على ال(for loop) :

وفي المثال دا احنا ادينا للبرنامج (list) فيها كذا اسم وقولتله يطبعهم في بستخدام ال(for loop)

 

كدا احنا خلصنا ال(loops) ياريت تكتبو الاكواد دي وغيروا فيها ولخبطوا الدنيا زي ما انتو عاوزين وشوفوا ايه اللي بيحصل والدنيا ماشية ازاي عشان المعلومة تثبت اكتر واكتر 🙂

المرة الجاية ان شاء الله هنتكلم عن حاجة جديدة اسمها ال(Abstraction) وهنعرف هي ايه!! وبتتكلم عن ايه باذن الله . تابعونا ،،،

 
2 Comments

Posted by on January 31, 2012 in Featured, Programming, Software

 

Tags: , , , , ,