giovedì 29 maggio 2014

Programmazione: Capitolo 4, Parte 1

Tipi di numeri
§ int: numeri interi, no parti frazionarie
1, -4, 0

§ double: numeri in virgola mobile
0.5, -3.11111, 4.3E24, 1E-14

Tipi numerici
§ Un calcolo numerico trabocca se il risultato esce
dall’intervallo del tipo numerico.

int n = 1000000;
System.out.println(n * n); // visualizza -727379968

§ Java ha otto tipi primitivi, fra i quali quattro tipi interi
e due tipi in virgola mobile.










Tipi primitivi

Tipi numerici: virgola mobile
§ Avvengono errori di arrotondamento quando non si può
fare una conversione numerica esatta.
double f = 4.35;
System.out.println(100 * f); // visualizza 434.99999999999994

§ In Java non si può assegnare un valore in virgola mobile
a una variabile intera:

double balance = 13.75;
int dollars = balance; // Errore

Tipi numerici: virgola mobile
§ Cast (forzatura): converte in numero intero il valore in
virgola mobile
                    
int dollars = (int) balance;

Il cast (int) ignora la parte frazionaria.

§ Il metodo Math.round arrotonda un numero in virgola
mobile all'intero più vicino

long rounded = Math.round(balance));

Se balance vale 13.75, allora a rounded viene
assegnato il valore 14.

Sintassi 4.1: Cast
(nomeTipo) espressione
Esempio:
(int) (balance * 100)
Obiettivo:
Convertire un’espressione in un tipo di dati diverso.

Numeri grandi e precisione final
§ classi BigInteger (numeri interi grandi) e BigDecimal
(numeri frazionari grandi) in java.math
Pro: Altissima “capienza” e precisione
Contro: Lentezza. Bisogna usare metodi per eseguire
operazioni (add, subtract e multiply)

BigInteger n = new BigInteger(“1000000”);
BigInteger r = n.multiply(n);
System.out.println(r); // Visualizza 1000000000000

BigDecimal d = new BigDecimal(“4.35”);
BigDecimal e = new BigDecimal(“100”);
BigDecimal f = d.multiply(e);
System.out.println(f); // Visualizza 435.00




Costanti final
§ Una variabile final è una costante
§ dopo che le è stato assegnato un valore, non può più essere
modificato.
§ Dare un nome alle costanti rende i programmi più facili da
leggere e da modificare.
Non usare numeri “magici”! Introdurre una costante
§ Convenzione: per le costanti utilizzare nomi con tutte le lettere
maiuscole.
final double QUARTER_VALUE = 0.25;
final double DIME_VALUE = 0.1;
final double NICKEL_VALUE = 0.05;
final double PENNY_VALUE = 0.01;
payment = dollars + quarters * QUARTER_VALUE + dimes * DIME_VALUE
+ nickels * NICKEL_VALUE + pennies * PENNY_VALUE;

Costanti static final
§ Spesso le costanti vengono usate in più metodi, per cui è
necessario dichiararle insieme ai campi di esemplare della
classe, identificandole come static, oltre che final.
§ Metodi di altre classi possono accedere a una costante
pubblica indicando il nome della classe in cui essa è
definita, seguito da un punto e dal nome della costante
stessa. Esempio Math.PI.
La classe Math della libreria standard definisce un paio di utili costanti:

public class Math
{
. . .
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
}


