كيفية تعليم كيفية التغلب على الصعوبات، وفي نفس الوقت كتابة الدورات

على الرغم من أننا سنتحدث عن أحد المواضيع الأساسية، إلا أن هذه المقالة مكتوبة للمحترفين ذوي الخبرة. الهدف هو إظهار المفاهيم الخاطئة لدى المبتدئين في البرمجة. بالنسبة للمطورين الممارسين، تم حل هذه المشكلات منذ فترة طويلة أو نسيانها أو لم يتم ملاحظتها على الإطلاق. قد تكون المقالة مفيدة إذا كنت بحاجة فجأة إلى مساعدة شخص ما في هذا الموضوع. يقارن المقال بمواد من كتب مختلفة عن البرمجة كتبها شيلدت وستروستروب وأوكولوف.

تم اختيار موضوع الدورات لأنه يتم استبعاد الكثير من الأشخاص منها عند إتقان البرمجة.

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


لقد عملت على هذه التقنية لمدة 4 سنوات، ودرست بشكل فردي مع طلاب من مستويات مختلفة من التدريب. في المجموع هناك حوالي خمسين طالبًا وألفي ساعة دراسية. في البداية، كان الطلاب عالقين دائمًا في هذا الموضوع وغادروا. بعد كل طالب، تم تعديل المنهجية والمواد. خلال العام الماضي، لم يعد الطلاب عالقين في هذا الموضوع، لذلك قررت مشاركة النتائج التي توصلت إليها.

لماذا الكثير من الرسائل؟ الدورات بدائية جدًا!

كما كتبت أعلاه، بالنسبة للمطورين الممارسين والطلاب الأقوياء، يمكن التقليل من مدى تعقيد مفهوم الحلقات. على سبيل المثال، يمكنك إلقاء محاضرة طويلة، ورؤية رؤوس تومئ وعيون ذكية. ولكن عند محاولة حل أي مشكلة، يبدأ الذهول والمشاكل التي لا يمكن تفسيرها. بعد المحاضرة، ربما كان لدى الطلاب فهم جزئي فقط. يتفاقم الوضع بسبب حقيقة أن الطلاب أنفسهم لا يستطيعون التعبير عن ما هو وهمهم بالضبط.
في أحد الأيام، أدركت أن الطلاب ينظرون إلى الأمثلة الخاصة بي على أنها كتابات هيروغليفية. أي مثل أجزاء النص غير القابلة للتجزئة والتي تحتاج إلى إضافة بعض الحروف "السحرية" إليها وسوف تعمل.
لاحظت أحيانًا أن الطلاب يعتقدون أنهم بحاجة إلى حل مشكلة معينة شيء آخر تصميم لم أقم بتغطيته بعد. على الرغم من أن الحل لا يتطلب سوى تعديل طفيف للمثال.

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

من ولماذا أقوم بالتدريس؟

نظرًا لعدم وجود اختبارات قبول، يمكن أن تشمل الفصول الدراسية طلابًا أقوياء وضعفاء جدًا. يمكنك قراءة المزيد عن طلابي في المقالة صورة لطلاب الدورة المسائية
لقد بذلت قصارى جهدي للتأكد من أن كل من يريد تعلم البرمجة يمكنه تعلمها.
تقام فصولي بشكل فردي ويدفع الطالب من ماله الخاص لكل منها. يبدو أن الطلاب سيعملون على تحسين التكاليف والمطالبة بالحد الأدنى. ومع ذلك، يذهب الناس إلى الفصول الدراسية وجهًا لوجه مع معلم حي ليس من أجل المعرفة نفسها، ولكن من أجل الثقة فيما تعلموه، ومن أجل الشعور بالتقدم والحصول على موافقة الخبير (المعلم). إذا لم يشعر الطلاب بالتقدم في تعلمهم، فسوف يغادرون. بشكل عام، يمكن تنظيم الفصول الدراسية بحيث يشعر الطلاب بالتقدم في زيادة عدد الهياكل المألوفة. أي أننا أولاً ندرس بالتفصيل، ثم ندرس لمدة، ثم ندرس بينما، والآن لدينا دورة ألف ليلة وليلة جاهزة، تُدرس فيها الدورات وحدها لمدة شهرين، وفي النهاية - طالب كتب مكتبة قياسية تحت الإملاء. ومع ذلك، من أجل حل المشكلات العملية، لا تحتاج إلى معرفة المادة فحسب، بل تحتاج أيضًا إلى الاستقلال في تطبيقها والبحث عن معلومات جديدة. لذلك، بالنسبة للدورات وجهًا لوجه، أعتقد أن المبدأ الصحيح هو تدريس الحد الأدنى وتشجيع الدراسة المستقلة للفروق الدقيقة والموضوعات ذات الصلة. في موضوع الحلقات، أعتبر أن البناء while هو الحد الأدنى. يمكنك فهم المبدأ منه. بمعرفة هذا المبدأ، يمكنك إتقان كل من العمل بنفسك.

لتحقيق إتقان المادة من قبل الطلاب الضعفاء، فإن وصف النحو ليس كافيًا. من الضروري إعطاء مهام أكثر بساطة ولكن متنوعة ووصف الأمثلة بمزيد من التفصيل. وفي نهاية المطاف، فإن سرعة التطور محدودة بقدرة الطالب على تحويل التعبيرات والبحث عن الأنماط. بالنسبة للطلاب الأذكياء، ستكون معظم الواجبات مملة. عندما تدرس معهم، ليس عليك الإصرار على حل 100% من المشكلات. يمكن الاطلاع على المواد الخاصة بي على بلدي جيثب. صحيح أن المستودع يشبه إلى حد كبير جريمويري الساحر - لن يفهم أحد غيري ما هو مكانه، وإذا فشلت في الفحص، فقد تصاب بالجنون

