Sei sulla pagina 1di 39

Corso di Fondamenti di Informatica

Ingegneria delle Comunicazioni – BCOR


Ingegneria Elettronica – BELR

Introduzione al C

Unità 3 – Istruzioni condizionali

D. Bloisi, S. Peluso, A. Pennisi, S. Salza


Sommario – Unità 3
• Strutture condizionali
• Istruzione if-else
• Operatori di confronto e condizioni elementari
• Espressioni booleane
• Blocchi e variabili locali
• If annidati
• Espressioni condizionali
• Istruzione switch

Istruzioni condizionali 2013/2014 Pagina 2


Unità 3
Strutture condizionali

• Finora abbiamo visto solo programmi molto elementari nei


quali le istruzioni erano eseguite in sequenza, una dopo l’altra
• È interessante disporre di strutture condizionali, che
permettono di eseguire o meno parti di un programma a
seconda che una certa condizione si verifichi o meno
ESEMPIO
Se piove allora prendo l’impermeabile
altrimenti prendo il cappotto

− piove è una condizione, che può ad un certo istante essere


vera o falsa
− se piove è vera, allora compio la prima azione altrimenti la
seconda azione
Strutture condizionali 2013/2014 Pagina 3
Unità 3
Istruzione if-else
L’istruzione di if-then-else permette di eseguire condizionalmente
una parte di programma in base alla verità di una condizione
SINTASSI
if (condizione) istruzione-1
else istruzione-2
− la parte else è opzionale, cioè può mancare
− istruzione-1 e istruzione-2 sono due qualsiasi istruzioni
SEMANTICA
− Viene valutata la condizione
− Se la condizione è vera si esegue istruzione-1
− Se la condizione è falsa si esegue istruzione-2 (se presente)

Strutture condizionali 2013/2014 Pagina 4


Unità 3
if-else: esempio
int a, b, max;
if (a > b) max=a;
else max=b;
printf("Il massimo tra a e b e’%d" max);

Oppure:
int a, b, max;
max=b
if (a > b) max=a;
printf("Il massimo tra a e b e’%d" max);

N.B. I due segmenti di codice sono equivalenti, nel secondo caso


la clausola else non è presente
Strutture condizionali 2013/2014 Pagina 5
Unità 3
Condizioni elementari
• La più semplice forma di condizione è quella che consiste nel
confronto tra il valore di una variabile (o di una espressione) e
quello di una costante o di un’altra variabile (o espressione)
(come a > b nell’esempio precedente)
• Gli operatori relazionali, cioè di confronto, in C sono:

== uguale a Es: a == (b+1)


!= diverso da Es: c != b
> maggiore di Es: d > 6
< minore di Es: a >= b
>= maggiore o uguale di Es: (f+c) >= 3
<= minore o uguale di Es: 8 <= alfa

Strutture condizionali 2013/2014 Pagina 6


Unità 3
Valore delle condizioni elementari
• In C una condizione elementare ha valore intero:
− La condizione vale 0 se falsa (false)
− La condizione vale 1 se vera (true)
• In C, comunque, qualsiasi valore diverso da 0 è considerato
come vero
• Anche un’espressione intera può essere considerata come una
condizione: vera o falsa a seconda che l’espressione valga 0 o no
ESEMPI
int a=1, b=4; float c=3.5;
a < b la condizione vale 1 cioè true
c >= b la condizione vale 0 cioè false
c+1 questa espressione vale 4.5 cioè true
Strutture condizionali 2013/2014 Pagina 7
Unità 3
Espressioni
• Dato che una condizione ha un valore intero (0 o 1), è possibile
in C combinare più condizioni elementari e espressioni, con
eventuali parentesi, a formare una espressione
• Valgono le normali precedenze tra operatori. In più la
valutazione delle condizioni di confronto ha la precedenza sulle
operazioni aritmetiche e le disuguaglianze hanno la precedenza
sulle uguaglianze
ESEMPIO
int n=-1; float x=2.5, y=0.0;
x = x + (y >= n) l’espressione vale 3.5 cioè true

Benché espressioni di questo tipo siano formalmente corrette,


il loro significato è poco intuitivo e quindi se ne sconsiglia l’uso

Strutture condizionali 2013/2014 Pagina 8


Unità 3
Espressioni boolene

• Condizioni elementari possono essere combinate tra loro


