چگونه می توان نحوه غلبه بر مشکلات را آموزش داد و در عین حال چرخه نوشت

علیرغم اینکه در مورد یکی از موضوعات اساسی صحبت خواهیم کرد، این مقاله برای متخصصان با تجربه نوشته شده است. هدف این است که نشان دهیم مبتدیان چه تصورات غلطی در برنامه نویسی دارند. برای توسعه دهندگان تمرینی، این مشکلات مدت هاست که حل شده، فراموش شده اند یا اصلا متوجه آن نشده اند. اگر به طور ناگهانی نیاز به کمک به کسی در مورد این موضوع دارید، این مقاله ممکن است مفید باشد. این مقاله با مطالبی از کتاب‌های مختلف برنامه‌نویسی توسط Schildt، Stroustrup، Okulov تشابهاتی دارد.

موضوع چرخه ها به این دلیل انتخاب شد که افراد زیادی هنگام تسلط بر برنامه نویسی از آن حذف می شوند.

این تکنیک برای دانش آموزان ضعیف طراحی شده است. به عنوان یک قاعده، افراد قوی در این موضوع گیر نمی کنند و نیازی به ارائه تکنیک های خاصی برای آنها نیست. هدف ثانویه مقاله انتقال این تکنیک از کلاس "برای همه دانش آموزان کار می کند، اما فقط یک معلم" به کلاس "برای همه دانش آموزان، همه معلمان کار می کند" است. من ادعای اصالت مطلق ندارم. اگر قبلاً از روش مشابهی برای آموزش این مبحث استفاده می کنید، لطفاً تفاوت نسخه خود را بنویسید. اگر تصمیم به استفاده از آن دارید، به ما بگویید که چگونه پیش رفت. اگر تکنیک مشابهی در کتابی توضیح داده شده است، لطفا نام آن را بنویسید.


من به مدت 4 سال روی این تکنیک کار کردم و به صورت انفرادی با دانش آموزان در سطوح مختلف آموزش مطالعه کردم. در مجموع حدود پنجاه دانش آموز و دو هزار ساعت کلاس وجود دارد. در ابتدا دانش آموزان همیشه در این موضوع گیر می کردند و می رفتند. پس از هر دانش آموز، روش و مواد تنظیم شد. در طول سال گذشته، دانش آموزان دیگر در این موضوع گیر نکرده اند، بنابراین تصمیم گرفتم یافته های خود را به اشتراک بگذارم.

چرا این همه نامه؟ چرخه ها خیلی ابتدایی هستند!

همانطور که در بالا نوشتم، برای توسعه دهندگان تمرین کننده و برای دانش آموزان قوی، پیچیدگی مفهوم حلقه ها را می توان دست کم گرفت. به عنوان مثال، می توانید یک سخنرانی طولانی داشته باشید، سرهای تکان دهنده و چشمان هوشمند را ببینید. اما هنگام تلاش برای حل هر مشکلی، گیجی و مشکلات غیر قابل توضیح شروع می شود. پس از سخنرانی، دانشجویان احتمالاً فقط درک جزئی داشتند. وضعیت با این واقعیت بدتر می شود که خود دانش آموزان نمی توانند بیان کنند که توهم آنها دقیقاً چیست.
یک روز متوجه شدم که دانش آموزان نمونه های من را به عنوان هیروگلیف درک می کنند. یعنی مانند تکه‌های متنی تقسیم‌ناپذیر که باید مقداری حرف «جادویی» در آن اضافه کنید و کار خواهد کرد.
گاهی اوقات متوجه شدم که دانش آموزان فکر می کنند که برای حل یک مشکل خاص نیاز دارید یک چیز دیگر طرحی که من هنوز به آن پرداخته ام. اگرچه راه حل فقط به اصلاح جزئی مثال نیاز داشت.

بنابراین من به این ایده رسیدم که تمرکز نباید بر روی نحو عبارات باشد، بلکه باید روی ایده بازگردانی کدهای تکراری با استفاده از حلقه‌ها باشد. هنگامی که دانش آموزان بر این ایده مسلط شدند، هر نحوی را می توان با کمی تمرین بهبود بخشید.

