+ All Categories
Home > Documents > Corso di Laurea Ingegneria Civile Fondamenti di...

Corso di Laurea Ingegneria Civile Fondamenti di...

Date post: 17-Feb-2019
Category:
Upload: vudieu
View: 214 times
Download: 0 times
Share this document with a friend
63
Dall’analisi alla codifica (2) 1 Corso di Laurea Ingegneria Civile Fondamenti di Informatica Dispensa 10 Dall’analisi alla codifica (2) Aprile 2010
Transcript

Dall’analisi alla codifica (2) 1

Corso di Laurea Ingegneria Civile

Fondamenti di Informatica

Dispensa 10

Dall’analisi alla codifica (2)

Aprile 2010

2

Contenuti

Problemi di ingresso e uscita (esempi ed esercizi)

• Lunghezza di una sequenza

• Perimetro di un triangolo

• Equazioni di primo e secondo grado

• Elevamento a potenza

• Media aritmetica di una sequenza di numeri interi

• Numero di zeri di una sequenza di numeri interi

• Somma di una sequenza di 10 numeri interi

• Massimo di una sequenza di 10 numeri interi

• Somma dei primi n numeri interi dispari

• Escursione dei valori in una sequenza

• Divisori di un numero

• Generazione di n numeri random

Dall’analisi alla codifica (2) 2

Esercizi

Per tutti gli esercizi che seguono eseguire i seguenti

passi (se non sono presenti):

Definire la specifica del problema indicando sinteticamente:

• Il problema

• i dati di input

• Le pre-condizioni che devono soddisfare I dati di input

• I dati di output

• Le post-condizioni che devono soddisfare I dati di output

Scrivere l’algoritmo risolutivo in pseudo-codice

Scrivere l’algoritmo risolutivo con il diagramma a blocchi

Scrivere la traccia del processo di esecuzione per almeno un dato

insieme di dati di input

Scrivere la codifica Java ed esegure il programma su diversi dati

di input

3

4

Lunghezza di una sequenza

Si consideri ora il seguente problema di ingresso-

uscita

• si vuole leggere dalla tastiera una sequenza di

numeri interi, disposti su una singola linea e

separati da spazi, calcolare la lunghezza della

sequenza (ovvero, il numero di elementi della

sequenza) e visualizzarla sullo schermo

Scrivi una sequenza di numeri interi

10 15 0 -2

La lunghezza della sequenza è 4

Dall’analisi alla codifica (2)

5

Lunghezza di una sequenza

Problema• lettura di una sequenza di numeri interi e calcolo della lunghezza

Dati di ingresso• una sequenza di numeri interi A1, A2, ..., AN

Pre-condizione • N>=0, i numeri sono disposti su una singola linea e separati da spazi

Dati di uscita • un numero L

Post-condizione • L è uguale alla lunghezza N della sequenza A1, A2, ..., AN

Dall’analisi alla codifica (2)

6

Lunghezza di una sequenza

Una variante del problema della lettura e somma di

una sequenza di numeri interi • bisogna leggere dalla tastiera una sequenza di numeri interi

– ma non bisogna calcolarne la somma

– bisogna piuttosto contare il numero degli elementi

È possibile scrivere un algoritmo come adattamento di

quello della somma di una sequenza di numeri – non

ripartendo da zero• anziché gestire la variabile somma

• va gestita una variabile lunghezza che

– inizialmente deve valere zero

– ogni volta che viene letto un elemento deve essere incrementata di uno

• lunghezza viene usata per contare il numero degli elementi della

sequenza che sono stati letti – al termine, è uguale alla lunghezza della sequenza

Dall’analisi alla codifica (2)

7

Algoritmo per il calcolo della lunghezza

di una sequenza (pseudocodifica)

1. leggi una sequenza di numeri interi e calcolane la lunghezza lunghezza

1.1 inizialmente lunghezza vale zero

lunghezza = 0;

1.2 finché ci sono altri elementi nella sequenza, leggili e

incrementa lunghezza

while ( !Lettore.in.eoln() ) {

leggi un elemento della sequenza numero dalla tastiera

numero = Lettore.in.leggiInt();

incrementa lunghezza

lunghezza = lunghezza + 1;

}

2. visualizza lunghezza

System.out.println(lunghezza);

