Кыйынчылыктарды кантип жеңүүнү үйрөтүү, ошол эле учурда циклдерди жазуу

Биз негизги темалардын бири жөнүндө сөз болгонуна карабастан, бул макала тажрыйбалуу адистер үчүн жазылган. Максаты - жаңы баштагандар программалоодо кандай туура эмес түшүнүктөр бар экенин көрсөтүү. Иштеп жаткан иштеп чыгуучулар үчүн бул көйгөйлөр көптөн бери чечилип, унутулуп калган же такыр байкалбай калган. Эгер күтүлбөгөн жерден бул тема боюнча кимдир бирөө жардам керек болсо, макала пайдалуу болушу мүмкүн. Макалада Шилдттин, Штроуструптун, Окуловдун программалоо боюнча ар кандай китептеринин материалдары менен параллелдер келтирилген.

Программалоону өздөштүрүү учурунда көптөгөн адамдар бул темадан четтетилгендиктен циклдер жөнүндөгү тема тандалган.

Бул ыкма начар студенттер үчүн иштелип чыккан. Эреже катары, күчтүү адамдар бул темада тыгылып калышпайт жана алар үчүн атайын ыкмаларды ойлоп чыгуунун кажети жок. Макаланын экинчи даражадагы максаты – бул ыкманы “бардык окуучулар үчүн иштейт, бирок бир гана мугалим” классынан “бардык окуучулар, бардык мугалимдер үчүн иштейт” классына которуу. Мен абсолюттук оригиналдуулукту талап кылбайм. Эгер сиз бул теманы окутуу үчүн буга чейин окшош методологияны колдонуп жатсаңыз, сиздин версияңыз кандайча айырмаланарын жазыңыз. Эгер сиз аны колдонууну чечсеңиз, анын кандай өткөнүн айтып бериңиз. Окшош техника китепте баяндалган болсо, атын жазыңыз.


Бул техниканын үстүндө 4 жыл иштеп, ар кандай деңгээлдеги студенттер менен жекече окудум. Бардыгы болуп элүүгө жакын студент жана эки миң сааттык сабак бар. Студенттер алгач дайыма бул темага тыгылып, кетип калышчу. Ар бир окуучудан кийин методика жана материалдар оңдолуп турду. Акыркы бир жылда студенттер бул темага такалып калышкан жок, ошондуктан мен өз тыянактарымды бөлүшүүнү чечтим.

Эмне үчүн мынча көп кат? Циклдер абдан жөнөкөй!

Мен жогоруда жазгандай, практикалык иштеп чыгуучулар жана күчтүү студенттер үчүн цикл түшүнүгүнүн татаалдыгын баалабай коюуга болот. Мисалы, сиз узун лекция окуп, баш ийкеп, акылдуу көздөрдү көрө аласыз. Бирок кандайдыр бир көйгөйдү чечүүгө аракет кылганда, акылсыздык жана түшүнүксүз маселелер башталат. Лекциядан кийин студенттер жарым-жартылай гана түшүнүшсө керек. Окуучулардын өздөрүнүн адашуулары эмне экенин ачык айта алышпаганы кырдаалды курчутат.
Бир күнү окуучулар менин мисалдарымды иероглиф катары кабыл алышканын түшүндүм. Башкача айтканда, сиз кандайдыр бир "сыйкырдуу" тамга кошуу керек жана ал иштей турган тексттин бөлүнгүс бөлүктөрү сыяктуу.
Кээде мен студенттер конкреттүү маселени чечүү үчүн керек деп ойлошорун байкадым башка нерсе мен азырынча камтый элек дизайн. Чечим мисалды бир аз гана өзгөртүүнү талап кылса да.

Ошентип, мен басымды туюнтмалардын синтаксисине эмес, циклдердин жардамы менен кайталануучу кодду рефакторациялоо идеясына буруу керек деген ойго келдим. Студенттер бул идеяны өздөштүргөндөн кийин, кандайдыр бир синтаксисти аз машыгуу менен жакшыртса болот.

Кимге жана эмнеге үйрөтөм?