به چه کسی و چرا تدریس کنم؟

از آنجایی که هیچ آزمون ورودی وجود ندارد، کلاس ها می توانند شامل دانش آموزان قوی و بسیار ضعیف باشند. شما می توانید در مورد دانش آموزان من در مقاله بیشتر بخوانید پرتره دانشجویان دوره عصرانه
من سعی کردم اطمینان حاصل کنم که همه کسانی که می خواهند برنامه نویسی یاد بگیرند می توانند آن را یاد بگیرند.
کلاس های من به صورت انفرادی برگزار می شود و دانشجو برای هر کدام پول خود را پرداخت می کند. به نظر می رسد که دانشجویان هزینه ها را بهینه کرده و حداقل ها را مطالبه خواهند کرد. با این حال، افراد نه برای خود دانش، بلکه برای اطمینان از آموخته های خود، برای احساس پیشرفت و برای تایید از متخصص (معلم) به کلاس های حضوری با یک معلم زنده می روند. اگر دانش آموزان در یادگیری خود احساس پیشرفت نکنند، ترک خواهند کرد. به طور کلی می توان کلاس ها را به گونه ای تنظیم کرد که دانش آموزان در افزایش تعداد ساختارهای آشنا احساس پیشرفت کنند. یعنی اول در حالی که با جزئیات مطالعه می کنیم، بعد برای درس می خوانیم، بعد انجام می دهیم، و حالا هزار و یک شب درس آماده داریم که در آن سیکل ها به تنهایی دو ماه مطالعه می شود و در آخر - دانشجویی که نوشت. یک کتابخانه استاندارد تحت دیکته. با این حال، برای حل مشکلات عملی، شما نه تنها به دانش مطالب، بلکه به استقلال در کاربرد آن و جستجوی اطلاعات جدید نیاز دارید. بنابراین برای دوره های حضوری به نظر من اصل صحیح آموزش حداقل ها و تشویق به مطالعه مستقل نکات ظریف و موضوعات مرتبط است. در مبحث حلقه ها ساختار while را حداقل می دانم. شما می توانید اصل را از آن درک کنید. با دانستن این اصل، می توانید هم برای خودتان تسلط پیدا کنید و هم در آن انجام دهید.

برای تسلط بر مطالب توسط دانش آموزان ضعیف، توصیف نحو کافی نیست. لازم است کارهای ساده اما متنوع تری داده شود و نمونه هایی با جزئیات بیشتر توضیح داده شود. در نهایت، سرعت رشد توسط توانایی دانش آموز برای تبدیل عبارات و جستجوی الگوها محدود می شود. برای دانش آموزان باهوش، اکثر تکالیف خسته کننده خواهند بود. هنگام مطالعه با آنها، لازم نیست اصرار بر حل 100٪ مشکلات داشته باشید. مطالب من قابل مشاهده است github من. درست است، مخزن بیشتر شبیه گریمور یک جنگجو است - هیچ کس جز من نمی فهمد کجاست، و اگر چک را شکست دهید، می توانید دیوانه شوید

روش شناسی عمل محور است

این نظریه با استفاده از مثال حل یک مسئله توضیح داده شده است. در کلاس مبانی برنامه نویسی که در آن شاخه ها و حلقه ها آموزش داده می شود، به سادگی نمی توان یک سخنرانی مفید در مورد یک موضوع برای یک ساعت کامل ارائه کرد. 15-20 دقیقه برای توضیح مفهوم کافی است. مشکلات اصلی هنگام انجام وظایف عملی به وجود می آیند.
معلمان مبتدی می توانند عملگرها، شاخه ها، حلقه ها و آرایه ها را در یک سخنرانی به صدا درآورند. اما دانش آموزان آنها با مشکل جذب این اطلاعات روبرو خواهند شد.
نه تنها باید مطالب را گفت، بلکه باید مطمئن شد که شنوندگان آن را درک می کنند.