Dall’analisi alla codifica (2)

iterazione

assegnazione

Fine

selezione

input (A1,…,An)

Ai = numero letto

l = l+1

scrivi l

Ci sono ancora

numeri da leggere?

No

Si

l = 0

Algoritmo per il calcolo della lunghezza

di una sequenza (diagramma a blocchi)

8

import fiji.io.*;

/* Applicazione che calcola la lunghezza di una sequenza di numeri dati in input */

class LunghezzaSequenza{

public static void main(String[] args){

int num;

int l;

//precondizioni sequenza non vuota

l=0;

System.out.println("Scrivi una sequenza non vuota di numeri interi");

/* finche' non viene dato invio */

while (!Lettore.in.eoln()){

/*lettura di un numero ad ogni iterazione */

num = Lettore.in.leggiInt();

l=l+1;

}

System.out.print("lunghezza calcolata ");

System.out.println(l);

}}

9

Lunghezza di una sequenza: codifica

Dall’analisi alla codifica (2)

Problema

Calcolare il perimetro di un triangolo date le

coordinate dei suoi vertici

Input

coordinate dei vertici x1,y1 – x2,y2 – x3,y3

Pre-condizioni

Coordinate dei vertici tutte positive

Output

perimetro

Post-condizioni

….

Perimetro di un triangolo

Dall’analisi alla codifica (2) 10

input (x1,y1,x2,y2,x3,y3)

d12=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

d13=sqrt((x1-x3)*(x1-x3)+(y1-y3)*(y1-y3))

d23=sqrt((x2-x3)*(x2-x3)+(y2-y3)*(y2-y3))

perimetro = d12 + d13 + d23

Scrivi perimetro

Fine

Perimetro di un triangolo

assegnazione

11

import fiji.io.*;

/* Applicazione che calcola e visualizza

* il perimetro di un triangolo. */

class PerimetroTriangolo {

public static void main(String[] args) {

double x1, y1; // coordinate primo vertice

double x2, y2; // coordinate secondo vertice

double x3, y3; // coordinate terzo vertice

double d12, d13, d23; // distanze tra i vertici

double perimetro; // perimetro del triangolo

/* imposta le coordinate dei vertici */

System.out.println("CALCOLO DEL PERIMETRO DI UN TRIANGOLO");

System.out.println("scrivi le coordinate del primo vertice");

x1 = Lettore.in.leggiInt();

y1 = Lettore.in.leggiInt();

System.out.println("scrivi le coordinate del secondo vertice");

x2 = Lettore.in.leggiInt(); y2 = Lettore.in.leggiInt();

System.out.println("scrivi le coordinate del terzo vertice");

x3 = Lettore.in.leggiInt(); y3 = Lettore.in.leggiInt();

... segue ...

A che serve? Indica che la

classe usa classi del

package fiji.io, in

particolare

Perimetro di un triangolo

Dall’analisi alla codifica (2) 12

... segue .../* calcola la distanza tra p1 e p2 */

d12 = Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));

d13 = Math.sqrt((x1-x3)*(x1-x3) + (y1-y3)*(y1-y3));

d23 = Math.sqrt((x2-x3)*(x2-x3) + (y2-y3)*(y2-y3));

/* calcola il perimetro del triangolo */

perimetro = d12 + d13 + d23;

/* visualizza il perimetro */

System.out.print("Il perimetro del triangolo e' ");

System.out.println(perimetro);

}

} System.out sa eseguire anche una operazione print,

che visualizza l’argomento, ma senza poi andare a

capo (come fa println)

Esiste un metodo che calcola la potenza?

Math.pow (vedere documentazione classe Math)

Perimetro di un triangolo

Dall’analisi alla codifica (2) 13

Equazioni di 1° e 2° grado

Problema

Calcolo delle radici di un’equazione di primo o secondo

grado

Input

i coefficienti a, b, c dell’equazione ax*x+bx+c

Pre-condizioni

Coordinate dei vertici tutte positive

Output

le radici dell’equazione x1 e x2, oppure segnalazione di

non esistenza di radici

Post-condizioni

a*x1*x1 + b*x1 + c = 0 e a*x2*x2 + b*x2 + c = 0

Dall’analisi alla codifica (2) 14

x2 =

(-b - sqrt(delta))/2*a

