Struttura di un programma C++ direttive direttivedel delpreprocessore preprocessore Fondamenti di Informatica dichiarazioni dichiarazioni (lettere J-Z) int intmain main(()){{ C++: Strutture di Controllo }} Prof. Francesco Lo Presti dichiarazioni dichiarazioni istruzioni istruzioni funzione1 funzione1 …… funzione funzionenn C++: Strutture di Controllo Istruzioni e Strutture di Controllo 2 Istruzioni Semplici Le istruzioni esprimono azioni che, una volta eseguite, comportano una modifica permanente dello stato interno del programma Le strutture di controllo permettono di aggregare istruzioni semplici in istruzioni più più complesse Un’ Un’istruzione C++ ha la seguente forma: Qualsiasi espressione seguita da un punto e virgola è una istruzione semplice istruzione istruzione semplice semplice == espressione espressione;; Esempi …… istruzione istruzione == istruzione istruzione semplice semplice istruzione istruzione di di controllo controllo istruzione == istruzione xx==0; 0; y=y+x; y=y+x; k++; k++; 3; 3; /* /*non nonfa fanulla nulla*/ */ ;; /* /*istruz. istruz.vuota vuota*/ */ C++: Strutture di Controllo 3 …… C++: Strutture di Controllo 4 Istruzioni di Controllo 1. 2. 3. Programmazione Strutturata Una istruzione di controllo può essere: una istruzione composta (blocco) una istruzione condizionale (selezione) una istruzione di iterazione (ciclo) Le istruzioni di controllo sono alla base della programmazione strutturata (Dijkstra, Dijkstra, 1969) C++: Strutture di Controllo Obiettivo: Obiettivo: rendere piu’ piu’ facile la lettura dei programmi (e quindi la loro modifica e manutenzione) Abolizione di salti incondizionati (goto) nel flusso di controllo La parte di esecuzione di un programma è ottenuta dalla combinazione di istruzioni elementari tramite regole di composizione (strutture di controllo) 5 C++: Strutture di Controllo Strutture di Controllo Blocco Concetti chiave: concatenazione o composizione BLOCCO istruzione condizionale SELEZIONE Sintassi blocco blocco=={{ [dichiarazioni [dichiarazionieedefinizioni] definizioni] istruzioni eseguite in sequenza …… istruzione 2 istruzione istruzionenn esegue ripetutamente un’ un’istruzione finché finché rimane vera una espressione (“ (“condizione di iterazione” iterazione”) }} Bohm e Jacopini (1966): queste tre strutture di controllo sono sufficienti per definire tutte le funzioni computabili C++: Strutture di Controllo istruzione 1 istruzione istruzione11 ramifica il flusso di controllo in base al valore vero o falso di una espressione (“ (“condizione di scelta”) ripetizione o iterazione CICLO 6 istruzione n 7 C++: Strutture di Controllo 8 Esempio di Blocco Istruzioni Condizionali #include #include<iostream> <iostream> using namespace using namespacestd; std; int intmain() main() {{ istruzione 2 Struttura di controllo che ramifica il flusso di esecuzione in base al cin cin>>>>xx>>>>y;y; cout cout<<<<x+y; x+y; return return0; 0; istruzione n Vedremo solo l’l’istruzione di scelta semplice C++: Strutture di Controllo vero condizione C++: Strutture di Controllo #include #include<iostream> <iostream> using usingnamespace namespacestd; std; int intmain() main() {{ istruzione istruzioneifif int intvoto; voto; cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esame\n”; \n”; [else [else istruzione istruzioneelse else]] 10 Esempio: if falso istruzione else istruzione if Evitare di introdurre l’l’istruzione break L’istruzione di scelta multipla switch può essere realizzata combinando più più istruzioni di scelta semplici 9 Sintassi scelta scelta== ifif((condizione condizione)) valore vero o falso di una espressione boolean (“condizione di scelta”) valore diverso o uguale a zero di una espressione intera 9 come in C }} Istruzione di Scelta: if alternativa alternativa selezione selezione== scelta scelta||scelta sceltamultipla multipla istruzione 1 int intx,x,y;y; cout cout<<<<“Inserire “Inseriredue duenumeri numeri\n”; \n”; Sintassi vero La parte else e’ e’ opzionale condizione cin cin>>>>voto; voto; ifif(voto>=18) (voto>=18) falso }} istruzione if C++: Strutture di Controllo vero voto>=18 cout cout<<<<“Promosso “Promosso\n”; \n”; return 0; return 0; 11 falso cout<< “Promosso\n”; C++: Strutture di Controllo 12 Esempio: if/else Esempio: if/else #include #include<iostream> <iostream> using namespace using namespacestd; std; #include #include<iostream> <iostream> using namespace using namespacestd; std; int intmain() main() {{ int intmain() main() {{ int intvoto; voto; cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esame\n”; \n”; int intvoto; voto; cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esame\n”; \n”; cin cin>>>>voto; voto; ifif(voto>=18) (voto>=18) cin cin>>>>voto; voto; ifif(voto>=18) (voto>=18) vero cout cout<<<<“Bocciato “Bocciato\n”; \n”; return 0; return 0; falso voto>=18 cout cout<<<<“Promosso “Promosso\n”; \n”; else else cout cout<<<<“Bocciato “Bocciato\n”; \n”; cout << “Mi spiace \n”; cout << “Mi spiace \n”; }} 13 Esempio: if/else annidati cout<< “Promosso\n”; return return0; 0; }} cout<< “Mi spiace\n”; 2. 3. vero cin cin>>>>voto; voto; ifif(voto>=18) (voto>=18) cout cout<<<<“Promosso “Promosso\n”; \n”; else if (voto>=10) else if (voto>=10) C++: Strutture di Controllo 14 C++: Strutture di Controllo 16 Cosa appare sullo schermo? 1. int intmain() main() {{ }} cout<< “Bocciato\n”; Il Problema dell’else Sospeso #include #include<iostream> <iostream> using usingnamespace namespacestd; std; cout cout<<<<“Insufficiente “Insufficiente\n”; \n”; else else cout cout<<<<“Grav. “Grav.Insuff. Insuff.\n”; \n”; falso }} C++: Strutture di Controllo int intvoto; voto; cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esame\n”; \n”; voto>=18 cout cout<<<<“Promosso “Promosso\n”; \n”; else { else { cout<< “Bocciato\n”; cout<< “Promosso\n”; vero falso voto>=18 vero …… ifif(voto>=18) (voto>=18) voto>=10 cout<< “Insuff.\n”; voto=19 voto=15 voto=28 if(voto>27) if(voto>27) cout cout<<<<“Molto “Moltobene! bene!\n”; \n”; falso cout<< “Grav. Ins.\n”; else else cout cout<<<<“Insufficiente “Insufficiente\n”; \n”; …… cout<< “Promosso\n”; return return0;0; C++: Strutture di Controllo 15 Il Problema dell’else Sospeso Il Problema dell’else Sospeso La clausola else si riferisce sempre all’ all’enunciato if piu’ piu’ vicino …… ifif(voto>=18) (voto>=18){{ L’indentazione trae in inganno 9 Il compilatore ignora gli spazi …… ifif(voto>=18) (voto>=18) }} else else cout cout<<<<“Insufficiente “Insufficiente\n”; \n”; if(voto>27) if(voto>27) cout cout<<<<“Molto “Moltobene! bene!\n”; \n”; else else cout cout<<<<“Insufficiente “Insufficiente\n”; \n”; …… else else cout cout<<<<“Insufficiente “Insufficiente\n”; \n”; …… if(voto>27) if(voto>27) cout cout<<<<“Molto “Moltobene! bene!\n”; \n”; …… ifif(voto>=18) (voto>=18) if(voto>27) if(voto>27) cout cout<<<<“Molto “Moltobene! bene!\n”; \n”; …… Come si risolve? Racchiudere comunque istruzione if e istruzione else tra parantesi graffe { } ifif((condizione condizione)){{ istruzione istruzioneifif }} [[else else{{ istruzione istruzioneelse else }}]] 17 Operatori Relazionali Suggerimento C++: Strutture di Controllo Racchiudendo il secondo if tra parentesi graffe C++: Strutture di Controllo 18 Operatori Relazionali: Stringhe Le condizioni dell’ dell’enunciato if sono molto spesso dei confronti tra due espressioni if if (x+y>=18) (x+y>=18) E’ possibile confrontare tra loro stringhe <, <=,==, >=, > string string nome; nome; Gli operatori di confronto si chiamano operatori relazionali …… Descrizione if if (nome<“ciao”) (nome<“ciao”) x>y x maggiore di y < x<y x minore di y …… ≥ >= x>=y x>=y x maggiore o uguale ad y ≤ <= x<=y x<=y x minore o uguale ad y ≠ != x!=y x!=y x diverso da y = == x==y x uguale ad y Operatore C++ Esempio > > < C++: Strutture di Controllo 19 Ordinamento lessicografico (del dizionario) C++: Strutture di Controllo 20 string string a,b; a,b; Ordinamento Lessicografico 1. 2. 3. 4. 5. 6. Ordinamento Lessicografico …… La stringa nulla è “minore” minore” di qualsiasi stringa non nulla Si confrontano le stringhe carattere per carattere i=0; se a è terminata (non ha i caratteri) la condizione è vera se b è terminata la condizione è falsa se il carattere ii-esimo di a è minore del carattere ii-esimo di b allora la condizione è vera if if (a<b) (a<b) {{ …… 0<3<A<Z<b<r 0<3<A<Z<b<r l’ordinamento dei caratteri dipende dal codice ASCII altrimenti se il carattere ii-esimo di a è maggiore del carattere ii-esimo di b allora la condizione è falsa altrimenti (ovvero se i caratteri ii-esimi di a e b sono uguali) incrementa i. vai al passo 2 z o o c a > c a t r g o C++: Strutture di Controllo true (vero) e false (falso) …… ifif(voto>=18) (voto>=18)// //se sepromosso promosso Due valori: true e false cout cout<<<<“Promosso “Promosso\n”; \n”; else // altrimenti è bocciato else // altrimenti è bocciato condizione condizione==espressione espressionebooleana booleana espressione booleana espressione che assume il valore cout cout<<<<“Bocciato “Bocciato\n”; \n”; true o false ma in C++ vale anche (per compatibilità compatibilità con il C …… condizione double intera/ espressioneintera/double intera/double condizione==espressione < piu’ piu’ leggibile il codice In generale Z o o L’uso di variabili booleane rende C++ introduce (rispetto al C) il tipo bool c a 22 Esempi Il risultato di un operatore relazionale è un di tipo bool < 21 Il Tipo di Dati Booleano r g o r c a C++: Strutture di Controllo Esempi cout cout<<<<“Promosso “Promosso\n”; \n”; else else cout cout<<<<“Bocciato “Bocciato\n”; \n”; …… bool bool promosso=voto>=18; promosso=voto>=18; ifif(promosso) (promosso) cout cout<<<<“Promosso “Promosso\n”; \n”; else else cout cout<<<<“Bocciato “Bocciato\n”; \n”; condizione è vera se l’l’espressione è non nulla C++: Strutture di Controllo bool bool promosso=voto>=18; promosso=voto>=18; ifif(promosso==true) (promosso==true) 23 …… C++: Strutture di Controllo 24 Gli Operatori Booleani o Logici Gli Operatori Booleani o Logici Gli operatori booleani o logici servono a svolgere operazioni (logiche) su valori booleani && (AND logico) Permettono di combinare condizioni/espressioni booleane Operatore C++ Esempio Descrizione AND && x>5 && y<0 true se x>5 e y<0 OR || x>5 || y<0 true se x>5 o se y<0 NOT ! !(x>5) true se x>5 è false || (OR logico) …… ifif(voto>=16 (voto>=16&& &&voto<18) voto<18) cout cout<<<<“Prova “ProvaOrale Orale\n”; \n”; …… Piu’ Piu’ operatori booleani possono essere usati in un’ un’unica espressione La valutazione viene fatta da sinistra a destra, con le seguenti precedenze tra operatori true false true false false true true true cond1 cond2 cond1 || cond2 false false false false true true true false true true true true Inverte il valore della condizione booleana cond !cond false true true false 26 La valutazione termina appena il risultato è noto Esempi 1. cond1 && cond2 Se cond1 è false Ö cond1 && cond2 è false 9 Non serve valutare cond2 y>10 y>10oose sex>5, x>5,z>30 z>30eez<100 z<100 L’ordine puo’ puo’ comunque essere alterato dalle parentesi tonde 2. ifif((!(y<=10) ((!(y<=10)|| ||x>5) x>5)&& &&z>30 z>30&& &&z<100) z<100) Se cond1 è true devo valutare anche cond2 cond1 || cond2 Se cond1 è true Ö cond1 || cond2 è true Se cond1 è false devo valutare anche cond2 9 Non serve valutare cond2 La condizione ora è vera quando: y>10 y>10oox>5 x>5eez>30 z>30eez<100 z<100 false La valutazione di un espressione con operatori booleani viene effettuata con una strategia detta “valutazione pigra” pigra” La condizione precedente è vera quando: false Gli Operatori Booleani o Logici 1- NOT, 22- AND, 33- OR cond1 && cond2 false C++: Strutture di Controllo ifif(!(y<=10) (!(y<=10)|| ||x>5 x>5&& &&z>30 z>30&& &&z<100) z<100) cond2 false 25 Gli Operatori Booleani o Logici La condizione è vera se e solo se almeno una è vera cond1 ! (NOT logico) C++: Strutture di Controllo La condizione è vera se e solo se entrambe le condizioni sono vere C++: Strutture di Controllo 27 C++: Strutture di Controllo 28 Leggi di De Morgan Verificare i Dati in input Stabiliscono l’l’equivalenza tra condizioni booleane cin (e cout) cout) sono oggetti di tipo stream lo stato dello stream può essere testato tramite il metodo fail( fail( ) NOT (cond1 AND cond2) = NOT cond1 OR NOT cond2 ifif((cin.fail( cin.fail()))) NOT (cond1 OR cond2) = NOT cond1 AND NOT cond2 Permettono di semplificare espressioni Migliorandone la leggibilità leggibilità false se lo stream cin non è in uno stato di errore 9 non ci sono state operazioni che hanno dato errore Esempi NOT ≤30) yy≤30) NOT(y>10 (y>10AND ANDy≤ NOT ≤0) xx≤0) NOT(y>5 (y>5OR ORx≤ NOT NOTy>10 y>10OR ORNOT NOTyy≤≤30 30 NOT ≤0 xx≤0 NOTy>5 y>5AND ANDNOT NOTx≤ yy≤10 ≤10 OR ORy>30 y>30 Esempio fail( fail( ) restituisce yy≤5 ≤5 AND ANDx>0 x>0 C++: Strutture di Controllo true se lo stream cin è in stato di errore 9 ci sono state operazioni che hanno generato un errore 9 Esempio: lettere inserite in ingresso quando ci si aspetta un valore numerico 29 C++: Strutture di Controllo Esempio #include #include<iostream> <iostream> #include #include<string> <string> #include #include<cmath> <cmath> using usingnamespace namespacestd; std; int intmain( main() ) { { double doublearea; area; Versione più più “pulita” ” pulita #include #include<iostream> <iostream> #include #include<string> <string> #include #include<cmath> <cmath> using usingnamespace namespacestd; std; int intmain( main() ) { { double doublearea; area; int intcondizione=0; condizione=0; cout cout<<<<"Please "Pleaseenter enterthe thearea areaof ofaasquare: square:";"; cout cout<<<<"Please "Pleaseenter enterthe thearea areaof ofaasquare: square:";"; cin >> area; cin >> area; cin cin>>>>area; area; ifif(cin.fail( (cin.fail()))){ { cout cout<<<<"Error: "Error:Bad Badinput\n"; input\n"; ifif(cin.fail( (cin.fail()))){ { cout cout<<<<"Error: "Error:Bad Badinput\n"; input\n"; condizione=1; condizione=1; return return1;1; }} }} else else ifif(area (area< <0) 0){ { cout << "Error: cout << "Error:Negative Negativearea.\n"; area.\n"; ifif(area (area< <0) 0){ { cout << "Error: cout << "Error:Negative Negativearea.\n"; area.\n"; }} }} 30 return return1;1; }} else else cout cout<<<<"The "Theside sidelength lengthisis""<<<<sqrt(area) sqrt(area)<<<<"\n"; "\n"; cout cout<<<<"The "Theside sidelength lengthisis""<<<<sqrt(area) sqrt(area)<<<<"\n"; "\n"; return 0; return 0; C++: Strutture di Controllo condizione=1; condizione=1; 31 }} return returncondizione; condizione; C++: Strutture di Controllo 32 Verificare i Dati in input Verificare i Dati in input Il C++ permette di fare cose… cose…strane eredità eredità del C …… cin cin>>>>area; area; cin; cin; ifif(cin.fail( (cin.fail()))){ { cout cout<<<<"Error: "Error:Bad Badinput\n"; input\n"; cin cin>>>>i;i; return return1;1; sono espressioni che hanno un valore non nullo se lo stream cin non è in uno stato di errore altrimenti hanno valore nullo }} ifif(area (area< <0) 0){ { cout << "Error: cout << "Error:Negative Negativearea.\n"; area.\n"; }} return return1;1; cout cout<<<<"The "Theside sidelength lengthisis""<<<<sqrt(area) sqrt(area)<<<< "\n"; "\n"; …… C++: Strutture di Controllo cout cout<<<<"The "Theside sidelength lengthisis""<<<<sqrt(area) sqrt(area)<<<< "\n"; "\n"; }} else else{ { cout cout<<<<"Error: "Error:Bad Badinput\n"; input\n"; }} return return1;1; …… C++: Strutture di Controllo 34 Istruzione while Sintassi Sintassi istr. istr.while while== while while((condizione condizione)) istr. istr.di diiterazione iterazione== istr. istr.while while||istr. istr.for for||istr. istr.do-while do-while }} cout cout<<<<"Error: "Error:Negative Negativearea.\n"; area.\n"; return 1; return 1; 33 Istruzione di Iterazione …… ifif(cin (cin>>>>area area) ){ { ifif(area (area< <0) 0) { { Struttura di controllo per eseguire piu’ piu’ volte la stessa istruzione, istruzione, blocco, blocco, scelta, scelta, … istruzione istruzione L’istruzione viene eseguita finche’ finche’ la condizione rimane vera Puo’ Puo’ essere eseguita 0 o piu’ piu’ volte condizione falso C++: Strutture di Controllo vero 35 cfr. cfr. con dodo-while Infinite volte se la condizione è sempre vera!! vera!! istruzione C++: Strutture di Controllo 36 Esempio: Iterazione Controllata da Contatore Esempio Una classe di 10 studenti ha sostenuto un test. Inserire i voti (compresi da 0 a 100) e calcolare la media. Dichiara Variabili totale, contatore, voto e media Dal Pseudocodice al codice totale=0 Dichiarare variabili contatore=0 e inizializzarle Inizializzazione ? Inizializzazione while contatore<10 richiedi voto Inserire i 10 valori Processamento somma voto a totale Processamento incrementa contatore Calcolare la media Termine Media=totale/10 Termine Stampa la media C++: Strutture di Controllo 37 Esempio Dichiara Variabili totale, contatore, voto e media Dal Pseudocodice al codice while contatore<10 contatore<10 incrementa contatore Esempio int intmain() main() {{ falso int inttotale=0, totale=0,contatore=0, contatore=0,voto; voto; double doublemedia; media; contatore=0 richiedi voto somma voto a totale richiedi voto vero somma voto a totale Somma voto a totale contatore<10 while(contatore<10) while(contatore<10) { { cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esame\n”; \n”; falso cin cin>>>>voto; voto; totale=totale+voto; totale=totale+voto; richiedi voto Incrementa contatore }} incrementa contatore Media=totale/10 C++: Strutture di Controllo 39 38 #include #include<iostream> <iostream> using usingnamespace namespacestd; std; totale=0 vero Stampa la media C++: Strutture di Controllo Stampa la media contatore=contatore+1; contatore=contatore+1; media=totale/10.0; media=totale/10.0; cout cout<<<<“La “Lamedia mediaèè“ “<<<<media; media; return 0; return 0; }} C++: Strutture di Controllo 40 Esempio: Iterazone Controllata da un Valore Sentinella Iterazione Controllata da un Contatore 1. Una variabile di controllo 1. Controllore di ciclo 2. Valore iniziale della int intmain() main() {{ variabile 3. La condizione di int inttotale=0, totale=0,contatore=0, contatore=0,voto; voto; double doublemedia; media; continuazione di ciclo Una classe ha sostenuto un test. Inserire i voti (compresi da 0 a 100) e calcolare la media. Problema: numero di studenti non noto #include #include<iostream> <iostream> using usingnamespace namespacestd; std; while(contatore<10) while(contatore<10) { { cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esame\n”; \n”; Verifica se si è raggiunto il valore finale 4. L’incremento (o il cin cin>>>>voto; voto; totale=totale+voto; totale=totale+voto; decremento) che modifica il contatore }} Valore Sentinella contatore=contatore+1; contatore=contatore+1; Indica la fine dei dati Iterazione finisce quando in ingresso viene inserito il valore sentinella Sentinella deve essere scelta in modo da non essere confusa 9 -1 in questo caso media=totale/10.0; media=totale/10.0; cout cout<<<<“La “Lamedia mediaèè“ “<<<<media; media; }} return return0;0; C++: Strutture di Controllo C++: Strutture di Controllo Esempio Esempio 41 Dichiara Variabili totale, contatore, voto e media Dichiara Variabili totale, contatore, voto e media totale=0 totale=0 contatore=0 contatore=0 Dal Pseudocodice al codice Dichiarare variabili e inizializzarle Inizializzazione Inserire i valori Processamento se sono stati inseriti dei voti calcola la media Termine stampa media altrimenti stampa messaggio inserire voto inserire voto while voto≠sentinella while voto≠sentinella somma voto a totale somma voto a totale incrementa contatore incrementa contatore inserire prossimo voto inserire prossimo voto se contatore>0 se contatore>0 media=totale/contatore media=totale/contatore stampa media stampa media else stampa di messaggio C++: Strutture Controllo Condizione CondizionedidiContinuazione Continuazionecon conValore ValoreSentinella Sentinella #include <iostream> #include <iostream> using namespace std; using namespace std; int main() int main() { { int totale=0, contatore=0, voto; int totale=0, contatore=0, voto; double media; double media; cout << “Inserire il voto dell’esame o -1\n”; cout << “Inserire il voto dell’esame o -1\n”; cin >> voto; cin >> voto; while(voto !=-1) { while(voto !=-1) { totale=totale+voto; totale=totale+voto; contatore=contatore+1; contatore=contatore+1; cout << “Inserire il voto dell’esame o -1\n”; cout << “Inserire il voto dell’esame o -1\n”; cin >> voto; cin >> voto; } } if (contatore>0) { if (contatore>0) { media=(double) totale/contatore; media=(double) totale/contatore; cout cout<<<<“La “Lamedia mediaèè“ “<<<<media media<<<<“\n”; “\n”; }} else 43 stampa messaggio 42 } else else cout << “Non è stato inserito alcun valore \n”; cout << “Non è stato inserito alcun valore \n”; return 0; return 0; } C++: Strutture di Controllo 44 Esempio: Alternative Variabile booleana per il test di fine iterazione e… …… cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esameoo-1\n”; -1\n”; cin cin>>>>voto; voto; while(voto while(voto!=-1) !=-1) { { Esempio: Alternative cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esameoo-1\n”; -1\n”; cin >> voto; cin >> voto; …… finito=voto==-1; finito=voto==-1; }} cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esameoo-1\n”; -1\n”; cin >> voto; cin >> voto; C++: Strutture di Controllo Istruzioni del tipo Operatore di Incremento (++) Possono essere riscritte come Incrementa una variabile di 1 x++; x++; In generale x=x+1; x=x+1; Decrementa una variabile di 1 x--; x--; puo’ puo’ essere riscritto come x+=1; x+=1; Operatore di Decremento (-(--)) nomeVariabile nomeVariabile==nomeVariabile nomeVariabileop opespressione espressione; ; 46 Operatori di Incremento e Decremento total+=quarters total+=quarters**0.25; 0.25; }} totale=totale+voto; totale=totale+voto; contatore=contatore+1; contatore=contatore+1; …… total=total+ total=total+quarters quarters**0.25; 0.25; }} 45 Operatori di Assegnazione finito=voto==-1; finito=voto==-1; if( if(!finito) !finito){ { …… …… C++: Strutture di Controllo cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esameoo-1\n”; -1\n”; cin >> voto; cin >> voto; totale=totale+voto; totale=totale+voto; contatore=contatore+1; contatore=contatore+1; cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esameoo-1\n”; -1\n”; cin >> voto; cin >> voto; }} …… bool boolfinito=false; finito=false; while(!finito) while(!finito) { { cin cin>>>>voto; voto; while(voto while(voto!=-1) !=-1) { { totale=totale+voto; totale=totale+voto; contatore=contatore+1; contatore=contatore+1; cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esameoo-1\n”; -1\n”; cin >> voto; cin >> voto; Eliminare l’l’input prima del while …… cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esameoo-1\n”; -1\n”; finito=voto==-1; finito=voto==-1; while(!finito) while(!finito) { { totale=totale+voto; totale=totale+voto; contatore=contatore+1; contatore=contatore+1; }} …… bool boolfinito; finito; x-=1; x-=1; x=x-1; x=x-1; nomeVariabile nomeVariabileop op==espressione espressione; ; <op> = +,+,-,*,/,% Esempi x=x-5; x=x-5; x-=5; x-=5; x=x-(5+z); x=x-(5+z); x-=5+z; x-=5+z; C++: Strutture di Controllo 47 C++: Strutture di Controllo 48 Operatori di Incremento e Decremento Esempio Postincremento variabile variabile++ ++ Il valore della variabile viene incrementato dopo della valutazione dell’ dell’espressione in cui appare la variabile 9 Operatore ++ segue la variabile y=x++; y=x++; Preincremento y=x; y=x; finito=voto==-1; finito=voto==-1; if( if(!finito) !finito){ { y=x; y=x; C++: Strutture di Controllo int intmain( main()){{ double doublenext; next; }} cout cout<<<<"Please "Pleaseenter enterthe thetemperature temperature values:\n"; values:\n"; ifif(cin (cin>>>>next) next) }} }} }} totale+=voto; totale+=voto; contatore++; contatore++; …… 49 C++: Strutture di Controllo 50 Istruzione do-while while while(cin (cin>>>>next) next){{ ifif(next > highest) (next > highest) double doublehighest; highest; cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esameoo-1\n”; -1\n”; cin >> voto; cin >> voto; totale=totale+voto; totale=totale+voto; contatore=contatore+1; contatore=contatore+1; …… x=x+1; x=x+1; #include #include<iostream> <iostream> using namespace using namespacestd; std; highest highest==next; next; istruzione }}while while((condizione condizione);); cout cout<<<<"The "Thehighest highesttemperature temperatureisis""<<<< highest << "\n"; highest << "\n"; return return0; 0; }} Esercizio: Scrivere lo La condizione è controllata a fine ciclo stesso programma usando cin.fail( cin.fail( ) C++: Strutture di Controllo Sintassi istr. istr.do dowhile while==do do{{ istruzione istruzione }} Ö Ösegue segue finito=voto==-1; finito=voto==-1; if( if(!finito) !finito){ { }} Esempio: Calcolo del Massimo cout cout<<<<"No "Nodata!\n"; data!\n"; return 1; return 1; …… bool boolfinito=false; finito=false; while(!finito) while(!finito) { { x=x+1; x=x+1; 9 Operatore ++ precede la variabile highest highest==next; next; else { else { …… bool boolfinito=false; finito=false; while(!finito) while(!finito) { { cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esameoo-1\n”; -1\n”; cin cin>>>>voto; voto; ++ ++variabile variabile Il valore della variabile viene incrementato prima della valutazione dell’ dell’espressione in cui appare la variabile y=++x; y=++x; Assegnamento Compatto e Operatore di Incremento 51 Il ciclo viene eseguito 1 o piu’ piu’ volte Nel while la condizione è controllata a inizio ciclo vero condizione falso C++: Strutture di Controllo 52 Esempio L’esempio precedente si presta bene all’ all’utilizzo del dodo-while …… bool boolfinito=false; finito=false; while(!finito) while(!finito) { { cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esameoo-1\n”; -1\n”; cin cin>>>>voto; voto; finito=voto==-1; finito=voto==-1; if( if(!finito) !finito){ { totale+=voto; totale+=voto; }} …… }} Iterazione Controllata da un Contatore contatore++; contatore++; #include #include<iostream> <iostream> using usingnamespace namespacestd; std; …… bool boolfinito=false; finito=false; do do { { cout cout<<<<“Inserire “Inserireililvoto votodell’esame dell’esameoo-1\n”; -1\n”; if( if(!finito) !finito){ { totale+=voto; totale+=voto; }} contatore++; contatore++; }} } }while(!finito); while(!finito); …… inizializzazione istr. istr.for for== for( for(iniz. iniz.;;condizione condizione;;modifica modifica)) int intmain() main() {{ for for(int (intcontatore=0; contatore=0;contatore<10; contatore<10;contatore++) contatore++) cout << contatore << cout << contatore <<“\n”; “\n”; }} falso Modifica Contatore istruzione modifica C++: Strutture di Controllo 54 C++: Strutture di Controllo 56 Esempio: Calcolo del Fattoriale Sintassi #include #include<iostream> <iostream> using usingnamespace namespacestd; std; Istruzione Ciclo contatore=contatore+1; contatore=contatore+1; return return0;0; condizione Condizione 53 Istruzione for istruzione istruzione;; vero while(contatore<10) while(contatore<10) { { cout cout <<<<contatore contatore<<<<“\n”; “\n”; C++: Strutture di Controllo Inizializzazione int intcontatore; contatore; contatore=0; contatore=0; cin cin>>>>voto; voto; finito=voto==-1; finito=voto==-1; }} inizializzazione int intmain() main() {{ Fattoriale: n!=1· n!=1·2·3…·n …·n 0!=1 #include #include<iostream> <iostream> using usingnamespace namespacestd; std; vero condizione falso int intmain() main() {{ int intn,n,fattoriale=1; fattoriale=1; cout cout<<<<“Inserire “InserireNumero: Numero:“;“; istruzione cin cin>>>>n;n; for for(int (inti=2; i=2;i<=n; i<=n;i++) i++) modifica return return0;0; }} C++: Strutture di Controllo 55 fattoriale*=i; fattoriale*=i; cout cout<<<<nn<<<<“!= “!=“ “<<<<fattoriale; fattoriale; return 0; return 0; Istruzione for L’incremento (o il decremento) possono non essere unitari #include #include<iostream> <iostream> using usingnamespace namespacestd; std; int intmain() main() {{ int inti;i; for for(i=0; (i=0;i<10; i<10;i=i+2) i=i+2) }} Esempio: cicli for annidati cout cout <<<<i i<<<<“\n”; “\n”; return 0; return 0; Stampare la tavola pitagorica #include #include<iostream> <iostream> using usingnamespace namespacestd; std; 0 2 int intmain() main() {{ 4 int inti,i,j;j; for for(i=1; (i=1;i<=10; i<=10;i++) i++){{ 6 8 for(j=1; for(j=1;j<=10; j<=10;j++) j++) cout << i*j << cout << i*j <<“““;“; cout cout<<<<“\n”; “\n”; }} return return0; 0; C++: Strutture di Controllo 57 Formattazione Output Per poter formattare/incolonnare l’l’output si usano dei manipolatori di stream: stream: setprecision(n) setprecision(n):: n numero di cifre significative fixed: fixed: i numeri floating point sono mostrati secondo la rappresentazione in virgola fissa cout << fixed << setprecision(n) setprecision(n) << x 1.13 1.13 cout cout<<<<setw(4) setw(4)<<<<aa<<<<setw(4) setw(4) <<<<b; b; …… x è rappresentato in virgola fissa con n cifre significative dopo lo 0 …… double doublea=1.1345; a=1.1345; 2 1.135 1.135 cout cout<<<<fixed fixed<<<<setprecision(3) setprecision(3)<<<<a;a; …… setw(n) setw(n):: imposta pari ad n la larghezza (minima) in caratteri della successiva espressione in output …… int intx=2, x=2,y=12; y=12; 58 cout cout<<<<setprecision(3) setprecision(3)<<<<a;a; …… C++: Strutture di Controllo Formattazione Output …… double doublea=1.1345; a=1.1345; }} 1 2 l’uso dei manipolatori richiede l’l’inclusione del file header iomanip.h #include<iomanip> #include<iomanip> C++: Strutture di Controllo 59 C++: Strutture di Controllo 60 Scelta fra Comandi Iterativi while, while, dodo-while o for: for: Quale usare? Indicazioni di massima Iterazione contrallata da un contatore Ö for Iterazione controllata da un eventoevento-condizione Ö Deve essere eseguito almento una volta Ö dodo-while Altrimenti Ö while C++: Strutture di Controllo 61