Како научити како да превазиђете потешкоће, а да у исто време пишете циклусе

Упркос чињеници да ћемо говорити о једној од основних тема, овај чланак је написан за искусне професионалце. Циљ је показати какве заблуде имају почетници у програмирању. За програмере који се баве вежбањем, ови проблеми су одавно решени, заборављени или уопште нису примећени. Чланак може бити од користи ако вам изненада треба помоћи некоме са овом темом. У чланку се повлаче паралеле са материјалом из различитих књига о програмирању Шилд, Строуструп, Окулов.

Тема о циклусима је изабрана јер је доста људи искључено из ње приликом савладавања програмирања.

Ова техника је дизајнирана за слабе ученике. По правилу, јаки људи се не заглављују на овој теми и нема потребе за смишљањем посебних техника за њих. Секундарни циљ чланка је да се ова техника премести са часа „радови за све ученике, али само једног наставника” у час „радови за све ученике, све наставнике”. Не тражим апсолутну оригиналност. Ако већ користите сличну методологију за предавање ове теме, напишите по чему се ваша верзија разликује. Ако одлучите да га користите, реците нам како је прошло. Ако је слична техника описана у књизи, напишите име.


Радио сам на овој техници 4 године, индивидуално проучавајући са студентима различитих нивоа обуке. Укупно има око педесет ученика и две хиљаде часова наставе. У почетку су студенти увек заглавили на овој теми и одлазили. Након сваког ученика прилагођавала се методологија и материјали. Током протекле године, студенти више нису били заглављени на овој теми, па сам одлучио да поделим своја сазнања.

Зашто толико писама? Циклуси су тако елементарни!

Као што сам горе написао, за програмере који вежбају и за јаке студенте, сложеност концепта петљи може бити потцењена. На пример, можете одржати дуго предавање, видети климаве главе и интелигентне очи. Али када покушавате да решите било који проблем, почиње омамљеност и необјашњиви проблеми. После предавања студенти су вероватно имали само делимично разумевање. Ситуацију отежава чињеница да сами студенти не могу да се изјасне шта је тачно њихова заблуда.
Једног дана сам схватио да студенти моје примере доживљавају као хијероглифе. Односно, као недељиви делови текста у које треба да додате неко „магично“ слово и успеће.
Понекад сам приметио да ученици мисле да је за решавање одређеног проблема потребно нешто друго дизајн који још увек нисам покрио. Иако је решење захтевало само незнатну модификацију примера.

Тако сам дошао на идеју да фокус не треба да буде на синтакси израза, већ на идеји рефакторисања кода који се понавља помоћу петљи. Када ученици савладају ову идеју, било која синтакса се може побољшати уз мало вежбе.

Ко и зашто предајем?

Пошто нема пријемних испита, у наставу се могу укључити и јаки и врло слаби ученици. Више о мојим ученицима можете прочитати у чланку Портрет студената вечерњег курса
Трудио сам се да сви који желе да уче програмирање могу да га науче.
Моји часови се одржавају индивидуално и за сваки ученик плаћа свој новац. Чини се да ће студенти оптимизовати трошкове и захтевати минимум. Међутим, људи иду на часове лицем у лице са живим наставником не због самог знања, већ због поверења у оно што су научили, због осећаја напретка и одобрења стручњака (наставника). Ако ученици не осете напредак у учењу, отићи ће. Уопштено говорећи, часови се могу структурирати тако да ученици осете напредак у повећању броја познатих структура. Односно, прво учимо док детаљно, па учимо за, онда радимо док, и сада имамо спремну хиљаду и један ноћни курс у којем се два месеца изучавају само циклуси, а на крају – студент који је писао стандардна библиотека под диктатом. Међутим, да бисте решили практичне проблеме, потребно је не само познавање материјала, већ и самосталност у његовој примени и тражењу нових информација. Стога, за курсеве лицем у лице, мислим да је исправан принцип да се предаје минимум и подстиче самостално проучавање нијанси и сродних тема. У теми о петљи, сматрам конструкцију вхиле минималном. Из тога можете разумети принцип. Познавајући принцип, можете савладати и за себе и за себе.

