60
1 Laboratorio di Programmazione - Luca Tesei Numeri, espressioni, calcoli, caratteri, input Interi e decimali Definizione di costanti Espressioni Funzioni matematiche Classi involucro

Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

  • Upload
    others

  • View
    15

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

1Laboratorio di Programmazione - Luca Tesei

Numeri, espressioni, calcoli, caratteri, input

Interi e decimaliDefinizione di costanti

EspressioniFunzioni matematiche

Classi involucro

Page 2: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

2Laboratorio di Programmazione - Luca Tesei

Una classe Borsellino

/** Realizza un borsellino per le monete. Registra il numero di monete e calcola il valore totale

*/public class Purse { /** Costruisce un borsellino vuoto */ public Purse() { }

/** Aggiunge monete di tipo "nickel" al borsellino @param count il numero di nickel da aggiungere */ public void addNickels(int count) { }

Page 3: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

3Laboratorio di Programmazione - Luca Tesei

Classe Borsellino cont’d

/** Aggiunge monete di tipo "dime" al borsellino @param count il numero di dime da aggiungere */ public void addDimes(int count) { } /** Aggiunge monete di tipo "quarter" al borsellino @param count il numero di quarter da aggiungere */ public void addQuarters(int count) { } /** Ispeziona il valore totale delle monete nel borsellino @returns la somma dei valori di tutte le monete attualmente

presenti */ public double getTotal() { }}

Page 4: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

4Laboratorio di Programmazione - Luca Tesei

Esempio d’uso

Purse myPurse = new Purse();myPurse.addNickels(3);myPurse.addDimes(1);myPurse.addQuarters(2);double totalValue =

myPurse.getTotal();● totalValue conterrà 0,75 cioè il valore in dollari

delle monete contenute nel borsellino

Page 5: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

5Laboratorio di Programmazione - Luca Tesei

Numeri interi e numeri decimali

● Per rappresentare quantità che si contano naturalmente con multipli di 1 (positivi o negativi) usiamo variabili di tipo intero (int)

● Nell’esempio del borsellino int è il tipo dei parametri dei metodi addXXX

● Questo perché è naturale considerare le monete come quantità indivisibili e quindi quantificate con un numero intero

● Il metodo getTotal() invece restituisce un double● Questo perché è naturale per un valore che rappresenta

una quantità di dollari avere dei decimali

Page 6: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

6Laboratorio di Programmazione - Luca Tesei

Primi passi per l’implementazione di Purse

● Ogni oggetto di tipo Purse può essere descritto dalla quantità di nickels, dimes e quarters che contiente

● Inseriamo quindi tre variabili istanza di tipo int per rappresentare queste quantità

...private int nickels;private int dimes;private int quarters;

Page 7: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

7Laboratorio di Programmazione - Luca Tesei

Primi passi per l’implementazione di Purse

public double getTotal() { return nickels * 0.05 + dimes * 0.1

+ quarters * 0.25;}● L’ * indica la moltiplicazione (perché • o non si trovano

generalmente nelle tastiere)● L’espressione dopo return segue le regole di

associatività e precedenza tipiche dell’aritmetica (la grammatica di Java per le espressioni segue le regole che abbiamo visto a Programmazione)

● Il valore ottenuto è un numero in virgola mobile poiché moltiplicando un intero per un numero decimale si ottiene un numero decimale, in generale

Page 8: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

8Laboratorio di Programmazione - Luca Tesei

Costanti numeriche

● Nelle costanti numeriche che si possono scrivere nel codice la virgola deve essere indicata come punto decimale

● Si può usare anche la notazione esponenziale● Ad esempio 5,0 10-3 si scrive come 5.0E-3● Cioè si usa il punto decimale e si scrive E

seguito dall’esponente di 10

Page 9: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

9Laboratorio di Programmazione - Luca Tesei

Numeri interi

● Un numero intero è un numero senza decimali che può essere sia positivo che negativo

● Il tipo base Java corrispondente ai numeri interi è int

