Upload
tranngoc
View
214
Download
0
Embed Size (px)
Citation preview
Corso di Laboratorio di Informatica
Ingegneria Clinica – BCLR
Unità 3
Istruzioni Condizionali
Domenico Daniele Bloisi
Docente
Ing. Domenico Daniele Bloisi, PhD
Ricercatore
Dipartimento di Ingegneria Informatica, Automatica
e Gestionale “Antonio Ruberti”
Via Ariosto 25
(adiacente Piazza Dante,
Manzoni
Tram 3 fermata via Labicana)
email: [email protected]
home page:
Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Pagina 2
http://www.dis.uniroma1.it/~bloisi
Ricevimento
In aula, subito dopo le lezioni
Su appuntamento (tramite invio di una email)
presso:
Dipartimento di Ingegneria Informatica,
Automatica e Gestionale “Antonio Ruberti”,
via Ariosto 25 - II piano, stanza A209
Si invitano gli studenti a controllare regolarmente la
bacheca degli avvisi
http://www.dis.uniroma1.it/~bloisi/didattica/labinf1415.html#Avvisi
Pagina 3Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Orari
Lunedì 12.00 – 13.30
Aula 4, via del Castro Laurenziano 7A
Martedì 14.00 – 17.15
Aula 15, Laboratorio Didattico via Tiburtina 205
Mercoledì 12.00 – 13.30
Aula 4, via via del Castro Laurenziano 7A
Pagina 4Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Sommario – Unità 3
• Operatori di uguaglianza e relazionali
• Calcolo booleano• Istruzione if-else e istruzione if
• Condizioni ed espressioni booleane
• Blocco di istruzioni• if annidati
• Espressione condizionale• Istruzione switch
Pagina 5Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Operatori di uguaglianza e relazionali
Un’espressione relazionale ha valore intero:
0 se falsa
1 se vera
In C,
falso (false) equivale a zero
vero (true) equivale a qualsiasi valore diverso da
zero
GENERALMENTE:
0 false
1 true
Pagina 7Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Esercizio Operatori
Cosa stampano le varie istruzioni printf?#include <stdio.h>
int main (void) {
int j = 0, m = 1, n = -1, tot;
float x = 2.5, y = 0.0, ris;
ris = x + (y >= n);
printf("\nRisultato:\t%f\n", ris);
tot = ((j + 1) == m) != (y * 2);
printf("\nTotale:\t%d\n", tot);
printf("Totale in float:\t%f\n", tot);
ris = ((j + 1) == m) != (y * 2);
printf("\nRisultato intero:\t%d\n", ris);
printf("Risultato float:\t%f\n", ris);
tot = ((-x) + j) == ((y > n) >= m);
printf("\nTotale:\t%d\n", tot);
printf("Totale in float:\t%f\n", tot);
return 0;
}
Pagina 10Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Algebra di Boole
• Sviluppata nel 1854 da George Boole
• Calcolo booleano: dominio ed operatori
Pagina 11
http://it.wikipedia.org/wiki/Algebra_di_Boole
Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Esempi
- true and false vale false (falso)
- true or false vale true (vero)
- not true vale false (falso)
- false or (true and (not false))
è equivalente a:
false or (true and true)
che è equivalente a:
false or true
che vale:
true
Pagina 12Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Operatori logici
Il C mette a disposizione 3 operatori logici per
ottenere espressioni in algebra booleana
• && (AND logico)
• || (OR logico)
• ! (NOT logico o negazione logica)
Pagina 14Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Operatori logici: esempi
int a, b, c, d, e;
a = 1;
b = 0;
c = a && b; // c = a and b
d = a || b; // d = a or b
e = !a; // e = not a
Nota: in a && b il valore di b è calcolato solo
se a è vero, in a || b il valore di b è
calcolato solo se a è falso.
Pagina 15Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Operatori logici: valore dell’espressione
int a, b, c, d, e;
a = 1; b = 0;
c = a && b; // c = a and b
printf("%d\n", c); // stampa 0
d = a || b; // d = a or b
printf("%d\n", d); // stampa 1
e = !a; // e = not a
printf("%d\n", e); // stampa 0
Come con gli operatori di uguaglianza e relazionali, le
espressioni che coinvolgono gli operatori logici restituiscono
un valore intero 0 o 1, a seconda dell’esito della valutazione.
Pagina 16Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Operatori logici: precedenza
Espressioni complesse si possono costruire con gli operatori !, && e || usando le seguenti regole di precedenza:
1. !
2. &&
3. ||
Ad esempio, la seguente è un’espressione valida con
operatori logici:a && ! b || c;
ed è equivalente a:(a && (! b)) || c;
Pagina 17Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Esempio operatori logici
Pagina 19Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Istruzioni di controllo del flusso
Abbiamo visto istruzioni per:
• Invocare funzioni
• Assegnare valori a variabili
Sappiamo scrivere programmi:
• Formati da sequenze di istruzioni semplici;
• Contenenti invocazioni di diverse funzioni.
Siamo ora interessati a compiere azioni (cioè,
eseguire istruzioni) diverse in relazione alla verifica di
una condizione.
Pagina 20Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Istruzioni condizionali
Il C mette a disposizione del programmatore due
forme di istruzione condizionale:
• l'istruzione if-else
• l'istruzione switch
Tali istruzioni sono dette condizionali e sono
una forma di istruzione composta.
Pagina 21Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
L'istruzione if-else (1/3)
L'istruzione if-else consente di effettuare una
selezione a 2 vie.
Sintassi
if ( condizione )
istruzione-then
else
istruzione-else
Pagina 22Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
VERO
FALSO
L'istruzione if-else (2/3)
then else
if
Pagina 23Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
L'istruzione if-else (3/3)
Semantica
Viene valutata prima la condizione.
• Se la valutazione risulta vera (valore di ritorno
diverso da 0), viene eseguita istruzione-then
• Se risulta falsa (valore di ritorno 0), viene
eseguita istruzione-else.
In entrambi i casi, l'esecuzione prosegue con l'istruzione che segue l'istruzione if-else.
Pagina 24Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Esempio
int a, b;
...
if (a > b)
printf("%d maggiore di %d\n", a, b);
else
printf("%d maggiore di (o uguale a) "
"%d\n", b, a);
Nota per printf: è possibile andare a capo
spezzando il parametro format
Pagina 25Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Controllo del flusso: if-else
if ( condizione )
istruzione-1
else
istruzione-2
istruzione-3
condizione
≠ 0
vero
0
falso
istruzione-2istruzione-1
istruzione-3
Pagina 26Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Esempio
int a, b;
...
if (a > b)
printf("%d maggiore di %d\n", a, b);
else
printf("%d maggiore di (o uguale a) "
"%d\n", b, a);
printf("questa riga verra\' stampata\n");
Pagina 27Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
La variante if
La parte else di un'istruzione if-else è
opzionale.
Esempio:
int a;
...
if (a == -1)
printf("ERRORE", a);
Pagina 28Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Controllo del flusso - if
if ( condizione )
istruzione-1
istruzione-3condizione
≠ 0
vero
0
falso
istruzione-1
istruzione-3
Pagina 29Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Esempio
int a, b;
...
if (a > b)
printf("%d maggiore di %d\n", a, b);
printf("questa riga verra\' stampata\n");
Pagina 30Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Condizione in un'istruzione if-else
La condizione in un'istruzione if-else può essere una
qualsiasi espressione (tranne una struttura), ad esempio:
• Una variabile
• Un operatore di confronto (==, !=, >, <, >=,<=) applicato a
variabili (o espressioni) di un tipo primitivo;
• Un'espressione complessa, ottenuta applicando gli
operatori booleani !, && e || a espressioni più semplici;
• La chiamata a una funzione.
Pagina 31Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Esempi
int a, b;
...
if (a)
...
if (a > b)
...
if (quadrato(a))
...
if ( (quadrato(a) && (a>b) ) || !b )
chiamata di funzione
operatore di confronto
variabile
espressione complessa
Pagina 32Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Esercizio
Esercizio 3.1
Si scriva un programma C in grado di prendere in
ingresso da tastiera un intero e di stampare la
parola “pari” nel caso in cui si tratti di un numero
pari, la parola “dispari” altrimenti.
Pagina 33
Esempio:Si inserisca un intero:
2
pari
Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Esercizio: soluzione
#include <stdio.h>
int main() {
int x;
printf("Si inserisca un intero:\n");
scanf("%d", &x);
if((x % 2) == 0)
printf("pari\n");
else
printf("dispari\n");
return 0;
}
Pagina 34Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Errori nelle condizioni
int a;
double b;
if (a=0)
...
if (b==0)
...
L’errore riguarda l’uso dell’operatore di assegnazione
invece dell’operatore di confronto. In questo caso, il
compilatore non segnala alcuna anomalia, dato che il
risultato dell’espressione (a=0) viene convertito nel
valore booleano corrispondente (falso), e sarà
sempre eseguito il ramo else del condizionale.
b è di tipo double, mentre 0 è un letterale di tipo int. Occorre, allora,
accertarsi che errori di approssimazione non portino ad avere sistematicamente una condizione con valore falso (b potrebbe valere
"quasi" zero, cioè 2.220446E-16 l’epsilon di macchina).
http://en.wikipedia.org/wiki/Machine_epsilon
Pagina 35Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Esercizio
Compilare ed eseguire il seguente programma#include <stdio.h>
int main() {
int a = 0;
if(a = 0)
printf("primo ramo then\n");
else
printf("primo ramo else\n");
if(a == 0)
printf("secondo ramo then\n");
else
printf("secondo ramo else\n");
return 0;
}
Pagina 36Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Blocco di istruzioni
Un blocco di istruzioni raggruppa più istruzioni in
un'unica istruzione composta.
Sintassi
{
istruzione
...
istruzione
}
dove istruzione è una qualsiasi istruzione C
Pagina 37Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Blocco di istruzioni: semantica
Le istruzioni del blocco vengono eseguite in
sequenza.
Esempio:int a, b, maggiore;
...
{
maggiore = a;
printf("minore = %d\n", b);
}
Pagina 38Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Campo di azione delle variabili
definite nei blocchi di istruzioni
Un blocco di istruzioni può contenere al suo interno
dichiarazioni di variabili.
Una variabile dichiarata dentro un blocco ha come
campo di azione (scope) il blocco stesso, inclusi
eventuali blocchi interni.
Questo significa che la variabile è visibile nel blocco
e in tutti i suoi blocchi interni, ma non è visibile
all'esterno del blocco.
Pagina 39Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
#include <stdio.h>
#include <math.h>
int main () {
double a = 2e3;
int i = 1;
printf("livello 0 a = %f i = %d\n", a, i);
{
printf("livello 1 a = %f i = %d\n", a, i);
// OK. a e’ visibile - stampa il valore di a
double i = 0.1;
// i e’ visibile e viene ridichiarata
{
double r = 5.5; // OK
i = i + 1; // OK. i e’ visibile (double)
printf("livello 2.1 r = %f i = %f\n", r, i);
// OK. r e’ visibile - stampa 5.5
}
//printf("r = %f\n", r); // ERRORE. r non e’ visibile
printf("livello 1 i = %f\n", i);
// OK. i e’ visibile (double) - stampa 1.1
{
int r = 4; // OK. r precendente non e’ piu’ visibile
printf("livello 2.2 r = %d a = %f\n", r, a);
// OK. a e’ ancora visibile - stampa il valore di a
}
}
i = i + 1; // OK. i e’ visibile
printf("livello 0 a = %f i = %d\n", a, i); // OK. i e’ visibile - stampa 2
return 0;
}
Le variabili in
questo codice
hanno diversi
scope
Uso del blocco di istruzioninell'if-else
Il ramo-then e il ramo-else di un'istruzione if-else
possono essere una qualsiasi istruzione C, in
particolare un blocco di istruzioni.
if (a > b) {
printf("maggiore = %d\n", a);
printf("minore = %d\n", b);
}
Pagina 41Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Uso del blocco di istruzioninell'if-else: esempio
Dati mese ed anno, calcolare mese ed anno del
mese successivo.
int mese, anno, mesesucc, annosucc;
...
if (mese == 12) {
mesesucc = 1;
annosucc = anno + 1;
}
else {
mesesucc = mese + 1;
annosucc = anno;
}
Pagina 42Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3
Chiarimento
if(esressione)
istruzione
if(esressione)
istruzione1
else
istruzione2
Condizione:
racchiusa tra
parentesi
tonde
Corpo: indentato e
racchiuso tra parentesi
graffe se contiene più di
una istruzione
if(a != 0)
a++;
else
a--;
if(a != 0)
a++;
b = 3;
else
a--;
NO
if(a != 0){
a++;
b = 3;
} else
a--;
error: 'else' without a
previous 'if'
Pagina 43
SI SI
Laboratorio di Informatica
2014/2015
Istruzioni condizionali
Unità 3