Cumu insignà cumu superà e difficultà, è à u stessu tempu scrive ciculi

Malgradu u fattu chì avemu da parlà di unu di i temi basi, stu articulu hè scrittu per i prufessiunali sperimentati. U scopu hè di dimustrà ciò chì i principianti anu cuncepimentu sbagliatu in a prugrammazione. Per i sviluppatori praticanti, sti prublemi sò longu risolti, scurdati o micca nutati. L'articulu pò esse utile si di colpu avete bisognu di aiutà à qualchissia cù questu tema. L'articulu face paralleli cù materiale da parechji libri nantu à a prugrammazione di Schildt, Stroustrup, Okulov.

U tema nantu à i ciculi hè statu sceltu perchè assai persone sò escluse da ellu quandu u maestru di prugrammazione.

Sta tecnica hè pensata per i studienti debuli. In regula, e persone forti ùn si fermanu micca nantu à questu tema è ùn ci hè bisognu di vene cun tecniche speciali per elli. U scopu secundariu di l'articulu hè di trasfurmà sta tecnica da a classa "opere per tutti i studienti, ma solu un maestru" à a classe "opere per tutti i studienti, tutti i prufessori". Ùn pretendu micca l'uriginale assoluta. Sè vo site digià aduprendu una metodulugia simili per insignà stu tema, per piacè scrivite cumu a vostra versione hè diversa. Se decide di usà, diteci cumu hè andatu. Se una tecnica simili hè descritta in un libru, scrivite u nome.


Aghju travagliatu nantu à sta tecnica per 4 anni, studiendu individualmente cù studienti di diversi livelli di furmazione. In totale ci sò una cinquantina di studienti è duie mila ore di classi. À u principiu, i studienti sò sempre appiccicati nantu à questu tema è partanu. Dopu ogni studiente, a metodulugia è i materiali sò stati adattati. In l'annu passatu, i studienti ùn sò più appiccicati nantu à questu tema, cusì aghju decisu di sparte e mo scuperte.

Perchè tante lettere? I cicli sò cusì elementari!

Cumu l'aghju scrittu sopra, per i sviluppatori pratichi è per i studienti forti, a cumplessità di u cuncettu di loops pò esse sottovalutata. Per esempiu, pudete dà una lezione longa, vede capi nodding è ochji intelligenti. Ma quandu si tratta di risolve ogni prublema, cumincianu stupore è prublemi inspiegabili. Dopu à a cunferenza, i studienti avianu prubabilmente solu una cunniscenza parziale. A situazione hè aggravata da u fattu chì i studienti stessi ùn ponu micca esprime ciò chì hè esattamente a so illusione.
Un ghjornu aghju realizatu chì i studienti percivevanu i mo esempi cum'è ieroglyphs. Questu hè, cum'è pezzi indivisibili di testu in quale avete bisognu di aghjunghje una lettera "magica" è hà da travaglià.
A volte aghju nutatu chì i studienti pensanu chì per risolve un prublema specificu avete bisognu calcosa altru un disignu chì ùn aghju micca cupertu ancu. Ancu s'è a suluzione necessitava solu una mudificazione ligera di l'esempiu.

Allora aghju avutu l'idea chì l'enfasi ùn deve esse micca nantu à a sintassi di l'espressioni, ma nantu à l'idea di refactoring codice ripetitivu utilizendu cicli. Una volta chì i studienti anu ammaistratu sta idea, ogni sintassi pò esse migliuratu cù pocu pratica.

Quale è perchè insegnu ?

Siccomu ùn ci sò micca esami d'ingressu, e classi ponu include studienti forti è assai debuli. Pudete leghje più nantu à i mo studienti in l'articulu Ritrattu di i studienti di i corsi di sera
I strived per assicurà chì tutti quelli chì volenu amparà a prugrammazione ponu amparà.
I mo classi sò tenuti individualmente è u studiente paga u so propiu soldi per ognunu. Sembra chì i studienti ottimisanu i costi è esigenu u minimu. In ogni casu, a ghjente và à e classi in faccia cun un maestru vivu micca per a cunniscenza stessu, ma per a cunfidenza di ciò chì anu amparatu, per un sensu di prugressu è per l'appruvazioni di l'espertu (insegnante). Se i studienti ùn sentenu micca u prugressu in u so apprendimentu, andaranu. In generale, e classi ponu esse strutturate in modu chì i studienti sentenu u prugressu in l'aumentu di u numeru di strutture familiari. Vale à dì, prima avemu studiatu mentre in detail, dopu studiamu per, dopu fà mentre, è avà avemu un cursu di milla è una notte pronti, in quale ciculi solu sò studiati per dui mesi, è à a fine - un studiente chì hà scrittu una biblioteca standard sottu dittatura. Tuttavia, per risolve i prublemi pratichi, ùn hè micca solu bisognu di cunniscenze di u materiale, ma ancu di l'indipendenza in a so applicazione è in a ricerca di nova infurmazione. Dunque, per i corsi in faccia, pensu chì u principiu currettu hè di insignà u minimu è incuragisce u studiu indipendente di sfumature è temi cunnessi. In u tema di i loops, cunsiderà chì a custruzzione mentri hè u minimu. Pudete capisce u principiu da ellu. Sapendu u principiu, pudete ammaistrà sia per è fà mentre sè stessu.