Да би слаби ученици савладали градиво, описивање синтаксе није довољно. Потребно је дати једноставније, али разноврсније задатке и детаљније описати примере. На крају крајева, брзина развоја је ограничена способношћу ученика да трансформише изразе и тражи обрасце. За паметне ученике, већина задатака ће бити досадна. Када учите са њима, не морате да инсистирате на решавању 100% проблема. Мој материјал се може погледати на мој гитхуб. Истина, складиште више личи на гримоар чаробњака - нико осим мене неће разумети шта је где, а ако не прођете проверу, можете полудети

Методологија је оријентисана на праксу

Теорија је објашњена на примеру решавања задатка. На часовима основа програмирања где се подучавају гране и петље, једноставно није могуће одржати корисно предавање на једну тему током читавог сата. За објашњење концепта довољно је 15-20 минута. Главне потешкоће настају приликом обављања практичних задатака.
Наставници почетници могу да разбију операторе, гране, петље и низове у једном предавању. Али њихови ученици ће се суочити са проблемом асимилације ових информација.
Неопходно је не само испричати материјал, већ и осигурати да га слушаоци разумеју.

Чињеница савладавања теме одређује се тиме како се ученик сналази у самосталном раду.
Ако је ученик успео да реши задатак на тему без помоћи наставника, онда је тема савладана. Да би се обезбедило самотестирање, сваки задатак је описан у табели са сценаријима тестирања. Задаци имају јасан редослед. Прескакање задатака се не препоручује. Ако је тренутни задатак превише тежак, онда је прелазак на следећи бескорисно. Још је компликованије. Да би ученик савладао тренутни сложени задатак, објашњава му се неколико техника на примеру првог задатка. Заправо, читав садржај теме своди се на технике за превазилажење потешкоћа. Циклуси су више нежељени ефекат.

Први задатак је увек пример. Други се мало разликује и изводи се „самостално“ одмах након првог под надзором наставника. Сви наредни задаци имају за циљ обраћање пажње на разне ситнице које могу изазвати заблуде.

Објашњење примера је дијалог у коме ученик треба да позове пропагацију и унакрсну проверу да би се уверио да је савладао део материјала.

Бићу баналан и рећи да је први пример на тему веома важан. Ако имате материјал за обимни самостални рад, пропусти из првог примера се могу исправити. Ако осим примера нема ништа друго, онда ученик највероватније неће савладати тему.

Док или за?

Једно од контроверзних питања је избор конструкције за пример: док или за. Једном, мој пријатељ програмер који се бави вежбањем, без искуства у подучавању, провео је сат времена убеђујући ме да је фор петљу најлакше разумети. Аргументи су се сводили на то да је „све у њему јасно и постављено на свом месту“. Међутим, основни узрок потешкоћа за праве почетнике је идеја самог циклуса, а не његовог писања. Ако особа не разуме ову идеју, онда ће имати потешкоћа са синтаксом. Чим се идеја реализује, проблеми дизајна кода нестају сами од себе.

У мојим материјалима, тема петље прати тему гранања. Спољашња сличност иф и вхиле нам омогућава да повучемо директну аналогију: „када је услов у заглављу тачан, тада се извршава тело. Једина посебност циклуса је у томе што се тело извршава много пута.

Мој други аргумент је да вхиле захтева мање форматирања него фор. Мање форматирања значи мање глупих грешака са недостајућим зарезима и заградама. Почетници још нису развили довољно пажње и педантности да аутоматски избегну синтаксичке грешке.
Трећи аргумент се у многим добрим књигама објашњава као први аргумент.

Ако ученик може лако да трансформише изразе, онда можете говорити о за у пролазу. Ученик ће тада изабрати оно што му се највише свиђа. Ако трансформације изазивају потешкоће, онда је боље да не одвлачите пажњу. Нека ученик прво све реши користећи вхиле. Када савладате тему петљи, можете да препишете решења да бисте вежбали претварање вхиле у фор.
Посткондиционе петље су прилично ретка звер. Уопште не трошим време на то. Ако је ученик савладао идеје идентификовања образаца и трансформисања израза, може то да схвати без моје помоћи.

