Çətinlikləri aradan qaldırmağı və eyni zamanda dövrləri yazmağı necə öyrətmək olar

Əsas mövzulardan biri haqqında danışacağımıza baxmayaraq, bu məqalə təcrübəli mütəxəssislər üçün yazılmışdır. Məqsəd yeni başlayanların proqramlaşdırmada hansı yanlış təsəvvürlərə malik olduğunu göstərməkdir. Təcrübəli tərtibatçılar üçün bu problemlər çoxdan həll olunub, unudulub və ya ümumiyyətlə fərq edilməyib. Birdən bu mövzuda kiməsə kömək etmək lazımdırsa, məqalə faydalı ola bilər. Məqalə Schildt, Stroustrup, Okulov tərəfindən proqramlaşdırmaya dair müxtəlif kitabların materialları ilə paralellər aparır.

Dövrlər haqqında mövzu ona görə seçilmişdir ki, proqramlaşdırmanı mənimsəyərkən kifayət qədər çox insan bu mövzudan kənarda qalır.

Bu texnika zəif tələbələr üçün nəzərdə tutulmuşdur. Bir qayda olaraq, güclü insanlar bu mövzuda ilişib qalmırlar və onlar üçün xüsusi texnika ilə çıxış etməyə ehtiyac yoxdur. Məqalənin ikinci məqsədi bu texnikanı “bütün tələbələr üçün işləyir, ancaq bir müəllim” sinfindən “bütün tələbələr, bütün müəllimlər üçün işləyir” sinfinə keçirməkdir. Mən mütləq orijinallığı iddia etmirəm. Əgər siz artıq bu mövzunu öyrətmək üçün oxşar metodologiyadan istifadə edirsinizsə, lütfən, versiyanızın necə fərqləndiyini yazın. Əgər ondan istifadə etmək qərarına gəlsəniz, bunun necə getdiyini bizə deyin. Bənzər bir texnika bir kitabda təsvir edilmişdirsə, adını yazın.


Bu texnika üzərində 4 il çalışmışam, müxtəlif səviyyəli tələbələrlə fərdi şəkildə təhsil almışam. Ümumilikdə təxminən əlli tələbə və iki min saat dərs var. İlk vaxtlar tələbələr həmişə bu mövzuda ilişib qalıb, çıxıb gedirdilər. Hər bir tələbədən sonra metodika və materiallara düzəlişlər edilib. Son bir il ərzində tələbələr artıq bu mövzuda ilişib qalmayıblar, ona görə də əldə etdiyim nəticələri bölüşmək qərarına gəldim.

Niyə bu qədər məktub? Velosipedlər çox elementardır!

Yuxarıda yazdığım kimi, praktiki tərtibatçılar və güclü tələbələr üçün döngələr anlayışının mürəkkəbliyini qiymətləndirmək olar. Məsələn, uzun bir mühazirə oxuya bilərsiniz, başlarını sallayan başları və ağıllı gözləri görə bilərsiniz. Ancaq hər hansı bir problemi həll etməyə çalışarkən, stupor və izaholunmaz problemlər başlayır. Mühazirədən sonra tələbələr yəqin ki, yalnız qismən başa düşdülər. Vəziyyəti daha da ağırlaşdırır ki, tələbələrin özləri öz aldanmasının nə olduğunu dilə gətirə bilmirlər.
Bir gün anladım ki, tələbələr mənim nümunələrimi heroqlif kimi qəbul edirlər. Yəni bölünməz mətn parçaları kimi, hansısa "sehrli" hərf əlavə etməlisən və o işləyəcək.
Bəzən tələbələrin müəyyən bir problemi həll etmək üçün sizə lazım olduğunu düşünürlər başqa bir şey hələ əhatə etmədiyim dizayn. Baxmayaraq ki, həll nümunənin yalnız bir qədər dəyişdirilməsini tələb edirdi.

Beləliklə, mən fikirləşdim ki, diqqət ifadələrin sintaksisinə deyil, döngələrdən istifadə edərək təkrarlanan kodun yenidən işlənməsi ideyasına yönəlməlidir. Tələbələr bu ideyanı mənimsədikdən sonra hər hansı sintaksisi az təcrübə ilə təkmilləşdirmək olar.

Kimə və niyə öyrədirəm?

Qəbul imtahanları olmadığı üçün siniflərə həm güclü, həm də çox zəif tələbələr daxil ola bilər. Tələbələrim haqqında məqalədə ətraflı oxuya bilərsiniz Axşam kursu tələbələrinin portreti
Çalışdım ki, proqramlaşdırmanı öyrənmək istəyən hər kəs onu öyrənə bilsin.
Dərslərim fərdi keçirilir və tələbə hər biri üçün öz pulunu ödəyir. Belə görünür ki, tələbələr xərcləri optimallaşdıracaq və minimum tələb edəcəklər. Halbuki insanlar canlı müəllimlə üzbəüz dərslərə biliyin özü üçün deyil, öyrəndiklərinin inamı, irəliləyiş hissi və ekspertdən (müəllimdən) razılıq almaq üçün gedirlər. Tələbələr öyrənmələrində irəliləyiş hiss etməsələr, onlar ayrılacaqlar. Ümumiyyətlə, siniflər elə qurula bilər ki, tələbələr tanış strukturların sayını artırmaqda irəliləyiş hiss etsinlər. Yəni əvvəlcə ətraflı olaraq öyrənirik, sonra öyrənirik, sonra isə edirik və indi min bir gecəlik kursumuz hazırdır, orada iki ay ərzində tək dövrlər öyrənilir və sonunda - yazan tələbə diktə ilə standart kitabxana. Bununla belə, praktiki problemləri həll etmək üçün yalnız material haqqında bilik deyil, həm də onun tətbiqi və yeni məlumatların axtarışında müstəqillik lazımdır. Buna görə də, üz-üzə kurslar üçün, hesab edirəm ki, düzgün prinsip minimumu öyrətmək və nüansların və əlaqəli mövzuların müstəqil öyrənilməsini təşviq etməkdir. Döngələr mövzusunda, while konstruksiyasını minimum hesab edirəm. Ondan prinsipi başa düşə bilərsiniz. Prinsipləri bilməklə, siz həm özünüz üçün, həm də özünüz edə bilərsiniz.

