Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Strutture iterative
Problema:
Visualizzare i numeri interi da 0 a 1000
Strutture iterative Soluzione
printf("0\n");
printf("1\n");
printf("2\n");
Ver. 2.4 printf("3\n");
printf("4\n");
...
Non è davvero una buona idea… ma con le
conoscenze attuali non c’è alternativa
3 4
7 8
11 12
15 16
19 20
23 24
Break Break
Esempio La formulazione equivalente strutturata è:
Somma fino a 10 valori dati in input. Per esci = NO;
introdurre meno valori, introdurre 0 somma = 0;
somma = 0; for (i=0; i<10 && esci==NO; i++)
for (i=0; i<10; i++) {
{ scanf("%d", &v);
scanf("%d", &v); if (v == 0)
if (v == 0) esci=SI;
break; else
somma += v; somma += v;
} }
printf("Somma = %d\n",somma); printf("Somma = %d\n",somma); i++
25 26
Continue Continue
Per passare immediatamente all’iterazione Schema con ciclo while
successiva, si può utilizzare l’istruzione while (condizione)
non strutturata continue {
Per effetto dell’istruzione continue: istruzioni...
vengono saltate tutte le istruzioni dalla continue if (condizione_particolare)
fino alla parentesi di terminazione del corpo del ciclo continue;
se si tratta di un ciclo for, viene eseguita expr2
l’esecuzione riprende dalla valutazione della istruzioni saltate se eseguito continue
condizione
}
27 28
Continue Continue
Schema con ciclo do-while Esempio
do Somma i valori dati finché non viene
{ introdotto il valore 0, ignorando i negativi.
istruzioni... somma = 0;
do
if (condizione_particolare) {
continue; scanf("%d", &v);
if (v < 0)
istruzioni saltate se eseguito continue continue;
somma += v;
}while (condizione); }while(v != 0);
29 30
31 32
35 36
Etichette Salti
Una label (etichetta) viene usata per dare un Un “salto” fa continuare l’esecuzione di un
nome ad una riga, viene in genere posizionata programma da un altro punto del codice
all’inizio della riga stessa senza indentazione Il salto incondizionato goto ha sintassi:
ed è terminata da un carattere ‘:’, esempio: goto label; label senza il carattere ‘:’
fuori: Quando viene eseguita, il programma salta
Tutte le label devono avere nomi diversi alla riga con quella label e continua da lì
(stesse regole sintattiche degli identificatori) Una label può essere collocata in una riga
precedente o successiva quella con il goto
Una label è visibile in ogni punto della
(salto indietro o avanti), ma nell’uso accettato
funzione dove è definita, ma non al di fuori di
sarà sempre avanti e in posizioni ben precise
essa
Una label può essere usata da più goto, ma
nell’uso accettato non si presenta mai il caso
39 40
Salti Salti
L’utilizzo di goto produce sempre codice non In alcuni (pochi) casi il goto può essere utile
strutturato e quindi potenzialmente più difficile per questioni di efficienza e chiarezza
da comprendere e da manutenere La liceità di utilizzo del goto è oggetto di
I vecchi linguaggi di programmazione non diatribe, con ferventi e autorevoli sostenitori
disponevano di costrutti strutturati e l’uso del in entrambe le parti (Dijkstra vs. Knuth)
goto era indispensabile, i frequentissimi Con il goto sono “condannati” anche break,
rimandi da una parte all’altra del codice lo continue e return multipli
rendevano molto intricato (“spaghetti code”)
Se il linguaggio dispone di adeguati costrutti
strutturati si può sempre evitare di usare i
goto. Il linguaggio C ha questi costrutti.
41 42
Salti Salti
E’ utile l’uso del goto per uscire da due o più Si eviti il goto in tutti gli altri casi
cicli annidati, in questo caso l’etichetta DEVE Alcuni linguaggi moderni (es. Java) non hanno
essere collocata subito sotto il corpo del ciclo goto, ma dispongono di costrutti aggiuntivi
più esterno (senza istruzioni intermedie) ed è (es. break con etichetta) proprio per uscire
preferibile che sia allineata verticalmente con da cicli annidati
la keyword del ciclo più esterno da cui uscire
for (… Allineati verticalmente
{
for (…
{ … if (condizione speciale)
goto fuori;…
} Etichetta subito sotto il corpo
}
del ciclo più esterno
fuori:
43 44
Esercizi Esercizi
1. Scrivere un programma che calcoli la media 4. Scrivere un programma che richieda N numeri
(con parte frazionaria) di 100 valori introdotti da tastiera e ne calcoli il valore massimo.
dalla tastiera.
5. Scrivere un programma che richieda N numeri
2. Scrivere un programma che chieda quanti
siano i valori che verranno introdotti dalla da tastiera e ne calcoli il valore massimo, il
tastiera, li chieda tutti e ne stampi la somma valore minimo, la somma e la media.
e la media. 6. Si scriva un programma che calcoli il fattoriale
3. Scrivere un programma che calcoli la media di di un numero intero N dato dalla tastiera. Si
tutti i valori introdotti dalla tastiera finché non ricordi che il fattoriale di un numero n (simbolo
ne viene introdotto uno non compreso tra 18
e 30, ad esempio 9999 (provare proprio n!) viene calcolato con la seguente formula:
questo valore!). La visualizzazione della media n! = n ·(n–1)·(n–2)· ... ·2 ·1.
deve avvenire solo alla fine (ossia non ogni
volta che un valore viene introdotto).
45 46
Esercizi Esercizi
7. Scrivere un programma che calcola i primi N 9. Si scriva un programma per calcolare ex
numeri di Fibonacci, con N introdotto dalla mediante il suo sviluppo in serie:
tastiera. I numeri di Fibonacci sono una
sequenza di valori interi che inizia con i due x x2 x3
valori fissi 1 e 1 e ogni successivo valore è la
e 1
x
...
1! 2! 3!
somma dei due precedenti.
Ad esempio i primi 10 numeri di Fibonacci Ogni frazione aggiunge precisione al risultato,
sono: 1 1 2 3 5 8 13 21 34 55. per cui conviene usare valori di n
8. Scrivere un programma che calcoli i primi adeguatamente elevati, ad esempio compresi
numeri di Fibonacci minori o uguali a N, con N tra 30 e 40. Si verifichi che i risultati calcolati
introdotto dalla tastiera. in questo modo siano coerenti con quelli
Ad esempio i primi numeri di Fibonacci minori forniti dalla funzione intrinseca exp
o uguali a 10 sono: 1 1 2 3 5 8. calcolando la differenza dei valori.
47 48
Esercizi Esercizi
10. Si scriva un programma dove il calcolatore (Continuazione)
determini casualmente un numero intero Dato il valore A, se ne vuole calcolare la
compreso tra 0 e 99 e chieda all’utente di radice quadrata x. La formula data calcola
trovare il numero stesso. Ad ogni input valori di x sempre più precisi.
dell’utente il calcolatore risponde con “troppo Inizialmente si considera x i=0 = A, ricavando
alto” o “troppo basso”, finché non viene un valore x1 che approssima molto
trovato il valore corretto. Per generare valori grossolanamente il valore della radice
casuali si utilizza la funzione rand. quadrata.
Si riinserisce x1 nella formula (al posto di xi)
11. Si scriva un programma per calcolare la radice
ottenendo un x2 che è un’approssimazione
quadrata mediante la formula
1 A migliore della precedente.
iterativa di Newton: xi 1 xi
2 xi Si continua in questo modo finché il risultato
non varia più (cioè xi = xi +1).