الخوارزميات، مدخلك إلى عالم البرمجة
مدرج تحت قسم: دروس
كثيراً مانسمع في عالم البرمجة كلمة خوارزميات أو خوارزمية، ولكن ليس الكثير من يعرف معناها. كثيرٌ من المبرمجين لا يعلمون ماهي الخوارزميات نظرياً ولكن فعلياً يستخدمونها دون أن يعلموا (وأنا واحد منهم)! ، كيف ذلك؟
الخوارزمية تعريفاً هي سلسلة من الخطوات المنطقية المتتالية التي تُكتب بشكل منطقي لكي نحل مشكلة معنية، لذلك.. فإن كثيراً من المبرمجين لا يعلمون أن تحليل المشكلة أو التفكير بكيفية برمجة شيء هو خوارزمية بحد ذاته.
بعدما عرفنا ماهي الخوارزمية أحب أن اقول ان هذا المقال موجه للجميع سواءً من تعلم لغات البرمجة أو من لم يتعلم ويرغب في ذلك لأنها تُتيح لك امكانية تحليل الأخطاء بشكل منطقي ! وانا استخدم كلمة خطأ أو مشكلة ولكن لا أعني بها مشكلة أو خطأ بحد ذاته بل أقصد به القضية المطروحة أمامنا.
خصائص الخوارزمية
1- تحديد النهاية
ويعني أن الخوارزمية يجب ان تكون منتهية بعد عدد مُعين من الخطوات لا أن تمتد إلا اللانهاية ! بالعربي الفصيح ان يعرف المبرمج إلى أين يُريد الذهاب.
2- عدم الغموض
أن تكون الخوارزمية واضحة وتحدد من خلالها ما الذي تريده يعني لو قرأ أي شخص الكود الذي تكتبه بكل بساطة يستطيع فهم ماهو مكتوب.
3- الفعالية
وبكل بساطة يُقصد التالي : “أيها المُبرمج حاول ان تصل لمُبتغاك بأقصر الطُرق “، يعني السطر أو الكود الذي لا عمل لها احذفه فوراً لكي يتم تنفيذ برنامجك بسرعة و مرونة وهما من شروط البرنامج الناجح . خواص سهلة ومفهومة أعتقد ذلك والآن سنبدأ بإذن الله بتحليل أول قضية أمامنا.
القضية الأولى
نُريد أن نكتب خوارزمية تُعطينا المتوسط الحسابي لمجموعة من الأرقام:
set total to zero.
set count to zero.
Get num.
while num not equal zerozero do
{
add num to total.
increment count.
}
if num is zerozero {
set average to total divided by count
output average
}
الآن سنشرح هذه الخوارزمية :
في السطرين الأول والثاني قلنا له أننا نُعطي المتغير Total & countقيمة الصفر لأنهما عبارة عن صندوقان و سيتم جمع قيم لهما، وفي السطر الثالث قلنا له أن يجلب لنا قيمة الرقم من خلال Get num. والآن في كل لغات البرمجة كلمة While تعني حلقة تكرار والآن نحن سنعمل له حلقة تكرار لماذا؟ بما أننا سندخل له أكثر من رقم فيجب علينا ان نعمل حلقة تكرار يتوقف البرنامج عن قبول الأرقام عندما يتحقق الشرط ! لم تفهم شي وانا كذلك سأشرح لك.
While num not equal zerozero do
قلنا له طالما الرقم (يعني الرقم الذي نقوم بإدخاله ) لا يساوي صفر صفر (00), قم بمجموعة من العمليات وهي موجودة ضمن القوسين..
{
}
والآن نأتي لشرح الموجود داخل القوسين أي داخل شرط التكرار:
قلنا له في أول سطر Add num to total، أول شي لو تذكرون عرفنا المتغير توتال يساوي الصفر وقلت لكم أنه عبارة عن صندوق يجمع له قيم صحيح ؟ والآن بدأنا بجمع الأرقام التي يتم ادخالها.
قلنا له Increment count، بمعنى ان اعمل زيادة للعداد كاونت الذي عرفناه أول خطوة بقيمة صفر.
والآن انتهت الحلقة ! أي رقم ستدخله له سيقوم بجمعه للعداد الأول ومن ثم زيادة واحد لعدد الأرقام لأن فكرة المتوسط الحسابي تقوم على فكرة جمع الأرقام وتقسيمهم على عددهم، فمثلاً لدنيا الأرقام 1,3,5,6,7,8 سيقوم بجمعهم والناتج سيكون : 30 أي قيمة total ستكون 30.
وقيمة العداد الثاني وهو كاونت ستكون 6
هل فهمت ذلك؟
الآن بعدما عرفنا للبرنامج كيف يعمل اضفنا شرط صغير بعدما انتهت حلقة التكرار، قلنا له:
If (num is zerozero)
{
set average to total divided by count.
Output average
}
الشرط بكل بساطة هو انه عندما يتم ادخال القيمة صفرصفر للبرنامج فأنه سيقوم بتقسيم مجموع الأرقام على عددهم وقام باسنادهم للمتغير average ومن ثم طلبنا طباعة المتغير average، وفي كل لغة برمجة الشرط
If
{
}
يأتي بالصيغة هذه !!
ربما تجدونها صعبة قليلاً أو غامضة و لكن مع الوقت كل شيء سيتضح بإذن الله و كنصيحة شخصية حاول أن تتعلم لغة برمجة في نفس الوقت الذي تبدأ بتعلم الخوارزميات بعضكم سيخالفني ولكن هدفي من هذه الخطوة أن تفهم البرمجة بشكل عام وبهذه الحالة أي لغة برمجة ستجدها سهلة، ولكن افهم جيداً ان هدف الخوارزميات هو فهم طريقة البرمجة وليست طريقة الكتابة بالحرف لأنه ربما تتغير من لغة إلى لغة ثانية.
تمرين صغير
اكتب خوارزمية تقوم بجمع رقمين ومن ثم طباعة الناتج، وكمفتاح للحل الخوارزمية لا تحتاج إلى حلقة تكرار لأننا سنعتبر أن البرنامج يأخذ رقمين فقط!
بانتظار حلولكم.
هذا كل شيء يُتبع بإذن الله و بانتظار أجوبتكم.