Sintassi 4.2: Definizione di costante
Come variabile locale di un metodo o come attributo di un oggetto:
final nomeTipo nomeVariabile = espressione;
In una classe:
specificatoreDiAccesso static final nomeTipo nomeVariabile
= espressione;
Esempio:
final double NICKEL_VALUE = 0.05;
public static final double LITERS_PER_GALLON = 3.785;
Obiettivo:
Definire una costante come variabile locale di un metodo,
o come attributo di un oggetto, o come variabile di classe.
File CashRegister.java
01: /**
02: Un registratore di cassa somma gli articoli venduti
e calcola il resto dovuto al cliente.
03: */
04: public class CashRegister
05: {
06: /**
07: Costruisce un registratore di cassa senza soldi
nel cassetto.
08: */
09: public CashRegister()
10: {
11: purchase = 0;
12: payment = 0;
13: }
14:
15: /**
16: Registra la vendita di un articolo.
17: @param amount il prezzo dell'articolo
18: */
19: public void recordPurchase(double amount)
20: {
21: purchase = purchase + amount;
22: }
23:
24: /**
25: Registra la quantità di denaro ricevuta per il pagamento.
26: @param dollars il numero di dollari pagati
27: @param quarters il numero di quarti di dollaro pagati
28: @param dimes il numero di decimi di dollaro pagati
29: @param nickels il numero di nickel di dollaro pagati
30: @param pennies il numero di penny di dollaro pagati
31: */
32: public void enterPayment(int dollars, int quarters,
33: int dimes, int nickels, int pennies)
34: {
35: payment = dollars + quarters * QUARTER_VALUE
+ dimes * DIME_VALUE
36: + nickels * NICKEL_VALUE + pennies
* PENNY_VALUE;
37: }
38:
39: /**
40: Calcola il resto dovuto al cliente e azzera
la macchina per la vendita successiva.
41: @return il resto dovuto al cliente
42: */

43: public double giveChange()
44: {
45: double change = payment - purchase;
46: purchase = 0;
47: payment = 0;
48: return change;
49: }
50:
51: public static final double QUARTER_VALUE = 0.25;
52: public static final double DIME_VALUE = 0.1;
53: public static final double NICKEL_VALUE = 0.05;
54: public static final double PENNY_VALUE = 0.01;
55: // campi di esemplare
56: private double purchase;
57: private double payment;
58: }

File CashRegisterTester.java
01: /**
02: Classe che collauda la classe CashRegister.
03: */
04: public class CashRegisterTester
05: {       
06: public static void main(String[] args)
07: {
08: CashRegister register = new CashRegister();
09:
10: register.recordPurchase(0.75);
11: register.recordPurchase(1.50);
12: register.enterPayment(2, 0, 5, 0, 0);
13: System.out.print("Change=");
14: System.out.println(register.giveChange());
15:
16: register.recordPurchase(2.25);
17: register.recordPurchase(19.25);
18: register.enterPayment(23, 2, 0, 0, 0);
19: System.out.print("Change=");
20: System.out.println(register.giveChange());
21: }
22: }
Visualizza
Change=0.25
Change=2.0




Assegnazione, incremento e decremento
§ L'operatore = è detto operatore di assegnazione
§ alla sua sinistra ci deve essere il nome di una variabile, mentre alla
destra ci può essere un singolo valore o un’espressione
§ imposta la variabile al valore dato s = items + 1;m
§ L’assegnazione di un valore a una variabile non è
un’uguaglianza matematica.
§ Gli operatori ++ e – – incrementano e decrementano una
variabile di un’unità.
§ items++ ha lo stesso effetto di items = items + 1
§ items-- sottrae 1 a items

Assegnazione, incremento e decremento

Incrementare una variabile


Operazioni aritmetiche
§ / è l'operatore per la divisione
§ Se entrambi gli argomenti dell’operatore / sono di tipo
intero, il risultato è un numero intero e il resto viene
ignorato.
§ 7.0 / 4 restituisce 1.75
7 / 4 restituisce 1
§ L’operatore % calcola il resto di una divisione.
§ 7 % 4 è 3

Divisione tra interi
§ Errore comune
int s1 = 5; // punteggio della prova 1
int s2 = 6; // punteggio della prova 2
int s3 = 3; // punteggio della prova 3
double averageErr = (s1 + s2 + s3) / 3; // Errore
double averageOk1 = (s1 + s2 + s3) / 3.0; // OK
double sum = s1 + s2 + s3;           
double averageOk2 = sum / 3; // OK
La classe Math
§ La classe Math contiene i metodi sqrt e pow per
calcolare radici quadrate e potenze.
§ Per calcolare xn, si usa il metodo Math.pow(x, n)
§ tuttavia, per calcolare x2 è molto più efficiente scrivere
semplicemente x * x
§ Per estrarre la radice quadrata di un numero, si usa il
metodo Math.sqrt scrivendo Math.sqrt(x)
§ In Java,
 diventa
(-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a)




Metodi matematici in Java

Nessun commento:

Posta un commento