● Una variabile int può contenere i numeri interi da –2147483648 a +2147483647

● 31 bit + 1 bit per il segno = 32 bit di memoria allocati per ogni variabile int

Page 10: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

10Laboratorio di Programmazione - Luca Tesei

Numeri interi

● Esistono altri tipi base di interi che possono rappresentare meno o più numeri di int

• short: 16 bit - Range: da -215 a 215-1

• byte: 8 bit - Range da –27 a 27-1

• long: 64 bit - Range da –263 a 263 –1

Page 11: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

11Laboratorio di Programmazione - Luca Tesei

Numeri in virgola mobile

● Possono contenere cifre decimali● Contengono un certo numero di cifre significative e la

posizione della virgola● Es. 250 25 0.25 0.025 hanno tutti le stesse cifre

significative (25), ciò che cambia è la posizione della virgola (da qui “virgola mobile”)

● Naturalmente la rappresentazione in realtà è in base 2● In java la virgola è rappresentata dal punto decimale

come nella notazione anglosassone (come tutte le calcolatrici del resto)

Page 12: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

12Laboratorio di Programmazione - Luca Tesei

Numeri in virgola mobile

• double può rappresentare circa 15 cifre significative: è il tipo con maggiore precisione (“doppia precisione”)

• float può rappresentare circa 7 cifre significative: precisione spesso insufficiente, ma calcoli più veloci

● Per precisione si intende la grandezza degli errori dovuti all’ arrotondamento che inevitabilmente si commettono con l’uso di questi numeri

Page 13: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

13Laboratorio di Programmazione - Luca Tesei

Precisione

public class ProvaPrecisione { public static void main(String [] argv) { double originalPrice = 3E14; double discountedPrice = originalPrice –

0.05; double discount = originalPrice –

discountedPrice; // dovrebbe essere 0.05 System.out.println(discount); // stampa 0.0625 – Errore dovuto //all’arrotondamento da rappresentazione

}}

Page 14: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

14Laboratorio di Programmazione - Luca Tesei

Numeri rappresentabili

● Il tipo float può rappresentare il range dei numeri, positivi o negativi, con valore assoluto che va da 2-149 a (2-2-23)•2127

● Il tipo double può rappresentare il range dei numeri, positivi o negativi, con valore assoluto che va da 2-1074 a (2-2-52)•21023

Page 15: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

15Laboratorio di Programmazione - Luca Tesei

Numeri a lunghezza e precisione arbitraria

● Il pacchetto java.math contiene una classe BigInteger i cui oggetti possono rappresentare numeri interi di lunghezza arbitraria

● Lo stesso pacchetto contiene una classe BigDecimal i cui oggetti possono rappresentare numeri a virgola mobile con precisione arbitraria

Page 16: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

16Laboratorio di Programmazione - Luca Tesei

Numeri a lunghezza e precisione arbitraria

• Per questi numeri non si possono usare i normali operatori + * - / =

• I corrispondenti metodi add, multiply, subtract, divide ed equals sono forniti dalle relative classi:

BigInteger a = new BigInteger(“123456789”);BigInteger b = new BigInteger(“987654321”);BigInteger c = a.multiply(b);System.out.println(c); // stampa 121932631112635269

• Naturalmente i calcoli con questi numeri sono più lenti di quelli fatti con i numeri dei tipi base e richiedono più memoria

Page 17: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

17Laboratorio di Programmazione - Luca Tesei

Costruttore di Purse

Public Purse() { nickels = 0; dimes = 0; quarters = 0;}● Il costruttore di default farebbe esattamente la

stessa cosa, ma lo specifichiamo per chiarezza

Page 18: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

18Laboratorio di Programmazione - Luca Tesei

Implementazione di addNickels

public void addNickels(int count) { nickels = nickels + count;}● È la tipica istruzione di incremento di un valore● L’assegnamento prima valuta la parte a sinistra dell’= e

quindi considera il valore corrente della variabile istanza intera nickels al quale aggiunge il valore di count

