Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 1
Consentono di realizzare cicli di elaborazione, ossia la esecuzione ripetuta di una sequenza di istruzioni:
… 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 un esame universitario
si ripete il “sostenere l’esame” fino a quando non si è promossi (voto>=18) giocando a carte …
Si continua a distribuire le carte fin quando ciascun giocatore ha 5 carte
Strutture Ciclo
si suddividono in:
STRUTTURE CICLICHE ITERATIVE
il numero di volte per il quale la sequenza viene ripetuta non è noto a priori, ma è condizionato dal verificarsi di un determinato evento durante l’esecuzione
STRUTTURE CICLICHE RIPETITIVE
il numero di volte per il quale viene ripetuta la esecuzione della sequenza è noto “a priori”
Strutture Ciclo
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 3
… Esempi … Iterative
superare un esame universitario
si ripete a “sostenere l’esame” fino a quando non si è promossi (voto>=18) cercare una parola in un dizionario
continua a sfogliare le pagine del dizionario fin quando non trovi la parola voluta
Strutture Ciclo
Ripetitive
calcolare le paghe dei dipendenti di una azienda
noto il numero N dei dipendenti, ripetere N volte la sequenza di “calcolo della paga” per ciascun dipendente
Strutture iterative
Due forme fondamentali:
Strutture Ciclo
Ciclo a condizione finale (repeat-until):
una sequenza di istruzioni è eseguita 1 o più volte finché un’espressione condizionale diventa VERA (il ciclo continua se l’espressione condizionale è FALSA) Ciclo a condizione iniziale (while):
fin quando un’espressione condizionale è VERA, una sequenza di istruzioni è eseguita più volte (il ciclo termina quando l’espressione condizionale è FALSA)
Differenti forme sintattiche e semantiche in linguaggi diversi
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 5
Ciclo a condizione iniziale while (<espressione>) S;
<espressione> è una espressione booleana;
S è una sequenza di istruzioni
Strutture Ciclo
semantica:
• mentre <espressione> è vera ripeti l’esecuzione della sequenza S (l’esecuzione o la riesecuzione della sequenza S verrà sospesa quando <espressione> risulterà falsa)
• la sequenza S può non essere eseguita affatto
• dal ciclo si esce con <espressione> falsa
S0;
while (E) S1;
S2;
possibili sequenze sono:
S0 S2 S0 S1 S2 S0 S1 S1 S2 S0 S1 S1 S1 S2
………..
Strutture Ciclo
Ciclo a condizione iniziale S0
S2 E vero
falso
S1
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 7
………
INT x=3;
while (x<7) begin
write("%d",x);
x=x+1;
end;
write(”FINE”);
………
Esempio
x=3
x=x+1 x<7 vero
falso
write("%d",x)
write(”FINE”)
si
3 3
si
4 4
si
5 5
si 6
6
x<7
x write("%d",x)
FINE
no 7
… Attenzione … Errori Frequenti
c’è il rischio che un errato uso della struttura porti verso infinite ripetizioni
Ciclo / loop infinito … non ‘si esce’ dalla struttura ciclo …
...
while(i > n) begin ... ;
i = i + 1;
end
...
… i varia incrementandone il valore, ma essendo il suo valore iniziale già > n …
… loop infinito ...
...
while (X > 0) A = B + C;
…
… si ‘resta’ in loop infinito poiché il valore di X non viene in alcun caso
modificato...
Strutture Ciclo
Ciclo a condizione iniziale
Esempi:
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 9
… Assicurarsi della Convergenza del ciclo ...
• assicurarsi, in prima istanza, che nel corpo del while venga alterato il valore di almeno una delle
informazioni coinvolte in <espressione>
• assicurarsi, in ogni caso, che in un numero finito di iterazioni, <espressione> diventi falsa
• è anche necessario che a tutte le informazioni usate nell’<espressione> sia stato assegnato un valore prima della struttura while …
Strutture Ciclo
Ciclo a condizione iniziale
C - Strutture di controllo
Struttura while in C
while (<condizione>) {
<istruzioni>;
} Cicli iterativi
<Istruzione/i> sarà eseguito tante volte fintantoché <condizione>
risulta vera
N.B. < condizione> è un’espressione di tipo intero (in C non esiste il tipo logico)
a condizione iniziale while (<condizione>)
<istruzione>;
Elementi di Informatica Prof. G. A. Di Lucca - Univ. del Sannio
#include <stdio.h>
main () {
int Num;
printf( "immetti un numero \n”);
scanf(“%d” , &Num);
while (Num<=100)
Num=Num+10;
printf ( ”Numero= %d \n”, Num);
}
Esempio Ciclo while
Esempio Analisi e Specifica
Definizione del problema: data una sequenza di numeri interi. di lunghezza non nota a priori ma terminante con il numero 0, trovare quello con valore massimo
Definizione dei dati del problema:
I: un numero della sequenza
Pi: il numero 0 termina la sequenza e non fa parte della sequenza stessa
U: MAX, il numero con il valore massimo, di tipo intero
Pu: MAX è diverso da zero
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 13
Esempio
Nome variabile Descrizione Tipo
Num numero intero della sequenza INT
Nome variabile Descrizione Tipo
MAX Il numero con valore massimo INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Esempio
Progettazione
Descrizione del metodo di elaborazione:
• è letto il valore del primo numero della sequenza di interi, il valore è assegnato alla variabile Num;
• se Num è uguale a zero si visualizza ‘Sequenza vuota’ e si termina il programma, altrimenti:
• si considera il primo numero come quello massimo, ovvero si assegna a MAX il valore di Num;
• (a) mentre Num è diverso da zero
• si richiede l’immissione del successivo numero nella sequenza, il valore letto è assegnato alla variabile Num
• se il nuovo valore di Num è maggiore del valore di MAX si aggiorna il valore di MAX con quello di Num
• si ritorna ad eseguire il punto (a)
ovvero si continua a fare la lettura di un nuovo numero e confronto con il massimo fin quando non è immesso il valore zero;
• quando per Num è immesso il valore zero si stampa il valore di MAX
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 15
Esempio - il programma C
#include <stdio.h>
main ()
{ // Trova MAX in sequenza int Num, MAX;
printf( "immetti un numero \n”);
scanf(“%d” , &Num);
if (Num == 0)
printf (“Sequenza vuota – FINE programma\n”);
else
{ MAX=Num;
while (Num!=0) {
printf ("immetti un numero \n”);
scanf(“%d” , &Num);
if (Num>MAX) MAX=Num;
}
printf ( "Il valore massimo è %d \n”, MAX );
} }
Esempio - il programma C
immetti un numero 4 immetti un numero 82 immetti un numero 34 immetti un numero 25
Il valore massimo è 82 immetti un numero
0
Num=82 Num=34 Num=25
Num=0 Num=4
Max=4
Max=82
#include <stdio.h>
main ()
{ // Trova MAX in sequenza int Num, MAX;
printf( "immetti un numero \n”);
scanf(“%d” , &Num);
if (Num == 0)
printf (“Sequenza vuota – FINE programma\n”);
else
{ MAX=Num;
while (Num!=0) {
printf ("immetti un numero \n”);
scanf(“%d” , &Num);
if (Num>MAX) MAX=Num;
}
printf ( "Il valore massimo è %d \n”, MAX );
} }
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 17
Esempio - il programma C
immetti un numero -4 immetti un numero -82 immetti un numero -34 immetti un numero -25
Il valore massimo è 0 immetti un numero
0
Num=-82 Num=-34 Num=-25
Num=0 Num=-4
Max=-4
Max=- 4 Max= 0
#include <stdio.h>
main ()
{ // Trova MAX in sequenza int Num, MAX;
printf( "immetti un numero \n”);
scanf(“%d” , &Num);
if (Num == 0)
printf (“Sequenza vuota – FINE programma\n”);
else
{ MAX=Num;
while (Num!=0) {
printf ("immetti un numero \n”);
scanf(“%d” , &Num);
if (Num>MAX) MAX=Num;
}
printf ( "Il valore massimo è %d \n”, MAX );
}
} .... Malfunzionamento !!! Dov’è l’errore ?
Esempio - il programma C
#include <stdio.h>
main ()
{ // Trova MAX in sequenza int Num, MAX;
printf( "immetti un numero \n”);
scanf(“%d” , &Num);
if (Num == 0)
printf (“Sequenza vuota – FINE programma\n”);
else
{ MAX=Num;
while (Num!=0) {
printf ("immetti un numero \n”);
scanf(“%d” , &Num);
if (Num>MAX) MAX=Num;
}
printf ( "Il valore massimo è %d \n”, MAX );
}
Attenzione !! Se sono immessi tutti numeri negativi risulterà che MAX sarà uguale a zero.
Ma il valore zero che chiude la sequenza non fa parte della sequenza stessa e quindi non deve essere considerato.
Una soluzione per ovviare a ciò è riportata nel lucido successivo
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 19
Esempio - il programma C
#include <stdio.h>
main ()
{// Trova MAX in sequenza int Num, MAX;
printf( "immetti un numero \n”);
scanf(“%d” , &Num);
if (Num == 0)
printf (“Sequenza vuota – FINE programma\n”);
else
{ MAX=Num;
while (Num!=0) {
if (Num>MAX) MAX=Num;
printf ("immetti un numero \n”);
scanf(“%d” , &Num);
}
printf ( "Il valore massimo è %d \n”, MAX );
} }
…. Basta effettuare il confronto tra Num e MAX prima della lettura di un nuovo valore per Num …
Esempio - il programma C
immetti un numero -34 immetti un numero -82 immetti un numero - 4 immetti un numero -25
Il valore massimo è -4 immetti un numero
0
Num=-82 Num=-4 Num=-25
Num=0 Num=-34
Max=-34
Max=- 34
#include <stdio.h>
main ()
{ // Trova MAX in sequenza int Num, MAX;
printf( "immetti un numero \n”);
scanf(“%d” , &Num);
if (Num == 0)
printf (“Sequenza vuota – FINE programma\n”);
else
{ MAX=Num;
while (Num!=0)
{ if (Num>MAX) MAX=Num;
printf ("immetti un numero \n”);
scanf(“%d” , &Num);
}
printf ( "Il valore massimo è %d \n”, MAX );
} }
Max=- 4
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 21
Esempio - il programma C
#include <stdio.h>
main ()
{ // Trova MAX in sequenza int Num, MAX;
printf( "immetti un numero \n”);
scanf(“%d” , &Num);
if (Num == 0)
printfprintf (“(“Sequenza vuota Sequenza vuota –– FINE programmaFINE programma\\nn”);”);
else
{MAX=Num;
while (Num!=0)
{ if (Num>MAX) MAX=Num;
printf ("immetti un numero \n”);
scanf(“%d” , &Num);
}
printf ( "Il valore massimo è %d \n”, MAX );
} }
immetti un numero 4 immetti un numero 82 immetti un numero 34 immetti un numero 25
Il valore massimo è 82 immetti un numero
0
Num=82 Num=34 Num=25
Num=0 Num=4
Max=4
Max=82
Esempio Analisi e Specifica
Definizione del problema: data in input una sequenza di numeri interi, terminante con il numero 0, calcolare la sommatoria dei numeri immessi
Definizione dei dati del problema:
I: un numero della sequenza
Pi: il numero 0 termina la sequenza e non fa parte della sequenza stessa
U: la sommatoria dei numeri immessi
Pu: la sommatoria è un numero intero
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 23
Esempio
Nome variabile Descrizione Tipo
Num numero intero della sequenza INT
Nome variabile Descrizione Tipo
Somma la sommatoria dei numeri immessi INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Esempio
Progettazione
Descrizione del metodo di elaborazione:
• è letto il valore del primo numero della sequenza di interi;
• se il primo numero è uguale a zero si visualizza ‘Sequenza vuota’ e si termina il programma, altrimenti
• si inizializza la variabile Somma con il valore di Num;
• (a) mentre Num è diverso da zero
• si richiede l’immissione del successivo numero nella sequenza, il valore letto è assegnato alla variabile Num
• il valore della variabile Somma è incrementato del valore di Num: Somma = Somma + Num;
• si ritorna ad eseguire il punto (a)
ovvero si continua a fare la lettura di un nuovo numero e e l’ncremento del valore di Somma fin quando non è immesso il valore zero per Num;
• quando per Num è immesso il valore zero si stampa il valore di Somma
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 25
#include<stdio.h>
main()
{ // Calcola la sommatoria di una sequenza di numeri interi terminante con zero int Num;
long int Sommatoria;
printf( "immetti un numero intero\n”);
scanf(“%d” , &Num);
if (Num == 0)
printf (“Sequenza vuota – FINE programma\n”);
else
{Sommatoria=Num;
while (Num!=0)
{ printf ("immetti un numero \n”);
scanf(“%d” , &Num);
Sommatoria = Sommatoria + Num;
}
printf ( “Sommatoria = %d \n”, Sommatoria);
} }
Esempio - il programma in C
Esempio Analisi e Specifica
Definizione del problema: Dato in input il valore di N, numero intero maggiore di zero, calcolare
ovvero la sommatoria dei numeri da 1 a n Definizione dei dati del problema:
I: N Pi: N>0
U: la sommatoria dei numeri da 1 a N
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 27
Esempio
Nome variabile Descrizione Tipo
N estremo superiore della sommatoria INT
Nome variabile Descrizione Tipo
Sommatoria Sommatoria INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Esempio Progettazione
Descrizione del metodo di elaborazione:
• è letto il valore di N
• si verifica il valore di N e la lettura è ripetuta se N=<0
• si inizializza il valore di Sommatoria a zero
• si inizializza il valore di i a uno
• si ripetono, mentre i è non maggiore di N, le seguenti due istruzioni:
• si incrementa di i il valore di Sommatoria
• si incrementa di (uno) 1 il valore di i
• alla fine del ciclo si visualizza il valore di Sommatoria
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 29
Esempio
Nome variabile Descrizione Tipo N estremo superiore della sommatoria INT
Nome variabile Descrizione Tipo
Sommatoria Sommatoria INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Nome variabile Descrizione Tipo i indice elemento sommatoria e di controllo di ciclo INT Tabella delle variabili di algoritmo
#include<stdio.h>
main()
{ // Calcola la sommatoria dei numeri interi da 1 a N int i, N; long Sommatoria;
printf (”Immetti il valore di N \n”);
scanf("%d", &N);
// continua a leggere N mentre è NON maggiore di zero while (N<=0)
{ printf (”Immesso un valore non positivo, Immetti il valore di N \n”);
scanf("%d", &N);
}
// inizializza il valore di Sommatoria a zero e di i a 1 Sommatoria=0; i=1;
Esempio - il programma in C
Errore!! Manca
l’incremento della variabile i
!!!
Sommatoria incrementata solo di 1 (uno) !
Ciclo NON convergente ! // ciclo while per calcolare la sommatoria
while (i<=N)
Sommatoria=Sommatoria + i;
printf("Sommatoria = %d \n", Sommatoria);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 31
#include<stdio.h>
main()
{ // Calcola la sommatoria dei numeri interi da 1 a N int i, N; long Sommatoria;
printf (”Immetti il valore di N \n”);
scanf("%d", &N);
// continua a leggere N mentre è NON maggiore di zero while (N<=0)
{ printf (”Immesso un valore non positivo, Immetti il valore di N \n”);
scanf("%d", &N);
}
// inizializza il valore di Sommatoria a zero e di i a 1 Sommatoria=0; i=1;
Esempio - il programma in C
// ciclo while per calcolare la sommatoria while (i<=N)
{Sommatoria=Sommatoria + i;
i++; } // equivale a i=i+1
printf("Sommatoria = %d \n", Sommatoria);
}
….
printf (”Immetti il valore di N \n”);
scanf("%d", &N);
while (N<=0)
{ printf (”Immesso un valore non positivo, Immetti il valore di N \n”);
scanf("%d", &N);
}
…..
Esempio - il programma in C
… sono scritte/ripetute stesse istruzioni:
… una volta prima dell’inizio del ciclo
…. ed all’interno del ciclo
… quella sequenza va eseguita almeno una volta e poi eventualemente ripetuta …
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 33
Ciclo a condizione finale
(una prima forma)
repeat S until (<espressione>);
<espressione> è una espressione booleana;
S è una sequenza di istruzioni
Strutture Ciclo
semantica:
•ripeti l’esecuzione di S finché <espressione> risulta vera;
ovvero, dopo una esecuzione di S, la stessa verrà ripetuta se
<espressione> è falsa
•la sequenza S viene eseguita almeno una volta
•dal ciclo si esce con <espressione> vera
Strutture Ciclo
Ciclo a condizione finale
S0;
repeat S1 until (E);
S2;
le possibili sequenze sono:
S0 S1 S2 S0 S1 S1 S2 S0 S1 S1 S1 S2 ...
la struttura è 1 in / 1 out S0
E vero falso
S2 S1
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 35
………
int x=3;
repeat
write("%d",x);
x=x+1;
until(x>=7) write(”FINE”);
………
Esempio
3 3
no
4 4
no
5 5
no 6
6
X>=7
x write("%d",x)
FINE
si 7
x=3
X>=7 vero falso
write(”FINE”) write("%d",x)
X=x+1;
Ciclo a condizione finale
… esiste anche un’altra forma ...
do S while (<espressione>);
<espressione> è una espressione booleana; S è una sequenza di istruzioni
Strutture Ciclo
semantica:
•ripeti l’esecuzione di S finché <espressione> risulta falsa; ovvero, dopo una esecuzione di S, la stessa verrà ripetuta se <espressione> è vera
•la sequenza S viene eseguita almeno una volta
•dal ciclo si esce con <espressione> falsa
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 37
Strutture Ciclo
Ciclo a condizione finale S0;
do S1 while (E);
S2;
le possibili sequenze sono:
S0 S1 S2 S0 S1 S1 S2 S0 S1 S1 S1 S2 ...
la struttura è 1 in / 1 out NB: nel linguaggio C per il ciclo a condizione finale esiste solo la struttura do-while
S0
E falso vero
S2 S1
………
int x=3;
do
write("%d",x);
x=x+1;
while(x<7) write(”FINE”);
………
Esempio
3 3
si
4 4
si
5 5
si 6
6
x<7
x write("%d",x)
FINE
no 7
x=3
x<7 falso vero
write(”FINE”) write("%d",x)
x=x+1;
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 39
………
int x=7;
do
write("%d",x);
x=x+1;
while(x<7) write(”FINE”);
………
Esempio
7 7
x<7
x write("%d\n",x)
x=7
x<7 falso vero
write(”FINE”) write("%d\n",x)
x=x+1;
7 no FINE
… Errori frequenti e convergenza del ciclo ...
• anche per il do-while (repeat-until) c’è il rischio che un errato uso della struttura porti verso infinite ripetizioni
• problemi di convergenza analoghi a quelli riscontrati per il costrutto while ... ma nel do-while (repeat-until)
l’espressione condizionale viene valutata alla fine e non all’inizio del ciclo
• assicurarsi, in prima istanza, che nel corpo del do- while venga alterato il valore di almeno una delle informazioni coinvolte in <espressione>
• assicurarsi, in ogni caso, che in un numero finito di iterazioni <espressione> diventi falsa
Strutture Ciclo
Ciclo a condizione finale
Elementi di Informatica Prof. G. A. Di Lucca - Univ. del Sannio
C - Strutture di controllo
do {
<istruzioni>;
}
while <condizione>;
Cicli iterativi
L’esecuzione di <Istruzione/i> sarà ripetuta se <condizione> è vera
N.B. < condizione> è un’espressione di tipo intero (in C non esiste il tipo logico) ed essa è vera se ha un valore diverso da zero
a condizione finale do
<istruzione>;
while <condizione>;
ripeti l’esecuzione di S finché
<espressione> risulta falsa; ovvero, dopo una esecuzione di S, la stessa verrà ripetuta se
<espressione> è vera
#include <stdio.h>
main () {
int Num;
printf( "immetti un numero \n”);
scanf(“%d” , &Num);
do
Num=Num+10;
while (Num <=100);
printf ( ”Numero= %d \n”, Num);
}
Esempio Ciclo do … while
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 43
Esempio Analisi e Specifica
Definizione del problema: Dato in input il valore di N, numero intero maggiore di zero, calcolare la sommatoria dei numeri da 1 a N
… risoluzione del problema con l’uso di cicli a condizione finale …
Definizione dei dati del problema:
I: N Pi: N>0
U: la sommatoria dei numeri da 1 a N Pu: la sommatoria è maggiore di 0
Esempio
Nome variabile Descrizione Tipo
N estremo superiore della sommatoria INT
Nome variabile Descrizione Tipo
Sommatoria Sommatoria INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 45
Esempio Progettazione
Descrizione del metodo di elaborazione:
• si ripete la lettura di N fin quando risulta essere N=<0
• si inizializza il valore di Sommatoria a zero
• si inizializza il valore di i a uno
• si incrementa di i il valore di Sommatoria
• si incrementa di 1 (uno) il valore di i
• si ripetono, con un ciclo, i due passi precedenti finché i è non maggiore di N
• alla fine del ciclo si visualizza il valore di Sommatoria
Esempio
Nome variabile Descrizione Tipo N estremo superiore della sommatoria INT
Nome variabile Descrizione Tipo
Sommatoria Sommatoria INT Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Nome variabile Descrizione Tipo i indice elemento sommatoria e di controllo di ciclo INT Tabella delle variabili di algoritmo
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 47
#include<stdio.h>
main()
{ // Calcola la sommatoria dei numeri interi da 1 a N int i, N; long int Sommatoria;
// continua a leggere il valore di N finché assume un valore maggiore di zero do
{ printf (”Immetti il valore di N maggiore di zero\n”);
scanf("%d", &N);
}
while (N<=0);
// inizializza il valore di Sommatoria a zero e di i a 1 Sommatoria=0; i=1;
// ciclo per calcolare la sommatoria do
{Sommatoria=Sommatoria + i;
i++; } while (i<=N) ;
printf("Sommatoria = %d \n", Sommatoria);
}
Esempio - il programma in C
#include<stdio.h>
main()
{ // Calcola la sommatoria dei numeri interi da 1 a N int i, N; logint Sommatoria;
// legge il valore di N e continua finché assume un valore maggiore di zero
do
{ printf (”Immetti il valore di N \n”);
scanf("%d", &N);
} while (N<=0);
// inizializza il valore di Sommatoria a zero e di i a 1
Sommatoria=0; i=1;
// ciclo per calcolare la sommatoria do
{Sommatoria=Sommatoria + i;
i++; } while (i<=N) ;
printf("Sommatoria = %d \n", Sommatoria);
}
Esempio - il programma in C
… con ciclo do … while ( )
#include<stdio.h>
main()
{ // Calcola la sommatoria dei numeri interi da 1 a N int i, N; logint Sommatoria;
printf (”Immetti il valore di N \n”);
scanf("%d", &N);
//continua a leggere N mentre è NON maggiore zero while (N<=0)
{ printf (”Immesso un valore non positivo, Immetti il valore di N \n”);
scanf("%d", &N);
}
// inizializza il valore di Sommatoria a zero e di i a 1
Sommatoria=0; i=1;
// ciclo while per calcolare la sommatoria while (i<=N)
{Sommatoria=Sommatoria + i;
i++; }
printf("Sommatoria = %d \n", Sommatoria);
}
… con ciclo while ( )
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 49
Esempio Analisi e Specifica
Definizione del problema: fornito in input un numero intero dire quante volte esso è presente in una sequenza di numeri interi, terminante con il numero 0
Definizione dei dati del problema:
I: il numero intero da cercare; un numero intero della sequenza
Pi: il numero zero termina la sequenza; il numero da cercare è diverso da zero
U: il numero di volte per cui il numero da cercare si trova nella sequenza
Pu: il numero di volte non può essere negativo
Esempio
Nome variabile Descrizione Tipo
Num numero intero della sequenza INT Cerca numero da cercare INT
Nome variabile Descrizione Tipo
Volte Il numero di presenze di Cerca INT nella sequenza
Tabella delle variabili di ingresso
Tabella delle variabili di uscita
Tabella delle variabili di algoritmo
Nome variabile Descrizione Tipo
??? ?????? ?????
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 51
Esempio
Progettazione
Descrizione del metodo di elaborazione:
• Si ripete a leggere il valore del numero da cercare nella sequenza fin quando esso è diverso da zero;
• è letto un numero della sequenza di interi;
• si confronta il numero letto con quello da cercare
• se essi sono uguali si incrementa di una unità il contatore delle presenze del numero nella sequenza
• si continua dal secondo punto fino all’immissione dello zero
• si stampa il valore del contatore delle presenze del numero nella sequenza
Esempio - il programma C
#include <stdio.h>
main () {
// trova e conta in sequenza int Num, Cerca, Volte;
do
{ printf("immetti il numero da cercare \n”);
scanf(“%d”, &Cerca);
}
while (Cerca==0);
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 53
Volte=0;
do
{ printf ( "immetti un numero della sequenza \n”);
scanf(“%d”, &Num);
if (Num==Cerca)
Volte++; // equivale a Volte=Volte+1;
}
while (Num!=0);
printf ("Numero %d presente %d volte \n", Cerca, Volte);
}
Esempio - il programma C
do { S1;
}
while (<espressione>);
Riepilogo strutture while e do-while in C
.... esempio:
do {
scanf((“%d”, &Num);
}
while (Num!=0);
while (<espressione>) {
S1;
}
.... esempio:
while (Num < 10) {
Num++;
}
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 55
Relazione tra while e do-while ...
while (<espressione>) {
S1;
}
.... è equivalente a:
if (<espressione>) do {
S1;
}
while (<espressione>);
.... è equivalente a:
while (Num < 10) {
Num++;
}
if (Num < 10) do {
Num++;
}
while (Num < 10);
.... con notazione C: .... Esempio in C:
do { S1;
}
while (<espressione>);
Relazione tra do-while e while ...
S1;
while (<espressione>) {
S1;
}
.... è equivalente a: .... è equivalente a:
do {
scanf (“%d”, &Num);
}
while (Num!=0);
scanf (“%d”, &Num);
while (Num!=0) {
scanf(“%d”, &Num);
}
.... Esempio in C:
.... con notazione C:
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 57
repeat S1;
until (<espressione>);
Relazione tra repeat-until e while ...
S1;
while ( not <espressione>) S1;
.... è equivalente a: .... è equivalente a:
repeat
a=a+1;
until (a>35);
a=a+1;
while ( a<=35) a=a+1;
.... con notazione LDP:
Relazione tra while e repeat-until ...
while (<espressione>) S1;
.... è equivalente a:
if (<espressione>) repeat
S1;
until (not <espressione>);
.... è equivalente a:
while ( x < 26) x=x+y;
if ( x < 26 ) repeat
x=x+y;
until ( x>=26 );
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 59
Strutture ripetitive
…. strutture del tipo
per N volte esegui S;
N è un intero
S è un’istruzione o una sequenza di istruzioni Strutture Ciclo
semantica:
S viene eseguita N volte prima di procedere con la esecuzione della prima istruzione successiva alla struttura
In quasi tutti i linguaggi è presente nella forma a “conteggio delle ripetizioni” (ciclo a conteggio) ...
… linguaggi diversi offrono forme diverse di tale struttura...
Ciclo a conteggio
for (<espressione1>; <condizione>; <espressione2>) S;
• <espressione1>: è l’espressione usata per inizializzare la variabile di controllo del ciclo
Conta i ‘passi’ del ciclo
• <condizione>: è l’espressione logica per verificare la terminazione del ciclo
verifica se la variabile di controllo ha raggiunto il massimo numero di ‘passi’
• <espressione2>: è l’espressione usata per determinare il passo di incremento della variabile di controllo
• S è l’istruzione, o la sequenza, che deve essere ripetuta
Strutture Ciclo - LDP
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 61
Ciclo a conteggio: un tipico formato
for (cont = inf; cont <= sup ; cont = cont + step) S;
cont, inf, sup e step sono, tipicamente, variabili di tipo intero, o comunque di un tipo ordinato;
S è la sequenza da ripetere;
step > 0 (per la convergenza del ciclo)
• se inf > sup il ciclo non viene percorso e la sequenza S non viene eseguita;
• se inf <= sup, S viene eseguita un numero di volte pari a ((sup - inf) / step) +1;
• la prima volta con cont = inf,
• la seconda con cont = inf + step,
• la terza con cont = inf + 2 * step, ...
• il ciclo termina quando cont > sup
• cont, inf, sup e step possono essere usati in S ma il loro valore non va modificato
• il valore di cont deve essere ridefinito se la variabile viene usata dopo il ciclo
Strutture Ciclo
S0;
for (cont = inf; cont <= sup ; cont = cont + step) S1;
S2;
la sequenza è ripetuta ((5-1)/1)+1 = 5 volte la possibile sequenza è:
S0 S1 S1 S1 S1 S1 S2
for (cont = 1; cont <= 5 ; cont = cont + 1) S1;
Se inf=1; sup=5; step=1 Cont=inf
S2 Cont<=sup
vero
falso
S1 S0
Cont=cont+step
Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio 63
Ciclo a conteggio: un altro tipico formato
for (cont = inf; cont >= sup ; cont = cont - step) S;
cont, inf, sup e step sono, tipicamente, variabili di tipo intero, o comunque di un tipo ordinato;
S è la sequenza da ripetere;
step > 0 (per la convergenza del ciclo)
• se inf < sup il ciclo non viene percorso e la sequenza S non viene eseguita;
• se inf =
>
sup, S viene eseguita un numero di volte pari a (|(sup - inf)| / step) +1;• la prima volta con cont = inf,
• la seconda con cont = inf - step,
• la terza con cont = inf – (2 * step), ...
• il ciclo termina quando cont < sup
Strutture Ciclo
Esempio: for (cont = 4; cont >= 1 ; cont = cont - 1) S1;
C - Strutture di controllo
Ciclo ripetitivo (a conteggio)
for (<espressione1>; <condizione>; <espressione2>) <istruzione>;
for (<espressione1>; <condizione>; <espressione2>) {
<istruzioni>;
}
<espressione1>: è l’espressione usata per inizializzare la variabile di controllo del ciclo
<condizione>: è l’espressione logica per verificare la terminazione del ciclo
<espressione2>: è l’espressione usata per determinare il passo di incremento della variabile di controllo
Es:
for (i=1; i<100; i++) printf(“%d “, i);
65 Elementi di Informatica
Prof. G. A. Di Lucca - Univ. del Sannio
#include <stdio.h>
main () {
int Num, i;
printf( "immetti un numero \n”);
scanf(“%d” , &Num);
for (i=1;i<=10;i++)
printf ( “%d \n”, Num*i);
}
Esempio Ciclo for
x<=5
x printf("%d\n",x)
{………
int x;
for (x=1; x<=5; x++) printf("%d\n",x);
printf(”FINE”);
………
}
Esempio
x=1
x++
x<=5 vero
falso
printf("%d\n",x)
printf(”FINE”)
si
1 1
si
3 3
si
2 2
si
4 4
si
5 5
no
6 FINE
Elementi di Informatica Prof. G. A. Di Lucca - Univ. del Sannio
X > 1
x printf("%d\n",x)
67
{………
int x;
for (x=5; x > 1; x--) printf("%d\n",x);
printf(”FINE”);
………
}
Esempio
X=5
X-- X>1 vero
falso
printf("%d\n",x)
printf(”FINE”)
si 5
si
3 3
4 si 4
si
2 2
no
1 FINE
5