Кирүү экзамендери болбогондуктан, класстарга күчтүү жана өтө начар студенттер да кириши мүмкүн. Окуучуларым тууралуу кененирээк макаладан окуй аласыз Кечки курстун студенттеринин портрети
Мен программалоону үйрөнгүсү келген ар бир адам аны үйрөнө алышы үчүн аракет кылдым.
Сабактарым жеке өткөрүлөт жана ар бири үчүн студент өзү төлөйт. Бул студенттер чыгымдарды оптималдаштыруу жана минималдуу талап кылат окшойт. Бирок, адамдар жандуу мугалим менен бетме-бет сабакка билимдин өзү үчүн эмес, үйрөнгөн нерселерине ишенүү, прогрессти сезүү жана эксперттен (мугалимден) жактыруу үчүн барышат. Студенттер окууда прогрессти сезбесе, алар кетип калышат. Жалпысынан алганда, класстар окуучулар тааныш структуралардын санын көбөйтүүдө прогрессти сезе тургандай түзүлүшү мүмкүн. Тактап айтканда, адегенде деталдуу түрдө окуйбуз, анан окуйбуз, анан жасайбыз, эми мин бир түнкү курсубуз даяр, анда циклдар эки ай бою гана окулат, аягында - жазган студент диктант боюнча стандарттуу китепкана. Бирок практикалык маселелерди чечүү үчүн материалды билүү гана эмес, аны колдонууда жана жаңы маалыматтарды издөөдө өз алдынчалык керек. Ошондуктан, менин оюмча, бетме-бет курстар үчүн минимумдарды үйрөтүү жана нюанстарды жана ага байланыштуу темаларды өз алдынча изилдөөгө түрткү берүү туура принцип. Циклдер темасында мен while конструкциясын минималдуу деп эсептейм. Андан принципти түшүнсө болот. Принципти билүү менен сиз өзүңүз үчүн да, өзүңүз да жасай аласыз.

Окуучулардын материалды өздөштүрүүсүнө жетишүү үчүн синтаксисти сүрөттөп берүү жетишсиз. Жөнөкөй, бирок ар түрдүү тапшырмаларды берип, мисалдарды кененирээк сүрөттөп берүү зарыл. Акыр-аягы, өнүгүү ылдамдыгы окуучунун туюнтмаларды өзгөртүү жана үлгүлөрдү издөө жөндөмү менен чектелет. Акылдуу студенттер үчүн тапшырмалардын көбү кызыксыз болот. Алар менен окуп жатканда, көйгөйлөрдүн 100% чечүүнү талап кылуунун кажети жок. Менин материалымды бул жерден көрүүгө болот менин github. Ырас, репозиторий согушчунун гримуарына окшош - менден башка эч ким эмне экенин түшүнбөйт, эгер текшерүүдөн өтпөй калсаң, жинди болуп калышың мүмкүн.

Методология практикага багытталган

Теория маселени чечүүнүн мисалында түшүндүрүлөт. Тармактар ​​жана циклдер үйрөтүлгөн программалоонун негиздери сабагында бир тема боюнча бир саат бою пайдалуу лекция окуу мүмкүн эмес. Түшүнүктү түшүндүрүү үчүн 15-20 мүнөт жетиштүү. Негизги кыйынчылыктар практикалык тапшырмаларды аткарууда пайда болот.
Жаңы башталгыч мугалимдер бир лекцияда операторлорду, бутактарды, циклдерди жана массивдерди тарсылдата алышат. Бирок алардын окуучулары бул маалыматты өздөштүрүү көйгөйүнө туш болушат.
Материалды айтып гана тим болбостон, угуучулардын түшүнүшүнө да ынануу керек.

Теманы өздөштүрүү фактысы студенттин өз алдынча иштөө менен кандай күрөшөөрү менен аныкталат.
Эгерде окуучу мугалимдин жардамысыз тема боюнча маселени чече алса, анда тема өздөштүрүлгөн болот. Өзүн-өзү текшерүүнү камсыз кылуу үчүн ар бир тапшырма тест сценарийлери менен таблицада сүрөттөлөт. Милдеттердин так тартиби бар. Тапшырмаларды өткөрүп жиберүү сунушталбайт. Эгерде учурдагы тапшырма өтө оор болсо, анда кийинкисине өтүү пайдасыз. Бул андан да татаал. Окуучу учурдагы татаал тапшырманы өздөштүрүү үчүн ага биринчи маселенин мисалында бир нече ыкмалар түшүндүрүлөт. Чындыгында, теманын бүт мазмуну кыйынчылыктарды жеңүү ыкмаларына туура келет. Циклдер терс таасири көбүрөөк.

