• Non ci sono risultati.

Strutture Ciclo

N/A
N/A
Protected

Academic year: 2021

Condividi "Strutture Ciclo"

Copied!
46
0
0

Testo completo

(1)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 1

Consentono di realizzare cicli di elaborazione, ossia la esecuzione ripetuta di una specificata sequenza di istruzioni:

… Esempi …

cercare una parola in un dizionario

si continua a sfogliare le pagine del dizionario fin quando non è trovata la parola voluta

superare un esame universitario

si ripete a “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

calcolare le paghe dei dipendenti di una azienda

noto il numero N dei dipendenti, ripetere N volte la sequenza di “calcolo della paga”

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

(2)

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

(3)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 5

Ciclo a condizione iniziale while (<espressione>)

begin S;

end;

<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) begin S1;

end;

S2;

possibili sequenze sono:

S0 S2 S0 S1 S2 S0 S1 S1 S2 S0 S1 S1 S1 S2

………..

Strutture Ciclo

Ciclo a condizione iniziale

la struttura è 1 in / 1 out S0

S2 E vero

falso

S1

(4)

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 … ...

while (X > 0) begin A = B + C;

end;

… si ‘resta’ in loop infinito poiché il valore di X non viene modificato da nessuna istruzione che forma il corpo del while...

Strutture Ciclo

Ciclo a condizione iniziale

Esempi:

(5)

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 midificato 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) ed essa è vera se ha un valore diverso da zero

a condizione iniziale while (<condizione>)

<istruzione>;

(6)

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, in input da tastiera, una sequenza di numeri interi di lunghezza non nota a priori ma terminante con il numero 0 (che non fa parte della sequenza), 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

(7)

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

< > 0 MAX = 12 12

5 < >0 5 > MAX = 12 ? 47 < >0 47 > MAX = 12 ? 12 5

33 47

0 … prendo il I numero

… … …. …

… … …. …

0 < > 0 FALSO !! MAX = 82

Falso MAX = 12 Vero MAX = 47 33 < > 0 33 > MAX = 47 ? Falso MAX = 47

82 < > 0 82 > MAX = 47 ? Vero MAX = 82

prendo il numero successivo

(8)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 15

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, cioè si assegna a MAX il valore di Num, ovvero MAX = 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 ed il suo confronto con il massimo fin quando non è immesso il valore zero;

quando per Num è immesso il valore zero si stampa il valore di MAX

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;

} // fine while

printf ( "Il valore massimo è %d \n”, MAX );

} // fine else

(9)

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 è 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 );

} }

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 ?

(10)

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) {

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

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 …

(11)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 21

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

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

(12)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 23

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

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

(13)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 25

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

#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

(14)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 27

Esempio Analisi e Specifica

Definizione del problema: Dato in input il valore di N, numero intero maggiore di zero, calcolare

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 ovvero la sommatoria dei numeri da 1 a N

Esempio

Nome variabile Descrizione Tipo N estremo superiore della sommatoria INT

Nome variabile Descrizione Tipo

Sommatoria Sommatoria LONGINT 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

(15)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 29

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

#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\n”) printf (” 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);

}

