المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : تعلم أساسيات البرمجة بلغة روبي - بنى البيانات، بعض التكرار، وقليل من المنط



linnou
11-01-2013, بتوقيت غرينيتش 03:44 PM
http://www.dzbatna.com/images/icons/iconrote.gif طھط¹ظ„ظ… ط£ط³ط§ط³ظٹط§طھ ط§ظ„ط¨ط±ظ…ط¬ط© ط¨ظ„ط؛ط© ط±ظˆط¨ظٹ - ط¨ظ†ظ‰ ط§ظ„ط¨ظٹط§ظ†ط§طھطŒ ط¨ط¹ط¶ ط§ظ„طھظƒط±ط§ط±طŒ ظˆظ‚ظ„ظٹظ„ ظ…ظ† ط§ظ„ظ…ظ†ط· (http://www.dzbatna.com/t1606233/)



ملاحظة: في هذا الدرس مفصل، سأستخدم النمط المبسّط من irb باستخدام الأمر التالي:
كود code
$ irb --simple-prompt

أولا: المزيد من أنواع وبنى البيانات
لنلقِ نظرة على بعض أنواع وبنى البيانات الموجودة في لغة روبي.
المصفوفات (Arrays)
باستخدام المصفوفات، يمكن تجميع عدة متغيرات (أو كائنات) في سلسلة تحت اسم واحد، ثم القيام بعدد من المهام كفرز عناصر المصفوفة أو تغيير قيم بعضها مثلا. هناك عدة طرق لإنشاء مصفوفة جديدة في روبي. دعونا نجرب طريقتين في irb:
كود code
>> greek_alphabet = Array.new
=> []
>> greek_alphabet = []
=> []

بإمكاننا التأكد من أن المصفوفة خالية باستخدام طريقة empty?:
كود code
>> greek_alphabet.empty?
=> true

المصفوفة الخالية تبدو مملة بعض الشيء. لننشئ مصفوفة جديدة، لكن دعونا نحدد عدد عناصرها بالإضافة إلى العنصر الافتراضي منذ البداية:
كود code
>> greek_alphabet = Array.new(4, '!')
=> ["!", "!", "!", "!"]

ماذا إذا أردنا أن تحتوي المصفوفة عناصر مختلفة؟
كود code
>> greek_alphabet = ['alpha', 'beta', 'gamma', 'delta']
=> ["alpha", "beta", "gamma", "delta"]

إذا، لدينا مصفوفة تحوي عدة عناصر. مالذي يمكننا فعله بها؟ هناك الكثير من الطرق الخاصة بمصفوفات روبي، لكننا سنتطرق لبعض منها. يمكننا معرفة حجم مصفوفة ما (عدد عناصرها) باستخدام أحد الطريقتين size وlength:
كود code
>> greek_alphabet.size
=> 4
>> greek_alphabet.length
=> 4

كما في العديد من لغات البرمجة الأخرى، يبدأ فهرس (index) أي مصفوفة من الرقم 0، بمعنى أنه إذا أردنا استرجاع العنصر الأول، فنستخدم الفهرس 0، وإذا أردنا استرجاع العنصر الثاني، فنستخدم الفهرس 1 وهكذا. لنجرب هذا في irb:
كود code
>> greek_alphabet[0]
=> "alpha"
>> greek_alphabet[2]
=> "gamma"
يمكننا القيام بالعكس، أي معرفة فهرس عنصر معين باستخدام طريقة index:
>> greek_alphabet.index('delta')
=> 3

تتمتع المصفوفات في روبي بمرونة عالية، فمن الممكن مثلا وضع كائنات من أنواع مختلفة في مصفوفة واحدة، استخدام فهرس ذو قيمة سالبة لاسترجاع عنصر ما من نهاية المصفوفة، وإضافة عنصر جديد في مكان ما بعد نهاية المصفوفة. كل هذه العمليات غير ممكنة في لغات برمجة أخرى، خصوصا الساكنة منها. دعونا نجرب العمليات السابقة في irb:
كود code
>> mixed_array = ['delicious', 3.14, true]
=> ["delicious", 3.14, true]
>> mixed_array[-1]
=> true
>> mixed_array[-2]
=> 3.14
>> mixed_array[-3]
=> "delicious"
>> greek_alphabet[5] = "zeta"
=> "zeta"
>> greek_alphabet
=> ["alpha", "beta", "gamma", "delta", nil, "zeta"]