Zəif şagirdlərin materialı mənimsəməsinə nail olmaq üçün sintaksisi təsvir etmək kifayət deyil. Daha sadə, lakin müxtəlif tapşırıqlar vermək və nümunələri daha ətraflı təsvir etmək lazımdır. Nəhayət, inkişaf sürəti şagirdin ifadələri çevirmək və nümunələri axtarmaq qabiliyyəti ilə məhdudlaşır. Ağıllı tələbələr üçün əksər tapşırıqlar darıxdırıcı olacaq. Onlarla təhsil alarkən, problemlərin 100% həllində israrlı olmaq lazım deyil. Materialıma baxa bilərsiniz mənim githubum. Düzdür, anbar daha çox cadugərin qrimuarına bənzəyir - məndən başqa heç kim nəyin harada olduğunu başa düşməyəcək və çekdən keçə bilsəniz, dəli ola bilərsiniz.

Metodologiya təcrübə yönümlüdür

Nəzəriyyə problemin həlli nümunəsi ilə izah olunur. Budaqların və ilmələrin öyrədildiyi proqramlaşdırmanın əsasları dərsində bir mövzuda bütün bir saat ərzində faydalı mühazirə oxumaq sadəcə mümkün deyil. Konsepsiyanı izah etmək üçün 15-20 dəqiqə kifayətdir. Əsas çətinliklər praktiki tapşırıqları yerinə yetirərkən yaranır.
Başlayan müəllimlər bir mühazirədə operatorları, filialları, döngələri və massivləri sındıra bilərlər. Lakin onların tələbələri bu məlumatı mənimsəmək problemi ilə üzləşəcəklər.
Təkcə materialı danışmaq yox, həm də dinləyicilərin onu başa düşməsinə əmin olmaq lazımdır.

Mövzunun mənimsənilməsi faktı tələbənin müstəqil işin öhdəsindən necə gəlməsi ilə müəyyən edilir.
Əgər şagird mövzu ilə bağlı problemi müəllimin köməyi olmadan həll edə bilibsə, deməli, mövzu mənimsənilib. Özünü sınamağı təmin etmək üçün hər bir tapşırıq test ssenariləri ilə cədvəldə təsvir edilmişdir. Tapşırıqların aydın ardıcıllığı var. Tapşırıqları atlamaq tövsiyə edilmir. Əgər cari iş çox çətindirsə, növbəti birinə keçmək faydasızdır. Bu daha da mürəkkəbdir. Şagirdin cari mürəkkəb tapşırığı mənimsəyə bilməsi üçün birinci məsələnin nümunəsindən istifadə edərək ona bir neçə texnika izah edilir. Əslində, mövzunun bütün məzmunu çətinliklərin öhdəsindən gəlmək üçün üsullardan ibarətdir. Dövrlər daha çox yan təsirdir.

İlk tapşırıq həmişə bir nümunədir. İkincisi bir qədər fərqlənir və müəllimin nəzarəti altında birincidən dərhal sonra "müstəqil" həyata keçirilir. Bütün sonrakı vəzifələr yanlış təsəvvürlərə səbəb ola biləcək müxtəlif kiçik şeylərə diqqət yetirməyə yönəldilmişdir.

Nümunənin izahı, tələbənin materialın bir hissəsini mənimsədiyinə əmin olmaq üçün təbliğat və çarpaz təsdiqləməni geri çağırmalı olduğu bir dialoqdur.

Banal olacağam və deyim ki, mövzu ilə bağlı ilk nümunə çox vacibdir. Geniş müstəqil iş üçün materialınız varsa, birinci nümunənin buraxılması düzəldilə bilər. Əgər nümunədən başqa heç nə yoxdursa, o zaman tələbə çox güman ki, mövzunu mənimsəməyəcək.

Nə vaxtsa yoxsa üçün?

Mübahisəli məsələlərdən biri, məsələn, tikinti seçimidir: while və ya üçün. Bir dəfə, heç bir tədris təcrübəsi olmayan praktiki inkişaf etdirici dostum məni inandırmaq üçün bir saat sərf etdi ki, for döngəsinin başa düşülməsi ən asan yoldur. Arqumentlər "onda hər şey aydındır və öz yerinə qoyulmuşdur" kimi qaynaqlanır. Bununla belə, əsl yeni başlayanlar üçün çətinliklərin kök səbəbi onun yazılması deyil, dövrün özüdür. Əgər insan bu fikri başa düşmürsə, o zaman sintaksisdə çətinlik çəkəcək. İdeya reallaşan kimi kod dizaynı problemləri öz-özünə aradan qalxır.