(16)

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\n”) printf (” 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\n”) printf (” 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 …

(17)

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

(18)

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

(19)

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;

(20)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 39

………

int x=8;

do

write("%d",x);

x=x+1;

while(x<7) write(”FINE”);

………

Esempio

8 8

x<7

x write("%d\n",x)

x=8

x<7 falso vero

write(”FINE”) write("%d\n",x)

x=x+1;

9 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 Strutture Ciclo

Ciclo a condizione finale

(21)

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

<istruzione/i>

mentre <espressione> risulta vera;

La ripetizione dell’esecuzione di <istruzione/i>

termina quando

<espressione> è falsa

#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 in C

Se immesso 87 per Num ==> Numero= 107 Se immesso 105 per Num ==> Numero= 115

… corpo ciclo eseguito comunque 1 volta …

Se immesso 64 per Num ==> Numero= 104

… corpo ciclo eseguito 4 volte …

… corpo ciclo eseguito 2 volte …

(22)

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

(23)

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

(24)

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

Esempio - il programma in C

#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 ( )

#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);

… con ciclo do … while ( )

(25)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 49

do { S1;

}

while (<espressione>);

Riepilogo strutture while e do-while in C

.... esempio:

do {

scanf((“%d”, &Num);

}

while (Num!=0);

printf(“Num = %d”, Num);

while (<espressione>) {

S1;

}

.... esempio:

Num = 0;

while (Num < 10) {

Num++;

}

printf(“Num = %d”, Num);

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:

(26)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 51

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:

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:

(27)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 53

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 );

Esempio

Definizione dei dati del problema:

I: N numero intero indicante il numero di cui è effettuata la produttoria;

Pi: N>0

U: la produttoria di N

Pu: la produttoria è maggiore di 0 Analisi e Specifica

Definizione del problema: Dato in input il valore di N, numero intero maggiore di zero, calcolare la produttoria di N

(28)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 55

Esempio

Nome variabile Descrizione Tipo N estremo superiore della sommatoria INT

Nome variabile Descrizione Tipo

Produttoria produttoria LONGINT

Tabella delle variabili di ingresso

Tabella delle variabili di uscita

Nome variabile Descrizione Tipo i indice elemento produttoria e di controllo di ciclo INT Tabella delle variabili di algoritmo

Esempio

Progettazione

Descrizione del metodo di elaborazione:

è letto il valore di N, la lettura è ripetuta se N=<0 si inizializza il valore di Produttoria a uno

si inizializza opportunamente l’indice di controllo della produttoria si ripete :

il valore attuale di Produttoria è moltiplicato per il valore attuale dell’indice di controllo della produttoria

si incrementa di uno il valore dell’indice finché il valore dell’indice è minore di N

alla fine del ciclo si visualizza il valore di Produttoria

(29)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 57

#include<stdio.h>

main()

{// Calcola la Produttoria di N int i, N;

float Produttoria; // float per evitare lo overflow // legge il valore di N finché non è maggiore di zero do

{ printf ("Immetti il valore di N \n");

scanf("%d", &N);

}

while (N<=0);

Esempio - il programma in C

// calcolo della produttoria usando un ciclo iterativo while(… ) // si inizializza il valore di Produttoria a uno

Produttoria = 1;

i=1;

while (i<=N)

{ Produttoria= Produttoria

*

i;

i++;

}

printf(" Produttoria = %f \n", Produttoria);

}

(30)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 59

// calcolo della produttoria usando un ciclo iterativo do … while(… ) // si inizializza il valore di Produttoria a uno

Produttoria = 1;

i=1;

do

{ Produttoria= Produttoria

*

i;

i++;

}

while (i<=N);

printf(" Produttoria= %f \n", Produttoria );

}

// calcolo della produttoria usando un ciclo iterativo do … while(… ) // incrementando i prima del calcolo di Produttoria

// si inizializza il valore di Produttoria a uno Produttoria = 1;

i=0;

do { i++;

Produttoria= Produttoria

*

i;

}

while (i<N); // (i < N) e non (i<=N ) perché ora i è prima // incrementato e poi moltiplicato con Produttoria printf(" Produttoria= %f \n", Produttoria );

}

(31)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 61

Esempio Analisi e Specifica

Definizione del problema: fornito in input un numero intero, diverso da zero, 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 valore 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

(32)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 63

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, diverso da zero \n”);

scanf(“%d”, &Cerca);

}

while (Cerca==0);

(33)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 65

Volte=0;

do