Приликом демонстрирања првог примера јаким ученицима, скрећем пажњу на чињеницу да је у првом примеру важно забележити не само решење, већ и цео ланац радњи које су довеле до резултата. Лењи ученици могу да занемаре писање и копирају само завршни алгоритам. Треба их уверити да ће једног дана пред њима доћи тежак задатак. Да бисте га решили, мораћете да пратите кораке као у овом примеру. Због тога је важно снимити све фазе. У следећим проблемима биће могуће оставити само коначну верзију решења.

Главна идеја аутоматизације је да поверимо рачунару да обавља рутински посао за особу. Једна од основних техника је писање петљи. Користи се када је неколико идентичних понављајућих радњи написано у програму заредом.

Експлицитно је боље него имплицитно

Може изгледати као добра идеја да се иста фраза прикаже више пута у првом задатку који се понавља. На пример:

Ура, ради!
Ура, ради!
Ура, ради!
Ура, ради!
Ура, ради!
Ура, ради!
Ура, ради!
Ура, ради!

Ова опција је лоша јер вредност бројача није видљива у излазу. Ово је проблем за почетнике. Не потцењуј је. У почетку је овај задатак био први, а задатак извођења низа бројева у растућем редоследу био је други. Било је потребно увести додатне појмове „циклус Н пута“ и „циклус од А до Б“, који су у суштини иста ствар. Да не бих стварао непотребне ентитете, одлучио сам да покажем само пример са излазом низа бројева. Мало људи успева да научи да држи шалтер у глави и моделира понашање програма у глави без припреме. Неки ученици се први пут сусрећу са менталним моделирањем на тему циклуса.
После извесног вежбања дајем задатак да поновим исти текст да се самостално реши. Ако прво дате видљиву бројалицу, а затим невидљиву, ученици ће имати мање проблема. Понекад је довољан наговештај „не пиши бројач на екрану“.

Како други то објашњавају?

У већини образовних материјала на Интернету, синтакса циклуса је дата као део „предавања“. На пример, на девелопер.мозилла.орг (тренутно) је описано неколико других конструкција заједно са вхиле петљом. У овом случају, само су сами дизајни дати у облику шаблона. Резултат њиховог лансирања је описан речима, али нема илустрације. По мом мишљењу, такво представљање теме множи корисност оваквих материјала са нулом. Ученик може да препише код и сам га покрене, али му је ипак потребан стандард за поређење. Како можете разумети да је пример исправно преписан ако нема са чиме да упоредите резултат?
Када се да само шаблон, без примера, ученику постаје још теже. Како разумети да су фрагменти кода правилно постављени у шаблону? Можете покушати да пишете некако, а затим трчите. Али ако не постоји стандард за упоређивање резултата, ни покретање неће помоћи.

У Ц++ курсу о интуитивном, синтакса петље је закопана на трећој страни предавања 4 на тему „оператори“. Када се објашњава синтакса петљи, посебан акценат је стављен на термин „оператор“. Термин је представљен као скуп чињеница попут „симбол; ово је изјава", "{} је сложена изјава", "тело петље мора бити израз". Не свиђа ми се овај приступ јер изгледа да крије важне односе иза једног термина. Рашчлањивање изворног кода програма у термине на овом нивоу је потребно програмерима компајлера за имплементацију језичке спецификације, али не и студентима као прву апроксимацију. Новопридошлице у програмирању ретко су довољно педантне да обрате тако велику пажњу на термине. То је ретка особа која први пут памти и разуме нове речи. Скоро нико не може правилно да примени термин који је управо научио. Због тога ученици добијају много грешака попут „Писао сам вхиле(а<7);{, али програм не ради.“
По мом мишљењу, на почетку је боље дати синтаксу конструкције одмах са заградама. Опцију без заграда треба објаснити само ако ученик има конкретно питање: „зашто нема заграда и ради“.

У Окуловој књизи из 2012. „Основи програмирања“, увод у петље почиње са фор шаблоном, затим даје препоруке за његову употребу, а затим одмах прелази на експериментални део лекције. Разумем да је књига писана за ону мањину врло способних ученика који ретко долазе на моје часове.

