Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa E04 Esempi di algoritmi e programmi C. Limongelli - A. Miola Novembre 2011 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 1 Contenuti q Somma di una sequenza di numeri interi q Lunghezza di una sequenza q Massimo di una sequenza di dieci numeri (*) q Somma dei pari e dei dispari in una sequenza q Calcolo degli zeri di una sequenza di numeri interi (*) q Somma dei primi N numeri interi positivi q La formula di Gauss q Che giorno sarà ? (*) q Generazione di N numeri interi random (*) q Escursione dei valori di una sequenza di interi (*) q Calcolo dei divisori di un numero intero (*) q Verifica se un numero è primo (*) (*) Esempi non presenti nel libro di testo http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 2 Somma di una sequenza di numeri interi q Si consideri 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 somma degli elementi della sequenza e visualizzarla sullo schermo Scrivi una sequenza di numeri interi 10 15 0 -2 La somma dei numeri è 23 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 3 Lettura e somma di una sequenza di numeri interi . . . q Problema • lettura e somma di una sequenza di numeri interi q Dati di ingresso • una sequenza di numeri interi A1, A2, ..., AN q Pre-condizione • N>=0, i numeri sono disposti su una singola linea e separati da spazi q Dati di uscita • un numero S q Post-condizione • S è uguale alla somma A1 + A2 + ... + AN http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 4 . . . Lettura e somma di una sequenza di numeri interi q Parametricità di questo problema § la lunghezza della sequenza § il valore degli elementi della sequenza q Il problema della lettura e somma di una sequenza di numeri interi non può essere risolto da un algoritmo che sia semplicemente una sequenza di istruzioni semplici § il numero degli elementi della sequenza non è noto a priori q La versione iniziale dell’algoritmo è la seguente 1. leggi una sequenza di numeri interi e calcolane la somma somma 2. visualizza somma http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 5 Raffinamento del passo 1 q Raffinamento del passo 1 1. leggi una sequenza di numeri interi e calcolane la somma somma 1.1 inizialmente somma vale zero somma = 0; 1.2 finché ci sono altri elementi, leggili e sommali a somma while ( ci sono altri elementi nella sequenza ) { leggi dalla tastiera un elemento della sequenza numero incrementa somma di numero } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 6 Uso della variabile somma q La variabile somma è usata nell’algoritmo per memorizzare la somma degli elementi che sono stati letti dalla tastiera • inizialmente, quando nessun elemento della tastiera è stato letto, vale 0 • dopo ciascuna operazione di lettura e incremento, è uguale alla somma degli elementi letti • dopo la lettura dell’intera sequenza, è uguale alla somma di tutti gli elementi della sequenza – che è proprio il valore che deve essere calcolato http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 7 Discussione q L’uso dell’istruzione ripetitiva permette di risolvere il problema § l’algoritmo legge tutti gli elementi della sequenza • il corpo dell’istruzione ripetitiva viene eseguito tante volte quanti sono gli elementi della sequenza § l’algoritmo calcola la somma degli elementi letti http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 8 Ulteriori raffinamenti q Alcuni ulteriori raffinamenti sono immediati 1.2 finché ci sono altri elementi nella sequenza, leggili e sommali a somma while ( ci sono altri elementi nella sequenza ) { leggi un elemento della sequenza numero dalla tastiera numero = Lettore.in.leggiInt(); incrementa somma di numero somma = somma + numero; } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 9 Raffinamento della condizione q Rimane da raffinare la condizione dell’istruzione ripetitiva while ( ci sono altri elementi nella sequenza ) • bisogna sapere che l’oggetto Lettore.in fornisce una operazione boolean eoln() che verifica se è stata raggiunta la fine della linea corrente – End Of Line (fine della linea) – eoln() verifica se non ci sono altri caratteri che possono essere letti dalla linea corrente • la condizione che deve essere usata nell’istruzione ripetitiva è la “negazione logica” della condizione calcolata da eoln() – ci sono altri elementi nella sequenza se eoln() è falso – l’operatore ! calcola la negazione di una condizione – la condizione dell’istruzione ripetitiva può essere scritta come !Lettore.in.eoln() http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 10 Algoritmo per la somma di una sequenza di numeri interi 1. leggi una sequenza di numeri interi e calcolane la somma somma 1.1 inizialmente somma vale zero somma = 0; 1.2 finché ci sono altri elementi nella sequenza, leggili e sommali a somma while ( ci sono altri elementi nella sequenza ) while ( !Lettore.in.eoln() ) { leggi un elemento numero dalla tastiera numero = Lettore.in.leggiInt(); incrementa somma di numero somma = somma + numero; } 2. visualizza somma System.out.println(somma); http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 11 Programma per la somma di una sequenza di numeri /* * /* /* * /* /* /* int numero; // elemento corrente della sequenza int somma; // somma degli elementi della sequenza leggi una sequenza di numeri interi e calcolane la somma */ inizialmente somma vale zero */ somma = 0; finché ci sono altri elementi nella sequenza, leggili e sommali a somma */ while (!Lettore.in.eoln()) { // finché ci sono // altri elementi leggi un elemento della sequenza */ numero = Lettore.in.leggiInt(); incrementa somma di numero */ somma = somma + numero; } visualizza somma */ System.out.println(somma); http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 12 Lunghezza di una sequenza . . . q 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 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 13 . . . Lunghezza di una sequenza . . . q Problema • lettura di una sequenza di numeri interi e calcolo della lunghezza q Dati di ingresso • una sequenza di numeri interi A1, A2, ..., AN q Pre-condizione • N>=0, i numeri sono disposti su una singola linea e separati da spazi q Dati di uscita • un numero L q Post-condizione • L è uguale alla lunghezza N della sequenza A1, A2, ..., AN http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 14 . . . Lunghezza di una sequenza q 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 q È 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 per contare il numero degli elementi della sequenza che sono stati letti http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 15 Algoritmo per il calcolo della lunghezza di una sequenza 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); http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 16 Esercizi q Verificare l’algoritmo per il calcolo della lunghezza di una sequenza § ad esempio, se la sequenza è 1 3 5 0 q Implementare l’algoritmo per il calcolo della lunghezza di una sequenza q 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 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 17 Calcolo del massimo di dieci numeri . . . q Si consideri il seguente problema di ingressouscita • 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 è : 12 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 18 . . . Calcolo del massimo di dieci numeri q Problema • lettura di una sequenza di 10 numeri interi e calcolo del valore massimo degli elementi q Dati di ingresso • una sequenza di dieci numeri interi A1, A2, ..., A10 q Pre-condizione • nessuna q Dati di uscita • un numero max q Post-condizione • max è il massimo degli elementi della sequenza A1, A2, ..., A10 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 19 Algoritmo per il calcolo del massimo tra dieci numeri interi . . . q L’algoritmo può essere realizzato gestendo le seguenti variabili § num - valore dell’elemento corrente della sequenza § cont - contatore degli elementi già letti § max - valore massimo degli elementi già letti q La gestione delle variabili max e cont avviene come segue § inizialmente cont vale 0 § leggi il primo numero num, assumilo come valore provvisorio del massimo max, e incrementa cont § per ogni altro numero num letto • max deve essere confrontato con num ed eventualmente modificato • cont deve essere incrementata di uno http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 20 . . . Algoritmo per il calcolo del massimo tra dieci numeri interi Leggi una sequenza di dieci numeri interi e calcolane il massimo: 1. inizializza il contatore dei numeri letti 2. leggi un numero num da input 3. inizializza max 4. incrementa il contatore dei numeri letti cont = 0; 5. finché ci sono ancora numeri da leggere 5.1 leggi un numero num 5.2 confronta num con max se num > max memorizza il contenuto di num in max 5.3 incrementa cont while (cont <= 9) . . . max = num; cont = cont + 1; . . . if (num > max) max = num; cont = cont + 1; 6. il risultato è max http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 21 Applicazione per il calcolo del massimo tra dieci numeri 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(); /* appena leggo un numero incremento il contatore */ cont = cont + 1; . . . http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 22 . . . Applicazione per il calcolo del massimo tra dieci numeri interi . . . /* essendo l'unico numero letto esso è 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 è maggiore del max, aggiorno max */ if (num > max) max = num; } System.out.print("valore massimo calcolato è: "); System.out.println(max); } } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 23 Somma dei pari e dei dispari in una sequenza . . . q Si consideri il seguente problema di ingresso-uscita, che è una variante dei problemi precedenti • si vuole leggere dalla tastiera una sequenza di numeri interi, disposti su una singola linea e separati da spazi, calcolare la somma degli elementi di valore pari e la somma degli elementi di valore dispari, e visualizzare la somma dei pari e la somma dei dispari sullo schermo Scrivi una sequenza di numeri interi 10 15 0 -2 La somma dei pari è 8 La somma dei dispari è 15 q Una variante della lettura e somma di una sequenza • ci sono due dati da visualizzare (in uscita) anziché uno solo http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 24 . . . Somma dei pari e dei dispari in una sequenza q Per risolvere il problema bisogna gestire una coppia di variabili • sommaPari – la somma degli elementi di valore pari della sequenza • sommaDispari – la somma degli elementi di valore dispari della sequenza q Queste due variabili devono essere gestite come segue • inizialmente valgono entrambe zero • per ogni numero della sequenza – se il numero è pari, allora deve essere usato per incrementare sommaPari – altrimenti il numero è dispari, e deve essere usato per incrementare sommaDispari http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 25 Algoritmo per la somma dei pari e dei dispari q In questo caso, all’interno dell’istruzione ripetitiva, deve essere usata una istruzione condizionale if-else § per ogni elemento della sequenza deve essere eseguita una tra due istruzioni al verificarsi (o meno) di una condizione • una possibile istruzione è l’incremento di sommaPari • l’altra possibile istruzione è l’incremento di sommaDispari • comunque deve essere eseguita esattamente una tra queste due istruzioni § la condizione è “numero è pari” • l’operatore % calcola il resto della divisione tra due numeri interi • un numero è pari se diviso per due dà resto zero • la condizione dell’istruzione condizionale può essere scritta come numero%2==0 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 26 Uso dell’istruzione if-else leggi gli elementi della sequenza e calcola la somma dei pari e la somma dei dispari sommaPari = 0; sommaDispari = 0; finché ci sono altri elementi nella sequenza, leggili e calcola la somma dei pari e la somma dei dispari while ( !Lettore.in.eoln() ) { numero = Lettore.in.leggiInt(); se numero è pari, incrementa sommaPari di numero, altrimenti incrementa sommaDispari di numero if ( numero%2==0 ) sommaPari = sommaPari + numero; else sommaDispari = sommaDispari + numero; } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 27 Programma per la somma dei pari e la somma dei dispari . . . int numero; // elemento corrente della sequenza int sommaPari; // somma degli elementi pari int sommaDispari; // somma degli elementi dispari /* leggi una sequenza di numeri interi e calcola * la somma dei pari e la somma dei dispari */ /* inizialmente le somme valgono zero */ sommaPari = 0; sommaDispari = 0; /* finché ci sono altri elementi nella sequenza, leggili * e calcola la somma dei pari e la somma dei dispari */ while (!Lettore.in.eoln()) { /* leggi un elemento della sequenza */ numero = Lettore.in.leggiInt(); . . . http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 28 . . . Programma per la somma dei pari e dei dispari . . . /* se numero è pari, incrementa sommaPari di numero, * altrimenti incrementa sommaDispari di numero */ if (numero%2==0) // se numero è pari /* incrementa sommaPari di numero */ sommaPari = sommaPari + numero; else // altrimenti numero è dispari /* incrementa sommaDispari di numero */ sommaDispari = sommaDispari + numero; } /* visualizza le somme */ System.out.println(sommaPari); System.out.println(sommaDispari); http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 29 Calcolo degli zeri di una sequenza q 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 . . . http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 30 Calcolo degli zeri di una sequenza – frammento di codice da completare 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(); . . . // da completare } /* visualizza zeri */ System.out.println(zeri); http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 31 Somma dei primi N numeri interi positivi q Si vuole risolvere il problema di calcolare la somma dei primi N numeri interi positivi, dato un numero naturale N § un problema nella forma più generale § la sua soluzione deve portare alla scrittura di un metodo in cui • il numero naturale N è un parametro del metodo • la somma dei primi N numeri interi positivi deve essere restituita dal metodo http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 32 Somma dei primi N numeri interi positivi q Problema • somma dei primi N numeri interi positivi q Insieme di ingresso • un numero N q Pre-condizione • N è un numero naturale, ovvero N ≥ 0 q Insieme di uscita • un numero S q Post-condizione • S è uguale alla somma 1+2+ ... +N dei primi N numeri positivi (S deve essere uguale a zero nel caso in cui N sia uguale a zero) http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 33 Somma dei primi N numeri interi positivi q La somma dei primi N numeri interi positivi può essere calcolata da un algoritmo che utilizza le seguenti variabili § una variabile somma, gestita come segue • la variabile somma inizialmente vale zero • a somma deve essere sommato ciascuno dei primi N numeri interi positivi — ovvero, ciascun numero intero compreso tra 1eN § una variabile i • a cui si vogliono far assumere come valori tutti i numeri interi compresi tra 1 e N — ovvero, i valori che devono essere sommati a somma http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 34 Algoritmo per la somma dei primi N numeri interi positivi q La prima formulazione dell’algoritmo è la seguente inizializza somma somma = 0; per ogni valore di i compreso tra 1 e N, incrementa somma di i somma = somma + i; il risultato è somma q L’algoritmo non è completamente dettagliato § deve essere eseguito un raffinamento, introducendo una istruzione ripetitiva http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 35 La formula di Gauss q Esiste una nota formula (formula di Gauss) per il calcolo della somma SN dei primi N numeri interi positivi (valida per N naturale) SN = 1+2+ ... + N = N (N+1) / 2 /* Calcola la somma dei primi n numeri positivi. */ public static int sommaPrimiPositiviGauss(int n) { // pre: n >= 0 int somma; // somma dei primi n numeri positivi /* calcola la somma dei primi n numeri positivi */ somma = n*(n+1)/2; /* il risultato è somma */ return somma; } q uno stesso problema può essere risolto da più algoritmi, anche molto diversi tra loro http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 36 Confronto tra i due algoritmi q Quante operazioni sono richieste per lo svolgimento dei due algoritmi? § la soluzione iterativa per il calcolo della somma dei primi N numeri interi positivi richiede lo svolgimento di 2N+2 assegnazioni e di N+1 confronti § la soluzione basata sulla formula di Gauss richiede lo svolgimento di 1 sola assegnazione q La soluzione basata sulla formula di Gauss è sempre più efficiente di quella iterativa § “sempre” va interpretato nel senso di “per ogni possibile valore di N che soddisfa la pre-condizione del problema” – ovvero per ogni numero naturale N http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 37 Che giorno sarà? . . . q Problema • Applicazione che calcola il giorno della settimana corrispondente ad una data q Esempio • sapendo che il primo gennaio del 2007 è lunedì, che giorno sarà il 15 agosto? (mercoledì) http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 38 . . . Che giorno sarà? q Dati di ingresso • Il giorno della settimana corrispondente al 1° gennaio dell’anno di riferimento; • L’anno di riferimento; • La data (gg/mm) appartenente all’anno di riferimento di cui si vuole conoscere il giorno della settimana; q Pre-condizione • L’anno è un intero positivo maggiore di 1600 • La data deve essere ammissibile. q Dati di uscita • Il giorno della settimana corrispondente alla data immessa in input http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 39 Convenzione q I giorni della settimana sono rappresentati da caratteri (tipo char) con la seguente convenzione: http://www.dia.uniroma3.it/~java/fondinf/ Giorni char Lunedì l Martedì m Mercoledì M Giovedì g Venerdì v Sabato s Domenica d Esempi di algoritmi e programmi - 4 40 L’algoritmo q Leggo i dati da input. q Calcolo il numero di giorni (numGiorni) che separano la data di interesse dal 1° gennaio. q Il resto della divisione di numGiorni per 7 indica la distanza settimanale del giorno dalla data di interesse q Copio il giorno del 1° gennaio in giornoRes che rappresenterà il risultato finale q Finché (cont <= distanza settimanale) • Calcolo il giorno successivo a giornoRes • Assegno il valore del nuovo giorno a giornoRes q Stampa dei risultati http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 41 Il numero dei giorni . . . q Per calcolare il numero di giorni che separano il primo giorno dell’anno e l’ultimo giorno del mese precedente alla data di interesse, sfruttiamo il metodo NumeroGiorni, che tra le altre cose terrà conto se un anno è bisestile o meno http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 42 . . . Il numero dei giorni public static int NumeroGiorni(int mese, int anno){ int i; int numGiorni; i=1; numGiorni=0; while (i< mese) { /* calcolo dei giorni del mese */ if (i==2) if (Bisestile.bisestile(anno)) numGiorni = numGiorni+29; else numGiorni = numGiorni+28; else //mesi con 30 giorni if (i==4 || i==6 || i==9 || i==11) numGiorni = numGiorni+30; else numGiorni = numGiorni+31; i=i+1; }// end while return numGiorni; } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 43 Il giorno successivo . . . q L’individuazione del giorno successivo viene effettuata tramite il metodo succ in funzione del parametro in input di tipo char, che rappresenta un giorno, questo metodo restituisce la codifica del giorno successivo. http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 44 . . . Il giorno successivo public static char succ(char giorno){ char successore; if (giorno == 'l') successore = 'm'; else if(giorno == 'm') successore = 'M'; else if (giorno == 'M') successore = 'g'; else if (giorno == 'g') successore = 'v'; else if (giorno == 'v') successore = 's'; else if (giorno == 's') successore = 'd'; else if (giorno == 'd') successore = 'l'; else successore = 'e'; // per gestire un errore return successore; } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 45 Stampa del Giorno q Il metodo StampaGiorno viene impiegato per passare dalla rappresentazione dei giorni tramite char ad una rappresentazione più leggibile http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 46 …Stampa del Giorno public static void StampaGiorno(char c){ if (c == 'l') System.out.println(" lunedi'"); else if (c == 'm') System.out.println(" martedi'"); else if (c == 'M') System.out.println(" mercoledi'"); else if (c == 'g') System.out.println(" giovedi'"); else if (c == 'v') System.out.println(" venerdi'"); else if (c == 's') System.out.println(" sabato"); else if (c == 'd') System.out.println(" domenica"); else System.out.println(" errore!! "); } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 47 La classe CheGiornoSara: dichiarazioni import fiji.io.*; class CheGiornoSara{ public static void main(String[] args){ /*input*/ char giorno1gen; int anno; int giorno, mese; //giorno della settimana corrispondente al 1 gennaio // anno corrispondente // giorno e mese di cui si vuol // conoscere il giorno della // settimana /*output*/ char giornoRis; // giorno della settimana //corrispondente a g,m /* variabili d'appoggio */ int numGiorni; //numero di giorni tra il 1 gennaio e la //data richiesta int i,app; http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 48 La classe CheGiornoSara: acquisizione dei dati /*lettura della data di partenza senza controllo sulla correttezza dei dati */ System.out.println("Scrivi il giorno della settimana corrispondente al 1 gennaio"); System.out.println("(l m M g v s d) "); giorno1gen = Lettore.in.leggiChar(); System.out.println("Di quale anno?"); anno = Lettore.in.leggiInt(); System.out.println("Di quale data vuoi calcolare il giorno della settimana? "); System.out.println("scrivi giorno e mese in cifre, separati da spazi"); giorno = Lettore.in.leggiInt(); mese = Lettore.in.leggiInt(); http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 49 La classe CheGiornoSara: calcolo /* calcolo il numero di giorni tra il 1 gennaio e l’ultimo giorno del mese precedente */ numGiorni=NumeroGiorni(mese,anno); /* poi aggiungo i giorni del mese in esame */ numGiorni = numGiorni+giorno-1; /* -1 perchè devo contare dal 1 gennaio escluso */ app = numGiorni % 7; // distanza settimanale da colmare giornoRis= giorno1gen; i=1; while(i<=app){ giornoRis=succ(giornoRis); i++ } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 50 La classe CheGiornoSara: stampa del risultato /* stampa dei dati */ System.out.print(" il giorno corrispondente al " + giorno + "/" + mese + "/" + anno + " è: "); StampaGiorno(giornoRis); }//end main http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 51 Generazione di n numeri interi random q Problema § Scrivere un’applicazione per generare e visualizzare sullo schermo N numeri interi random compresi tra 0 e 99 q Dati di ingresso § un intero N q Pre-condizione § N >= 0 q Dati di uscita § Una sequenza di numeri q Post-condizione § Nessuna http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 52 Algoritmo per la generazione di n interi numeri random q Il metodo Math.random() calcola un numero pseudocasuale di tipo double compreso nell’intervallo [0,1). q Bisogna trasformarlo in un numero di tipo int compreso in [0,100) moltiplicandolo per 100 q Leggi un intero n q 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 q Mentre i < n § Genera un numero random, moltiplicalo per 100, trasformalo in un intero e visualizzalo sullo schermo § Incrementa il contatore i http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 53 Codifica per la generazione di n interi 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; } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 54 Applicazione per la generazione di n interi numeri random import fiji.io.*; /* Applicazione che genera n numeri random tra 0 e 100 */ 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(); } } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 55 Esercizi q Definire un metodo di un oggetto per generare e visualizzare N numeri interi random nell’intervallo [0,100), assumendo il valore di N come parametro del metodo q Definire un metodo di un oggetto per calcolare e visualizzare il valore massimo di una sequenza di N numeri interi, assumendo il valore di N come parametro del metodo q 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 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 56 Escursione dei valori in una sequenza q Problema § Scrivere un’applicazione che calcola l'escursione dei valori di una sequenza di interi letta da tastiera q Esempio § Dati i valori 3 -1 2 4 -2 l’escursione è 7 (da -2 a 4) q Dati di ingresso § una sequenza di numeri interi q Pre-condizione § La sequenza è non vuota q Dati di uscita § Massimo, minimo ed escursione q Post-condizione http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 57 Algoritmo per l’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 § Finché 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 aggiorno min con num § L’escursione è data da (max-min+1) Se la sequenza è composta tutta da valori negativi ? http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 58 Codifica per l’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; /* finchè non viene dato invio */ while (!Lettore.in.eoln()){ /*lettura di un numero ad ogni iterazione */ num = Lettore.in.leggiInt(); /* se num è maggiore del max, aggiorno max */ if (num > max) max = num; /* se num è minore di min aggiorno min */ if (num < min) min = num; } System.out.print("L'escursione della sequenza è "); System.out.println(Math.abs(max-min+1)); http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 59 Applicazione per l’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; /* OPPURE */ /* inizializzazione delle var con il massimo e minimo intero rappresentabili: valori che saranno subito aggiornati dalla lettura del primo elemento che esiste perchè la sequenza è non vuota */ //max =Integer.MIN_VALUE; //min =Integer.MAX_VALUE; /** sono inizializzazioni sufficientemente generali? **/ http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 60 . . . Applicazione per l’escursione dei valori in una sequenza /* finchè non viene dato invio */ while (!Lettore.in.eoln()){ /* lettura di un numero ad ogni iterazione */ num = Lettore.in.leggiInt(); /* se num è maggiore del max, aggiorno max */ if (num > max) max = num; /* se num è 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 è "); System.out.println(Math.abs(max-min+1)); } } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 61 Calcolo dei divisori di un numero intero q Problema § Dato un numero num intero positivo calcolare e visualizzare tutti i suoi divisori (1 e num esclusi) q Esempio § I divisori di 28 sono 2, 4, 7, e 14 q Dati di ingresso § num q Pre-condizione § num intero positivo q Dati di uscita § sequenza dei divisori q Post-condizione § ??? http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 62 Algoritmo per il calcolo dei divisori di un numero intero 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 dà resto 0 allora div è 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 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 63 Codifica per il calcolo dei divisori di un numero intero /* 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 lim */ while (div <= lim){ if (num%div == 0) System.out.println(div); div = div + 1; } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 64 Applicazione per il calcolo dei divisori di un numero intero . . . 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 è 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 dà resto 0 allora * div è un divisore di num e lo visualizzo */ /*lettura del numero*/ System.out.println("Scrivi un intero positivo"); num = Lettore.in.leggiInt(); http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 65 . . . Applicazione per il calcolo dei divisori di un numero intero /* 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; } } } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 66 Esercizi q Scrivere un’applicazione che verifica se un numero intero letto da tastiera è primo q Scrivere un metodo che verifica se un numero intero assunto come parametro del metodo è primo q Scrivere un’applicazione che calcola e visualizza i primi 10 numeri primi http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 67 Esercizio: verifica se un numero è primo q Problema § Scrivere un’applicazione che verifica se un numero è primo q Dati di ingresso § Un intero positivo n q Pre-condizione § n>0 q Dati di uscita § Vero/falso (primo / non primo) q Post-condizione http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 68 Algoritmo per la verifica se un numero è primo Leggi n da input Inizializza div a 2 Inizia a provare se div divide n: se div divide n fine - perché n non è primo Finché (div non divide n) e (div non è arrivato a n/2) incremento div di 1 se esci dal ciclo perché n è divisibile per div allora n è primo altrimenti n non è primo http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 69 Codifica per la verifica se un numero è primo int div; //divisore per la verifica div = 2; while ((n%div!=0)&& (div<=n/2)) div = div +1; /* esco dal ciclo quando n%div = 0 (il num è divisibile) oppure quando div > n/2 (li ho provati tutti) */ if (n%div==0) return false; else return true; http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 70 Applicazione per la verifica se un numero è primo . . . import fiji.io.*; /* Applicazione che verifica se un numero è primo */ class Primi{ public static void main(String[] args){ int n; //numero letto da input //pre: n>0 /*lettura del numero da input*/ System.out.println("Scrivi un numero (>0)"); n = Lettore.in.leggiInt(); if (primo(n)) {System.out.print("il numero "); System.out.print(n); System.out.println(" è primo");} else {System.out.print("il numero "); System.out.print(n); System.out.println(" NON è primo");} } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 71 . . . Applicazione per la verifica se un numero è primo public static boolean primo(int n){ int div; //divisori per la verifica boolean trovato; //true se è stato trovato un divisore div = 2; trovato = false; while (!trovato && (div<=n/2)){ if (n%div == 0) trovato = true; div = div +1;} /* esco dal ciclo o quando trovato è true (il num è divisibile) o quando div > n/2 li ho provati tutti */ return !trovato; } } http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 72 Esercizi q Scrivere un programma che generi i primi n numeri primi. q Un numero n si dice perfetto se la somma di tutti I suoi divisori (n escluso) è uguale a n. Ad esempio 6 è perfetto perché 1+2+3 = 6. Scrivere un’applicazione che legge da input un intero m e genera I primi m numeri perfetti. q Suggerimento: non provare con valori di m troppo grandi, massimo m=4 …. http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 73 Riferimenti al libro di testo q Per lo studio di questi argomenti si fa riferimento al libro di testo, e in particolare al capitolo § 5 su Problemi, algoritmi e oggetti q Con particolare riferimento ai paragrafi § Dal 5.2.5 al 5.2.11 http://www.dia.uniroma3.it/~java/fondinf/ Esempi di algoritmi e programmi - 4 74