Per ottene a maestria di u materiale da i studienti debuli, a descrizzione di a sintassi ùn hè micca abbastanza. Hè necessariu di dà affari più sèmplice, ma variate, è descrive esempi in più detail. In ultimamente, a vitezza di u sviluppu hè limitata da a capacità di u studiente di trasfurmà l'espressioni è di ricerca di mudelli. Per i studienti intelligenti, a maiò parte di l'assignazioni saranu noiosi. Quandu studia cun elli, ùn avete micca bisognu di risolve u 100% di i prublemi. U mo materiale pò esse vistu à u mo github. Hè veru, u repository hè più cum'è u grimoriu di un stregone - nimu, ma mè, capirà ciò chì hè induve, è se falla u cuntrollu, pudete impazzisce.

A metodulugia hè orientata à a pratica

A teoria hè spiegata cù l'esempiu di risolve un prublema. In un fundamenti di a classa di prugrammazione induve i rami è i loops sò insignati, ùn hè simplicemente micca pussibule di dà una lezione utile nantu à un tema per una ora sana. 15-20 minuti hè abbastanza per spiegà u cuncettu. I difficultà principali si sviluppanu quandu eseguisce travaglii pratichi.
I prufessori principianti ponu scuzzulate l'operatori, i rami, i loops è l'arrays in una sola lezione. Ma i so studienti affruntà u prublema di assimilà sta infurmazione.
Hè necessariu micca solu per dì à u materiale, ma ancu per assicurà chì l'ascultori capiscenu.

U fattu di ammaistrà un tema hè determinatu da a manera chì u studiente face u travagliu indipendente.
Se un studiente hà sappiutu risolve un prublema nantu à un tema senza l'aiutu di un maestru, allora u tema hè stata maestru. Per assicurà l'autotesta, ogni attività hè descritta in una tabella cù scenarii di prova. I travaglii anu un ordine chjaru. Saltà i travaglii ùn hè micca cunsigliatu. Se u travagliu attuale hè troppu difficiule, allora passà à u prossimu hè inutile. Hè ancu più cumplicatu. Per chì u studiente pò ammaistrà u compitu cumplessu attuale, parechje tecniche sò spiegate cù l'esempiu di u primu prublema. In verità, tuttu u cuntenutu di u tema si riduce à tecniche per superà e difficultà. Cicli sò più di un effettu latu.

U primu compitu hè sempre un esempiu. U sicondu differ ligeramente è hè realizatu "indipendente" immediatamente dopu à u primu sottu a tutela di un maestru. Tutti i travaglii successivi sò destinati à prestu attenzione à parechji picculi cose chì ponu causà misconceptions.

A spiegazione di l'esempiu hè un dialogu in quale u studiente hà bisognu di chjamà a propagazione è a validazione incruciata per assicurà chì hà ammaistratu una parte di u materiale.

Seraghju banale è dì chì u primu esempiu nantu à u tema hè assai impurtante. Se tenete u materiale per un travagliu indipendente estensivu, l'omissioni di u primu esempiu pò esse corrette. Se ùn ci hè nunda altru oltri l'esempiu, allura u studiente più prubabilmente ùn hà micca maestru di u tema.

Mentre o per ?

Unu di i prublemi cuntruversi hè a scelta di a custruzzione per l'esempiu: mentri o per. Una volta, un mio amicu sviluppatore praticante senza sperienza d'insignamentu hà passatu una ora per cunvince chì u ciclu for era u più faciule da capisce. L'argumenti si sò ridutti à "tuttu in questu hè chjaru è dispostu in u so locu". Tuttavia, a causa principale di difficultà per i principianti veri hè l'idea di u ciculu stessu, è micca a so scrittura. Se una persona ùn capisce micca sta idea, allora averà difficultà cù a sintassi. Appena l'idea hè realizata, i prublemi di u disignu di u codice spariscenu per sè stessu.