واقعیت تسلط بر یک موضوع با نحوه کنار آمدن دانش آموز با کار مستقل تعیین می شود.
اگر دانش آموزی بدون کمک معلم توانست مشکلی را در یک موضوع حل کند، آن موضوع تسلط پیدا کرده است. برای اطمینان از خودآزمایی، هر کار در یک جدول با سناریوهای آزمایشی توضیح داده شده است. وظایف دارای نظم مشخصی هستند. رد کردن وظایف توصیه نمی شود. اگر کار فعلی خیلی سخت است، پس رفتن به کار بعدی بی فایده است. حتی پیچیده تر است. برای اینکه دانش آموز بتواند بر کار پیچیده فعلی تسلط پیدا کند، چندین تکنیک با استفاده از مثال مسئله اول برای او توضیح داده می شود. در واقع، کل محتوای موضوع به تکنیک هایی برای غلبه بر مشکلات مربوط می شود. چرخه ها بیشتر یک عارضه جانبی هستند.

اولین کار همیشه یک مثال است. دوم کمی متفاوت است و بلافاصله پس از اولی تحت نظارت یک معلم "مستقل" انجام می شود. تمام کارهای بعدی با هدف توجه به چیزهای کوچک مختلفی است که می تواند باعث تصورات نادرست شود.

توضیح مثال یک گفتگو است که در آن دانش آموز باید انتشار و اعتبارسنجی متقاطع را فراخوانی کند تا مطمئن شود که بر بخشی از مطالب تسلط دارد.

من پیش پا افتاده خواهم گفت و می گویم که اولین مثال در مورد موضوع بسیار مهم است. اگر مطالبی برای کار مستقل گسترده دارید، حذف های مثال اول قابل اصلاح است. اگر غیر از مثال چیز دیگری وجود نداشته باشد، دانش آموز به احتمال زیاد بر موضوع تسلط نخواهد داشت.

در حالی که یا برای؟

یکی از موضوعات بحث برانگیز، انتخاب ساخت و ساز برای مثال است: while یا for. یک بار، یکی از دوستان توسعه‌دهنده من که تجربه تدریس نداشت، یک ساعت مرا متقاعد کرد که ساده‌ترین حلقه برای درک حلقه for است. استدلال‌ها به این نتیجه رسیدند که «هر چیزی در آن واضح است و در جای خود قرار داده شده است». با این حال، علت اصلی مشکلات برای مبتدیان واقعی، ایده خود چرخه است، نه نوشتن آن. اگر شخصی این ایده را درک نکند، در نحو با مشکل مواجه خواهد شد. به محض تحقق ایده، مشکلات طراحی کد خود به خود از بین می روند.

در متریال‌های من، موضوع حلقه‌ها از موضوع شاخه‌بندی پیروی می‌کند. شباهت بیرونی if و while به ما اجازه می دهد تا یک قیاس مستقیم ترسیم کنیم: "وقتی شرط در هدر درست است، بدن اجرا می شود." تنها ویژگی چرخه این است که بدن بارها اجرا می شود.

بحث دوم من این است که while نیاز به قالب بندی کمتری نسبت به for دارد. قالب بندی کمتر به معنای اشتباهات احمقانه کمتر با کاما و پرانتز از دست رفته است. مبتدیان هنوز به اندازه کافی توجه و دقیق نیستند تا به طور خودکار از خطاهای نحوی جلوگیری کنند.
برهان سوم در بسیاری از کتاب های خوب به عنوان برهان اول توضیح داده شده است.

