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