Биринчи милдет дайыма үлгү болуп саналат. Экинчиси бир аз айырмаланып, биринчиден кийин дароо мугалимдин көзөмөлүндө "өз алдынча" аткарылат. Бардык кийинки милдеттер туура эмес түшүнүктөрдү жаратышы мүмкүн болгон ар кандай майда нерселерге көңүл бурууга багытталган.

Мисалды түшүндүрүү диалог болуп саналат, анда студент материалдын бир бөлүгүн өздөштүргөнүнө ынануу үчүн кайра жайылтуу жана кайчылаш текшерүүнү чакырышы керек.

Мен баналдык болуп, тема боюнча биринчи мисал абдан маанилүү деп айтам. Эгерде сизде кеңири өз алдынча иштөө үчүн материал бар болсо, анда биринчи мисалдагы кемчиликтерди оңдоого болот. Эгерде мисалдан башка эч нерсе жок болсо, анда студент теманы өздөштүрүү мүмкүн эмес.

Качан же үчүн?

Талаштуу маселелердин бири, мисалы үчүн курулуш тандоо болуп саналат: while же for. Бир жолу менин окутуучу тажрыйбасы жок иштеп жаткан иштеп жаткан досум for циклин түшүнүү оңой экенине мени бир саат бою ынандырды. Аргументтер "андагы бардыгы ачык-айкын жана өз ордуна коюлган" дегенге чейин кайнады. Бирок, чыныгы үйрөнчүктөр үчүн кыйынчылыктардын негизги себеби циклдин өзү эмес, анын идеясы болуп саналат. Эгер адам бул ойду түшүнбөсө, анда ал синтаксистен кыйналат. Идея ишке ашар замат, коддуу дизайн көйгөйлөрү өзүнөн өзү жок болот.

Менин материалдарымда укуруктардын темасы бутактануу темасына ылайык келет. If жана while тышкы окшоштугу түз окшоштугун келтирүүгө мүмкүндүк берет: "качан баштагы шарт чын болсо, анда дене аткарылат". Циклдин бирден-бир өзгөчөлүгү - дене көп жолу аткарылат.

Менин экинчи аргументим, ал үчүн форматка караганда азыраак форматтоо талап кылынат. Азыраак форматтоо үтүрлөрдү жана кашааларды жок кылуу менен акылсыз каталарды азайтууну билдирет. Жаңы баштагандар синтаксистик каталарды автоматтык түрдө болтурбоо үчүн жетиштүү кунт коюп, кылдаттыкты өнүктүргөн эмес.
Үчүнчү аргумент көптөгөн жакшы китептерде биринчи аргумент катары түшүндүрүлгөн.

Эгерде студент туюнтмаларды оңой эле өзгөртө алса, анда сиз үчүн өтүүдө сүйлөшө аласыз. Андан кийин окуучу өзүнө эң жакшы жаккан нерсени тандайт. Эгерде трансформациялар кыйынчылыктарды жаратса, анда көңүлүңүздү алаксытпаңыз. Студент адегенде while аркылуу баарын чечсин. Циклдердин темасын өздөштүргөндөн кийин, ал эми for үчүн конвертациялоо үчүн чечимдерди кайра жазсаңыз болот.
Посткондиция циклдери сейрек кездешүүчү жырткыч. Мен ага такыр убакыт коротпойм. Эгерде окуучу үлгүлөрдү аныктоо жана туюнтмаларды өзгөртүү идеяларын өздөштүргөн болсо, ал менин жардамымсыз эле түшүнө алат.

Күчтүү студенттерге биринчи мисалды көрсөтүүдө, мен биринчи мисалда чечимди гана эмес, натыйжага алып келген иш-аракеттердин бардык чынжырын жазуу маанилүү экендигине көңүл бурам. Жалкоо студенттер жазууга көңүл бурбай, акыркы алгоритмди гана көчүрө алышат. Алар бир күнү кыйын иш келерине ишениши керек. Аны чечүү үчүн, бул мисалдагыдай кадамдарды жасашыңыз керек. Ошондуктан бардык этаптарды жазуу маанилүү. Кийинки маселелерде чечимдин акыркы вариантын гана калтырууга болот.

Автоматташтыруунун негизги идеясы - биз компьютерге адамдын күнүмдүк ишин аткарууну тапшырабыз. Негизги ыкмаларынын бири илмек жазуу болуп саналат. Ал программада бир нече окшош кайталануучу аракеттер катарда жазылганда колдонулат.

