114
Istruzioni decisionali Istruzioni decisionali
1. if
2. if-else
3. switch
switch switch
Struttura di scelta plurima che controlla se
una espressione assume un valore all’interno
di un certo insieme di costanti e si comporta
di conseguenza
116
switch switch
I0
In
IU E
I2
I1 c1 c2 … cn I default
switch
switch : sintassi : sintassi
switch (espressione){
case costante1: sequenza_di_istruzione1; break;
case costante2: sequenza_di_istruzione2; break;
…
case costanteN: sequenza_di_istruzioneN; break;
default: sequenza_di_istruzioneDefault; break;
}
118
switch
switch : semantica : semantica
Valuta espressione
se ha valore costante1 esegui sequenza_di_istruzione1; break se ha valore costante2 esegui sequenza_di_istruzione2; break
…
se ha valore costanteN esegui sequenza_di_istruzioneN;break
altrimenti (se il valore di espressione è
diverso da costante1 ,..., costanteN ) esegui sequenza_di_istruzioneDefault;break (opzionale)
break provoca l’uscita immediata dallo switch
Esempio Esempio
#include<stdio.h>
main() {
int num;
scanf("%d", &num);
switch (num) {
case 1: printf("*\n"); break;
case 2: printf("**\n"); break;
case 3: printf("***\n"); break;
default: printf("!\n"); break;
}
120
Osservazione Osservazione
Valori ammessi come possibili scelte devono essere costanti
Esempio Esempio
#include<stdio.h>
main() {int num;
int uno=1;
int due=2;
scanf("%d", &num);
switch (num) {
case uno: printf("pippo1\n"); break;
case due: printf("pippo2\n"); break;
default: printf("pippo_default\n");
} }
SBAGLIATO
Valori non costanti
122
Osservazione Osservazione
break non è strettamente indispensabile.
Se non è presente viene eseguita
sequenzialmente ogni istruzione a partire dal case che è stato raggiunto
Esempio senza
Esempio senza break break
#include<stdio.h>
main() {
int num;
scanf("%d", &num);
switch (num) {
case 1: printf("*\n");
case 2: printf("**\n");
case 3: printf("***\n");
default: printf("!\n");
}
124
Un altro esempio Un altro esempio
#include<stdio.h>
main() {char car;
scanf("%c", &car);
switch (car) {
case 'a': case 'e': case 'i':
case 'o': case 'u':
printf("Vocale minuscola\n"); break;
case 'A': case 'E': case 'I':
case 'O': case 'U':
printf("Vocale maiuscola\n"); break;
default: printf("Non e' vocale\n"); break;
} }
Possono esserci più etichette per una stessa sequenza di istruzioni
125
Esercizi Esercizi
… su switch
126
Esercizio Esercizio
Scrivere un programma che visualizza il seguente menu:
Menu di prova 1) Immettere dati 2) Visualizzare dati 3) Modificare dati Scelta:
quindi aspetta l’immissione di un carattere da parte dell’utente e visualizza una scritta corrispondente alla scelta effettuata, del tipo: In esecuzione l’opzione 1
Se la scelta non è tra quelle proposte (1,2,3) deve essere visualizzata la scritta Opzione inesistente
Soluzione Soluzione
#include<stdio.h>
main() {
int num;
printf("Menu di prova\n");
printf("1) Immettere dati\n");
printf("2) Visualizzare dati\n");
printf("3) Modificare dati\n");
printf("Scelta: ");
scanf("%d", &num);
switch (num) {
case 1: printf("In esecuzione l’opzione 1"); break;
case 2: printf("In esecuzione l’opzione 2"); break;
case 3: printf("In esecuzione l’opzione 3"); break;
default: printf("Opzione inesistente"); break;
}
128
Esercizio Esercizio
Scrivere un programma che riceve in ingresso un mese (numero intero) e stampa quanti giorni ha quel mese
4,6,9,11 Î 30
1,3,5,7,8,10,12 Î 31
2 Î 28
m ∉[1..12] Î non esistente
Soluzione Soluzione
#include<stdio.h>
main() {
int num;
printf("Dammi un mese (numero): ");
scanf("%d", &num);
switch (num) {
case 1: printf("31 giorni"); break;
case 2: printf("28 giorni"); break;
case 3: printf("31 giorni"); break;
case 4: printf("30 giorni"); break;
case 5: printf("31 giorni"); break;
case 6: printf("30 giorni"); break;
case 7: printf("31 giorni"); break;
case 8: printf("31 giorni"); break;
case 9: printf("30 giorni"); break;
case 10: printf("31 giorni"); break;
case 11: printf("30 giorni"); break;
case 12: printf("31 giorni"); break;
default: printf("Mese inesistente"); break;
}
130
… … oppure oppure
#include<stdio.h>
main() {
int num;
printf("Dammi un mese (numero): ");
scanf("%d", &num);
switch (num) {
case 4: case 6: case 9: case 11: printf("30 giorni");break case 1: case 3: case 5: case 7:
case 8: case 10: case 12: printf("31 giorni"); break;
case 2: printf("28 giorni"); break;
default: printf("Mese inesistente"); break;
} }
Strutture di controllo del flusso Strutture di controllo del flusso
Le strutture di controllo del flusso specificano l’ordine secondo il quale le operazioni devono essere effettuate
istruzione composta
istruzioni decisionali
istruzioni cicliche
132
Istruzioni cicliche Istruzioni cicliche
Consentono di realizzare cicli di elaborazione, ossia l’esecuzione ripetuta di una sequenza di istruzioni
il numero di volte per il quale viene ripetuta la esecuzione della sequenza è noto a priori
il numero di volte per il quale la sequenza viene ripetuta non è noto a priori, ma è condizionato dal verificarsi in esecuzione di un evento assegnato
Esempi Esempi
calcolare le paghe dei dipendenti di una azienda noto il numero N dei dipendenti, ripetere N volte la sequenza di calcolo della paga
superare l’esame di Elementi di Informatica
la sequenza sostenere l’esame va eseguita e
rieseguita fino a quando non si viene promosso
(voto>=18)
134
Istruzioni cicliche Istruzioni cicliche
for
while
do-while
Esempio Esempio
Vogliamo visualizzare tre volte la scritta Ciao, mondo.
…
printf("Ciao, mondo.\n");
printf("Ciao, mondo.\n");
printf("Ciao, mondo.\n");
il numero di volte per il quale viene
ripetuta la esecuzione della sequenza
è noto a priori: 3
136
Usando il Usando il for for
#include<stdio.h>
main() {
int i;
for (i=1; i<=3; i++)
printf("Ciao, mondo.\n");
}
i=1
uscita ciclo
i++
i<=3 vero
falso
printf
Variabile contatore
Sintassi del Sintassi del for for
for (inizializzazione; condizione; incremento) istruzione
138
for (inizializzazione; condizione; incremento) istruzione
inizializzazione inizializzazione
Viene eseguita una volta sola Serve per impostare le variabili
Può anche non essere presente, ed allora dopo la parentesi tonda aperta viene subito il punto e virgola
Semantica Semantica
Semantica (
Semantica (cont cont.) .)
for (inizializzazione; condizione; incremento) istruzione
condizione condizione
Viene valutata ogni volta prima di eseguire le istruzioni del ciclo Se condizione è vera si esegue ancora istruzione
Se condizione è falsa si esce dal ciclo for passando all’istruzione successiva del programma
Può anche non essere presente, ed allora lo spazio tra i due punti e virgola
rimane vuoto. Il compilatore valuta vera la condizione assente, quindi
continua ad eseguire istruzione Î realizza un loop infinito
140
Semantica (
Semantica (cont cont.) .)
for (inizializzazione; condizione; incremento) istruzione
incremento incremento
Viene eseguita alla fine di ogni ciclo
Modificano ad esempio le variabili contatore (incremento o decremento) in generale: espressione
Può anche non essere presente, ed allora dopo il secondo punto e virgola viene subito la parentesi tonda chiusa
Importante!!
Importante!!
for (inizializzazione; condizione; incremento) istruzione
inizializzazione
inizializzazione: : eseguita una volta sola condizione:
condizione: valutata ogni volta prima
di eseguire le istruzioni del ciclo incremento:
incremento: eseguita alla fine di ogni ciclo
più in generale è un’espressione
142
Esempio Esempio
{ int x;
for (x=1; x<=10; x++) printf("%d\n",x);
}
no 11
si 10
si 9
si 8
si 7
si 6
si 5
si 3
si 2
si 1
si 4
x<=10 x
x=1
uscita ciclo
x++
x<=10 vero
falso
printf
1
3 2
9 4 5 6 7 8
10
Esempio Esempio
{ int x;
for (x=10; x>=0; x-=2) printf("%d\n",x);
}
no -2
si 0
si 2
si 6
si 8
si 10
si 4
x>=0 x
10
6 8
4
2
0
144
Esempio:
Esempio: loop loop infinito infinito
{ int x;
for ( x=0; ; ) printf("loop");
} { int x;
for ( ; ; ) printf("loop");
}
{ int x;
for ( x=0; x==0; ) printf("loop");
}
looplooplooplooplooploop looplooplooplooplooploop looplooplooplooplooploop looplooplooplooplooploop looplooplooplooplooploop looplooplooplooplooploop looplooplooplooplooploop
Attenzione!!!
Attenzione!!!
Iterazione infinita
for (i=5; i>=5; i++) …
Compilatore non segnala errore
146
Osservazioni Osservazioni
Poiché la condizione viene valutata prima di ogni ciclo, il for permette anche di non eseguire nemmeno una volta il ciclo
Esempio Esempio
{
int x;
for (x=9; x<6; x++) printf("%d\n", x);
}
Non stampa nulla
incremento inizializzazione
condizione
Inizializzazione ed incremento, nella sintassi del for, possono contenere più istruzioni, che
dovranno essere separate da virgola.
Esempio Esempio {
int x, y;
for (x=0, y=0; x+y<10; x++, y+=3) printf("%d\n", x+y);
}
Osservazioni (
Osservazioni ( cont.) cont .)
148
{
int x, y;
for (x=0,y=0; x+y<10; x++,y+=3) printf("%d\n", x+y);
}
no 9
3
si 0
0
si 6
2
si x+y<10 3
1
y x
Cosa Cosa stampa?
stampa?
8 4 0
Esempio di uso del Esempio di uso del for for
Calcolare la somma di 5 numeri interi immessi dall’utente
#include<stdio.h>
main() {
int i, somma, numero;
somma=0;
for (i=1; i<=5; i++) {
printf ("Dammi il numero: ");
scanf("%d", &numero);
somma=somma + numero;
}
printf("Somma = %d\n", somma);
}
150
Esempio (
Esempio ( cont.) cont .)
Utile far apparire il numero d’ordine d’inserimento:
#include<stdio.h>
main() {
int i, somma, numero;
somma=0;
for (i=1; i<=5; i++) {
printf ("Dammi il numero %d: ", i);
scanf("%d", &numero);
somma=somma + numero;
}
printf("Somma = %d\n", somma);
}
Esercizio Esercizio
#include<stdio.h>
main() {
int i, n=3;
for (i = 0; i < n; i++) printf("*");
for (i = 0; i < n; i++) printf("!");
***!!!
152