1 / 43

Programmazione Procedurale in Linguaggio C++

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

amena-hunt
Download Presentation

Programmazione Procedurale in Linguaggio C++

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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++

  3. 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++

  4. 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++

  5. 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++

  6. 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++

  7. 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++

  8. 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++

  9. 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++

  10. 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++

  11. 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++

  12. 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++

  13. 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++

  14. 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++

  15. 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++

  16. 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++

  17. 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++

  18. 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++

  19. 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++

  20. 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++

  21. 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++

  22. 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++

  23. 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++

  24. 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++

  25. 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++

  26. 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++

  27. 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++

  28. 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++

  29. 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++

  30. 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++

  31. 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++

  32. 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++

  33. 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++

  34. 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++

  35. 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++

  36. 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++

  37. 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++

  38. 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++

  39. 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++

  40. 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++

  41. 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++

  42. 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++

  43. 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++

More Related