input (a,b,c)

a = 0Si

Scrivi

“no soluzione”

Nob = 0

Si

x1 = -c/b

Scrivi

“1 soluzione”,x1

No

delta = b*b-4*a*c

delta < 0

Scrivi

“no soluzione”

No

x1 =

(-b + sqrt(delta))/2*a

Si

Scrivi x1 e x2

Fine

assegnazione

selezione

Equazioni di 1° e 2° grado

Dall’analisi alla codifica (2) 15

Programma: Calcolo radici equazione di 1° e 2° grado

Variabili: double a, b, c, delta, x1, x2;

Istruzioni: input(a,b,c)

if (a==0){

if (b==0)

scrivi(“non esistono soluzioni”);

else{

x1 = -c/b;

scrivi(“unica soluzione”, x1);

}

}

else{

delta = b*b - 4*a*c;

if (delta < 0)

scrivi(“non esistono soluzioni”);

else{

x1 = (-b + sqrt(delta))/2*a;

x2 = (-b - sqrt(delta))/2*a;

scrivi(“soluzioni: ”, x1, x2);

}

}

Equazioni di 1° e 2° grado

Dall’analisi alla codifica (2) 16

import fiji.io.*;

/** Applicazione che calcola le radici reali delle equazioni di secondo grado */

class Equazioni2grado{

public static void main(String[] args){

double a,b,c; //coefficenti dell'equazione

double delta; //valore del delta

double x1,x2; //radici reali, se esistono

/*lettura dei coefficienti da input */

System.out.println("Scrivi i coefficienti dell'equazione");

a = Lettore.in.leggiDouble();

b = Lettore.in.leggiDouble();

c = Lettore.in.leggiDouble();

Equazioni di 1° e 2° grado

Dall’analisi alla codifica (2) 17

if (a==0){

if (b==0)

System.out.println("l'eq. non ha soluzioni");

else{

x1 = -c/b;

System.out.println("l'eq. ha 1 sola soluzione");

System.out.println(x1);

}

}

else{ //a<>0

/* calcolo del delta */

delta = b*b-4*a*c;

/* verifica se il delta e' positivo o nullo */

if (delta<0)

System.out.println("l'equazione non ammette soluzioni");

else{

x1 = (-b+Math.sqrt(delta))/(2*a);

x2 = (-b-Math.sqrt(delta))/(2*a);

System.out.print("le soluzioni sono ");

System.out.print(x1);

System.out.print(" e ");

System.out.println(x2);}

}}}}

Equazioni di 1° e 2° grado

Dall’analisi alla codifica (2) 18

Elevamento a potenza

Problema Calcolare l’elevamento a potenza tra numeri

naturali positivi (o nulli)

Input Base, esp

Pre-condizioni interi positivi o nulli

Output pot

Post-condizioni pot = baseesp

Dall’analisi alla codifica (2) 19

iterazione

assegnazione

Scrivi “errore”

Fine

selezioneinput (base,esp)

pot = pot * base

esp = esp - 1

scrivi pot

esp > 0 No

Si

base==0 and

esp==0

SiNo

pot = 1

Elevamento a potenza

Dall’analisi alla codifica (2) 20

Programma: Elevamento a potenza

Variabili: int base;

int esp;

int pot;

Istruzioni: 1. input(base, esp)

2. if (base==0 AND esp ==0)

3. scrivi(“errore”);

else{

4. pot = 1;

5. while (esp > 0) {

6. pot = pot * base;

7. esp = esp – 1;

}

8. scrivi pot;

}

Elevamento a potenza

Dall’analisi alla codifica (2) 21

Istruzione base esp pot

1. 3 2

2. 3 2

4. 3 2 1

5. 3 2 1

6. 3 2 3

7. 3 1 3

5. 3 1 3

6. 3 1 9

7. 3 0 9

5. 3 0 9

8. 3 0 9

La variabile pot contiene il valore della potenza

Elevamento a potenza:

traccia del processo di esecuzione

Dall’analisi alla codifica (2) 22

import fiji.io.*;

/* elevamento a potenza tra numeri naturali positivi (o nulli) */

class Potenza