У популарним књигама, резултат фрагмената кода је увек написан. На пример, Шилдтово издање „Јава 8. Комплетан водич“ из 2015. Прво се даје шаблон, затим пример програма и одмах после њега - резултат извршења.

Као пример, размотрите петљу вхиле која ради обрнуто
одбројавање почиње од 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

Приступ описа шаблона, примера програма и резултата програма такође се користи у књизи „Јавасцрипт за децу“ и у јс курсу на в3сцхоолс.цом. Формат веб странице чак омогућава да овај пример буде интерактиван.

Строуструпова књига Принципи и пракса коришћења Ц++ из 2016. отишла је још даље. Први корак је да се објасни какав резултат треба да се добије, а затим се приказује текст програма. Штавише, они не узимају само насумични програм као пример, већ дају излет у историју. Ово помаже да се скрене пажња на то: „Види, ово није само неки бескорисни текст. Видите нешто значајно."

Као пример итерације, узмите у обзир први програм који се извршава на машини за складиштење програма (ЕДСАЦ). Написао ју је Дејвид Вилер у рачунарској лабораторији Универзитета Кембриџ, Енглеска, 6. маја 1949. године. Овај програм израчунава и штампа једноставну листу квадрата.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Овде сваки ред садржи број праћен табулатором ('т') и квадратом тог броја. Ц++ верзија овог програма изгледа овако:

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

Занимљиво је да образац синтаксе није описан у овој књизи. Строуструп у приручнику за инструкторе (превод) истиче да поштује интелигенцију својих ученика. Можда се способност да се идентификује образац у неколико примера сматра манифестацијом такве интелигенције.

Како сам објашњавам

Строуструпов приступ: описивање резултата, затим решавање проблема, а затим независна анализа ученика – чини се најсмишљенијим. Стога сам одлучио да то узмем као основу, али да то испричам користећи мање историјски пример - задатак извођења „садржаја“. Формира препознатљиво сидро тако да онда можете да кажете „запамти задатак о садржају“ и да се ученици тачно тога сете. У свом примеру покушао сам да спречим још две најчешће заблуде. Затим ћу писати о њима детаљније.

У овом задатку упознајемо се са техникама решавања сложених проблема. Првобитну одлуку треба донети примитивно и једноставно. Па, онда можете размишљати о томе како да побољшате ово решење.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Према мојим запажањима, приступ „шаблон-пример-резултат” у различитим комбинацијама и даље доводи до тога да ученици циклус доживљавају као хијероглиф. То се манифестовало у томе што нису разумели зашто постоји услов да се тамо пише, како да бирају између и++ и и— и других наизглед очигледних ствари. Да би се избегла ова погрешна схватања, приступ говору о циклусима треба да нагласи значење понављања идентичних радњи и тек онда их формализује помоћу структуре. Стога, пре него што дате синтаксу петље, морате директно да решите проблем. Примитивно решење проблема са садржајем изгледа овако:

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. Разлика је пронађена, образац је откривен. Сада можете заменити различити фрагмент променљивом.
Такву променљиву треба да декларишете пре првог фрагмента који се понавља. Таква варијабла се обично назива И или ј или нешто детаљније. Његова почетна вредност мора бити једнака првој вредности приказаној на екрану. У примеру, прва вредност је 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. Дизајн као циклус

Затим се уводе нови појмови како се ученик не би нашао у ситуацији „Све разумем, али не могу да кажем“:
— бројач је увек променљива која је потребна за праћење броја корака у петљи. Обично цео број који се пореди са ограничењем.
— корак бројача — опис обрасца промена бројача.
- ограничење - број или променљива са којом се упоређује бројач тако да је алгоритам коначан. Вредност бројача се мења да би се приближила граници.
— тело петље — скуп команди које ће се понављати. Када кажу „команда је написана унутар петље“, они мисле на тело.
— итерација петље — једнократно извршавање тела петље.
— услов петље — логички израз који одређује да ли ће се извршити још једна итерација. (Овде може доћи до забуне са структурама гранања)
Морате бити спремни на чињеницу да ће у почетку ученици користити термине у друге сврхе. Ово важи и за јаке и за слабе. Успостављање заједничког језика је уметност. Сада ћу укратко написати: потребно је да поставите задатак „истакните фрагмент кода са <терм>“ и сами правилно користите ове термине у разговору.
Након трансформације са петљом, фрагмент се добија:

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