tramite gli operatori logici per formare condizioni più
complesse, dette espressioni booleane
• Le espressioni booleane sono costruite sul dominio {vero,
falso} mediante i tre operatori and, or, not
• Per le definizioni e la discussione riguardante l’algebra di Boole
si rimanda direttamente al modulo di Architetture
• Ci si limita a richiamare i tre operatori:
AND C1 AND C2 è vera se e solo se sono vere sia C1 che C2
OR C1 OR C2 è vera se e solo se almeno una tra C1 e C2
NOT NOT C1 è vera se e solo se C1 è falsa

Strutture condizionali 2013/2014 Pagina 9


Unità 3
Operatori logici in C

• Il C utilizza per gli operatori logici la seguente notazione:


− && AND logico
− || OR logico
− ! NOT logico
• Come per le condizioni elementari, le espressioni booleane
restituiscono valore 1 per vero e 0 per falso
• Il NOT ha precedenza sull’AND e l’AND ha precedenza sull’OR
• Il calcolo delle condizioni elementari ha precedenza sugli operatori
booleani
ESEMPIO
a && ! b || c; è equivalente a (a && (! b)) || c;

Strutture condizionali 2013/2014 Pagina 10


Unità 3
Espressioni booleane: esempi
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
• In esecuzione il calcolo dell’espressione, a parte le precedenze,
procede da sinistra a destra e termina non appena il valore della
espressione è determinato
• Questo può creare problemi se l’espressione ha dei side-effect

Strutture condizionali 2013/2014 Pagina 11


Unità 3
Esercizio 3.1
• Scrivere un programma C in grado di leggere in ingresso da
tastiera un intero e di stampare la parola “pari” se si tratta di un
numero pari, la parola “dispari” altrimenti.
#include <stdio.h>

int main() {
int x;
printf(“Digitare un intero: ");
scanf("%d", &x);
if((x % 2) == 0)
printf("pari\n");
else
printf("dispari\n");
return 0;
}

Strutture condizionali 2013/2014 Pagina 12


Unità 3
Errori subdoli
int a; ERRORE: uso dell’operatore di assegnazione, invece
double b; dell’operatore di confronto. In questo caso il compilatore
non segnala alcuna anomalia: l’espressione vale 0, e la
condizione è sempre falsa.
if (a=0)
...
if (b==0)
...
ATTENZIONE: confrontare una variabile float o double
con 0 non ha molto senso. A causa degli errori di
arrotondamento la condizione potrebbe essere sempre
falsa.

Strutture condizionali 2013/2014 Pagina 13


Unità 3
Esercizio 3.2
• Verificare cosa stampa questo 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;
}
Strutture condizionali 2013/2014 Pagina 14
Unità 3
Blocchi

• Un blocco è una sequenza di zero o più istruzioni racchiuse tra


parentesi graffe
{ istruzione-1
………….
istruzione-n
}
dove istruzione-k è una qualsiasi istruzione C
• Esso può rimpiazzare una singola istruzione ovunque, per
esempio in una istruzione di if
• Le istruzioni di un blocco vengono eseguite in sequenza

Strutture condizionali 2013/2014 Pagina 15


Unità 3
Variabili locali
• Un blocco di istruzioni può contenere al suo interno dichiarazioni
di variabili
• Queste variabili hanno come campo di azione (scope) il blocco
stesso, inclusi altri blocchi dichiarati al suo interno.
• Esse non sono visibili all’esterno del blocco
• Una variabile dichiarata in un blocco può avere lo stesso nome
di una variabile dichiarata all’esterno del blocco
• Non ci sono problemi di omonimia:
− All’interno del blocco, la variabile omonima dichiarata
all’esterno non è visibile
− All’esterno del blocco, la variabile omonima dichiarata
all’interno non è visibile

Strutture condizionali 2013/2014 Pagina 16


