Aritmetica Un approccio metodologico alla costruzione dei programmi. Tipi di dati primitivi. int, float, double Variabili, dichiarazioni e operazioni Progetto dei programmi 2 Definizione del problema Scenario d esempio Individuazione degli oggetti primari Determinazione del comportamento desiderato Determinazione delle interfacce Definizione delle variabili di istanza Implementazione dei metodi
3 Aritmetica Java offre un tipo predefinito, int, che modella il comportamento dei numeri interi Il tipo fornisce le operazioni aritmetiche di base Es:+. -. *, / Espressioni: x+(y/z), System.out.println(rate*hours) I tipi primitivi NON hanno variabili di istanza, metodi, costruttori, new Alle variabili intere si assegnano valori interi int i; i=5; int i=5; Un esempio: 4 Descrizione del problema Modellare un sistema di raccolta dei pedaggi per autostrade I camion pagano $5 per asse più $10 per ogni mezza tonnellata di peso totale Un display nel casello visualizza i pagamenti ed il numero di camion che hanno pagato dall ultima raccolta
Un esempio: 5 Scenario d esempio Nel casello ci sono lo schermo di un calcolatore ed un lettore di codici a barre Per leggere il numero di assi il casellante legge un codice a barre sul parabrezza del camion Il peso è letto da un codice a barre su un biglietto consegnato dal conducente del camion Le informazioni sul camion e sull ammontare del pedaggio sono visualizzate sullo schermo Il casellante può richiedere la visualizzazione dei dati registrati dall ultimo prelievo della cassa All atto del prelievo della cassa compare un opportuno messaggio con l indicazione dei dati di riepilogo Un esempio: 6 Scenario d esempio - Messaggi Truck arrival - axles: 5 total weight: 12500 Toll due: $145 Totals since last collection - Receipts: $205 Trucks: 2 *** Collecting receipts *** Totals since last collection - Receipts: $523 Trucks: 5
Un esempio: 7 Individuazione degli oggetti primari Un buon punto di partenza: le parole chiave contenute nella presentazione del problema Camion, casello, peso, ricevuta Nel nostro caso: camion e casello Class Truck {. Class ToolBooth {. Un esempio: 8 Comportamento desiderato La classe camion Metodi per ottenere le informazioni necessarie al calcolo del pedaggio, numero assi e peso Un costruttore Truck getaxles getweight
Un esempio: 9 Interfaccia La classe camion La creazione di un camion richiede l indicazione del numero di assi e del peso Truck(int axles, int weight) La richiesta di numero di assi e peso avviene senza parametri getaxles() getweight() Un esempio: Variabili di istanza La classe camion Ogni oggetto di tipo camion deve memorizzare il proprio numero di assi ed il proprio peso 10 class Truck { // Methods... // Instance Variables private int axles; private int totalweight;
Un esempio: 11 Metodo costruttore La classe camion Deve semplicemente inizializzare le variabili di istanza public Truck(int axles, int totalweight) { this.axles = axles; this.totalweight = totalweight; Un esempio: 12 Altri metodi La classe camion Devono semplicemente ritornare il valore delle variabili di istanza public int getaxles() {return axles; public int gettotalweight() {return totalweight;
Un esempio: 13 Comportamento desiderato La classe Tollbooth Creazione di un casello Calcolo del pedaggio Visualizzazione dei dati dall ultima raccolta Raccolta TollBooth calculatetoll displaydata onreceiptcollection Un esempio: 14 Interfaccia La classe Tollbooth Scenari d uso Creazione di un casello TollBooth booth = new TollBooth() Calcolo del pedaggio; richiede la conoscenza delle caratteristiche del camion booth.calculatetoll(truck1);
Un esempio: 15 Interfaccia La classe Tollbooth Visualizzazione dei totali booth.displaydata(); Prelievo della cassa booth.onreceiptcollection(); Un esempio: 16 Interfaccia La classe Tollbooth class TollBooth { // Methods public TollBooth() {... public void calculatetoll(truck truck) {... public void onreceiptcollection() {... public void displaydata() {... // Instance Variables...
Un esempio: Variabili di istanza La classe Tollbooth Un oggetto di tipo casello deve memorizzare le somme ricevute ed il numero di camion passati dall ultimo prelievo di cassa class TollBooth { // Methods // come prima // Instance Variables private int receiptssincecollection, truckssincecollection; 17 Un esempio: 18 Metodo costruttore La classe Tollbooth Deve inizializzare a zero le variabili di istanza public TollBooth() { truckssincecollection = 0; // Clear out totals receiptssincecollection = 0;
Un esempio: 19 Metodo DisplayData La classe Tollbooth Visualizza i totali sullo schermo (System.out) public void displaydata() { System.out.print("Totals since last collection " + "Receipts: " + receiptssincecollection + " Trucks: " + truckssincecollection); Un esempio: Metodo onreceiptcollection La classe Tollbooth Visualizza i totali all atto del prelievo della cassa e reinizializza le variabili di istanza Usa il metodo displaydata public void onreceiptcollection() { System.out.println("*** Collecting receipts ***"); displaydata(); truckssincecollection = 0; // Clear out totals receiptssincecollection = 0; 20
Un esempio: Metodo calculatetoll La classe Tollbooth Calcola e visualizza il dovuto public void calculatetoll(truck truck) { int axles = truck.getaxles(); int totalweight = truck.gettotalweight(); int tolldue = 5*axles+5*(totalWeight/1000); System.out.print("Truck arrival - axles: "); System.out.print(axles); System.out.print(" total weight: "); System.out.print(totalWeight); System.out.print(" Toll due: "); System.out.println(tollDue); truckssincecollection = truckssincecollection + 1; receiptssincecollection = receiptssincecollection + tolldue; 21 class TestTollBooth { public static void main(string [] args) { // Create the tollbooth TollBooth booth = new TollBooth(); la raccolta dei pedaggi Un programma di prova: // Now for some trucks Truck truck1 = new Truck(5, 12500); Truck truck2 = new Truck(2, 5000); Truck truck3 = new Truck(6, 17000); // Let's start collecting tolls! booth.calculatetoll(truck1); booth.displaytotals(); booth.calculatetoll(truck2); // Time to collect the receipts booth.onreceiptcollection(); // Here comes another truck booth.calculatetoll(truck3); booth.displaytotals(); 22
23 Tipi primitivi in Java I numeri interi sono un tipo dato base dell hardware del calcolatore Java offre un accesso diretto a tale rappresentazione mediante il tipo int I tipi primitivi NON hanno oggetti associati, ma valori String s = new String( Hello ) Int i=3 s Hello 3 i 24 Tipi primitivi e classi reference variable primitive data variable type defined by class definition language value created by new underlying value initialized by constructor underlying variable initialized by assignment of reference assignment of primitive value data value variable contains reference to object primitive value used with messages operator symbols can specify a receiver yes no
25 Operatori ed espressioni + addizione - sottrazione * moltiplicazione / divisione % resto Gli operatori agiscono su valori (operandi) per formare espressioni x+y; (x+y)*(z-3); 26 Literal e costanti Literal (costanti letterali) 2 5 32 Costanti Variabili il cui valore NON può cambiare dopo l inizializzazione Semplificano la lettura e la modifica del codice Parola chiave: final static final int DuePerAxle = 5, DuePerHalfTon = 10 TonInPounds = 2000; ES: modificare il costo per asse da $5 a$7
27 Precedenze Si applicano le regole solite Moltiplicazione e divisione prima di addizione e sottrazione 2+3*5 è interpretata come 2+(3*5) Ovviamente le parentesi possono cambiare tali precedenza e rendere le cose più chiare 28 Assegnamento composto Molto spesso la variabile cui assegnare il valore dell espressione entra anche a far parte dell espressione ì=ì+valore; In generale: x = x op some-value value; dove op è un operando Possono essere abbreviate in x op = some-value
29 Esempi yeartodate = yeartodate + currentwages; salary = salary * 1.20; yeartodate + = currentwages; salary * = 1.20; 30 Tavola riassuntiva Operator Comp. Ass. Effect + += add and assign - -= subtract and assign * *= multiply and assign / /= divide and assign % %= take remainder and assign
31 Incrementi e decrementi Molto frequenti sono gli incrementi ed i decrementi total = total + 1; total = total 1; Abbreviati: total +=1; total -=1; Con operatore di incremento/decrementi total ++; total --; 32 Attenzione! L operatore + per gli oggetti String L operatore + applicato alle stringhe rappresenta l operazione di concatenazione hello + world Hello.concat( world )
Aritmetica (II parte) Un approccio metodologico alla costruzione dei programmi. Tipi di dati primitivi. int, float, double Variabili, dichiarazioni e operazioni Metodi e tipi primitivi 34 Abbiamo detto che i valori int NON sono oggetti, e quindi NON hanno metodi La realizzazioni di operazioni complesse, quali valore assoluto o elevamento NON sono offerte quali operatori dal linguaggio Java E necessario definire dei metodi opportuni In quale classe? Quali oggetti di invocazione?
35 Metodi e tipi primitivi Oggetti di invocazione Metodi statici, nessun oggetto di invocazione Valori int quali parametri Classi Esistono svariate classi predefinite che servono a raggruppare metodi statici logicamente correlati Classe Math metodi statici orientati alla matematica Es: static int abs(int a). Classe Integer metodi statici per gli interi 36 Ingresso di interi La lettura di un numero intero avviene in due passi 1. Leggere una linea dallo stream in un oggetto String, usando readline 2. Convertire la String in un valore int usando il metodo statico parseint della classe Integer String s = br.readline(); // need s only briefly int i = Integer.parseInt(s); // converts s to int
37 Ingresso di interi La linea deve poter essere interpretata come un intero, altrimenti si verifica un errore OK 2 75-1 KO Hello 57 40 12o 38 La classe Truck Aggiungere un metodo di lettura static public Truck read(datainputstream ds) { int axles = Integer.parseInt(ds.readLine()); int totalweight = Integer.parseInt(ds.readLine()); return new Truck(axles, totalweight);
39 Altri tipi di numeri interi int modella i numeri compresi tra circa 2 miliardi e +2 miliardi long è identico al tipo int, ma modella valori compresi tra 8 quintilioni e +8 quintilioni (un quintilione = 10 18 ) Le costanti letterali long hano un L alla fine long y=1000l; 40 Conversioni E sempre possibile assegnare un valore int ad un valore long long x,y,z; int j=55, k; x = 98; // assegna un literal int ad una variabile long y=j; // assegna una variabile int ad una long z = 2*j; // assegna il valore di una espressione //int ad una variabile long
41 Conversioni L assegnazione di un long ad un int richiede una conversione esplicita mediante un cast var-int = (int( int) expr-long j = (int) y Altri tipi di numeri interi short: -32768 + 32767 byte: -128 +128 42 I tipi float e double I tipi primitivi float e double modellano il comportamento dei numeri floating-point Numeri che modellano le misure con una determinata precisione float 3.4028235 10 38 (3.4028235E38f) 1.4012985 10-45 (1.4012985E-45f) double 2.2250738585072014 10-308 1.79769313486231570 10 308
43 IO di float e double Stampa: versione overloaded dei metodi print e println Lettura Si crea un oggetto della classe predefinita Double Invocando il metodo statico valueof con un riferimento ad un oggetto String per fissare un valore Sull oggetto appena creato si invoca il metodo doublevalue senza argomenti per ottenere il valore s = keybr.readline(); Double d = Double.valueOf(s); double x = d.doublevalue(); System.out.println(x);