Materiallarımda ilgəklər mövzusu budaqlanma mövzusunu izləyir. if və while xarici oxşarlığı bizə birbaşa bənzətmə aparmağa imkan verir: "başlıqdakı şərt doğru olduqda, gövdə yerinə yetirilir." Dövrün yeganə özəlliyi bədənin dəfələrlə icra olunmasıdır.

Mənim ikinci arqumentim budur ki, while for-dan daha az formatlaşdırma tələb edir. Daha az formatlaşdırma, çatışmayan vergül və mötərizələrlə daha az axmaq səhv deməkdir. Yeni başlayanlar avtomatik sintaksis səhvlərindən qaçmaq üçün hələ kifayət qədər diqqətlilik və vasvasılıq inkişaf etdirməmişdir.
Üçüncü dəlil bir çox yaxşı kitablarda birinci arqument kimi izah olunur.

Əgər tələbə ifadələri asanlıqla çevirə bilirsə, onda siz keçid zamanı haqqında danışa bilərsiniz. Daha sonra tələbə ən çox bəyəndiyi şeyi seçəcək. Əgər çevrilmələr çətinlik yaradırsa, diqqətinizi yayındırmamaq daha yaxşıdır. Tələbə əvvəlcə while istifadə edərək hər şeyi həll etsin. Döngələr mövzusunu mənimsədikdən sonra, for-a çevrilmə təcrübəsi üçün həlləri yenidən yaza bilərsiniz.
Vəziyyətdən sonrakı döngələr olduqca nadir bir heyvandır. Mən ümumiyyətlə buna vaxt sərf etmirəm. Şagird nümunələri müəyyənləşdirmək və ifadələri dəyişdirmək ideyalarını mənimsəmişsə, mənim köməyim olmadan bunu başa düşə bilər.

Güclü tələbələrə ilk nümunəni nümayiş etdirərkən diqqəti cəlb edirəm ki, birinci nümunədə təkcə həll yolu deyil, həm də nəticəyə gətirib çıxaran bütün hərəkətlər zəncirini qeyd etmək vacibdir. Tənbəl tələbələr yazıya məhəl qoymayaraq yalnız son alqoritmi köçürə bilərlər. Onları əmin etmək lazımdır ki, bir gün çətin iş onların qarşısına çıxacaq. Bunu həll etmək üçün bu nümunədə olduğu kimi addımları yerinə yetirməlisiniz. Buna görə bütün mərhələləri qeyd etmək vacibdir. Aşağıdakı problemlərdə həllin yalnız son versiyasını tərk etmək mümkün olacaq.

Avtomatlaşdırmanın əsas ideyası ondan ibarətdir ki, biz kompüterə insan üçün gündəlik işləri həvalə edirik. Əsas üsullardan biri döngələrin yazılmasıdır. Bir proqramda bir neçə eyni təkrarlanan hərəkətlər ardıcıl olaraq yazıldıqda istifadə olunur.

Açıq-aşkar, gizlidən daha yaxşıdır

İlk döngə tapşırığında eyni ifadəni bir neçə dəfə göstərmək yaxşı fikir kimi görünə bilər. Misal üçün:

Hurray, işləyir!
Hurray, işləyir!
Hurray, işləyir!
Hurray, işləyir!
Hurray, işləyir!
Hurray, işləyir!
Hurray, işləyir!
Hurray, işləyir!

Bu seçim pisdir, çünki sayğac dəyəri çıxışda görünmür. Bu, yeni başlayanlar üçün problemdir. Onu qiymətləndirməyin. Əvvəlcə bu tapşırıq birinci idi və artan ardıcıllıqla bir sıra ədədlər çıxarmaq tapşırığı ikinci idi. Mahiyyətcə eyni olan “dövrü N dəfə” və “A-dan B-yə dövr” əlavə terminləri tətbiq etmək lazım idi. Lazımsız varlıqlar yaratmamaq üçün yalnız bir sıra nömrələrin çıxışı ilə bir nümunə göstərmək qərarına gəldim. Çox az adam, hazırlıqsız başlarında sayğac tutmağı və proqramın davranışını modelləşdirməyi öyrənə bilir. Bəzi tələbələr əvvəlcə dövrlər mövzusunda zehni modelləşdirmə ilə qarşılaşırlar.
Bir az məşq etdikdən sonra müstəqil həll olunmaq üçün eyni mətni təkrarlamaq tapşırığı verirəm. Əvvəlcə görünən, sonra görünməyən sayğac versəniz, tələbələrin problemi daha az olacaq. Bəzən "ekranda sayğac yazmayın" işarəsi kifayətdir.

Başqaları bunu necə izah edir?