اگر دانش‌آموز بتواند به راحتی عبارات را تغییر دهد، می‌توانید گذرا درباره for صحبت کنید. سپس دانش آموز آنچه را که بیشتر دوست دارد انتخاب می کند. اگر دگرگونی ها باعث ایجاد مشکل می شود، بهتر است توجه خود را منحرف نکنید. اجازه دهید دانش آموز ابتدا همه چیز را با استفاده از while حل کند. پس از تسلط بر مبحث حلقه ها، می توانید راه حل ها را برای تمرین تبدیل در حالی که به for بازنویسی کنید.
حلقه های پس شرط جانوری بسیار کمیاب هستند. من اصلاً برای آن وقت نمی گذارم. اگر دانش‌آموزی بر ایده‌های شناسایی الگوها و تبدیل عبارات تسلط داشته باشد، می‌تواند بدون کمک من آن را بفهمد.

هنگام نشان دادن اولین مثال به دانش آموزان قوی، توجه من را به این واقعیت جلب می کنم که در مثال اول ثبت نه تنها راه حل، بلکه کل زنجیره اقداماتی که منجر به نتیجه شده است نیز مهم است. دانش آموزان تنبل می توانند از نوشتن غافل شوند و فقط الگوریتم نهایی را کپی کنند. آنها باید متقاعد شوند که روزی کار دشواری بر سر راهشان قرار خواهد گرفت. برای حل آن باید مراحلی را مانند این مثال دنبال کنید. به همین دلیل است که ثبت تمام مراحل مهم است. در مشکلات زیر فقط نسخه نهایی راه حل باقی می ماند.

ایده اصلی اتوماسیون این است که ما به یک رایانه واگذار می کنیم تا کارهای معمولی را برای یک فرد انجام دهد. یکی از تکنیک های اساسی نوشتن حلقه ها است. زمانی استفاده می شود که چندین عمل تکراری یکسان در یک برنامه در یک ردیف نوشته شوند.

صریح بهتر از ضمنی است

ممکن است ایده خوبی به نظر برسد که یک عبارت یکسان را چندین بار در اولین کار حلقه نمایش دهید. مثلا:

هورای، کار می کند!
هورای، کار می کند!
هورای، کار می کند!
هورای، کار می کند!
هورای، کار می کند!
هورای، کار می کند!
هورای، کار می کند!
هورای، کار می کند!

این گزینه بد است زیرا مقدار شمارنده در خروجی قابل مشاهده نیست. این یک مشکل برای مبتدیان است. او را دست کم نگیرید در ابتدا این وظیفه اول بود و کار استخراج یک سری اعداد به ترتیب صعودی دوم بود. لازم بود اصطلاحات اضافی "چرخه N بار" و "چرخه از A به B" معرفی شوند که در اصل یک چیز هستند. برای اینکه موجودیت های غیر ضروری ایجاد نکنم، تصمیم گرفتم فقط یک مثال با خروجی یک سری اعداد را نشان دهم. تعداد کمی از مردم موفق می شوند یاد بگیرند که چگونه یک شمارنده را در سر خود نگه دارند و بدون آمادگی از رفتار یک برنامه در سر خود الگوبرداری کنند. برخی از دانش آموزان ابتدا با مدل سازی ذهنی در مبحث چرخه ها مواجه می شوند.
بعد از مدتی تمرین، تکلیف تکرار همان متن را می دهم تا به صورت مستقل حل شود. اگر ابتدا یک شمارنده قابل مشاهده و سپس یک شمارنده نامرئی بدهید، دانش آموزان مشکلات کمتری خواهند داشت. گاهی اوقات تذکر "عدد ننویسید روی صفحه" کافی است.

دیگران چگونه آن را توضیح می دهند؟

در اکثر مطالب آموزشی در اینترنت، نحو چرخه به عنوان بخشی از یک "سخنرانی" ارائه می شود. به عنوان مثال، در developer.mozilla.org (در حال حاضر)، چندین ساختار دیگر همراه با حلقه while شرح داده شده است. در این حالت فقط خود طرح ها به صورت قالب آورده می شوند. نتیجه راه اندازی آنها با کلمات توصیف شده است، اما هیچ تصویری وجود ندارد. به نظر من، چنین ارائه ای از موضوع، مفید بودن چنین مطالبی را در صفر چند برابر می کند. دانش‌آموز می‌تواند کد را بازنویسی کرده و خودش اجرا کند، اما همچنان به یک استاندارد برای مقایسه نیاز دارد. اگر چیزی برای مقایسه نتیجه وجود نداشته باشد چگونه می توانید بفهمید که یک مثال به درستی بازنویسی شده است؟
وقتی فقط یک الگو ارائه می شود، بدون مثال، برای دانش آموز دشوارتر می شود. چگونه بفهمیم که قطعات کد به درستی در قالب قرار گرفته اند؟ می توانید سعی کنید بنویسید به نحوی، و سپس اجرا کنید. اما اگر استانداردی برای مقایسه نتیجه وجود نداشته باشد، راه اندازی نیز کمکی نخواهد کرد.