In i mo materiali, u tema di i loops seguita u tema di branching. A similarità esterna di se è mentri ci permette di fà una analogia diretta: "quandu a cundizione in l'intestazione hè vera, allora u corpu hè eseguitu". L'unica peculiarità di u ciculu hè chì u corpu hè eseguitu parechje volte.

U mo secondu argumentu hè chì mentre richiede menu formattazione cà per. Meno furmatu significa menu sbagli stupidi cù virgule è parentesi mancanti. I principianti ùn anu micca sviluppatu abbastanza attente è meticulosità per evità automaticamente errori di sintassi.
U terzu argumentu hè spiegatu in parechji boni libri cum'è u primu argumentu.

Se u studiente pò facilmente trasfurmà l'espressioni, allora pudete parlà per passà. Allora u studiente sceglie ciò chì li piace di più. Sì i trasfurmazioni causanu difficultà, allora hè megliu ùn distractà a vostra attenzione. Chì u studiente prima risolve tuttu cù u tempu. Una volta chì avete ammaistratu u tema di i loops, pudete riscrive e suluzioni per praticà a cunversione mentre à per.
I loops postcondition sò una bestia abbastanza rara. Ùn passanu micca tempu in tuttu. Se un studiente hà ammaistratu l'idee di identificà mudelli è trasfurmà l'espressioni, pò capisce senza u mo aiutu.

Quandu dimustrà u primu esempiu à i studienti forti, aghju attiratu l'attenzione à u fattu chì in u primu esempiu hè impurtante di registrà micca solu a suluzione, ma ancu tutta a catena d'azzioni chì hà purtatu à u risultatu. I studienti lazy ponu trascuratà a scrittura è copià solu l'algoritmu finali. Hanu bisognu à esse cunvinta chì un ghjornu un compitu difficiule vinarà u so modu. À scioglie lu, vi tuccherà à seguità i passi comu in stu esempiu. Hè per quessa hè impurtante di registrà tutte e tappe. In i seguenti prublemi, serà pussibule di lascià solu a versione finale di a suluzione.

L'idea principale di l'automatizazione hè chì affidemu un urdinatore per fà u travagliu di rutina per una persona. Una di e tecniche basiche hè di scrive loops. Hè utilizatu quandu parechji azzioni ripetuti identici sò scritti in un prugramma in una fila.

Esplicito hè megliu cà implicitu

Puderia parè una bona idea di visualizà a stessa frasa parechje volte in u primu compitu di looping. Per esempiu:

Hurrah, funziona!
Hurrah, funziona!
Hurrah, funziona!
Hurrah, funziona!
Hurrah, funziona!
Hurrah, funziona!
Hurrah, funziona!
Hurrah, funziona!

Questa opzione hè male perchè u valore di u cuntatore ùn hè micca visibile in u output. Questu hè un prublema per i principianti. Ùn la sottovalutate micca. À u principiu, stu compitu era u primu, è u compitu di derivà una seria di numeri in ordine crescente era u sicondu. Era necessariu di introduci termini supplementari "ciclu N volte" è "ciclu da A à B", chì sò essenzialmente a stessa cosa. Per ùn creà entità innecessarii, decisu di vede solu un esempiu cù a pruduzzioni di una seria di numeri. Pochi pirsuni riescenu à amparà à tene un cuntatore in u so capu è mudificà u cumpurtamentu di un prugramma in u so capu senza preparazione. Certi studienti scontranu prima a modellazione mentale nantu à u tema di i cicli.
Dopu qualchì pratica, aghju datu u compitu di ripetiri u listessu testu per esse risoltu indipindente. Se dà un contatore visibile prima è dopu un invisibule, i studienti anu menu prublemi. Calchì volta u suggerimentu "ùn scrivite micca u contatore nantu à u screnu" hè abbastanza.

Cumu l'altri spieganu?

In a maiò parte di i materiali educativi in ​​Internet, a sintassi di u ciculu hè datu cum'è parte di una "lectura". Per esempiu, in developer.mozilla.org (attualmente), parechje altre custruzzioni sò descritte cù u ciclu while. In questu casu, solu i disinni stessi sò datu in forma di mudelli. U risultatu di u so lanciu hè scrittu in parolle, ma ùn ci hè micca illustrazione. In u mo scusa, una tale presentazione di u tema multiplica l'utilità di tali materiali per zero. U studiente pò riscrive u codice è eseguisce ellu stessu, ma hà ancu bisognu di un standard per paragunà. Cumu pudete capisce chì un esempiu hè stata riscritta currettamente se ùn ci hè nunda per paragunà u risultatu?
Quandu solu un mudellu hè datu, senza un esempiu, diventa ancu più difficiule per u studiente. Cumu capisce chì i frammenti di codice sò posti currettamente in u mudellu? Pudete pruvà à scrive in una certa manera, e poi corre. Ma s'ellu ùn ci hè micca standard per paragunà u risultatu, allora u lanciamentu ùn aiuterà ancu.