İnternetdəki əksər tədris materiallarında dövrün sintaksisi “mühazirə”nin bir hissəsi kimi verilir. Məsələn, developer.mozilla.org saytında (hazırda) while döngəsi ilə birlikdə bir neçə başqa konstruksiya təsvir edilmişdir. Bu halda, yalnız dizaynların özləri şablon şəklində verilir. Onların buraxılışının nəticəsi sözlərlə təsvir edilir, lakin heç bir təsvir yoxdur. Məncə, mövzunun bu cür təqdimatı belə materialların faydalılığını sıfıra vurur. Tələbə kodu yenidən yaza və özü işlədə bilər, lakin müqayisə üçün hələ də standart lazımdır. Nəticəni müqayisə etmək üçün heç bir şey yoxdursa, nümunənin yenidən düzgün yazıldığını necə başa düşmək olar?
Nümunəsiz yalnız şablon veriləndə şagird üçün daha da çətinləşir. Şablonda kod fraqmentlərinin düzgün yerləşdirildiyini necə başa düşmək olar? Yazmağa cəhd edə bilərsiniz birtəhər, sonra qaçın. Ancaq nəticəni müqayisə etmək üçün heç bir standart yoxdursa, işə salmaq da kömək etməyəcək.

Intuitiv üzrə C++ kursunda loop sintaksisi “operatorlar” mövzusunda 4-cü Mühazirənin üçüncü səhifəsində yer alıb. Döngələrin sintaksisini izah edərkən “operator” termininə xüsusi diqqət yetirilir. Termin “simvol; bu ifadədir", "{} mürəkkəb ifadədir", "dövrənin gövdəsi ifadə olmalıdır". Bu yanaşmanı bəyənmirəm, çünki bir terminin arxasında mühüm əlaqələri gizlədir. Proqramın mənbə kodunu bu səviyyədə terminlərlə təhlil etmək dil spesifikasiyasını həyata keçirmək üçün tərtibçi tərtibatçılarına lazımdır, lakin tələbələrə birinci yaxınlaşma kimi deyil. Proqramlaşdırmaya yeni başlayanlar nadir hallarda terminlərə bu qədər diqqət yetirəcək qədər vasvası olurlar. Yeni sözləri ilk dəfə xatırlayan və anlayan nadir insandır. Demək olar ki, heç kim yeni öyrəndiyi termini düzgün tətbiq edə bilmir. Buna görə də tələbələr “I write while(a<7);{, lakin proqram işləmir” kimi çoxlu səhvlər alır.
Məncə, başlanğıcda konstruksiyanın sintaksisini dərhal mötərizə ilə vermək daha yaxşıdır. Mötərizəsiz seçim yalnız tələbənin konkret sualı olduqda izah edilməlidir: “niyə mötərizə yoxdur və işləyir”.

Okulovun 2012-ci il "Proqramlaşdırmanın əsasları" kitabında döngələrə giriş for nümunəsi ilə başlayır, sonra onun istifadəsi üçün tövsiyələr verir və dərhal dərsin eksperimental hissəsinə keçir. Mən başa düşürəm ki, kitab mənim dərslərimə nadir hallarda gələn çox bacarıqlı tələbələrin azlığı üçün yazılıb.

Məşhur kitablarda kod fraqmentlərinin nəticəsi həmişə yazılır. Məsələn, Şildtin “Java 8. Tam Bələdçi” 2015-ci il nəşri. Əvvəlcə bir şablon verilir, sonra nümunə proqram və dərhal sonra - icra nəticəsi.

Nümunə olaraq, əksini edən bir müddət dövrəsini nəzərdən keçirək
10-dan başlayan geri sayım və dəqiq 10 sətir “ölçü” göstərilir:

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

İşlədikdən sonra bu proqram aşağıdakı kimi on "dövr" çıxarır:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Şablon, nümunə proqramı və proqramın nəticəsini təsvir etmək yanaşması “Uşaqlar üçün Javascript” kitabında və w3schools.com saytındakı js kursunda da istifadə olunur. Veb səhifə formatı hətta bu nümunənin interaktiv olmasına imkan verir.

Stroustrup-un 2016-cı ildə dərc edilmiş Principles and Practice Use C++ adlı kitabı daha da irəli getdi. İlk addım hansı nəticənin əldə edilməli olduğunu izah etməkdir və bundan sonra proqramın mətni göstərilir. Üstəlik, onlar sadəcə təsadüfi proqramı nümunə götürmürlər, həm də tarixə ekskursiya edirlər. Bu, diqqəti cəlb etməyə kömək edir: “Bax, bu, sadəcə olaraq, lazımsız mətn deyil. Mənalı bir şey görürsən."

İterasiya nümunəsi olaraq saxlanılan proqram maşınında (EDSAC) icra edilən ilk proqramı nəzərdən keçirək. 6 may 1949-cu ildə İngiltərənin Kembric Universitetinin Kompüter Laboratoriyasında David Wheeler tərəfindən yazılmışdır. Bu proqram kvadratların sadə siyahısını hesablayır və çap edir.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Burada hər bir sətirdən sonra nişan simvolu ('t') və həmin rəqəmin kvadratı olan bir nömrə var. Bu proqramın C++ versiyası belə görünür:

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

Maraqlıdır ki, bu kitabda sintaksis nümunəsi təsvir olunmur. Stroustrup təlimatçının təlimatında (tərcümə) tələbələrinin zəkasına hörmət etdiyini vurğulayır. Ola bilsin ki, bir neçə nümunədə nümunə müəyyən etmək bacarığı belə zəkanın təzahürü hesab olunur.

Özümü izah etdiyim kimi