در دوره C++ در Intuitive، نحو حلقه در صفحه سوم سخنرانی 4 با موضوع "اپراتورها" مدفون شده است. هنگام توضیح نحو حلقه ها، تأکید ویژه ای بر اصطلاح "اپراتور" می شود. این اصطلاح به عنوان مجموعه ای از حقایق مانند "نماد; این یک دستور است، "{} یک دستور مرکب است"، "بدنه حلقه باید یک دستور باشد". من این رویکرد را دوست ندارم زیرا به نظر می رسد روابط مهمی را پشت یک اصطلاح پنهان می کند. تجزیه کد منبع یک برنامه به عبارات در این سطح توسط توسعه دهندگان کامپایلر برای پیاده سازی مشخصات زبان مورد نیاز است، اما نه توسط دانش آموزان به عنوان اولین تقریب. تازه واردان به برنامه نویسی به ندرت آنقدر دقیق هستند که به اصطلاحات توجه زیادی داشته باشند. این فرد نادری است که اولین بار کلمات جدید را به خاطر می آورد و می فهمد. تقریباً هیچ کس نمی تواند اصطلاحی را که تازه یاد گرفته است به درستی به کار ببرد. بنابراین، دانش آموزان خطاهای زیادی مانند "I write while(a<7);{، اما برنامه کار نمی کند، دریافت می کنند.
به نظر من در ابتدا بهتر است دستور ساخت را بلافاصله با پرانتز بیان کنیم. گزینه بدون پرانتز فقط در صورتی باید توضیح داده شود که دانش آموز سوال خاصی داشته باشد: "چرا پرانتز وجود ندارد و کار می کند."

در کتاب Okulov در سال 2012 «مبانی برنامه‌نویسی»، مقدمه‌ای برای حلقه‌ها با الگوی for شروع می‌شود، سپس توصیه‌هایی برای استفاده از آن ارائه می‌کند و بلافاصله به بخش تجربی درس می‌رود. من می دانم که این کتاب برای آن اقلیتی از دانش آموزان بسیار توانا نوشته شده است که به ندرت به کلاس های من می آیند.

در کتاب های رایج همیشه نتیجه قطعات کد نوشته می شود. به عنوان مثال، نسخه 8 "جاوا 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

رویکرد توصیف یک الگو، یک برنامه نمونه و نتیجه برنامه نیز در کتاب جاوا اسکریپت برای کودکان و دوره 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;
    }
}

جالب اینجاست که الگوی نحوی در این کتاب توضیح داده نشده است. Stroustrup در کتابچه راهنمای مربی (ترجمه) تاکید می کند که به هوش دانش آموزان خود احترام می گذارد. شاید توانایی شناسایی یک الگو در چندین مثال، جلوه ای از چنین هوشی تلقی شود.

همانطور که خودم توضیح می دهم

رویکرد استروستروپ: توصیف نتیجه، سپس حل مسئله، و سپس تحلیل مستقل توسط دانش آموز - متفکرانه ترین به نظر می رسد. بنابراین، تصمیم گرفتم آن را به عنوان مبنایی در نظر بگیرم، اما آن را با استفاده از یک مثال کمتر تاریخی بگویم - وظیفه استخراج "فهرست مطالب". این یک لنگر قابل تشخیص را تشکیل می دهد به طوری که می توانید بگویید "تکلیف فهرست مطالب را به خاطر بسپار" و دانش آموزان دقیقاً این را به خاطر بسپارند. در مثال خود، سعی کردم از دو مورد از رایج ترین تصورات غلط جلوگیری کنم. در ادامه در مورد آنها با جزئیات بیشتری خواهم نوشت.