Unità 3
Esercizio 3.3
• Dati mese ed anno, calcolare mese ed anno del mese successivo.
#include <stdio.h>
int main() {
int mese, anno, mese_s, anno_s;
printf(" Mese: "); scanf("%d", &mese);
printf(" Anno: "); scanf("%d", &anno);
if (mese == 12){
mese_s = 1;
anno_s = anno+1;
}
else {
mese_s = mese+1;
anno_s = anno;
};
printf("\n Mese: %d, \n Anno %d",mese_s, anno_s);
return 0;
}
Strutture condizionali 2013/2014 Pagina 17
Unità 3
Domande vero/falso (1/2)
#include <stdio.h> /*1*/
int main() { /*2*/
int a = 3, b = 4; /*3*/
if(a != 0) /*4*/
a++; /*5*/
else /*6*/
a--; /*7*/
b = 3; /*8*/
printf("a = %d b = %d\n", a, b); /*9*/
return 0; /*10*/
} /*11*/
1. Il programma stampa a = 4 b = 4
2. La riga 8 non viene eseguita
3. Il ramo else non viene eseguito
Strutture condizionali 2013/2014 Pagina 18
Unità 3
Domande vero/falso (2/2)
#include <stdio.h> /*1*/
int main() { /*2*/
int a = 3, b = 4; /*3*/
if(a != 0) { /*4*/
int a = 1; /*5*/
a++; /*6*/
b = 3; /*5*/
printf("a = %d b = %d\n", a, b); /*7*/
} /*9*/
printf("a = %d b = %d\n", a, b); /*10*/
return 0; /*11*/
} /*12*/

1. La riga 7 stampa a = 2 b = 3
2. La riga 10 stampa a = 3 b = 3

Strutture condizionali 2013/2014 Pagina 19


Unità 3
Esercizio 3.4
• Scrivere un programma C in grado di prendere in ingresso da
tastiera tre numeri interi e di stampare il maggiore tra essi

#include <stdio.h>
int main() {
int n1, n2, n3, max;
printf("Primo numero: "); scanf("%d", &n1);
printf("Secondo numero: "); scanf("%d", &n2);
printf("Terzo numero: "); scanf("%d", &n3);
max=n1;
if (n2 > max) max=n2;
if (n3 > max) max=n3;
printf("Il maggiore tra i tre numeri e': %d\n",max);
return 0;
}

Strutture condizionali 2013/2014 Pagina 20


Unità 3
Esercizio 3.4 con if annidati
• Versione alternativa (e meno intuitiva)

#include <stdio.h>
int main() {
int n1, n2, n3, max;
printf("Primo numero: "); scanf("%d", &n1);
printf("Secondo numero: "); scanf("%d", &n2);
printf("Terzo numero: "); scanf("%d", &n3);
if (n1 > n2) if (n1 > n3) max=n1;
else max=n3;
else if (n2 > n3) max=n2;
else max=n3;
printf("Il maggiore tra i tre numeri e': %d\n",max);
return 0;
}

Strutture condizionali 2013/2014 Pagina 21


Unità 3
Esercizio 3.5
• Scrivere un programma C che legge una temperatura e stampa un
commento:
− se temperatura > 30: molto caldo
− se 20 < temperatura  30: caldo
− se 10 < temperatura  20: piacevole
− se temperatura  10: freddo
• Si può realizzare il programma in diversi modi:
A. Con una serie di if annidati
B. Con una serie di if in cascata, sfruttando il fatto che si usano
condizioni sono mutuamente esclusive
• Per costruire condizioni mutuamente esclusive è stato necessario
utilizzare connettivi logici

Strutture condizionali 2013/2014 Pagina 22


Unità 3
Esercizio 3.5: soluzione A
#include <stdio.h>
int main() {
int temp;
printf("Temperatura: "); scanf("%d", &temp);
if (temp > 30)
printf("molto caldo\n");
else if (temp > 20)
printf("caldo\n");
else if (temp > 10)
printf("gradevole\n");
else printf("freddo\n");
return 0;
}

N.B. I tre livelli di if nidificati sono colorati in tre colori diversi.

Strutture condizionali 2013/2014 Pagina 23


Unità 3
Esercizio 3.5: soluzione B

#include <stdio.h>

int main() {
int temp;
printf("Temperatura: "); scanf("%d", &temp);
if (temp > 30) printf("molto caldo\n");
if (temp > 20 && temp <=30) printf("caldo\n");
if (temp > 10 && temp <=20) printf("gradevole\n");
if (temp <= 10 ) printf("freddo\n");
return 0;
}

N.B. Grazie al fatto che si sono costruite condizioni mutuamente


esclusive, si ottiene un programma più semplice e più leggibile

Strutture condizionali 2013/2014 Pagina 24


Unità 3
Esercizio 3.6
• Scrivere un programma che calcoli le soluzioni dell’equazione di
secondo grado:
ax2+bx+c=0
• Come è noto si danno tre casi, in base al valore di Δ = b2 – 4ac :
A. Δ>0 : radici reali e distinte