● Il valore così ottenuto sarà assegnato alla variabile istanza nickels, cioè sarà il suo valore dopo l’esecuzione dell’istruzione (si può pensare che sia il valore che nickels ha dopo il ; finale)

Page 19: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

19Laboratorio di Programmazione - Luca Tesei

Altre istruzioni di incremento

● In Java, come in C, esiste una forma abbreviata per l’incremento

nickels = nickels + count;

può essere scritta equivalentemente comenickels += count;● La stessa abbreviazione si può usare anche per

gli altri operatori (*, /, -):P *= q; // equivalente a p = p * q;

Page 20: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

20Laboratorio di Programmazione - Luca Tesei

Incremento di 1

● Un’istruzione che ricorre molto frequentemente nei programmi è l’incremento o il decremento di una variabile intera di una unità

● In Java, come in C, esistono abbreviazioni speciali per questi casi:

i++; // equivalente a i = i + 1; e a i +=1;

i--; // equivalente a i = i – 1; e a i -=1;

Page 21: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

21Laboratorio di Programmazione - Luca Tesei

Costanti

public double getTotal() { return nickels * 0.05 + dimes * 0.1 + quarters * 0.25;}● La maggior parte del codice si documenta da

sé, ma in questo caso i numeri 0.05, 0.1 e 0.25 compaiono senza nessuna spiegazione

● È buona regola evitare di inserire nel codice questi “numeri magici”

Page 22: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

22Laboratorio di Programmazione - Luca Tesei

Costanti

● Le costanti possono essere pensate come dei nomi a cui è associato un valore

● Tale associazione rimane valida per tutta la vita della costante e non cambia mai

● In genere, per convenzione, le costanti sono scritte tutte maiuscole e si usa l’underscore come separatore nel caso che il nome sia composto da più parole

● In Java una costante si dichiara come una variabile (di frame) usando la parola chiave final e inizializzando il valore nella dichiarazione

Page 23: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

23Laboratorio di Programmazione - Luca Tesei

Costanti

public double getTotal() { final double NICKEL_VALUE = 0.05; final double DIME_VALUE = 0.1; final double QUARTER_VALUE = 0.25; return nickels * NICKEL_VALUE + dimes * DIME_VALUE + quarters * QUARTER_VALUE;}

Page 24: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

24Laboratorio di Programmazione - Luca Tesei

final

● In generale in Java la parola chiave final indica un qualcosa che non può essere più modificato (vedremo che esistono, oltre alle variabili, anche classi final, cioè che non possono essere estese)

● Il compilatore dà errore se si cerca di modificare una variabile final.

Page 25: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

25Laboratorio di Programmazione - Luca Tesei

Costanti

● La dichiarazione di una variabile con lo specificatore final ha lo stesso effetto di una qualsiasi altra definizione di variabile

● Viene cioè allocata la nuova variabile sul frame corrente dell’attivazione corrente

● Al momento della chiusura del blocco del frame in cui è stata definita essa scompare

● E’ il controllo del compilatore che la rende non modificabile

Page 26: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

26Laboratorio di Programmazione - Luca Tesei

Costanti

● In genere però le costanti sono utili in diversi metodi della stessa classe

● Per evitare di dover ridefinire le variabili final in ogni metodo che le usa (ed evitare anche errori se il valore viene modificato solo in alcuni metodi, ad esempio in un’altra versione del programma) possiamo pensare di associare le costanti direttamente alla classe

● Per definire costanti che si riferiscono ad una classe si può usare lo specificatore static

Page 27: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

27Laboratorio di Programmazione - Luca Tesei

static

● Lo specificatore static deriva dal C e il suo nome può risultare fuorviante

● In Java, se nella definizione di una classe viene inserita una variabile istanza con lo specificatore static, quella variabile istanza va considerata come elemento della classe

● In genere le variabili istanza formano lo stato di ogni oggetto della classe che viene creato

● Le variabili istanza static invece non vanno a far parte dello stato degli oggetti della classe, ma fanno parte della definizione della classe stessa