در این کار با تکنیک هایی برای حل مسائل پیچیده آشنا می شویم. تصمیم اولیه باید ابتدایی و ساده باشد. خوب، پس می توانید در مورد چگونگی بهبود این راه حل فکر کنید.
Введение
Глава 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("Заключение");

پس از اعمال تکنیک "express the pattern of a variable" در کد، چندین گروه از اقدامات یکسان را دریافت می کنید که در یک ردیف انجام می شوند. اکنون می توان اقدامات تکراری را با یک حلقه جایگزین کرد.

دنباله حل یک مسئله که در آن باید از حلقه ها استفاده کنید شامل مراحل زیر است:

  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("Заключение");
}

دانش آموزان چه در ابتدا و چه در مسائل پیچیده تر همیشه با این مشکل مواجه می شوند.
نکته کلیدی در این مورد:

چند بار باید این دستور را تکرار کنید: یک بار یا چند بار؟

دستورات چاپ کلمات "Introduction" و "Conclusion" و اعلام و مقداردهی اولیه متغیر i مانند سایر اعمال تکراری نیست. آنها فقط یک بار اجرا می شوند، به این معنی که باید خارج از بدنه حلقه نوشته شوند.

هر سه مرحله حل باید در کد باقی بماند تا در صورت بروز مشکل بتوانید بعداً به آنها مراجعه کنید. کافی است دو گزینه اول را کامنت کنید تا دخالت نکنند.
توجه دانش آموز باید به موارد زیر جلب شود:
- در یک وضعیت حلقه، یک شمارنده و یک حد معمولا با هم مقایسه می شوند. شمارنده می تواند در بدنه حلقه تغییر کند، اما حد نمی تواند. برای شکستن این قانون، باید دلایل قانع کننده ای را بیان کنید.
- دستورات نمایش کلمات "Introduction" و "Conclusion" در خارج از بدنه حلقه قرار دارند. ما باید آنها را 1 بار اجرا کنیم. "مقدمه" - قبل از تکرار اقدامات، "نتیجه گیری" - پس از آن.
در فرآیند تثبیت این مبحث، تسلط بر مطالب بعدی و همچنین مقابله با مشکلات، برای دانش آموزان حتی قوی نیز مفید است که این سوال را مطرح کنند: «اما این عمل چند بار باید انجام شود؟ یکی یا چندتا؟

توسعه مهارت های اضافی

در فرآیند سیکل های مطالعه، دانش آموزان مهارت تشخیص و حل مسائل را نیز توسعه می دهند. برای انجام تشخیص، دانش آموز نیاز به ارائه نتیجه مورد نظر و مقایسه آن با نتیجه واقعی دارد. اقدامات اصلاحی به تفاوت بین آنها بستگی دارد.
از آنجایی که دانش آموزان در این مرحله هنوز ایده کمی از نتیجه "مطلوب" دارند، می توانند روی داده های آزمون تمرکز کنند. به عنوان یک قاعده، هیچ کس در این مرحله هنوز نمی داند چه چیزی ممکن است اشتباه باشد و چگونه با آن برخورد کند. بنابراین، من در یک دفترچه شرحی از مشکلات معمولی و چندین روش برای حل آنها می نویسم. انتخاب مناسب ترین وظیفه خود دانش آموز است.
برای پرسیدن «آیا آنچه انتظار می‌رفت اتفاق افتاد؟»، «کدام یک از این موقعیت‌ها اکنون اتفاق افتاد؟»، «آیا راه‌حل اعمال‌شده کمک کرد؟»، یک رکورد لازم است.

  1. تعداد اقدامات 1 کمتر یا بیشتر از حد انتظار است. راه حل ها:
    - مقدار اولیه شمارنده را 1 افزایش دهید.
    - عملگر مقایسه دقیق (< یا >) را با یک غیر دقیق (<= یا >=) جایگزین کنید.
    - مقدار حد را به 1 تغییر دهید.
  2. اقدامات در یک حلقه بدون توقف، به طور نامحدود انجام می شود. راه حل ها:
    - اگر دستور تغییر شمارنده وجود ندارد، اضافه کنید.
    - دستور تغییر شمارنده را طوری درست کنید که مقدار آن به حد نزدیکتر شود.
    - اگر دستور تغییر محدودیت در بدنه حلقه باشد، حذف کنید.
  3. تعداد اقدامات در یک حلقه بیش از 1 کمتر یا بیشتر از حد انتظار است. عمل در حلقه حتی یک بار هم اجرا نشد. ابتدا باید مقادیر واقعی متغیرها را درست قبل از شروع حلقه پیدا کنید. راه حل ها:
    - مقدار اولیه محدودیت را تغییر دهید
    - مقدار اولیه شمارنده را تغییر دهید