B. Δ=0 : radici reali coincidenti

C. Δ<0 : radici immaginarie

Strutture condizionali 2013/2014 Pagina 25


Unità 3
Esercizio 3.6: soluzione
#include <stdio.h>

int main()
{
float a, b, c, delta;
printf("Programma per la soluzione di ax^2+bx+c\n");
printf("Coefficiente a: "); scanf("%f", &a);
printf("Coefficiente b: "); scanf("%f", &b);
printf("Coefficiente c: "); scanf("%f", &c);
delta = b*b - 4*a*c;
if(delta > 0)
printf("le radici sono reali e distinte\n");
else if(delta == 0)
printf("le radici sono reali e coincidenti\n");
else
printf("le radici sono immaginarie\n");
system("PAUSE");
}

Strutture condizionali 2013/2014 Pagina 26


Unità 3
If-else con else ambiguo
• La clausola else è opzionale, per cui si possono avere casi di if
nidificati con ambiguità di significato:
if (a > 0) if (b > 0) printf("b positivo\n");
else printf("???\n");
• Non è chiaro se l’else appartenga al primo o al secondo if
• L’uso di parentesi chiarisce l’ambiguità:
if (a > 0){
if (b > 0) printf("b positivo\n");
else printf("???\n");
}

N.B. In assenza di parentesi, la regola è che l’else appartiene


sempre all’if più vicino

Strutture condizionali 2013/2014 Pagina 27


Unità 3
Esercizio 3.7
• Scrivere un programma che legge da tastiera tre valori, a, b, c che
rappresentano le lunghezze dei lati di un triangolo, e stabilisce se si
tratta di un triangolo equilatero, isoscele o scaleno.
• Occorre controllare che i tre numeri siano tali che la somma di due
tra essi sia maggiore del terzo: altrimenti non è un triangolo!

a+b>c OR a+c>b OR c+b>a ?


SI NO
ALBERO a=b?
DI DECISIONE SI NO

a=c? a=c?
SI NO SI NO

E I I
b=c?
SI NO

I S Non è un triangolo

Strutture condizionali 2013/2014 Pagina 28


Unità 3
Esercizio 3.7: soluzione
#include <stdio.h>
int main ()
{
int a,b,c; char g;
printf("Valore di a: "); scanf("%d", &a);
printf("Valore di b: "); scanf("%d", &b);
printf("Valore di c: "); scanf("%d", &c);
if ((a+b>c) && (b+c>a) && (a+c>b))
{
if (a==b) {if (a==c) printf("Triangolo equilatero");
else printf("Triangolo isoscele");
}
else if (a==c) printf("Triangolo isoscele");
else if (b==c) printf("Triangolo isoscele");
else printf("Triangolo scaleno");
}
else printf("Non e\' un triangolo!");
return 0;
}
Strutture condizionali 2013/2014 Pagina 29
Unità 3
Valutazione di condizioni complesse
• Nelle condizioni contenente gli operatori booleani && e || , le
sottoespressioni vengono valutate da sinistra a destra
• Non appena la verità della condizione è determinata la valutazione
delle sottoespressioni è sospesa
• In particolare:
A. nel valutare (e1 && e2) se la valutazione di e1
restituisce 0, allora e2 non è valutata
B. nel valutare (e1 || e2) se la valutazione di e1
restituisce 1, allora e2 non è valutata
• Bisogna stare attenti a questo, perché eventuali side-effect che uno
si sarebbe aspettato dall’espressione e2 potrebbero andare persi

Strutture condizionali 2013/2014 Pagina 30


Unità 3
Espressioni condizionali
• Il C prevede espressioni condizionali, il cui valore cioè dipende dal
valore di una condizione booleana
SINTASSI
condizione ? espressione1 : espressione2
− condizione è una condizione booleana
− espressione1 e espressione2 sono espressioni dello stesso tipo
SEMANTICA
− Viene valutata la condizione
− Se la condizione è vera viene valutata espressione1
− Se la condizione è falsa viene valutata espressione2
ESEMPIO
printf("massimo = %d\n", (a > b) ? a : b);
Strutture condizionali 2013/2014 Pagina 31
Unità 3
Istruzione switch: sintassi
• Consente di realizzare una selezione a più vie
Espressione intera o
di tipo char

