Ciclo o iterazione: un gruppo di istruzioni che può essere ripetuto più volte.
Supponiamo di avere a disposizione 10 raggi e di voler calcolare 10 circonferenze. L’algoritmo sarà allora:
ripeti 10 volte:
leggi(raggio)
circonferenza ←2* 3.1415*raggio
stampa(circonferenza)
In via del tutto generale l’utente dice al programma quante circonferenze deve calcolare come segue:
leggi(n)
ripeti n volte:
leggi(raggio)
circonferenza←2* 3.1415*raggio
stampa(circonferenza)
Istruzione ciclica for
:
for
(inizializza; condizione; modifica) { istruzione; … }
dove:
true
e passa all’istruzione successiva appena la condizione diventa false
.Implementiamo in C++ l’algoritmo per calcolare n volte la circonferenza di un cerchio.
Si veda l’esercizio 6.1.
Assegnato un numero n compreso tra 1 e 10, stampare la tabellina relativa a un numero preassegnato. Per es. se n=4 deve stampare
4×1=4 4×2=8 4×3=12 ……………………………..4×10=40
L’algoritmo relativo diventa:
leggi(numero)
for (i_1;i<=10;++i)
stampa(numero*i)
Il corrispondente codice C++ è dato da:
cin>>numero
for (int i=1;i<=10;i++)
cout<<numero<<"x"<<i<<" ="<<numero*i;
Si noti che la variabile i viene dichiarata all’interno dello stesso for.
Può essere usata solo all’interno del for stesso (visibilità/scope).
La visibità di una variabile definisce in quali parti del programma può essere utilizzata.
Il ciclo for può essere utilizzato solo se si conosce a priori quante volte il corpo del ciclo deve essere ripetuto.
Si veda l’esercizio 6.2
Si veda l’esercizio 6.3
Tornando al problema del calcolo della circonferenza si vuole consentire all’utente di calcolare un numero imprecisato circonferenze fino a quando non si dà un raggio uguale a zero.
Un possibile algoritmo è il seguente:
leggi (raggio)
finchè raggio!=0 ripeti:
circonferenza ←2* 3.14*raggio
stampa(circonferenza)
leggi(raggio)
Qui sappiamo che il corpo del ciclo deve essere eseguito ogni volta che il numero letto è diverso da zero.
In questi casi possiamo ricorrere al ciclo while.
Istruzione ciclica while:
while (condizione) { istruzione; ... }
dove:
false
, il ciclo non viene eseguito mai;true
e passa all’istruzione successiva appena la condizione diventa false
;loop
(ciclo) non si ripeta all’infinito, il blocco di istruzioni deve modificare qualche parametro della condizione.Si veda l’ esercizio 6.5
Il corpo del loop può essere un’istruzione semplice o composta.
Supponiamo di dover ripetere un gruppo di istruzioni soltanto nel caso che a sia minore di b, con a e b numeri interi.
Scriveremo qualcosa del tipo:
while (a < b
{
(gruppo di istruzioni da ripetere)
}
Il gruppo di istruzioni all’interno del ciclo è il corpo del ciclo, l’espressione booleana (a<b) viene chiamata condizione di ingresso; la sua negata rappresenta la condizione di uscita dal ciclo.
Una singola esecuzione della sequenza di istruzioni che formano il corpo del ciclo è detta passo del ciclo.
Siano a e b due numeri interi i cui valori iniziali sono: a=5; b=10; (rappresentano le inizializzazioni delle variabili del ciclo necessarie per poter valutare l’espressione booleana; se fosse b=10 e a=12 il ciclo non verrebbe proprio eseguito). Si veda l’esercizio 6.6
Quale sarà il valore di a che verrà stampato alla fine del ciclo? Dopo l’inizializzazione con a=5 e b=10 entriamo nel ciclo while (la condizione (a<b) è vera)
Si ritorna alla condizione di controllo del ciclo, (a<b), e poichè 6<9, si esegue un altro ciclo
Si ritorna ancora al controllo (a<b), si verifica che 7<8
la condizione (a<b) è falsa per cui si salta il ciclo e si esegue l’istruzione. Subito dopo il computer scriverà sul video a=8.
Problema: somma di n numeri
La condizione di iterazione è contatore ≤ n
I valori che abbiamo posto tra parentesi rappresentano la somma ottenuta al passo precedente;
somma=somma+contatore;
somma+=contatore;
Algoritmo 1 – Somma dei primi n interi
inizializza contatore a 1 e somma a 0
while contatore <= N ripeti:
incrementa il valore della variabile somma con il contenuto di contatore
incrementa il contatore di 1
Altra possibilità è di inzializzare sia contatore che somma a zero; in tal caso l’algoritmo si modifica come segue:
Algoritmo 2
inizializza contatore e somma a 0
while contatore < N ripeti
incrementa il contatore di 1
incrementa il valore della variabile somma con il contenuto di contatore
Algoritmo 3
inizializza contatore e somma a 0
finché contatore <= N esegui le due istruzioni
incrementa il contatore di 1
incrementa il valore della variabile somma con il contenuto di contatore
Algoritmo 4
inizializza contatore ad 1 e somma a 0
finché contatore < N ripeti
incrementa il valore della variabile somma con il contenuto di contatore
incrementa il contatore di 1
Si veda l’ esercizio 6.7
Se la condizione all’interno del while non è tale da rendere ad un certo punto la condizione falsa, si ha un ciclo infinito perché il programma non ha mai modo di terminare.
Questo può far sembrare il programma bloccato.
Esempio: calcolo del MCD di due numeri naturali a e b
Algoritmo di Euclide ( ∼ 300 A.C.):
Input a,b
Finché il resto della divisione tra a e b è diverso da zero esegui le istruzioni:
Calcola il resto dei due numeri interi a e b
Poni b in a (poni il divisore nel dividendo)
Poni il resto della divisione in b
Quando il resto è zero allora il MCD è il numero intero contenuto in b
Scrivi il MCD b
Notiamo che, poiché il ciclo termina quando il resto della divisione è zero, non è perfettamente determinato il numero di passi da eseguire: in tal caso non è possibile utilizzare il ciclo for
ma è necessario servirsi del while
.
Si veda l’ esercizio 6.8
1- Tenendo presente il programma che calcola la somma dei primi N numeri interi scrivere un programma che determini:
2- Dato il programma che calcola il Massimo Comun Divisore:
verificare cosa accade se i valori immessi sono entrambi negativi, uno negativo e l’altro positivo, uno positivo ed uno nullo. Apportare al programma le modifiche necessarie affinché dia sempre risposte coerenti.
Calcolare il prodotto dei primi N interi.
Viene spontaneo sostituire il simbolo del prodotto al posto di quello della somma. Se provate a farlo otterrete uno strano risultato: utilizzate il debug (o, ancora meglio, ragionateci sopra).
Quali modifiche devono essere apportate nel programma per eseguire la somma di tutti gli interi inclusi tra due numeri N1 ed N2 prefissati (con N1< N2) ?
Calcolo della Conversione da decimale a Binario.
1. Prime nozioni di Programmazione
2. C++ elementi di un programma
3. Le istruzioni di I/O standard
5. C++ funzioni matematiche ed espressioni booleane
6. Le strutture di controllo - parte seconda
8. Array di caratteri e tipi astratti
9. Astrazione procedurale: Procedure e Funzioni
10. Astrazione procedurale: Procedure e Funzioni -parte seconda
11. Astrazione procedurale: Procedure e Funzioni - parte terza
12. Librerie
13. Le strutture di controllo - parte terza
14. Algoritmi
16. I File di testo
17. La classe string