مشکل 3 معمولاً شامل استفاده از متغیر اشتباه یا عدم تنظیم مجدد شمارنده به صفر است.

پس از این توضیح، دانش آموز ممکن است هنوز تصورات غلط مختلفی در مورد نحوه عملکرد حلقه ها داشته باشد.
برای از بین بردن رایج ترین آنها، وظایف زیر را به شما می دهم:

  1. که در آن حد، مقدار شمارنده اولیه یا مرحله شمارنده توسط کاربر وارد می شود.
  2. که در آن مقدار شمارنده باید در برخی از عبارت های حسابی استفاده شود. توصیه می شود از یک شمارنده در عبارت رادیکال یا در مخرج استفاده کنید تا اختلاف غیرخطی باشد.
  3. که در آن مقدار شمارنده در حین اجرای حلقه روی صفحه نمایش داده نمی شود. به عنوان مثال، نمایش تعداد مورد نیاز قطعات متنی یکسان یا ترسیم یک شکل با گرافیک لاک پشت.
  4. که در آن ابتدا باید برخی از اقدامات تکراری و سپس برخی دیگر را انجام دهید.
  5. که در آن باید اقدامات دیگری را قبل و بعد از تکرار انجام دهید

برای هر کار باید داده های تست و نتیجه مورد انتظار را ارائه دهید.

برای درک اینکه چقدر سریع می توانید حرکت کنید، باید شرایط این مشکلات را بخوانید و بپرسید: "چه تفاوتی با مثال دارند؟"، "برای حل آنها چه چیزی باید در مثال تغییر کند؟" اگر دانش آموز معنی دار جواب می دهد، بگذارید حداقل یکی را در کلاس حل کند و بقیه را در خانه خودش حل کند. اگر راه حل موفقیت آمیز باشد، می توانیم شرایط داخل حلقه ها را توضیح دهیم.
اگر در حل مشکلات به تنهایی مشکل دارید، باید در کلاس همه چیز را حل کنید. برای اینکه حل مسئله یادآور ترسیم جغد نباشد، توصیه می‌کنم ابتدا مسئله را به روشی غیرکلی حل کنید. یعنی به طوری که محلول تست اول را پشت سر بگذارد و از ساخت حلقه استفاده نکند. خوب، سپس برای دستیابی به جهانی بودن راه حل، تبدیل ها را اعمال کنید.

حلقه ها و شاخه ها

به نظر من، ارائه موضوع "چرخه های درون شاخه ها" به طور جداگانه مفید است. به طوری که بعداً می توانید تفاوت بین چند بار بررسی یک شرط و یک بار بررسی آن را ببینید.
وظایف تلفیق مربوط به خروجی اعداد از A تا B است که توسط کاربر وارد می شود:
- همیشه به ترتیب صعودی
- صعودی یا نزولی بسته به مقادیر A و B.

