اذهب إلى المحتوى

لوحة المتصدرين

  1. Ali Ahmed55

    Ali Ahmed55

    الأعضاء


    • نقاط

      6

    • المساهمات

      1753


  2. Chihab Hedidi

    Chihab Hedidi

    الأعضاء


    • نقاط

      3

    • المساهمات

      2564


  3. Khaled Osama3

    Khaled Osama3

    الأعضاء


    • نقاط

      2

    • المساهمات

      1757


  4. Ali Hathm

    Ali Hathm

    الأعضاء


    • نقاط

      2

    • المساهمات

      70


المحتوى الأكثر حصولًا على سمعة جيدة

المحتوى الأعلى تقييمًا في 10/16/24 في كل الموقع

  1. السلام عليكم انا مش عاوز حل المساله انا عاوز بس افهم المساله كويس جدا ده المساله Given an integer x, return true if x is a palindrome , and false otherwise.
    2 نقاط
  2. سؤالي قد يبدو طويل شوية - كيف اتقدم لمشروع التخرج؟ - مشروع التخرج عبارة عن ماذا؟ - ماذا سيتم بعد اتمام الدورة؟ - ما هي باقة السيرة الذاتية على موقع بعيد؟ - هل بعد تاريخ التخرج ب6 اشهر اذا لم احصل على وظيفة بدوام كامل او مشروع على مواقع العمل الحر ساسترد ما دفعته للدورة؟ - واذا تم استرداد ما دفعته للدورة هل ساحصل عليه أموال ام بطاقة هدية لشراء دورة اخرى؟
    2 نقاط
  3. السلام عليكم هو ليه حجم عينة من البيانات لا يقل عن 30 ؟
    1 نقطة
  4. السلام عليكم، أنا شاهدت أول مسارين من علوم الحاسوب ولم يكن لدي شغف بها هل يمكنني أن استبدلها بدورة الذكاء الاصطناعي وشكرا
    1 نقطة
  5. وعليكم السلام ورحمة الله وبركاته. إن palindrome أو "تسلسل متناظر" هو التسلسل الذي يكون قرائته من اليمين مشابهة تمام كما في اليسار . فمثلا لو هناك سلسلة نصية مثل "madam" فهنا يمكن قرائتها من اليمين أو اليسار فهما نفس الشئ و أما بخصوص الأرقام فمثل 3223 فهذا الرقم متسلسل يمكن قراءته من اليسار كما من اليمين . وهنا المطلوب هو التحقق من الرقم الذي سيتم إدخاله فإذا كان تسلسل متنظار يجب إرجاع True وإلا فسيتم إرجاع false
    1 نقطة
  6. الـ palindrome هو رقم يكون نفس الشيء عند قراءته من الأمام ومن الخلف مثلا الرقم 121 هو palindrome لأنه إذا قرأته من الأمام أو من الخلف، سيبقى نفس الرقم. و المطلوب منك عند إدخال رقم صحيح x، يجب أن تعيد true إذا كان هذا الرقم palindrome، وإلا تعيد false.
    1 نقطة
  7. السلام عليكم ورحمة الله وبركاته ممكن اعرف ما هي افضل استضافه عربيه تكون في الدول العربيه الاسيويه للغه javascript بيئه node js و express استطيع رفع السيرفر والموقع عليها بدون اي مشاكل وتكون تقبل Horizontal scaling
    1 نقطة
  8. لا أنصحك بالبحث عن استضافة عربية، الاستضافات الأفضل من حيث التكلفة والأداء هي أجنبية، ويوجد سيرفرات في الدول الأسيوية والأوروبية بها، ولكن ليس الدول العربية. ما هي تفاصيل المشروع لديك، هل تريد استضافة مجانية أم لديك مشروع صغير؟ عامًة أقرب استضافة لما تريده هي AWS لأنها تمتلك مركز بيانات في البحرين.
    1 نقطة
  9. أغلب الإستضافات الآن تدعم إمكانية التوسع الأفقي، في حالتك يمكنك الإعتماد على خدمات استضافة AWS التابعة للشرق الأوسط حيث أن AWS لديها مراكز بيانات في البحرين، وهي تقدم أفضل الخيارات لدعم Node.js و Express. AWS توفر Elastic Load Balancing و Auto Scaling، مما يجعل التوسع الأفقي سهلا جدا، و صحيح رغم أنها ليست استضافة محلية بالكامل، إلا أن خوادم AWS في البحرين تعتبر خيار قوي و الذي يمكنك أن يساعدك أكثر.
    1 نقطة
  10. السلام عليكم هو اي الSample size calculator ؟
    1 نقطة
  11. وعليكم السلام ورحمة الله وبركاته، Sample Size Calculator: أداة تُستخدم لحساب حجم العينة المناسب لإجراء دراسة أو تجربة معينة بناءً على بعض المعايير الإحصائية. و الهدف الرئيسي من استخدام هذه الأداة هو تحديد العدد الأمثل من العناصر التي يجب جمع بياناتهم من أجل الوصول إلى نتائج دقيقة وموثوقة. و من العوامل المؤثرة على Sample Size Calculator: حجم المجتمع (Population Size): العدد الإجمالي للأفراد العناصر هامش الخطأ (Margin of Error): مدى التفاوت المسموح به في نتائج العينة مقارنة بالمجتمع. عادةً يتم التعبير عنه بالنسبة المئوية. كلما كان هامش الخطأ أصغر، زادت دقة النتائج. مستوى الثقة (Confidence Level): يشير إلى مدى الثقة في أن النتائج المستخلصة من العينة تمثل المجتمع بشكل دقيق. أكثر مستويات الثقة شيوعًا هي 90%، 95%، و99%. مستوى الثقة 95% يعني أنك تتوقع أن تكون نتائجك صحيحة في 95% من المرات. التباين المتوقع في المجتمع (Population Variability): يعبّر عن مدى اختلاف القيم داخل المجتمع. إذا كنت تتوقع تباينًا كبيرًا في المجتمع، ستحتاج إلى حجم عينة أكبر. نسبة النجاح (Proportion): في بعض الأحيان، يتم تقدير نسبة معينة لظاهرة معينة (مثل 50% من المجتمع يوافقون على موضوع معين). إذا لم يكن لديك تقدير مسبق، يُستخدم عادةً 50% كأساس لأنه ينتج عنه أكبر حجم عينة مطلوب. و يمكنك العثور على Sample Size Calculators هنا.
    1 نقطة
  12. السلام عليكم هو مش ممكن استخدم SQL نفسها في تنظيف البيانات ؟
    1 نقطة
  13. وعليكم السلام ورحمة الله وبركاته. نعم، يمكنك استخدام SQL لتنظيف البيانات. حيث SQL توفر مجموعة من الأدوات والعمليات والتي يمكنك من خلالها القيام بالعديد من العمليات لتنظيم وتنظيف البيانات وتصفية الأخطاء، مثل: تصفية البيانات: يمكنك استخدام جملة WHERE لتحديد السجلات غير المرغوب فيها أو التي تحتوي على قيم مفقودة أو أي قيمة أخرى لا تريدها. إزالة التكرارات: باستخدام جملة DISTINCT أو GROUP BY يمكنك عدم إرجاع السجلات المكررة. التعامل مع القيم المفقودة: يمكنك استخدام دوال مثل COALESCE أو IS NULL لتحديد القيم المفقودة أو تعيين قيمة افتراضية لها حتي لا تحدث مشاكل بسبب تلك القيم. تغيير نوع البيانات: باستخدام دوال مثل CAST أو CONVERT لتغيير نوع البيانات من نوع إلى أخر مثل تحويل السلاسل النصية إلى أرقام والعكس. إن لغة SQL فعالة في تنظيف البيانات و لكنها تختلف عن مكتبات بايثون مثل Pandas أو NumPy . القدرة على المعالجة: SQL مثالية لمعالجة البيانات في قواعد البيانات الكبيرة بينما مكتبات بايثون أكثر مرونة وتسمح بمعالجة البيانات في الذاكرة. الوظائف المتقدمة: مكتبات بايثون توفر مجموعة واسعة من الأدوات لتحليل البيانات وتنظيفها وطرق أكثر وأفضل مثل التعامل مع القيم المفقودة وتحويل البيانات، وتطبيق دوال معقدة بخلاف SQL. Python تسمح بكتابة سكريبتات تفاعلية وبتنفيذ عمليات متعددة ومعقدة بسرعة وسهولة. ولهذا إذا كانت بياناتك مخزنة في قاعدة بيانات كبيرة وتحتاج إلى تنظيف بسيط أو متوسط فإن SQL هي الخيار الأفضل لأنها مباشرة وسريعة وفعالة. أما إذا كنت تحتاج إلى تحليل البيانات المعقدة أو تنظيف البيانات غير الهيكلية بعد استخراجها فإن بايثون وكتبة Pandas هما الأنسب في معالجة البيانات وتحليلها.
    1 نقطة
  14. و عليكم السلام ذلك نتيجة لقاعدة تسمى Rule of 30 و هى من التطبيقات الشائعة فى الإحصاء. و ذلك لعدة اسباب منها: تحقيق دقة أكبر: عندما تكون العينة صغيرة، فإن النتائج تكون أكثر تأثرًا بالتحيز أو التقلبات العشوائية. حجم العينة الأكبر (30 فأكثر) يساعد على تقليل التباين وتحسين دقة التقديرات. تقليل الخطأ المعياري: لانه بزيادة حجم العينة، يقل الخطأ المعياري (Standard Error)، مما يعني أن متوسط العينة يكون أقرب إلى متوسط المجتمع الفعلي. و لذلك فإن 30 من الحدود الأمنه و المناسبة و لكن ليست قاعدة إجبارية الاستخدام. ففى بعض الاحيان يمكن استخدام حجم اكبر او اصغر على حسب طبيعة البيانات.
    1 نقطة
  15. السلام عليكم، هل عليّ أن أدرس الحصاء و التفاضيل و تكامل و الخ .... قبل أن اشتري كورس (تعلم الذكاء الاصطناعي)؟
    1 نقطة
  16. يمكنك إنشاء سيرة ذاتية عن طريق مستندات google و هذا بإستخدام القوالب الموجودة سابقا و تقوم بتغيير المعلومات على حسب بياناتك، حيث بعد تسجيل الدخول إلى حسابك في googleو الذهاب إلى موقع مستندات google اضغط على "القوالب" أو "Template Gallery" في الصفحة الرئيسية، ثم قم بالتمرير لأسفل حتى تجد قسم "السير الذاتية" أو "Resumes"، ثم اختر القالب المناسب لك. كما يمكنك البحث في google مباشرة عن google docs resumes template و ستجد العديد من الأمثلة التي يمكنك إستخدامها أيضا.
    1 نقطة
  17. الإصدار 1.0.0

    48236 تنزيل

    يضع هذا الكتاب المُوجز القارئ على أعتاب عالم تصميم تجربة المُستخدمين UX، وهو علم له قواعده وأصوله وأدواته، ويهدف إلى تعريف القارئ المُبتدئ بأساس هذا العلم وكيف يُطبّق على المُنتجات الرّقمية من مواقع ويب خدميّة وتطبيقات على الأجهزة الذّكية وصولًا إلى التّصميم الأمثل الّذي يُوفِّق بين هدف المُستخدم أوّلًا وهدف الخدمة التّجاريّ، الأمر الّذي يعني منتجًا ناجحًا. يبدأ الكتاب بشرح مفاهيم عامة عن تجربة المستخدم ليواصِل مع شرح كيفية إجراء مختلف الدراسات التي يحتاج المصمِّم للقيام بها، ومتطلباتها، ثم الأمور الواجب أخذها بالحسبان عند التصميم لضمان تجربة استخدام مريحة وممتازة، ليختتم في النهاية بالإشارة إلى أهمية الإحصائيات وضرورة الاعتماد عليها، حيث خُصّصت عدة أقسام لهذه النقطة، لتشير إلى مدى أهمية اعتماد بيانات وإحصائيات المستخدمين مثل أساس للتصميم، وكذا أبرز الإحصائيات الممكن التحصل عليها من خلال عدة اختبارات. يمكنك قراءة فصول هذا الكتاب مباشرةً على شكل مقالات، وإليك العناوين: مدخل إلى تجربة المستخدم User Experience فهم ودراسة المستخدمين في مجال تجربة المستخدم دراسة الشريحة المستهدفة في مجال تجربة المستخدم كيفية التصميم للأجهزة المختلفة هندسة المعلومات في تجربة المستخدم تعرف على أنماط التصميم في مجال تجربة المستخدم أشياء لا يمكن اعتبارها رسوما تخطيطية (Wireframes) في مجال تجربة المستخدم تعرف على الرسوم التخطيطية (Wireframes) في مجال تجربة المستخدم مفهوم الثقل المرئي (Visual Weight) والألوان في مجال تجربة المستخدم التكرار ومخالفة الأنماط في مجال تجربة المستخدم المحاذاة والقرب في مجال تجربة المستخدم تعرف على أساليب مسح الواجهة والتراتب المرئي في مجال تجربة المستخدم أساليب الإطلاع في مجال تجربة المستخدم: التصفح، البحث والاكتشاف تصميم هيكل صفحة الويب والعناصر الأساسية في مجال تجربة المستخدم الأزرار، النماذج والدعوات إلى الإجراء في مجال تجربة المستخدم استخدام علم النفس في مجال تجربة المستخدم لتكييف المستخدم وإقناعه كيف تغير الخبرة من تجربة المستخدم؟ تصميم تجربة المستخدم من خلال بيانات وإحصائيات المستخدمين تعرف على أنواع المخططات الإحصائية في مجال تجربة المستخدم اختبارات أ/ب (A/B Test) في مجال تجربة المستخدم
    1 نقطة
  18. يُعد إنترنت الأشياء Internet of things صورة مصغرة عن المستقبل الذي سنعيشه خلال السنوات القادمة لما يحمله من حالات استخدام تدخل في جميع تفاصيل حياتنا اليومية. في هذا الفيديو سنشرح لكم ماهو إنترنت الأشياء Internet of things وكيف يعمل ومجالات استخدامه، وكيف يمكنك أن تبدأ العمل في هذ المجال. يمكنك تعلم المزيد حول انترنت الأشياء وتعلم الآلة عبر متابعة المقالات المجانية المتوفرة على أكاديمية حسوب في قسم البرمجة، كما يمكنك الانضمام إلى دورة علوم الحاسوب لتعلم أساسيات علوم الحاسوب والانطلاق في البرمجة باحترافية
    1 نقطة
  19. رأينا في التدريب الأخير من المقال السابق كيف طبعنا جزءًا من جدول ضرب العدد 12، لكن ذلك تطلب منا كثيرًا من الكتابة، وسيستغرق توسيعه وقتًا طويلًا، ولحسن الحظ توجد طريقة أسهل سترينا بداية المزايا القوية التي توفرها لنا لغات البرمجة في تنفيذ المهام وإنجازها. حلقات for تتيح لغة البرمجة تكرار تنفيذ أمر أو عدة أوامر لعدد محدَّد من المرات، في ما يسمى حلقة تكرار، حيث يمكن استعمال متغير تزيد قيمته مع كل دورة للحلقة، وستبدو هذه العملية في بايثون كما يلي: >>> for n in range(1,13): ... print( "%d x 12 = %d" % (n, n*12) ) ... 1 x 12 = 12 2 x 12 = 24 3 x 12 = 36 4 x 12 = 48 5 x 12 = 60 6 x 12 = 72 7 x 12 = 84 8 x 12 = 96 9 x 12 = 108 10 x 12 = 120 11 x 12 = 132 12 x 12 = 144 لندرس الشيفرة السابقة ونستخرج بعض الملاحظات منها: انتهى سطر for بنقطتين رأسيتين (:)، وهذا أمر مهم، إذ يخبر بايثون أن ما سيكتَب بعد هاتين النقطتين هو ما سيُكرَّر. كتبنا مجال الأعداد الذي نريده في دالة range()‎ بالشكل range(1,13)‎، رغم أننا نريد تكرار عملية الضرب إلى العدد 12 فقط، لأن دالة range()‎ تولد الأعداد من العدد الأول فيها إلى العدد الذي يسبق العدد الثاني، 13 في مثالنا، وهذا له أسبابه قطعًا وستعتاده مع الوقت، لكن تجدر الإشارة إلى أن هذه الدالة تستطيع توليد مجموعات معقدة من الأعداد، لكننا اخترنا هذا المثال البسيط لأنه يحقق الغرض. العامل for في بايثون هو عامل foreach في الواقع، إذ يطبق تسلسل الشيفرة التالي على كل عنصر في التجميعة، والتي هي في حالتنا قائمة الأعداد التي تولدها الدالة range()‎، ونستطيع استخدام قائمة أعداد صراحةً عوضًا عن الدالة range()‎، بالشكل التالي: >>> for n in [1,2,3,4,5,6,7,8,9,10,11,12]: ... print( "%d x 12 = %d" % (n, n*12) ) أُزيح سطر print موازنةً بسطر حلقة for الذي فوقه، وهذا مهم جدًا لأن هذه الإزاحة تخبر بايثون أن عليها تكرار القسم الخاص بـ print، ومن الممكن إزاحة أكثر من سطر، وستكرر بايثون هذه الأسطر المزاحة جميعًا لكل عنصر في التجميعة، ولا يهم مقدار الإزاحة المستخدمة طالما هي نفسها في كل الأسطر المزاحة، وستخبرنا بايثون إذا وجدت اختلافًا في الإزاحة. نحتاج إلى ضغط زر الإدخال Enter مرتين في المفسر التفاعلي لتشغيل البرنامج، لأن مفسر بايثون يضيف سطرًا جديدًا إلى شيفرة الحلقة التكرارية عندما نضغط مرةً واحدةً؛ أما مع الضغطة الثانية فستفترض بايثون أننا أنهينا إدخال الشيفرة، فتشغّل البرنامج. وبما أننا قد رأينا الآن هيكل حلقة for، لننظر في كيفية عملها خطوةً خطوةً على النحو الآتي: أولًا: تستخدم بايثون دالة range()‎ لتوليد قائمة أعداد من 1 إلى 12، وفقًا لآلية خاصة تسمى بالمولد generator، وتشبه القائمة التي تزيد من عناصرها عنصرًا واحدًا في كل مرة حسب الطلب، مما يوفر الذاكرة عندما تكون القائمة كبيرةً، وهو نفس سبب توليد القائمة صراحةً باستخدام list()‎ عندما طبعنا range()‎ أعلاه، وهذا شبيه بما فعلناه في مثال مفاتيح القاموس keys()‎ في المقال الخامس من هذه السلسلة والمتعلق بالمواد الخام للبرمجة. ثانيًا: تجعل بايثون قيمة n مساويةً للقيمة الأولى في القائمة، وهي 1 في هذه الحالة، ثم تنفذ الشيفرة المزاحة باستخدام القيمة n = 1: print( "%d x 12 = %d" % (1, 1*12) ) ثم تعود إلى سطر for وتضبط n على القيمة التالية في القائمة، وهي 2 في هذه الحالة، ثم تنفذ الشيفرة المزاحة مع القيمة n = 2: print( "%d x 12 = %d" % (2, 2*12) ) وتستمر في تكرار هذا التسلسل حتى تمر n على جميع القيم في القائمة، ثم تنتقل إلى الأمر التالي غير المزاح، في حالتنا لا توجد أي أوامر، لذا سيتوقف البرنامج. الحلقة التكرارية في VBScript تُعَد For...Next أبسط حلقة تكرارية في VBScript، وتُستخدم بالشكل التالي: <script type="text/vbscript"> For N = 1 To 12 MsgBox N & " x 12 = " & N*12 Next </script> يُعَد أسلوب VBScript أوضح وأسهل في فهم ما تفعله الشيفرة، إذ تتغير قيمة N من 1 إلى 12، وتنفَّذ الشيفرة التي توجد قبل الكلمة المفتاحية Next، وفي حالتنا تطبع الشيفرة النتيجة في صندوق حواري؛ أما إزاحة السطر هنا فاختيارية وليست شرطًا، لكنها تجعل الشيفرة أسهل في القراءة، وقد يحتوي متن الحلقة التكرارية على أكثر من سطر ينفَّذ على عناصر القائمة، كما في حالة بايثون التي رأيناها قبل قليل، ورغم أن VBScript تبدو أوضح للوهلة الأولى؛ إلا أن بايثون أكثر مرونةً كما سنرى بعد قليل. الحلقة التكرارية في جافاسكربت تستخدم جافاسكربت البُنية for الشائعة في كثير من لغات البرمجة الشبيهة بلغة C، وستبدو الحلقة كما يلي: <script type="text/javascript"> for (n=1; n <= 12; n++){ document.write(n + " x 12 = " + n*12 + "<BR>"); }; </Script> تبدو هذه الشيفرة معقدةً للوهلة الأولى، وهي تتكون من ثلاثة أجزاء بين القوسين () هي: جزء البداية: n = 1 الذي يُنفَّذ مرةً واحدةً قبل أي شيء آخر. جزء الاختبار: n <= 12 الذي يُنفَّذ قبل كل تكرار. جزء الزيادة: n++‎ وهو اختصار "زِد n بمقدار 1"، وينفَّذ بعد كل تكرار. لاحظ أن جافاسكربت تضع الشيفرة المكرَّرة، أي متن الحلقة التكرارية، بين قوسين معقوصين {}، وهذا كافٍ لتكون الحلقة صالحةً للتنفيذ، إلا أنه يفضَّل إزاحة الشيفرة التي داخل الأقواس المعقوصة لتحسين قابلية قراءة الشيفرة. لن ينفَّذ متن الحلقة loop body إلا إذا تحقق جزء الاختبار، أي كان true. وقد تحتوي هذه الأجزاء على شيفرات عشوائية، إلا أن الجزء الثاني الخاص بالاختبار يجب أن يعطي قيمةً بوليانيةً. مزيد من المعلومات حول حلقة for في بايثون تتكرّر حلقة for في بايثون على تسلسل، تذكر أن التسلسل الذي شرحناه في المقالات السابقة يشمل أشياء، مثل السلاسل النصية والقوائم والصفوف tuples، كما تستطيع بايثون أن تكرِّر عدة أنواع أخرى لكننا سنؤجل ذلك إلى وقت لاحق، وبناءً على ذلك نستطيع كتابة حلقات for تتعامل مع أي نوع من التسلسلات، ولنجرب مثلًا طباعة حروف كلمة حرفًا حرفًا باستخدام حلقة for مع سلسلة نصية: >>> for c in 'word': print( c ) ... w o r d لاحظ أننا طبعنا كل حرف على سطر منفصل، وأنه يمكننا إضافة متن الحلقة، عندما يكون سطرًا واحدًا، إلى نفس سطر الحلقة بوضعه بعد نقطتين رأسيتين :، إذ تخبران بايثون بوجود كتلة برمجية تليهما. ويمكن التكرار على صف tuple: >>> for word in ('one','word', 'after', 'another'): print (word) ... جعلنا في هذا المثال كل كلمة في سطر منفصل على خلاف المثال السابق، ويمكن وضعها جميعًا في سطر واحد باستخدام ميزة خاصة بدالة print()‎، إذ نستطيع إضافة وسيط argument بعد العنصر المراد طباعته كما يلي: >>> for word in ('one', 'word', 'after', 'another'): print( word, end='' ) ... لاحظ كيف ستظهر الكلمات الآن في سطر واحد، لأن الوسيط end=''‎ يخبر بايثون أن تستخدم سلسلةً نصيةً فارغةً '' لنهاية السطر عوضًا عن محرف السطر الجديد الذي تستخدمه افتراضيًا، لنجرب حلقة for مرةً أخرى مع القوائم: >>> for item in ['one', 2, 'three']: print( item ) ... ستظهر هنا مشكلة عند استخدام الحلقات التكرارية التي على نمط foreach، وهي أن الحلقة تعطينا نسخةً مما كان في التجميعة، دون أن نستطيع تعديل محتوياتها مباشرةً، فإذا احتجنا إلى تعديلها؛ فعلينا استخدام برنامج غريب الشكل نستخدم فيه فهرس التجميعة، كما يلي: myList = [1,2,3,4] for index in range(len(myList)): print( myList[index] ) myList[index] += 1 print( myList ) سيزيد هذا البرنامج كل فهرس في myList، ولو أننا لم نستخدم طريقة الفهرس تلك، لكنا زدنا العناصر المنسوخة فقط دون تغيير القائمة الأصلية، وقد صار لدينا متن متعدد الأسطر في حلقتنا التكرارية. myList = [1,2,3,4] for index, value in enumerate(myList): print( value ) myList[index] += 1 print( myList ) لاحظ أننا لم نستخدم محث بايثون التفاعلي ‎>>>‎ في هذا المثال، لذا عليك كتابته في ملف كما شرحنا في مقال المزيد من التسلسلات البرمجية وأمور أخرى؛ أما إذا حاولنا كتابته في محث بايثون، فسنحتاج إلى أسطر فارغة إضافية لنخبر بايثون بانتهاء كتلة برمجية، وذلك بعد السطر myList[index] += 1 مثلًا، وهذه الطريقة مفيدة لتعلّم بداية الكتل البرمجية ونهايتها، بكتابة الشيفرة وتخمين أماكن الحاجة إلى السطر الإضافي، إذ يجب أن يكون عند الموضع الذي تتغير فيه الإزاحة. لا بد من ملاحظة أمر آخر في حلقات foreach، وهو أننا لا نستطيع حذف العناصر من التجميعة التي نمر عليها، لأن ذلك يربك الحلقة نفسها، فهو يشبه قطع فرع من شجرة أثناء جلوسك عليه، والحل هو استخدام نوع مختلف من الحلقات التكرارية، كما سنرى في جزئية لاحقة من هذه السلسلة. ربما تجب الإشارة إلى أن كلًا من جافاسكربت وVBScript لديهما بنىً للتكرار على العناصر الموجودة في تجميعة ما، ولن نتحدث عنها بتفصيل هنا، لكن إذا أردت أن تبحث في الأمر بنفسك فانظر صفحات المساعدة لبنية for each...in...‎ في لغة VBScript، وبنية for...in...‎ في جافاسكربت. حلقات While التكرارية تتطلب حلقات for أن يعلم المبرمج عدد مرات التكرار التي يريد تنفيذها قبل بدء الحلقة نفسها، أو أن يستطيع حسابها على الأقل، لكن ماذا لو أردنا تنفيذ مهمة ما حتى وقوع حدث معين لا نعرف موعده؟ فقد نرغب في قراءة بيانات من المستخدم ومعالجتها مثلًا إلى أن يخبرنا المستخدم نفسه بالتوقف عن ذلك، كما لن نعرف عدد عناصر البيانات التي سنعالجها إلى أن يكتفي المستخدم ويخبرنا بذلك أيضًا. يُعَد تنفيذ مثل هذه المهام باستخدام حلقة for ممكنًا نظريًا لكنه معقد، لهذا لدينا نوع آخر من الحلقات التي تحل مثل هذه المشاكل، وهي حلقة while، وستبدو في بايثون بالشكل التالي: >>> j = 1 >>> while j <= 12: ... print( "%d x 12 = %d" % (j, j*12) ) ... j = j + 1 لنحلل هذه الشيفرة: نهيئ أولًا j لتأخذ القيمة 1، وهذه الخطوة مهمة للغاية، أي تهيئة متغير التحكم في حلقة while، لأن نسيان تهيئته يتسبب في أخطاء كثيرة. ننفذ تعليمة while نفسها، التي تختبر تعبيرًا بوليانيًا هو j<=12 في حالتنا. ننفذ الكتلة المزاحة التي تتبعها إذا كانت النتيجة True، وهو محقق في حالتنا بما أن قيمة j أقل من 12، لذا سننتقل إلى الكتلة. ننفذ تعليمة الطباعة لإخراج أول سطر من جدولنا. يزيد السطر التالي في الكتلة متغير التحكم j، وهو السطر الأخير في حالتنا، ليشير إلى نهاية كتلة while. نعود إلى تعليمة while ونكرر الخطوات من 4 إلى 6 بقيمة j الجديدة. نكرر هذا التسلسل إلى أن تصل قيمة j إلى 13. هنا يعيد اختبار while القيمة False، فنتخطى الكتلة المزاحة إلى السطر الجديد الذي يوازي تعليمة while في إزاحتها. يتوقف البرنامج في مثالنا لأنه لا توجد أسطر أخرى. تعليمة while واضحة وبسيطة كما رأينا، لكننا نريد الإشارة إلى النقطتين الرأسيتين (:) اللتين في نهاية سطر تعليمة while -وتعليمة for أيضًا-، إذ تخبر هاتان النقطتان بايثون أن ما يليهما كتلة برمجية أو مجموعة مترابطة من التعليمات، وكل لغة لها طريقتها في إخبار المفسر بجمع عدة أسطر معًا كما سنرى، ففي حالة بايثون مثلًا، سنستخدم النقطتين الرأسيتين وإزاحة الأسطر. حلقة While في VBScript فيما يلي حلقة while في لغة VBScript: <script type="text/vbscript"> DIM J J = 1 Do While J <= 12 MsgBox J & " x 12 = " & J*12 J = J + 1 Loop </script> يعطينا هذا المثال نفس النتيجة التي حصلنا عليها من مثال بايثون السابق، مع ملاحظة انتهاء كتلة الحلقة التكرارية بالكلمة المفتاحية Loop حلقة While في جافاسكربت <script type="text/javascript"> j = 1; while (j <= 12){ document.write(j + " x 12 = "+ j*12 + "<BR>"); j++; } </script> تتشابه هذه البنية مع ما سبق، لكن مع بعض الأقواس المعقوصة بدلًا من كلمة Loop التي في VBScript، لاحظ أن ++J تعني زيادة قيمة j بمقدار 1، كما ذكرنا في مقال سابق، وأن جافاسكربت وVBScript لا تشترطان إزاحة الأسطر، على عكس لغة بايثون، لكننا أزحنا الأسطر لتسهيل قراءة الشيفرة فقط. لنراجع الآن حلقة for في جافاسكربت: for (j=1; j<=12; j++){....} نلاحظ أنها تشبه حلقة while تمامًا، لكنها مكتوبة في سطر واحد بحيث يمكن رؤية المهيئ initializer وشرط الاختبار ومعدِّل الحلقة معًا، وبهذا يتبين أن حلقة for في جافاسكربت ما هي إلا حلقة while ولكن بصورة مضغوطة، وسنستنتج أن بعض اللغات قد تستغني عن حلقة for نهائيًا، وهو ما يحدث حقًا. حلقات تكرارية مرنة إذا عدنا إلى مثال جدول ضرب العدد 12 الذي ذكرناه في بداية هذا المقال، فسنجد أن الحلقة التي أنشأناها ستطبع جدول هذا العدد بكفاءة، لكن هل يمكننا تعديل الحلقة لجعلها تطبع جدول العدد 7 مثلًا؟ ينبغي أن تبدو الحلقة كما يلي: >>> for j in range(1,13): ... print( "%d x 7 = %d" % (j,j*7) ) وهذا يعني أن علينا تغيير 12 إلى 7 مرتين، وإذا أردنا قيمةً أخرى غيرهما فسنغير في موضعين من جديد، ولكن ألا توجد طريقة أفضل لإدخال مضاعف الضرب ذاك؟، يمكن ذلك باستخدام متغير آخر للقيم التي في سلسلة الطباعة، ثم ضبط ذلك المتغير قبل تشغيل الحلقة التكرارية: >>> multiplier = 12 >>> for j in range(1,13): ... print( "%d x %d = %d" % (j, multiplier, j*multiplier) ) وهذا جدول العدد 12 السابق، وإذا أردنا تغييره إلى العدد 7 مثلًا، فلا نغير إلا قيمة multiplier، جرب كتابة هذا البرنامج في ملف سكربت بايثون وتشغيله من محث سطر الأوامر، ثم عدِّل قيمة المضاعف multiplier إلى أعداد أخرى، لاحظ أننا جمعنا هنا بين التسلسل والحلقات التكرارية، فقد كتبنا أمرًا وحيدًا في البداية هو multiplier = 12، متبوعًا بحلقة for. تكرار الحلقة نفسها لنطور مثالنا السابق قليلًا، ولنفترض أننا نريد طباعة جميع جداول الضرب للأعداد من 2 حتى 12، سيكون كل ما نحتاجه هو ضبط متغير المضاعف ليكون جزءًا من الحلقة التكرارية، ونفعل بذلك بالشكل التالي: >>> for multiplier in range(2,13): ... for j in range(1,13): ... print( "%d x %d = %d" % (j,multiplier,j*multiplier) ) لاحظ أن الجزء المزاح داخل حلقة for الأولى هو نفس الحلقة التي بدأنا بها، وستنفَّذ الحلقة كما يلي: نضبط multiplier أولًا على القيمة الأولى 2 ثم ننتقل إلى الحلقة الثانية الداخلية. نعيد ضبط multiplier على القيمة التالية 3 ثم ننتقل إلى الحلقة الداخلية مرةً أخرى. نكرر هذا حتى نمر على جميع الأعداد. يُعرف هذا الأسلوب باسم الحلقات المتشعبة nesting loops، لكن من مساوئه أن جميع الجداول ستكون مدمجةً معًا، ونستطيع إصلاح هذه المشكلة بطباعة سطر فاصل في نهاية الحلقة الأولى، كما يلي: >>> for multiplier in range(2,13): ... for j in range(1,13): ... print( "%d x %d = %d" % (j,multiplier,j*multiplier) ) ... print( "------------------- " ) لاحظ أن تعليمة الطباعة الثانية لها نفس إزاحة تعليمة for الثانية، وهي ثاني تعليمة في تسلسل التكرار، فتسلسل الإزاحة مهم جدًا في بايثون كما ذكرنا. دعنا نرى الآن كيفية تنفيذ هذا التدريب في جافاسكربت، لرؤية الفرق بينهما فقط: <script type="text/javascript"> for (multiplier=2; multiplier < 13; multiplier++){ for (j=1; j <= 12 ; j++){ document.write(j, " x ", multiplier, " = ", j*multiplier, "<BR>"); } document.write("---------------<BR>"); } </script> حاول أن تجعل السطر الفاصل يشير إلى الجدول التابع له، يمكنك استخدام متغير المضاعف وسلسلة التنسيق التي في بايثون لفعل ذلك. حلقات أخرى توفر بعض اللغات الأخرى بنىً مختلفةً للتكرار، كما رأينا في مثال VBScript أعلاه، غير أنها لا تخلو من صورة ما لحلقتي for وwhile، ولا تحوي بعض اللغات، مثل Modula 2 وOberon، إلا حلقة while فقط، بما أننا نستطيع تمثيل سلوك for منها كما رأينا قبل قليل. ومن الحلقات التكرارية الموجودة في اللغات الأخرى: do-while: هذه الحلقة هي نفسها حلقة while لكن مع وجود الاختبار في نهايتها، بحيث تُنفَّذ الحلقة مرةً واحدةً على الأقل. repeat-until: شبيهة بالسابقة أيضًا لكن مع عكس المنطق. GOTO وJUMP وLOOP: هذه الحلقات التكرارية موجودة في اللغات القديمة، وهي تعين علامةً في الشيفرة ثم تقفز إليها مباشرةً. خاتمة لقد رأينا أن حلقات for تكرر مجموعةً من الأوامر لعدد محدد وثابت من المرات، وأن while تكرر تلك الأوامر إلى أن يتحقق شرط محدد في الحلقة، ولا تنفذ متن الحلقة أصلًا إذا كان شرط إنهاء الحلقة غير متحقق من البداية، أي أعطى اختباره النتيجة false، وعلمنا أنه توجد أنواع أخرى من الحلقات التكرارية؛ لكن اللغة التي تحتوي عليها، ستحتوي على حلقتي for وwhile أو إحداهما على الأقل، وأن حلقات for في بايثون ما هي إلا حلقات foreach حقيقةً، إذ تعمل على قائمة من العناصر، كما تعلمنا الحلقات التكرارية المتشعبة، بإدخال حلقة فرعية داخل أخرى أكبر منها. ترجمة -بتصرف- للفصل السابع: Looping - Or the art of repeating oneself من كتاب Learning To Program لصاحبه Alan Gauld. اقرأ أيضًا المقال التالي: أسلوب كتابة الشيفرات البرمجية وتحقيق سهولة قراءتها المقال السابق: بعض التسلسلات النصية المهمة لتعلم البرمجة ما هي البرمجة ومتطلبات تعلمها؟ الحلقات التكرارية Loops في Cpp بنى التحكم والحلقات التكرارية في PHP الحلقات التكرارية في لغة سي شارب #C حلقات for التكرارية ببساطة في جافاسكريبت
    1 نقطة
  20. يتعامل المبرمجون مع شفرة البرامج المصدرية بأسلوبين مختلفين، فالأول يرى أنّ “الشفرة التي تعمل هي الشفرة الجيدة” أما الثاني فيرى أنّه “ما دامت الشفرة جيدة فإنّها ستعمل بكل تأكيد” وبصياغة أخرى: “المهمّ أنها تعمل” مقابل “المهمّ أن تكون صحيحة”. كل يوم تقريبًا أقرأ هذه العبارة وأشباهها في تعليقات المدونة: “ما الحاجة إلى مبادئ البرمجة كائنية التوجه إن كانت الشفرة البرمجية تعمل بشكل جيّد دون استخدامها؟ ما الهدف من إدخال طرق وأساليب جديدة يفترض بها أن تكون أفضل من سابقاتها، إن كانت الطريقة التقليدية الحالية - والتي تتوسط البرمجة الإجرائية وكائنية التوجه - تعمل جيّدًا؟” لنفكّر في الأمر من زاوية مختلفة، وننظر إلى الأمور على نحو أعمّ ونفكّر من ناحية تطوير البرمجيات لا من ناحية البرمجة كائنية التوجه. هناك الكثير من الأمثلة التي تنطبق عليها عقلية “المهمّ أنّه يعمل”. لنأخذ لغة Perl، وهي لغة برمجية تشتهر بقدرتها على القيام بأيّ شيء بثلاث طرق مختلفة، بمعنى أنّه لا وجود لطريقة واحدة صحيحة. لست خبيرًا في Perl، لذا فلنلق نظرة على شفرة Ruby التالية: if a > b m = 'Hello!' end يمكن كتابة الشفرة السابقة بهذه الطريقة أيضًا: m = if a > b 'Hello!' end أو هذه: m = 'Hello!' if a > b وإليك المزيد: m = a > b ? 'Hello' : nil أيّ الشفرات السابقة صحيحة؟ هل يمكن ﻷي مبرمج بلغة Perl أن يخبرنا بذلك؟ هل يمكن اقتراح طرق أخرى للوصول إلى نفس النتيجة؟ أما في لغة Java (وهي لغة أكثر صرامة من Ruby) فليس من المفاجئ أن تكون هناك طريقة واحدة للقيام بذلك: if (a > b) { m = "Hello!"; } أعتقد أنّني أخطأت، فهنالك طريقة ثانية: if (a > b) m = "Hello!"; ما الذي يمكن أن يجنيه المبرمجون من هذا التنوّع الكبير؟ أعتقد أن الإجابة تعتمد على كوننا نكتب الشفرة أم نقرؤها؟ كذلك يعتمد الأمر على موقفنا تجاه البرنامج الذي نعمل على إنشائه، فإما نرى بأنّه ملكنا (عقلية المخترق) أو أنّنا نبنيه وحسب (عقلية المصمّم). إن كنا نكتب الشفرة البرمجية، وكنا نرى أنفسنا أصحاب تلك الشفرة، فسنحتاج إلى ترسانة أسلحة التجميل اللغوي Syntactic sugar لنثبت لأنفسنا بأننا أذكياء، وبالتأكيد لنتباهى أمام أصدقائنا بمفسّر Ruby الكئيب. في المقابل، إن كنا نعدّ أنفسنا في عداد المصممين، فسنصاب بالانزعاج والإحباط عند قراءة شفرة برمجية مليئة بأساليب التجميل اللغوي والتي “تعمل دون مشاكل”. ربما يجب أن أقتصر في الحديث على نفسي، الواقع أنني متأكّد من أنني سأصاب بهذا الشعور. يمكن أن نعدّ صياغة لغة Ruby والتي تتيح هذا القدر الكبير من التجميل اللغوي مثالًا واضحًا على التناقض الحاصل بين مبدأي “المهمّ أن تعمل” و “المهم أن تكون جيدة”. إذ تتمثل فلسفة Ruby في أنّه لا أهمّية لطريقة كتابة الشفرة البرمجية ما دامت تؤدّي عملها المطلوب منها. أما فلسفة Java فمختلفة تمامًا، وهي أقرب ما تكون إلى: اكتب شفرة صحيحة وستعمل بالتأكيد. إضافة إلى ذلك، فإن نوع البيانات الضعيف والديناميكي Weak and dynamic type الذي تتمتع به لغة Ruby مقابل نوع البيانات الصلب والثابت Strong and static type في Java، يعدّ دليلًا آخر عمّا أتحدّث عنه. أرى عموما أنّه كلما زادت مرونة اللغة البرمجية، قلّت قابلية صيانة الشفرة المكتوبة بها، وبمعنى آخر فإن الجودة الأعلى تأتي من اللغات الأبسط. وهذا الأمر ينطبق كذلك على عملية تطوير البرمجيات: فكلما زادت القيود المفروضة على المبرمجين وقلّت الخيارات المتاحة أمامهم في طريقة كتابة الشفرة البرمجية، زادت جودة البرنامج المكتوب بتلك اللغة. تحاول المحلّلات الساكنة Static analyzers مثل Checkstyle في لغة Java أو Rubocop في لغة Ruby حلّ هذه المشكلة وذلك بمنعنا من استخدام خصائص معيّنة في اللغة البرمجية، ولكنّها لا تقدّم نتائج جيّدة لأنّنا مبدعون في كتابة الشفرات بأساليب وأشكال متنوعة. لنعد الآن إلى السؤال الخاص بالبرمجة كائنية التوجه: ما الحاجة إلى تطوير أي شيء إن كان يؤدي عمله بهيئته الحالية؟ الجواب: البرمجة كائنية التوجه الحديثة (كما في Java، Ruby و ++C) لا تنتج شفرة برمجية ذات جودة عالية لأنّها لا تتبع تصوّرا برمجيًّا Paradigm قويًا ومقيّدًا بشكل ملائم. كل ما في الأمر أنّها توفّر الكثير من “الميزات” التي أدخلتها في الغالب ++C وبقيت فيها لأجل منفعتنا المتبادلة. هذه اللغات تعمل بالفعل، ولكنّ قابلية صيانة البرامج التي ننتجها بهذه اللغات تكون منخفضة للغاية. الواقع أن قابليّة الصيانة هذه أقل بكثير ممّا كان سيكون عليه الحال لو كان “إبداعنا” مقيّدًا. ترجمة - وبتصرّف - للمقال Flexibility Equates to Lower Quality لصاحبه Yegor Bugayenko.
    1 نقطة
×
×
  • أضف...