{"id":40208,"date":"2020-02-01T06:04:35","date_gmt":"2020-02-01T03:04:35","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly"},"modified":"2020-02-01T06:04:35","modified_gmt":"2020-02-01T03:04:35","slug":"kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly","title":{"rendered":"Come insegnare a superare le difficolt\u00e0 e, allo stesso tempo, a scrivere cicli","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Sebbene si tratti di un argomento basilare, questo articolo \u00e8 scritto per professionisti esperti. L'obiettivo \u00e8 mostrare quali fraintendimenti hanno i principianti nella programmazione. Per i programmatori praticanti, questi problemi sono gi\u00e0 stati risolti da tempo, dimenticati o addirittura mai notati. L'articolo potrebbe rivelarsi utile, nel caso vi capiti di dover aiutare qualcuno su questo argomento. Vengono tracciate parallelismi con materiali di vari libri di programmazione di autori come Schildt, Stroustrup e Okulov.<\/p>\n<p>L'argomento sui cicli \u00e8 stato scelto perch\u00e9 molti abbandonano proprio durante l'apprendimento della programmazione.<\/p>\n<p>Questa metodologia \u00e8 progettata per studenti meno forti. Di solito, gli studenti pi\u00f9 capaci non si bloccano su questo tema e non \u00e8 necessario elaborare metodologie particolari per loro. L'obiettivo secondario dell'articolo \u00e8 quello di rendere questa metodologia applicabile a tutti gli studenti e a tutti gli insegnanti, invece di essere limitata a \u00abfunziona per tutti gli studenti, ma solo con un insegnante\u00bb. Non pretendo di essere assolutamente originale. Se gi\u00e0 utilizzate una metodologia simile per insegnare questo argomento, vi prego di comunicarmi in cosa il vostro approccio differisce. Se decidete di applicarla, raccontatemi come \u00e8 andata. Se una metodologia simile \u00e8 descritta in un libro, vi prego di indicare il titolo.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nHo sviluppato questa metodologia per 4 anni, lavorando individualmente con studenti di vari livelli. In totale, ho avuto circa cinquanta studenti e duemila ore di lezione. Inizialmente, gli studenti si bloccavano sempre su questo tema e se ne andavano. Dopo ogni studente, la metodologia e i materiali venivano corretti. Nell'ultimo anno, gli studenti non si bloccano pi\u00f9 su questo tema, quindi ho deciso di condividere le mie esperienze.<\/p>\n<h4>Perch\u00e9 scrivere tante parole? I cicli sono cos\u00ec elementari!<\/h4>\n<p>\nCome ho gi\u00e0 detto, per i programmatori praticanti e per gli studenti pi\u00f9 forti, la difficolt\u00e0 del concetto di cicli pu\u00f2 essere sottovalutata. Ad esempio, si pu\u00f2 tenere una lunga conferenza, vedere teste annuire e occhi brillanti. Ma nel tentativo di risolvere un qualsiasi problema, ci si blocca e si incontrano problemi inspiegabili. Dopo la conferenza, gli studenti probabilmente hanno solo una comprensione parziale. La situazione \u00e8 aggravata dal fatto che gli studenti non riescono a esprimere qual \u00e8 esattamente il loro fraintendimento.<br \/>\nUn giorno ho realizzato che gli studenti percepiscono i miei esempi come geroglifici. Cio\u00e8 come segmenti di testo indecifrabili, nei quali bisogna scrivere una sorta di lettera \"magica\" affinch\u00e9 tutto funzioni.<br \/>\nA volte notavo che gli studenti pensano che per risolvere un compito specifico sia necessaria <i>un'altra<\/i> costruzione che non ho ancora menzionato. Anche se per risolvere la questione era sufficiente modificare un po' l'esempio.<\/p>\n<p>Quindi sono arrivato all'idea che l'attenzione principale deve essere rivolta non alla sintassi delle espressioni, ma all'idea di rifattorizzare il codice ripetitivo attraverso i cicli. Non appena gli studenti padroneggiano questa idea, qualsiasi sintassi viene appresa grazie a piccoli esercizi.<\/p>\n<h4>A chi e perch\u00e9 insegno<\/h4>\n<p>\nPoich\u00e9 non ci sono esami di ammissione, in aula possono esserci sia studenti forti che molto deboli. Potete leggere di pi\u00f9 sui miei studenti nell'articolo <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/350360\/\">Ritratto degli ascoltatori dei corsi serali<\/a><\/noindex><br \/>\nIl mio obiettivo era quello di far apprendere la programmazione a chiunque desiderasse farlo.<br \/>\nLe mie lezioni si svolgono individualmente e lo studente paga di tasca propria per ogni sessione. Sembrerebbe che gli studenti cerchino di ottimizzare le spese e richiedano il minimo indispensabile. Tuttavia, le persone partecipano a lezioni in presenza con un insegnante non solo per le conoscenze, ma per la sicurezza di aver assimilato ci\u00f2 che \u00e8 stato insegnato, per la sensazione di progresso e per l'approvazione dell'esperto (insegnante). Se gli studenti non sentono di fare progressi nel loro apprendimento, si allontaneranno. In generale, \u00e8 possibile strutturare le lezioni in modo tale che gli studenti avvertano un progresso nell'aumento delle costruzioni familiari. Pertanto, iniziamo studiando in dettaglio i cicli while, poi quelli for, poi do while, e cos\u00ec abbiamo un corso che dura mille e una notte, in cui i cicli vengono studiati per due mesi, e alla fine c'\u00e8 uno studente che ha scritto la libreria standard su dettatura. Tuttavia, per risolvere compiti pratici, non basta conoscere il materiale, ma occorre anche autonomia nel suo utilizzo e nella ricerca di nuove informazioni. Pertanto, per i corsi in presenza, considero giusto il principio di insegnare le basi e incentivare lo studio autonomo di dettagli e argomenti correlati. Riguardo ai cicli, considero la costruzione while come il minimo essenziale. Da essa \u00e8 possibile comprendere il principio. Conoscendo il principio, \u00e8 possibile padroneggiare autonomamente anche for e do-while.<\/p>\n<p>Per favorire l'apprendimento del materiale da parte degli studenti pi\u00f9 deboli, non basta descrivere la sintassi. \u00c8 necessario fornire pi\u00f9 esercizi semplici ma variati e spiegare in dettaglio gli esempi. Alla fine, la velocit\u00e0 di apprendimento \u00e8 limitata dalla capacit\u00e0 dello studente di trasformare le espressioni e di cercare schemi. Per gli studenti intelligenti, la maggior parte degli esercizi risulter\u00e0 noiosa. Quando si lavora con loro, non \u00e8 necessario insistere sulla risoluzione del 100% dei problemi. Puoi vedere il mio materiale su <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AKryukov92\/programming-basics\">il mio GitHub<\/a><\/noindex>. Tuttavia, il repository assomiglia pi\u00f9 a un grimorio da stregone: nessuno, tranne me, capir\u00e0 dove si trova cosa e se si falla un controllo, si potrebbe impazzire.<\/p>\n<h4>Il metodo \u00e8 orientato alla pratica<\/h4>\n<p>\nLa teoria viene spiegata attraverso l'esempio di una soluzione. Durante le lezioni di programmazione di base, dove si studiano le diramazioni e i cicli, non \u00e8 possibile tenere una lezione utile su un solo argomento per un'ora intera. 15-20 minuti sono sufficienti per spiegare un concetto. Le principali difficolt\u00e0 sorgono durante l'esecuzione di compiti pratici.<br \/>\nI docenti principianti possono elencare operatori, diramazioni, cicli e array in un'unica lezione. Tuttavia, gli studenti si troveranno di fronte a un problema nell'assimilare queste informazioni.<br \/>\nNon \u00e8 sufficiente raccontare il materiale, bisogna anche assicurarsi che gli ascoltatori lo abbiano compreso.<\/p>\n<p>Il fatto che un argomento sia stato assimilato \u00e8 determinato da come lo studente gestisce il lavoro autonomo. <br \/>\nSe lo studente riesce a risolvere un problema sull'argomento senza l'aiuto dell'insegnante, significa che l'argomento \u00e8 stato assimilato. Per garantire un controllo autonomo, per ogni compito viene descritta una tabella con scenari di test. Gli esercizi seguono un ordine ben definito. \u00c8 sconsigliato saltare i compiti. Se un compito attuale \u00e8 troppo difficile, \u00e8 inutile passare al successivo, che sar\u00e0 ancora pi\u00f9 complesso. Per aiutare lo studente a superare un compito difficile, vengono spiegati alcuni approcci utilizzando l'esempio del primo compito. In sostanza, tutto il contenuto dell'argomento \u00e8 incentrato su strategie per superare le difficolt\u00e0. I cicli sono, piuttosto, un effetto collaterale.<\/p>\n<p>Il primo compito \u00e8 sempre un esempio. Il secondo differisce leggermente e viene eseguito \"autonomamente\" subito dopo il primo sotto la supervisione dell'insegnante. Tutti i successivi esercizi sono progettati per richiamare l'attenzione su piccoli dettagli che possono causare malintesi.<\/p>\n<p>La spiegazione di un esempio consiste in un dialogo in cui lo studente deve attivare il back propagation e la cross-validation per assicurarsi di aver assimilato il materiale.<\/p>\n<p>Sar\u00e0 banale, ma affermer\u00f2 che il primo esempio sull'argomento \u00e8 molto importante. Quando ci sono materiali per un ampio lavoro autonomo, le mancanze del primo esempio possono essere corrette. Se non c'\u00e8 nient'altro oltre all'esempio, \u00e8 probabile che lo studente non riesca ad assimilare l'argomento.<\/p>\n<h4>While o for?<\/h4>\n<p>\nUno dei dibattiti \u00e8 la scelta della struttura per l'esempio: while o for. Un giorno, un mio amico sviluppatore professionista senza esperienza di insegnamento mi ha convinto per un'ora che il ciclo for \u00e8 il pi\u00f9 semplice da comprendere. Gli argomenti si riducevano al fatto che \"\u00e8 tutto chiaro e ben organizzato\". Tuttavia, la vera causa delle difficolt\u00e0 dei principianti risiede nell'idea stessa di ciclo, e non nella sua scrittura. Se una persona non comprende questa idea, avr\u00e0 difficolt\u00e0 con la sintassi. Non appena l'idea \u00e8 compresa, i problemi di codifica svaniscono da soli.<\/p>\n<p>Nei miei materiali, l'argomento dei cicli segue quello delle diramazioni. La somiglianza esterna tra if e while consente di tracciare un'analogia diretta: \"quando la condizione nell'intestazione \u00e8 vera, viene eseguito il corpo\". L'unica particolarit\u00e0 del ciclo \u00e8 che il corpo viene eseguito molte volte.<\/p>\n<p>Il secondo argomento a mio favore \u00e8 che while richiede meno processamento rispetto a for. Meno processamento significa meno errori stupidi con virgole e parentesi dimenticate. I principianti non hanno ancora sviluppato una sufficiente attenzione e meticolosit\u00e0 per evitare automaticamente gli errori di sintassi.<br \/>\nIl terzo argomento \u00e8 che in molti buoni libri while viene spiegato per primo.<\/p>\n<p>Se lo studente riesce a trasformare facilmente le espressioni, allora posso parlare di for passandoci sopra. Lo studente poi sceglier\u00e0 da solo cosa preferisce. Se invece le trasformazioni creano difficolt\u00e0, \u00e8 meglio non disperdere l'attenzione. Lascia che prima lo studente risolva tutto utilizzando while. Una volta che l'argomento dei cicli \u00e8 stato assimilato, si possono riscrivere le soluzioni per esercitarsi nella trasformazione da while a for.<br \/>\nI cicli con post-condizione sono piuttosto rari. Non ci perdo tempo affatto. Se lo studente ha compreso le idee di identificazione degli schemi e trasformazione delle espressioni, sar\u00e0 in grado di affrontarli senza il mio aiuto.<\/p>\n<p>Nella dimostrazione del primo esempio agli studenti avanzati, sottolineo che in questo caso \u00e8 fondamentale registrare non solo la soluzione, ma anche tutta la sequenza di azioni che hanno portato al risultato. Gli studenti superficiali possono trascurare la scrittura e limitarsi a riportare solo l'algoritmo finale. Devono essere convinti che prima o poi si troveranno di fronte a un compito complesso. Per risolverlo, sar\u00e0 necessario seguire i passaggi come in questo esempio. Per questo motivo \u00e8 importante registrare tutte le fasi. Nelle prossime attivit\u00e0, si potr\u00e0 presentare solo la versione finale della soluzione.<\/p>\n<p>L'idea principale dell'automazione \u00e8 che affidiamo al computer il compito di eseguire il lavoro di routine per l'uomo. Una delle tecniche fondamentali \u00e8 la scrittura di cicli. Viene utilizzata quando il programma esegue consecutivamente diverse azioni identiche e ripetitive.<\/p>\n<h4>Il chiaro \u00e8 meglio dell'oscuro<\/h4>\n<p>\nPotrebbe sembrare una buona idea, nel primo esercizio sui cicli, stampare a schermo una frase identica pi\u00f9 volte. Ad esempio:<\/p>\n<blockquote><p>Evviva, funziona!<br \/>\nEvviva, funziona!<br \/>\nEvviva, funziona!<br \/>\nEvviva, funziona!<br \/>\nEvviva, funziona!<br \/>\nEvviva, funziona!<br \/>\nEvviva, funziona!<br \/>\nEvviva, funziona!\n<\/p><\/blockquote>\n<p>\nQuesta soluzione \u00e8 scadente poich\u00e9 nell'output non si vede il valore del contatore. Questo rappresenta un problema per i principianti. Non bisogna sottovalutare questa difficolt\u00e0. Inizialmente, questo compito era il primo, mentre l'esercizio di stampa di una sequenza di numeri in ordine crescente era il secondo. Era necessario introdurre termini aggiuntivi come \"ciclo N volte\" e \"ciclo da A a B\", che in sostanza sono la stessa cosa. Per evitare di creare entit\u00e0 superflue, ho deciso di mostrare solo l'esempio della stampa di una sequenza di numeri. Pochi riescono, senza preparazione, a mantenere in mente il contatore e a modellare il comportamento del programma nella loro mente. Alcuni studenti si trovano per la prima volta a dover modellare \"in mente\" proprio con il tema dei cicli.<br \/>\nDopo un po' di pratica, la richiesta di ripetere lo stesso testo la assegno come esercizio autonomo. Se inizialmente mostriamo un contatore visibile e poi invisibile, gli studenti hanno meno difficolt\u00e0. A volte basta un suggerimento come \"non stampare il contatore a schermo\".<\/p>\n<h4>Come viene spiegato altrove?<\/h4>\n<p>\nNella maggior parte dei materiali didattici online, la sintassi del ciclo \u00e8 presentata all'interno di una \"lezione\". Ad esempio, su developer.mozilla.org (attualmente) insieme al ciclo while vengono descritti anche altre costrutti. Vengono presentati esclusivamente i costrutti stessi come modelli. I risultati della loro esecuzione sono descritti a parole e manca l'illustrazione. A mio avviso, un approccio del genere riduce a zero l'utilit\u00e0 di tali materiali. Lo studente pu\u00f2 riscrivere il codice e farlo funzionare da solo, ma ha comunque bisogno di un modello di riferimento. Come si fa a sapere se l'esempio \u00e8 stato trascritto correttamente, se non c'\u00e8 nulla con cui confrontare il risultato?<br \/>\nQuando viene fornito solo un modello, senza esempio, lo studente trova ancora pi\u00f9 difficile capire. Come pu\u00f2 sapere se i frammenti di codice sono stati posizionati correttamente nel modello? Pu\u00f2 provare a scrivere <i>in qualche modo<\/i>, e poi farlo eseguire. Ma se non c'\u00e8 un modello di riferimento per il risultato, l'esecuzione non aiuter\u00e0.<\/p>\n<p>Nel corso di C++, la sintassi del ciclo \u00e8 sepolta nella terza pagina della lezione 4 sul tema \"operatori\". Quando si spiega la sintassi dei cicli, si pone particolare enfasi sul termine \"operatore\". Questo termine \u00e8 presentato come un insieme di fatti, come \"simbolo; \u00e8 un operatore\", \"{} \u00e8 un operatore composto\", \"il corpo del ciclo deve essere un operatore\". Non mi piace questo approccio perch\u00e9 nasconde importanti correlazioni dietro a un singolo termine. L'analisi del codice sorgente del programma a questo livello \u00e8 necessaria per i programmatori di compilatori per implementare la specifica del linguaggio, ma non per gli studenti in una prima fase. I principianti nella programmazione raramente hanno la meticolosit\u00e0 necessaria per prestare tanta attenzione ai termini. \u00c8 raro che qualcuno riesca a memorizzare e a comprendere nuove parole la prima volta. Praticamente nessuno riesce a utilizzare correttamente un termine appena appreso. Di conseguenza, gli studenti commettono molti errori come \"ho scritto while(a&lt;7);{, ma il programma non funziona&quot;.<br \/>\nA mio parere, all'inizio \u00e8 meglio fornire la sintassi della costruzione direttamente con le parentesi. La variante senza parentesi va spiegata solo se lo studente pone una domanda specifica \"perch\u00e9 qui senza parentesi e funziona\".<\/p>\n<p>Nel libro di Okulov \"Fondamenti della programmazione\" del 2012, l'incontro con i cicli inizia con il modello for, poi si forniscono raccomandazioni sul suo utilizzo e subito dopo c'\u00e8 una sezione di esperimenti. Ho l'impressione che il libro sia stato scritto per quella ristretta minoranza di studenti molto capaci, che raramente partecipano alle mie lezioni.<\/p>\n<p>Nei libri popolari viene sempre scritto il risultato dei frammenti di codice. Ad esempio, nel libro di Schildt \"Java 8. Guida completa\" del 2015. Prima viene fornito un modello, poi un esempio di programma e subito dopo il risultato dell'esecuzione.<\/p>\n<blockquote><p>Prendiamo come esempio un ciclo while in cui viene eseguito un conteggio alla rovescia, partendo da 10, e vengono stampate esattamente 10 righe di \"battiti\":<br \/>\nDopo l'avvio, questo programma stampa dieci \"battiti\" nel modo seguente: <\/p>\n<pre><code class=\"java\">\/\/\u041f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0446\u0438\u043a\u043b\u0430 while\nclass While {\n    public static void main(String args []) {\n        int n = 10;\n        while (n &gt; 0) {\n            System.out.println(&quot;\u0442\u0430\u043a\u0442 &quot; + n);\n            n--;\n        }\n    }\n}<\/code><\/pre>\n<p>\nL'approccio con la descrizione del modello, il programma di esempio e il risultato di questo programma \u00e8 utilizzato anche nel libro \"Javascript for Kids\" e nel corso js su w3schools.com. Il formato della pagina web consente persino di rendere questo esempio interattivo.<br \/>\n<code>passo 10<br \/>\npasso 9<br \/>\npasso 8<br \/>\npasso 7<br \/>\npasso 6<br \/>\npasso 5<br \/>\npasso 4<br \/>\npasso 3<br \/>\npasso 2<br \/>\npasso 1<\/code><\/p><\/blockquote>\n<p>\nNel libro di Stroustrup \"Principles and Practice Using C++\" del 2016, l'autore va ancora oltre. Inizia spiegando quale risultato si dovrebbe ottenere e solo dopo mostra il testo del programma. Inoltre, il programma non \u00e8 una semplice casualit\u00e0, ma fa un excursus nella storia. Questo aiuta a attirare l'attenzione su di esso: \"Guarda, questo non \u00e8 solo un testo inutile. Vedi qualcosa di significativo\".<\/p>\n<p>Come esempio di iterazione, consideriamo il primo programma eseguito su una macchina con programma memorizzato (EDSAC). \u00c8 stato scritto da David Wheeler nel laboratorio di informatica dell'Universit\u00e0 di Cambridge (Inghilterra) il 6 maggio 1949. Questo programma calcola e stampa un semplice elenco di quadrati.<\/p>\n<blockquote><p>Qui, in ogni riga c'\u00e8 un numero seguito da un carattere di tabulazione ('t') e dal quadrato di quel numero. La versione di questo programma in C++ appare cos\u00ec:<br \/>\n<code>0 0<br \/>\n1 1<br \/>\n2 4<br \/>\n3 9<br \/>\n4 16<br \/>\n...<br \/>\n98 9604<br \/>\n99 9801<\/code><br \/>\nQui ogni riga contiene un numero seguito da un carattere di tabulazione ('t') e dal quadrato di quel numero. La versione di questo programma in C++ appare cos\u00ec:<\/p>\n<pre><code class=\"cpp\">\/\/\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0438 \u0440\u0430\u0441\u043f\u0435\u0447\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u043e\u0432 \u0447\u0438\u0441\u0435\u043b 0-99\nint main()\n{\n    int i = 0; \/\/ \u041d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 \u043d\u0443\u043b\u044f\n    while(i &lt; 100){\n        cout &lt;&lt; i &lt;&lt; 't' &lt;&lt; square(i) &lt;&lt; 'n';\n        ++i;\n    }\n}<\/code><\/pre>\n<\/blockquote>\n<p>\nCome spiego io stesso<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/349342\/\">traduzione<\/a><\/noindex>L'approccio di Stroustrup: descrivere il risultato, poi risolvere il problema e infine far analizzare autonomamente lo studente \u2014 appare il pi\u00f9 ragionato. Quindi ho deciso di adottare proprio il suo approccio, ma di parlare di un esempio meno storico: l'attivit\u00e0 di stampa di un \"indice\". Essa forma un'ancora riconoscibile, in modo tale da dire poi \"ricorda il problema dell'indice\" e affinch\u00e9 gli studenti lo ricordino esattamente. Nel mio esempio, ho cercato di prevenire anche due dei fraintendimenti pi\u00f9 comuni. Successivamente ne parler\u00f2 in modo pi\u00f9 dettagliato.<\/p>\n<h4>In questo esercizio ci familiarizziamo con le tecniche di risoluzione di problemi complessi. La soluzione iniziale deve essere primitiva e semplice. Poi si pu\u00f2 pensare a come migliorare questa soluzione.<\/h4>\n<p>\nDalla mia osservazione, l'approccio \"modello-esempio-risultato\" in diverse combinazioni porta comunque al fatto che gli studenti percepiscono il ciclo come un geroglifico. Questo si manifestava nel fatto che non capivano perch\u00e9 fosse necessario scrivere una condizione, come scegliere tra i++ e i-- e altre cose apparentemente ovvie. Per evitare questi fraintendimenti, l'approccio alla spiegazione dei cicli deve sottolineare il significato della ripetizione di azioni identiche e solo dopo \u2014 la loro formalizzazione attraverso la costruzione. Pertanto, prima di fornire la sintassi del ciclo, \u00e8 necessario risolvere il problema \"in modo diretto\". La soluzione primitiva del problema dell'indice appare cos\u00ec:<\/p>\n<blockquote><p>Console.WriteLine(\"Introduzione\");\nConsole.WriteLine(\"Capitolo 1\");\nConsole.WriteLine(\"Capitolo 2\");\nConsole.WriteLine(\"Capitolo 3\");\nConsole.WriteLine(\"Capitolo 4\");\nConsole.WriteLine(\"Capitolo 5\");\nConsole.WriteLine(\"Capitolo 6\");\nConsole.WriteLine(\"Capitolo 7\");\nConsole.WriteLine(\"Conclusione\");<br \/>\n<code>Introduzione<br \/>\nCapitolo 1<br \/>\nCapitolo 2<br \/>\nCapitolo 3<br \/>\nCapitolo 4<br \/>\nCapitolo 5<br \/>\nCapitolo 6<br \/>\nCapitolo 7<br \/>\nConclusione<\/code><\/p><\/blockquote>\n<p>\nDalla mia esperienza, l'approccio \"modello-esempio-risultato\" in diverse combinazioni porta comunque a far percepire agli studenti il ciclo come un geroglifico. Questo si manifestava nel fatto che non capivano perch\u00e9 fosse necessario scrivere una condizione, come scegliere tra i++ e i-- e altre cose apparentemente ovvie. Per evitare questi fraintendimenti, l'approccio alla spiegazione dei cicli dovrebbe sottolineare il significato della ripetizione di azioni identiche e solo dopo \u2013 la loro formalizzazione tramite la struttura. Pertanto, prima di fornire la sintassi del ciclo, \u00e8 necessario affrontare il problema \"alla radice\". Una soluzione primitiva al problema del sommario appare cos\u00ec:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(\"Introduzione\");\nConsole.WriteLine(\"Capitolo 1\");\nConsole.WriteLine(\"Capitolo 2\");\nConsole.WriteLine(\"Capitolo 3\");\nConsole.WriteLine(\"Capitolo 4\");\nConsole.WriteLine(\"Capitolo 5\");\nConsole.WriteLine(\"Capitolo 6\");\nConsole.WriteLine(\"Capitolo 7\");\nConsole.WriteLine(\"Conclusione\");\n<\/code><\/pre>\n<p>\nQuali azioni qui si ripetono consecutivamente senza modifiche?<br \/>\nIn questo frammento non ce ne sono. In effetti, i comandi per stampare la parola \"Capitolo\" con il numero sono molto simili tra loro.<br \/>\nQuindi la fase successiva \u00e8 cercare le differenze tra i frammenti. Solo in questo problema tutto \u00e8 ovvio, in seguito si ripeteranno non singoli comandi, ma blocchi di codice di 5 righe o pi\u00f9. Sar\u00e0 necessario cercare non solo nella lista dei comandi, ma nelle strutture di ramificazione o ciclo.<br \/>\nNel esempio la differenza tra i comandi \u00e8 nel numero dopo la parola \"Capitolo\".<br \/>\nAppena trovata la differenza, \u00e8 necessario capire la regolarit\u00e0 della modifica. Il frammento differente \u00e8 un numero? Aumenta costantemente o diminuisce? Come cambia il valore del numero tra due comandi vicini?<br \/>\nNel esempio, il numero dopo la parola \"Capitolo\" aumenta di passi di 1. La differenza \u00e8 stata trovata, la regolarit\u00e0 \u00e8 stata rilevata. Ora si pu\u00f2 sostituire il frammento differente con una variabile.<br \/>\nDovremmo dichiarare questa variabile prima del primo dei frammenti ripetuti. Questa variabile viene solitamente chiamata i o j o in modo pi\u00f9 esplicito. Il suo valore iniziale dovrebbe essere uguale al primo valore che verr\u00e0 visualizzato sullo schermo. In questo esempio, il primo valore \u00e8 1.<br \/>\nQuale valore iniziale dobbiamo prendere per stampare la serie di numeri \"100, 101, 102, 103, 104, 105\"?<br \/>\nIn questa serie, il primo numero \u00e8 100. <br \/>\nDopo ogni comando di stampa, \u00e8 necessario incrementare il valore di questa variabile di 1. Questa unit\u00e0 rappresenta il passo di cambiamento.<br \/>\nIn this row, the first number is 100.<br \/>\nAfter each output command, you need to increase the value of this variable by 1. This unit is the step change.<br \/>\nQual \u00e8 il passo nella sequenza di numeri \u00ab100, 102, 104, 106\u00bb?<br \/>\nIn questa sequenza il passo \u00e8 2.<br \/>\nDopo aver sostituito il frammento variabile, il codice apparir\u00e0 cos\u00ec:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(\"Introduzione\");\nint i;\ni = 0;\nConsole.WriteLine(\"Capitolo \" + i);\ni = i + 1;\nConsole.WriteLine(\"Capitolo \" + i);\ni = i + 1;\nConsole.WriteLine(\"Capitolo \" + i);\ni = i + 1;\nConsole.WriteLine(\"Capitolo \" + i);\ni = i + 1;\nConsole.WriteLine(\"Capitolo \" + i);\ni = i + 1;\nConsole.WriteLine(\"Capitolo \" + i);\ni = i + 1;\nConsole.WriteLine(\"Capitolo \" + i);\ni = i + 1;\nConsole.WriteLine(\"Conclusione\");\n<\/code><\/pre>\n<p>\nDopo aver applicato il metodo \"esprimere la regolarit\u00e0 come variabile\", il codice risulta in pi\u00f9 gruppi di azioni identiche che si susseguono. Ora le azioni ripetitive possono essere sostituite con un ciclo.<\/p>\n<p>La sequenza per risolvere il problema, dove \u00e8 necessario usare i cicli, consiste nei seguenti passaggi:<\/p>\n<ol>\n<li>Risolvere \"a brutto\" con una serie di comandi separati<\/li>\n<li>Trovare la regolarit\u00e0<\/li>\n<li>Esprimere la regolarit\u00e0 come variabile<\/li>\n<li>Formulare come ciclo<\/li>\n<\/ol>\n<p>In seguito vengono introdotti nuovi termini, affinch\u00e9 lo studente non si trovi nella situazione \"capisco tutto, ma non riesco a dire\":<br \/>\n \u2014 contatore \u2014 \u00e8 sempre una variabile necessaria per tenere traccia del numero di iterazioni del ciclo. Di solito \u00e8 un numero intero, confrontato con un limite.<br \/>\n \u2014 passo del contatore \u2014 descrizione della regolarit\u00e0 della modifica del contatore.<br \/>\n \u2014 limite \u2014 numero o variabile confrontati con il contatore, affinch\u00e9 l'algoritmo sia finito. Il valore del contatore viene modificato per avvicinarsi al limite.<br \/>\n \u2014 corpo del ciclo \u2014 insieme di comandi che verranno ripetuti. Quando si dice \"il comando \u00e8 scritto all'interno del ciclo\", si riferisce specificamente al corpo.<br \/>\n \u2014 iterazione del ciclo \u2014 esecuzione singola del corpo del ciclo.<br \/>\n \u2014 condizione del ciclo \u2014 espressione logica dalla quale dipende se verr\u00e0 eseguita un'altra iterazione. (Qui potrebbe esserci confusione con le strutture di ramificazione)<br \/>\n\u00c8 necessario essere pronti al fatto che inizialmente gli studenti useranno i termini in modo errato. Questo vale sia per quelli forti che per quelli deboli. Stabilire un linguaggio comune \u00e8 un'arte. Ora scriver\u00f2 brevemente: bisogna porre l'obiettivo \"evidenzia il frammento di codice con \" e utilizzare correttamente questi termini nella conversazione.<br \/>\nDopo la trasformazione usando il ciclo, il frammento risulta:<\/p>\n<pre><code class=\"cs\">Console.WriteLine(\"Introduzione\");\nint i = 0;\nwhile (i &lt; 7) {\n    Console.WriteLine(&quot;Capitolo &quot; + i);\n    i = i + 1;\n}\nConsole.WriteLine(&quot;Conclusione&quot;);<\/code><\/pre>\n<h4>Falsa convinzione principale<\/h4>\n<p>\nUna comune falsa convinzione tra gli studenti \u00e8 che mettano all'interno della struttura di ciclo azioni che devono essere eseguite solo una volta. Ad esempio, cos\u00ec:<\/p>\n<pre><code class=\"cs\">;\nint i = 0;\nwhile (i &lt; 7) {\n    Console.WriteLine(&quot;Introduzione&quot;)\n    Console.WriteLine(&quot;Capitolo &quot; + i);\n    i = i + 1;\n    Console.WriteLine(&quot;Conclusione&quot;);\n}\n<\/code><\/pre>\n<p>\nGli studenti si scontrano costantemente con questo problema, sia all'inizio sia in compiti pi\u00f9 complessi.<br \/>\nUn suggerimento chiave in questo caso:<\/p>\n<blockquote><p>Quante volte \u00e8 necessario ripetere la scrittura del comando: una volta o molte?\n<\/p><\/blockquote>\n<p>\nI comandi per stampare \"Introduzione\" e \"Conclusione\", cos\u00ec come la dichiarazione e l'inizializzazione della variabile i, non assomigliano ad altre azioni ripetitive. Vengono eseguiti solo una volta, quindi devono essere scritti al di fuori del corpo del ciclo.<\/p>\n<p>Nel codice devono rimanere tutte e tre le fasi della soluzione, in modo da poterle richiamare in caso di difficolt\u00e0. I primi due modi \u00e8 sufficiente comentarli affinch\u00e9 non infastidiscano.<br \/>\nL'attenzione dello studente deve essere rivolta ai seguenti fatti:<br \/>\n \u2014 Nella condizione del ciclo di solito si confrontano contatore e limite. Il contatore pu\u00f2 cambiare all'interno del ciclo, mentre il limite non pu\u00f2. Per violare questa regola, ci devono essere motivi validi.<br \/>\n \u2014 I comandi per stampare le parole 'Introduzione' e 'Conclusione' si trovano al di fuori del corpo del ciclo. Devono essere eseguiti 1 volta. 'Introduzione' \u2014 prima delle azioni ripetute, 'Conclusione' \u2014 dopo.<br \/>\nDurante il consolidamento di questo argomento, l'apprendimento dei successivi e la risoluzione di difficolt\u00e0, \u00e8 utile anche per gli studenti forti porre la domanda: \"Questa azione quante volte deve essere eseguita? Una o molte?\".<\/p>\n<h4>Sviluppo di abilit\u00e0 aggiuntive<\/h4>\n<p>\nDurante lo studio dei cicli, gli studenti affinano anche l'abilit\u00e0 di diagnosi e risoluzione dei problemi. Per condurre una diagnosi, lo studente deve rappresentare il risultato desiderato e confrontarlo con il risultato effettivo. La differenza tra di loro determina le azioni correttive.<br \/>\nPoich\u00e9 gli studenti in questa fase hanno ancora una scarsa idea del \"desiderato\" risultato, possono orientarsi sui dati di test. Di solito in questa fase nessuno capisce ancora cosa potrebbe andare storto e come affrontarlo. Pertanto, fornisco per la scrittura nel quaderno una descrizione di problemi tipici e alcuni modi per risolverli. Scegliere il pi\u00f9 adeguato \u00e8 compito dello stesso studente.<br \/>\n\u00c8 necessario chiedere \"\u00e8 andato come previsto?\", \"Quale di queste situazioni si \u00e8 verificata ora?\", \"La soluzione applicata ha aiutato?\".<\/p>\n<ol>\n<li>Il numero di azioni \u00e8 uno in meno o uno in pi\u00f9 di quanto previsto. Modi per risolvere:<br \/>\n \u2014 aumentare il valore iniziale del contatore di 1.<br \/>\n \u2014 sostituire l'operatore di confronto rigoroso (&lt; o &gt;) con un confronto non rigoroso (&lt;= o &gt;=).<br \/>\n \u2014 modificare il valore del limite di 1.<\/li>\n<li>Le azioni nel ciclo vengono eseguite senza fermarsi, all'infinito. Modi per risolvere:<br \/>\n \u2014 aggiungere un comando per modificare il contatore, se manca.<br \/>\n \u2014 correggere il comando di modifica del contatore in modo che il suo valore si avvicini al limite.<br \/>\n \u2014 rimuovere il comando di modifica del limite, se si trova nel corpo del ciclo.<\/li>\n<li>Il numero di azioni nel ciclo \u00e8 pi\u00f9 di 1 in meno o in pi\u00f9 di quanto previsto. L'azione nel ciclo non \u00e8 stata eseguita nemmeno una volta. Prima \u00e8 necessario determinare i valori effettivi delle variabili immediatamente prima dell'inizio del ciclo. Modi per risolvere:<br \/>\n \u2014 modificare il valore iniziale del limite<br \/>\n \u2014 modificare il valore iniziale del contatore<\/li>\n<\/ol>\n<p>\nDi solito, il problema 3 \u00e8 legato all'uso della variabile sbagliata o al non azzeramento del contatore.<\/p>\n<p>Dopo questa spiegazione, lo studente potrebbe avere ancora varie errate convinzioni riguardo al funzionamento dei cicli.<br \/>\nPer chiarire le pi\u00f9 comuni, propongo esercizi:<\/p>\n<ol>\n<li>In cui il limite, il valore iniziale del contatore o il passo del contatore vengono inseriti dall'utente.<\/li>\n<li>In cui il valore del contatore deve essere utilizzato in qualche espressione aritmetica. Preferibilmente con il contatore in un'espressione radice o nel denominatore, in modo che la differenza sia non lineare.<\/li>\n<li>In cui il valore del contatore non viene mostrato sullo schermo durante l'esecuzione del ciclo. Ad esempio, per stampare un numero specifico di frammenti di testo identici o disegnare una figura con grafica turtle.<\/li>\n<li>In cui devono essere eseguite prima alcune azioni ripetitive, e poi altre.<\/li>\n<li>In cui devono essere eseguite altre azioni prima e dopo quelle ripetitive.<\/li>\n<\/ol>\n<p>\nPer ogni esercizio devono essere forniti dati di prova e risultati attesi.<\/p>\n<p>Per capire quanto velocemente si pu\u00f2 procedere, \u00e8 necessario dare tempo per leggere le condizioni di questi esercizi e chiedere: \"in cosa differiscono dall'esempio?\", \"Cosa bisogna cambiare nell'esempio per risolverli?\". Se lo studente risponde in modo consapevole, allora pu\u00f2 risolverne almeno uno in classe, mentre gli altri a casa autonomamente. Se la soluzione ha successo, allora si pu\u00f2 iniziare la spiegazione sulle condizioni all'interno dei cicli.<br \/>\nSe ci sono difficolt\u00e0 con la soluzione autonoma, \u00e8 necessario lavorare su tutto in classe. Per evitare che la soluzione del problema somigli a un disegno di un gufo, consiglio di risolvere inizialmente il problema in modo non universale. Cio\u00e8, in modo che la soluzione superi il primo test e non utilizzi la struttura del ciclo. Poi, si possono applicare trasformazioni per ottenere la universalit\u00e0 della soluzione.<\/p>\n<h4>Cicli e ramificazioni<\/h4>\n<p>\nA mio avviso, \u00e8 utile trattare il tema \"cicli all'interno delle ramificazioni\" separatamente. Cos\u00ec, poi sar\u00e0 evidente la differenza tra il controllo multiplo di una condizione e quello singolo.<br \/>\nGli esercizi di consolidamento riguarderanno la visualizzazione dei numeri da A a B, che vengono inseriti dall'utente:<br \/>\n \u2014 sempre in ordine crescente.<br \/>\n \u2014 in ordine crescente o decrescente a seconda dei valori di A e B.<\/p>\n<p>Per il tema \"diramazione all'interno dei cicli\", bisogna passare solo dopo che lo studente ha acquisito le competenze: \"sostituzione di una regolarit\u00e0 con una variabile\" e \"sostituzione di azioni ripetute con un ciclo\".<br \/>\nLa principale ragione per applicare ramificazioni all'interno dei cicli sono le anomalie nella regolarit\u00e0. In mezzo, essa viene interrotta a seconda dei dati di partenza.<br \/>\nAgli studenti capaci di cercare soluzioni mediante la combinazione di semplici tecniche, basta dire: \"le ramificazioni possono essere scritte all'interno dei cicli\" e dare un esercizio \"per esempio\" completamente da risolvere autonomamente.<br \/>\nEsercizio per esempio:<\/p>\n<blockquote><p>L'utente inserisce il numero X. Visualizzare in colonna i numeri da 0 a 9 e mettere il segno '+' accanto al numero che \u00e8 uguale a X.<\/p><\/blockquote>\n<p>\n<b class=\"spoiler_title\">Se \u00e8 stato inserito 0<\/b>0+<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<\/p>\n<p><b class=\"spoiler_title\">Se \u00e8 stato inserito 6<\/b>0<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6+<br \/>\n7<br \/>\n8<br \/>\n9<\/p>\n<p><b class=\"spoiler_title\">Se \u00e8 stato inserito 9<\/b>0<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9+<\/p>\n<p><b class=\"spoiler_title\">Se \u00e8 stato inserito 777<\/b>0<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<\/p>\n<p>Se la breve spiegazione non \u00e8 sufficiente per scrivere con il ciclo, allora \u00e8 necessario ottenere una soluzione universale dello stesso problema senza ciclo.<br \/>\nOtterrai una delle due opzioni:<br \/>\n<b class=\"spoiler_title\">Desiderato<\/b><\/p>\n<pre><code class=\"cs\">string temp;\ntemp = Console.ReadLine();\nint x;\nx = int.Parse(temp);\nif (x==0) {\n    Console.WriteLine(0 + \"+\");\n} else {\n    Console.WriteLine(0);\n}\nif (x==1) {\n    Console.WriteLine(1 + \"+\");\n} else {\n    Console.WriteLine(1);\n}\nif (x==2) {\n    Console.WriteLine(2 + \"+\");\n} else {\n    Console.WriteLine(2);\n}\nif (x==3) {\n    Console.WriteLine(3 + \"+\");\n} else {\n    Console.WriteLine(3);\n}\nif (x==4) {\n    Console.WriteLine(4 + \"+\");\n} else {\n    Console.WriteLine(4);\n}\nif (x==5) {\n    Console.WriteLine(5 + \"+\");\n} else {\n    Console.WriteLine(5);\n}\nif (x==6) {\n    Console.WriteLine(6 + \"+\");\n} else {\n    Console.WriteLine(6);\n}\nif (x==7) {\n    Console.WriteLine(7 + \"+\");\n} else {\n    Console.WriteLine(7);\n}\nif (x==8) {\n    Console.WriteLine(8 + \"+\");\n} else {\n    Console.WriteLine(8);\n}\nif (x==9) {\n    Console.WriteLine(9 + \"+\");\n} else {\n    Console.WriteLine(9);\n}\n<\/code><\/pre>\n<p><b class=\"spoiler_title\">Possibile<\/b><\/p>\n<pre><code class=\"cs\">string temp;\ntemp = Console.ReadLine();\nint x;\nx = int.Parse(temp);\nif (x==0) {\n    Console.WriteLine(\"0n1n2n3n4n5n6n7n8n9\");\n}\nif (x==1) {\n    Console.WriteLine(\"0n1+n2n3n4n5n6n7n8n9\");\n}\nif (x==2) {\n    Console.WriteLine(\"0n1n2+n3n4n5n6n7n8n9\");\n}\nif (x==3) {\n    Console.WriteLine(\"0n1n2n3+n4n5n6n7n8n9\");\n}\nif (x==4) {\n    Console.WriteLine(\"0n1n2n3n4+n5n6n7n8n9\");\n}\nif (x==5) {\n    Console.WriteLine(\"0n1n2n3n4n5+n6n7n8n9\");\n}\nif (x==6) {\n    Console.WriteLine(\"0n1n2n3n4n5n6+n7n8n9\");\n}\nif (x==7) {\n    Console.WriteLine(\"0n1n2n3n4n5n6n7+n8n9\");\n}\nif (x==8) {\n    Console.WriteLine(\"0n1n2n3n4n5n6n7n8+n9\");\n}\nif (x==9) {\n    Console.WriteLine(\"0n1n2n3n4n5n6n7n8n9+\");\n}\n<\/code><\/pre>\n<p>Do solito fornisco un compito simile in anticipo, durante lo studio del tema sui ramificazioni.<br \/>\nSe lo studente ha ottenuto una variante \u00abpossibile\u00bb, \u00e8 importante spiegare che per uno stesso problema possono esserci molte soluzioni. Tuttavia, queste differiscono per la loro robustezza ai cambiamenti dei requisiti. Fai la domanda: \u00abQuanti punti nel codice dovranno essere modificati se sar\u00e0 necessario aggiungere un altro numero?\u00bb Nella variante \u00abpossibile\u00bb dovr\u00e0 essere aggiunta un'altra ramificazione e modificato in dieci altri luoghi il nuovo numero. In quella \u00abdesiderata\u00bb baster\u00e0 aggiungere solo una ramificazione.<br \/>\nAssegna il compito di riprodurre la variante \u00abdesiderata\u00bb, quindi di identificare nel codice delle regole, eseguire la sostituzione della variabile e scrivere un ciclo.<br \/>\nSe hai idee su come risolvere questo problema senza un ciclo in un altro modo, per favore scrivile nei commenti.<\/p>\n<h4>Cicli all'interno di cicli<\/h4>\n<p>\nIn questo tema \u00e8 importante notare che:<br \/>\n \u2014 i contatori per il ciclo interno ed esterno devono essere diverse variabili.<br \/>\n \u2014 il contatore per il ciclo interno deve essere azzerato molte volte (cio\u00e8 nel corpo del ciclo esterno).<br \/>\n \u2014 nei problemi di output di testo non si pu\u00f2 scrivere inizialmente una lettera su pi\u00f9 righe e poi la successiva. Prima bisogna stampare tutte le lettere della prima riga, poi tutte le lettere della seconda e cos\u00ec via.<\/p>\n<p>\u00c8 meglio iniziare la spiegazione del tema sui cicli all'interno dei cicli spiegando l'importanza di azzerare il contatore.<br \/>\nEsercizio per esempio:<\/p>\n<blockquote><p>L'utente inserisce due numeri: R e T. Stampare due righe di caratteri \"#\". Nella prima riga ci devono essere R caratteri. Nella seconda riga T caratteri. Se uno dei numeri \u00e8 negativo, visualizzare un messaggio di errore.<\/p><\/blockquote>\n<p>\n<b class=\"spoiler_title\">R=5, T=11<\/b>#####<br \/>\n###########<\/p>\n<p><b class=\"spoiler_title\">R=20, T=3<\/b>####################<br \/>\n###<\/p>\n<p><b class=\"spoiler_title\">R=-1, T=6<\/b>Il valore di R deve essere non negativo<\/p>\n<p><b class=\"spoiler_title\">R=6, T=-2<\/b>Il valore di T deve essere non negativo<\/p>\n<p>\u00c8 chiaro che anche questo problema ha almeno due possibili soluzioni.<br \/>\n<b class=\"spoiler_title\">Desiderato<\/b><\/p>\n<pre><code class=\"cs\">string temp;\nint R;\nint T;\ntemp = Console.ReadLine();\nR = int.Parse(temp);\ntemp = Console.ReadLine();\nT = int.Parse(temp);\nint i = 0;\nwhile (i &lt; R)\n{\n    Console.Write(&quot;#&quot;);\n    i = i + 1;\n}\nConsole.WriteLine();\ni = 0;\nwhile (i &lt; T)\n{\n    Console.Write(&quot;#&quot;);\n    i = i + 1;\n}\n<\/code><\/pre>\n<p><b class=\"spoiler_title\">Possibile n. 1<\/b><\/p>\n<pre><code class=\"cs\">string temp;\nint R;\nint T;\ntemp = Console.ReadLine();\nR = int.Parse(temp);\ntemp = Console.ReadLine();\nT = int.Parse(temp);\nint i = 0;\nwhile (i &lt; R)\n{\n    Console.Write(&quot;#&quot;);\n    i = i + 1;\n}\nConsole.WriteLine();\nint j = 0;\nj = 0;\nwhile (j &lt; T)\n{\n    Console.Write(&quot;#&quot;);\n    j = j + 1;\n}\n<\/code><\/pre>\n<p>La differenza \u00e8 che nella soluzione \u00abpossibile\u00bb per l'output della seconda riga \u00e8 stata utilizzata una seconda variabile. \u00c8 necessario insistere sull'uso della stessa variabile per entrambi i cicli. Si pu\u00f2 argomentare questa limitazione dicendo che una soluzione con un solo contatore per due cicli sar\u00e0 un'illustrazione del termine \u00abazzeramento del contatore\u00bb. Comprendere questo termine \u00e8 necessario per risolvere i prossimi problemi. Come compromesso, si possono mantenere entrambe le soluzioni del problema.<\/p>\n<p>Un problema tipico con l'uso di una sola variabile contatore per due cicli si manifesta cos\u00ec:<br \/>\n<b class=\"spoiler_title\">R=5, T=11<\/b>#####<br \/>\n######<\/p>\n<p>Il numero di simboli nella seconda riga non corrisponde al valore di T. Se hai bisogno di aiuto con questo problema, \u00e8 necessario \u00abpunzecchiare\u00bb nel riassunto sui problemi tipici con i cicli. Questo \u00e8 il sintomo n. 3. Si diagnostica se si aggiunge l'output del valore del contatore immediatamente prima del secondo ciclo. Si corregge azzerando. Ma \u00e8 meglio non dirlo subito. Lo studente dovrebbe cercare di formulare almeno un'ipotesi.<\/p>\n<p>Ci sono sicuramente anche altre soluzioni. Ma non le ho mai viste tra gli studenti. Durante lo studio dei cicli, parlarne distrarrebbe l'attenzione. Si pu\u00f2 tornare su di esso pi\u00f9 tardi, studiando le funzioni legate alle stringhe.<br \/>\n<b class=\"spoiler_title\">Possibile n. 2<\/b><\/p>\n<pre><code class=\"cs\">string temp;\nint R;\nint T;\ntemp = Console.ReadLine();\nR = int.Parse(temp);\ntemp = Console.ReadLine();\nT = int.Parse(temp);\nConsole.WriteLine(new String('#', R));\nConsole.WriteLine(new String('#', T));\n<\/code><\/pre>\n<p>\nIl prossimo compito obbligatorio:<\/p>\n<blockquote><p>Stampa sullo schermo i numeri da 0 a 9. Ogni numero deve essere su una propria riga. Il numero di cifre per riga (W) viene inserito dalla tastiera.<\/p><\/blockquote>\n<p>\n<b class=\"spoiler_title\">W=1<\/b>0<br \/>\n1<br \/>\n2<br \/>\n3<br \/>\n4<br \/>\n5<br \/>\n6<br \/>\n7<br \/>\n8<br \/>\n9<\/p>\n<p><b class=\"spoiler_title\">W=10<\/b><code>0000000000<br \/>\n1111111111<br \/>\n2222222222<br \/>\n3333333333<br \/>\n4444444444<br \/>\n5555555555<br \/>\n6666666666<br \/>\n7777777777<br \/>\n8888888888<br \/>\n9999999999<\/code><\/p>\n<p>Se uno studente ha appreso la tecnica per sostituire una variabile, dovrebbe riuscirci piuttosto rapidamente. Il problema potrebbe tornare a essere l'azzeramento della variabile. Se non riesce a effettuare la conversione, significa che hai fretta e che \u00e8 necessario risolvere problemi pi\u00f9 semplici.<\/p>\n<p>Grazie per l'attenzione. Metti mi piace e iscriviti al canale.<\/p>\n<p>P.S. Se hai trovato refusi o errori nel testo, ti prego di farmelo sapere. Puoi farlo evidenziando una parte del testo e premendo su Mac \u00ab\u2318 + Enter\u00bb, e sulle tastiere classiche \u00abCtrl \/ Enter\u00bb, oppure tramite messaggi privati. Se queste opzioni non sono disponibili, scrivi gli errori nei commenti. Grazie!<\/p>\n<p class=\"for_users_only_msg\">Solo gli utenti registrati possono partecipare al sondaggio. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/auth\/login\/\">Accedi<\/a><\/noindex>, per favore.<\/p>\n<h2 class=\"default-block__polling-title\">Sondaggio per lettori senza karma<\/h2>\n<ul class=\"poll-result\">\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">20,0%<\/strong>Insegno professionalmente, +12<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">10,0%<\/strong>Insegno professionalmente, -11<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent  poll-result__data-percent_winner\">70,0%<\/strong>Non insegno, +17<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">0,0%<\/strong>Non insegno, -10<\/p>\n<\/li>\n<li class=\"poll-result__item\">\n<p>                <strong class=\"poll-result__data-percent\">0,0%<\/strong>Altro0<\/p>\n<\/li>\n<\/ul>\n<p>    Hanno votato 10 utenti. Si sono astenuti 5 utenti.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/456500\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e\u0431 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0435\u043c, \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0434\u043b\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432. \u0426\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u044b\u0432\u0430\u044e\u0442 \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438. \u0414\u043b\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u044b, \u043f\u043e\u0437\u0430\u0431\u044b\u0442\u044b \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0437\u0430\u043c\u0435\u0447\u0435\u043d\u044b. \u0421\u0442\u0430\u0442\u044c\u044f \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u044c\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u0434\u0440\u0443\u0433 \u0432\u0430\u043c \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u043e\u043c\u043e\u0433\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u043e\u0439 \u043a\u043e\u043c\u0443-\u043d\u0438\u0431\u0443\u0434\u044c. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442\u0441\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-40208","post","type-post","status-publish","format-standard","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e\u0431 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0435\u043c, \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0434\u043b\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432. \u0426\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u044b\u0432\u0430\u044e\u0442 \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0435\u0432\u0430\u0442\u044c \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0438, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0446\u0438\u043a\u043b\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e\u0431 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0435\u043c, \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0434\u043b\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432. \u0426\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u044b\u0432\u0430\u044e\u0442 \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-02-01T03:04:35+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-01T03:04:35+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Come insegnare a superare le difficolt\u00e0, e allo stesso tempo scrivere cicli | ProHoster","description":"Nonostante si parli di uno dei temi fondamentali, questo articolo \u00e8 scritto per professionisti esperti. L'obiettivo \u00e8 mostrare quali siano i malintesi comuni tra i principianti nella programmazione.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a \u043d\u0430\u0443\u0447\u0438\u0442\u044c \u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0435\u0432\u0430\u0442\u044c \u0442\u0440\u0443\u0434\u043d\u043e\u0441\u0442\u0438, \u0430 \u0437\u0430\u043e\u0434\u043d\u043e \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0446\u0438\u043a\u043b\u044b | ProHoster","og:description":"\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0447\u044c \u043f\u043e\u0439\u0434\u0435\u0442 \u043e\u0431 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0435\u043c, \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0434\u043b\u044f \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u043e\u0432. \u0426\u0435\u043b\u044c \u2014 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0431\u043b\u0443\u0436\u0434\u0435\u043d\u0438\u044f \u0431\u044b\u0432\u0430\u044e\u0442 \u0443 \u043d\u043e\u0432\u0438\u0447\u043a\u043e\u0432 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438.","og:url":"https:\/\/prohoster.info\/it\/blog\/kak-nauchit-preodolevat-trudnosti-a-zaodno-i-pisat-czikly","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-02-01T03:04:35+00:00","article:modified_time":"2020-02-01T03:04:35+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"40208","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 00:43:24","updated":"2022-09-29 01:18:32","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/40208","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=40208"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/40208\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=40208"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=40208"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=40208"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}