موضوع "انشعاب در حلقه ها" باید تنها پس از تسلط دانش آموز بر تکنیک های: "جایگزینی یک الگو با یک متغیر" و "جایگزینی اقدامات تکراری با یک چرخه" منتقل شود.
دلیل اصلی استفاده از شاخه ها در داخل حلقه ها ناهنجاری در الگو است. در وسط بسته به داده های اولیه می شکند.
برای آن دسته از دانش‌آموزانی که می‌توانند با ترکیب تکنیک‌های ساده به دنبال راه‌حل بگردند، کافی است بگوییم «انشع‌بندی را می‌توان در حلقه‌ها نوشت» و مسئله را به‌طور کامل «مثلا» داد تا مستقل حل شود.
نمونه کار:

کاربر عدد X را وارد می کند. اعداد از 0 تا 9 را در یک ستون نمایش داده و در مقابل عددی که برابر با X است علامت '+' قرار دهید.

اگر 0 وارد شد0+
1
2
3
4
5
6
7
8
9

اگر 6 وارد شد0
1
2
3
4
5
6+
7
8
9

اگر 9 وارد شد0
1
2
3
4
5
6
7
8
9+

اگر 777 وارد شد0
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 است. اگر هر عددی منفی است، یک پیغام خطا نمایش دهید.

R=5، T=11#####
#############

R=20، T=3#####################
###

R=-1، T=6مقدار R باید غیر منفی باشد

R=6، T=-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;
}

تفاوت این است که در راه حل "ممکن" از متغیر دوم برای خروجی خط دوم استفاده شده است. شما باید اصرار داشته باشید که از یک متغیر برای هر دو حلقه استفاده کنید. این محدودیت را می توان با این واقعیت توجیه کرد که یک راه حل با یک شمارنده برای دو چرخه، مصداق اصطلاح "بازنشانی شمارنده" خواهد بود. درک این اصطلاح هنگام حل مسائل زیر ضروری است. به عنوان یک مصالحه، می توانید هر دو راه حل را برای مشکل ذخیره کنید.

یک مشکل معمولی با استفاده از یک متغیر شمارنده برای دو حلقه به صورت زیر ظاهر می شود:
R=5، T=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) از صفحه کلید وارد می شود.

W=1،XNUMX،XNUMX،XNUMX0
1
2
3
4
5
6
7
8
9

W=10،XNUMX،XNUMX،XNUMX0000000000
1111111111
2222222222
3333333333
4444444444
5555555555
6666666666
7777777777
8888888888
9999999999

اگر دانش آموزی بر تکنیک جایگزین کردن یک متغیر تسلط داشته باشد ، خیلی سریع با آن کنار می آید. یک مشکل احتمالی دوباره در تنظیم مجدد متغیر خواهد بود. اگر نمی توانید این تحول را مدیریت کنید، به این معنی است که عجله داشتید و باید مشکلات ساده تری را حل کنید.

با تشکر از توجه شما. لایک کنید و در کانال عضو شوید.

PS اگر اشتباهات تایپی یا اشتباهی در متن یافتید، لطفاً به من اطلاع دهید. این را می توان با انتخاب بخشی از متن و فشار دادن "⌘ + Enter" در Mac و "Ctrl / Enter" در صفحه کلیدهای کلاسیک یا از طریق پیام های خصوصی انجام داد. اگر این گزینه ها در دسترس نیستند، در مورد خطاها در نظرات بنویسید. متشکرم!

فقط کاربران ثبت نام شده می توانند در نظرسنجی شرکت کنند. ورود، لطفا.

نظرسنجی برای خوانندگان بدون کارما

  • ٪۱۰۰من به صورت حرفه ای تدریس می کنم +12

  • ٪۱۰۰من به صورت حرفه ای تدریس می کنم، -11

  • ٪۱۰۰من تدریس نمی کنم، +17

  • ٪۱۰۰من تدریس نمی کنم، -10

  • ٪۱۰۰سایر 0

10 کاربر رای دادند. 5 کاربر رای ممتنع دادند.

منبع: www.habr.com

اضافه کردن نظر