Tipi Fondamentali C. Horstmann Fondamenti di programmazione e Java 2 3^ edizione Apogeo trad. Nicola Fanizzi corso di Programmazione, CdS: Informatica TPS Dip. di Informatica, Università degli studi di Bari 1
Obiettivi 2 Capire numeri interi e a virgola mobile Riconoscere i limiti dei tipi numerici Tener conto delle cause di overflow ed errori di arrotondamento Capire l'uso indicato delle costanti
Obiettivi 3 Scrivere espressioni aritmetiche in Java Usare il tipo String per definire e manipolare stringhe di caratteri Imparare a leggere l'input del programma ed a produrre un output formattato
Tipi Numerici 4 int: : interi, nessuna parte decimale 1, -4, 0 double: : numeri a virgola mobile (doppia precisione) 0.5, -3.11111, 4.3E24, 1E-14
Tipi Numerici 5 Un calcolo numerico va in overflow se il risultato ricade fuori dall'intervallo di valori del tipo numerico int n = 1000000; System.out.println(n * n); // stampa -727379968 Java: 8 tipi primitivi quattro tipi interi e due tipi reali in virgola mobile
Tipi Primitivi 6 Tipo Descrizione Intervallo Dimensioni int byte Interi 2,147,483,648... 2,147,483,647 4 byte singolo byte -128... +127 1 byte short intero corto 32768... 32767 2 byte long intero lungo 9,223,372,036,854,775,808 8 byte... +9,223,372,036,854,775,807
Tipi Primitivi 7 Tipo double Descrizione reali virgola mobile in doppia precisione Intervallo ±10 308, 15 cifre significative circa Dimensioni 8 byte float reali virgola mobile in singola precisione Intervallo ±10 38, 7 cifre significative circa 4 byte char caratteri nella codifica UNICODE 2 byte boolean valori logici true / false 1 byte
Tipi Floating-point 8 Gli errori di arrotondamento accadono quando non è possibile una conversione esatta tra numeri double f = 4.35; System.out.println(100 * f); // stampa 434.99999999999994 In Java è illegale assegnare una espressione floating-point ad una variabile intera double balance = 13.75; int dollars = balance; // Errore
Tipi Floating-point 9 Cast: : meccanismo usato per convertire un valore in un tipo diverso int dollars = (int) balance; // OK Il cast taglia la parte frazionaria Math.round: : converte un numero floating-point all'intero più vicino long rounded = Math.round(balance); // se balance è 13.75, allora // rounded è impostato a 14
Sintassi 4.1: Cast 10 (typename) expression Esempio: (int) (balance * 100) Esempio Scopo: Convertire un'espressione in un tipo differente
Costanti: final 11 Una variabile final rappresenta una costante Una volta che il suo valore è stato impostato esso non può essere cambiato Le costanti dotate di nome rendono il programma più facile da leggere e modificare Convenzione: si usano per le costanti identificatori fatti da sole 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 12 Se occorrono valori costanti in molti metodi, meglio dichiararle insieme ai campi della classe e segnalarle come static e final Dichiarare public le costanti static final abilita l'accesso da parte di altre classi public class Math {... public static final double E = 2.7182818284590452354; public static final double PI = 3.14159265358979323846; } double circumference = Math.PI * diameter;
Sintassi 4.2: 13 In un metodo: Definizione di Costanti final typename variablename = expression ; In una classe: accessspecifier static final typename variablename = expression ; Esempio final double NICKEL_VALUE = 0.05; public static final double LITERS_PER_GALLON = 3.785; Scopo: : definire una costante in un metodo o classe
CashRegister.java 14 01: /** 02: Registratore di cassa che cacola i totali della spesa e il resto dovuto 03: */ 04: public class CashRegister 05: { 06: /** 07: Costruisce un registratore senza denaro. 08: */ 09: public CashRegister() 10: { 11: purchase = 0; 12: payment = 0; 13: } 14: 15: /** 16: Registra il prezzo d'acquisto di un pezzo. 17: @param amount il prezzo del pezzo 18: */ 19: public void recordpurchase(double amount) 20: { 21: purchase = purchase + amount; 22: }
CashRegister.java 15 23: 24: /** 25: Inserisce il pagamento ricevuto dal cliente. 26: @param dollars numero di dollari 27: @param quarters numero di quarti di dollaro 28: @param dimes numero di decimi di dollaro 29: @param nickels numero di nichelini (5 cents) 30: @param pennies numero di centesimi 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:
CashRegister.java 16 39: /** 40: Calcola il resto dovuto e resetta la macchina per il prossimo cliente. 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: 56: private double purchase; 57: private double payment; 58: }
Collaudo di CashRegister.java 17 01: /** 02: This class tests the CashRegister class. 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:
Collaudo di CashRegister.java 18 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: } Output Change=0.25 Change=2.0
Assegnazione 19 Incremento e Decremento L'assegnazione si differenzia dall'uguaglianza matematica: items = items + 1; items++ equivale a items = items + 1 items-- sottrae 1 da items
Assegnazione 20 Incremento e Decremento
Operazioni Aritmetiche 21 / è l' operatore di divisione Se entrambi gli argomenti sono interi allora il risultato è un intero. Il resto viene tralasciato 7.0/4 dà 1.75 7/4 dà 1 Si ottiene il resto con l'operatore % (modulo) 7%4 dà 3
Operazioni Aritmetiche 22 final int PENNIES_PER_NICKEL = 5; final int PENNIES_PER_DIME = 10; final int PENNIES_PER_QUARTER = 25; final int PENNIES_PER_DOLLAR = 100; // calcola il totale in centesimi (penny) int total = dollars * PENNIES_PER_DOLLAR + quarters * PENNIES_PER_QUARTER + nickels * PENNIES_PER_NICKEL + dimes * PENNIES_PER_DIME + pennies; // Usa la divisione intera per convertire in dollari, cents int dollars = total / PENNIES_PER_DOLLAR; int cents = total % PENNIES_PER_DOLLAR;
The Math class 23 Classe Math: : contiene metodi come sqrt e pow Per calcolare x n, si scrive Math.pow(x,n) Per calcolare x 2, Math.pow è significativamente più efficiente rispetto a calcolare semplicemente x * x Per estrarre la radice quadrata di un numero, si usa Math.sqrt ad esempio: Math.sqrt(x)
The Math class 24 In Java si può rappresentare con (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a)
Metodi Matematici in Java 25 Math.sqrt(x) Math.pow(x,y) Math.exp(x) Math.log(x) Math.sin(x) Math.cos(x) Math.tan(x) Math.round(x) Math.min(x,y) Math.max(x,y) radice quadrata di x potenza x y esponenziale e x logaritmo naturale di x seno di x coseno di x tangente di x intero più vicino a x minimo tra x e y massimo tra x e y
Analizzare un'espressione 26
Chiamare Metodi static 27 Un metodo static non opera su un oggetto double x = 4; double root = x.sqrt(); // Errore I metodi static sono definiti all'interno delle classi Convenzione: I nomi delle classi iniziano con una maiuscola; quelli degli oggetti con una minuscola Math System.out
Sintassi 4.3: 28 Chiamare Metodi static ClassName.methodName methodname(parameters); Esempio Math.sqrt(4) Scopo: : invocare un metodo statico fornendogli i parametri espliciti (non necessità di oggetto come parametro implicito)
Stringhe 29 Una stringa è una sequenza di caratteri Le stringhe sono oggetti della classe String Costanti String: "Hello, World!" Variabili String: Lunghezza delle stringhe: Stringa vuota: "" String message = "Hello, World!"; int n = message.length();
Concatenazione 30 Si usa l'operatore +: String name = "Dave"; String message = "Hello, " + name; // message è "Hello, Dave" Se uno degli argomenti dell'operatore + è una stringa, l'altro viene convertito in stringa String a = "Agent"; int n = 7; String bond = a + n; // bond è Agent7
Concatenazione 31 nelle Istruzioni di Stampa Utili a ridurre il numero di istruizioni System.out.print System.out.print("The total is "); System.out.println(total); si può scrivere: System.out.println("The total is " + total);
Conversione tra Stringhe-Numeri 32 Convertire in numero: int n = Integer.parseInt(str); double x = Double.parseDouble(x); Convertire in stringa: String str = "" + n; str = Integer.toString(n);
Sottostringhe 33 String greeting = "Hello, World!"; String sub = greeting.substring(0, 5); // sub is "Hello" Fornire le posizioni di inizio e dopo la fine Prima posizione 0
Sottostringhe 34 La lunghezza di una sottostringa è pari a oltrelafine - inizio
Alfabeti Internazionali 35 Tastiera Tedesca
Alfabeti Internazionali 36 Alfabeto Thai
Alfabeti Internazionali 37 Menù con cratteri cinesi
Leggere l'input 38 System.in ha un insieme di caratteristiche minimali può solo leggere un byte alla volta Da Java 5.0, è stata aggiunta la classe Scanner per leggere l'input da tastiera in maniera utile Scanner in = new Scanner(System.in); System.out.print("Enter quantity: "); int quantity = in.nextint(); nextdouble legge un double nextline legge una riga di caratteri (fino all'invio) nextword legge una word (fino ad un qualunque blank)
InputTester 39 01: import java.util.scanner; 02: 03: /** 04: Questa classe collauda l'input da console 05: */ 06: public class InputTester 07: { 08: public static void main(string[] args) 09: { 10: Scanner in = new Scanner(System.in); 11: 12: CashRegister register = new CashRegister(); 13: 14: System.out.print("Enter price: "); 15: double price = in.nextdouble(); 16: register.recordpurchase(price); 17:
InputTester 40 18: System.out.print("Enter dollars: "); 19: int dollars = in.nextint(); 20: System.out.print("Enter quarters: "); 21: int quarters = in.nextint(); 22: System.out.print("Enter dimes: "); 23: int dimes = in.nextint(); 24: System.out.print("Enter nickels: "); 25: int nickels = in.nextint(); 26: System.out.print("Enter pennies: "); 27: int pennies = in.nextint(); 28: register.enterpayment(dollars, quarters,dimes, nickels, pennies); 29: 30: System.out.print("Your change is "); 31: System.out.println(register.giveChange()); 32: } 33: }
InputTester 41 Output Enter price: 7.55 Enter dollars: 10 Enter quarters: 2 Enter dimes: 1 Enter nickels: 0 Enter pennies: 0 Your change is 3.05
Leggere l'input 42 con una Dialog Box
Leggere l'input 43 con una Dialog Box String input = JOptionPane.showInputDialog(prompt) Converte stringhe in numeri se necessario: int count = Integer.parseInt(input); La conversione lancia un'eccezione se l'utente non fornisce un numero (vedi cap. 15) Aggiungere System.exit(0) al metodo main di un programma che usi JOptionPane