In u cursu C++ nantu à l'Intuitivu, a sintassi di loop hè intarrata in a terza pagina di a Lecture 4 nantu à u tema "operatori". Quandu spiegà a sintassi di i loops, un enfasi particulari hè pusatu nantu à u terminu "operatore". U terminu hè prisentatu cum'è un inseme di fatti cum'è "simbulu; questu hè una dichjarazione", "{} hè una dichjarazione cumposta", "u corpu di u ciclu deve esse una dichjarazione". Ùn mi piace micca questu approcciu perchè pare chì ammuccià relazioni impurtanti daretu à un termini. Parsing u codice fonte di un prugramma in termini à questu livellu hè necessariu da i sviluppatori di compilatori per implementà a specificazione di a lingua, ma micca da i studienti cum'è una prima approssimazione. I principianti à a prugrammazione sò raramente abbastanza meticulosi per pagà cusì attente à i termini. Hè una persona rara chì si ricorda è capisce e parolle novi a prima volta. Quasi nimu pò applicà currettamente un termu chì hà appena amparatu. Dunque, i studienti ricevenu assai errori cum'è "Aghju scrittu mentri (a <7); {, ma u prugramma ùn funziona micca".
In u mo parè, à u principiu hè megliu dà a sintassi di a custruzzione immediatamente cù parentesi. L'opzione senza parentesi deve esse spiegata solu se u studiente hà una quistione specifica: "perchè ùn ci hè micca parentesi è funziona".

In u libru di Okulov 2012 "Fundamentals of Programming", una introduzione à i loops principia cù u mudellu for, dopu dà cunsiglii per u so usu, è dopu immediatamente vai à a sezione sperimentale di a lezioni. Capiscu chì u libru hè statu scrittu per quella minurità di studienti assai capaci chì raramente venenu à e mo classi.

In i libri populari, u risultatu di frammenti di codice hè sempre scrittu. Per esempiu, Shildt's "Java 8. The Complete Guide" edizione 2015. Prima, un mudellu hè datu, dopu un prugramma di esempiu è subitu dopu - u risultatu di l'esekzione.

Per esempiu, cunzidira un ciclu di tempu chì face u reversu
countdown partendu da 10, è esattamente 10 linee di "misure" sò affissate:

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

Una volta eseguitu, stu prugramma produce dece "cicli" cum'è seguente:
такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

L'approcciu di descrizzione di un mudellu, un prugramma di esempiu è u risultatu di u prugramma hè ancu utilizatu in u libru "Javascript for Kids" è in u cursu js in w3schools.com. U formatu di a pagina web permette ancu questu esempiu per esse interattivu.

U libru di Stroustrup 2016 Principi è Pràtica Using C++ andò ancu più luntanu. U primu passu hè di spiegà quale risultatu deve esse ottenutu, è dopu chì u testu di u prugramma hè mostratu. Inoltre, ùn piglianu micca solu un prugramma casuale cum'è un esempiu, ma dà una escursione in a storia. Questu aiuta à attirà l'attenzione: "Fighjate, questu ùn hè micca solu un testu inutile. Vede qualcosa di significativu ".

Comu esempiu di iterazione, cunzidira u primu prugramma eseguitu nantu à una macchina di prugramma almacenata (EDSAC). Hè statu scrittu da David Wheeler à u Laboratoriu di Computer di l'Università di Cambridge, Inghilterra u 6 di maghju di u 1949. Stu prugramma calcula è stampa una lista simplice di quadrati.
0 0
1 1
2 4
3 9
4 16
...
98 9604
99 9801

Quì, ogni linea cuntene un numeru seguitatu da un caratteru di tabulazione ('t') è u quadru di quellu numeru. A versione C++ di stu prugramma hè cusì:

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

Curiosamente, u mudellu di sintassi ùn hè micca descrittu in stu libru. Stroustrup in u manuale di l'istruttore (traduzzione) sottolinea chì rispettu l'intelligenza di i so studienti. Forsi l'abilità di identificà un mudellu in parechji esempii hè cunsideratu una manifestazione di tali intelligenza.

Cume mi spiegà

