Corso di Laurea Ingegneria Civile Fondamenti di...
Transcript of Corso di Laurea Ingegneria Civile Fondamenti di...
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