مالذي يمكننا فعله أيضا؟ حسنا، يمكننا فرز عناصر المصفوفة أو عكس ترتيبها:
كود code
>> primes = [7, 5, 11, 13, 3, 2]
=> [7, 5, 11, 13, 3, 2]
>> primes.sort
=> [2, 3, 5, 7, 11, 13]
>> primes.reverse
=> [2, 3, 13, 11, 5, 7]

ملاحظة: إذا قمنا بالتأكد من ترتيب عناصر المصفوفة بعد تنفيذ المثال أعلاه، سنجد أنه لم يتغير! السبب هو أن طريقتي sort وreverse لاتجريان أي تعديل على المصفوفة الأصلية، بل تعيدان مصفوفات جديدة بالترتيب المطلوب. من الممكن التعديل على المصفوفة الأصلية كما يلي:
كود code
>> primes.sort!
=> [2, 3, 5, 7, 11, 13]
>> primes
=> [2, 3, 5, 7, 11, 13]
>> primes.reverse!
=> [13, 11, 7, 5, 3, 2]
>> primes
=> [13, 11, 7, 5, 3, 2]

هذا العرف لا يقتصر على الطرق الخاصة بالمصفوفات فقط، بل هو مستخدم بكثرة في لغة روبي.
جداول التلبيد (Hashes)
[ملاحظة: اعتمدت على قاموس عرب آيز لتعريب مصطلح hash. هل يوجد تعريب آخر أفضل أو أوضح؟]
جداول التلبيد تشبه المصفوفات إلى حد بعيد. الفرق يكمن في أنه يمكن استخدام أي نوع من أنواع البيانات كفهرس لجدول التلبيد، وليس الأرقام فقط كما هي الحال في المصفوفات. يسمى الفهرس في جدول التلبيد بالمفتاح (key).
لنجرب المثال التالي في irb:
كود code
>> roman_numerals = { 'I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4 }
=> {"II"=>2, "IV"=>4, "III"=>3, "I"=>1}
>> roman_numerals['IV']
=> 4

هناك العديد من الطرق الخاصة بجداول التلبيد في روبي، لكننا لن نناقشها هنا.
الرموز (Symbols)
الرموز هي أحد أنواع البيانات الخاصة في لغة روبي، وهي مستخدمة بكثرة في إطار Ruby on Rails. كل ما نحتاج معرفته في الوقت الحالي هو أن الرمز يبدأ بنقطتين رأسيّتين (smile.gif، وأنه يمثل “ماسك مكان” أو معرّف. لنجرب مثالا عمليا على استخدام الرموز كمفاتيح في جداول التلبيد:
كود code
>> roman_numerals = { :I => 1, :II => 2, :III => 3, :IV => 4 }
=> {:I=>1, :II=>2, :III=>3, :IV=>4}
>> roman_numerals[:II]
=> 2

ثانياً: العوامل المنطقية
تدعم روبي العمليات المنطقية المعروفة والموجودة في معظم لغات البرمجة الأخرى. ناتج هذه العمليات هو إما true أو false (تذكروا: كل شيء في روبي هو عبارة عن كائن، حتى true وfalse!). لنجرب الأمثلة التالية في irb:
كود code
>> 1 < 2
=> true
>> 2 < = 3
=> true
>> 'ruby' == 'python'
=> false
>> (1 == 1) and (2 == 2)
=> true
>> (1 == 1) and (2 == 3)
=> false
>> (1 == 1) && (2 == 3)
=> false
>> (1 == 1) or (2 == 3)
=> true
>> (1 == 2) or (2 == 3)
=> false
>> (1 == 2) || (2 == 3)
=> false
>> not (1 == 2)
=> true
>> !(2 == 3)
=> true
>> not true
=> false

يمكن لمفسّر روبي أن ينتج قيمة منطقية من أي عبارة. لذلك، بإمكاننا مزج سلاسل نصية، أعداد، وحتى تواريخ في العبارات المنطقية. القاعدة بسيطة: false وnil ينتجان”خطأ”، وأي شيء آخر ينتج “صواب”. هذا يعني بأن العدد 0 ينتج “صواب”، مما قد يفاجئ المبرمجين بلغة C أو C++.
كود code
>> 'googol' == 10**100
=> false
>> 'ruby' and true
=> true
>> nil or false
=> false
>> 0 or nil
=> 0
>> 0 and nil
=> nil

ثالثاً: الجمل الشرطية
كأي لغة برمجة أخرى، تحتوي روبي جملا شرطية تمكّن المبرمج من تنفيذ عبارات معينة بناء على تحقق شرط (أو عدم تحققه). لنطّلع على بعض الأمثلة لعبارة if وelsif:
كود code
if number_of_open_tabs < = 5
puts 'Light load.'
elsif number_of_open_tabs <= 10
puts 'Medium load.'
elsif number_of_open_tabs <= 15
puts 'Heavy load.'
else
puts 'Take a bereak!'
end

يجدر ملاحظة أن الكلمة المفتاحية هي elsif - خمسة حروف - وليست elseif.
كود code
pi = 3.141; phi = 1.618
if phi < pi
puts 'Keep in mind that Phi is less than Pi.'
end

من الممكن استخدام الصيغة التالية إذا كانت الشفرة التي نريد تنفيذها مكونة من عبارة واحدة:
كود code
puts 'Keep in mind that Phi is less than Pi.' if phi < pi
هناك أيضا عبارة unless، التي يمكن النظر إليها على أنها عبارة if منفية:
unless phi >= pi
puts 'Keep in mind that Phi is less than Pi.'
end
puts 'Keep in mind that Phi is less than Pi.' unless phi >= pi

يفضّل عدم إساءة استخدام جملة joomla unless، خصوصاً في الجمل الشرطية المعقدة، لأنها قد تربك الشخص الذي سيقرأ الشفرة البرمجية (بل إنها قد تربك كاتب الشفرة نفسه!).
رابعا: حلقات التكرار
تحتوي لغة روبي أيضاً على عدد من حلقات التكرار. أحدها هي حلقة while التقليدية:
كود code
greek_alphabet = ['alpha', 'beta', 'gamma', 'delta']
i = 0
while i < greek_alphabet.length
puts greek_alphabet[i].capitalize
i += 1
end
# Prints the following:
# Alpha
# Beta
# Gamma
# Delta

هناك أيضاً حلقة until. وكما أن عبارة unless هي عبارة if منفية، فحلقة until هي حلقة while منفية:
كود code
i = 0
until i > 4
puts i
i += 1
end
# Prints the following:
# 0
# 1
# 2
# 3
# 4

أخيراً، لننظر إلى حلقة times، وهي طريقة موجودة لدى أي كائن من النوع Integer:
5.times { |i| print i, ' ' } # Prints the following: 0 1 2 3 4
فائدة مهمة: القطع الشيفرية (Blocks)
هل لاحظتم شيئاً مميزاً في المثال الأخير أعلاه؟ الشيفرة الموجودة بين القوسين هي مثال لأحد أبرز مزايا لغة روبي: القطع الشفرية أو blocks. قد تبدو القطعة الشيفرية كمجرد مجموعة من العبارات البرمجية، لكنها في الحقيقة أكثر من ذلك بكثير. غالباً، تستخدم القطعة الشفرية كأسلوب لجلب عناصر بنية بيانات ما والمرور عليها عنصراً عنصراً. مثلا، بإمكاننا جلب عناصر المصفوفة greek_alphabet ومعالجة كل عنصر على حدة باستخدام طريقة each كالتالي:
كود code



greek_alphabet = ['alpha', 'beta', 'gamma', 'delta']
greek_alphabet.each do |element|
puts element.capitalize
end
# Prints the following:
# Alpha
# Beta
# Gamma
# Delta

element هو الاسم الذي اخترناه للمتغيّر المحلي الذي يمثل العنصر الذي تتم معالجته حالياً. إذا وضعنا كل الشفرة السابقة في سطر واحد، يمكننا استخدام الأقواس بدلاً من do وend:
greek_alphabet.each { |element| puts element.capitalize }
تذكروا: هذا ليس هو الاستخدام الوحيد للقطع الشيفرية. سنعاود زيارة هذا الموضوع في درس مفصل قادم بإذن الله.





ألعاب الأندرويد مجانا و حصريا (http://www.apotox.info/forum)




https://fbcdn-sphotos-d-a.akamaihd.net/hphotos-ak-ash4/482113_236967293114455_1193518507_n.png (http://www.dzbatna.com)
©المشاركات المنشورة تعبر عن وجهة نظر صاحبها فقط، ولا تُعبّر بأي شكل من الأشكال عن وجهة نظر إدارة المنتدى (http://www.dzbatna.com)©

استعمل مربع البحث في الاسفل لمزيد من المواضيع


سريع للبحث عن مواضيع في المنتدى