una sequenza di numeri interi - Dipartimento di Informatica e

annuncio pubblicitario
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
Scarica