L'approcciu di Stroustrup: discrive u risultatu, poi risolve u prublema, è dopu un analisi indipendente da u studiente - pari u più pensativu. Per quessa, decisu di piglià com'è una basa, ma dite cù un esempiu menu storicu - u compitu di derivà una "tavula di cuntenutu". Forma un ancore ricunnoscevule in modu chì pudete poi dì "ricordate u compitu nantu à a tavola di cuntenutu" è cusì chì i studienti ricurdate esattamente questu. In u mo esempiu, aghju pruvatu à prevene dui più di i misconceptions più cumuni. Dopu scriveraghju nantu à elli in più detail.

In questu compitu, avemu intruduciutu tecniche per risolve i prublemi cumplessi. A decisione iniziale deve esse fatta primitiva è simplice. Ebbè, allura vi pò pinsà quantu à migliurà sta suluzione.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

Sicondu i mo osservazioni, l'approcciu di "template-example-result" in diverse cumminazzioni porta sempre à u fattu chì i studienti percepiscenu u ciculu cum'è un hieroglyph. Questu hè manifestatu in u fattu chì ùn anu micca capitu perchè ci era una cundizione per scrive quì, cumu sceglie trà i ++ è i - è altre cose apparentemente evidenti. Per evitari sti misconceptions, l'approcciu di parlà di ciculi deve enfatizà u significatu di ripetiri l'azzioni idèntica è solu dopu formalizà cù una struttura. Dunque, prima di dà a sintassi di u ciclu, avete bisognu di risolve u prublema in capu. Una suluzione primitiva à u prublema di u tavulu di cuntenutu s'assumiglia cusì:

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

Cumu pò esse migliuratu?
Sustituisce l'azzioni monotoni cù un ciculu.
Chì azzioni sò ripetuti in una fila senza cambiamenti?
Ùn ci hè nimu in questu fragmentu. Tuttavia, i cumandamenti per vede a parolla "Capitulu" cù un numeru sò assai simili à l'altri.
Dunque, u prossimu tappa hè di truvà a diffarenza trà i frammenti. Hè solu in questu compitu chì tuttu hè ovvi, allora micca i cumandamenti unichi seranu ripetuti, ma blocchi di codice di 5 linee o più. Avete bisognu di circà micca solu in a lista di cumandamenti, ma in custruzzioni di ramificazione o di loop.
In l'esempiu, a diffarenza trà i cumandamenti hè in u numeru dopu a parolla "Capitulu".
Una volta chì a diferenza hè truvata, avete bisognu di capiscenu u mudellu di cambiamentu. U fragmentu sfarente hè u numeru? Hè in constantemente crescente o diminuite? Cumu cambia u valore di un numeru trà dui squadre fiancu à fiancu ?
In l'esempiu, u numeru dopu à a parolla "Capitulu" aumenta in increments di 1. A diferenza si trova, u mudellu hè revelatu. Avà pudete rimpiazzà u fragmentu diffirenti cù una variabile.
Avete bisognu di dichjarà una tale variabile prima di u primu di i frammenti ripetuti. Una tale variabile hè generalmente chjamata I o j o qualcosa più detallatu. U so valore iniziale deve esse uguali à u primu valore affissatu nantu à u screnu. In l'esempiu, u primu valore hè 1.
Chì valore iniziale deve esse pigliatu per vede a serie di numeri "100, 101, 102, 103, 104, 105"?
U primu numeru in questa serie hè 100.
Dopu à ogni cumanda di output, avete bisognu di aumentà u valore di sta variabile da 1. Questa unità hè u passu di cambiamentu.
Chì passu serà in a serie di numeri "100, 102, 104, 106"?
Passu 2 in questa fila.
Dopu avè rimpiazzatu u frammentu sfarente cù una variabile, u codice serà cusì:

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

Dopu applicà a tecnica "esprime u mudellu di una variabile" in u codice, avete parechji gruppi di azzioni idèntica chì vanu in una fila. Avà l'azzioni ripetuti ponu esse rimpiazzati cù un ciculu.

A sequenza di risolve un prublema induve avete bisognu di usà loops hè custituita da i seguenti passi:

  1. Risolve "head-on" cù parechji cumandamenti separati
  2. Truvate un mudellu
  3. Esprime u mudellu di una variabile
  4. Design cum'è un ciclu