Ученици се стално сусрећу са овим проблемом, како на почетку тако и код сложенијих задатака.
Кључни савет у овом случају:

Колико пута треба поновити наредбу: једном или више пута?

Команде за штампање речи „Увод“ и „Закључак“ и декларисање и иницијализацију променљиве и нису као друге радње које се понављају. Извршавају се само једном, што значи да их треба написати изван тела петље.

Све три фазе решења треба да остану у коду како бисте се касније могли обратити у случају потешкоћа. Довољно је прокоментарисати прве две опције да се не мешају.
Ученику треба скренути пажњу на следеће чињенице:
— У стању петље обично се пореде бројач и граница. Бројач се може променити у телу петље, али граница не може. Да бисте прекршили ово правило, морате формулисати убедљиве разлоге.
— Команде за приказ речи „Увод“ и „Закључак“ налазе се изван тела петље. Морамо их извести 1 пут. "Увод" - пре понављања радњи, "Закључак" - после.
У процесу консолидације ове теме, савладавања наредних, као и суочавања са тешкоћама, корисно је и за јаке ученике да поставе питање: „Колико пута је потребно извршити ову радњу? Један или више?

Развој додатних вештина

У процесу изучавања циклуса студенти развијају и вештину дијагностиковања и решавања проблема. Да би извршио дијагностику, студент треба да прикаже жељени резултат и упореди га са стварним резултатом. Корективне радње зависе од разлике између њих.
Пошто ученици у овој фази још увек немају појма о „жељеном” резултату, могу се фокусирати на податке теста. По правилу, нико у овој фази још увек не разуме шта може да крене по злу и како да се носи са тим. Зато у свеску записујем опис типичних проблема и неколико начина за њихово решавање. Избор најпогодније је задатак самог ученика.
Потребан је запис за питање „да ли се десило оно што се очекивало?“, „Која се од ових ситуација сада догодила?“, „Да ли је примењено решење помогло?“

  1. Број радњи је 1 мањи или већи од очекиваног. Решења:
    — повећати почетну вредност бројача за 1.
    — замените строги оператор поређења (< или >) нестриктним (<= или >=).
    — промените граничну вредност на 1.
  2. Радње у петљи се изводе без заустављања, неограничено. Решења:
    — додајте команду за промену бројача ако недостаје.
    — поправите команду за промену бројача тако да њена вредност постане ближа граници.
    — уклоните команду за промену ограничења ако се налази у телу петље.
  3. Број акција у петљи је за више од 1 мањи или већи од очекиваног. Акција у петљи није извршена ни једном. Прво морате да сазнате стварне вредности променљивих непосредно пре него што петља почне. Решења:
    — променити почетну вредност ограничења
    — промените почетну вредност бројача

Проблем 3 обично укључује коришћење погрешне променљиве или не ресетовање бројача на нулу.

Након овог објашњења, ученик може и даље имати различите погрешне представе о томе како функционишу петље.
Да бих отклонио оне најчешће, дајем вам следеће задатке:

  1. У који корисник уноси границу, почетну вредност бројача или корак бројача.
  2. У којој се вредност бројача мора користити у неком аритметичком изразу. Препоручљиво је користити бројач у радикалном изразу или у имениоцу тако да разлика буде нелинеарна.
  3. У којој се вредност бројача не приказује на екрану док је петља покренута. На пример, приказивање потребног броја идентичних фрагмената текста или цртање фигуре са графиком корњаче.
  4. У којој морате прво извршити неке радње које се понављају, а затим и друге.
  5. У којој морате извршити друге радње пре и после понављања

За сваки задатак потребно је да наведете податке о тесту и очекивани резултат.

