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
Scarica

Fondamenti di Informatica