In seguitu, novi termini sò intrudutti per chì u studiente ùn si trova micca in a situazione di "Aghju capitu tuttu, ma ùn possu micca dì":
- un contatore hè sempre una variabile chì hè necessariu per seguità u numeru di passi in un ciclu. Di genere un integer chì hè paragunatu à a limitazione.
- counter step - discrizzione di u mudellu di cambiamenti di counter.
- constraint - un numeru o variabile cù quale u contatore hè paragunatu per chì l'algoritmu hè finale. U valore di u contatore cambia per avvicinà u limitu.
- corpu di loop - un inseme di cumandamenti chì saranu ripetuti. Quandu dicenu "u cumandamentu hè scrittu in un ciclu", significanu u corpu.
- iterazione di loop - esecuzione unica di u corpu di u ciclu.
- Loop condition - una espressione logica chì determina se un'altra iterazione serà eseguita. (Ci pò esse cunfusione cù strutture ramificate quì)
Avete bisognu à esse preparatu per u fattu chì à u primu studiente aduprà termini per altri scopi. Questu hè appiicatu à i forti è i debuli. Stabbilisce una lingua cumuna hè un arte. Avà scriveraghju brevemente: avete bisognu di stabilisce u compitu "evidenzià u frammentu di codice cù <term>" è aduprà sti termini bè in a cunversazione.
Dopu a trasfurmazioni cù un ciclu, u frammentu hè ottenutu:

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

U principale misconception

Un misconception populari trà i studienti hè chì ponenu l'azzioni in un ciclu chì deve esse fattu solu una volta. Per esempiu cusì:

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

I studienti si trovanu in stu prublema tuttu u tempu, sia à u principiu sia in prublemi più cumplessi.
Cunsigliu chjave in questu casu:

Quante volte duvete ripete u cumandamentu: una volta o parechje volte?

I cumandamenti per stampà e parolle "Introduzione" è "Conclusione" è dichjarà è inizializzanu a variabile i ùn sò micca cum'è altre azzioni ripetitive. Sò eseguiti solu una volta, chì significa chì deve esse scritti fora di u corpu di u ciclu.

Tutti i trè tappe di a suluzione duveranu stà in u codice in modu chì pudete riferite à elli dopu in casu di difficultà. Hè abbastanza per cummentà e prime duie opzioni per ùn interferiscenu micca.
L'attenzione di u studiente deve esse attirata da i seguenti fatti:
- In una cundizione di loop, un contatore è un limitu sò generalmente paragunati. U cuntatore pò cambià in u corpu di u ciclu, ma u limitu ùn pò micca. Per rompe sta regula, avete bisognu di furmulà ragiuni convincenti.
- I cumandamenti per vede e parolle "Introduzione" è "Conclusione" sò situati fora di u corpu di u ciclu. Avemu bisognu di eseguisce 1 volta. "Introduzione" - prima di ripetiri l'azzioni, "Conclusione" - dopu.
In u prucessu di cunsulidà stu tema, maestru di i prossimi, è ancu di trattà di difficultà, hè utile ancu per i studienti forti di dumandà a quistione: "Quante volte deve esse realizatu sta azzione? Unu o parechji ?

Sviluppu di cumpetenze supplementari

In u prucessu di studià i cicli, i studienti sviluppanu ancu a capacità di diagnosticà è risolve i prublemi. Per fà u diagnosticu, u studiente hà bisognu di prisentà u risultatu desideratu è paragunà cù u risultatu attuale. L'azzioni currettive dipendenu da a diffarenza trà elli.
Siccomu i studienti in questa tappa anu sempre poca idea di u risultatu "desideratu", ponu fucalizza nantu à e dati di teste. In regula, nimu in questu stadiu capisce ancu ciò chì pò sbaglià è cumu si tratta. Dunque, scrivu in un quaderno una descrizzione di i prublemi tipici è parechje manere di risolve. Sceglie u più adattatu hè u compitu di u studiente stessu.
Un registru hè necessariu per dumandà "Ciò chì era aspittatu hè accadutu?", "Quale di sti situazioni hè accadutu avà?", "A suluzione applicata hà aiutatu?"

  1. U numaru d'azzioni hè 1 menu o più di l'aspittatu. Soluzioni:
    - aumenta u valore iniziale di u cuntatore da 1.
    - rimpiazzà l'operatore di paragone strettu (< o >) cù un operatore micca strettu (<= o >=).
    - cambia u valore limite à 1.
  2. L'azzioni in un ciclu sò realizati senza piantà, indefinitu. Soluzioni:
    - aghjunghje un cumandamentu di cambiamentu di contatore se manca.
    - riparà u cumandamentu di cambiamentu di contatore in modu chì u so valore sia più vicinu à u limitu.
    - sguassate u cumandamentu di cambiamentu di restrizzione s'ellu hè in u corpu di u ciclu.
  3. U numaru d'azzioni in un ciclu hè più di 1 menu o più di l'aspittatu. L'azzione in u ciclu ùn hè stata eseguita ancu una volta. Prima, avete bisognu di scopre i valori attuali di e variàbili appena prima di inizià u ciclu. Soluzioni:
    - cambià u valore iniziale di a limitazione
    - cambià u valore iniziale di u contatore

