Struttura del programma • Intestazione • Lista di istruzioni • Esempio: public class Hello { public static void main (String [] args){ System.out.println(”Ciao come stai?"); La grammatica di Java (non completa) Program::= [Imports] public class Ide MainDef Imports::= Import ; Imports | Import Import::= import java.ide.(ide | * ) MethodList::=MainDef MainDef::= {public static main ([String [ ] args]) {StatementList} La grammatica di Java (non completa) StatementList::=Statement StatementList | e Statement::= Command | Declaration Command::= System.out.print[ln](Exp) Exp::= Exp + Exp | (Exp) | Ide | Literal | .... Literal::= StringLiteral | IntegerLiteral | FloatingLiteral | CharacterLiteral | BooleanLiteral | NullLiteral La grammatica di Java (non completa) Ide::= Char CharSeq StringLiteral::= “CharSeq” CharSeq::= Char CharSeq | e Char::= a | b | ... z | A | ... | Z | 0 | ... | 9 | ... IntegerLiteral ::= (+ | -) Integer | 0 Integer ::= Digit DigitSeq Digit ::= 0 | 1 | 2 | ... | 9 DigitSeq ::= Digit DigitSeq | e Stampa di dati in Java (Output) • Si stampano sequenze di caratteri (String). Sia s una stringa System.out.print(s); stampa la stringa s System.out.println(s); stampa s e va a capo La stringa s può essere: 1. una sequenza di caratteri racchiusi tra “ ” 2. stringhe concatenate s1+s2 (+ operatore di concatenazione) 3. qualunque valore che puo` essere convertito in stringa ad es. i numeri (attenzione al + vedi es.) Tipi di dati primitivi in Java • numeri: – interi 1,+22,-133, int, long, short – razionali 0.345, 56.54, 9, float, double • booleani: (true,false) boolean • caratteri: ‘a’, ... ‘A’ char Un altro esempio public class volume { public static void main (String[] args) //calcolo della quantita` totale di bibite { final double bottVol =2.0; final double lattVol = 0.355; int bottNum = 4; int lattNum = 10; double totale = bottVol * bottNum + lattVol * lattNum; System.out.println(“volume totale ” + totale + “ litri” ); }} La sintassi di Java (le dichiarazioni) Declaration ::=[DescSeq] Type Ide [= Exp]; DescSeq ::= Desc DescSeq | e Desc ::= public | private | static | final Command::= System.out.print[ln](Exp) Type ::= int | boolean | double | float | char | Ide Costanti final Type Ide=Exp; Ide è una costante cioè un nome a cui è associato un valore (analogamente alle variabili) di tipo T, a cui però può essere assegnato un valore una sola volta. Vantaggi: Aumentano la leggibilità Se cambia il valore della costante devo modificarlo solo nell’inizializzazione Commenti Aumentano la leggibilita` se usati con criterio. In Java ci sono due modi di inserire commenti: • commenti su una sola riga //: //calcolo della quantita` totale di bibite • commenti su piu` righe /* */: /* Commenti racchiusi tra parentesi */ Comandi Linux per Java • Per eseguire abbiamo visto: java nomeClasse • Per compilare : javac nomeClasse.java dove nomeClasse.java è il nome del file contenente il (sorgente del) programma Java, editato usando emacs o un altro editor di testi. Per eseguire un programma: • Occorre: – scrivere il programma in un file (usando ad esempio emacs) dandogli come nome il nome della classe che ha come metodo statico main con aggiunto il suffisso “.java” – compilare il programma con il comando javac – eseguire il programma con il comando java Lettura di dati in Java (Input) • Non useremo la lettura standard perchè un po’ troppo complessa, esempio: – c e` una variabile che: va dichiarata come segue: ConsoleReader c=new ConsoleReader (System.in) – i comandi a disposizione sono • readInt: c.readInt • readLine: c.readLine() • readDouble: c.readDouble() • readChar: c.readChar() La sintassi di Java (non completa) Exp::= Exp + Exp | (Exp) | Ide | Literal | new ConsoleReader (System.in); | c.readLine(); | c.readDouble(); | c.readInt(); | c.readChar(); Astrazione sui valori • Introduzione di nomi con associati dei valori • Esempio: public class Hello { public static void main (String [] args){ System.out.println(”Come ti chiami "); ConsoleReader c=new ConsoleReader (System.in); String nome=c.readLine(); System.out.println(”Ciao "+nome);}} Altri tipi predefiniti :double, e float per i razionali • Costanti 0.0, 1.2, 5.89 ecc. • Tutte le operazioni sugli interi:+.-.*,/ • È possibile anche fare operazioni miste (operandi int e double) il risultato è un double 3*1.2=3.6 • Assegnamento: int float double – int x=7; double y; y=x; y ora vale 7.0 (esempio) – x=y/2 errore x=(int)y cast Composizione di istruzioni Sequenzializzazione: le istruzioni vengono eseguite in sequenza: S1 S2 ... Sk Lo stato in cui viene eseguita S2 è lo stato risultante dopo l’esecuzioni di S1 nello stato di partenza, ecc. lo stato in cui viene eseguita Si è lo stato risultante dopo l’esecuzioni di Si-1. Sintassi della sequenzializzazione: StatementList::=Statement StatementList | e Composizione di istruzioni Condizionale: le istruzioni eseguite dipendono dal verificarsi o meno di una condizione. Due forme: Sintassi 1. if (Cond) C1 else C2 2. if (Cond) C1 Semantica informale Nello stato di partenza viene verificata la condizione (Cond) che è un’espressione boolena. Se la condizione è verificata viene eseguito S1 altrimenti nella forma 1 si esegue S2, nella forma 2 si prosegue con l’istruzione successiva. S1 ed S2 sono comandi Esempio di condizionale: massimo di due numeri public class CalcolaMassimo2 { public static void main (String [] args) { ... int n1=console.readInt(); int n2=console.readInt(); if (n1>n2) System.out.println(”Massimo "+n1); else System.out.println(”Massimo "+n2); }} Assegnamento Modifica di variabile: Sintassi 1. Ide = Exp 2.Semantica informale Nello stato di partenza viene valutata l’espressione Exp, ottenendo il valore v espressione che deve essere dello stesso tipo (o compatibile) con il tipo di Ide. Ide deve essere dichiarata nello stato di partenza. Lo stato risultante è lo stato di partenza in cui Ide ha come valore v Esempio di condizionale: massimo di tre numeri public class CalcolaMassimo3 { public static void main (String [] args){ int max=console.readInt(); int n1=console.readInt(); int n2=console.readInt(); if (n1>max) max=n1; if (n2>max) max=n2; System.out.println("Numero massimo e` "+max);}} Composizione di istruzioni Iteratori: le istruzioni del corpo dell’iteratore vengono eseguite ripetutamente. La ripetizione è avviene se è verificata una condizione. Esistono tre forme di iterazione in Java: 1. 2. 3. while do - while for Gli iteratori in Java sono tutti equivalenti (si può sempre sostituire un iteratore con un altro di diversa forma. Forme diverse si adattano diversamente alle varie situazioni. Il risultato è che se si sceglie la giusta forma il programma è più leggibile. while Il corpo S dell’iteratore viene eseguito finchè la condizione (cond) è vera. •Sintassi: while (cond) S •Semantica informale: Si valuta la condizione (cond) nello stato di partenza, se è vera si esegue il corpo S, nello stato risultante dall’esecuzione di S si rivaluta l’intero while. Esempio while: massimo di k numeri public class CalcolaMassimoKWhile { public static void main (String [] args){ final int k=10; System.out.print("Scrivi il primo numero > "); int max=c.readInt();int n;int i=2; while(i<=k) { System.out.print("Scrivi il "+i+" numero> "); n=c.readInt(); if(n>max) max=n; i++; } System.out.println("Il valore massimo e` "+max);}} While con variabili booleane • La definizione di variabili booleane inizializzate true utilizzate nella condizione di un while permettono di terminare quando la condizione diventa falsa (dimostrazione per assurdo). • Vedi esempio LeggiFinoAlPunto. Un altro iteratore il for Il for in Java è equivalente al while (vedi semantica) cambia solo la sintassi. Com::= ... | for ([T] Ide =Exp1; BE ; Ide=Exp2) C |... contatore 4 corpo 1) Inizializzazione del contatore. Dichiarazione o assegnamento 3 aggiornamento del contatore 2) condizione La sintassi di Java: comandi Command::= Ide= Exp; | {StatementList} | if (Exp) C1 else C2; | if (Exp) C; | while (Exp) C; | do C while (Exp); | for([Type] Ide = Exp; Exp; Ide=Exp) C; | System.out.print[ln](Exp); Esempio Figure geometriche public class FigureGeometriche{ public static void main (String[] args) {System.out.println(“Scrivi C per Cerchio”); System.out.println(“Scrivi R per Rettangolo”); System.out.println(“Scrivi T per Triangolo”); char c =Leggi(); if(c==‘C’) faiCerchio; //Blocco per Cerchio else if(c==‘R’) faiRettangolo; /*Blocco per Rettangolo*/ else if(c==‘T’) faiTriangolo; //Blocco per Triangolo else System.out.println(“Errore figura sconosciuta”);}} Esempio - Figure geometriche Cerchio faiCerchio: {System.out.println(“Dammi il raggio del cerchio”); final double pigreco=3.14; double raggio=leggi(); double area=raggio*raggio*pigreco; System.out.println(“Area del cerchio di raggio “+raggio+”e` ”+ area) } Esempio Figure geometriche:Rettangolo faiRettangolo: {System.out.println(“Dammi la base del rettangolo”); double base=leggi(); System.out.println(“Dammi l’altezza del rettangolo”); double altezza=leggi(); System.out.println(“Area del rettangolo di base “ +base+” e altezza “+altezza+ “ e` ”+ base*altezza} Esempio Figure geometriche:Triangolo faiTriangolo: {System.out.println(“Dammi la base del triangolo”); double base=leggi(); System.out.println(“Dammi l’altezza del triangolo”); double altezza=leggi(); System.out.println(“Area del triangolo di base “ +base+” e altezza “+altezza+ “ e` ”+ base*altezza/2} Programmazione strutturata • Problemi complessi si risolvono suddividendo il problema in problemi più semplici ciascuno risolto da un programma – es: faiCerchio, faiRettangolo e faiTriangolo sono pezzi di programma che assolvono un compito, in questo caso quello di leggere e calcolare per una data fig. geometrica. • I programmi definiti dentro un programma più generale si chiamano procedure o funzioni nei linguaggi o-o (Java): metodi. “Sottoprogrammi” • Trasferimento del controllo (cambia il flusso delle istruzioni) • Concetti di programma chiamante e programma invocato • Scambio di dati tra programma invocato e programma chiamante – parametri formali e – parametri attuali – risultato del programma invocato – ambiente del programma invocato Definizione e invocazione di “sottoprogrammi” public static Type Ide (Type Ide1, Type Ide2) {StmtList } tipo del risultato parametri formali corpo del metodo corrispondenza formali attuali ... Ide(Val1,Val2).... parametri attuali nome metodo Le classi in Java • Le classi rappresentano insiemi di entità con le stesse caratteristiche. • Nei linguaggi object-oriented il modello privilegia la rappresentazione delle entità. • Ogni programma Java prevede la definizione di almeno una classe. • In questa fase la classe è vista come un contenitore di metodi (“sottoprogrammi”) Astrazione procedurale in Java: Metodi statici (static) • Permettono di definire funzioni di uso comune non legate a specifiche entità che sono rappresentate nel programma • Sono sempre definiti in una classe • Anche il main (programma principale) è un metodo statico della classe che viene passata come argomento al comando Linux: java nomeClasse che provoca l’esecuzione del programma Strutturazione del programma definendo più classi • Invece di aggiungere i metodi alla classe in cui è definito il main è possibile definire i metodi in una classe diversa. • In questo modi possono raggruppare metodi che svolgono funzioni analoghe (es. Geometria e Num) • L’invocazione diventa: IdeClass.Ide(Val1,..Valk)