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)