U prublema 3 generalmente implica l'usu di a variabile sbagliata o micca resettate u contatore à zero.

Dopu à sta spiegazione, u studiente pò ancu avè diverse idee sbagliate nantu à cumu funziona i loops.
Per dissipà i più cumuni, vi dugnu i seguenti compiti:

  1. In quale u limitu, u valore iniziale di u contatore, o u passu di u contatore hè inseritu da l'utilizatore.
  2. In quale u valore di u contatore deve esse usatu in qualchì espressione aritmetica. Hè cunsigliatu di utilizà un contatore in l'espressione radicali o in u denominatore per chì a diffarenza ùn hè micca lineale.
  3. In quale u valore di u contatore ùn hè micca visualizatu nantu à u screnu mentre u ciclu hè in esecuzione. Per esempiu, affissendu u numeru necessariu di frammenti di testu identici o disegnu una figura cù gràfiche di tartaruga.
  4. In quale avete bisognu di fà prima alcune azzioni ripetitive, è dopu altri.
  5. In quale avete bisognu di fà altre azzioni prima è dopu ripetiri

Per ogni compitu, avete bisognu di furnisce dati di prova è u risultatu previstu.

Per capisce quantu rapidamente pudete spustà, avete bisognu di leghje i termini di sti prublemi è dumandate: "cumu si differenzianu da l'esempiu?", "Chì ci vole à cambià in l'esempiu per risolviri?" Se u studiente risponde in modu significativu, allora ch'ellu risolve almenu unu in a classe, è u restu in casa da ellu stessu. Se a suluzione hè successu, allora pudemu cumincià à spiegà e cundizioni in i loops.
Sì avete prublemi à risolve i prublemi nantu à u vostru propiu, avete bisognu di travaglià tuttu in a classe. Per evitari di risolve u prublema chì ricorda di disegnà una civetta, ricumandemu prima di risolve u prublema in una manera micca universale. Hè cusì chì a suluzione passa a prima prova è ùn usa micca a custruzzione di u ciclu. Eppo, allora applicà e trasfurmazioni per ottene l'universalità di a suluzione.

Loops è rami

In u mo parè, hè utile per dà u tema "cicli in rami" separatamente. Cusì chì dopu pudete vede a diffarenza trà cuntrollà una cundizione parechje volte è cuntrollà una volta.
I travaglii per a cunsulidazione seranu nantu à a pruduzzioni di numeri da A à B, chì sò inseriti da l'utilizatore:
- sempre in ordine crescente.
- ascendante o discendente secondu i valori di A è B.

U tema di "ramificazione in i loops" deve esse spustatu solu dopu chì u studiente hà maestru di e tecniche: "sustituì un mudellu cù una variabile" è "sustituì l'azzioni ripetitive cù un ciclu".
U mutivu principale per aduprà rami in i loops hè anomalie in u mudellu. In u mezu si rompe sicondu i dati iniziali.
Per quelli studienti chì sò capaci di circà una suluzione cumminendu tecnichi simplici, hè abbastanza à dì "ramificazione pò esse scritta in loops" è dà u prublema "per esempiu" cumpletamente per risolve indipindente.
Esempiu di travagliu:

L'utilizatore inserisce u numeru X. Mostra i numeri da 0 à 9 in una colonna è mette un segnu "+" in fronte à u numeru chì hè uguali à X.

Se 0 hè statu inseritu0+
1
2
3
4
5
6
7
8
9

Se 6 hè statu inseritu0
1
2
3
4
5
6+
7
8
9

Se 9 hè statu inseritu0
1
2
3
4
5
6
7
8
9+

Se 777 hè statu inseritu0
1
2
3
4
5
6
7
8
9

Se una breve spiegazione ùn hè micca abbastanza per scrive cù un ciclu, allora avete bisognu di ottene una suluzione universale à u stessu prublema senza un ciclu.
Averete una di duie opzioni:
Desiratu

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

Possibile

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