{ printf ("immetti un numero della sequenza (zero per finire) \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

Esempio Analisi e Specifica

Definizione del problema: data in input una sequenza non vuota di numeri interi, terminante con il numero 0, calcolare la media 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; la sequenza contiene almeno un

numero

U: la media dei numeri immessi

Pu:

(34)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 67

Esempio

Nome variabile Descrizione Tipo Num numero intero della sequenza INT

Nome variabile Descrizione Tipo media la media dei numeri immessi FLOAT

Tabella delle variabili di ingresso

Tabella delle variabili di uscita

Nome variabile Descrizione Tipo sommatoria sommatoria dei numeri immessi LONGINT conta conta quanti numeri sono immessi INT Tabella delle variabili di algoritmo

Esempio

Progettazione

Descrizione del metodo di elaborazione:

• è letto il valore del primo numero della sequenza non vuota di interi, se il valore è uguale a zero si ripete la lettura fino all’immissione di un valore diverso da zero;

• si inizializzano le variabili sommatoria e conta a zero;

(a) si avvia un ciclo a condizione finale:

• Si incrementa di 1 il valore della variabile conta

• il valore della variabile sommatoria è incrementato del valore di Num: sommatoria = sommatoria + Num;

• si richiede l’immissione del successivo numero nella sequenza, assegnandolo alla variabile Num

• mentre Num è diverso da zero si ritorna a rieseguire il ciclo dal punto (a)

ovvero si continua ad incrementare le variabili conta e sommatoria e ad effettuare la lettura di un nuovo numero fin quando non è immesso il valore zero per Num;

Si calcola il valore della media: media = sommatoria / conta;

Si stampano: i valori delle variabili sommatoria, conta e media

(35)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 69

#include<stdio.h>

main()

{ /* Calcola la media di una sequenza di numeri interi terminante con zero*/

int Num, conta = 0;

long Sommatoria = 0;

float media;

do

{ printf( "immetti un numero intero diverso da zero\n");

scanf("%d", &Num);

}

while (Num == 0); // la sequenza deve contenere almeno un numero

Esempio - il programma in C

do

{ conta++;

Sommatoria = Sommatoria + Num;

printf ("immetti un numero \n");

scanf("%d" , &Num);

}

while (Num != 0);

media = Sommatoria / conta;

printf ( "Immessi %d numeri\n “, conta);

printf ( “Sommatoria = %d \n", Sommatoria );

printf("\n Media = %f \n", media);

system("Pause");

}

Esempio - il programma in C

(36)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 71

... media = 5.00000 ???

... ma media = 23 / 4 = 5.75 !!!!

... Qualcosa non va !

media = Sommatoria / conta

... Sommatoria e conta sono variabili di tipo intero

Il risultato della divisione (tra due interi) è quindi un numero intero, ovvero è troncata la parte decimale ... anche se media è di tipo reale Bisogna ‘forzare’ Sommatoria e conta ad essere ‘visti’ come tipo reale

(37)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 73

Operatore di cast in C

C permette di forzare una variabile di un tipo a ‘comportarsi’ come una variabile di un altro tipo usando l'operatore di cast.

Il costrutto cast ha la seguente sintassi:

(<nome tipo da forzare>) <espressione>

Es. : int X=10; (float) X ==> 10.00 Es. int numero_intero = 7;

float num_reale;

num_reale = (float) numero_intero/2;

fa ‘vedere’ la variabile numero_intero come se fosse di tipo float

num_reale = 3.5000 Senza il cast:

num_reale = 3.0000

Operatore di cast in C

Esempio:

#include<stdio.h>

main ( )

/* programma esempio CAST */

{ int numero_intero = 7;

float num_reale;

printf("numero con formato decimale = %d\n", numero_intero);

printf("\nnumero intero con formato float = %f\n\n", numero_intero);

printf("numero intero con cast float = %f\n", (float) numero_intero );

num_reale = numero_intero/2;

printf("\n Risultato divisione senza cast : numero reale = %f \n", num_reale);

num_reale = (float) numero_intero/2;

printf("\n Risultato divisione applicando il cast : numero reale = %f \n", num_reale);

system("Pause");

}

(38)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 75

Operatore di cast in C

il numero è un intero, ma formato è float … Stampato come float, riportati i decimali dopo la virgola

… divisione tra numeri interi, parte decimale troncata …

… il cast fa ‘vedere’

il numero come se fosse un float …

… come se fosse divisione tra float …

Operatore di cast in C

Alcune operazioni di cast di tipo sono fatte automaticamente, principalmente in relazione alle capacità dei numeri interi, ad esempio assegnando un valore float ad una variabile di tipo int (è automaticamente troncata la parte decimale)

E' opportuno eseguire esplicitamente operazioni di cast tutte le volte che si ha un dubbio sulla corrispondenza tra i tipi in operazioni di calcolo ed assegnazione.

E’ il caso delle divisioni: se abbiamo la divisione tra due numeri interi e vogliamo che il risultato sia un numero reale, allora deve essere eseguito il cast sui due numeri interi.

Esempio:

int dividendo= 13, divisore = 4;

float risultato;

risultato = (float) dividendo / (float) divisore;

… sarà: risultato = 3.25

… e NON risultato = 3.0 come risulterebbe dalla divisione intera:

risultato = dividendo / divisore;

(39)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 77

Esempio - il programma in C

do

{ conta++;

Sommatoria = Sommatoria + Num;

printf ("immetti un numero \n");

scanf("%d" , &Num);

}

while (Num != 0);

media = (float) Sommatoria / (float) conta;

printf ( "Immessi %d numeri\n “, conta);

printf ( “Sommatoria = %d \n", Sommatoria );

printf("\n Media = %f \n", media);

system("Pause");

}

(40)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 79

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 ...

… quella più diffusa è il cosiddetto ciclo ‘for’

Ciclo a conteggio

for (<espressione1>; <condizione>; <espressione2>)

S

;

• <espressione1>: è l’espressione usata per inizializzare la variabile di controllo del ciclo

la variabile di controllo conta i ‘passi’ del ciclo, cioè quante volte è stato eseguito

• <condizione>: è l’espressione logica per verificare la terminazione del ciclo

verifica se la variabile di controllo ha raggiunto il numero prefissato di ‘passi

• <espressione2>: è l’espressione usata per determinare il l’incremento della variabile di controllo

• S è l’istruzione, o la sequenza, che deve essere ripetuta

Strutture Ciclo - LDP

(41)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 81

Ciclo a conteggio: un tipico formato

for (cont = inf; cont < = sup ; cont = cont + step)

S;

cont è tipicamente una variabile di tipo intero, o comunque di un tipo ordinato; conta quante volte il ciclo è ripetuto

inf, sup e step sono espressioni, variabili o costanti S è la sequenza di istruzioni da ripetere;

La sequenza S è eseguita un numero predefinito di volte dato da:

((sup - inf) / step) +1;

deve essere step > 0 (per la convergenza del ciclo)

… spesso step = 1

Es. for (cont = 1; cont <= 10 ; cont = cont + 1)

S;

S è ripetuta 10 volte

Strutture Ciclo

Ciclo a conteggio: un tipico formato

for (cont = inf; cont <= sup ; cont = cont + step) S;

• se inf <= sup, S viene eseguita

• 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

• Se inizialmente è già inf > sup il ciclo non viene percorso e la sequenza S non viene eseguita;

• cont, inf, sup e step possono essere usati in S ma il loro valore non va modificato in S

• il valore di cont deve essere ridefinito se la variabile viene usata dopo il ciclo

Strutture Ciclo

(42)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 83

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 la struttura è 1 in / 1 out

for (cont = 1; cont <= 5 ; cont = cont + 1) S1;

Supponendo: inf=1; sup=5; step=1

Cont=inf

S2 Cont<=sup

vero

falso

S1 S0

Cont=cont+step

Ciclo a conteggio: un altro tipico formato

for (cont = inf; cont >= sup ; cont = cont - step)

S;

ciclo a decremento della variabile di controllo

• 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

• Se inizialmente inf < sup il ciclo non viene percorso e la sequenza S non viene eseguita;

Strutture Ciclo

Es. for (cont = 4; cont >= 1 ; cont = cont - 1) S1;

(43)

Elementi di Informatica

Prof. G. A. Di Lucca - Univ. del Sannio 85

S0;

for (cont=inf; cont >= sup ; cont=cont - step) S1;

S2;

la sequenza è ripetuta ( |1-5| / 1 ) + 1 = 5 volte la possibile sequenza è:

S0 S1 S1 S1 S1 S1 S2 la struttura è 1 in / 1 out

for (cont = 5; cont <= 1 ; cont = cont - 1) S1;

Supponendo: inf=1; sup=5; step=1

Cont=inf

S2 Cont>=sup

vero

falso

S1 S0

Cont=cont - step

C - Strutture di controllo

Ciclo ripetitivo (a conteggio)

for (<espressione1>; <condizione>; <espressione2>) <istruzione>;

for (<espressione1>; <condizione>; <espressione2>) {

<istruzioni>;

}

<espressione1>: inizializza la variabile di controllo del ciclo

<condizione>: verifica la terminazione del ciclo

<espressione2>: determina l’incremento della variabile di controllo Es: for (i=1; i<100; i++)

printf(“%d \n “, i); // stampa i numeri da 1 a 99

(44)

87 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= 2;i<=10;i++)

printf ("%d \n", Num*i);

}

Esempio Ciclo for

… stampa i multipli da 2 a 10 di Num …

x<=5

x printf("%d\n",x*x)

{………

int x;

for (x=1; x<=5; x++)

printf("%d\n",x*x);

printf(”FINE”);

………

}

Esempio

x=1

x++

x<=5 vero

falso

printf("%d\n",x*x)

printf(”FINE”)

si

1 1

si

3 9

si

2 4

si

4 16

si

5 25

no

6 FINE

Riferimenti

Documenti correlati

[r]

ƒ restituisce un puntatore che contiene l’indirizzo del blocco di memoria allocato, cioè della variabile, la quale sarà quindi accessibile dereferenziando il puntatore. ƒ la

• è 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

• I puntatori (pointer) sono “type bound” cioè ad ogni puntatore è associato il tipo della variabile cui il puntatore si riferisce. • In C, nella dichiarazione di un

Nome variabile Descrizione Tipo i indice elemento sommatoria e di controllo di ciclo INT Tabella delle variabili di algoritmo.. Elementi

Nome variabile Descrizione Tipo sommatoria sommatoria dei numeri immessi LONGINT conta conta quanti numeri sono immessi INT Tabella delle variabili

Definizione del problema: Dato in input il valore di N, numero intero maggiore di zero, calcolare la media di una sequenza di N numeri interi immessi dall’utente. Definizione dei

L’acqua presente nelle nuvole scende sulla terra sotto forma di vento. Pioggia, neve e grandine sono dette