{

public static void main(String[] args)

{

/* Definizione variabili */

int base; // base

int esp; // esponente

int pot; // risultato

/** Corpo programma **/

System.out.println("elevamento a potenza:");

System.out.print("base: ");

base = Lettore.in.leggiInt();

System.out.print("esponente:");

esp = Lettore.in.leggiInt(); ... segue ...

Elevamento a potenza: codifica

Dall’analisi alla codifica (2) 23

... segue ...if ((base == 0) && (esp == 0))

System.out.println("errore");

else{

pot = 1;

while (esp > 0) {

pot = pot * base;

esp = esp - 1;

}

System.out.println("risultato = " + pot);

}

}

}

Elevamento a potenza

Dall’analisi alla codifica (2) 24

25

Esercizio

Scrivere un algoritmo che legge una sequenza

non vuota di numeri interi e ne calcola la media

aritmetica • la somma degli elementi diviso il numero degli elementi

Dall’analisi alla codifica (2)

26

Esercizio

Risolvere il seguente problema di ingresso-

uscita• leggere dalla tastiera una sequenza di numeri interi, disposti

su una singola linea e separati da spazi, calcolare il numero di

zeri della sequenza (ovvero, il numero di elementi della

sequenza che sono uguali a zero) e visualizzare il numero di

zeri sullo schermo

Scrivi una sequenza di numeri interi

10 15 0 -2

Il numero di zeri nella sequenza è 1

• bisogna usare l’istruzione if

27

Calcolo degli zeri di una sequenza

int numero; // elemento corrente della sequenza

int zeri; // numero di zeri nella sequenza

/* leggi una sequenza di numeri interi e

* calcolane il numero di zeri */

/* inizialmente zeri vale zero */

zeri = 0;

/* finché ci sono altri elementi nella sequenza,

* leggili e calcola il numero di zeri */

while (!Lettore.in.eoln()) {

/* leggi un elemento della sequenza */

numero = Lettore.in.leggiInt();

/* se numero è uguale a zero, incrementa zeri */

if (numero==0) // se numero è uguale a zero

/* incrementa zeri */

zeri = zeri + 1;

}

/* visualizza zeri */

System.out.println(zeri);

28

Somma di una sequenza di dieci numeri

Si consideri il seguente problema di ingresso-

uscita• si vuole leggere dalla tastiera una sequenza di numeri interi di

lunghezza fissata (ad esempio, di lunghezza dieci), calcolare

la somma degli elementi e visualizzarla sullo schermo

Scrivi una sequenza di dieci numeri interi

1 12 -13 2 0

-4 8 0 4 10

La somma dei dieci numeri è 20

29

Lettura e somma di una sequenza di

dieci numeri interi

Problema• lettura di una sequenza di dieci numeri interi e calcolo della somma

degli elementi

Dati di ingresso• una sequenza di dieci numeri interi A1, A2, ..., A10

Pre-condizione • nessuna

Dati di uscita • un numero S

Post-condizione • S è la somma degli elementi della sequenza A1, A2, ..., A10

30

Lettura e somma di una sequenza di

dieci numeri interi

Una soluzione poco parametrica e poco

modificabile • dieci variabili

• dieci istruzioni di lettura

• una somma di dieci valori

Soluzione parametrica basata su una

istruzione ripetitiva • si suppone che la lunghezza della sequenza sia nota a priori

• cerchiamo un algoritmo parametrico rispetto a questa

lunghezza

31

Lettura e somma di una sequenza di

dieci numeri interi

L’algoritmo può essere realizzato gestendo le

seguenti variabili • numero

– valore dell’elemento corrente della sequenza

• somma

– la somma degli elementi della sequenza che sono stati già letti

• numeriLetti

– il numero degli elementi della sequenza che sono stati già letti

La gestione delle variabili somma e

numeriLetti è come segue • inizialmente valgono entrambe zero

• per ogni numero letto

– somma deve essere incrementata di numero

– numeriLetti deve essere incrementata di uno

32

Algoritmo per la lettura e somma di dieci

numeri leggi una sequenza di dieci numeri interi e calcolane la somma

1.inizializza la somma e il numero di elementi letti

somma = 0;

numeriLetti = 0;

2.leggi i dieci elementi della sequenza e calcolane la somma

while ( ci sono altri elementi nella sequenza ) {

leggi un elemento numero della sequenza

numero = Lettore.in.leggiInt();

incrementa somma di numero

somma = somma + numero;

incrementa numeriLetti

numeriLetti = numeriLetti + 1;

}