Stroustrupun yanaşması: nəticəni təsvir etmək, sonra problemi həll etmək, daha sonra tələbə tərəfindən müstəqil təhlil - ən düşüncəli görünür. Buna görə də, mən bunu əsas götürmək qərarına gəldim, amma daha az tarixi bir nümunədən istifadə edərək - "mündəricat" əldə etmək tapşırığından istifadə edərək söyləmək qərarına gəldim. O, tanınan lövbər təşkil edir ki, siz sonra “Mündəricatla bağlı tapşırığı yadda saxla” deyə biləsiniz və tələbələr bunu dəqiq xatırlayacaqlar. Öz nümunəmdə ən çox yayılmış iki yanlış təsəvvürün qarşısını almağa çalışdım. Sonra onlar haqqında daha ətraflı yazacağam.

Bu tapşırıqda biz mürəkkəb problemlərin həlli üsulları ilə tanış oluruq. İlkin qərar primitiv və sadə olmalıdır. Yaxşı, onda bu həlli necə təkmilləşdirmək barədə düşünə bilərsiniz.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Müşahidələrimə görə, müxtəlif kombinasiyalarda “şablon-nümunə-nəticə” yanaşması hələ də tələbələrin dövrü heroqlif kimi qəbul etməsinə gətirib çıxarır. Bu, özünü onda göstərirdi ki, onlar orada nə üçün yazmaq şərti olduğunu, i++ və i- arasında necə seçim etmək lazım olduğunu və digər açıq-aydın şeyləri başa düşmədilər. Bu yanlış təsəvvürlərin qarşısını almaq üçün dövrlər haqqında danışmağa yanaşma eyni hərəkətlərin təkrarlanmasının mənasını vurğulamalıdır və yalnız bundan sonra strukturdan istifadə edərək onları rəsmiləşdirməlidir. Buna görə də, döngə sintaksisini verməzdən əvvəl problemi baş-başa həll etməlisiniz. Mündəricat probleminin primitiv həlli belə görünür:

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

Onu necə təkmilləşdirmək olar?
Monoton hərəkətləri bir dövrə ilə əvəz edin.
Hansı hərəkətlər dəyişmədən ardıcıl olaraq təkrarlanır?
Bu fraqmentdə heç biri yoxdur. Bununla birlikdə, "Fəsil" sözünü nömrə ilə göstərmək üçün əmrlər bir-birinə çox bənzəyir.
Buna görə də növbəti mərhələ fraqmentlər arasındakı fərqi tapmaqdır. Yalnız bu tapşırıqda hər şey aydındır, o zaman tək əmrlər deyil, 5 və ya daha çox sətirdən ibarət kod blokları təkrarlanmayacaq. Siz təkcə əmrlər siyahısında deyil, budaqlanan və ya döngə konstruksiyalarında axtarış aparmalı olacaqsınız.
Nümunədə əmrlər arasındakı fərq “Fəsil” sözündən sonrakı nömrədədir.
Fərq aşkar edildikdən sonra dəyişiklik modelini başa düşməlisiniz. Fərqli fraqment nömrədir? Davamlı olaraq artır, yoxsa azalır? Bir ədədin dəyəri iki komanda arasında yan-yana necə dəyişir?
Nümunədə “Fəsil” sözündən sonrakı rəqəm 1-lik artımlarla artır. Fərq tapılır, nümunə açılır. İndi fərqli fraqmenti dəyişənlə əvəz edə bilərsiniz.
Təkrarlanan fraqmentlərin birincisindən əvvəl belə bir dəyişəni elan etməlisiniz. Belə dəyişən adətən I və ya j və ya daha ətraflı bir şey adlanır. Onun ilkin dəyəri ekranda göstərilən ilk dəyərə bərabər olmalıdır. Nümunədə birinci dəyər 1-dir.
“100, 101, 102, 103, 104, 105” rəqəmləri seriyasını göstərmək üçün hansı ilkin dəyər götürülməlidir?
Bu seriyanın ilk rəqəmi 100-dür.
Hər çıxış əmrindən sonra bu dəyişənin dəyərini 1 artırmalısınız. Bu vahid dəyişiklik addımıdır.
“100, 102, 104, 106” rəqəmləri silsiləsində hansı addım olacaq?
Bu cərgədə 2-ci addım.
Fərqli fraqmenti dəyişənlə əvəz etdikdən sonra kod belə görünəcək:

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

Kodda "dəyişən nümunəsini ifadə etmək" texnikasını tətbiq etdikdən sonra ardıcıl olaraq gedən bir neçə eyni hərəkət qrupu alırsınız. İndi təkrarlanan hərəkətlər bir dövrə ilə əvəz edilə bilər.

Döngələrdən istifadə etməli olduğunuz bir problemin həlli ardıcıllığı aşağıdakı addımlardan ibarətdir:

  1. Bir çox ayrı-ayrı əmrlərlə "baş-üstə" həll edin
  2. Nümunə tapın
  3. Dəyişən modelini ifadə edin
  4. Bir dövr kimi dizayn