switch (espressione) {
case etichetta1 : istruzioni1
break; Sequenze di istruzioni
.......... qualsiasi

case etichettaN : istruzioniN


break; La clausola default è
opzionale
default: istruzioni-default
}
Espressioni intere (o carattere) di valore costante; possono contenere solo letterali
interi (o caratteri) o costanti inizializzate con espressioni costanti. La stessa
espressione non può essere ripetuta come etichetta in più case

Strutture condizionali 2013/2014 Pagina 32


Unità 3
Istruzione switch: semantica
1. Viene prima valutata l’espressione
2. Viene cercato il primo valore i per il quale:
etichettai = espressione
3. Se viene trovato un tale valore di i, allora viene eseguita la
sequenza di istruzioni corrispondente: istruzionii
4. Altrimenti viene eseguita la sequenza istruzioni-default
5. L’esecuzione riprende dall’istruzione successiva alla switch.

Se ci sono più valori per i quali fare eseguire le stesse istruzioni, si


possono raggruppare i diversi case:
case valore-1 : .. :case valore-2 : istruzioni
break;

Strutture condizionali 2013/2014 Pagina 33


Unità 3
Istruzione switch: esempio

int i;
...
switch (i) {
case 0: printf("zero\n");
break;
case 1: printf("uno\n");
break;
case 2: printf("due\n");
break;
default: printf("minore di zero \n");
printf("o maggiore di due\n");
}

Strutture condizionali 2013/2014 Pagina 34


Unità 3
Esercizio 3.8: giorni del mese
#include <stdio.h>
int main ()
{ int mese, giorni;
printf("Inserire il numero del mese: "); scanf("%d", &mese);
switch (mese) {
case 4: case 6: case 9: case 11:
giorni = 30;
break;
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
giorni = 31;
break;
case 2:
giorniDelMese = 28;
break;
default:
printf("Mese non valido\n");
}
printf("Giorni: %d\n", giorniDelMese);
return 0;
}
Strutture condizionali 2013/2014 Pagina 35
Unità 3
Omissione del break
• L’uso della parola chiave break per chiudere le sequenze di
istruzioni è opzionale
• Quando però il break viene omesso, la semantica cambia:

SEMANTICA (nel caso generale)


1. Viene cercato il primo valore i per il quale:
etichettai = espressione
3. Se viene trovato un tale valore di i, allora vengono eseguite le
sequenze di istruzioni istruzionii, istruzionii+1 fino al primo break
4. Altrimenti viene eseguita la sequenza istruzioni-default
5. L’esecuzione riprende dall’istruzione successiva alla switch.

Strutture condizionali 2013/2014 Pagina 36


Unità 3
Esercizio 3.9: lati di un poligono
#include <stdio.h>
int main ()
{
int lati;
printf("Numero dei lati (max 6): "); scanf("%d", &lati);
printf("Poligoni con al piu\' %d lati: ", lati);
switch (lati) {
case 6: printf("esagono, ");
case 5: printf("pentagono, ");
case 4: printf("rettangolo, ");
case 3: printf("triangolo");
break;
case 2: case 1: printf("nessuno");
break;
default: printf("Valore non valido (max 6)");
}
return 0;
}
Strutture condizionali 2013/2014 Pagina 37
Unità 3
Esercizio 3.10
• Scrivere un programma che legga da input un codice prestabilito
per indicare una specifica funzione matematica (es. logaritmo,
seno, etc.), quindi legga i relativi operandi e restituisca il risultato
della funzione.
• Gli input devono essere inseriti separati da virgole.
• Si assumano i seguenti codici:
− Codice 0 per logaritmo
− Codice 1 per seno
− Codice 2 per coseno
ESEMPIO
• Se si inserisce 1,3.14 il programma stamperà:
sin(3.140000) = 0.001593
Strutture condizionali 2013/2014 Pagina 38
Unità 3
Esercizio 3.10: soluzione
#include <stdio.h>
#include <math.h>
int main (){
int codice; double dato;
printf("Inserisci codice e operando separati da virgola: ");
scanf("%d,%lf", &codice, &dato);
switch(codice) {
case 0: printf("log(%f) = %f\n", dato, log(dato));
break;
case 1: printf("sin(%f) = %f\n", dato, sin(dato));
break;
case 2: printf("cos(%f) = %f\n", dato, cos(dato));
break;
default: printf("Il codice inserito non corrisponde ad
alcuna funzione\n");
}
return 0;
}
Strutture condizionali 2013/2014 Pagina 39
Unità 3

Potrebbero piacerti anche