Ачык айтылганга караганда, ачык айтылган жакшы

Биринчи цикл тапшырмасында бир эле фразаны бир нече жолу көрсөтүү жакшы идея сыяктуу көрүнүшү мүмкүн. Мисалы:

Уррай, иштейт!
Уррай, иштейт!
Уррай, иштейт!
Уррай, иштейт!
Уррай, иштейт!
Уррай, иштейт!
Уррай, иштейт!
Уррай, иштейт!

Бул параметр жаман, анткени эсептегичтин мааниси чыгарылышта көрүнбөйт. Бул үйрөнчүктөр үчүн көйгөй болуп саналат. Аны баалаба. Адегенде бул тапшырма биринчи, ал эми өсүү тартибинде бир катар сандарды чыгаруу тапшырмасы экинчи болгон. «Цикл N жолу» жана «Адан Вге чейин цикл» деген кошумча терминдерди киргизүү зарыл болду, алар негизинен бир эле нерсе. Керексиз объекттерди жаратпоо үчүн, мен бир катар сандарды чыгаруу менен бир гана мисал көрсөтүүнү чечтим. Эч кандай даярдыксыз эле башына эсептегичти кармап, башындагы программанын жүрүм-турумун моделдегенди үйрөнө алгандар аз. Кээ бир студенттер алгач цикл темасында психикалык моделдөө менен кездешет.
Бир аз машыгуудан кийин өз алдынча чечиле турган ошол эле текстти кайталоо тапшырмасын берем. Адегенде көрүнүүчү, анан көрүнбөгөн эсептегичти берсең, анда окуучулардын көйгөйлөрү азыраак болот. Кээде "экранга эсептегичти жазбаңыз" деген ишарат жетиштүү.

Башкалар муну кантип түшүндүрүшөт?

Интернеттеги көпчүлүк окуу материалдарында циклдин синтаксиси “лекциянын” бөлүгү катары берилет. Мисалы, developer.mozilla.org сайтында (учурда) while цикли менен бирге бир нече башка конструкциялар сүрөттөлөт. Бул учурда, үлгүлөр өздөрү гана калыптар түрүндө берилет. Аларды ишке киргизүүнүн натыйжасы сөз менен сүрөттөлөт, бирок эч кандай иллюстрация жок. Менимче, теманын мындай берилиши мындай материалдардын пайдалуулугун нөлгө көбөйтөт. Студент кодду кайра жазып, өзү иштете алат, бирок ага дагы эле салыштыруу үчүн стандарт керек. Натыйжаны салыштыра турган эч нерсе жок болсо, мисалдын туура жазылганын кантип түшүнсө болот?
Үлгү жок калып гана берилсе, окуучуга ого бетер кыйындайт. Код фрагменттери шаблондо туура жайгаштырылганын кантип түшүнүүгө болот? Сиз жазганга аракет кылсаңыз болот кандайдыр бир жол менен, анан чурка. Бирок натыйжаны салыштыруу үчүн стандарт жок болсо, анда ишке киргизүү да жардам бербейт.

Intuitive боюнча C++ курсунда цикл синтаксиси “операторлор” темасындагы 4-лекциянын үчүнчү бетинде көмүлгөн. Циклдердин синтаксисин түшүндүрүүдө «оператор» терминине өзгөчө басым жасалат. Термин «символ» сыяктуу фактылардын жыйындысы катары берилген; бул билдирүү”, “{} – татаал билдирүү”, “циклдин негизги бөлүгү билдирүү болушу керек”. Мага мындай мамиле жакпайт, анткени ал бир терминдин артында маанилүү мамилелерди жашыргандай сезилет. Бул деңгээлдеги терминдерге программанын баштапкы кодун талдоо тил спецификациясын ишке ашыруу үчүн компиляторду иштеп чыгуучуларга керек, бирок студенттерге биринчи жакындоо катары эмес. Программалоого жаңы келгендер сейрек учурларда терминдерге мынчалык кылдаттык менен көңүл бурушат. Жаңы сөздөрдү биринчи жолу эстеп, түшүнгөн сейрек адам. Жаңы эле үйрөнгөн терминди дээрлик эч ким туура колдоно албайт. Ошондуктан, студенттер "Мен while(a<7);{ жаздым, бирок программа иштебей жатат" деген сыяктуу каталарды көп алышат.
Менимче, башында курулуштун синтаксисин кашаа менен дароо берген жакшы. Кашасыз вариант студентте "эмне үчүн кашаа жок жана ал иштейт" деген конкреттүү суроо болгондо гана түшүндүрүлүшү керек.