Sonra tələbənin “Mən hər şeyi başa düşürəm, amma deyə bilmərəm” vəziyyətinə düşməməsi üçün yeni terminlər təqdim olunur:
— sayğac həmişə dövrədə addımların sayını izləmək üçün lazım olan dəyişəndir. Tipik olaraq məhdudiyyətlə müqayisə edilən tam ədəddir.
— əks addım — sayğac dəyişiklikləri sxeminin təsviri.
- məhdudiyyət - alqoritmin yekun olması üçün sayğacın müqayisə edildiyi ədəd və ya dəyişən. Sayğac dəyəri limitə yaxınlaşmaq üçün dəyişir.
— loop body — təkrar olunacaq əmrlər toplusu. “Əmr bir döngə içərisində yazılır” dedikdə, gövdə nəzərdə tutulur.
— loop iteration — loop gövdəsinin birdəfəlik icrası.
— döngə şərti — başqa iterasiyanın icra edilib-edilməyəcəyini müəyyən edən məntiqi ifadə. (Budaqlanan strukturlarla qarışıqlıq ola bilər)
Əvvəlcə tələbələrin terminləri başqa məqsədlər üçün istifadə edəcəyinə hazır olmalısınız. Bu həm güclülərə, həm də zəiflərə aiddir. Ümumi dil yaratmaq bir sənətdir. İndi qısaca yazacağam: “<term> ilə kod fraqmentini vurğulamaq” tapşırığını təyin etməli və bu terminləri söhbətdə özünüz düzgün istifadə etməlisiniz.
Döngə ilə çevrildikdən sonra fraqment əldə edilir:

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

Əsas yanlış fikir

Şagirdlər arasında yayılmış yanlış fikirlərdən biri, onların yalnız bir dəfə edilməli olan hərəkətləri bir dövrə içərisində yerləşdirmələridir. Məsələn, bu kimi:

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

Şagirdlər həm başlanğıcda, həm də daha mürəkkəb məsələlərdə həmişə bu problemlə qarşılaşırlar.
Bu vəziyyətdə əsas göstəriş:

Komandanı neçə dəfə təkrar etməlisiniz: bir dəfə və ya bir neçə dəfə?

“Giriş” və “Nəticə” sözlərini çap etmək və i dəyişənini elan etmək və işə salmaq əmrləri təkrarlanan digər hərəkətlərə bənzəmir. Onlar yalnız bir dəfə yerinə yetirilir, yəni onları döngə gövdəsindən kənarda yazmaq lazımdır.

Həllin hər üç mərhələsi kodda qalmalıdır ki, sonradan çətinliklər yarandıqda onlara müraciət edə biləsiniz. İlk iki variantı şərh etmək kifayətdir ki, müdaxilə etməsin.
Tələbənin diqqəti aşağıdakı faktlara cəlb edilməlidir:
— Döngü şəraitində adətən sayğac və limit müqayisə edilir. Döngənin gövdəsində sayğac dəyişə bilər, lakin limit dəyişə bilməz. Bu qaydanı pozmaq üçün tutarlı səbəbləri formalaşdırmaq lazımdır.
— “Giriş” və “Nəticə” sözlərini göstərmək üçün əmrlər döngənin gövdəsindən kənarda yerləşir. Onları 1 dəfə yerinə yetirməliyik. "Giriş" - hərəkətləri təkrarlamadan əvvəl, "Nəticə" - sonra.
Bu mövzunun möhkəmləndirilməsi, sonrakıların mənimsənilməsi, eləcə də çətinliklərin öhdəsindən gəlmək prosesində hətta güclü tələbələrin belə sual verməsi faydalıdır: “Bu hərəkəti neçə dəfə yerinə yetirmək lazımdır? Bir yoxsa çox?

Əlavə bacarıqların inkişafı

Dövrlərin öyrənilməsi prosesində tələbələr problemlərin diaqnostikası və həlli bacarıqlarını da inkişaf etdirirlər. Diaqnostika aparmaq üçün tələbə istədiyi nəticəni təqdim etməli və onu faktiki nəticə ilə müqayisə etməlidir. Düzəliş hərəkətləri onların arasındakı fərqdən asılıdır.
Bu mərhələdəki tələbələr hələ də "arzu olunan" nəticə haqqında çox az təsəvvürə malik olduğundan, onlar test məlumatlarına diqqət yetirə bilərlər. Bir qayda olaraq, bu mərhələdə hələ heç kim nəyin səhv ola biləcəyini və bununla necə məşğul olacağını başa düşmür. Buna görə də, mən dəftərə tipik problemlərin təsvirini və onların həllinin bir neçə yolunu yazıram. Ən uyğununu seçmək tələbənin öz vəzifəsidir.
“Gözlənilənlər baş verdimi?”, “Bu vəziyyətlərdən hansı indi baş verdi?”, “Tətbiq olunan həll kömək etdimi?” suallarını vermək üçün qeyd lazımdır.

  1. Hərəkətlərin sayı gözləniləndən 1 az və ya çoxdur. Həll yolları:
    — sayğacın ilkin qiymətini 1 artırın.
    — ciddi müqayisə operatorunu (< və ya >) qeyri-ciddi (<= və ya >=) ilə əvəz edin.
    — limit dəyərini 1-ə dəyişdirin.
  2. Döngüdəki hərəkətlər dayanmadan, qeyri-müəyyən müddətə yerinə yetirilir. Həll yolları:
    — əksini dəyişdirmək əmri yoxdursa əlavə edin.
    — sayğac dəyişdirmə əmrini elə düzəldin ki, onun dəyəri limitə yaxınlaşsın.
    — məhdudiyyəti dəyişdirmək əmri döngənin gövdəsindədirsə, onu çıxarın.
  3. Döngüdəki hərəkətlərin sayı gözləniləndən 1-dən az və ya çoxdur. Döngüdəki hərəkət bir dəfə də olsun yerinə yetirilmədi. Əvvəlcə döngə başlamazdan əvvəl dəyişənlərin həqiqi dəyərlərini öyrənməlisiniz. Həll yolları:
    — məhdudiyyətin ilkin qiymətini dəyişdirin
    — sayğacın ilkin qiymətini dəyişdirin

