Post on 16-Feb-2019
FondamentiFondamenti di di InformaticaInformatica((letterelettere JJ--Z)Z)
C++: C++: StruttureStrutture didi ControlloControllo
Prof. Francesco Lo PrestiProf. Francesco Lo Presti
C++: Strutture di Controllo 2
Struttura di un programma C++Struttura di un programma C++
direttive del preprocessore
dichiarazioni
int main ( ) {dichiarazioniistruzioni
}
funzione1…funzione n
direttivedirettive del del preprocessorepreprocessore
dichiarazionidichiarazioni
intint main ( ) {main ( ) {dichiarazionidichiarazioniistruzioniistruzioni
}}
funzione1funzione1……funzionefunzione nn
C++: Strutture di Controllo 3
Istruzioni e Strutture di ControlloIstruzioni e Strutture di Controllo
Le Le istruzioniistruzioni esprimono esprimono azioniazioni che, una volta che, una volta eseguite, comportano una eseguite, comportano una modifica permanentemodifica permanentedello stato internodello stato interno del programmadel programmaLe Le strutture di controllostrutture di controllo permettono di permettono di aggregareaggregareistruzioni sempliciistruzioni semplici in istruzioni piin istruzioni piùù complessecomplesseUnUn’’istruzione C++ ha la seguente forma:istruzione C++ ha la seguente forma:
istruzione = istruzione sempliceistruzione = istruzione di controlloistruzioneistruzione == istruzioneistruzione semplicesempliceistruzioneistruzione == istruzioneistruzione didi controllocontrollo
C++: Strutture di Controllo 4
Istruzioni SempliciIstruzioni Semplici
Qualsiasi Qualsiasi espressioneespressione seguita da un punto e virgola seguita da un punto e virgola èè una una istruzione sempliceistruzione semplice
Esempi
istruzione semplice = espressione;istruzioneistruzione semplicesemplice = = espressioneespressione;;
…
x = 0;
y=y+x;
k++;
3; /* non fa nulla */
; /* istruz. vuota */
…
…
x = 0;
y=y+x;
k++;
3; /* non fa nulla */
; /* istruz. vuota */
…
C++: Strutture di Controllo 5
Istruzioni di ControlloIstruzioni di Controllo
Una istruzione di controllo può essere:Una istruzione di controllo può essere:1.1. una istruzione una istruzione compostacomposta (blocco)(blocco)2.2. una istruzione una istruzione condizionale condizionale (selezione)(selezione)3.3. una istruzione di una istruzione di iterazioneiterazione (ciclo)(ciclo)
Le istruzioni di controllo sono alla base della Le istruzioni di controllo sono alla base della programmazione strutturataprogrammazione strutturata ((DijkstraDijkstra, 1969), 1969)
C++: Strutture di Controllo 6
Programmazione StrutturataProgrammazione Strutturata
ObiettivoObiettivo: rendere : rendere piupiu’’ facile la lettura dei facile la lettura dei programmi (e quindi la loro modifica e programmi (e quindi la loro modifica e manutenzione)manutenzione)
Abolizione di salti incondizionati (goto) nel flusso Abolizione di salti incondizionati (goto) nel flusso di controllodi controllo
La parte di esecuzione di un programma La parte di esecuzione di un programma èè ottenuta ottenuta dalla combinazione di istruzioni elementari tramite dalla combinazione di istruzioni elementari tramite regole di composizione (strutture di controllo) regole di composizione (strutture di controllo)
C++: Strutture di Controllo 7
Strutture di ControlloStrutture di Controllo
Concetti chiave:Concetti chiave:concatenazione o composizione concatenazione o composizione BLOCCOBLOCCO
istruzioni eseguite in sequenzaistruzioni eseguite in sequenzaistruzione condizionale istruzione condizionale SELEZIONESELEZIONE
ramifica il flusso di controllo in base al valore vero o falso ramifica il flusso di controllo in base al valore vero o falso di una espressione (di una espressione (““condizione di sceltacondizione di scelta””))
ripetizione o iterazione ripetizione o iterazione CICLOCICLOesegue ripetutamente unesegue ripetutamente un’’istruzione finchistruzione finchéé rimane vera rimane vera una espressione (una espressione (““condizione di iterazionecondizione di iterazione””))
BohmBohm e e JacopiniJacopini (1966): queste tre strutture di (1966): queste tre strutture di controllo sono sufficienti per definire tutte le controllo sono sufficienti per definire tutte le funzioni computabilifunzioni computabili
C++: Strutture di Controllo 8
BloccoBlocco
SintassiSintassi
blocco = {
[dichiarazioni e definizioni]istruzione 1…
istruzione n}
blocco = {
[dichiarazioni e definizioni]istruzione 1…
istruzione n}
istruzione 1
istruzione 2
istruzione n
C++: Strutture di Controllo 9
Esempio di BloccoEsempio di Blocco
#include <iostream>
using namespace std;
int main()
{
int x, y;
cout << “Inserire due numeri \n”;
cin >> x >> y;
cout << x+y;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int x, y;
cout << “Inserire due numeri \n”;
cin >> x >> y;
cout << x+y;
return 0;
}
istruzione 1
istruzione 2
istruzione n
C++: Strutture di Controllo 10
Istruzioni CondizionaliIstruzioni Condizionali
SintassiSintassi
Struttura di controllo che ramifica il flusso di Struttura di controllo che ramifica il flusso di esecuzione in base al esecuzione in base al
valore valore verovero o o falsofalso di una espressione di una espressione booleanboolean((““condizione di sceltacondizione di scelta””))valore diverso o uguale a zero di una espressione interavalore diverso o uguale a zero di una espressione intera
come in Ccome in C
Vedremo solo lVedremo solo l’’istruzione di scelta semplice istruzione di scelta semplice Evitare di introdurre lEvitare di introdurre l’’istruzione istruzione breakbreakLL’’istruzione di scelta multipla istruzione di scelta multipla switchswitch può essere può essere realizzata combinando pirealizzata combinando piùù istruzioni di scelta semplici istruzioni di scelta semplici
selezione = scelta | scelta multiplaselezione = scelta | scelta multipla
alternativaalternativa
C++: Strutture di Controllo 11
IstruzioneIstruzione didi SceltaScelta: if : if
SintassiSintassi
La parte else eLa parte else e’’ opzionaleopzionale
scelta =
if ( condizione )
istruzione if[else
istruzione else]
scelta =
if ( condizione )
istruzione if[else
istruzione else]
istruzione if istruzione else
condizione
istruzione if
condizione
vero
vero falso
falso
C++: Strutture di Controllo 12
Esempio: Esempio: ifif
#include <iostream>
using namespace std;
int main()
{
int voto;
cout << “Inserire il voto dell’esame \n”;
cin >> voto;
if (voto>=18)
cout << “Promosso \n”;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int voto;
cout << “Inserire il voto dell’esame \n”;
cin >> voto;
if (voto>=18)
cout << “Promosso \n”;
return 0;
}cout<< “Promosso\n”;
voto>=18vero falso
C++: Strutture di Controllo 13
Esempio: Esempio: ifif/else/else
#include <iostream>
using namespace std;
int main()
{
int voto;
cout << “Inserire il voto dell’esame \n”;
cin >> voto;
if (voto>=18)
cout << “Promosso \n”;
else
cout << “Bocciato \n”;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int voto;
cout << “Inserire il voto dell’esame \n”;
cin >> voto;
if (voto>=18)
cout << “Promosso \n”;
else
cout << “Bocciato \n”;
return 0;
}
cout<< “Promosso\n”; cout<< “Bocciato\n”;
voto>=18vero falso
C++: Strutture di Controllo 14
Esempio: Esempio: ifif/else/else
#include <iostream>
using namespace std;
int main()
{
int voto;
cout << “Inserire il voto dell’esame \n”;
cin >> voto;
if (voto>=18)
cout << “Promosso \n”;
else {
cout << “Bocciato \n”;
cout << “Mi spiace \n”;
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int voto;
cout << “Inserire il voto dell’esame \n”;
cin >> voto;
if (voto>=18)
cout << “Promosso \n”;
else {
cout << “Bocciato \n”;
cout << “Mi spiace \n”;
}
return 0;
}
cout<< “Promosso\n”;
voto>=18vero falso
cout<< “Mi spiace\n”;
cout<< “Bocciato\n”;
C++: Strutture di Controllo 15
Esempio: Esempio: ifif/else annidati/else annidati
#include <iostream>
using namespace std;
int main()
{
int voto;
cout << “Inserire il voto dell’esame \n”;
cin >> voto;
if (voto>=18)
cout << “Promosso \n”;
else if (voto>=10)
cout << “Insufficiente \n”;
else
cout << “Grav. Insuff. \n”;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int voto;
cout << “Inserire il voto dell’esame \n”;
cin >> voto;
if (voto>=18)
cout << “Promosso \n”;
else if (voto>=10)
cout << “Insufficiente \n”;
else
cout << “Grav. Insuff. \n”;
return 0;
}
cout<< “Promosso\n”;
voto>=18vero falso
cout<< “Insuff.\n”; cout<< “Grav. Ins.\n”;
vero falsovoto>=10
C++: Strutture di Controllo 16
Il Problema dellIl Problema dell’’else Sospesoelse Sospeso
Cosa appare sullo schermo?Cosa appare sullo schermo?1.1. voto=19voto=192.2. voto=15voto=153.3. voto=28voto=28
…
if (voto>=18)
if(voto>27)
cout << “Molto bene! \n”;
else
cout << “Insufficiente \n”;
…
…
if (voto>=18)
if(voto>27)
cout << “Molto bene! \n”;
else
cout << “Insufficiente \n”;
…
C++: Strutture di Controllo 17
Il Problema dellIl Problema dell’’else Sospesoelse Sospeso
La clausola else si riferisce sempre allLa clausola else si riferisce sempre all’’enunciato enunciato ififpiupiu’’ vicinovicino
LL’’indentazione trae in ingannoindentazione trae in ingannoIl compilatore ignora gli spaziIl compilatore ignora gli spazi
Come si risolve? Come si risolve?
…
if (voto>=18)
if(voto>27)
cout << “Molto bene! \n”;
else
cout << “Insufficiente \n”;
…
…
if (voto>=18)
if(voto>27)
cout << “Molto bene! \n”;
else
cout << “Insufficiente \n”;
…
…
if (voto>=18)
if(voto>27)
cout << “Molto bene! \n”;
else
cout << “Insufficiente \n”;
…
…
if (voto>=18)
if(voto>27)
cout << “Molto bene! \n”;
else
cout << “Insufficiente \n”;
…
C++: Strutture di Controllo 18
Il Problema dellIl Problema dell’’else Sospesoelse Sospeso
Racchiudendo il secondo Racchiudendo il secondo ifif tra parentesi graffe tra parentesi graffe
SuggerimentoSuggerimentoRacchiudere comunque Racchiudere comunque istruzione istruzione ifif e e istruzione elseistruzione elsetra tra parantesiparantesi graffe { } graffe { }
…
if (voto>=18) {
if(voto>27)
cout << “Molto bene! \n”;
}
else
cout << “Insufficiente \n”;
…
…
if (voto>=18) {
if(voto>27)
cout << “Molto bene! \n”;
}
else
cout << “Insufficiente \n”;
…
if (condizione) {
istruzione if}
[ else {
istruzione else} ]
if (condizione) {
istruzione if}
[ else {
istruzione else} ]
C++: Strutture di Controllo 19
Operatori RelazionaliOperatori Relazionali
Le condizioni dellLe condizioni dell’’enunciato enunciato ifif sono molto spesso dei sono molto spesso dei confronti tra due espressioniconfronti tra due espressioni
Gli operatori di confronto si chiamano operatori Gli operatori di confronto si chiamano operatori relazionalirelazionali
if (x+y>=18)if (x+y>=18)
x uguale ad yx uguale ad yx==yx==y======
x diverso da yx diverso da yx!x!=y=y!=!=≠≠
x minore o uguale ad yx minore o uguale ad yx<x<=y=y<=<=≤≤
x maggiore o uguale ad yx maggiore o uguale ad yx>x>=y=y>=>=≥≥
x minore di yx minore di yx<yx<y<<<<
x maggiore di yx maggiore di yx>yx>y>>>>
DescrizioneDescrizioneEsempioEsempioC++C++OperatoreOperatore
C++: Strutture di Controllo 20
Operatori Relazionali: StringheOperatori Relazionali: Stringhe
EE’’ possibile confrontare tra loro stringhe possibile confrontare tra loro stringhe <, <=,==, >=, ><, <=,==, >=, >
Ordinamento lessicografico (del dizionario)Ordinamento lessicografico (del dizionario)
string nome;
…
if (nome<“ciao”)
…
string nome;
…
if (nome<“ciao”)
…
C++: Strutture di Controllo 21
Ordinamento LessicograficoOrdinamento Lessicografico
La stringa nulla La stringa nulla èè ““minoreminore”” di qualsiasi stringa non di qualsiasi stringa non nullanullaSi confrontano le stringhe carattere per Si confrontano le stringhe carattere per caratterecarattere
1.1. i=0;i=0;2.2. se a se a èè terminata (non ha i caratteri) la condizione terminata (non ha i caratteri) la condizione
èè veravera3.3. se b se b èè terminata la condizione terminata la condizione èè falsafalsa4.4. se il carattere ise il carattere i--esimo di a esimo di a èè minore del minore del
carattere icarattere i--esimo di b allora la condizione esimo di b allora la condizione èè vera vera ll’’ordinamento dei caratteri dipende dal codice ordinamento dei caratteri dipende dal codice ASCIIASCII
5.5. altrimenti se il carattere ialtrimenti se il carattere i--esimo di a esimo di a èè maggiore maggiore del carattere idel carattere i--esimo di b allora la condizione esimo di b allora la condizione èèfalsafalsa
6.6. altrimenti (ovvero se i caratteri ialtrimenti (ovvero se i caratteri i--esimi di a e b esimi di a e b sono uguali) incrementa i. vai al passo 2sono uguali) incrementa i. vai al passo 2
string a,b;
…
if (a<b) { …
string a,b;
…
if (a<b) { …
0<3<A<Z<b<r0<3<A<Z<b<r
C++: Strutture di Controllo 22
Ordinamento LessicograficoOrdinamento Lessicografico
EsempiEsempi
c a r c a r g o<
Z o o z o o<
c a t c a r g o>
C++: Strutture di Controllo 23
Il Tipo di Dati Il Tipo di Dati BooleanoBooleano
Il risultato di un operatore relazionale Il risultato di un operatore relazionale èè un di tipo un di tipo boolbool
truetrue (vero) e false (falso)(vero) e false (falso)C++ introduce (rispetto al C) il tipo C++ introduce (rispetto al C) il tipo boolbool
Due valori: Due valori: truetrue e falsee falseIn generaleIn generale
espressione espressione booleanabooleana espressione che assume il valore espressione che assume il valore truetrue o falseo falsema in C++ vale anche (per compatibilitma in C++ vale anche (per compatibilitàà con il Ccon il C
condizione condizione èè vera se lvera se l’’espressione espressione èè non nullanon nulla
condizione = espressione booleanacondizionecondizione = = espressione espressione booleanabooleana
condizione = espressione intera/doublecondizionecondizione = = espressione intera/espressione intera/doubledouble
C++: Strutture di Controllo 24
EsempiEsempi
LL’’uso di variabili uso di variabili booleanebooleane rende rende piupiu’’ leggibile il codiceleggibile il codice
…
if (voto>=18) // se promosso
cout << “Promosso \n”;
else // altrimenti è bocciato
cout << “Bocciato \n”;
…
…
if (voto>=18) // se promosso
cout << “Promosso \n”;
else // altrimenti è bocciato
cout << “Bocciato \n”;
…
bool promosso=voto>=18;
if (promosso==true)
cout << “Promosso \n”;
else
cout << “Bocciato \n”;
…
bool promosso=voto>=18;
if (promosso==true)
cout << “Promosso \n”;
else
cout << “Bocciato \n”;
…
bool promosso=voto>=18;
if (promosso)
cout << “Promosso \n”;
else
cout << “Bocciato \n”;
…
bool promosso=voto>=18;
if (promosso)
cout << “Promosso \n”;
else
cout << “Bocciato \n”;
…
C++: Strutture di Controllo 25
Gli Operatori Gli Operatori BooleaniBooleani o Logicio Logici
Gli operatori Gli operatori booleanibooleani o logici servono a svolgere o logici servono a svolgere operazioni (logiche) su valori operazioni (logiche) su valori booleanibooleani
Permettono di combinare condizioni/espressioni Permettono di combinare condizioni/espressioni booleanebooleane
truetrue se x>5 se x>5 èè false false !(x>5)!(x>5)!!NOTNOTtruetrue se x>5 o se y<0se x>5 o se y<0x>5 || y<0x>5 || y<0||||ORORtruetrue se x>5 e y<0se x>5 e y<0x>5 && y<0x>5 && y<0&&&&ANDANDDescrizioneDescrizioneEsempioEsempioC++C++OperatoreOperatore
…
if (voto>=16 && voto<18)
cout << “Prova Orale \n”;
…
…
if (voto>=16 && voto<18)
cout << “Prova Orale \n”;
…
C++: Strutture di Controllo 26
Gli Operatori Gli Operatori BooleaniBooleani o Logicio Logici
&& (AND logico) && (AND logico) La condizione La condizione èè vera se e vera se e solo se entrambe le solo se entrambe le condizioni sono verecondizioni sono vere
|| (OR logico)|| (OR logico)La condizione La condizione èè vera se e vera se e solo se almeno una solo se almeno una èè veravera
! (NOT logico) ! (NOT logico) Inverte il valore della Inverte il valore della condizione condizione booleanabooleana
truetruetruetruetruetruefalsefalsefalsefalsetruetruefalsefalsetruetruefalsefalsefalsefalsefalsefalsefalsefalse
cond1 && cond2cond1 && cond2cond2cond2cond1cond1
truetruetruetruetruetruetruetruefalsefalsetruetruetruetruetruetruefalsefalsefalsefalsefalsefalsefalsefalse
cond1 || cond2cond1 || cond2cond2cond2cond1cond1
falsefalsetruetruetruetruefalsefalse!!condcondcondcond
C++: Strutture di Controllo 27
Gli Operatori Gli Operatori BooleaniBooleani o Logicio Logici
PiuPiu’’ operatori operatori booleanibooleani possono essere usati in possono essere usati in unun’’unica espressioneunica espressione
La valutazione viene fatta da sinistra a destra, La valutazione viene fatta da sinistra a destra, con le seguenti precedenze tra operatoricon le seguenti precedenze tra operatori11-- NOT, 2NOT, 2-- AND, 3AND, 3-- ORORLa condizione precedente La condizione precedente èè vera quando:vera quando:
LL’’ordine ordine puopuo’’ comunque essere alterato dalle comunque essere alterato dalle parentesi tondeparentesi tonde
La condizione ora La condizione ora èè vera quando:vera quando:
if (!(y<=10) || x>5 && z>30 && z<100) if (!(y<=10) || x>5 && z>30 && z<100)
if ((!(y<=10) || x>5) && z>30 && z<100) if ((!(y<=10) || x>5) && z>30 && z<100)
y>10 o se x>5, z>30 e z<100y>10 o se x>5, y>10 o se x>5, z>30 e z<100
y>10 o x>5 e z>30 e z<100y>10 o x>5 e z>30 e z<100y>10 o x>5 e z>30 e z<100 C++: Strutture di Controllo 28
Gli Operatori Gli Operatori BooleaniBooleani o Logicio Logici
La valutazione di un espressione con operatori La valutazione di un espressione con operatori booleanibooleani viene effettuata con una strategia detta viene effettuata con una strategia detta ““valutazione pigravalutazione pigra””
La valutazione termina appena il risultato La valutazione termina appena il risultato èè notonotoEsempiEsempi
1.1. cond1 && cond2cond1 && cond2Se cond1 Se cond1 èè false false cond1 && cond2 cond1 && cond2 èè falsefalse
Non serve valutare cond2Non serve valutare cond2Se cond1 Se cond1 èè truetrue devo valutare anche cond2devo valutare anche cond2
2.2. cond1 || cond2cond1 || cond2Se cond1 Se cond1 èè truetrue cond1 || cond2 cond1 || cond2 èè truetrue
Non serve valutare cond2Non serve valutare cond2Se cond1 Se cond1 èè false devo valutare anche cond2false devo valutare anche cond2
C++: Strutture di Controllo 29
Leggi di De Leggi di De MorganMorgan
Stabiliscono lStabiliscono l’’equivalenza tra condizioni equivalenza tra condizioni booleanebooleane
Permettono di semplificare espressioniPermettono di semplificare espressioniMigliorandone la leggibilitMigliorandone la leggibilitàà
EsempiEsempi
NOT (cond1 AND cond2) = NOT cond1 OR NOT cond2
NOT (cond1 OR cond2) = NOT cond1 AND NOT cond2
NOT (y>10 AND y≤30)NOT (y>10 AND yNOT (y>10 AND y≤≤30)30)
NOT y>10 OR NOT y ≤ 30NOT y>10 OR NOT y NOT y>10 OR NOT y ≤≤ 3030
y≤10 OR y>30yy≤≤10 OR y>3010 OR y>30
NOT (y>5 OR x≤0)NOT (y>5 OR xNOT (y>5 OR x≤≤0)0)
NOT y>5 AND NOT x≤0NOT y>5 AND NOT xNOT y>5 AND NOT x≤≤00
y≤5 AND x>0yy≤≤5 AND x>05 AND x>0C++: Strutture di Controllo 30
Verificare i Dati in inputVerificare i Dati in input
cincin (e (e coutcout) sono oggetti di tipo ) sono oggetti di tipo streamstreamlo stato dello lo stato dello streamstream può essere testato tramite il può essere testato tramite il metodo metodo failfail( )( )
failfail( ) restituisce ( ) restituisce false se lo false se lo streamstream cincin non non èè in uno stato di errorein uno stato di errore
non ci sono state operazioni che hanno dato errorenon ci sono state operazioni che hanno dato erroretruetrue se lo se lo streamstream cincin èè in stato di errorein stato di errore
ci sono state operazioni che hanno generato un erroreci sono state operazioni che hanno generato un erroreEsempio: lettere inserite in ingresso quando ci si aspetta un Esempio: lettere inserite in ingresso quando ci si aspetta un valore numericovalore numerico
if ( cin.fail( ) ) if ( cin.fail( ) )
C++: Strutture di Controllo 31
EsempioEsempio #include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main( ) {
double area;
cout << "Please enter the area of a square: ";
cin >> area;
if (cin.fail( )) {
cout << "Error: Bad input\n";
return 1;
}
if (area < 0) {
cout << "Error: Negative area.\n";
return 1;
}
cout << "The side length is " << sqrt(area) << "\n";
return 0;
}
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main( ) {
double area;
cout << "Please enter the area of a square: ";
cin >> area;
if (cin.fail( )) {
cout << "Error: Bad input\n";
return 1;
}
if (area < 0) {
cout << "Error: Negative area.\n";
return 1;
}
cout << "The side length is " << sqrt(area) << "\n";
return 0;
} C++: Strutture di Controllo 32
EsempioEsempio
Versione piVersione piùù““pulitapulita””
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main( ) {
double area;
int condizione=0;
cout << "Please enter the area of a square: ";
cin >> area;
if (cin.fail( )) {
cout << "Error: Bad input\n";
condizione=1;
}
else if (area < 0) {
cout << "Error: Negative area.\n";
condizione=1;
}
else
cout << "The side length is " << sqrt(area) << "\n";
return condizione;
}
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main( ) {
double area;
int condizione=0;
cout << "Please enter the area of a square: ";
cin >> area;
if (cin.fail( )) {
cout << "Error: Bad input\n";
condizione=1;
}
else if (area < 0) {
cout << "Error: Negative area.\n";
condizione=1;
}
else
cout << "The side length is " << sqrt(area) << "\n";
return condizione;
}
C++: Strutture di Controllo 33
Verificare i Dati in inputVerificare i Dati in input
Il C++ permette di fare Il C++ permette di fare cosecose……stranestraneereditereditàà del Cdel C
sono espressioni che hanno un valore non nullo se lo sono espressioni che hanno un valore non nullo se lo streamstream cincin non non èè in uno stato di errorein uno stato di errorealtrimenti hanno valore nulloaltrimenti hanno valore nullo
cin;
cin >> i;
cin;
cin >> i;
C++: Strutture di Controllo 34
Verificare i Dati in inputVerificare i Dati in input
…
cin >> area;
if (cin.fail( )) {
cout << "Error: Bad input\n";
return 1;
}
if (area < 0) {
cout << "Error: Negative area.\n";
return 1;
}
cout << "The side length is " << sqrt(area) << "\n";
…
…
cin >> area;
if (cin.fail( )) {
cout << "Error: Bad input\n";
return 1;
}
if (area < 0) {
cout << "Error: Negative area.\n";
return 1;
}
cout << "The side length is " << sqrt(area) << "\n";
…
…
if (cin >> area ) {
if (area < 0) {
cout << "Error: Negative area.\n";
return 1;
}
cout << "The side length is " << sqrt(area) << "\n";
}
else {
cout << "Error: Bad input\n";
return 1;
}
…
…
if (cin >> area ) {
if (area < 0) {
cout << "Error: Negative area.\n";
return 1;
}
cout << "The side length is " << sqrt(area) << "\n";
}
else {
cout << "Error: Bad input\n";
return 1;
}
…
C++: Strutture di Controllo 35
IstruzioneIstruzione didi IterazioneIterazione
SintassiSintassi
StrutturaStruttura didi controllocontrollo per per eseguireeseguire piupiu’’ voltevolte la la stessastessa istruzioneistruzione, , bloccoblocco, , sceltascelta, , ……
istr. di iterazione = istr. while | istr. for | istr. do-whileistr. di iterazione = istr. while | istr. for | istr. do-while
C++: Strutture di Controllo 36
IstruzioneIstruzione whilewhile
SintassiSintassi
LL’’istruzioneistruzione vienevieneeseguitaeseguita finchefinche’’ la la condizionecondizione rimanerimaneveraveraPuoPuo’’ essereessere eseguitaeseguita 0 0 o o piupiu’’ voltevolte
cfrcfr. con do. con do--while while Infinite Infinite voltevolte se la se la condizionecondizione èè sempresempreveravera!!!!
istr. while =
while (condizione)
istruzione
istr. while =
while (condizione)
istruzione
istruzione
condizionevero falso
C++: Strutture di Controllo 37
Esempio: Iterazione Controllata da Contatore Esempio: Iterazione Controllata da Contatore
Una classe di 10 studenti ha sostenuto un test. Una classe di 10 studenti ha sostenuto un test. Inserire i voti (compresi da 0 a 100) e calcolare la Inserire i voti (compresi da 0 a 100) e calcolare la media. media.
?
Inizializzazione
Processamento
Termine
C++: Strutture di Controllo 38
EsempioEsempio
Dal Dal PseudocodicePseudocodice al codiceal codice
Inizializzazione
Dichiara Variabili totale, contatore, voto e media
totale=0
contatore=0Dichiarare variabili
e inizializzarle
Processamento
Inserire i 10 valori
while contatore<10 richiedi votosomma voto a totaleincrementa contatore
Media=totale/10
Calcolare la media
Termine
Stampa la mediaStampa la media
C++: Strutture di Controllo 39
EsempioEsempio
Dal Dal PseudocodicePseudocodice al codiceal codice
while contatore<10 richiedi votosomma voto a totaleincrementa contatore
richiedi voto
contatore<10vero falso
incrementacontatore
somma voto a totale
C++: Strutture di Controllo 40
EsempioEsempio
#include <iostream>
using namespace std;
int main()
{
int totale=0, contatore=0, voto;
double media;
while(contatore<10) {
cout << “Inserire il voto dell’esame \n”;
cin >> voto;
totale=totale+voto;
contatore=contatore+1;
}
media=totale/10.0;
cout << “La media è “ << media;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int totale=0, contatore=0, voto;
double media;
while(contatore<10) {
cout << “Inserire il voto dell’esame \n”;
cin >> voto;
totale=totale+voto;
contatore=contatore+1;
}
media=totale/10.0;
cout << “La media è “ << media;
return 0;
}
Dichiara Variabili totale, contatore, voto e media
totale=0
contatore=0
Media=totale/10
Stampa la media
richiedi voto
contatore<10vero falso
Incrementa contatore
Somma voto a totale
C++: Strutture di Controllo 41
Iterazione Controllata da un ContatoreIterazione Controllata da un Contatore
1.1. Una variabile di controlloUna variabile di controllo1.1. Controllore di cicloControllore di ciclo
2.2. Valore iniziale della Valore iniziale della variabilevariabile
3.3. La condizione di La condizione di continuazione di ciclocontinuazione di ciclo
Verifica se si Verifica se si èè raggiunto raggiunto il valore finaleil valore finale
4.4. LL’’incremento (o il incremento (o il decremento) che modifica decremento) che modifica il contatoreil contatore
#include <iostream>
using namespace std;
int main()
{
int totale=0, contatore=0, voto;
double media;
while(contatore<10) {
cout << “Inserire il voto dell’esame \n”;
cin >> voto;
totale=totale+voto;
contatore=contatore+1;
}
media=totale/10.0;
cout << “La media è “ << media;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int totale=0, contatore=0, voto;
double media;
while(contatore<10) {
cout << “Inserire il voto dell’esame \n”;
cin >> voto;
totale=totale+voto;
contatore=contatore+1;
}
media=totale/10.0;
cout << “La media è “ << media;
return 0;
}
C++: Strutture di Controllo 42
Esempio: Esempio: IterazoneIterazone Controllata da un Valore Controllata da un Valore SentinellaSentinella
Una classe ha sostenuto un test. Inserire i voti Una classe ha sostenuto un test. Inserire i voti (compresi da 0 a 100) e calcolare la media. (compresi da 0 a 100) e calcolare la media. Problema: numero di studenti non notoProblema: numero di studenti non noto
Valore SentinellaValore SentinellaIndica la fine dei datiIndica la fine dei datiIterazione finisce quando in ingresso viene inserito il Iterazione finisce quando in ingresso viene inserito il valore sentinellavalore sentinellaSentinella deve essere scelta in modo da non essere Sentinella deve essere scelta in modo da non essere confusaconfusa
--1 in questo caso 1 in questo caso
C++: Strutture di Controllo 43
EsempioEsempio
Dal Dal PseudocodicePseudocodice al codiceal codiceDal Dal PseudocodicePseudocodice al codiceal codice
Inizializzazione
Dichiara Variabili totale, contatore, voto e media
totale=0
contatore=0Dichiarare variabili
e inizializzarle
Processamento
Inserire i valori
inserire voto while voto≠sentinella
somma voto a totaleincrementa contatoreinserire prossimo voto
se contatore>0media=totale/contatorestampa media
elsestampa messaggio
se sono stati inseriti dei voticalcola la mediastampa media
altrimentistampa messaggio
Termine
C++: Strutture di Controllo 44
EsempioEsempio#include <iostream>
using namespace std;
int main()
{
int totale=0, contatore=0, voto;
double media;
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
while(voto !=-1) {
totale=totale+voto;
contatore=contatore+1;
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
}
if (contatore>0) {
media=(double) totale/contatore;
cout << “La media è “ << media << “\n”;
}
else
cout << “Non è stato inserito alcun valore \n”;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int totale=0, contatore=0, voto;
double media;
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
while(voto !=-1) {
totale=totale+voto;
contatore=contatore+1;
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
}
if (contatore>0) {
media=(double) totale/contatore;
cout << “La media è “ << media << “\n”;
}
else
cout << “Non è stato inserito alcun valore \n”;
return 0;
}
Dichiara Variabili totale, contatore, voto e media
totale=0
contatore=0
inserire voto while voto≠sentinella
somma voto a totaleincrementa contatoreinserire prossimo voto
se contatore>0media=totale/contatorestampa media
elsestampa messaggio
Condizione di Continuazione con Valore SentinellaCondizione di Continuazione con Valore Sentinella
C++: Strutture di Controllo 45
Esempio: AlternativeEsempio: Alternative
Variabile Variabile booleanabooleana per il test per il test di fine iterazione di fine iterazione ee……
…
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
while(voto !=-1) {
totale=totale+voto;
contatore=contatore+1;
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
}
…
…
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
while(voto !=-1) {
totale=totale+voto;
contatore=contatore+1;
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
}
…
…
bool finito;
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
finito=voto==-1;
while(!finito) {
totale=totale+voto;
contatore=contatore+1;
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
finito=voto==-1;
}
…
…
bool finito;
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
finito=voto==-1;
while(!finito) {
totale=totale+voto;
contatore=contatore+1;
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
finito=voto==-1;
}
…
C++: Strutture di Controllo 46
Esempio: AlternativeEsempio: Alternative
Eliminare lEliminare l’’input prima del input prima del whilewhile
…
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
while(voto !=-1) {
totale=totale+voto;
contatore=contatore+1;
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
}
…
…
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
while(voto !=-1) {
totale=totale+voto;
contatore=contatore+1;
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
}
…
…
bool finito=false;
while(!finito) {
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
finito=voto==-1;
if( !finito) {
totale=totale+voto;
contatore=contatore+1;
}
}
…
…
bool finito=false;
while(!finito) {
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
finito=voto==-1;
if( !finito) {
totale=totale+voto;
contatore=contatore+1;
}
}
…
C++: Strutture di Controllo 47
Operatori di AssegnazioneOperatori di Assegnazione
Istruzioni del tipoIstruzioni del tipo
Possono essere riscritte comePossono essere riscritte come
In generale In generale
puopuo’’ essere riscritto comeessere riscritto come
<op> = +,<op> = +,--,*,/,%,*,/,%EsempiEsempi
nomeVariabile = nomeVariabile op espressione;nomeVariabile = nomeVariabile op espressione;
total=total+ quarters * 0.25;total=total+ quarters * 0.25;
total+=quarters * 0.25;total+=quarters * 0.25;
nomeVariabile op = espressione;nomeVariabile op = espressione;
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 48
Operatori di Incremento e DecrementoOperatori di Incremento e Decremento
Operatore di Incremento (++)Operatore di Incremento (++)Incrementa una variabile di 1Incrementa una variabile di 1
Operatore di Decremento (Operatore di Decremento (----))Decrementa una variabile di 1Decrementa una variabile di 1
x++;x++; x+=1;x+=1; x=x+1;x=x+1;
x--;x--; x-=1;x-=1; x=x-1;x=x-1;
C++: Strutture di Controllo 49
Operatori di Incremento e DecrementoOperatori di Incremento e Decremento
PostincrementoPostincremento
Il valore della variabile viene incrementato dopo della Il valore della variabile viene incrementato dopo della valutazione dellvalutazione dell’’espressione in cui appare la variabileespressione in cui appare la variabile
Operatore ++ segue la variabileOperatore ++ segue la variabile
PreincrementoPreincremento
Il valore della variabile viene incrementato prima della Il valore della variabile viene incrementato prima della valutazione dellvalutazione dell’’espressione in cui appare la variabileespressione in cui appare la variabile
Operatore ++ precede la variabileOperatore ++ precede la variabile
variabile++variabile++
y=x++;y=x++; y=x;
x=x+1;
y=x;
x=x+1;
++variabile++variabile
y=++x;y=++x; x=x+1;
y=x;
x=x+1;
y=x; C++: Strutture di Controllo 50
EsempioEsempio
Assegnamento Compatto e Operatore di Assegnamento Compatto e Operatore di Incremento Incremento
…
bool finito=false;
while(!finito) {
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
finito=voto==-1;
if( !finito) {
totale=totale+voto;
contatore=contatore+1;
}
}
…
…
bool finito=false;
while(!finito) {
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
finito=voto==-1;
if( !finito) {
totale=totale+voto;
contatore=contatore+1;
}
}
…
…
bool finito=false;
while(!finito) {
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
finito=voto==-1;
if( !finito) {
totale+=voto;
contatore++;
}
}
…
…
bool finito=false;
while(!finito) {
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
finito=voto==-1;
if( !finito) {
totale+=voto;
contatore++;
}
}
…
C++: Strutture di Controllo 51
Esempio: Calcolo del MassimoEsempio: Calcolo del Massimo
Esercizio: Scrivere lo Esercizio: Scrivere lo stesso programma usando stesso programma usando cin.failcin.fail( )( )
while (cin >> next) {
if (next > highest)
highest = next;
}
cout << "The highest temperature is " << highest << "\n";
return 0;
}
while (cin >> next) {
if (next > highest)
highest = next;
}
cout << "The highest temperature is " << highest << "\n";
return 0;
}
#include <iostream>
using namespace std;
int main( ) {
double next;
double highest;
cout << "Please enter the temperature values:\n";
if (cin >> next)
highest = next;
else {
cout << "No data!\n";
return 1;
}
segue
#include <iostream>
using namespace std;
int main( ) {
double next;
double highest;
cout << "Please enter the temperature values:\n";
if (cin >> next)
highest = next;
else {
cout << "No data!\n";
return 1;
}
segue C++: Strutture di Controllo 52
IstruzioneIstruzione dodo--whilewhile
SintassiSintassi
La La condizionecondizione èècontrollatacontrollata a fine a fine ciclociclo
Il Il ciclociclo vieneviene eseguitoeseguito1 o 1 o piupiu’’ voltevolteNelNel while la while la condizionecondizioneèè controllatacontrollata a a inizioiniziociclociclo
istr. do while = do {
istruzione} while (condizione);
istr. do while = do {
istruzione} while (condizione);
istruzione
condizionevero
falso
C++: Strutture di Controllo 53
EsempioEsempio
LL’’esempio precedente si presta bene allesempio precedente si presta bene all’’utilizzo utilizzo del del dodo--whilewhile
…
bool finito=false;
while(!finito) {
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
finito=voto==-1;
if( !finito) {
totale+=voto;
contatore++;
}
}
…
…
bool finito=false;
while(!finito) {
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
finito=voto==-1;
if( !finito) {
totale+=voto;
contatore++;
}
}
…
…
bool finito=false;
do {
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
finito=voto==-1;
if( !finito) {
totale+=voto;
contatore++;
}
} while(!finito);
…
…
bool finito=false;
do {
cout << “Inserire il voto dell’esame o -1\n”;
cin >> voto;
finito=voto==-1;
if( !finito) {
totale+=voto;
contatore++;
}
} while(!finito);
…
C++: Strutture di Controllo 54
Iterazione Controllata da un ContatoreIterazione Controllata da un Contatore
#include <iostream>
using namespace std;
int main()
{
int contatore;
contatore=0;
while(contatore<10) {
cout << contatore << “\n”;
contatore=contatore+1;
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int contatore;
contatore=0;
while(contatore<10) {
cout << contatore << “\n”;
contatore=contatore+1;
}
return 0;
}
Inizializzazione
Condizione
Modifica Contatore
istruzione
condizionevero falso
inizializzazione
modifica
Istruzione Ciclo
C++: Strutture di Controllo 55
Istruzione Istruzione forfor
SintassiSintassi
istr. for =
for( iniz. ; condizione ; modifica)
istruzione;
istr. for =
for( iniz. ; condizione ; modifica)
istruzione;
#include <iostream>
using namespace std;
int main()
{
for (int contatore=0; contatore<10; contatore++)
cout << contatore << “\n”;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
for (int contatore=0; contatore<10; contatore++)
cout << contatore << “\n”;
return 0;
}
istruzione
condizionevero falso
inizializzazione
modifica
C++: Strutture di Controllo 56
Esempio: Calcolo del FattorialeEsempio: Calcolo del Fattoriale
Fattoriale: n!=1Fattoriale: n!=1··22··33…·…·nn0!=10!=1
#include <iostream>
using namespace std;
int main()
{
int n, fattoriale=1;
cout << “Inserire Numero: “;
cin >> n;
for (int i=2; i<=n; i++)
fattoriale*=i;
cout << n << “!= “ << fattoriale;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int n, fattoriale=1;
cout << “Inserire Numero: “;
cin >> n;
for (int i=2; i<=n; i++)
fattoriale*=i;
cout << n << “!= “ << fattoriale;
return 0;
}
C++: Strutture di Controllo 57
Istruzione Istruzione forfor
LL’’incremento (o il decremento) possono non essere incremento (o il decremento) possono non essere unitari unitari
#include <iostream>
using namespace std;
int main()
{
int i;
for (i=0; i<10; i=i+2)
cout << i << “\n”;
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int i;
for (i=0; i<10; i=i+2)
cout << i << “\n”;
return 0;
}
0
2
4
6
8
C++: Strutture di Controllo 58
Esempio: cicli Esempio: cicli forfor annidatiannidati
Stampare la tavola pitagoricaStampare la tavola pitagorica
#include <iostream>
using namespace std;
int main()
{
int i, j;
for (i=1; i<=10; i++) {
for(j=1; j<=10; j++)
cout << i*j << “ “;
cout << “\n”;
}
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int i, j;
for (i=1; i<=10; i++) {
for(j=1; j<=10; j++)
cout << i*j << “ “;
cout << “\n”;
}
return 0;
}
C++: Strutture di Controllo 59
Formattazione OutputFormattazione Output
Per poter formattare/incolonnare lPer poter formattare/incolonnare l’’output si usano output si usano dei dei manipolatorimanipolatori di di streamstream::setprecisionsetprecision(n)(n): n numero di cifre significative: n numero di cifre significative
setwsetw(n)(n): imposta pari ad n la larghezza (minima) in : imposta pari ad n la larghezza (minima) in caratteri della successiva espressione in outputcaratteri della successiva espressione in output
…
double a=1.1345;
cout << setprecision(3) << a;
…
…
double a=1.1345;
cout << setprecision(3) << a;
…
1.131.13
…
int x=2, y=12;
cout << setw(4) << a << setw(4) << b;
…
…
int x=2, y=12;
cout << setw(4) << a << setw(4) << b;
…
2 21
C++: Strutture di Controllo 60
Formattazione OutputFormattazione Output
fixedfixed: i numeri : i numeri floatingfloating pointpoint sono mostrati sono mostrati secondo la rappresentazione in virgola fissasecondo la rappresentazione in virgola fissacoutcout << << fixedfixed << << setprecisionsetprecision(n) << x(n) << x
x x èè rappresentato in virgola fissa con n cifre significative rappresentato in virgola fissa con n cifre significative dopo lo 0dopo lo 0
ll’’uso dei manipolatori richiede luso dei manipolatori richiede l’’inclusione del file inclusione del file headerheader iomanip.hiomanip.h
…
double a=1.1345;
cout << fixed << setprecision(3) << a;
…
…
double a=1.1345;
cout << fixed << setprecision(3) << a;
…
1.1351.135
#include<iomanip>#include<iomanip>
C++: Strutture di Controllo 61
Scelta fra Comandi IterativiScelta fra Comandi Iterativi
whilewhile, , dodo--whilewhile o o forfor: Quale usare?: Quale usare?Indicazioni di massimaIndicazioni di massima
Iterazione Iterazione contrallatacontrallata da un contatore da un contatore forforIterazione controllata da un eventoIterazione controllata da un evento--condizione condizione
Deve essere eseguito Deve essere eseguito almentoalmento una volta una volta dodo--whilewhileAltrimenti Altrimenti whilewhile