المنهجية موجهة نحو الممارسة

يتم شرح النظرية باستخدام مثال حل المشكلة. في فصل أساسيات البرمجة حيث يتم تدريس الفروع والحلقات، ليس من الممكن ببساطة إلقاء محاضرة مفيدة حول موضوع واحد لمدة ساعة كاملة. 15-20 دقيقة كافية لشرح الفكرة. تنشأ الصعوبات الرئيسية عند أداء المهام العملية.
يستطيع المعلمون المبتدئون التعرف على العوامل والفروع والحلقات والمصفوفات في محاضرة واحدة. لكن طلابهم سيواجهون مشكلة استيعاب هذه المعلومات.
من الضروري ليس فقط سرد المادة، ولكن أيضًا التأكد من أن المستمعين يفهمونها.

يتم تحديد حقيقة إتقان موضوع ما من خلال كيفية تعامل الطالب مع العمل المستقل.
إذا تمكن الطالب من حل مشكلة في موضوع ما دون مساعدة المعلم، فقد تم إتقان الموضوع. لضمان الاختبار الذاتي، يتم وصف كل مهمة في جدول يحتوي على سيناريوهات الاختبار. المهام لها ترتيب واضح. لا ينصح بتخطي المهام. إذا كانت المهمة الحالية صعبة للغاية، فإن الانتقال إلى المهمة التالية عديم الفائدة. بل إن الأمر أكثر تعقيدًا. لكي يتمكن الطالب من إتقان المهمة المعقدة الحالية، يتم شرح عدة تقنيات له باستخدام مثال المشكلة الأولى. في الواقع، يتم تقليل المحتوى بأكمله للموضوع إلى تقنيات التغلب على الصعوبات. الدورات هي أكثر من الآثار الجانبية.

المهمة الأولى هي دائما مثال. والثاني يختلف قليلاً ويتم إجراؤه "بشكل مستقل" مباشرة بعد الأول تحت إشراف المعلم. تهدف جميع المهام اللاحقة إلى الانتباه إلى الأشياء الصغيرة المختلفة التي يمكن أن تسبب مفاهيم خاطئة.

شرح المثال عبارة عن حوار يحتاج فيه الطالب إلى إعادة النشر والتحقق المتبادل للتأكد من أنه أتقن جزءًا من المادة.

سأكون مبتذلاً وأقول إن المثال الأول حول الموضوع مهم جدًا. إذا كانت لديك المادة اللازمة لعمل مستقل واسع النطاق، فيمكن تصحيح الإغفالات في المثال الأول. إذا لم يكن هناك شيء آخر إلى جانب المثال، فمن المرجح أن الطالب لن يتقن الموضوع.

بينما أو ل؟

إحدى القضايا المثيرة للجدل هي اختيار البناء على سبيل المثال: بينما أو ل. ذات مرة، أمضى أحد أصدقائي المطورين الممارسين، وليس لديه خبرة في التدريس، ساعة كاملة في إقناعي بأن حلقة for هي الأسهل في الفهم. وتلخصت الحجج في أن «كل ما فيه واضح وموضوع في مكانه». ومع ذلك، فإن السبب الجذري للصعوبات التي يواجهها المبتدئين الحقيقيين هو فكرة الدورة نفسها، وليس كتابتها. إذا لم يفهم الشخص هذه الفكرة، فسوف يواجه صعوبة في بناء الجملة. بمجرد أن تتحقق الفكرة، تختفي مشاكل تصميم التعليمات البرمجية من تلقاء نفسها.

في المواد الخاصة بي، يتبع موضوع الحلقات موضوع التفرع. يتيح لنا التشابه الخارجي بين if و while إجراء تشبيه مباشر: "عندما يكون الشرط الموجود في الرأس صحيحًا، يتم تنفيذ الجسم". الميزة الوحيدة للدورة هي أن الجسم يتم تنفيذه عدة مرات.

حجتي الثانية هي أن while تتطلب تنسيقًا أقل من تنسيق for. التنسيق الأقل يعني عددًا أقل من الأخطاء الغبية مع فقدان الفواصل والأقواس. لم يكتسب المبتدئون بعد ما يكفي من الاهتمام والدقة لتجنب الأخطاء النحوية تلقائيًا.
والحجة الثالثة مشروحة في كثير من الكتب الجيدة كالحجة الأولى.

إذا كان الطالب يستطيع تحويل التعبيرات بسهولة، فيمكنك التحدث عنها بشكل عابر. ثم يختار الطالب ما يعجبه أكثر. إذا كانت التحولات تسبب صعوبات، فمن الأفضل عدم صرف انتباهك. دع الطالب يحل كل شيء أولاً باستخدام while. بمجرد أن تتقن موضوع الحلقات، يمكنك إعادة كتابة الحلول للتدرب على التحويل من while إلى for.
تعد حلقات الحالة اللاحقة وحشًا نادرًا جدًا. ولا أقضي أي وقت في ذلك على الإطلاق. إذا أتقن الطالب أفكار تحديد الأنماط وتحويل التعبيرات، فيمكنه اكتشافها دون مساعدتي.

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

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