Page 28: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

28Laboratorio di Programmazione - Luca Tesei

static

● Esiste una sola copia di una variabile istanza static di una classe e si riferisce all’intera classe

● Per riferirla e/o modificarla si usa la notazione NomeClasse.nomeVariabileIstanzaStatic

● Alle variabili istanza static possono essere associati tutti i possibili specificatori di accesso: public, private e protected

● Inoltre possono essere final, cioè costanti di classe

Page 29: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

29Laboratorio di Programmazione - Luca Tesei

Esempio

● Vedremo più avanti degli esempi in cui sono utili variabili static di classe

● Per adesso useremo questa possibilità solo per specificare costanti

● Nel nostro caso le costanti che indicano il valore di ogni moneta sembrano essere utili solo nel contesto della classe Purse e quindi le dichiariamo private

● Molte classi delle API hanno invece delle costanti pubbliche che si possono usare

Page 30: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

30Laboratorio di Programmazione - Luca Tesei

Esempio

public class Purse {...private static final double NICKEL_VALUE = 0.05;private static final double DIME_VALUE = 0.1;private static final double QUARTER_VALUE = 0.25;...}

Page 31: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

31Laboratorio di Programmazione - Luca Tesei

Esempio

● All’interno dei metodi della classe si possono riferire le variabili static (sia final che non) semplicemente con il loro nome (nel caso di conflitto va invece specificato il nome completo (cioè NomeClasse.nomeVariabile), ad esempio Purse.NICKEL_VALUE

public double getTotal() { return nickels * NICKEL_VALUE + dimes * DIME_VALUE + quarters * QUARTER_VALUE;}

Page 32: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

32Laboratorio di Programmazione - Luca Tesei

Operazioni fra interi e decimali

● In Java gli operatori + - * / si possono combinare come si vuole insieme a costanti numeriche, variabili di frame, variabili istanza e chiamate di metodi per ottenere espressioni aritmetiche

● Gli operandi possono essere sia numeri interi (byte, short, int, long) che numeri in virgola mobile (float, double)

● Il risultato è un intero solo se tutti gli operandi sono interi

● Basta che un solo operando si in virgola mobile perché il valore di tutta l’espressione sia in virgola mobile

Page 33: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

33Laboratorio di Programmazione - Luca Tesei

Espressioni aritmetiche

● La grammatica per le espressioni aritmetiche che si possono scrivere in Java è la seguente:

E E + T | E – T | T T T * F | T / F | F F -<Op> | <Op> <Op> (E) | <Num> | <Ide> | <DotExpr>● La grammatica implementa le regole tipiche di

associatività e precedenza degli operatori● F è un ulteriore livello di precedenza per l’operatore

unario – (che lega più di tutti) usato per cambiare il segno a un operando

Page 34: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

34Laboratorio di Programmazione - Luca Tesei

Espressioni aritmetiche

● <Num> è un simbolo non terminale che genera tutte le possibili costanti numeriche (intere e decimali, con o senza notazione esponenziale)

● <Ide> è un simbolo non terminale che genera tutti i possibili identificatori Java

● <DotExpr> è un simbolo non terminale che genera tutte le possibili espressioni formate da nomi e/o chiamate di metodi separate da punti (ad esempio myPurse.getTotal() rappresenta un double, this.nickels rappresenta un int all’interno di un metodo della classe Purse )

Page 35: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

35Laboratorio di Programmazione - Luca Tesei

Espressioni aritmetiche

● Esempi:– 7 * 4 valore 28 (int)

– 11 + 2.0 / 4 valore 11.5 (double)

– (11 + 2.0) / 4 valore 3.25 (double)

– this.nickels * this.getTotal() – 3 * 7 supponendo che il valore della variabile istanza nickel dell’oggetto this sia 3 (int) e che il totale this.getTotal() sia 12.5 (double) si ottiene un valore double a causa del valore double dell’operando this.getTotal(). Il valore è 16.5

Page 36: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

36Laboratorio di Programmazione - Luca Tesei

Divisione

● Bisogna prestare un’attenzione particolare al simbolo /

● In Java esso rappresenta sia la divisione usuale che la divisione intera

● Viene applicata la divisione intera se entrambi gli operandi sono interi

● La divisione intera restituisce solo la parte intera del risultato!

● 7 / 4 valore 1! Non 1.75!● 7 / 4.0 valore 1.75 (4.0 non intero)

Page 37: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

37Laboratorio di Programmazione - Luca Tesei

Resto della divisione intera

● Il simbolo % è un operatore binario che si può applicare solo fra due interi

● Calcola il resto della divisione intera fra il primo e il secondo

● 7 % 4 valore 3

Page 38: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

38Laboratorio di Programmazione - Luca Tesei

Errore comune

● L’overloading del simbolo / porta spesso ad errori logici difficili da individuare

● Ad esempio:...int p1 = 21; // punteggio prima provaint p2 = 24; // punteggio seconda provaint p3 = 22; // punteggio terza provadouble media = (p1 + p2 + p3) / 3;System.out.println(media); /* Stampa 22.0! Non 22.3333333!! */

Page 39: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

39Laboratorio di Programmazione - Luca Tesei

Errore comune

● Per ottenere il risultato che vogliamo bisogna fare in modo che almeno uno degli operandi sia un double

// Se un intero viene assegnato a una variabile// di tipo double viene convertito a doubledouble totale = p1 + p2 + p3; // totale è un valore doubledouble media = totale / 3.0;

Oppuredouble media = (p1 + p2 + p3) / 3.0;

Page 40: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

40Laboratorio di Programmazione - Luca Tesei

Metodi static

● La classe java.lang.Math (vedi API) è una collezione di costanti e metodi static

● Abbiamo già visto che una variabile istanza dichiarata come static si riferisce alla classe e ne esiste un’unica copia (non viene inserita nello stato degli oggetti della classe che vengono creati)

● Anche un metodo può essere dichiarato come static e, analogamente, esso si riferisce alla classe

● È analogo a una funzione del C

Page 41: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

41Laboratorio di Programmazione - Luca Tesei

Metodi static

● Un metodo static non può essere invocato su un oggetto della classe

● L’unico modo per mandare in esecuzione il metodo static è quello di scrivere NomeClasse.nomeMetodo(parametri);

● All’interno di un metodo statico non è disponibile il parametro implicito this (poiché non c’è nessun oggetto su cui il metodo è stato invocato)

● Per il resto il meccanismo di esecuzione è analogo a quello dei metodi non statici (in particolare la creazione di una nuova attivazione e il meccanismo di passaggio e gestione dei parametri espliciti)

Page 42: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

42Laboratorio di Programmazione - Luca Tesei

Funzioni e costanti matematiche

● Definite nella classe java.lang.Math come costanti e metodi static

● Pi greco: Math.PI● Base dei logaritmi naturali: Math.E● Radice quadrata:

double radiceDi2 = Math.sqrt(2);● Coseno:

double cosenoDiPiGrecoMezzi = Math.cos(Math.PI / 2);● Consultare le API per vedere tutte le altre funzioni

disponibili

Page 43: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

43Laboratorio di Programmazione - Luca Tesei

Conversioni di tipi

● Il compilatore esegue alcune conversioni di tipo implicitamente:

● Quando un valore intero viene assegnato ad una variabile double o float, il valore viene convertito in double o float automaticamente

...

double pippo = 4; // 4 è una costante intera

System.out.println(pippo); // Stampa 4.0 ● 4.0 è la rappresentazione di una costante a virgola

mobile (c’è il punto decimale)

Page 44: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

44Laboratorio di Programmazione - Luca Tesei

Conversioni esplicite

● La conversione precedente viene eseguita automaticamente perché non comporta nessuna perdita di informazione (i numeri interi hanno i loro corrispondenti nei numeri a virgola mobile)

● Quando un assegnamento, invece, può provocare una perdita di informazione viene segnalato dal compilatore come errore

● Una errore di questo genere si ha, ad esempio, quando si tenta di assegnare un valore a virgola mobile ad una variabile intera

int prova = 3.5; // Errore di // compilazione

Page 45: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

45Laboratorio di Programmazione - Luca Tesei

Conversioni esplicite

● Per forzare il compilatore ad accettare l’assegnamento (se si vuole accettare la perdita di informazione che ne deriva) si deve fare una conversione di tipo esplicita

● Questa operazione si chiama castingint prova = (int)3.5; // accettato● L’effetto di questo casting è di buttare via la

parte decimale del numero a virgola mobile e di assegnare a prova solo la parte intera 3

Page 46: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

46Laboratorio di Programmazione - Luca Tesei

Casting

● Il casting si può fare fra diversi tipi base● Ogni volta che si fa si accetta la possibilità di

perdere informazione● Ad esempio, facendo un casting da double a float si potranno perdere alcune cifre significative

● Così come facendo un casting da int a short

Page 47: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

47Laboratorio di Programmazione - Luca Tesei

Casting

● L’operatore di casting (il tipo tra parentesi) lega più degli operatori aritmetici

double total = 3.456; int prova = (int) total * 100;● Esegue il casting su total e il valore di prova

sarà 300int prova = (int)(total * 100);● Esegue il casting sul valore della moltiplicazione

e il valore di prova sarà 345

Page 48: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

48Laboratorio di Programmazione - Luca Tesei

Arrotondamenti

● Il casting da valori a virgola mobile a interi produce come risultato la parte intera del valore, anche se il valore è molto prossimo al valore intero successivo

int prova = (int) 4.99; // prova vale 4● Per eseguire gli arrotondamenti secondo la regola

usuale (se il primo decimale è da 0 a 4 si prende la parte intera, altrimenti la parte intera + 1) si può usare il metodo static Math.round (consultare le API: il valore restituito da Math.round è un long! Quindi bisogna fare un ulteriore casting se si vuole assegnare il risultato ad un int)

Page 49: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

49Laboratorio di Programmazione - Luca Tesei

Classi involucro

● Ognuno dei tipi base di Java ha una classe corrispondente nel pacchetto java.lang (consultare le API)

● Queste classi vengono dette classi involucro ● Gli oggetti di queste classi possono un valore

del tipo base corrispondente● La vera utilità sta nelle costanti e nei metodi

statici che forniscono

Page 50: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

50Laboratorio di Programmazione - Luca Tesei

Classe Integer

● Prendiamo ad esempio la classe java.lang.Integer

● Un oggetto di questa classe può contenere un valore intero

● Tale valore non si trova in una variabile di frame come i soliti int

● Si trova nello heap all’interno dell’oggetto corrispondente

● Costanti static utili della classe: – Integer.MIN_VALUE (minimo int rappresentabile)– Integer.MAX_VALUE (massimo int rappresentabile)

Page 51: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

51Laboratorio di Programmazione - Luca Tesei

Classe Integer

● Metodi statici pubblici utili della classe Integerpublic static int parseInt(String s)● Cerca di interpretare il contenuto della stringa s

come la rappresentazione di una costante intera:• Integer.parseInt(“15”) restituisce l’intero

15

Page 52: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

52Laboratorio di Programmazione - Luca Tesei

Classe Integer

● Se la stringa contiene dei caratteri che non possono essere considerati la rappresentazione di un intero allora il metodo parseInt lancerà un’eccezione

● Le eccezioni sono il meccanismo di base di Java per gestire gli errori

● Per adesso non gestiamo questa eccezione, vedremo più avanti come si fa

● Se un’eccezione non viene gestita (il termine giusto sarebbe “catturata”) il programma termina con errore indicando quale eccezione si è verificata e la pila di attivazioni corrente (ci permette di risalire al punto preciso del programma in cui si è verificata)

Page 53: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

53Laboratorio di Programmazione - Luca Tesei

Esercizio

● Riscrivere il costruttore della classe Purse in modo che chieda in input il numero di monete iniziali

● Aggiungere alla classe Purse un metodo che restituisca il totale in dollari e in penny (100 penny = 1 dollaro) (Suggerimento: usare la divisione intera e il resto della divisione intera)

Page 54: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

54Laboratorio di Programmazione - Luca Tesei

Esercizio

● Scrivere una classe RisolutoreEquazione2Grado

● Il costruttore deve chiedere in input i coefficienti a, b, c dell’equazione

● Implementare i due metodi per dare le due soluzioni:– public double getFirstSolution()

– public double getSecondSolution()

● Scrivere una classe di test

Page 55: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

55Laboratorio di Programmazione - Luca Tesei

Esercizio

● Scrivere un programma che assista un cassiere nel dare il resto

● Input: sommaDaPagare e sommaRicevuta● La differenza sommaRicevuta –

sommaDaPagare rappresenta il resto da dare● Il resto deve essere corrisposto usando le

seguenti banconote/monete: 1 dollaro, 1 Quarter, 1 Dimes, 1 Nickel, 1 Penny

● Il programma deve indicare quante monete di ogni tipo il cassiere deve dare --continua

Page 56: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

56Laboratorio di Programmazione - Luca Tesei

Esercizio cont’d

● Il programma deve fornire una soluzione che corrisponda all’erogazione del minimo numero possibile di banconote/monete

● EsempioCassiere harry = new Cassiere();

harry.setSommaDaPagare(8.37);

harry.riceve(10);

int dollars = harry.returnDollars(); // Restituisce 1

int quarters = harry.returnQuarters(); // Restituisce 2

int dimes = harry.returnDimes(); // Restituisce 1

int nickels = harry.returnNickels(); // Restituisce 0

int pennies = harry.returnPennies(); // Restituisce 3

Page 57: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

57Laboratorio di Programmazione - Luca Tesei

Esercizio

● Scrivere un programma che legge un numero intero e poi stampa le sue cifre, una ad una, in ordine inverso

● Esempio: se leggo 78349

● Deve stampare

● 9

● 4

● 3

● 8

● 7

Page 58: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

58Laboratorio di Programmazione - Luca Tesei

Esercizio

● Scrivere un programma che calcoli la data della domenica di Pasqua, che è la prima domenica dopo la prima luna piena di primavera, di un qualunque anno.

● Si usi il seguente algoritmo ideato da Carl Friedrich Gauss nel 1800:

● Sia y l’anno (1800, 2001, ...)

● Dividi y per 19 ottenendo il resto a. Ignora il quoziente

● Dividi y per 100 ottenendo il quoziente b e il resto c● Continua

Page 59: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

59Laboratorio di Programmazione - Luca Tesei

Esercizio cont’d

● Dividi b per 4 ottenendo quoziente d e resto e● Dividi 8 * b + 13 per 25 ottenendo il quoziente g.

Ignora il resto.● Dividi 19 * a + b - d - g + 15 per 30 ottenendo il

resto h. Ignora il quoziente.● Dividi c per 4 , ottenendo il quoziente j e il resto k● Dividi a + 11 * h per 319, ottenendo il quoziente m.

Ignora il resto● Continua

Page 60: Numeri, espressioni, calcoli, caratteri, input · Numeri in virgola mobile Possono contenere cifre decimali Contengono un certo numero di cifre significative e la posizione della

60Laboratorio di Programmazione - Luca Tesei

Esercizio cont’d

● Dividi 2 * e + 2 * j - k - h + m + 32 per 7 ottenendo il resto r. Ignora il quoziente

● Dividi h - m + r + 90 per 25, ottenendo il quoziente n. Ignora il resto

● Dividi h - m + r + n + 19 per 32 ottenendo il resto p. Ignora il quoziente

● Pasqua cade il giorno p del mese n● Scrivere una classe Year con metodi getEasterDay() e getEasterMonth()