Dà un compitu simili in anticipu, mentre studia u tema di branching.
Se u studiente vene cun una opzione "pussibile", allora avete bisognu di dì chì ci ponu esse parechje suluzione à u listessu prublema. Tuttavia, sò diffirenti in a so resistenza à i cambiamenti di esigenze. Fate a quistione: "Quanti posti in u codice avissi da esse currettu se aghju avutu à aghjunghje un altru numeru?" In a versione "pussibile", avete bisognu di aghjunghje un ramu più è aghjunghje un novu numeru in 10 altri posti. In u "desiratu" hè abbastanza per aghjunghje solu un ramu.
Stabilite u compitu per ripruduce l'opzione "desirata", dopu truvà un mudellu in u codice, eseguite un sustitutu variabile è scrivite un ciclu.
Sè avete una idea di cumu risolve stu prublema senza un ciclu in qualchì altru modu, scrivite in i cumenti.

Loops in Loops

In questu tema, avete bisognu di attentu à i seguenti:
- i cuntatori per i loops interni è esterni deve esse variàbili diffirenti.
- u contatore per u ciclu internu deve esse resettatu parechje volte (vale à dì, in u corpu di u ciclu esterno).
- in i travaglii di output di testu, ùn pudete micca scrive prima una lettera in parechje linee, è dopu a seconda. Prima deve esse stampatu tutte e lettere di a prima linea, dopu tutte e lettere di a seconda, è cusì.

Hè megliu cumincià à spiegà u tema di i loops in i loops spieghendu l'impurtanza di resetting u contatore à zero.
Esempiu di travagliu:

L'utilizatore inserisce dui numeri: R è T. Stampate duie linee di caratteri "#". A prima linea deve cuntene R caratteri. A seconda linea cuntene T pezzi. Se un numeru hè negativu, mostra un missaghju d'errore.

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

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

R=-1, T=6U valore R deve esse micca negativu

R=6, T=-2U valore T deve esse micca negativu

Ovviamente, stu prublema hà ancu almenu duie suluzioni.
Desiratu

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

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

A diferenza hè chì in a suluzione "pussibile", una seconda variabile hè stata utilizata per pruduce a seconda linea. Duvete insiste à aduprà a listessa variabile per i dui cicli. Questa limitazione pò esse ghjustificata da u fattu chì una suluzione cù un contatore per dui ciculi serà un'illustrazione di u terminu "reset counter". Capisce stu termini hè necessariu quandu risolve i seguenti prublemi. Cum'è un cumprumissu, pudete salvà e duie suluzioni à u prublema.

Un prublema tipicu cù l'usu di una variabile di cuntatore per dui loops appare cusì:
R = 5, T = 11#####
######

U numaru di caratteri in a seconda linea ùn currisponde micca à u valore di T. Sè avete bisognu di aiutu cù questu prublema, allora avete bisognu di guardà in e note nantu à i prublemi tipici cù i loops. Questu hè u sintumu #3. Hè diagnusticatu s'ellu aghjunghje un valore di u cuntrariu immediatamenti prima di u sicondu ciclu. Currettu da resetting. Ma hè megliu ùn dì micca questu subitu. U studiente deve pruvà à formulà almenu una ipotesi.

Ci hè, sicuru, una altra suluzione. Ma ùn aghju mai vistu trà i studienti. À u stadiu di studià i ciculi, a storia nantu à questu distrarà l'attenzione. Pudete vultà à questu più tardi quandu amparate nantu à e funzioni di stringa.
Possibile #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));

U prossimu compitu necessariu:

Mostra i numeri da 0 à 9. Ogni numeru deve esse nantu à a so propria linea. U numaru di cifre in una linea (W) hè inseritu da u teclatu.

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

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

Sè un studiente hà ammaistratu a tecnica di rimpiazzà una variàbbili, allura vi affruntà abbastanza prestu. Un prublema pussibule serà di novu in resetting the variable. Se ùn pudete micca trattà a trasfurmazioni, significa chì erate in furia è avete bisognu di risolve i prublemi più simplici.

Grazie per a vostra attenzione. Mi piace è abbonate à u canali.

PS Se truvate typos o errori in u testu, fatemi sapè. Questu pò esse fattu selezziunate una parte di u testu è pressu "⌘ + Enter" in Mac, è "Ctrl / Enter" nantu à i tastieri classici, o attraversu missaghji privati. Se queste opzioni ùn sò micca dispunibili, scrivite nantu à l'errore in i cumenti. Grazie!

Solu l'utilizatori registrati ponu participà à l'indagine. Firmà lu, per piacè.

Sondaggio per i lettori senza karma

  • 20,0%Insegnu prufessiunale, +12

  • 10,0%Insegnu prufessiunale, -11

  • 70,0%Ùn insegnu micca, +17

  • 0,0%Ùn insegni micca, -10

  • 0,0%Altru 0

10 utilizatori anu vutatu. 5 utilizatori si sò astenuti.

Source: www.habr.com

Add a comment