Bisogna raffinare la condizione dell’istruzione ripetitiva • quante volte viene valutata la condizione?

• quanto vale numeriLetti durante ciascuna valutazione della condizione?

33

Algoritmo per la lettura e somma di dieci

numeri

inizializza la somma e il numero di elementi letti

somma = 0;

numeriLetti = 0;

leggi i dieci elementi della sequenza e calcolane la somma

while ( numeriLetti<10 ) {

leggi un elemento numero della sequenza

numero = Lettore.in.leggiInt();

incrementa somma di numero

somma = somma + numero;

incrementa numeriLetti

numeriLetti = numeriLetti + 1;

}

34

Programma per la lettura e somma di

dieci numeriint numero; // elemento corrente della sequenza int somma; // somma degli elementi della sequenza int numeriLetti; // numero degli elementi letti

/* leggi una sequenza di dieci numeri interi e * calcolane la somma */ /* inizializza la somma e il numero di elementi letti */somma = 0; numeriLetti = 0; /* leggi i dieci elementi della sequenza e* calcolane la somma */ while (numeriLetti < 10) { // ci sono altri elementi

/* leggi un elemento della sequenza */ numero = Lettore.in.leggiInt(); /* incrementa somma di numero */ somma = somma + numero; /* incrementa numeriLetti */ numeriLetti = numeriLetti + 1;

} /* visualizza somma */ System.out.println(somma);

35

Calcolo del massimo di dieci numeri

Si consideri il seguente problema di

ingresso-uscita

• si vuole leggere dalla tastiera una sequenza di numeri interi di

lunghezza fissata (ad esempio, di lunghezza 10), calcolare il

valore massimo degli elementi e visualizzarlo sullo schermo

Scrivi una sequenza di dieci numeri interi

1 12 -13 2 0 -4 8 0 4 10

Il valore massimo calcolato e’: 12

35

36

Calcolo del massimo di una sequenza di

10 numeri interi

Problema• lettura di una sequenza di 10 numeri interi e calcolo del valore

massimo degli elementi

Dati di ingresso• una sequenza di dieci numeri interi A1, A2, ..., A10

Pre-condizione • nessuna

Dati di uscita • un numero max

Post-condizione • max è il massimo degli elementi della sequenza A1, A2, ..., A10

36

37

Algoritmo per il calcolo del massimo tra

10 interi

L’algoritmo può essere realizzato gestendo le seguenti variabili

• num: valore dell’elemento corrente della sequenza

• cont: contatore degli elementi della sequenza già letti

• max: valore massimo degli elementi della sequenza già letti

La gestione delle variabili max e cont avviene come

segue • inizialmente cont vale 0

• leggi il primo numero num, assumilo provvisoriamente come valore del

massimo max e incrementa cont di uno

• per ogni numero num letto

– max deve essere confrontato con num ed eventualmente modificato

– cont deve essere incrementata di uno

37

38

Algoritmo per il calcolo del massimo tra

10 interiLeggi una sequenza di dieci numeri interi e calcolane il massimo:

1. inizializza il contatore dei numeri letti cont = 0;

2. leggi un numero num da input

3. inizializza max max = num;

4. incrementa il contatore dei numeri letti cont = cont + 1;

5. finché ci sono ancora numeri da leggere while (cont <= 9)5.1 leggi un numero num

5.2 confronta num con maxse num > max if (num > max)

memorizza il contenuto di num in max

max = num;

5.3 incrementa cont cont = cont + 1;

6. il risultato è max 38

39

Codifica per il calcolo del massimo tra

10 interi . . . . . .

int num; //numero letto

int max; //massimo calcolato

int cont; //contatore dei numeri letti

//precondizioni sequenza non vuota: almeno un elemento

/* inizializzazione del contatore */

cont = 0;

/* lettura del primo numero - fuori dal ciclo */

System.out.println("Scrivi una sequenza di 10 numeri interi");

num = Lettore.in.leggiInt();

/* appena leggo un numero incremento il contatore */cont = cont + 1;

/* essendo l'unico numero letto esso e' il massimo */

max = num;

. . .

39

40

. . . Codifica per il calcolo del massimo

tra 10 interi. . .