الصريح أفضل من الضمني

قد يبدو من الجيد عرض نفس العبارة عدة مرات في مهمة التكرار الأولى. على سبيل المثال:

مرحى، إنه يعمل!
مرحى، إنه يعمل!
مرحى، إنه يعمل!
مرحى، إنه يعمل!
مرحى، إنه يعمل!
مرحى، إنه يعمل!
مرحى، إنه يعمل!
مرحى، إنه يعمل!

هذا الخيار سيئ لأن قيمة العداد غير مرئية في الإخراج. هذه مشكلة للمبتدئين. لا نقلل من شأنها. في البداية، كانت هذه المهمة هي الأولى، وكانت مهمة استخلاص سلسلة من الأرقام بترتيب تصاعدي هي الثانية. وكان من الضروري إدخال مصطلحين إضافيين "الدورة N مرات" و"الدورة من A إلى B"، وهما في الأساس نفس الشيء. لكي لا أقوم بإنشاء كيانات غير ضرورية، قررت أن أعرض مثالاً فقط مع إخراج سلسلة من الأرقام. قليل من الناس يتمكنون من تعلم كيفية الاحتفاظ بالعداد في رؤوسهم ونمذجة سلوك برنامج في رؤوسهم دون تحضير. يواجه بعض الطلاب لأول مرة النمذجة الذهنية حول موضوع الدورات.
بعد بعض التدريب، أعطي مهمة تكرار نفس النص ليتم حله بشكل مستقل. إذا أعطيت عدادًا مرئيًا أولاً ثم عدادًا غير مرئي، فستواجه الطلاب مشكلات أقل. في بعض الأحيان يكون التلميح "لا تكتب العداد على الشاشة" كافيًا.

كيف يفسرها الآخرون؟

في معظم المواد التعليمية على الإنترنت، يتم تقديم صيغة الدورة كجزء من "المحاضرة". على سبيل المثال، في موقع Developer.mozilla.org (حاليًا)، تم وصف العديد من البنيات الأخرى جنبًا إلى جنب مع حلقة while. في هذه الحالة، يتم تقديم التصميمات نفسها فقط في شكل قوالب. تم وصف نتيجة إطلاقهم بالكلمات، ولكن ليس هناك توضيح. في رأيي، مثل هذا العرض للموضوع يضاعف فائدة هذه المواد بمقدار الصفر. يمكن للطالب إعادة كتابة الكود وتشغيله بنفسه، لكنه لا يزال بحاجة إلى معيار للمقارنة. كيف يمكنك أن تفهم أن المثال قد تمت إعادة كتابته بشكل صحيح إذا لم يكن هناك ما يمكن مقارنة النتيجة به؟
عندما يتم تقديم قالب فقط، بدون مثال، يصبح الأمر أكثر صعوبة بالنسبة للطالب. كيف نفهم أن أجزاء التعليمات البرمجية موضوعة بشكل صحيح في القالب؟ يمكنك محاولة الكتابة بطريقة ما، ثم تشغيل. ولكن إذا لم يكن هناك معيار لمقارنة النتيجة، فلن يساعد الإطلاق أيضا.

