Programmazione Procedurale in Linguaggio C++ · 18/12/2004 3 5 G. Mecca - Programmazione...

21
G. Mecca – Università della Basilicata – [email protected] 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) 2 G. Mecca - Programmazione Procedurale in Linguaggio C++ Sommario m Ricapitolazione m Convenzioni di Stile m 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

Transcript of Programmazione Procedurale in Linguaggio C++ · 18/12/2004 3 5 G. Mecca - Programmazione...

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.