@ محمد :
موجود شرحها فوق , ما الذي لم تفهمه لكي أوضحه لك ؟
تحياتي
فراس
انا جدا استفدت منها وشكرا
مشكور جدا ً على الشرح …
موفقين ..
مشكووووووووووووووووووووووور
اذا ممكن تساعدني: انا عندي مسابقة بالنسبة للخوارزميات بس ما بعرف اي فكرة عن اي اشي بدي اعملو…. ارجو منكم اذا في عندكم اي فكرة عن برامج مش معمولة من قبل اوانها بسيطة وبدها تطوير احكولي عنها …….بترجاكم ….وشكرا
أختي رؤى :
هناك برامج كثيرة , مثلاً خوارزمية آلة البيع التي يٌباع فيها مثلاً مشروبات غازيّة وماء وشوكولا و غير ذلك , أو مثلاً صرّاف آلي ATM .
لم افهم شيء ارجوا الشرح بصوره ابسط من هيك اتحملوني انا اسف بس لازم افهم ضروري جدا لانو عندي امتحان ومش فاهم اشيء يستر عرضكوا وشكرا
@محمد الضروس :
أخي محمد ,هدء من روعك, متى هو موعد إمتحانك؟
موعد الامتحان بتاريخ 15\12\2009
مشأن الله ساعدوني
@ محمد الضروس :
ولا يهمك أنا معاك , ولكن هل من الممكن ان تكتب لي ما الذي لم تفهمه لكي أشرحه لك ؟
يعني دعنا نناقش كل شيء حتى أفهم أنا و تفهم انت .
شكرا على الرد , الذي لم افهمه هو كيف نكتب الخوارزميه لهذا البرنامج
@ محمد الضروس:
جميل أخي الكريم , في البداية هناك كلمات محجوزة في لغتنا لكي نكتب فيها و نعبّر فيها عن الخوارزمية جيد؟ و الكلمات هي set,get,if,while,output وأي كلمة في اللغة الإنكليزية, ما الهدف من الخوارزمية أساساً؟ هو التعبير عن فكرة برمجية , جميل؟ طيب لو أردنا كتابة خوارزمية برنامج يأخذ رقمين و يجمعهم , كيف ستكون ؟
Get num1
Get num2
Output num1+num2
هذه هي بكل بساطة ! طيب لو أردنا كتابة خوارزمية برنامج يقوم بضرب رقمين بشرط أن لا يكون أحد الرقمين 0 ! لكي لايكون ناتج الضرب 0 , جميل ؟
الخوارزمية :
Get num1
Get num2
if (num1 or num2 is zero)
{
output You cannot enter 0
}
else
{
output num1.num2
}
أتمنى أن تكون الصورة قد وضحت قليلاً , أخبرني بما تُريد و أنا جاهز.
عندي سوال لو سمحت , بدي برنامج ++c يقوم بعمل swap (تبديل)ل tree(شجره)
يعني يقوم بنقل جهة اليمين لليسار وبالعكس
@ محمد الضروس :
أخي الكريم أنا في الحقيقة موضوع الـ Swap بعرفه على المصفوفات فقط , هل من الممكن أن تكتب لي كود الشجرة لأكتب لك كود التبديل ؟
اخي فراس, مابنكتب الكود عالتعليق لانو بتحتاج مربعات وخطوط شجره يعني بدي اكتب الخوارزميه الها واذا مافي غلبه انت تكتب البرنامج اذا سمحت وانا اسف عالازعاج بس لانو ضروري ,الخوارزميه:1.push null to stack
2. bigin with root
3. currint with root
4.swap(left right
5.if currint . rightnull pushcurrint right to stack
6.if currint . left null [currint=currint . left
repiat 4
else
currint = pop stack
repiat 4
hi sho sar lesh anto hak
السلام عليكم ورحمة الله وبركاته
ألف شكر أخي فارس
بس عندي سؤال
هذه الخوارزمية … كيف تنقري؟؟
يعني في بأي امتداد أحفظ الملف وكيف أقرأة عالسيرفر أو أحطه في أية برنامج؟؟؟
وألف شكر عالدرس الحلو
@ABDU_GO :
أخي الكريم ، الخوارزمية لا يوجد لها برنامج لقرائتها، هي عبارة عن لغة لكي يتفاهم فيها أعضاء الفريق البرمجي بغض النظر عن اللغة التي يتقنها كل واحد منهم، و لكن هناك برنامج Microsoft Visio الذي يستخدمه مهندسوا البرمجيات والذي يتعامل مع لغة UML .
تحياتي لك
اهااا يعني عشان البرنامج يكون مرتب ومنظقي….
طيب إذا ممكن:
بالنسبة للغات البرمجة.. يعني أنا بأبرمج بـ 6 لغات للنت بس نفسي أعرف كيف بيتعامل الجهاز مع الكود اللي بأكتبه…؟
يعني ايش الكود الخلفي اللي بيترجم الأكواد اللي بأكتبها…..
حاولت أدور عالنت بخصوص هذا الموضوع لقيت أنه بيعتمد على خوارزميات معينة … مثلا
دالة التشفير PASSWORD(); في MySQL
تعتمد على خوارزمية أحادية الاتجاه بحيث أنه لا يمكن إعادتها لشكلها الأولي مرة ثانية لكن أيضا تعطي نفس النتيجة لنفس الكلمة…
هذا مثال بس المغزى أني أنا قصدي فين الخوارزميات هذه بتكتب وكيف السيرفر بيترجمها…؟
ولو أنا أبغى مثلا أسوي خوارزمية إضافية فين بأكتبها وكيف السيرفر يترجمها…؟
مثلا المكتبة المشهورة cURL هذه واحد كتبها وبعدين الـ php اعتمدتها…
هذا قصدي…
وآسف إذا كنت طولت عليك ومليووووووون مليوووووون شكر ثاني أخي فراس :)
شو ما في إجابة… ض2