في دورة C++‎ الخاصة بـ Intuitive، تم دفن صيغة الحلقة في الصفحة الثالثة من المحاضرة 4 حول موضوع "العاملين". عند شرح بناء جملة الحلقات، يتم التركيز بشكل خاص على مصطلح "المشغل". يتم تقديم المصطلح كمجموعة من الحقائق مثل “الرمز؛ هذه عبارة"، "{} عبارة مركبة"، "يجب أن يكون نص الحلقة عبارة". لا أحب هذا النهج لأنه يبدو أنه يخفي علاقات مهمة وراء مصطلح واحد. يعد تحليل الكود المصدري لبرنامج ما إلى مصطلحات في هذا المستوى أمرًا ضروريًا من قبل مطوري المترجمات لتنفيذ مواصفات اللغة، ولكن ليس من قبل الطلاب كتقدير أولي. نادراً ما يكون القادمون الجدد إلى البرمجة دقيقين بما يكفي لإيلاء مثل هذا الاهتمام الشديد للمصطلحات. من النادر أن يتذكر الشخص الكلمات الجديدة ويفهمها في المرة الأولى. لا يمكن لأحد تقريبًا أن يطبق المصطلح الذي تعلمه للتو بشكل صحيح. لذلك، يحصل الطلاب على الكثير من الأخطاء مثل "لقد كتبت while(a<7);{، لكن البرنامج لا يعمل".
في رأيي، في البداية، من الأفضل إعطاء بناء جملة البناء على الفور بين قوسين. يجب شرح الخيار بدون أقواس فقط إذا كان لدى الطالب سؤال محدد: "لماذا لا يوجد أقواس وهو يعمل."

في كتاب أوكولوف "أساسيات البرمجة" الصادر عام 2012، تبدأ مقدمة الحلقات بالنمط for، ثم تقدم توصيات لاستخدامه، ثم تنتقل فورًا إلى القسم التجريبي من الدرس. أفهم أن الكتاب كتب لهذه الأقلية من الطلاب ذوي القدرات العالية الذين نادرًا ما يأتون إلى فصولي.

في الكتب الشعبية، يتم دائمًا كتابة نتيجة أجزاء التعليمات البرمجية. على سبيل المثال، إصدار "Java 8. The Complete Guide" لعام 2015 من Shildt. أولا، يتم إعطاء القالب، ثم برنامج مثال وبعده مباشرة - نتيجة التنفيذ.

على سبيل المثال، خذ بعين الاعتبار حلقة while التي تقوم بالعكس
العد التنازلي يبدأ من 10، ويتم عرض 10 أسطر بالضبط من "التدابير":

//Продемонстрировать применение оператора цикла while
class While {
    public static void main(String args []) {
        int n = 10;
        while (n > 0) {
            System.out.println("такт " + n);
            n--;
        }
    }
}

بمجرد تشغيله، يقوم هذا البرنامج بإخراج عشر "دورات" على النحو التالي:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

يتم أيضًا استخدام أسلوب وصف القالب ومثال البرنامج ونتيجة البرنامج في كتاب "Javascript for Kids" وفي دورة js على موقع w3schools.com. يسمح تنسيق صفحة الويب لهذا المثال بأن يكون تفاعليًا.

ذهب كتاب ستروستروب لعام 2016 بعنوان "المبادئ والممارسة باستخدام C++" إلى أبعد من ذلك. الخطوة الأولى هي شرح النتيجة التي يجب الحصول عليها، وبعد ذلك يظهر نص البرنامج. علاوة على ذلك، فإنهم لا يأخذون مجرد برنامج عشوائي كمثال، بل يقدمون رحلة إلى التاريخ. وهذا يساعد على لفت الانتباه إليه: "انظر، هذا ليس مجرد نص عديم الفائدة. ترى شيئًا ذا معنى."

كمثال على التكرار، فكر في أول برنامج تم تنفيذه على جهاز برنامج مخزن (EDSAC). كتبه ديفيد ويلر في مختبر الكمبيوتر بجامعة كامبريدج بإنجلترا في 6 مايو 1949. يقوم هذا البرنامج بحساب وطباعة قائمة بسيطة من المربعات.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

هنا، يحتوي كل سطر على رقم متبوع بحرف جدولة ('t') ومربع هذا الرقم. تبدو نسخة C++ من هذا البرنامج كما يلي:

//Вычисляем и распечатываем таблицу квадратов чисел 0-99
int main()
{
    int i = 0; // Начинаем с нуля
    while(i < 100){
        cout << i << 't' << square(i) << 'n';
        ++i;
    }
}

ومن المثير للاهتمام أن نمط بناء الجملة لم يتم وصفه في هذا الكتاب. ستروستروب في دليل المعلم (ترجمة) تؤكد أنها تحترم ذكاء طلابها. ولعل القدرة على تحديد النمط في عدة أمثلة تعتبر مظهراً من مظاهر هذا الذكاء.

كما أشرح نفسي

يبدو منهج ستروستروب: وصف النتيجة، ثم حل المشكلة، ثم التحليل المستقل من قبل الطالب - هو الأكثر تفكيرًا. لذلك، قررت أن أعتبره كأساس، ولكن أخبره باستخدام مثال أقل تاريخية - مهمة استخلاص "جدول المحتويات". إنها تشكل مرساة يمكن التعرف عليها بحيث يمكنك بعد ذلك أن تقول "تذكر المهمة المتعلقة بجدول المحتويات" وحتى يتذكر الطلاب هذا بالضبط. في المثال الخاص بي، حاولت منع اثنين آخرين من المفاهيم الخاطئة الأكثر شيوعًا. بعد ذلك سأكتب عنهم بمزيد من التفصيل.

في هذه المهمة، نتعرف على تقنيات حل المشكلات المعقدة. يجب أن يكون القرار الأولي بدائيًا وبسيطًا. حسنًا، إذن يمكنك التفكير في كيفية تحسين هذا الحل.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

وفقا لملاحظاتي، فإن نهج "القالب - المثال - النتيجة" في مجموعات مختلفة لا يزال يؤدي إلى حقيقة أن الطلاب ينظرون إلى الدورة باعتبارها الهيروغليفية. وقد تجلى ذلك في حقيقة أنهم لم يفهموا سبب وجود شرط للكتابة هناك، وكيفية الاختيار بين i++ وi — وأشياء أخرى تبدو واضحة. لتجنب هذه المفاهيم الخاطئة، يجب أن يؤكد النهج المتبع في الحديث عن الدورات على معنى تكرار الإجراءات المتماثلة ثم إضفاء الطابع الرسمي عليها باستخدام البنية. لذلك، قبل إعطاء بناء جملة الحلقة، تحتاج إلى حل المشكلة وجهاً لوجه. يبدو الحل البدائي لمشكلة جدول المحتويات كما يلي:

Console.WriteLine("Введение");
Console.WriteLine("Глава 1");
Console.WriteLine("Глава 2");
Console.WriteLine("Глава 3");
Console.WriteLine("Глава 4");
Console.WriteLine("Глава 5");
Console.WriteLine("Глава 6");
Console.WriteLine("Глава 7");
Console.WriteLine("Заключение");

كيف يمكن تحسينها؟
استبدل الإجراءات الرتيبة بدورة.
ما هي الإجراءات المتكررة على التوالي دون تغييرات؟
لا يوجد شيء في هذا الجزء. ومع ذلك، فإن أوامر عرض كلمة "الفصل" برقم متشابهة جدًا مع بعضها البعض.
ولذلك، فإن الخطوة التالية هي العثور على الفرق بين الأجزاء. في هذه المهمة فقط يكون كل شيء واضحًا، فلن يتم تكرار أوامر واحدة، ولكن مجموعات من التعليمات البرمجية مكونة من 5 أسطر أو أكثر. سيكون عليك البحث ليس فقط في قائمة الأوامر، ولكن أيضًا في إنشاءات التفريع أو الحلقات.
وفي المثال الفرق بين الأوامر هو في الرقم بعد كلمة "فصل".
بمجرد العثور على الفرق، عليك أن تفهم نمط التغيير. الجزء المختلف هو الرقم؟ وهل هي في ازدياد أم في نقصان مستمر؟ كيف تتغير قيمة الرقم بين فريقين جنبا إلى جنب؟
في المثال، الرقم بعد كلمة "فصل" يزيد بزيادات قدرها 1. تم العثور على الفرق، وكشف النمط. يمكنك الآن استبدال الجزء المختلف بمتغير.
تحتاج إلى الإعلان عن مثل هذا المتغير قبل الجزء الأول من الأجزاء المتكررة. يُطلق على هذا المتغير عادة اسم I أو j أو اسم أكثر تفصيلاً. ويجب أن تكون قيمتها الأولية مساوية للقيمة الأولى المعروضة على الشاشة. في المثال، القيمة الأولى هي 1.
ما القيمة الأولية التي يجب أخذها لعرض سلسلة الأرقام "100، 101، 102، 103، 104، 105"؟
الرقم الأول في هذه السلسلة هو 100.
بعد كل أمر إخراج، تحتاج إلى زيادة قيمة هذا المتغير بمقدار 1. هذه الوحدة هي خطوة التغيير.
ما هي الخطوة التي ستكون في سلسلة الأرقام "100، 102، 104، 106"؟
الخطوة 2 في هذا الصف.
بعد استبدال الجزء المختلف بمتغير، سيبدو الكود كما يلي:

Console.WriteLine("Введение");
int i;
i = 0;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Глава " + i);
i = i + 1;
Console.WriteLine("Заключение");

بعد تطبيق تقنية "التعبير عن نمط المتغير" في الكود، تحصل على عدة مجموعات من الإجراءات المتطابقة التي تتم على التوالي. الآن يمكن استبدال الإجراءات المتكررة بدورة.

يتكون تسلسل حل المشكلة التي تحتاج إلى استخدام الحلقات من الخطوات التالية:

  1. قم بحل المشكلة "وجهاً لوجه" باستخدام العديد من الأوامر المنفصلة
  2. ابحث عن نمط
  3. التعبير عن نمط المتغير
  4. ترتيب كدورة

بعد ذلك، يتم إدخال مصطلحات جديدة حتى لا يجد الطالب نفسه في موقف "أنا أفهم كل شيء، لكن لا أستطيع أن أقول ذلك":
— العداد هو دائمًا متغير مطلوب لتتبع عدد الخطوات في الحلقة. عادةً ما يكون عددًا صحيحًا يتم مقارنته بالقيد.
— الخطوة المضادة — وصف نمط التغييرات المضادة.
- القيد - رقم أو متغير يتم مقارنة العداد به بحيث تكون الخوارزمية نهائية. تتغير قيمة العداد لتقترب من الحد الأقصى.
— نص الحلقة — مجموعة من الأوامر التي سيتم تكرارها. عندما يقولون "الأمر مكتوب داخل حلقة"، فإنهم يقصدون الجسم.
- تكرار الحلقة - تنفيذ جسم الحلقة لمرة واحدة.
— حالة الحلقة — تعبير منطقي يحدد ما إذا كان سيتم تنفيذ تكرار آخر. (قد يكون هناك ارتباك مع الهياكل المتفرعة هنا)
يجب أن تكون مستعدًا لحقيقة أن الطلاب في البداية سيستخدمون المصطلحات لأغراض أخرى. وهذا ينطبق على كل من القوي والضعيف. إنشاء لغة مشتركة هو فن. سأكتب الآن بإيجاز: تحتاج إلى تعيين المهمة "تسليط الضوء على جزء التعليمات البرمجية باستخدام <term>" واستخدام هذه المصطلحات بنفسك بشكل صحيح في المحادثة.
بعد التحويل بحلقة، يتم الحصول على الجزء:

Console.WriteLine("Введение");
int i = 0;
while (i < 7) {
    Console.WriteLine("Глава " + i);
    i = i + 1;
}
Console.WriteLine("Заключение");

المفهوم الخاطئ الرئيسي

أحد المفاهيم الخاطئة الشائعة بين الطلاب هو أنهم يقومون بإجراءات داخل حلقة يجب القيام بها مرة واحدة فقط. على سبيل المثال مثل هذا:

;
int i = 0;
while (i < 7) {
    Console.WriteLine("Введение")
    Console.WriteLine("Глава " + i);
    i = i + 1;
    Console.WriteLine("Заключение");
}

يواجه الطلاب هذه المشكلة طوال الوقت، سواء في البداية أو في المشكلات الأكثر تعقيدًا.
التلميح الرئيسي في هذه الحالة:

كم مرة يجب أن تكرر الأمر: مرة واحدة أم عدة مرات؟

أوامر طباعة الكلمات "مقدمة" و"خاتمة" وإعلان وتهيئة المتغير i ليست مثل الإجراءات المتكررة الأخرى. يتم تنفيذها مرة واحدة فقط، مما يعني أنه يجب كتابتها خارج نص الحلقة.

يجب أن تظل المراحل الثلاث للحل موجودة في الكود حتى تتمكن من الرجوع إليها لاحقًا في حالة وجود صعوبات. يكفي التعليق على الخيارين الأولين حتى لا يتدخلا.
وينبغي لفت انتباه الطالب إلى الحقائق التالية:
- في حالة الحلقة، عادة ما تتم مقارنة العداد والحد. يمكن أن يتغير العداد في جسم الحلقة، لكن لا يمكن أن يتغير الحد. لكسر هذه القاعدة، عليك صياغة أسباب مقنعة.
- أوامر عرض الكلمتين "مقدمة" و"خاتمة" موجودة خارج جسم الحلقة. نحن بحاجة لأداء لهم 1 مرة. "مقدمة" - قبل تكرار الإجراءات، "الخاتمة" - بعد.
في عملية توحيد هذا الموضوع، وإتقان المواضيع التالية، وكذلك التعامل مع الصعوبات، من المفيد حتى للطلاب الأقوياء طرح السؤال: "كم مرة يجب تنفيذ هذا الإجراء؟ واحد أم كثير؟

تطوير مهارات إضافية

وفي عملية دراسة الدورات، ينمي الطلاب أيضًا مهارة تشخيص المشكلات وحلها. لإجراء التشخيص، يحتاج الطالب إلى تقديم النتيجة المرجوة ومقارنتها بالنتيجة الفعلية. الإجراءات التصحيحية تعتمد على الفرق بينهما.
وبما أن الطلاب في هذه المرحلة لا يزال لديهم فكرة قليلة عن النتيجة "المرغوبة"، فيمكنهم التركيز على بيانات الاختبار. كقاعدة عامة، لا أحد في هذه المرحلة يفهم حتى الآن ما يمكن أن يحدث من خطأ وكيفية التعامل معه. لذلك أكتب في دفتر ملاحظات وصفًا للمشكلات النموذجية وعدة طرق لحلها. اختيار الأنسب هو مهمة الطالب نفسه.
هناك حاجة إلى سجل للسؤال "هل حدث ما كان متوقعًا؟"، "أي من هذه المواقف حدث الآن؟"، "هل ساعد الحل المطبق؟"

  1. عدد الإجراءات هو 1 أقل أو أكثر من المتوقع. حلول:
    - زيادة القيمة الأولية للعداد بمقدار 1.
    - استبدل عامل المقارنة الصارم (< أو >) بعامل غير صارم (<= أو >=).
    - قم بتغيير قيمة الحد إلى 1.
  2. يتم تنفيذ الإجراءات في الحلقة دون توقف، إلى أجل غير مسمى. حلول:
    - أضف أمر تغيير العداد إذا كان مفقودًا.
    - إصلاح أمر تغيير العداد بحيث تصبح قيمته أقرب إلى الحد الأقصى.
    — قم بإزالة أمر تغيير القيد إذا كان موجودًا في نص الحلقة.
  3. عدد الإجراءات في الحلقة أقل أو أكثر من المتوقع بأكثر من 1. لم يتم تنفيذ الإجراء في الحلقة ولو مرة واحدة. تحتاج أولاً إلى معرفة القيم الفعلية للمتغيرات قبل بدء الحلقة مباشرةً. حلول:
    - تغيير القيمة الأولية للقيد
    - تغيير القيمة الأولية للعداد

تتضمن المشكلة 3 عادةً استخدام المتغير الخاطئ أو عدم إعادة ضبط العداد إلى الصفر.

بعد هذا الشرح، قد لا يزال لدى الطالب العديد من المفاهيم الخاطئة حول كيفية عمل الحلقات.
لتبديد المهام الأكثر شيوعًا، أقدم لك المهام التالية:

  1. يتم فيها إدخال الحد أو قيمة العداد الأولية أو خطوة العداد من قبل المستخدم.
  2. حيث يجب استخدام قيمة العداد في بعض التعبيرات الحسابية. ومن المستحسن استخدام العداد في التعبير الجذري أو في المقام بحيث يكون الفرق غير خطي.
  3. حيث لا يتم عرض قيمة العداد على الشاشة أثناء تشغيل الحلقة. على سبيل المثال، عرض العدد المطلوب من أجزاء النص المتطابقة أو رسم شكل برسومات السلحفاة.
  4. حيث تحتاج إلى تنفيذ بعض الإجراءات المتكررة أولاً، ثم غيرها.
  5. حيث تحتاج إلى تنفيذ إجراءات أخرى قبل التكرار وبعده

لكل مهمة تحتاج إلى توفير بيانات الاختبار والنتيجة المتوقعة.

لفهم مدى سرعة التحرك، عليك أن تقرأ شروط هذه المشاكل وتسأل: "كيف تختلف عن المثال؟"، "ما الذي يجب تغييره في المثال لحلها؟" إذا أجاب الطالب بشكل هادف، فدعه يحل واحدة على الأقل في الفصل، والباقي في المنزل بمفرده. إذا نجح الحل، فيمكننا البدء في شرح الظروف داخل الحلقات.
إذا كانت لديك مشاكل في حل المشكلات بنفسك، فأنت بحاجة إلى حل كل شيء في الفصل. لتجنب حل المشكلة التي تذكرنا برسم بومة، أوصي أولاً بحل المشكلة بطريقة غير عالمية. أي أن الحل يجتاز الاختبار الأول ولا يستخدم بناء الحلقة. حسنًا، قم بتطبيق التحويلات لتحقيق عالمية الحل.

الحلقات والفروع

وفي رأيي أنه من المفيد أن نتناول موضوع "الدورات داخل الفروع" بشكل منفصل. بحيث يمكنك لاحقًا رؤية الفرق بين التحقق من الشرط عدة مرات والتحقق منه مرة واحدة.
ستكون مهام الدمج تتعلق بإخراج الأرقام من A إلى B، والتي يتم إدخالها بواسطة المستخدم:
- دائما بترتيب تصاعدي.
- تصاعدي أو تنازلي حسب قيم A و B.

يجب نقل موضوع "التفرع داخل الحلقات" فقط بعد أن يتقن الطالب التقنيات: "استبدال النمط بمتغير" و"استبدال الإجراءات المتكررة بدورة".
السبب الرئيسي لاستخدام الفروع داخل الحلقات هو وجود حالات شاذة في النمط. في المنتصف ينكسر اعتمادًا على البيانات الأولية.
بالنسبة لأولئك الطلاب القادرين على البحث عن حل من خلال الجمع بين التقنيات البسيطة، يكفي أن نقول "يمكن كتابة التفريع داخل الحلقات" وإعطاء المشكلة "على سبيل المثال" بالكامل لحلها بشكل مستقل.
مهمة المثال:

يقوم المستخدم بإدخال الرقم X. قم بعرض الأرقام من 0 إلى 9 في عمود ووضع علامة "+" مقابل الرقم الذي يساوي X.

إذا تم إدخال 00+
1
2
3
4
5
6
7
8
9

إذا تم إدخال 60
1
2
3
4
5
6+
7
8
9

إذا تم إدخال 90
1
2
3
4
5
6
7
8
9+

إذا تم إدخال 7770
1
2
3
4
5
6
7
8
9

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

string temp;
temp = Console.ReadLine();
int x;
x = int.Parse(temp);
if (x==0) {
    Console.WriteLine(0 + "+");
} else {
    Console.WriteLine(0);
}
if (x==1) {
    Console.WriteLine(1 + "+");
} else {
    Console.WriteLine(1);
}
if (x==2) {
    Console.WriteLine(2 + "+");
} else {
    Console.WriteLine(2);
}
if (x==3) {
    Console.WriteLine(3 + "+");
} else {
    Console.WriteLine(3);
}
if (x==4) {
    Console.WriteLine(4 + "+");
} else {
    Console.WriteLine(4);
}
if (x==5) {
    Console.WriteLine(5 + "+");
} else {
    Console.WriteLine(5);
}
if (x==6) {
    Console.WriteLine(6 + "+");
} else {
    Console.WriteLine(6);
}
if (x==7) {
    Console.WriteLine(7 + "+");
} else {
    Console.WriteLine(7);
}
if (x==8) {
    Console.WriteLine(8 + "+");
} else {
    Console.WriteLine(8);
}
if (x==9) {
    Console.WriteLine(9 + "+");
} else {
    Console.WriteLine(9);
}

ممكن

string temp;
temp = Console.ReadLine();
int x;
x = int.Parse(temp);
if (x==0) {
    Console.WriteLine("0+n1n2n3n4n5n6n7n8n9");
}
if (x==1) {
    Console.WriteLine("0n1+n2n3n4n5n6n7n8n9");
}
if (x==2) {
    Console.WriteLine("0n1n2+n3n4n5n6n7n8n9");
}
if (x==3) {
    Console.WriteLine("0n1n2n3+n4n5n6n7n8n9");
}
if (x==4) {
    Console.WriteLine("0n1n2n3n4+n5n6n7n8n9");
}
if (x==5) {
    Console.WriteLine("0n1n2n3n4n5+n6n7n8n9");
}
if (x==6) {
    Console.WriteLine("0n1n2n3n4n5n6+n7n8n9");
}
if (x==7) {
    Console.WriteLine("0n1n2n3n4n5n6n7+n8n9");
}
if (x==8) {
    Console.WriteLine("0n1n2n3n4n5n6n7n8+n9");
}
if (x==9) {
    Console.WriteLine("0n1n2n3n4n5n6n7n8n9+");
}

أقوم بمهمة مماثلة مقدمًا أثناء دراسة موضوع التفرع.
إذا توصل الطالب إلى خيار "ممكن"، فأنت بحاجة إلى إخباره أنه يمكن أن يكون هناك العديد من الحلول لنفس المشكلة. ومع ذلك، فإنها تختلف في مقاومتها للتغيرات في المتطلبات. اطرح السؤال: "كم عدد الأماكن في الكود التي يجب تصحيحها إذا اضطررت إلى إضافة رقم آخر؟" في النسخة "المحتملة"، ستحتاج إلى إضافة فرع آخر وإضافة رقم جديد في 10 أماكن أخرى. في "المطلوب" يكفي إضافة فرع واحد فقط.
قم بتعيين المهمة لإعادة إنتاج الخيار "المطلوب"، ثم ابحث عن نمط في الكود، وقم بإجراء استبدال متغير واكتب حلقة.
إذا كانت لديك فكرة عن كيفية حل هذه المشكلة بدون حلقة بطريقة أخرى، يرجى كتابتها في التعليقات.

حلقات داخل حلقات

في هذا الموضوع عليك الانتباه إلى ما يلي:
- يجب أن تكون عدادات الحلقات الداخلية والخارجية بمتغيرات مختلفة.
— يجب إعادة ضبط عداد الحلقة الداخلية عدة مرات (أي في جسم الحلقة الخارجية).
— في مهام إخراج النص، لا يمكنك أولاً كتابة حرف واحد في عدة أسطر ثم الحرف الثاني. يجب عليك أولاً طباعة جميع حروف السطر الأول، ثم جميع حروف الثاني، وهكذا.

من الأفضل أن نبدأ بشرح موضوع الحلقات داخل الحلقات من خلال شرح أهمية إعادة العداد إلى الصفر.
مهمة المثال:

يقوم المستخدم بإدخال رقمين: R وT. قم بطباعة سطرين من الأحرف "#". يجب أن يحتوي السطر الأول على أحرف R. السطر الثاني يحتوي على قطع T. إذا كان أي رقم سلبيا، قم بعرض رسالة خطأ.

ص=5، ت=11#####
###########

ص=20، ت=3####################
# # #

ص=-1، ت=6يجب أن تكون قيمة R غير سالبة

ص = 6، تي = -2يجب أن تكون قيمة T غير سالبة

من الواضح أن هذه المشكلة لها أيضًا حلان على الأقل.
مرغوب

string temp;
int R;
int T;
temp = Console.ReadLine();
R = int.Parse(temp);
temp = Console.ReadLine();
T = int.Parse(temp);
int i = 0;
while (i < R)
{
    Console.Write("#");
    i = i + 1;
}
Console.WriteLine();
i = 0;
while (i < T)
{
    Console.Write("#");
    i = i + 1;
}

ممكن رقم 1

string temp;
int R;
int T;
temp = Console.ReadLine();
R = int.Parse(temp);
temp = Console.ReadLine();
T = int.Parse(temp);
int i = 0;
while (i < R)
{
    Console.Write("#");
    i = i + 1;
}
Console.WriteLine();
int j = 0;
j = 0;
while (j < T)
{
    Console.Write("#");
    j = j + 1;
}

الفرق هو أنه في الحل "المحتمل"، تم استخدام متغير ثانٍ لإخراج السطر الثاني. يجب عليك الإصرار على استخدام نفس المتغير لكلا الحلقتين. يمكن تبرير هذا القيد بحقيقة أن الحل الذي يحتوي على عداد واحد لدورتين سيكون بمثابة توضيح لمصطلح "إعادة ضبط العداد". إن فهم هذا المصطلح ضروري عند حل المشكلات التالية. كحل وسط، يمكنك حفظ كلا الحلين للمشكلة.

تظهر مشكلة نموذجية عند استخدام متغير عداد واحد لحلقتين كما يلي:
ص=5، ت=11#####
######

عدد الأحرف في السطر الثاني لا يتوافق مع قيمة T. إذا كنت بحاجة إلى مساعدة في هذه المشكلة، فأنت بحاجة إلى النظر في الملاحظات حول المشاكل النموذجية مع الحلقات. وهذا هو العرض رقم 3. يتم تشخيصه إذا قمت بإضافة مخرجات قيمة العداد مباشرة قبل الدورة الثانية. تم تصحيحه عن طريق إعادة تعيين. لكن من الأفضل عدم قول هذا على الفور. يجب على الطالب أن يحاول صياغة فرضية واحدة على الأقل.

هناك، بالطبع، حل آخر. لكني لم أره بين الطلاب قط. في مرحلة دراسة الدورات، فإن القصة حولها سوف تصرف الانتباه. يمكنك العودة إليها لاحقًا عند التعرف على وظائف السلسلة.
ممكن رقم 2

string temp;
int R;
int T;
temp = Console.ReadLine();
R = int.Parse(temp);
temp = Console.ReadLine();
T = int.Parse(temp);
Console.WriteLine(new String('#', R));
Console.WriteLine(new String('#', T));

المهمة المطلوبة التالية:

قم بعرض الأرقام من 0 إلى 9. يجب أن يكون كل رقم في سطر خاص به. يتم إدخال عدد الأرقام في السطر (W) من لوحة المفاتيح.

ث = 10
1
2
3
4
5
6
7
8
9

ث = 100000000000
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999

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

شكرًا لكم على اهتمامكم. لايك واشتراك في القناة.

ملاحظة: إذا وجدت أخطاء مطبعية أو أخطاء في النص، واسمحوا لي أن أعرف. ويمكن القيام بذلك عن طريق تحديد جزء من النص والضغط على "⌘ + Enter" على نظام Mac، و"Ctrl / Enter" على لوحات المفاتيح الكلاسيكية، أو من خلال الرسائل الخاصة. إذا لم تكن هذه الخيارات متاحة، فاكتب عن الأخطاء في التعليقات. شكرًا لك!

يمكن للمستخدمين المسجلين فقط المشاركة في الاستطلاع. تسجيل الدخول، من فضلك.

استطلاع للقراء دون الكرمة

  • 20,0%أقوم بالتدريس بشكل احترافي، +12

  • 10,0%أقوم بالتدريس بشكل احترافي، -11

  • 70,0%أنا لا أدرس، +17

  • 0,0%أنا لا أدرس، -10

  • 0,0%أخرى (0

صوت 10 مستخدمين. امتنع 5 مستخدما عن التصويت.

المصدر: www.habr.com

إضافة تعليق