```C [|5-7|8,20|9-11|12,19|13-15|16-18]
int n;
printf("Inserisci il voto preso:\n");
scanf("%d", &n);
if(n < 18) {
printf("Oh no :-(\n");
}
else { // n >= 18
if(n < 24) {
printf("Un esame in meno!\n");
}
else { // n >= 24
if(n < 28) {
printf("Ottimo voto\n");
}
else { // n >= 28
printf("Bravissimo/a!\n");
}
}
}
```
---
# Composizione di strutture di selezione - 2
* Scriviamo un programma che stampa alcune proprietà del numero inserito
```C [|5-10|12-14|15-17|18-20]
int n;
printf("Inserisci un numero:\n");
scanf("%d", &n);
if(n % 2 == 0) {
printf("Il numero è pari\n");
}
else {
printf("Il numero è dispari\n");
}
if(n > 0) {
printf("Il numero è positivo\n");
}
else if(n < 0) {
printf("Il numero è negativo\n");
}
else {
printf("Il numero è zero\n");
}
```
---
#
Differenze tra `if` e compilazione condizionale
* Nella compilazione condizionale le direttive vengono valutate a *compile time*
```C [|2,3|5,6]
#ifdef F_TO_C
T_output = (T_input - offset) * conv;
printf("La temperatura in Celsius è %lf\n", T_output);
#else
T_output = T_input / conv + offset;
printf("La temperatura in Fahrenheit è %lf\n", T_output);
#endif
```
* Gli `if` vengono eseguiti a *runtime*: valutano espressioni non note a *compile time*
```C [|2,3|4-11]
int f_to_c;
printf("Inserire 0 per C->F, un valore != 0 per F->C:\n");
scanf("%d", &f_to_c);
if(f_to_c) {
T_output = (T_input - offset) * conv;
printf("La temperatura in Celsius è %lf\n", T_output);
}
else {
T_output = T_input / conv + offset;
printf("La temperatura in Fahrenheit è %lf\n", T_output);
}
```
---
# Struttura iterativa - `while`
* "Finché [condizione] è vera esegui [istruzioni]"
```C
// qui il codice che precede l'iterazione
while(condizione) {
... // <-- istruzioni
}
... // <-- altre istruzioni
```
Se condizione
è falsa le istruzioni tra {}
non sono mai eseguite
---
# Un esempio di ciclo `while`
```C [1-3|5-8]
int i = 1, N;
printf("Inserire il numero di cui si vuole stampare la tabellina:\n");
scanf("%d", &N);
while(i < 10) { // se i non fosse inizializzata sarebbe un disastro...
printf("%d * %d == %d\n", N, i, N * i);
i++;
}
```
```bash
$ gcc -o es_while es_while.c
$ ./es_while
Inserire il numero di cui si vuole stampare la tabellina:
9
9 * 1 == 9
9 * 2 == 18
9 * 3 == 27
9 * 4 == 36
9 * 5 == 45
9 * 6 == 54
9 * 7 == 63
9 * 8 == 72
9 * 9 == 81
```
---
# Esercizio sul `while`
```C [4,5|7-10|12]
#include
int main() {
int j = 7;
int k = 7;
while(j > 2) {
j--;
k++;
}
printf("La variabile k vale %d\n", k);
return 0;
}
```
```bash
$ ./esercizio_while
La variabile k vale 12
```
---
# Struttura iterativa - `do`-`while`
* "Esegui [istruzioni] finché [condizione] è vera"
```C
// qui il codice che precede l'iterazione
do {
... // <-- istruzioni
} while(condizione);
... // <-- altre istruzioni
```
A differenza del while
, le istruzioni tra {}
vengono eseguite almeno una volta, indipendentemente da condizione
---
---
# Un esempio di ciclo `do`-`while`
* Questo tipo di ciclo iterativo è *perfetto* per controllare la correttezza dei dati in input
```C
double N;
do {
printf("Inserire un numero positivo:\n");
scanf("%lf", &N);
} while(N <= 0);
printf("Il numero inserito è %lf\n", N);
```
```bash [1-3|4-5|6-8]
$ ./es_do_while
Inserire un numero positivo:
-5928.2
Inserire un numero positivo:
0.0
Inserire un numero positivo:
23.6
Il numero inserito è 23.600000
```
---
# Il ciclo `for`
* Il costrutto `for` si usa al posto del `while` se il numero di iterazioni da fare è noto
* La sintassi è un po' più complicata rispetto agli altri casi:
```C
for(inizializzazione; condizione; incremento) {
... // <-- istruzioni
}
```
* `inizializzazione` è una o più operazioni da eseguire *all'inizio del ciclo*
* `condizione` è ciò che determina la continuazione del ciclo
* `incremento` è una o più operazioni da compiere ogniqualvolta il ciclo viene ripetuto
---
# Esempio di ciclo `for` - tabelline
* Possiamo riscrivere meglio il programma delle tabelline grazie al `for`
```C [1-3|5-7]
int i, N; // non c'è più bisogno di inizializzare la variabile della condizione
printf("Inserire il numero di cui si vuole stampare la tabellina:\n");
scanf("%d", &N);
for(i = 1; i < 10; i++) { // l'inizializzazione avviene direttamente nel for
printf("%d * %d == %d\n", N, i, N * i);
// non c'è bisogno di aggiornare i all'interno del ciclo
}
```
---
# Esempio di ciclo `for` - potenze
-
inizializzazione
e incremento
possono contenere più operazioni separate da virgole
-
incremento
non deve necessariamente essere un'addizione
* Un codice che stampa le potenze di un intero fino ad un esponente massimo
```C [1-3|5-7]
int base, esponente, valore, i;
printf("Inserire base ed esponente massimo:\n");
scanf("%d %d", &base, &esponente);
for(valore = base, i = 0; i < esponente; i++, valore *= base) {
printf("%d**%d == %d\n", base, i + 1, valore);
}
```
```bash
$ ./es_potenze
Inserire base ed esponente massimo:
5 4
5**1 == 5
5**2 == 25
5**3 == 125
5**4 == 625
```
---
# Altri due esempi sul ciclo `for`
```C []
int i;
for(i = 0; i < 10; /* nessun incremento? */) {
printf("i == %d\n", i);
i++;
}
```
inizializzazione
, condizione
e incremento
sono opzionali!
```C [|3,5]
int i;
int N = 10;
for(i = 0; i < N; i++) {
printf("i == %d\n", i);
N++;
}
```
Ciclo infinito: condizione
viene valutata ad ogni iterazione
---
# Esercizio sul `for`
```C
#include
int main() {
int j;
int k = 7;
for(j = 2; j < 7; j++) {
k++;
}
printf("La variabile k vale %d\n", k);
return 0;
}
```
```bash
$ ./es_for
La variabile k vale 12
```
---
# Esercizio per casa
* Cosa fa il programma descritto dal seguente diagramma di flusso in figura?

* [ ] stampa i numeri da 0 a 50 a ritroso e di 5 in 5
* [ ] stampa 10 volte il numero 50
* [ ] stampa i numeri da 0 a 50