/* devono essere letti altri 9 numeri */

while (cont <= 9){

/* lettura di un numero ad ogni iterazione */

num = Lettore.in.leggiInt();

cont = cont+1;

/* se num e' maggiore del max, aggiorno max */

if (num > max)

max = num;

}

System.out.print(“Il valore massimo calcolato e’: ");

System.out.println(max);

. . .

40

41

Applicazione per il calcolo del massimo

tra 10 interi . . . import fiji.io.*;

/* Applicazione che calcola il massimo tra 10 numeri */

class Max10Numeri{

public static void main(String[] args){

int num; //numero letto

int max; //massimo calcolato

int cont; //contatore dei numeri letti

//precondizioni sequenza non vuota: almeno un elemento

/* inizializzazione del contatore */

cont = 0;

/* lettura del primo numero - fuori dal ciclo*/

System.out.println("Scrivi una sequenza di 10 numeri interi");

num = Lettore.in.leggiInt();

. . .

41

42

. . . Applicazione per il calcolo del

massimo tra 10 interi. . .

/* appena leggo un numero incremento il contatore */cont = cont + 1;

/*essendo l'unico numero letto esso e' il massimo */max = num;

/* devono essere letti altri 9 numeri */while (cont <= 9){

/*lettura di un numero ad ogni iterazione */num = Lettore.in.leggiInt();cont = cont + 1;/* se num e' maggiore del max, aggiorno max */if (num > max)

max = num;}System.out.print("valore massimo calcolato e’: ");System.out.println(max);

}}

42

43

Algoritmo per il calcolo del massimo tra

10 interiLeggi una sequenza di dieci numeri interi e calcolane il massimo:

1. inizializza il contatore dei numeri letti cont = 0;

2. leggi un numero num da input

3. inizializza max max = num;

4. incrementa il contatore dei numeri letti cont = cont + 1;

5. finché ci sono ancora numeri da leggere while (cont <= 9)5.1 leggi un numero num

5.2 confronta num con maxse num > max if (num > max)

memorizza il contenuto di num in max

max = num;

5.3 incrementa cont cont = cont + 1;

6. il risultato è max 43

Istruzione num cont max

1. 0

2. 5 0

3. 5 0 5

4. 5 1 5

5. 5 1 5

5.1. -1 1 5

5.2. -1 1 5

5.3. -1 2 5

5. -1 2 5

5.1. 7 2 5

5.2. 7 2 7

5.3. 7 3 7

5. 7 3 7

La variabile max contiene il valore del massimo della sequenza

Massimo tra 3 interi:

traccia del processo di esecuzione

Dall’analisi alla codifica (2) 44

Es. 5 -1 7

45

Somma dei primi n numeri interi

dispariProblema

• Scrivere un’applicazione che, dato un numero intero n, calcoli e visualizzi la somma dei primi n numeri dispari

Esempio• per n = 4 la somma dei primi 4 numeri dispari e’ 1+3+5+7=16

Dati di ingresso• un intero n

Pre-condizione • n >= 0

Dati di uscita • un numero somma

Post-condizione • somma è la somma dei primi n numeri dispari

45

46

Algoritmo: somma dei primi n numeri

interi dispariL’algoritmo può essere realizzato gestendo le seguenti variabili

• n - quantità di numeri dispari da sommare• somma - somma degli interi dispari • disp - numero dispari corrente

leggi da tastiera un numero intero n inizializza somma a zero inizializza il primo numero dispari disp a 1 usa la stessa variabile n come contatore: finché n > 0

aggiungi a somma il valore di disp incrementa disp di 2 (il prossimo numero dispari) decrementa n

visualizza il valore di somma

46

47

Codifica: somma dei primi n numeri

interi dispariint n; //numero totale di dispari da sommare e contatore

int disp; //numero dispari da sommare

int somma; //somma calcolata

//pre: n > 0

/*lettura del numero di elementi da sommare */

System.out.println("Scrivi il numero (>0)di elementi da sommare");

n = Lettore.in.leggiInt();

somma = 0;

disp = 1; //il primo num dispari

while (n > 0){

/* lettura di un numero ad ogni iterazione */

somma = somma + disp;

n = n - 1;

disp = disp + 2;

}

47

48

Applicazione: somma dei primi n numeri

interi dispariimport fiji.io.*;/* Applicazione che calcola la somma dei primi n numeri dispari */class SommaDispari{

public static void main(String[] args){int n; //numero totale di dispari da sommare e contatoreint disp; //numero dispari da sommareint somma; //somma calcolata

//pre: n > 0/* lettura del numero di elementi da sommare */System.out.println("Scrivi il numero di dispari da

sommare (>0)");n = Lettore.in.leggiInt();somma = 0;disp = 1; // il primo numero dispariwhile (n > 0){

/* lettura di un numero ad ogni iterazione */somma = somma + disp;n = n - 1;disp = disp + 2;

}System.out.print(“La somma dei primi "); System.out.print(n); System.out.print(“numeri dispari e’ "); System.out.println(somma);

}}