Да бисте разумели колико брзо можете да се крећете, морате да прочитате термине ових проблема и питате: „Како се разликују од примера?“, „Шта треба променити у примеру да бисте их решили?“ Ако ученик смислено одговори, онда нека реши бар једно на часу, а остало код куће сам. Ако је решење успешно, онда можемо почети да објашњавамо услове унутар петљи.
Ако имате проблема да сами решавате проблеме, морате све да прорадите на часу. Да не бисте решили проблем који подсећа на цртање сове, препоручујем да прво решите проблем на неуниверзалан начин. Односно, тако да решење прође први тест и не користи конструкцију петље. Па, онда примените трансформације да бисте постигли универзалност решења.

Петље и гране

По мом мишљењу, корисно је посебно дати тему „циклуси унутар грана“. Тако да касније можете да видите разлику између провере услова више пута и провере једном.
Задаци за консолидацију ће се односити на излаз бројева од А до Б, које уноси корисник:
- увек у растућем редоследу.
- растуће или опадајуће у зависности од вредности А и Б.

Тему „гранања унутар петљи“ треба прећи тек након што ученик савлада технике: „замена шаблона променљивом“ и „замена понављајућих радњи циклусом“.
Главни разлог за коришћење грана унутар петљи су аномалије у шаблону. У средини се ломи у зависности од почетних података.
За оне ученике који су у стању да потраже решење комбиновањем једноставних техника, довољно је рећи „гранање се може писати унутар петљи“ и дати проблем „на пример“ у потпуности за самостално решавање.
Пример задатка:

Корисник уноси број Кс. Прикажите бројеве од 0 до 9 у колони и ставите знак '+' насупрот броја који је једнак Кс.

Ако је унето 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 других места. У „жељено“ довољно је додати само једну грану.
Поставите задатак да репродукујете „жељену“ опцију, затим пронађите образац у коду, извршите замену променљиве и напишите петљу.
Ако имате идеју како да решите овај проблем без петље на неки други начин, напишите у коментарима.

Петље унутар петље

У овој теми морате обратити пажњу на следеће:
— бројачи за унутрашњу и спољашњу петљу морају бити различите променљиве.
— бројач за унутрашњу петљу мора бити ресетован много пута (то јест, у телу спољашње петље).
— у задацима за излаз текста не можете прво написати једно слово у неколико редова, а затим друго. Прво морате одштампати сва слова првог реда, затим сва слова другог и тако даље.

Најбоље је да почнете да објашњавате тему петљи унутар петљи објашњавајући важност ресетовања бројача на нулу.
Пример задатка:

Корисник уноси два броја: Р и Т. Одштампајте два реда знакова "#". Први ред треба да садржи Р знакова. Други ред садржи Т комада. Ако је било који број негативан, прикажите поруку о грешци.

Р=5, Т=11#####
##############

Р=20, Т=3#####################
# # #

Р=-1, Т=6Р вредност мора бити ненегативна

Р=6, Т=-2Т вредност мора бити ненегативна

Очигледно, и овај проблем има најмање два решења.
Пожељно

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#####
######

Број знакова у другом реду не одговара вредности Т. Ако вам је потребна помоћ са овим проблемом, онда треба да погледате напомене о типичним проблемима са петљама. Ово је симптом #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. Сваки број треба да буде у својој линији. Број цифара у реду (В) се уноси са тастатуре.

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

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

Ако је ученик савладао технику замене варијабле, онда ће се прилично брзо снаћи. Могући проблем ће поново бити у ресетовању променљиве. Ако не можете да се носите са трансформацијом, то значи да сте били у журби и да морате да решите једноставније проблеме.

Хвала на пажњи. Лајкујте и претплатите се на канал.

ПС Ако нађете грешке у куцању или грешке у тексту, јавите ми. Ово се може урадити тако што ћете изабрати део текста и притиснути „⌘ + Ентер“ на Мац-у и „Цтрл / Ентер“ на класичним тастатурама или путем приватних порука. Ако ове опције нису доступне, пишите о грешкама у коментарима. Хвала вам!

Само регистровани корисници могу учествовати у анкети. Пријавите се, Добродошао си.

Анкета за читаоце без карме

  • 100%Предајем професионално, +12

  • 100%Предајем професионално, -11

  • 100%Ја не предајем, +17

  • 100%Ја не предајем, -10

  • 100%Отхер0

Гласало је 10 корисника. Уздржано је било 5 корисника.

Извор: ввв.хабр.цом

Додај коментар