Le istruzioni di iterazione in C
Le interazione, o cicli Le istruzioni di ciclo o interazione sono una delle componenti fondamentali della programmazione e permettono l’esecuzione reiterata, più volte, di una o più operazioni. Facendo risparmiare la quantità di codice scritta rendendo quindi il programma più leggero e più facile da comprendere. Le istruzioni di ciclo, come le istruzioni condizionali, hanno bisogno che alcune condizioni vengano verificate affinché il ciclo continui nella sua reiterazione o si interrompa.
Le interazione, o cicli L’introduzione dei cicli in un programma potrebbe violare la proprietà di terminazione di un algoritmo. Il programmatore deve essere certo che esista almeno un caso in cui la condizione di permanenza diventi falsa per fare in modo che l’algoritmo termini. Altrimenti il programma potrebbe entrare in stato di loop.
Elementi fondamentali di un costrutto ciclico Inizializzazione: le variabili interessate, e soprattutto quelle usate nella condizione del ciclo, devono essere inizializzate prima della valutazione della condizione. Condizione/Test: Deve essere prevista una valutazione della condizione di permanenza nel ciclo, che determini la ripetizione o la terminazione del ciclo. Incremento/Modifica: almeno una delle variabili della condizione deve essere modificata all’interno del ciclo, in modo che prima o poi la condizione di ripetizione diventi falsa, causando la terminazione del ciclo.
I cicli in C Il linguaggio C le istruzioni per la gestione dei cicli sono: L’istruzione while L’istruzione do…while L’istruzione for I cicli while e do..while sono detti indefiniti, mentre il ciclo for e detto definito.
Il ciclo while In questa iterazione prima viene verificata la condizione e poi eseguite le istruzioni. Caratteristiche fondamentali: La parola chiave while permette di definire un ciclo. Il blocco viene eseguito finché la condizione permane vera. Il ciclo è pre-condizionato. while (condizione) { /* istruzioni */ }
Il ciclo while Questo semplice programma, stampa i 10 numeri successivi a quello inserito. #include <stdio.h> int contatore, fine_ciclo, numero; main( ) { printf ("inserisci un numero: "); scanf("%d",&numero); fine_ciclo=numero+10; contatore=numero; while(contatore<fine_ciclo) printf(" %d \n",numero+1); numero=numero+1; contatore++; } return 0; Variabile utilizzata per terminare il ciclo, prende come valore, il valore inserito alla quale viene aggiunto 10. Alla variabile contatore è assegnato il valore iniziale di numero. Inizio del ciclo while, il ciclo eseguirà le operazioni al suo interno fino a quando la condizione rimarrà vera, ovvero il valore della variabile contatore sarà minore del valore della variabile fine_ciclo. Stampa il valore della variabile numero aggiungendoci 1 (in questo, ma non è l’unica soluzione, inizio a stampare dal valore successivo a numero. Incrementa il valore di numero Incrementa il valore di contatore, l’operazione è l’equivalente di contatore=contatore + 1;
Il ciclo while Vediamo l’esito in alcune prove, nell’esecuzione del programma Come si può vedere dalle varie esecuzione il programma, chiede l’inserimento di un numero, acquisito il valore inizia il ciclo di stampa, che parte dal valore immediatamente successivo, fino al valore iniziale incrementato di 10. tra le varie esecuzioni c’è anche il caso in cui il valore sia negativo, ovviamente questo non comporta alcun problema.
Il ciclo while Programma che esegue la media tra gli N numeri inseriti, e chiude la sequenza con l’inserimento del valore 0 (zero). #include <stdio.h> int contatore=0; float numero, somma, media; main( ) { somma=0; numero=1; while(numero!=0) printf ("inserisci un numero: "); scanf("%f",&numero); somma=somma+numero; contatore++; } contatore=contatore-1; media=somma/contatore; printf("Numeri inseriti: %d\n",contatore); printf("La somma e’: %f\n",somma); printf("La Media e’: %f \n", media); return 0; In questo programma, l’esecuzione del ciclo dipende dall’inserimento di valori diversi da 0 (zero), ovvero il programma chiederà l’inserimento di un numero fino a quando non sarà inserito lo 0 (zero), a quel punto la condizione (numero!=0) sarà falsa e uscirà dal ciclo. La media viene calcolata, tra la somma dei numeri inseriti, e il numero dei valori inseriti. Inizializzazione della variabile numero a 1, in questo modo forzo l’ingresso nel ciclo. (Una delle soluzioni…). Somma il numero acquisito alla variabile somma, cosicché si accumuli e alla fine contenga la somma. La variabile contatore, che serve per contare il numero dei valori, si incrementa, alla fine conterà il numero dei cicli effettuati, attenzione ovviamente conta anche il ciclo in cui si inserisce lo 0 (zero) che termina la reiterazione!!! Per questo motivo, all’uscita del while, effettuo sottraggo 1, alla variabile contatore.
Il ciclo while Vediamo l’esito in alcune prove, nell’esecuzione del programma Come si può vedere dalle varie esecuzione il programma, chiede in modo reiterato l’inserimento di un numero, fino a quando non si inserisci lo 0 (zero). Appena inserito lo 0, il ciclo termina e stampa i risultati: La quantità dei numeri inseriti La somma dei valori La media aritmetica Attenzione!!! Questo esempio presenta qualche aspetto migliorabile…. provateci!!!
Il ciclo do..while Molto simile al while è il do..while e tenendo valide tutte le considerazioni fatte per il while, va notato che in questo modo si esegue l’istruzione all’interno del do..while almeno una volta, indipendentemente dal fatto che la condizione associata al while risulti vera o falsa. Il do..while anche se il controllo è in coda, è un ciclo “per vero” come nel caso del while. Esistono situazioni in cui è necessario che il corpo del ciclo sia eseguito almeno una volta, e in questi casi si utilizza l’istruzione do…while. do { /* istruzioni */ } while (condizione); vero falso
Il ciclo do..while Questo semplice programma, richiede l’inserimento di un numero compreso tra 1 e 10, e ripete la richiesta fino a quando non avviene ciò. #include<stdio.h> int n; main() { do { printf("Inserisci un valore intero compreso tra 1 e 10 \n "); scanf ("%d",&n); } while (n<1 || n>10); printf("Il numero inserito e' %d ", n); return 0; } Come si può vedere in questo caso il do..while è adatto a questo tipo di problema, perché necessità di acquisire prima il valore e dopo di verificarlo. Nella condizione del do..while e presente un operatore logico ||(or), ovvero se entrambi le condizione sono soddisfatte, la condizione risulta vera, altrimenti è falsa. Da notare e stare attenti, nel caso del do..while, è la presenza del ;(punto e virgola) nella riga di istruzione del while.
Il ciclo do..while Vediamo l’esito in alcune prove, nell’esecuzione del programma Come si può vedere dalle varie esecuzione il programma, chiede in modo reiterato l’inserimento di un numero compreso tra 1 e 10, fino a quando non si inserisci tale valore, il programma ripete all’infinito la richiesta. Appena inserito il valore richiesto esce dal ciclo e stampa semplicemente il numero inserito.
Il ciclo do..while Programma che esegue la media tra gli N numeri inseriti, e chiude la sequenza con l’inserimento del valore 0 (zero). #include <stdio.h> int contatore; float somma, numero, media; main( ) { contatore=0; somma=0; do printf ("inserisci un numero: "); scanf("%f",&numero); somma=somma+numero; contatore++; } while(numero!=0); contatore=contatore-1; media=somma/contatore; printf("Numeri inseriti: %d\n", contatore); printf("La Somma e': %f\n", somma); printf("La Media e': %f \n", media); return 0; Questo è lo stesso programma visto con il ciclo while. Infatti il ciclo, anche in questo caso reitera fino a quando la condizione sarà vera. All’inserimento dello 0 (zero), la condizione (numero!=0) sarà falsa ed uscirà dal ciclo. In questo caso però, non ho necessità di forzare l’ingresso nel ciclo (vedi programma con while), perché nel do..while la condizione e dopo il blocco di istruzioni, quindi effettuerà prima l’inserimento e poi il controllo. Per quanto riguarda il resto del programma, è praticamente identico a quello del while. Da notare e stare attenti, nel caso del do..while, è la presenza del ;(punto e virgola) nella riga di istruzione del while.
Il ciclo for Il for è il costrutto più usato, è molto più sintetico, e per logica è molto simile al while, e viene utilizzato quando è necessario eseguire un’iterazione un numero finito di volte. Gli elementi del ciclo for sono identici agli elementi di un costrutto ciclico ma sono applicati al contatore: Inizializzazione: il contatore viene inizializzato Test: il contatore viene confrontato con il limite superiore (inferiore) Modifica: il contatore viene incrementato (decrementato) E’ caratterizzato dal fatto che gli elementi fondamentali del ciclo, sono tutti in una unica riga di istruzione, e sono separati da un ; (punto e virgola). for (inizializzazione; test; modifica) { /*istruzioni*/ } falso vero
Il ciclo for Questo semplice programma, effettua la somma di 5 numeri interi. #include<stdio.h> main() { int somma=0, num, i; for (i=0;i<5;i++) printf("Inserisci numero "); scanf("%d",&num); somma=somma+num; } printf("La somma e' %d\n",somma); return 0; Questo programma effettua la somma di 5 numeri interi, inseriti in input, e restituisce la loro somma. Inizio del ciclo for; come detto il costrutto for racchiude tutti e tre gli elementi caratteristici dei cicli (inizializzazione; condizione; incremento). Eseguirà le operazioni al suo interno fino a quando la condizione rimarrà vera, ovvero fino a che il valore della variabile contatore i sarà minore del valore del valore impostato, in questo esempio a 5. Infatti la i è inizializzata a 0 (zero) e si incrementa di 1 (i++). All’interno del for è sono presenti un printf, per la stampa del messaggio, un scanf, per l’acquisizione del valore e l’operazione di somma. All‘uscita del ciclo, il programma esegue l’istruzione printf, stampando a video la somma.
Il ciclo for Vediamo l’esito in alcune prove, nell’esecuzione del programma Come si può vedere dalle prove, nell’esecuzione il programma, chiede in modo reiterato, nel nostro caso 5 volte, l’inserimento di un numero. Appena raggiunto il numero prestabilito esce dal ciclo e stampa la somma dei valori ottenuta.
Il ciclo for Questo programma, effettua la somma di N numeri interi. #include<stdio.h> int main() { int somma=0,N,num,i; printf("Inserisci numero di valori che vuoi inserire: "); scanf("%d",&N); for (i=0;i<N;i++) printf("Inserisci numero "); scanf("%d",&num); somma=somma+num; } printf("La somma e' %d\n",somma); return 0; Questo programma effettua la somma di N numeri interi, ovvero a differenza del precedente viene richiesto il numero di valori da sommare, dopodiché è identico al programma precedente. In questo caso il ciclo for, eseguirà le operazioni al suo interno fino a quando il valore della variabile contatore i non raggiungerà il valore della variabile inserita da tastiera (N). Infatti in questo esempio, la condizione di uscita varia da esecuzione a esecuzione, non ha un valore prestabilito.
Il ciclo for Vediamo l’esito in alcune prove, nell’esecuzione del programma Come si può vedere dalle prove, nell’esecuzione il programma, chiede prima la quantità dei valori da inserire, e poi in modo reiterato, N volte, l’inserimento di un numero. Questo ciclo verrà ripetuto fino al raggiungimento del valore inserito (N), raggiunto tale valore, esce dal ciclo e stampa la somma ottenuta.
Rivediamo i costrutti while - do..while - for while (i < 10) { printf(“%d”, i); i=i+1; } i = 0; { printf(“%d”, i); i=i+1; } while (i < 10); for (i=0; i<10; i=i+1) { printf(“%d”, i); } Vediamo i tre costrutti a confronto, in questi esempi se eseguiti darebbero lo stesso identico risultato. Notiamo l’equivalenza tra il while e il for, mentre si nota la differenza della struttura del do..while
Incremento / decremento Nell’utilizzo dei cicli abbiamo sentito parlare spesso di incremento/decremento. In C l’istruzione i=i+1 può essere sostituita da i++ (autoincremento); L’autoincremento vale solo per variabili intere e può essere espresso in due forme: variabile++ (prima accedo alla variabile e poi incremento) ++variabile (prima incremento e poi accedo alla variabile) Sostituendo l’operatore ++ con -- si ottiene l’autodecremento.
Incremento / decremento La differenza tra le due forme è evidente solo quando l’autoincremento (autodecremento) è inserito in una espressione. Questo semplice programma eseguito ci renderà più chiara la differenza tra le due formule. #include <stdio.h> main() { int a,b; printf("prova incremento con a = 5 \n\n"); a=5; printf("eseguo incremento con la formula b = a++ \n\n"); b=a++; printf("il risultato e' che ottengo e' che a = %d mentre b = %d \n\n",a,b); printf("eseguo incremento con la formula b = ++a \n\n"); b=++a; printf("il risultato e' che ottengo e' che a = %d mentre in questo caso b = %d\n",a,b); return 0; }
Incremento / decremento Vediamo l’esito nell’esecuzione del programma L’esecuzione evidenzia la differenza tra le due forme: Esempio 1 a=5 b=a++; /*b vale 5*/ Esempio 2: a=5; b=++a; /*b vale 6*/