48

49

Escursione dei valori in una

sequenza

Problema• Scrivere un’applicazione che calcola l'escursione dei valori di una sequenza

di interi letta da tastiera

Esempio• Dati i valori 3 -1 2 4 -2 l’escursione e’ 7 (da -2 a 4)

Dati di ingresso• una sequenza di numeri interi

Pre-condizione • La sequenza è non vuota

Dati di uscita • Massimo, minimo ed escursione

Post-condizione

49

50

Algoritmo: escursione dei valori in una

sequenza• Inizializzo max e min:

– Leggo il primo elemento della sequenza

e lo memorizzo in num

– max = num

– min = num

• Finche’ non sono terminati gli elementi sulla linea di input– leggo un numero e lo memorizzo in num

– se num > max

allora aggiorno max con num

– se num < min allora

allora aggiorno min con num

• L’escursione è data da (max-min+1)

Se la sequenza e’ composta tutta da valori negativi ?

50

51

Codifica: escursione dei valori in una

sequenzaSystem.out.println(“Scrivi una sequenza non vuota di

numeri interi ");

num = Lettore.in.leggiInt();

max = num;

min = num;

/* finche' non viene dato invio */

while (!Lettore.in.eoln()){

/*lettura di un numero ad ogni iterazione */

num = Lettore.in.leggiInt();

/* se num e' maggiore del max, aggiorno max */

if (num > max)

max = num;

/* se num e' minore di min aggiorno min */

if (num < min)

min = num;

}

System.out.print("L'escursione della sequenza e' ");

System.out.println(Math.abs(max-min+1));51

52

Applicazione: escursione dei valori in

una sequenza

import fiji.io.*;

/* Applicazione che calcola l'escursione dei valori di una

sequenza di interi letta da input */

class Escursione{

public static void main(String[] args){

int num;

int max,min;

//precondizioni sequenza non vuota

System.out.println("Scrivi una sequenza non vuota di numeri interi");

num = Lettore.in.leggiInt();

max=num;

min=num;

. . .

52

53

Escursione dei valori in una sequenza

. . ./* finche' non viene dato invio */

while (!Lettore.in.eoln()){

/* lettura di un numero ad ogni iterazione */

num = Lettore.in.leggiInt();

/* se num e' maggiore del max, aggiorno max */

if (num > max)

max = num;

/* se num e' minore di min aggiorno min */

if (num < min)

min = num;

}

System.out.print("valore massimo ");

System.out.println(max);

System.out.print("valore minimo ");

System.out.println(min);

System.out.print("L'escursione della sequenza e' ");

System.out.println(Math.abs(max-min+1));

}

}53

54

Calcolo dei divisori di un numero

Problema• Dato un numero num intero positivo calcolare e visualizzare tutti i suoi

divisori (1 e num esclusi)

Esempio• I divisori di 28 sono 2, 4, 7, e 14

Dati di ingresso• num

Pre-condizione • num intero positivo

Dati di uscita • Una sequenza di interi

Post-condizione • La sequenza in uscita è composta dai divisori di num

54

55

Algoritmo per il calcolo dei divisori di un

numero

Dato un numero intero num, verifico che tutti i valori div

compresi tra 2 e num/2 dividano o meno num

Se il risultato della divisione di num per div da' resto 0 allora div

e' un divisore di num e lo visualizzo

• inizializza lim a num/2

• Inizializza div a 2

• Finché il divisore div è < lim

– Se il resto della divisione di num per div è 0

allora visualizza div

– incrementa div di 1

55

56

Codifica: calcolo dei divisori di un

numero/* lettura del numero */

System.out.println("Scrivi un intero positivo");

num = Lettore.in.leggiInt();

/* inizializzo il limite massimo dei divisori */

lim = num/2;

/* inizializzo il divisore */

div = 2;

/* spiegazione delle stampe che verranno prodotte all'interno del ciclo while */

System.out.println("I suoi divisori sono: ");

/* verifico da 2 fino a div */

while (div <= lim){

if (num%div == 0)

System.out.println(div);

div = div + 1;

}

56

57

Applicazione per il calcolo dei divisori di

un numeroimport fiji.io.*;

/* Applicazione che calcola e visualizza i divisori di un

* numero intero letto da tastiera */

class Divisori{

public static void main(String[] args){

int num; //numero letto

int lim; //limite massimo dei divisori

int div; //divisore

//precondizioni: num e' intero positivo (>=1)

/* dato num, verifico che tutti i valori div compresi * tra 2 e num/2 dividano o meno num. Se il

risultato * della divisione di num per div da' resto 0 allora * div e' un divisore di num e lo visualizzo */

/*lettura del numero*/

System.out.println("Scrivi un intero positivo");

num = Lettore.in.leggiInt();

. . . 57

58

Calcolo e stampa dei divisori di un

numero

. . .

/* inizializzo il limite massimo dei divisori */

lim = num/2;

/* inizializzo il divisore */

div = 2;

/* spiegazione delle visualizzazioni che verranno

* prodotte all'interno del ciclo while */

System.out.println("I suoi divisori sono: ");

/* verifico i divisori da 2 fino a lim */

while (div <= lim){

if (num%div == 0)

System.out.println(div);

div = div + 1;

}

}

}

58

59

Generazione di n numeri random

Problema• Scrivere un’applicazione per generare e visualizzare sullo schermo

N numeri interi random compresi tra 0 e 99

Dati di ingresso• un intero N

Pre-condizione • N >= 0

Dati di uscita • Una sequenza di numeri

Post-condizione • Nessuna

59

60

Algoritmo per la generazione di n numeri

random

Il metodo Math.random() calcola un numero pseudo-casuale di

tipo double compreso nell’intervallo [0,1).

Bisogna trasformarlo in un numero di tipo int compreso in

[0,100)

Moltiplicandolo per 100

Leggi un intero n

Inizializza un contatore i a 0, che permette di contare il numero

di volte che deve essere richiamato il metodo Math.random()

per generare gli n numeri random

Mentre i < n

Genera un numero random, moltiplicalo per 100, trasformalo in un intero e

visualizzalo sullo schermo

Incrementa il contatore i

60

61

Codifica: generazione di n numeri

random

//pre: n>=0

int res; // numero generato

int n; // numero di elementi da generare

int i; // contatore per l'istr. ripetitiva

/*lettura del valore di N */

System.out.println("quanti numeri vuoi generare? ");

n = Lettore.in.leggiInt();

i=0;

while(i <n ){

/* calcolo del numero random */

res = (int)(Math.random()*100);

System.out.print(res);

System.out.print(" ");

i=i+1;

}

61

62

Applicazione per la generazione di n

numeri random import fiji.io.*;

/* Applicazione che genera n numeri random tra 0 e 99 */

class NumeriRandom{

public static void main(String[] args){

//pre: n>=0

int res; // numero generato

int n; // numero di elementi da generare

int i; // contatore per l'istr. ripetitiva

/*lettura del valore di N */

System.out.println("quanti numeri vuoi generare? ");

n = Lettore.in.leggiInt();

i=0;

while( i<n ){

/* calcolo del numero random */

res = (int)(Math.random()*100);

System.out.print(res);

System.out.print(" ");

i=i+1;

}

System.out.println();

}

} 62

63

Esercizi

Definire una classe applicazione per calcolare e

visualizzare il valore massimo di una sequenza di N

numeri interi

Definire una classe applicazione per generare N numeri

interi random nell’intervallo [0,100) e per calcolare e

visualizzare il valore massimo degli N numeri interi

generati in modo random

Scrivere un’applicazione che verifica se un numero

intero letto da tastiera e’ primo

Scrivere un’applicazione che calcola e visualizza i

primi 10 numeri primi

63


Recommended