Fondamenti di Informatica Dall`analisi alla codifica (2)

Corso di Laurea Ingegneria Civile
Fondamenti di Informatica
Dispensa 10
Dall’analisi alla codifica (2)
Aprile 2010
Dall’analisi alla codifica (2)
1
Contenuti
 Problemi
di ingresso e uscita (esempi ed
esercizi)
•
•
•
•
•
•
•
•
•
•
•
•
2
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
Lunghezza di una sequenza
Si consideri ora il seguente problema di ingressouscita
• 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)
4
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 A 1, A2, ..., AN
Dall’analisi alla codifica (2)
5
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)
6
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)
7
Algoritmo per il calcolo della lunghezza
di una sequenza (diagramma a blocchi)
input (A1,…,An)
l = 0
Ci sono ancora
numeri da leggere?
No
Si
Ai = numero letto
l = l+1
assegnazione
scrivi l
selezione
iterazione
Fine
8
Lunghezza di una sequenza: codifica
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);
}}
Dall’analisi alla codifica (2)
9
Perimetro di un triangolo
 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

….
Dall’analisi alla codifica (2)
10
Perimetro di un triangolo
input (x1,y1,x2,y2,x3,y3)
assegnazione
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
11
Perimetro di un triangolo
A che serve? Indica che la
import fiji.io.*;
classe usa classi del
/* Applicazione che calcola e visualizza
package fiji.io, in
* il perimetro di un triangolo. */
particolare
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();
Dall’analisi alla codifica (2)
12
... segue ...
Perimetro di un triangolo
... segue ...
Esiste un metodo che calcola la potenza?
Math.pow (vedere documentazione classe Math)
/* 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)
Dall’analisi alla codifica (2)
13
Equazioni di 1° e 2° grado

Problema


Input


Coordinate dei vertici tutte positive
Output


i coefficienti a, b, c dell’equazione ax*x+bx+c
Pre-condizioni


Calcolo delle radici di un’equazione di primo o secondo
grado
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
Equazioni di 1° e 2° grado
input (a,b,c)
Si
Si
b = 0
Scrivi
“no soluzione”
a=0
selezione
assegnazione
No
delta = b*b-4*a*c
No
x1 = -c/b
Si
delta < 0
No
Scrivi
x1 =
Scrivi
“1 soluzione”,x1 “no soluzione”(-b + sqrt(delta))/2*a
x2 =
(-b - sqrt(delta))/2*a
Scrivi x1 e x2
Fine
Dall’analisi alla codifica (2)
15
Equazioni di 1° e 2° grado
Programma:
Variabili:
Istruzioni:
Calcolo radici equazione di 1° e 2° grado
double a, b, c, delta, x1, x2;
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);
}
}
Dall’analisi alla codifica (2)
16
Equazioni di 1° e 2° grado
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();
Dall’analisi alla codifica (2)
17
Equazioni di 1° e 2° grado
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);}
}}}}
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
Elevamento a potenza
input (base,esp)
No
base==0 and
esp==0
pot = 1
esp > 0
Si
selezione
assegnazione
iterazione
Scrivi “errore”
No
Si
pot = pot * base
esp = esp - 1
scrivi pot
Fine
Dall’analisi alla codifica (2)
20
Elevamento a potenza
Programma:
Variabili:
Elevamento a potenza
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;
}
Dall’analisi alla codifica (2)
21
Elevamento a potenza:
traccia del processo di esecuzione
Istruzione
base
esp
pot
1.
2.
4.
5.
6.
7.
5.
6.
7.
5.
8.
3
3
3
3
3
3
3
3
3
3
3
2
2
2
2
2
1
1
1
0
0
0
1
1
3
3
3
9
9
9
9
La variabile pot contiene il valore della potenza
Dall’analisi alla codifica (2)
22
Elevamento a potenza: codifica
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 ...
Dall’analisi alla codifica (2)
23
Elevamento a potenza
... 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);
}
}
}
Dall’analisi alla codifica (2)
24
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)
25
Esercizio
Risolvere il seguente problema di ingressouscita
• 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
26
Calcolo degli zeri di una sequenza
int numero;
int zeri;
// elemento corrente della sequenza
// 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);
27
Somma di una sequenza di dieci numeri
Si consideri il seguente problema di ingressouscita
• 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
28
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 A 1, A2, ..., A10
Pre-condizione
• nessuna
Dati di uscita
• un numero S
Post-condizione
• S è la somma degli elementi della sequenza A 1, A2, ..., A10
29
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
30
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
31
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?
32
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;
}
33
Programma per la lettura e somma di
dieci numeri
int 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);
34
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
35
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
36
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
37
Algoritmo per il calcolo del massimo tra
10 interi
Leggi 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 max
se 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
38
Codifica per il calcolo del massimo tra
10 interi . . .
. . .
int num;
int max;
int cont;
//numero letto
//massimo calcolato
//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
39
. . . 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
40
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
41
. . . 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
42
Algoritmo per il calcolo del massimo tra
10 interi
Leggi 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 max
se 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
43
Massimo tra 3 interi:
traccia del processo di esecuzione
Es. 5 -1 7
Istruzione
1.
2.
3.
4.
5.
5.1.
5.2.
5.3.
5.
5.1.
5.2.
5.3.
5.
num
5
5
5
5
-1
-1
-1
-1
7
7
7
7
cont
0
0
0
1
1
1
1
2
2
2
2
3
3
max
5
5
5
5
5
5
5
5
7
7
7
La variabile max contiene il valore del massimo della sequenza
Dall’analisi alla codifica (2)
44
Somma dei primi n numeri interi
dispari
Problema
• 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
45
Algoritmo: somma dei primi n numeri
interi dispari
L’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
46
Codifica: somma dei primi n numeri
interi dispari
int 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
47
Applicazione: somma dei primi n numeri
interi dispari
import 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 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 di dispari da
sommare (>0)");
n = Lettore.in.leggiInt();
somma = 0;
disp = 1;
// il primo numero dispari
while (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
48
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
49
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
50
Codifica: escursione dei valori in una
sequenza
System.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
51
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
52
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
53
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
54
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
55
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
56
Applicazione per il calcolo dei divisori di
un numero
import 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 */
57
/*lettura del numero*/
System.out.println("Scrivi un intero positivo");
num = Lettore.in.leggiInt();
. . .
57
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
58
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
59
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
60
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
61
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
}
62
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
63