Окуловдун 2012-жылы чыккан "Программалоонун негиздери" китебинде циклдерге киришүү for үлгүсү менен башталып, андан кийин аны колдонуу боюнча сунуштар берилет, анан дароо сабактын эксперименталдык бөлүмүнө өтөт. Китеп менин сабактарыма сейрек келген өтө жөндөмдүү студенттердин азчылыгы үчүн жазылганын түшүнөм.

Популярдуу китептерде код фрагменттеринин натыйжасы дайыма жазылат. Мисалы, Шилдттин "Java 8. The Complete Guide" 2015-жылдагы чыгарылышы. Биринчиден, шаблон берилет, андан кийин программанын мисалы жана андан кийин дароо - аткаруунун натыйжасы.

Мисал катары, тескерисинче кылган 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” китебинде жана w3schools.com сайтындагы js курсунда да колдонулат. Веб баракча форматы бул мисалга интерактивдүү болууга мүмкүндүк берет.

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

Коддо "өзгөрмөнүн үлгүсүн билдирүү" ыкмасын колдонгондон кийин, сиз катардагы окшош аракеттердин бир нече тобун аласыз. Эми кайталануучу аракеттер цикл менен алмаштырылышы мүмкүн.

Илмектерди колдонуу керек болгон маселени чечүүнүн ырааттуулугу төмөнкү кадамдардан турат:

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

Студенттер бул көйгөйгө дайыма башталышында да, татаалыраак маселелерде да туш болушат.
Бул учурда негизги ишарат:

Буйрукту канча жолу кайталашыңыз керек: бир же көп жолу?

"Кириш" жана "Корутунду" деген сөздөрдү басып чыгаруу жана i өзгөрмөсүн жарыялоо жана инициализациялоо командалары башка кайталануучу аракеттерге окшош эмес. Алар бир гана жолу аткарылат, демек, циклдин сыртына жазылуу керек.

Чечүүнүн бардык үч этаптары коддо калышы керек, андыктан сиз аларга кийинчерээк кыйынчылыктар болгондо кайрыла аласыз. Алгачкы эки вариантка тоскоол болбошу үчүн комментарий берүү жетиштүү.
Студенттин көңүлүн төмөнкү фактыларга буруу керек:
— Цикл шартында, адатта, эсептегич жана чек салыштырылат. Циклдин денесинде эсептегич өзгөрүшү мүмкүн, бирок чек өзгөрө албайт. Бул эрежени бузуу үчүн, жүйөлүү себептерди түзүшүңүз керек.
— «Кириш» жана «Корутунду» деген сөздөрдү көрсөтүү үчүн буйруктар циклдин корпусунун сыртында жайгашкан. Аларды 1 жолу аткарышыбыз керек. "Кириш" - аракеттерди кайталоодон мурун, "Корутунду" - кийин.
Бул теманы консолидациялоодо, кийинки темаларды өздөштүрүүдө, ошондой эле кыйынчылыктар менен күрөшүүдө күчтүү окуучуларга да суроо берүү пайдалуу: «Бул аракет канча жолу аткарылышы керек? Бир же көп?

Кошумча көндүмдөрдү өнүктүрүү

