Fondamenti di Informatica IL LINGUAGGIO JAVA Sintassi, Semantica, Input, Tipi Elementari e Istruzione Condizionale 1 Introduzione alla sintassi di Java La sintassi formalizza le regole sintattiche per scrivere frasi ben formate la definizione di una classe è formata dalla parola class, seguita dal nome della classe e dal corpo della classe il nome di una classe è un identificatore un identificatore è una sequenza non vuota di caratteri alfanumerici, iniziante per un carattere alfabetico il corpo di una classe è formato da un elenco di dichiarazioni della classe, racchiuso tra parentesi graffe e possibili dichiarazioni di una classe sono: la definizione di un metodo, la definizione di un costruttore, la dichiarazione di una variabile la definizione di un metodo è formata dall intestazione del metodo seguita dal corpo del metodo il corpo di un metodo è un blocco un blocco è una sequenza di istruzioni e dichiarazioni racchiusa 2 tra parentesi graffe e Sintassi e grammatiche La sintassi di Java è descritta da una grammatica composta da elementi terminali class public., ; a b c d... 0 1 2... elementi non terminali definizione-classe identificatore corpo-classe definizione-metodo blocco sequenza-istruzioni-blocco istruzione produzioni (o regole sintattiche) assioma unità-di-compilazione (definizione-classe) Esempi di produzioni definizione-classe: class identificatore-classe corpo-classe corpo-classe: dichiarazioni-corpo-classe opt dichiarazioni-corpo-classe: dichiarazione-corpo-classe dichiarazione-corpo-classe dichiarazioni-corpo-classe dichiarazione-corpo-classe: definizione-metodo definizione-costruttore dichiarazione-variabile definizione-metodo: intestazione-metodo corpo-metodo 3 corpo-metodo: blocco blocco: sequenza-istruzioni-blocco opt 4 Alcuni elementi sintattici nella definizione di una classe identificatore-classe definizione-classe /* Applicazione che visualizza una frase sullo schermo. */ class ScrittoreSulloSchermo public static void main(string[] args) System.out.println("ciao a tutti"); System.out.println("questo testo introduce"); System.out.println("i fondamenti dell'informatica"); Alcuni elementi sintattici nella definizione di un metodo intestazione-metodo definizione-metodo public static void main(string[] args) System.out.println("ciao a tutti"); System.out.println("questo testo introduce"); System.out.println("i fondamenti dell'informatica"); corpo-classe definizione-metodo corpo-metodo blocco sequenza-istruzioni-blocco istruzione-blocco istruzione 5 6
Esempio identificatori I nomi delle classi, dei metodi e delle variabili appartengono alla categoria grammaticale degli identificatori ad esempio, Math, println, frase, sqrt, RadiceQuadrata Regola (informale) per la formazione degli identificatori è un identificatore è una sequenza non vuota di caratteri alfanumerici (alfabetici e numerici), iniziante con un carattere alfabetico in realtà, sono ammessi anche alcuni caratteri speciali alcune sequenze di caratteri sono riservate (ad esempio, class) e non sono identificatori 7 Sintassi per gli identificatori identificatore: sequenza-caratteri ma non parola-chiave sequenza-caratteri: carattere-alfabetico sequenza-caratteri carattere-alfanumerico carattere-alfanumerico: carattere-alfabetico cifra carattere-alfabetico: uno di a à b c... x y z A À B C... X Y Z cifra: uno di 0 1 2... 8 9 parola-chiave: uno di abstract boolean break byte case catch char class const continue default do double else extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static super switch synchronized this throw throws transient try void volatile while 8 Introduzione alla semantica di Java La semantica di un linguaggio stabilisce quali sono le frasi valide tra quelle ben formate si occupa dell interpretazione (del significato) delle frasi valide legame stretto tra sintassi e semantica Frasi ben formate e frasi valide Una istruzione valida System.out.println("ciao a tutti"); Una istruzione ben formata ma non valida System.out.stampa("ciao a tutti"); Una istruzione che non è ben formata System.out.println("ciao a tutti"; 9 10 Semantica di una frase La semantica di una frase dipende anche dal tipo della frase la semantica di una espressione viene data in termini di un tipo e di un valore la semantica di una istruzione viene data in termini dell effetto dell esecuzione dell istruzione Semantica delle espressioni a + b è una espressione ben formata è anche valida se (ad esempio) a e b sono variabili di tipo int alle variabili a e b è stato già assegnato un valore in questo caso è una espressione di tipo int Semantica statica controllata durante l analisi statica del codice (dal compilatore) assegna un tipo a ogni espressione 11 Semantica dinamica valutata durante l esecuzione dinamica del codice assegna un valore a ogni espressione 12
Semantica delle istruzioni somma = a + b; Semantica delle istruzioni semplici System.out.println("ciao a tutti"); è una istruzione ben formata è anche valida se (ad esempio) a, b e somma sono variabili di tipo int alle variabili a e b è stato già assegnato un valore Semantica statica principalmente compatibilità tra tipi Semantica dinamica Semantica statica esiste l oggetto System.out? qual è il tipo dell oggetto System.out? per il tipo dell oggetto System.out esiste una operazione di nome println che ha come parametro una stringa? Semantica dinamica 13 14 Introduzione alle istruzioni di Java Una applicazione Java, nella sua forma più semplice eventuale clausola di importazione commento sull applicazione /* Applicazione che visualizza una frase sullo schermo. */ class ScrittoreSulloSchermo public static void main(string[] args) System.out.println("ciao a tutti"); System.out.println("questo testo introduce"); System.out.println("i fondamenti dell'informatica"); Primo esempio di un programma Java Semplicissimo programma che stampa la stringa Ciao. public class FaiCiao System.out.println("Ciao a tutti"); nome dell applicazione sequenza di istruzioni e dichiarazioni il corpo del metodo main è una sequenza di istruzioni e dichiarazioni 15 16 Primo esempio : una versione O-O La versione più object-oriented del programma che stampa la stringa Ciao è la seguente. class FaiCiao Ciao miosaluto = new Ciao(); miosaluto.stampaciao(); Creazione di un oggetto class Ciao public static void StampaCiao() System.out.println("Ciao a tutti"); Lettura di dati da input In Java la lettura di dati da input non è diretta come in C. Useremo una classe non-standard per effettuare operazioni di input da tastiera. Questa classe prende il nome di Console che esporta metodi per leggere interi, reali a doppia precisione (double), stringhe e parole. 17 18
Lettura di dati da input classe Console Di seguito sono indicati i metodi di lettura definiti dalla classe Console Lettura di un numero intero public static int Console.readInt(String prompt) x = Console.readInt( Inserire un intero: ); Lettura di un numero reale public static double Console.readDouble(String s) r = Console.readDouble( Inserire un reale: ); 19 Lettura di dati da input classe Console Lettura di una stringa di caratteri che termina con newline public static String Console.readString() s = Console.readString(); Lettura di una stringa che termina con newline (2) public static String Console.readString(String ) s = Console. readstring( Inserire una stringa ); Lettura di una parola che termina con uno spazio public static String Console.readWord() w = Console.readWord(); 20 Commenti in programmi Java // commento fino a fine linea /* commento che può occupare più linee */ /** commento su più linee che viene estratto dallo strumento che genera automaticamente la documentazione */ 21 Area di un Rettangolo Programma Java che calcola l area di un rettangolo. import corejava.*; public class AreaRettangolo double base, altezza, area; base = Console.readDouble( Base= ); altezza = Console.readDouble( Alt= ); area = base * altezza; System.out.println("Area = " + area); 22 Vogliamo definire una classe Rettangolo che sia più generale e definisca un insieme di operazioni su rettangoli. DATI OPERAZIONI base Rettangolo costruttore Rettangolo() Area() Perimetro() Diagonale() altezza Un programma che crea ed usa oggetti Rettangolo class Rettangolo private double altezza; // variabili d istanza private double base; /* Costruttore : inizializza un oggetto Rettangolo */ public Rettangolo() this.base = Console.readDouble("Inserisci la base: "); this.altezza =Console.readDouble("Inserisci l'altezza: ");..... 23 24
...... /* Calcola l'area del rettangolo. */ public double area() double a; a = this.base * this.altezza; return a; // area del rettangolo /* Calcola il perimetro del rettangolo. */ public double perimetro() double p; // perimetro del rettangolo p = (2 * this.base)+ (2 * this.altezza); return p; // chiude la definizione della classe 25 class TestRettangolo Rettangolo B, C; // due rettangoli double areab; // area del rettangolo B double perimetroc; // perimetro del rettangolo C /* crea i due rettangoli */ B = new Rettangolo(); C = new Rettangolo(); /* calcola e visualizza l'area di B */ areab = B.area(); System.out.println("Area di B = " + areab); /* calcola e visualizza il perimetro di C */ perimetroc = C.perimetro(); System.out.println(" Primetro di C = " + perimetroc); 26 Tipi in Java Nei linguaggi di programmazione di alto livello le variabili e le espressioni sono caratterizzati da un tipo. Un tipo di dati (o tipo) è costituito da un insieme di valori ammissibili un insieme di operatori che possono essere applicati ai valori del tipo I tipi sono importanti perché il significato e la correttezza di molte istruzioni è legata non solo alla forma sintattica delle istruzioni, ma anche a vincoli semantici, che sono definiti tramite tipi. Tipi primitivi in Java Tipi primitivi boolean (1 bit) valori: true o false byte (8 bit ) un intero tra 128 e +127 short (16 bit) un intero tra 32768 e +32767 float (32 bit ) un numero razionale in virgola mobile (9 cifre significative eesponente tra 45 e +38) int (32 bit) un intero di valore compreso tra 2147483648 e +2147483647 double (64 bit) un numero razionale in virgola mobile (18 cifre significative eesponente tra 324 e +308) long (64 bit) un intero di valore compreso tra 223372036854775808 e +9223372036854775807 char (16 bit) un carattere dell alfabeto Unicode 27 28 Tipi primitivi in Java I tipi primitivi non sono rappresentati da classi (efficienza) Hanno dimensione fissata dalla specifica del linguaggio (portabilità) Non esistono i tipi unsigned e i tipi puntatore a. Le classi definiscono i tipi non primitivi (riferimento) Conversione di tipi In Java è possibile effettuare conversione tra variabili che hanno tipi diversi ma compatibili. Conversione implicita int i; short s; i = s + 1; La conversione implicita di tipo si ha nei casi in cui non ci sia perdita di informazione (promozione). int i; long l; l = i + 10; 29 30
Conversione di tipi Nessuna conversione implicita di tipo nei casi in cui ci sia perdita di informazione (errore di compilazione!). : int vintera; double vreale = 3.14159; vintera = vreale; NO! Conversione esplicita vintera = (int)vreale; SI (Narrowing) La conversione esplicita è detta casting. 31 Operatori in Java Operatori aritmetici: somma (+), sottrazione (-), prodotto (*), divisione (/), resto(%), incremento(++), decremento (--), (+=, -=, *=, /=) Operatori relazionali: uguale (==), diverso (!=), maggiore (>), minore (<), minore o uguale (<=), maggiore o uguale (>=) Operatori logici: not (!), or ( ), and (&). Sequenze di escape: \b, \t, \n, \r, \, \, \\ 32 Istruzioni composte Oltre alle istruzioni elementari come l assegnamento, il return, ecc., il linguaggio mette a disposizione del programmatore un insieme di istruzioni composte che servono a controllare il flusso di esecuzione di un programma come le istruzioni if-else, for, while, do-while. Istruzione if-else if (condizione) istruzioni1 else istruzioni2 Istruzione condizionale if-else L istruzione if-else serve per valutare il valore di una espressione logica ed eseguire le operazioni opportune. Il ramo else e le parentesi possono mancare. In questo caso si parla di istruzione if. 33 34 Istruzione if-else ESEMPI if (i >= 0) System.out.println( Valore positivo o nullo ); else System.out.println( Valore negativo ); if (x == 0) y = 10; else y = x +3*z; if (x == 0 & z > x) y= 10; z= z-1; 35