430 likes | 529 Views
Programmazione Procedurale in Linguaggio C++. Strutture di Controllo Parte 4 Conclusioni. versione 2.1. Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina). Strutture di Controllo: Conclusioni >> Sommario. Sommario. Ricapitolazione
E N D
Programmazione Procedurale in Linguaggio C++ Strutture di Controllo Parte 4 Conclusioni versione 2.1 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G. Mecca – Università della Basilicata – mecca@unibas.it
Strutture di Controllo: Conclusioni >> Sommario Sommario • Ricapitolazione • Convenzioni di Stile • Alcune Tecniche Notevoli • Somma con Accumulatore • Conteggio con Contatore • Variabili Bandiera (“flag”) • Convalida dei Dati in Ingresso • Errori Frequenti G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Ricapitolazione Ricapitolazione • Strutture di controllo • elementi fondamentali della programmazione procedurale • consentono di eseguire o meno una porzione di programma sulla base di condizioni • Due categorie • istruzioni condizionali • istruzioni iterative o cicli G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Ricapitolazione Ricapitolazione • Istruzioni condizionali • servono ad eseguire una porzione oppure un’altra sulla base del valore di una condizione • Condizione • espressione a valori booleani • Due istruzioni (in tutti i linguaggi) • IF-THEN-ELSE • IF-THEN G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Ricapitolazione Ricapitolazione • Istruzioni iterative • servono ad eseguire più volte una porzione di programma sulla base del valore di una condizione • Due istruzioni (in tutti i linguaggi) • WHILE (cicli “aperti” oppure cicli “chiusi”) • FOR (cicli “chiusi” o a conteggio) G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Convenzioni di Stile Convenzioni di Stile • In questo corso (e nei successivi) • convenzioni sullo “stile di scrittura” del codice • Obiettivi • uniformare il modo di scrivere il codice • per renderlo più leggibile • e per favorire la collaborazione nei gruppi di lavoro • Tendenza internazionale G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Convenzioni di Stile Convenzioni di Stile • Nelle lezioni successive • raffineremo progressivamente le nostre regole • in modo che valgano anche dopo (Java, C#) • Per ora • a) regole sull’indentazione del codice: 4 spazi • b) regole sulle parentesi graffe • c) regole sulle espressioni: spazi tra op.di e operatori • d) regole sui nomi di variabili: notazione “cammello” G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Convenzioni di Stile Convenzioni di Stile • a) Indentazione • codice di un programma: insieme di blocchi nidificati (es: strutture di controllo) • Per rendere più leggibile il codice • è necessario dentellarlo (o “indentarlo”) • le istruzioni di ogni blocco sono rientrate rispetto alle parentesi • molto importante • Regola: rientri di 4 spazi G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Convenzioni di Stile Codice senza Indentazione #include <iostream.h> void main() { float voto, sommaVoti, media; int numeroEsami; bool continua; continua = true; numeroEsami = 0; sommaVoti = 0.0; while (continua == true) { cout << "Immetti il voto (0 per fermarti)" << endl; cin >> voto; if (voto == 0) continua = false; else { numeroEsami++; sommaVoti += voto; } } if (numeroEsami > 0) { media = sommaVoti/numeroEsami; cout << "La media vale: " << media << endl; } else cout << "Non hai fornito nessun voto" << endl; } G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Convenzioni di Stile Convenzioni di Stile • b) Posizione delle parentesi graffe • due convezioni principali Convenzione n.1 Convenzione n.2 if (condizione) { <istruzioni>; } if (condizione) { <istruzioni>; } else { <istruzioni>; } if (condizione) { <istruzioni>; } else { <istruzioni>; } G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Convenzioni di Stile Convenzioni di Stile • Regola n.1 • adotteremo la convenzione n.1 • Regola n.2 • utilizzeremo sempre le parentesi • anche nel caso in cui un blocco contenga un’unica istruzione G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Convenzioni di Stile Convenzioni di Stile • c) Scrittura delle espressioni • espressione: fatta di operandi ed operatori • per renderla più leggibile è possibile inserire spazi tra operandi ed operatori • Esempio • (sqrt(x)+(y-z))==k • (sqrt(x) + (y - z)) == k G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Convenzioni di Stile Convenzioni di Stile • d) Nomi delle variabili • identificatori • regola n.1: inziale minuscola (es: voto, continua) • regola n.2: convenzione “cammello” • Convenzione cammello • identificatore fatto di più parole concatenate • ogni iniziale a parte la prima è maiuscola • es: sommaVoti, numeroEsami G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Convenzioni di Stile a) rientri di 4 spazi NO più istruzioni per linea b) posizione delle parentesi NO convenzione n. 2 + parentesi sempre #include <iostream.h> void main() { float voto, sommaVoti, media; int numeroEsami; bool continua; continua = true; numeroEsami = 0; sommaVoti = 0.0; while (continua == true) { cout << "Immetti il voto (0 per fermarti)" << endl; cin >> voto; if (voto == 0) { continua = false; } else { numeroEsami++; sommaVoti += voto; } } if (numeroEsami > 0) { media = sommaVoti/numeroEsami; cout << "La media vale: " << media << endl; } else { cout << "Non hai fornito nessun voto" << endl; } } c) espressioni NO (continua==true) d) nomi delle variabili NO numeroesami NO somma_voti G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Alcune Tecniche Notevoli • Il nostro esempio • n programma per il calcolo della media degli esami • Due versioni • l’utente inserisce preliminarmente il numero di esami sostenuti, e poi tutti i voti (versione con for) >> ciclo chiuso • l’utente inserisce i voti uno per uno e si ferma digitando 0 (versione con while) >> ciclo aperto G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Ricapitolazione Un Esempio: Media con For #include <iostream.h> void main() { float voto, sommaVoti, media; int numeroEsami, i; cout << "Quanti esami hai sostenuto ?" << endl; cin >> numeroEsami; sommaVoti = 0.0; for (i=0; i<numeroEsami; i++) { cout << "Immetti il voto di un esame" << endl; cin >> voto; sommaVoti += voto; } if (numeroEsami > 0) { media = sommaVoti/numeroEsami; cout << "La media vale: " << media << endl; } else cout << "Non hai fornito nessun voto" << endl; } G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Ricapitolazione Un Esempio: Media con While #include <iostream.h> void main() { float voto, sommaVoti, media; int numeroEsami; bool continua; continua = true; numeroEsami = 0; sommaVoti = 0.0; while (continua == true) { cout << "Immetti il voto (0 per fermarti)" << endl; cin >> voto; if (voto == 0) continua = false; else { numeroEsami++; sommaVoti += voto; } } if (numeroEsami > 0) { media = sommaVoti/numeroEsami; cout << "La media vale: " << media << endl; } else cout << "Non hai fornito nessun voto" << endl; } G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Calcolo della Media • Una annotazione • le variabili voto e sommaVoti avrebbero potuto essere di tipo int • ma questo avrebbe portato ad un valore scorretto della media (divisione intera) int sommaVoti, numeroEsami; float media; media = sommaVoti/numeroEsami; • es: se sommaVoti vale 64 e numeroEsami vale 3, media vale 21 e non 21.3333 G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Alcune Tecniche Notevoli • Tecniche notevoli contenute nei progr. • somma dei voti (somma con variabile “accumulatore”) • conteggio del numero di esami (conteggio con variabile “contatore”) • tecnica per fermare il ciclo while (variabile “bandiera”) • Inoltre, vedremo anche • convalida dei dati forniti dall’utente G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Somma con Accumulatore • Somma dei voti • utilizzo una variabile come “accumulatore” • inizialmente la variabile vale 0 • ad ogni esecuzione del ciclo sommo al valore precedente il nuovo voto (“accumulo” il valore nella variabile) • Tecnica notevole • utilizzabile tutte le volte che bisogna sommare un insieme di valori G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Memoria RAM Accumulatore 3 67.0 21.0 0.0 43.0 1. float voto, sommaVoti; 2. int numeroEsami, i; 3. cout << "Quanti esami ? “; 4. cin >> numeroEsami; 5. sommaVoti = 0.0; 6. for (i = 0; i < numeroEsami; i++) { 7. cout << “Voto ? "; 8. cin >> voto; 9. sommaVoti = sommaVoti + voto; 10. } 0 1 3 2 21 22 24 Schermo Quanti esami ? 3 Voto ? 21 Voto ? 22 Voto ? 24 G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Somma con Accumulatore • E’ usata anche nella versione basata su while • In questo caso però • oltre a sommare i voti, bisogna anche contare gli esami • inoltre bisogna decidere quando fermarsi • a questo scopo vengono usate due altre tecniche notevoli G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Variabile Contatore • Conteggio degli esami • conteggio attraverso la variabile intera numeroEsami • la variabile svolge le funzioni di “contatore” • valore iniziale pari a 0 • incrementata ad ogni nuovo voto • Anche questa è una tecnica notevole • contare gli elementi di un insieme G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Un Esempio: Media con While #include <iostream.h> void main() { float voto, sommaVoti, media; int numeroEsami; bool continua; continua = true; numeroEsami = 0; sommaVoti = 0.0; while (continua == true) { cout << "Immetti il voto (0 per fermarti)" << endl; cin >> voto; if (voto == 0) continua = false; else { numeroEsami++; sommaVoti += voto; } } if (numeroEsami > 0) { media = sommaVoti/numeroEsami; cout << "La media vale: " << media << endl; } else cout << "Non hai fornito nessun voto" << endl; } G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Variabile Contatore • Attenzione • abbiamo già visto questa tecnica • Cicli a conteggio • è la stessa tecnica che viene utilizzata per controllare i cicli a conteggio • anche in quel caso viene utilizzato un contatore (per contare il numero di esecuzioni del ciclo) G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Un Esempio Già Visto: I 5 Quadrati ATTENZIONE: nel caso della media non conto il numero di esecuzioni del ciclo, ma il numero di voti forniti #include <iostream.h> void main() { float lato, area; int i; i=0; while (i<5){ cout << “Immetti la lung. del lato” << endl; cin >> lato; area=lato*lato; cout << “Area quadrato: “ << area << endl; i++; } cout << “Fine”; } G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Variabile Bandiera (“Flag”) • Quando fermarsi ? • viene utilizzata una variabile booleana • inizializzata a true • il ciclo prosegue finchè la var. è vera (la var. è la bandiera che da via libera al ciclo) • ad ogni nuovo voto si controlla se l’utente vuole interrompere; in questo caso la variabile diventa falsa) • Tecnica notevole per il controllo di cicli G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Un Esempio: Media con While #include <iostream.h> void main() { float voto, sommaVoti, media; int numeroEsami; bool continua; continua = true; numeroEsami = 0; sommaVoti = 0.0; while (continua == true) { cout << "Immetti il voto (0 per fermarti)" << endl; cin >> voto; if (voto == 0) continua = false; else { numeroEsami++; sommaVoti += voto; } } if (numeroEsami > 0) { media = sommaVoti/numeroEsami; cout << "La media vale: " << media << endl; } else cout << "Non hai fornito nessun voto" << endl; } G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Variabile Bandiera (“Flag”) • Una annotazione • la condizione del ciclo while avrebbe potuto essere scritta anche comewhile (continua) {...} • infatti, le due espressioni, (continua)(continua==true)sono equivalenti (vere se “continua” vale true, false se continua vale false”) espressione fatta da un’unico operando e nessun operatore G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Variabile Bandiera (“Flag”) • Più in generale • data una variabile b di tipo bool • dovunque sia necessario utilizzare un’espressione del tipo (b==true), è possibile utilizzare solo (b) • dovunque sia necessario utilizzare un’espressione del tipo (b==false) è possibile utilizzare solo (!b) vera se b vale false falsa se b vale true G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Memoria RAM Accumulatore 0 1 2 21.0 0.0 43.0 1. continua = true; 2. numeroEsami = 0; 3. sommaVoti = 0.0; 4. while (continua == true) { 5. cout << “Voto? (0 stop)“; 6. cin >> voto; 7. if (voto == 0) { 8. continua = false; 9. } else { 10. numeroEsami++; 11. sommaVoti += voto; 12. } 13. } 14. ... true false 21 22 0 Schermo Voto? (0 stop) 21 Voto? (0 stop) 22 Voto? (0 stop) 0 G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Convalida dell’Input mediaForConvalida.cpp >> mediaWhileConvalida.cpp >> • I due programmi acquisiscono dati dall’utente • sarebbe necessario verificare la correttezza dei valori forniti • es: voto tra 18 e 30 • es: numero di esami >= 0 • Convalida dei valori in ingresso • è possibile utilizzare un ciclo while G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Convalida dell’Input • In particolare • il ciclo viene dopo una lettura; es: cin >> numeroEsami; • la condizione del ciclo è vera nel caso in cui il valore letto sia scorrettoes: while (numeroEsami<=0) {...} • se viene letto un valore corretto, il ciclo di convalida viene ignorato • se viene letto un valore scorretto, il ciclo inizia, e va avanti finchè non viene fornito un valore corretto G. Mecca - Programmazione Procedurale in Linguaggio C++
cout << “Esami ?" << endl; cin >> numeroEsami; while (numeroEsami < 0) { cout << “Errore“ << endl; cout << “Esami ?" << endl; cin >> numeroEsami; } bool continua; continua = true; while (continua) { cout << “Esami ?" << endl; cin >> numeroEsami; if (numeroEsami < 0) { cout << "Errore“; } else { continua = false; } } Strutture di Controllo: Conclusioni >> Alcune Tecniche Notevoli Convalida dell’Input Una soluzione alternativa: • Svantaggi di questa soluzione: • il codice è meno compatto • è molto meno leggibile • Utilizzeremo la seconda G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Errori Frequenti Errori Frequenti • Un errore sintattico frequente • parentesi graffe mancanti per i blocchi delle istruzioni di controllo • Due casi • entrambe le parentesi mancanti • solo la parentesi finale è mancante G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Errori Frequenti Un Esempio: Media con For manca la parentesi di chiusura mancano le parentesi del I blocco #include <iostream.h> void main() { float voto, sommaVoti, media; int numeroEsami, i; cout << "Quanti esami hai sostenuto ?" << endl; cin >> numeroEsami; sommaVoti = 0.0; for (i=0; i<numeroEsami; i++) { cout << "Immetti il voto di un esame" << endl; cin >> voto; sommaVoti += voto; if (numeroEsami > 0) media = sommaVoti/numeroEsami; cout << "La media vale: " << media << endl; else { cout << "Non hai fornito nessun voto" << endl; } } G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Errori Frequenti Errori Frequenti • Nel primo caso (parentesi di chiusura) • il compilatore considera il blocco aperto fino alla fine del file e alla fine del file segnala l’errore • Error E2134 mediaFor.cpp 23: Compound statement missing } in function main() • “Blocco di istruzioni senza parentesi chiusa” • Nel secondo caso (parentesi dell’if) • il compilatore considera il blocco fatto di una sola istruzione; errore quando incontra “else” • Error E2054 mediaFor.cpp 20: Misplaced else in function main() • “Else fuori posto” G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Errori Frequenti Errori Frequenti • Un errore logico frequente • nei cicli aperti, gestione scorretta della variabile di ciclo • mancanza dell’inizializzazione • mancanza dell’incremento • In questi casi • il ciclo si comporta in modo scorretto • nel secondo caso si verifica un loop G. Mecca - Programmazione Procedurale in Linguaggio C++
Manca inizializzazione il comportamento è casuale dipende dal valore di i int i; while (i < 5) { cout << “Valore di i: “; cout << i << endl; i++; } Strutture di Controllo: Conclusioni >> Errori Frequenti Errori Frequenti • Manca l’incremento • tipicamente si verifica un “loop” int i; i = 0; while (i < 5) { cout << “Valore di i: “; cout << i << endl; } G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Sommario Riassumendo • Ricapitolazione • Convenzioni di Stile (ATTENZIONE) • Alcune Tecniche Notevoli • Somma con Accumulatore • Conteggio con Contatore • Variabili Bandiera (“flag”) • Convalida dei Dati in Ingresso • Errori Frequenti G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Un Esempio Un Esempio: Media con For #include <iostream.h> void main() { float voto, sommaVoti, media; int numeroEsami, i; cout << "Quanti esami hai sostenuto ?" << endl; cin >> numeroEsami; sommaVoti = 0.0; for (i=0; i<numeroEsami; i++) { cout << "Immetti il voto di un esame" << endl; cin >> voto; sommaVoti += voto; } if (numeroEsami > 0) { media = sommaVoti/numeroEsami; cout << "La media vale: " << media << endl; } else cout << "Non hai fornito nessun voto" << endl; } G. Mecca - Programmazione Procedurale in Linguaggio C++
Strutture di Controllo: Conclusioni >> Un Esempio Un Esempio: Media con While #include <iostream.h> void main() { float voto, sommaVoti, media; int numeroEsami; bool continua; continua = true; numeroEsami = 0; sommaVoti = 0.0; while (continua == true) { cout << "Immetti il voto (0 per fermarti)" << endl; cin >> voto; if (voto == 0) { continua = false; } else { numeroEsami++; sommaVoti += voto; } } if (numeroEsami > 0) { media = sommaVoti/numeroEsami; cout << "La media vale: " << media << endl; } else cout << "Non hai fornito nessun voto" << endl; } G. Mecca - Programmazione Procedurale in Linguaggio C++
Termini della Licenza Termini della Licenza • This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. • Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. G. Mecca - Programmazione Procedurale in Linguaggio C++