Problem 3 adətən səhv dəyişəndən istifadə etməyi və ya sayğacın sıfıra sıfırlanmasını nəzərdə tutur.

Bu izahatdan sonra şagirddə halqaların necə işlədiyi barədə hələ də müxtəlif yanlış təsəvvürlər ola bilər.
Ən ümumi olanları aradan qaldırmaq üçün sizə aşağıdakı tapşırıqları verirəm:

  1. İstifadəçi tərəfindən limit, ilkin sayğac dəyəri və ya sayğac addımı daxil edilir.
  2. Hansı ki, sayğac dəyəri bəzi arifmetik ifadələrdə istifadə edilməlidir. Fərqin qeyri-xətti olması üçün radikal ifadədə və ya məxrəcdə sayğacdan istifadə etmək məsləhətdir.
  3. Döngə işləyərkən sayğac dəyəri ekranda göstərilmir. Məsələn, tələb olunan sayda eyni mətn fraqmentlərini göstərmək və ya tısbağa qrafikası ilə bir fiqur çəkmək.
  4. Hansı ki, əvvəlcə bəzi təkrarlanan hərəkətləri, sonra başqalarını yerinə yetirməlisiniz.
  5. Təkrarlamadan əvvəl və sonra digər hərəkətləri yerinə yetirməlisiniz

Hər bir tapşırıq üçün test məlumatlarını və gözlənilən nəticəni təqdim etməlisiniz.

Nə qədər sürətlə hərəkət edə biləcəyinizi başa düşmək üçün bu problemlərin şərtlərini oxumaq və soruşmaq lazımdır: "onlar nümunədən nə ilə fərqlənir?", "Onları həll etmək üçün nümunədə nəyi dəyişdirmək lazımdır?" Şagird mənalı cavab verirsə, heç olmasa birini sinifdə, qalanını isə evdə təkbaşına həll etsin. Həll uğurlu olarsa, o zaman döngələrin içindəki şərtləri izah etməyə başlaya bilərik.
Problemləri təkbaşına həll etməkdə probleminiz varsa, sinifdə hər şeyi həll etməlisiniz. Bayquş çəkməyi xatırladan problemi həll etməmək üçün əvvəlcə problemi universal olmayan bir şəkildə həll etməyi məsləhət görürəm. Yəni, həll ilk sınaqdan keçsin və loop konstruksiyasından istifadə etməsin. Yaxşı, sonra həllin universallığına nail olmaq üçün çevrilmələri tətbiq edin.

Döngələr və budaqlar

Fikrimcə, “budaqlar daxilində dövrələr” mövzusunu ayrıca vermək faydalıdır. Beləliklə, daha sonra bir şərti bir neçə dəfə yoxlamaq və bir dəfə yoxlamaq arasındakı fərqi görə bilərsiniz.
Konsolidasiya üçün tapşırıqlar istifadəçi tərəfindən daxil edilən A-dan B-yə nömrələrin çıxarılması ilə bağlı olacaq:
- həmişə artan qaydada.
- A və B qiymətlərindən asılı olaraq artan və ya azalan.

“Döngülər daxilində budaqlanma” mövzusu yalnız tələbə üsulları mənimsədikdən sonra keçirilməlidir: “naxışı dəyişənlə əvəz etmək” və “təkrarlanan hərəkətləri dövrə ilə əvəz etmək”.
Döngələr içərisində budaqların istifadə edilməsinin əsas səbəbi naxışdakı anomaliyalardır. Ortada ilkin məlumatlardan asılı olaraq qırılır.
Sadə üsulları birləşdirərək həll yolu axtarmağı bacaran tələbələr üçün “budaqlanma ilgəklərin içərisində yazıla bilər” demək və müstəqil həll etmək üçün problemi “məsələn” tamamilə vermək kifayətdir.
Məsələn tapşırıq:

İstifadəçi X rəqəmini daxil edir. 0-dan 9-a qədər olan rəqəmləri sütunda göstərin və X-ə bərabər olan ədədin qarşısına '+' işarəsi qoyun.

0 daxil edilibsə0+
1
2
3
4
5
6
7
8
9

6 daxil edilibsə0
1
2
3
4
5
6+
7
8
9

9 daxil edilibsə0
1
2
3
4
5
6
7
8
9+

777 daxil edilibsə0
1
2
3
4
5
6
7
8
9

Döngə ilə yazmaq üçün qısa izahat kifayət etmirsə, o zaman eyni problemin döngəsiz universal həllinə nail olmaq lazımdır.
İki seçimdən birini alacaqsınız:
İstənilən

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);
}

Mümkün

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+");
}

Budaqlanma mövzusunu öyrənərkən əvvəlcədən oxşar tapşırıq verirəm.
Əgər tələbə “mümkün” variantı təklif edirsə, o zaman onlara eyni problemin bir çox həlli ola biləcəyini söyləmək lazımdır. Bununla belə, onlar tələblərin dəyişməsinə qarşı müqaviməti ilə fərqlənirlər. Sual verin: "Başqa bir nömrə əlavə etməli olsam, kodun neçə yerini düzəltmək lazımdır?" “Mümkün” versiyada siz daha bir filial əlavə etməli və 10 başqa yerdə yeni nömrə əlavə etməlisiniz. "İstədiyinizdə" yalnız bir filial əlavə etmək kifayətdir.
“İstədiyiniz” seçimi təkrar etmək üçün tapşırıq təyin edin, sonra kodda bir nümunə tapın, dəyişən dəyişdirin və bir döngə yazın.
Bu problemi başqa bir şəkildə döngə olmadan necə həll etmək barədə bir fikriniz varsa, şərhlərdə yazın.