Циклдерди окуу процессинде окуучуларда диагностикалоо жана көйгөйлөрдү чечүү жөндөмдөрү да калыптанат. Диагностика жүргүзүү үчүн студент каалаган натыйжаны көрсөтүп, аны реалдуу натыйжа менен салыштырышы керек. Түзөтүүчү аракеттер алардын ортосундагы айырмага жараша болот.
Бул этапта студенттер дагы эле "каалаган" натыйжа жөнүндө аз элестеткендиктен, алар тесттик маалыматтарга көңүл бура алышат. Эреже катары, бул этапта эч ким эмне туура эмес болушу мүмкүн экенин жана аны менен кантип күрөшүү керектигин түшүнө элек. Ошондуктан, мен дептерге типтүү маселелердин сүрөттөлүшүн жана аларды чечүүнүн бир нече жолдорун жазам. Эң ылайыктуусун тандоо студенттин өзүнүн милдети.
“Күтүлгөн нерсе болдубу?”, “Ушул жагдайлардын кайсынысы азыр болду?”, “Колдонулган чечим жардам бердиби?” деген суроолорду берүү үчүн жазуу керек.

  1. Аракеттердин саны күтүлгөндөн 1ге аз же көп. Чечимдер:
    — эсептегичтин баштапкы маанисин 1ге көбөйтүү.
    — катуу салыштыруу операторун (< же >) катаал эмес (<= же >=) менен алмаштырыңыз.
    — чектик маанини 1ге өзгөртүү.
  2. Циклдеги аракеттер токтобостон, чексиз аткарылат. Чечимдер:
    — эгерде ал жок болсо, эсептегичти өзгөртүү буйругун кошуңуз.
    — эсептегичти өзгөртүү буйругун анын мааниси чекке жакындаш үчүн оңдоңуз.
    — чектөөнү өзгөртүү буйругун алып салыңыз, эгерде ал циклдин негизги бөлүгүндө болсо.
  3. Циклдеги аракеттердин саны күтүлгөндөн 1ге аз же көп. Укуктагы иш бир жолу да аткарылган эмес. Адегенде цикл башталганга чейин өзгөрмөлөрдүн чыныгы маанилерин билишиңиз керек. Чечимдер:
    — чектөөнүн баштапкы маанисин өзгөртүү
    — эсептегичтин баштапкы маанисин өзгөртүү

3-маселе, адатта, туура эмес өзгөрмө колдонууну же эсептегичти нөлгө келтирбөөнү камтыйт.

Бул түшүндүрмөдөн кийин, студент дагы эле илмектердин кантип иштеши жөнүндө ар кандай туура эмес түшүнүккө ээ болушу мүмкүн.
Эң кеңири таралгандарды жок кылуу үчүн мен сизге төмөнкү тапшырмаларды берем:

  1. Колдонуучу тарабынан чектөө, баштапкы эсептегич маани же эсептегич кадам киргизилет.
  2. Мында эсептегичтин мааниси кандайдыр бир арифметикалык туюнтмада колдонулушу керек. Айырма сызыктуу эмес болушу үчүн радикалдуу туюнтма же бөлүүчүдө эсептегичти колдонуу максатка ылайыктуу.
  3. Цикл иштеп жатканда эсептегичтин мааниси экранда көрсөтүлбөйт. Мисалы, керектүү сандагы окшош текст фрагменттерин көрсөтүү же таш бака графикасы менен фигураны тартуу.
  4. Мында биринчи кайталануучу аракеттерди, анан башкаларды аткаруу керек.
  5. Кайталоодон мурун жана кийин башка аракеттерди жасоо керек

Ар бир тапшырма үчүн сиз тесттин маалыматтарын жана күтүлгөн натыйжаны беришиңиз керек.

Канчалык тез жылып кетээриңизди түшүнүү үчүн бул маселелердин шарттарын окуп чыгып: “Алар мисалдан эмнеси менен айырмаланат?”, “Аларды чечүү үчүн мисалда эмнени өзгөртүү керек?” деп суроо керек. Окуучу маңыздуу жооп берсе, жок дегенде бирин класста, калганын үйдө өзү чечсин. Эгер чечим ийгиликтүү болсо, анда циклдердин ичиндеги шарттарды түшүндүрүп баштасак болот.
Эгерде сизде көйгөйлөрдү өз алдынча чечүүдө кыйынчылыктар болсо, класста бардыгын иштеп чыгуу керек. Көйгөй үкү тартууну элестетпөө үчүн, адегенде маселени универсалдуу эмес жол менен чечүүнү сунуштайм. Башкача айтканда, чечим биринчи сыноодон өтүп, цикл конструкциясын колдонбойт. Анда чечимдин универсалдуулугуна жетүү үчүн трансформацияларды колдонуңуз.

Илмектер жана бутактар

Менимче, «бутактар ​​ичиндеги циклдер» деген теманы өзүнчө берүү пайдалуу. Ошентип, кийинчерээк шартты бир нече жолу текшерүү менен бир жолу текшерүүнүн ортосундагы айырманы көрө аласыз.
Консолидациялоо үчүн тапшырмалар колдонуучу киргизген Адан Бге чейинки сандарды чыгаруу жөнүндө болот:
- ар дайым өсүү тартибинде.
- А жана В маанилерине жараша өсүү же төмөндөө.

