Esiste un particolare operatore, detto operatore condizionale, che rappresenta un’istruzione if … else …. estremamente compattata
?:
Supponiamo di voler inserire nella variabile intera x il più grande dei valori interi tra a e b:
if (a>b) x=a;
else
x=b;
Invece adoperando l’operatore condizionale ? scriveremo:
(a > b) ? x=a : x=b;
C espressioni condizionali
L‘operatore condizionale é l'unico operatore ternario:
condizione ? espressioneA : espressioneB ;
dove condizione é un'espressione logica. L'operazione restituisce il valore dell'espressioneA se la condizione e' true o il valore dell'espressioneB se la condizione e' false
Esempio: minimo = a < b ? a : b ;
(n % 2==0) ? Printf(”pari\n”) : printf(”dispari\n”);
C espressioni condizionali
C istruzione switch
L’istruzione switch offre un altro modo per implementare strutture di selezione con diverse alternative.
Es: confronto di una variabile con tutti i valori che può assumere
Occorre riprendere il concetto di tipo ordinale (valori interi)
Tipo per il quale è possibile definire il precedente (tranne il primo) ed il successivo (tranne l’ultimo) di ogni valore.
Alcuni tipi standard sono ordinali:
I tipi int, long int, char, bool sono ordinali
I tipi float, double non sono ordinali
C istruzione switch
L’istruzione switch offre un altro modo per implementare strutture di selezione con diverse alternative.
espressione può essere una variabile o una espressione di tipo ordinale (intero);
switch (espressione) { case risultato1:
istruzione1;
... break;
case risultato2;
istruzione2;
... break;
... case risultatoN:
istruzioneN;
... break;
default:
istruzioni di default;
} ...
la parola-chiave break evita
l’esecuzione dei blocchi case seguenti (viene eseguito il corpo di istruzioni
del caso con risultato voluto, ignorando i casi seguenti e il default)
sequenze di istruzioni che non devono essere delimitate da parentesi graffe
il caso default può essere omesso
e rappresenta il caso in cui l’espressione non corrisponde a nessuno dei risultati
la parola-chiave case deve essere seguita da una costante il cui valore (risultato1, …) è coerente con l’espressione;
C istruzione switch
L’istruzione switch è equivalente ad una sequenza di istruzioni if
… else annidati
Non introduciamo nello pseudocodice una istruzione corrispondente allo switch, ma lo esprimeremo sempre con istruzioni se … altrimenti annidate
switch (espressione) { case risultato1:
istruzione1;
...break;
case risultato2;
istruzione2;
...break;
...case risultatoN:
istruzioneN;
...break;
default:
istruzioni di default;
} ...
if (espr==ris1) { istruzioni1;
... }
else if (espr==ris2) { istruzioni1;
... } ...
else if (espr==risN) { istruzioniN;
...}
else {
istruzioni di default;
... }
equivalente
C istruzione switch
Attenzione alla istruzione break. La sua omissione permette la verifica dei rimanenti blocchi case e la conseguente esecuzione delle istruzioni
switch (espressione) { case risultato1:
istruzione1;
... ...
case risultato2;
istruzione2;
... break;
... case risultatoN:
istruzioneN;
... break;
default:
istruzioni di default;
} ...
istruzione1
no ...
istruzione2
... break
no
istruzioneN
... break
no
istr. default ...
espr?
espr?
espr?
risN ris2
ris1
C istruzione switch
Attenzione alla istruzione break. La sua omissione permette la verifica dei rimanenti blocchi case e la conseguente esecuzione delle istruzioni
switch (espressione) { case risultato1:
istruzione1;
... ...
case risultato2;
istruzione2;
... break;
... case risultatoN:
istruzioneN;
... break;
default:
istruzioni di default;
} ...
if (espr==ris1) { istruzioni1;
... }
if (espr==ris1 OR espr==ris2){
istruzioni1;
... } ...
else if (espr==risN) { istruzioniN;
...}
else {
istruzioni di default;
... }
equivalente
C istruzione switch
Esercizio:
Scrivere un programma che dato in input un voto da 0 a 10 stampi un giudizio secondo la tabella
Voto Giudizio
3-5 insufficiente 6 sufficiente 7-8 buono 9 ottimo 10 eccellente
leggi(voto)
if (voto>2 and voto<6):
stampa(“insufficiente”) else:
if (voto=6):
stampa(“sufficiente”) else:
if (voto=7 or voto=8):
stampa(“buono”) else:
if (voto=9):
stampa(“ottimo”) else:
if (voto=10):
stampa(“eccellente”) else:
stampa(“voto errato”)
Algoritmo
C istruzione switch
...int main () { int voto;
printf("Input voto: \n”);
scanf(“%d”,&voto);
switch (voto) { case 3:
case 4:
case 5:
printf("insufficiente\n”);
break;
case 6:
printf("sufficiente\n”);
break;
case 7:
case 8:
printf("buono\n”);
break;
case 9:
printf("ottimo\n”);
break;
case 10:
printf("eccellente\n”);
break;
default:
printf("voto errato\n”);
} return 0;
}
leggi(voto)
if (voto>2 and voto<6):
stampa(“insufficiente”) else:
if (voto=6):
stampa(“sufficiente”) else:
if (voto=7 or voto=8):
stampa(“buono”) else:
if (voto=9):
stampa(“ottimo”) else:
if (voto=10):
stampa(“eccellente”) else:
stampa(“voto errato”)
Algoritmo
C istruzione switch
Esercizi:
1. Il termometro: scrivere un programma che dato in input un numero (intero) che indica una temperatura in Co da 35 a 42, stampi i seguenti messaggi:
35 à debole, 36 à normale, 37àdecimi, 38 à febbre, 39-40 à febbre alta, 41-42 à febbre delirante
2. Scrivere un programma che riceve in input un numero n1 (1o operando), un carattere p che indica un operatore (‘+’, ‘-’, ‘*’, ‘/’), e un numero n2 (2o
operando), per eseguire l’operazione: n1 p n2
3. Calcolare in una frase qual è la vocale che occorre più volte.
4. Estendere il programma precedente in modo che il risultato dell’operazione sia il primo operando della successiva operazione (ridata in input insieme al nuovo 2o operando): (n1 p n2) p’ n3 …
C istruzioni iterative
L'istruzione ciclica do ... while:
do {
istruzione;
} while (condizione); ...
dove:
• condizione é un'espressione logica
• funziona come l'istruzione while, con la differenza che la
condizione é verificata alla fine di ogni iterazione e pertanto il ciclo é sempre eseguito almeno una volta
• Se la condizione é true il programma torna all'inizio del ciclo ed esegue una nuova iterazione, se é false, passa all'istruzione
successiva
• Le parentesi graffe sono obbligatorie, anche se il costrutto controlla una istruzione semplice
no
si cond?
istruzione ...
C istruzioni iterative
Esempio :
dato un array A contenente n elementi si vuole verificare se la somma dei suoi elementi è maggiore di un certo valore k.
sum=0;
i=0;
do{
sum=sum+A[i];
i++;
}
while ((i<n) && (sum<=k));
if (sum>k)
printf(”la somma è maggiore”);
else printf(”la somma non è maggiore”);
In definitiva utilizziamo
while ( ) ….. quando il corpo del ciclo può anche non essere mai eseguito;
do …. while ( ) quando il corpo del ciclo deve essere eseguito almeno una volta.
C istruzioni iterative
int x;
do{
printf(“Inserire numero positivo”);
scanf(“%d”,x);
} while(x <= 0);
C istruzioni iterative
Esercizi:
a) Scrivere un programma che propone le tabelline per un bambino delle elementari.
I due fattori da moltiplicare sono generati in modo random ed il computer deve controllare che l’utente risponda esattamente. Quando risponde esattamente, il programma deve generare a caso una delle seguenti risposte:
1) Bravo!! 2) Ottima risposta. 3) Continua così!! 4) Stai nettamente migliorando.
Nel caso di una risposta errata deve rispondere, sempre a caso, con una delle seguenti:
1) Errato. Riprova. 2) Non è la risposta esatta. 3) Fai più attenzione. Riprova 4) Non arrenderti. Prova ancora.
b) Scrivere un main che legge due numeri reali ed un carattere: se il carattere è ‘T’
chiama la prima procedura, se il carattere è ‘R’ chiama la seconda, se è ‘E’
chiama la terza, se è ‘N’ esce dal ciclo inviando un messaggio di saluto, altrimenti stampa: ‘carattere errato’.