Upload
buikhue
View
221
Download
0
Embed Size (px)
Citation preview
18/12/2004
1
G. Mecca – Università della Basilicata – [email protected]
Programmazione Procedurale in Linguaggio C++
Strutture di ControlloParte 4
Conclusioni
versione 2.1Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons
(vedi ultima pagina)
2G. Mecca - Programmazione Procedurale in Linguaggio C++
Sommario
m Ricapitolazionem Convenzioni di Stilem Tecniche Algoritmiche NotevoliðSomma con AccumulatoreðConteggio con ContatoreðVariabili Bandiera (“flag”)ðSimulazioneðConvalida dei Dati in Ingresso
m Errori Frequenti
Strutture di Controllo: Conclusioni >> Sommario
18/12/2004
2
3G. Mecca - Programmazione Procedurale in Linguaggio C++
Ricapitolazione
mStrutture di controlloðelementi fondamentali della programmazione
proceduraleðconsentono di eseguire o meno una porzione
di programma sulla base di condizioni
mDue categorieðistruzioni condizionali ðistruzioni iterative o cicli
Strutture di Controllo: Conclusioni >> Ricapitolazione
4G. Mecca - Programmazione Procedurale in Linguaggio C++
Ricapitolazione
m Istruzioni condizionaliðservono ad eseguire una porzione oppure
un’altra sulla base del valore di una condizione
mCondizioneðespressione a valori booleani
mDue istruzioni (in tutti i linguaggi)ðIF-THEN-ELSEðIF-THEN
Strutture di Controllo: Conclusioni >> Ricapitolazione
18/12/2004
3
5G. Mecca - Programmazione Procedurale in Linguaggio C++
Ricapitolazione
m Istruzioni iterativeðservono ad eseguire più volte una porzione
di programma sulla base del valore di una condizione
mDue istruzioni (in tutti i linguaggi)ðWHILE (cicli “aperti” oppure cicli “chiusi”)ðFOR (cicli “chiusi” o a conteggio)
Strutture di Controllo: Conclusioni >> Ricapitolazione
6G. Mecca - Programmazione Procedurale in Linguaggio C++
Convenzioni di Stile
m In questo corso (e nei successivi)ðconvenzioni sullo “stile di scrittura” del codice
mObiettiviðuniformare il modo di scrivere il codiceðper renderlo più leggibileðe per favorire la collaborazione nei gruppi di
lavoro
m Tendenza internazionale
Strutture di Controllo: Conclusioni >> Convenzioni di Stile
18/12/2004
4
7G. Mecca - Programmazione Procedurale in Linguaggio C++
Convenzioni di Stile
mNelle lezioni successiveðraffineremo progressivamente le nostre
regoleðin modo che valgano anche dopo (Java, C#)
mPer oraða) regole sull’indentazione del codiceðb) regole sulle parentesi graffeðc) regole sulle espressioniðd) regole sui nomi di variabili
Strutture di Controllo: Conclusioni >> Convenzioni di Stile
8G. Mecca - Programmazione Procedurale in Linguaggio C++
Convenzioni di Stile
m a) Indentazioneðcodice di un programma: insieme di blocchi
nidificati (es: strutture di controllo)mPer rendere più leggibile il codiceðè necessario dentellarlo (o “indentarlo”)ðle istruzioni di ogni blocco sono rientrate
rispetto alle parentesiðmolto importante
mRegola: rientri di 4 spazi
Strutture di Controllo: Conclusioni >> Convenzioni di Stile
18/12/2004
5
9G. Mecca - Programmazione Procedurale in Linguaggio C++
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;} elsecout << "Non hai fornito nessun voto" << endl;}
Strutture di Controllo: Conclusioni >> Convenzioni di Stile
10G. Mecca - Programmazione Procedurale in Linguaggio C++
Convenzioni di Stile
m b) Posizione delle parentesi graffeðdue convezioni principali
Strutture di Controllo: Conclusioni >> Convenzioni di Stile
if (condizione) {<istruzioni>;
}if (condizione) {
<istruzioni>;} else {
<istruzioni>;}
if (condizione) {
<istruzioni>;} else {
<istruzioni>;}
Convenzione n.1 Convenzione n.2
18/12/2004
6
11G. Mecca - Programmazione Procedurale in Linguaggio C++
Convenzioni di Stile
mRegola n.1ðadotteremo la convenzione n.1
mRegola n.2ðutilizzeremo sempre le parentesiðanche nel caso in cui un blocco contenga
un’unica istruzione
Strutture di Controllo: Conclusioni >> Convenzioni di Stile
12G. Mecca - Programmazione Procedurale in Linguaggio C++
Convenzioni di Stile
m c) Scrittura delle espressioniðespressione: fatta di operandi ed operatoriðper renderla più leggibile è possibile inserire
spazi tra operandi ed operatori
mEsempioð(sqrt(x)+(y-z))==kð(sqrt(x) + (y - z)) == k
Strutture di Controllo: Conclusioni >> Convenzioni di Stile
18/12/2004
7
13G. Mecca - Programmazione Procedurale in Linguaggio C++
Convenzioni di Stile
m d) Nomi delle variabiliðidentificatoriðregola n.1: iniziale minuscola
(es: voto, continua)ðregola n.2: convenzione “cammello”
mConvenzione cammelloðidentificatore fatto di più parole concatenateðogni iniziale a parte la prima è maiuscolaðes: sommaVoti, numeroEsami
Strutture di Controllo: Conclusioni >> Convenzioni di Stile
14G. Mecca - Programmazione Procedurale in Linguaggio C++
#include <iostream.h>void main() {
int voto, sommaVoti, numeroEsami;float media;bool continua;continua = true;numeroEsami = 0;sommaVoti = 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 = ((float)sommaVoti) / numeroEsami;cout << "La media vale: " << media << endl;
} else {cout << "Non hai fornito nessun voto" << endl;
}}
Strutture di Controllo: Conclusioni >> Convenzioni di Stile
a) rientri di 4 spaziNO più istruzioni per linea
b) posizione delle parentesiNO convenzione n. 2+ parentesi sempre
c) espressioniNO (continua==true)
d) nomi delle variabiliNO numeroesamiNO somma_voti
18/12/2004
8
15G. Mecca - Programmazione Procedurale in Linguaggio C++
Tecniche Algoritmiche Notevoli
mA questo puntoðpotremmo procedere alla simulazione
dell’esecuzione dei progetti di riferimento
mMa, prima di farloðè opportuno descrivere preliminarmente
alcuni aspetti del codice
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
16G. Mecca - Programmazione Procedurale in Linguaggio C++
Tecniche Algoritmiche Notevoli
m Infattiði due programmi utilizzano delle “tecniche
algoritmiche notevoli”
m Tecniche algoritmiche notevoliðsoluzioni standard a problemi ricorrenti di
programmazioneðrappresentano un bagaglio di conoscenze
riutilizzabili per il programmatore
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
18/12/2004
9
17G. Mecca - Programmazione Procedurale in Linguaggio C++
Tecniche Algoritmiche Notevoli
m Tecniche notevoli nei due progettiðsomma con variabile “accumulatore” >>
somma dei votiðconteggio con variabile “contatore” >>
conteggio del numero di esamiðutilizzo di una variabile “bandiera” >>
controllo del ciclo whilem Inoltre, vedremo ancheðconvalida dei dati forniti dall’utente
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
18G. Mecca - Programmazione Procedurale in Linguaggio C++
Somma con Accumulatore
mSomma 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)
m Tecnica notevoleðutilizzabile tutte le volte che bisogna
sommare un insieme di valori
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
18/12/2004
10
19G. Mecca - Programmazione Procedurale in Linguaggio C++
Somma con Accumulatore
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. }
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
xxxvoto#2503
xxxi#2502
xxxsommaVoti#2501
xxxnumeroEsami#2500
Memoria RAM
Schermo
3
Quanti esami ? 3
Voto ? 21
Voto ? 22
Voto ? 24
0.0
0
21
21.0
1
22
43.0
2
24
67.0
3
20G. Mecca - Programmazione Procedurale in Linguaggio C++
Somma con Accumulatore
m La stessa tecnicaðè usata anche nella versione basata su while
m 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
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
18/12/2004
11
21G. Mecca - Programmazione Procedurale in Linguaggio C++
Conteggio con Contatore
mConteggio 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
mAnche questa è una tecnica notevoleðcontare gli elementi di un insieme
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
22G. Mecca - Programmazione Procedurale in Linguaggio C++
Un Esempio: Media con While#include <iostream.h>void main() {
int voto, sommaVoti, numeroEsami;float media;bool continua;continua = true;numeroEsami = 0;sommaVoti = 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 = ((float)sommaVoti) / numeroEsami;cout << "La media vale: " << media << endl;
} else {cout << "Non hai fornito nessun voto" << endl;
}}
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
18/12/2004
12
23G. Mecca - Programmazione Procedurale in Linguaggio C++
Conteggio con Contatore
mAttenzioneðabbiamo già visto questa tecnica
mCicli 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)
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
24G. Mecca - Programmazione Procedurale in Linguaggio C++
Un Esempio Già Visto: I 5 Quadrati
#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”;
}
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
ATTENZIONE:nel caso della media
non conto il numero di esecuzioni del ciclo, mail numero di voti forniti
18/12/2004
13
25G. Mecca - Programmazione Procedurale in Linguaggio C++
Variabile Bandiera (“Flag”)
mQuando 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)
m Tecnica notevole per il controllo di cicli
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
26G. Mecca - Programmazione Procedurale in Linguaggio C++
Un Esempio: Media con While#include <iostream.h>void main() {
int voto, sommaVoti, numeroEsami;float media;bool continua;continua = true;numeroEsami = 0;sommaVoti = 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 = ((float)sommaVoti) / numeroEsami;cout << "La media vale: " << media << endl;
} else {cout << "Non hai fornito nessun voto" << endl;
}}
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
18/12/2004
14
27G. Mecca - Programmazione Procedurale in Linguaggio C++
Variabile Bandiera (“Flag”)
mUna 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”)
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
espressione fattada un unico operandoe nessun operatore
28G. Mecca - Programmazione Procedurale in Linguaggio C++
Variabile Bandiera (“Flag”)
mPiù 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)
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
vera se b vale falsefalsa se b vale true
18/12/2004
15
29G. Mecca - Programmazione Procedurale in Linguaggio C++
Simulazione
mA questo puntoðsiamo pronti a simulare l’esecuzione della
versione con whileðci concentriamo sull’esecuzione del ciclo
while, e quindiðsulla somma ðsul conteggioðsull’uso del flag
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
30G. Mecca - Programmazione Procedurale in Linguaggio C++
Simulazione
1. continua = true;2. numeroEsami = 0;3. sommaVoti = 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. ...
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
xxxvoto#2503
xxxcontinua#2502
xxxsommaVoti#2501
xxxnumeroEsami#2500
Memoria RAM
Schermo
0
Voto? (0 stop) 21
0
true
21
21
false
22
43
Voto? (0 stop) 22
Voto? (0 stop) 0
12
0
18/12/2004
16
31G. Mecca - Programmazione Procedurale in Linguaggio C++
Convalida dell’Input
m 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
mConvalida dei valori in ingressoðè possibile utilizzare un ciclo while
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
mediaForConvalida.cpp >>mediaWhileConvalida.cpp >>
32G. Mecca - Programmazione Procedurale in Linguaggio C++
Convalida dell’Input
m 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
Strutture di Controllo: Conclusioni >> Tecniche Algoritmiche Notevoli
18/12/2004
17
33G. Mecca - Programmazione Procedurale in Linguaggio C++
Convalida dell’Input
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 >> Tecniche Algoritmiche Notevoli
Svantaggi di questa soluzione:- il codice è meno compatto- è molto meno leggibileUtilizzeremo la seconda
Una soluzione alternativa:
34G. Mecca - Programmazione Procedurale in Linguaggio C++
Errori Frequenti
mUn errore sintattico frequenteðparentesi graffe mancanti per i blocchi delle
istruzioni di controllo
mDue casiðentrambe le parentesi mancantiðsolo la parentesi finale è mancante
Strutture di Controllo: Conclusioni >> Errori Frequenti
18/12/2004
18
35G. Mecca - Programmazione Procedurale in Linguaggio C++
Un Esempio: Media con For#include <iostream.h>void main() {
int voto, sommaVoti;float media;int numeroEsami, i;cout << "Quanti esami hai sostenuto ?" << endl;cin >> numeroEsami;sommaVoti = 0;for (i = 0; i < numeroEsami; i++) {
cout << "Immetti il voto di un esame" << endl;cin >> voto;sommaVoti += voto;
if (numeroEsami > 0)media = ((float)sommaVoti) / numeroEsami;cout << "La media vale: " << media << endl;
else {cout << "Non hai fornito nessun voto" << endl;
}}
Strutture di Controllo: Conclusioni >> Errori Frequenti
manca la parentesi di chiusura
mancano le parentesi del I blocco
36G. Mecca - Programmazione Procedurale in Linguaggio C++
Errori Frequenti
m 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”
m 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”
Strutture di Controllo: Conclusioni >> Errori Frequenti
18/12/2004
19
37G. Mecca - Programmazione Procedurale in Linguaggio C++
Errori Frequenti
mUn errore logico frequenteðnei cicli a conteggio programmati con while,
gestione scorretta della variabile di cicloðmancanza dell’inizializzazioneðmancanza dell’incremento
m In questi casiðil ciclo si comporta in modo scorrettoðnel secondo caso si verifica un loop
Strutture di Controllo: Conclusioni >> Errori Frequenti
38G. Mecca - Programmazione Procedurale in Linguaggio C++
Errori Frequenti
Strutture di Controllo: Conclusioni >> Errori Frequenti
m Manca inizializzazioneðil comportamento è
casualeðdipende dal valore di i
int i;while (i < 5) {
cout << “Valore di i: “;cout << i << endl;i++;
}
m Manca l’incrementoðtipicamente si verifica
un “loop”
int i;i = 0;while (i < 5) {
cout << “Valore di i: “;cout << i << endl;
}
18/12/2004
20
39G. Mecca - Programmazione Procedurale in Linguaggio C++
Riassumendo
m Ricapitolazionem Convenzioni di Stile (ATTENZIONE)m Tecniche Algoritmiche Notevoli (ATTENZIONE)ðSomma con AccumulatoreðConteggio con ContatoreðVariabili Bandiera (“flag”)ðSimulazioneðConvalida dei Dati in Ingresso
m Errori Frequenti
Strutture di Controllo: Conclusioni >> Sommario
40G. Mecca - Programmazione Procedurale in Linguaggio C++
Un Esempio: Media con For#include <iostream.h>void main() {
int voto, sommaVoti;float media;int numeroEsami, i;cout << "Quanti esami hai sostenuto ?" << endl;cin >> numeroEsami;sommaVoti = 0;for (i = 0; i < numeroEsami; i++) {
cout << "Immetti il voto di un esame" << endl;cin >> voto;sommaVoti += voto;
}if (numeroEsami > 0) {
media = ((float)sommaVoti) / numeroEsami;cout << "La media vale: " << media << endl;
} elsecout << "Non hai fornito nessun voto" << endl;
}
Strutture di Controllo: Conclusioni >> Un Esempio
18/12/2004
21
41G. Mecca - Programmazione Procedurale in Linguaggio C++
Un Esempio: Media con While#include <iostream.h>void main() {
int voto, sommaVoti, numeroEsami;float media;bool continua;continua = true;numeroEsami = 0;sommaVoti = 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 = ((float)sommaVoti) / numeroEsami;cout << "La media vale: " << media << endl;
} else {cout << "Non hai fornito nessun voto" << endl;
}}
Strutture di Controllo: Conclusioni >> Un Esempio
42G. Mecca - Programmazione Procedurale in Linguaggio C++
Termini della Licenza
m 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.
Termini della Licenza
m Questo lavoro viene concesso in uso secondo i termini dellalicenza “Attribution-ShareAlike” di Creative Commons. Per ottenereuna copia della licenza, è possibile visitarehttp://creativecommons.org/licenses/by-sa/1.0/ oppure inviare unalettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.