«Илмектердин ичинде бутактандыруу» темасын студент «үлгүнү өзгөрмө менен алмаштыруу» жана «кайталануучу аракеттерди цикл менен алмаштыруу» ыкмаларын өздөштүргөндөн кийин гана жылдыруу керек.
Илмектердин ичиндеги бутактарды колдонуунун негизги себеби – калыптагы аномалиялар. Ортодо баштапкы маалыматтарга жараша үзүлөт.
Жөнөкөй ыкмаларды айкалыштыруу аркылуу чечүү жолун издей алган студенттер үчүн «бутактарды илмектердин ичине жазууга болот» деп айтуу жана өз алдынча чечүү үчүн маселени «мисалы» толугу менен берүү жетиштүү.
Мисал тапшырма:

Колдонуучу 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 башка жерге жаңы номерди кошуу керек болот. "Каалаганда" бир гана бутакты кошуу жетиштүү.
"Керектүү" опцияны кайра чыгаруу тапшырмасын коюңуз, андан кийин коддон үлгү таап, өзгөрмө алмаштырууну аткарып, цикл жазыңыз.
Эгерде сизде бул көйгөйдү башка жол менен укуруксуз чечүү боюнча оюңуз болсо, комментарийге жазыңыз.

Loops ичиндеги циклдер

Бул темада төмөнкүлөргө көңүл буруу керек:
— ички жана тышкы илмектердин эсептегичтери ар кандай өзгөрмөлөр болушу керек.
— ички цикл үчүн эсептегич көп жолу баштапкы абалга келтирилиши керек (башкача айтканда, сырткы циклдин корпусунда).
— текст чыгаруу тапшырмаларында адегенде бир тамганы бир нече сапка, анан экинчисин жаза албайсыз. Адегенде биринчи саптын бардык тамгаларын, андан кийин экинчинин бардык тамгаларын ж.б. басып чыгарышыңыз керек.

Эсептегичти нөлгө кайтаруунун маанилүүлүгүн түшүндүрүү менен циклдердин ичиндеги циклдер темасын түшүндүрүп баштоо эң жакшы.
Мисал тапшырма:

Колдонуучу эки санды киргизет: R жана T. "#" белгиден турган эки сапты басып чыгарыңыз. Биринчи сапта R символдору болушу керек. Экинчи сап T даана камтыйт. Эгерде кандайдыр бир сан терс болсо, ката билдирүүсүн көрсөтүңүз.

R=5, T=11#####
############

R=20, T=3###################
###

R=-1, T=6R мааниси терс эмес болушу керек

R=6, T=-2T мааниси терс болбошу керек

Албетте, бул маселенин да жок дегенде эки чечими бар.
Каалаган

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=10
1
2
3
4
5
6
7
8
9

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

Студент өзгөрмө алмаштыруу ыкмасын өздөштүргөн болсо, анда ал абдан тез туруштук берет. Мүмкүн болгон көйгөй кайрадан өзгөрмөнү баштапкы абалга келтирүүдө болот. Эгерде сиз трансформацияны көтөрө албасаңыз, анда бул сиз шашып жатканыңызды жана жөнөкөй маселелерди чечишиңиз керек дегенди билдирет.

Конул бурганын учун рахмат. Лайк басып каналга жазылыңыз.

PS Текстте каталарды же каталарды тапсаңыз, мага кабарлаңыз. Бул тексттин бир бөлүгүн тандап, Mac'та "⌘ + Enter" баскычтарын жана классикалык клавиатураларда "Ctrl / Enter" баскычтарын же жеке билдирүүлөр аркылуу жасалышы мүмкүн. Бул опциялар жок болсо, комментарийлерде каталар жөнүндө жазыңыз. Рахмат!

Сурамжылоого катталган колдонуучулар гана катыша алышат. Кирүү, өтүнөмүн.

Кармасы жок окурмандар үчүн сурамжылоо

  • 20,0%Мен кесипкөй сабак берем, +12

  • 10,0%Профессионалдуу түрдө сабак берем, -11

  • 70,0%Мен окутпайм +17

  • 0,0%Мен окутпайм, -10

  • 0,0%Башка0

10 колдонуучу добуш берди. 5 колдонуучу добуш берүүдөн баш тартты.

Source: www.habr.com

Комментарий кошуу