Döngələr daxilində döngələr

Bu mövzuda aşağıdakılara diqqət yetirmək lazımdır:
— daxili və xarici döngələr üçün sayğaclar müxtəlif dəyişənlər olmalıdır.
— daxili döngə üçün sayğac dəfələrlə sıfırlanmalıdır (yəni xarici döngənin gövdəsində).
— mətn çıxarma tapşırıqlarında əvvəlcə bir hərfi bir neçə sətirdə, sonra isə ikincisini yaza bilməzsiniz. Əvvəlcə birinci sətrin bütün hərflərini, sonra ikincinin bütün hərflərini və s.

Sayğacın sıfırlanmasının vacibliyini izah etməklə, döngələr daxilində döngələr mövzusunu izah etməyə başlamaq daha yaxşıdır.
Məsələn tapşırıq:

İstifadəçi iki ədəd daxil edir: R və T. "#" simvollarından ibarət iki sətir çap edin. Birinci sətirdə R simvolu olmalıdır. İkinci sətirdə T parçaları var. Hər hansı bir rəqəm mənfi olarsa, səhv mesajı göstərin.

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

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

R=-1, T=6R dəyəri mənfi olmamalıdır

R=6, T=-2T dəyəri mənfi olmamalıdır

Aydındır ki, bu problemin də ən azı iki həlli var.
İstənilən

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;
}

Mümkün #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;
}

Fərq ondadır ki, “mümkün” həlldə ikinci sətri çıxarmaq üçün ikinci dəyişəndən istifadə olunub. Hər iki döngə üçün eyni dəyişəndən istifadə etməkdə israr etməlisiniz. Bu məhdudiyyət onunla əsaslandırıla bilər ki, iki dövr üçün bir sayğaclı bir həll "əks sıfırlama" termininin təsviri olacaqdır. Aşağıdakı problemləri həll edərkən bu termini başa düşmək lazımdır. Kompromis olaraq, problemin hər iki həllini saxlaya bilərsiniz.

İki döngə üçün bir sayğac dəyişəninin istifadəsi ilə bağlı tipik problem belə görünür:
R=5, T=11#####
######

İkinci sətirdəki simvolların sayı T dəyərinə uyğun gəlmir. Əgər bu problemlə bağlı köməyə ehtiyacınız varsa, o zaman döngələrlə bağlı tipik problemlər haqqında qeydlərə baxmaq lazımdır. Bu 3 nömrəli simptomdur. İkinci dövrədən dərhal əvvəl əks dəyər çıxışı əlavə etsəniz diaqnoz qoyulur. Sıfırlamaqla düzəldilir. Ancaq bunu dərhal deməmək daha yaxşıdır. Tələbə ən azı bir fərziyyə yaratmağa çalışmalıdır.

Əlbəttə ki, başqa bir həll yolu var. Amma mən bunu tələbələr arasında görməmişəm. Dövrləri öyrənmək mərhələsində bu barədə hekayə diqqəti yayındıracaq. Daha sonra sətir funksiyaları haqqında öyrənərkən ona qayıda bilərsiniz.
Mümkün #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));

Növbəti tələb olunan tapşırıq:

0-dan 9-a qədər rəqəmləri göstərin. Hər bir nömrə öz sətirində olmalıdır. Sətirdəki rəqəmlərin sayı (W) klaviaturadan daxil edilir.

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

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

Bir şagird dəyişəni əvəz etmək texnikasını mənimsəmişsə, o, kifayət qədər tez öhdəsindən gələcəkdir. Mümkün problem yenidən dəyişənin sıfırlanması ilə bağlı olacaq. Əgər transformasiyanın öhdəsindən gələ bilmirsinizsə, bu, tələsdiyiniz və daha sadə problemləri həll etməli olduğunuz deməkdir.

Diqqətinizə görə təşəkkürlər. Bəyənin və kanala abunə olun.

P.S. Mətndə səhvlər və ya səhvlər aşkar etsəniz, lütfən, mənə bildirin. Bunu mətnin bir hissəsini seçmək və Mac-da “⌘ + Enter” və klassik klaviaturalarda “Ctrl / Enter” düymələrini sıxmaqla və ya şəxsi mesajlar vasitəsilə etmək olar. Bu seçimlər mövcud deyilsə, şərhlərdə səhvlər haqqında yazın. Çox sağ ol!

Sorğuda yalnız qeydiyyatdan keçmiş istifadəçilər iştirak edə bilər. Daxil olunxahiş edirəm.

Karması olmayan oxucular üçün sorğu

  • 20,0%Peşəkar şəkildə dərs deyirəm, +12

  • 10,0%Peşəkar şəkildə dərs deyirəm, -11

  • 70,0%Mən öyrətmirəm, +17

  • 0,0%Mən öyrətmirəm, -10

  • 0,0%Digər 0

10 istifadəçi səs verib. 5 istifadəçi bitərəf qalıb.

Mənbə: www.habr.com

Добавить комментарий