Corso di Laurea Ingegneria Informatica Fondamenti di Informatica

Slides:



Advertisements
Presentazioni simili
Introduzione al linguaggio C++
Advertisements

LINGUAGGIO DI PROGRAMMAZIONE C
1 MeDeC - Centro Demoscopico Metropolitano Provincia di Bologna - per Valutazione su alcuni servizi erogati nel.
Fondamenti di Informatica
Introduzione al linguaggio C
Istruzioni condizionali e blocco
Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A CDL in Ingegneria Meccanica - A.A Tipi di dati Ing. Simona Colucci.
Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Tipi di dati Ing. Simona Colucci.
esponente del radicando
Anno accademico Gli operatori e le espressioni in C.
Il linguaggio C Gli operatori e le espressioni C Language
Programmazione Procedurale in Linguaggio C++
1 Istruzioni, algoritmi, linguaggi. 2 Algoritmo per il calcolo delle radici reali di unequazione di 2 o grado Data lequazione ax 2 +bx+c=0, quali sono.
Tipi di dato e controllo del flusso Dott. Ing. Leonardo Rigutini Dipartimento Ingegneria dellInformazione Università di Siena Via Roma 56 – – SIENA.
Algebra di Boole ed elementi di logica
Algebra di Boole ed elementi di logica
Informatica 3 Codifica binaria.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Introduzione a JAVA Anno Accademico 2009/2010.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Variabili e tipi primitivi Anno Accademico 2009/2010.
Corso di Informatica (Programmazione)
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Assegnamento di valore a una variabile Anno Accademico 2009/2010.
Corso di Laurea in Biotecnologie Informatica (Programmazione)
1 Corso di Informatica (Programmazione) Lezione 10 (12 novembre 2008) Programmazione in Java: espressioni booleane e controllo del flusso (selezione)
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Rappresentazione dellinformazione su calcolatore Anno Accademico 2009/2010.
Corso di Laurea in Biotecnologie Informatica (Programmazione)
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Le stringhe di caratteri in Java Anno Accademico 2009/2010.
Corso di Informatica (Programmazione)
Corso di Informatica A.A Corso di Informatica Laurea Triennale - Comunicazione&Dams Dott.ssa Adriana Pietramala Dott.ssa.
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
Fondamenti di Informatica I a.a Il linguaggio C Il controllo di flusso La selezione condizionale Listruzione switch I cicli Le istruzioni break,
1 Sistemi Digitali. 2 Definizione Analog Waveform Time Voltage (V) 0 5 Digital Waveform Time Voltage (V)
Programmazione Corso di laurea in Informatica
Istruzioni di selezione in Java Programmazione Corso di laurea in Informatica.
Cos’è un problema?.
Dichiarazioni e tipi predefiniti nel linguaggio C
Fondamenti di Informatica A - Massimo Bertozzi TIPI DI DATO IN C++ What's in a name? That which we call a rose By any other name would smell as sweet.
Codifica binaria Rappresentazione di numeri
Il Linguaggio C.
Usare rappresentazioni di lunghezza fissa porta ad avere valori non rappresentabili: Overflow indica un errore nella rappresentazione del risultato in.
Java base I: Sintassi e tipi di dati
LA DOCUMENTAZIONE È noto che un buon programma dovrebbe essere ben documentato.. ma lesperienza insegna che quasi mai ciò viene fatto! –non cè tempo, ci.
Programmazione in Java Claudia Raibulet
4 Tipi di dati & variabili
JAVA Franco Bombi 8 ottobre FB Introduzione Java è un linguaggio di impiego generale, basato su classi e orientato agli oggetti Java.
1 Negozi Nuove idee realizzate per. 2 Negozi 3 4.
CODIFICA Da flow-chart a C++.
14 marzo 2002 Avvisi:.
Fopndamenti di programmazione. 2 La classe String Una stringa è una sequenza di caratteri La classe String è utilizzata per memorizzare caratteri La classe.
Tipi di dati semplici in C (1/3)
Sviluppare un programma in C che, dato un array da 100 elementi interi caricato con numeri casuali compresi tra [10,100], sia in grado di cercare il valore.
Anno accademico Le istruzioni di controllo in C.
Numeri Interi senza segno
Il numero più grande Accademia dei Lincei
Process synchronization
1 Corso di Informatica (Programmazione) Lezione 8 (7 novembre 2008) Programmazione in Java: operatori aritmetici, operatori di assegnamento e cast.
Introduzione a Javascript
Variabili Numeriche –Interi (byte, short, int, long): complemento a 2 –A virgola mobile (float, double): IEEE 745 Alfanumeriche –Carattere (char): Unicode.
Parte 3 Lo stato: variabili, espressioni ed assegnazioni
1 Fabio Scotti – Università degli Studi di Milano Fabio Scotti ( ) Laboratorio di programmazione per la sicurezza Valentina Ciriani ( )
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Rappresentazione in virgola mobile (floating-point) Permette di rappresentare numeri con ordini di grandezza molto differenti utilizzando per la rappresentazione.
Rappresentazione dell'informazione
Rappresentazione dell'informazione 1 Se ho una rappresentazione in virgola fissa (es. su segno e 8 cifre con 3 cifre alla destra della virgola) rappresento.
La codifica dei numeri.
Conversione binario-ottale/esadecimale
Cloud informatica V anno. Introduzione a PHP Lo scripting PHP PHP è un linguaggio di scripting lato server. Le caratteristiche di un linguaggio di scripting.
Rappresentazione dei numeri
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Numeri in virgola Marco D. Santambrogio – Ver. aggiornata al 24 Agosto 2015.
DIPARTIMENTO DI ELETTRONICA E INFORMAZIONE Numeri con segno ed in virgola Marco D. Santambrogio – Ver. aggiornata al 20 Marzo.
Basi di Java Strutture base di Java. Basi di java ▪Variabili ▪Operatori ▪Condizioni e Cicli ▪Array.
Transcript della presentazione:

Corso di Laurea Ingegneria Informatica Fondamenti di Informatica Dispensa 09 Tipi ed espressioni Carla Limongelli Ottobre 2011 Arrivare fino alla slide 22 + folating point, Oppure fino alla slide 40 (Tipo boolean escluso) http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

nozioni algebriche relative a N, Z, Q, R Prerequisiti nozioni algebriche relative a N, Z, Q, R rappresentazione dei numeri in base b aritmetica modulare in complemento a 2 aritmetica floating-point algebra di Boole, operatori booleani e loro proprietà Tipi ed espressioni http://www.dia.uniroma3.it/~java/fondinf/

Contenuti Tipi di dato Tipi primitivi per numeri interi: il tipo int Tipi primitivi per numeri reali: il tipo double Espressioni Il tipo primitivo char Algebra di Boole e tipo primitivo boolean Altri tipi primitivi Conversione tra tipi conversione implicita conversione esplicita http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Obiettivi (competenze da acquisire) Al termine dell’unita’ didattica lo studente sarà in grado di Saper applicare correttamente operatori coerenti con diversi tipi di dato Sapere che un tipo di dato e’ sempre caratterizzato da Un insieme di valori che definiscono il dominio Un insieme di operazioni sugli elementi del dominio Saper gestire le espressioni formate da diversi tipi di dato avendo in mente La precedenza tra gli operatori Il modo in cui vengono valutate le espressioni Sapendo gestire gli operatori sovraccarichi Saper effettuare conversioni esplicite e sapere quando si verificano le conversioni implicite Le parole chiave andranno a far parte del glossario http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione

Introduzione . . . In algebra, un tipo di dato (o tipo) è costituito da un insieme di valori (detto dominio del tipo) un insieme di operazioni sul dominio del tipo Z R …,-2,…,0, 0.25,…,0.85,…,1,…, 1.4142,…,2,… …,-3,-2,-1,0,1,2,3,… { +, -, *, div, mod } { +, -, *, / } La nozione di tipo di dato nei linguaggi di programmazione è simile a quella delle strutture algebriche dell’algebra http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

. . . introduzione Nei linguaggi di programmazione un tipo di dato è costiuito da due componenti Una componente statica Tutti gli elementi che costituiscono il dominio opportunamente rappresentati Una componente dinamica Operazioni del dominio Tutti e soli gli operatori ammissibili http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Tipi, classi e oggetti Una classe è caratterizzata da: Un insieme di elementi della classe (oggetti) Un insieme di operazioni (metodi) che possono essere eseguite sugli elementi Nomi di metodi Un tipo è caratterizzato da: Un insieme di valori che definiscono il dominio Un insieme di operazioni su elementi del dominio Operatori infissi Per comodità di programmazione, in Java, alcuni tipi di base non sono definiti come oggetti, ma come tipi detti primitivi http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Rappresentazione e interpretazione R(3) = 0011, R(4) = 0100, R(7) = 0111 3 = I (0011) , 4 = I (0100) , 7 = I (0111) 3, 4 7 + R I I R 0011, 0100 0111 Diagramma commutativo per la somma degli interi 3 e 4 http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Tipizzazione Gli elementi sintattici di un linguaggio di programmazione sono caratterizzati da un tipo letterali (valori costanti) – come 10 e 1.41421 variabili – al momento della dichiarazione parametri e valori restituiti dai metodi espressioni – con letterali, variabili, operatori, invocazione di metodi e creazione di oggetti I tipi sono anche importanti per stabilire la modalità di memorizzazione dei valori delle variabili stabilire il significato degli operatori rilevare eventuali errori nell’uso di variabili, operatori e invocazioni di metodi http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Tipi primitivi e tipi riferimento In Java ci sono due categorie di tipi tipi primitivi predefiniti nel linguaggio int, byte, short, long, char, float, double, boolean tipi riferimento ogni classe definisce un tipo riferimento String http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

un letterale è la denotazione di un valore costante Il tipo int Rappresentazione In complemento a 2, con 32 bit Dominio Interi relativi compresi tra -231 e + 231-1 Operatori +, -, *, / (quoziente), % (resto) è possibile scrivere dei valori costanti che rappresentano numeri interi come 0, 1, 4126, –4543. un letterale è la denotazione di un valore costante è possibile dichiarare variabili di tipo int: int numero; è possibile assegnare a una variabiledi tipo int il valore di una espressione di tipo int: numero = (4126 + 1) * 3; è possibile scrivere delle espressioni di tipo int usando gli operatori aritmetici +, –, *, / e % e le parentesi ( e ), ad esempio, (4126 + 1) * 3 http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Il tipo int: Rappresentazione e Dominio Il tipo int di Java ha una rappresentazione a 32 bit in complemento a 2: Rappresentazione modulare Il tipo int di Java ha come domino un sottoinsieme degli interi relativi: [-2147483648, …, +2147483647] Una variabile di tipo int può assumere un valore tra -231 e +231-1 http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Aritmetica modulare int numero; numero = 2147483647 + 1; // quanto vale ora numero? Nei calcolatori per rappresentare in binario i numeri interi relativi, viene adottata una aritmetica di tipo “modulare” intuitivamente, viene adottata una rappresentazione “circolare” per i numeri, ovvero il numero che logicamente segue il massimo numero intero positivo è il minimo numero negativo 2147483647 + 1 vale -2147483648 http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Rappresentazione modulare degli interi Esempio: con un numero di bit N = 3, [-4, …,+3] 010 2 3 011 001 1 -4 100 + 1 000 Si presuppone che abbiano studiato a labinf le operazioni binarie, oppure gliele dobbiamo fare noi? 111 101 -1 -3 110 -2 http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Il tipo int: gli operatori aritmetici Gli operatori aritmetici rappresentano operazioni aritmetiche se applicati a operandi interi restituiscono un valore intero l’operatore + rappresenta l’operazione somma: 11 + 5 vale 16 l’operatore - rappresenta l’operazione differenza: 11 - 5 vale 6 l’operatore * rappresenta l’operazione prodotto: 11 * 5 vale 55 l’operatore / rappresenta la divisione intera – quoziente 10 / 2 vale 5 11 / 2 vale 5 — e non vale 5.5 -11 / 2 vale - 5 l’operatore % rappresenta il resto della divisione intera 10 % 2 vale 0 13 % 5 vale 3 http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Operatori aritmetici, espressioni e parentesi Gli operatori aritmetici sono binari due operandi in generale sono delle espressioni forma infissa Nella formazione delle espressioni è possibile usare anche le parentesi tonde ( e ) ad esempio 3 è una espressione che vale 3 ( 2 * 3 ) + 4 vale 10 12 / 3 + 4 vale 8 2 (3 + 4) non è una espressione — perché? quanto vale (1 / 2) + (1 / 2) ? A questo livello il concetto passivo di espressione dovrebbe bastare http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Divisione per zero Nell’aritmetica intera non è consentita la divisione per zero Ci sono pre-condizioni anche per gli operatori, ad esempio int a, b, c; a = 2; b = 0; c = a/b; // NO, divisione per zero! La compilazione non segnala alcun errore, MA durante l’esecuzione si verifica un errore di semantica dinamica – errore al tempo di esecuzione il programma termina con la segnalazione di un errore di tipo ArithmeticException in Java, gli errori al tempo di esecuzione si manifestano sotto forma di eccezioni http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Altri tipi primitivi numerici interi Java fornisce altri tipi primitivi per la rappresentazione di numeri interi relativi – con un intervallo di definizione diverso il tipo long – 64 bit, tra -9223372036854775808 e +9223372036854775807 ossia [-263,…,+263-1] i letterali long terminano con il carattere L – ad esempio, 1000L il carattere L terminale permette di distinguere i letterali di tipo long dai letterali di tipo int il tipo short – 16 bit, tra -32768 e +32767, ossia [-215,…,+215-1] il tipo byte – 8 bit, tra -128 e +127, ossia [-27,…,+27-1] non esistono letterali short né byte (di fatto inutili !!) Gli operatori definiti su questi tipi interi relativi sono gli stessi definiti per il tipo int ovviamente con effetti diversi http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Il tipo char Rappresentazione Dominio Operatori 16 bit Dominio Tutti i caratteri dell’alfabeto unicode 2.0 (www.unicode.org) Operatori +, ++, -, --, … il tipo char è un tipo numerico Ad ogni carattere corrisponde un numero d’ordine i letterali char sono normalmente scritti tra apici semplici; 'a', 'B', '5' alcune eccezioni: le sequenze di escape '\'' indica il carattere ' '\"' indica il carattere " '\\' indica il carattere \ http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Codifica e aritmetica dei caratteri Alcune informazioni utili sulla codifica dei caratteri i codici dei caratteri alfabetici minuscoli sono tra loro consecutivi – dalla a alla z i codici dei caratteri alfabetici maiuscoli sono tra loro consecutivi – dalla A alla Z i codici dei caratteri per le cifre sono tra loro consecutivi – dallo 0 al 9 i codici delle cifre sono tutti minori di quelli dei caratteri alfabetici maiuscoli i codici dei caratteri alfabetici maiuscoli sono tutti minori di quelli dei caratteri alfabetici minuscoli Aritmetica dei caratteri se car vale 'a', allora car++ cambia il valore di car in ‘b' se car vale 'f', allora (char) (car – 'a' + 'A') vale 'F' http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Il tipo double: rappresentazione e dominio un numero reale in virgola mobile secondo lo standard IEEE 754-1985 a 64 bit (mantissa con 18 cifre significative ed esponente tra -324 e +308) Dominio Insieme di 264 razionali positivi e negativi Valore minimo assoluto: 1.79769313486231570 . 10-308 Valore massimo assoluto: 2.250738585072014 . 10+308 Precisione ~15 cifre decimali Verificare il range dell’esponente – verificare il significato di % per i double http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Letterali in virgola mobile I letterali di tipo double contengono un punto, e/o contengono una E che separa la mantissa dall’esponente, e/o terminano per D 3.2E–6 denota il valore 3.2 × 10–6 ma anche 32E–7 o 0.0000032 Attenzione il letterale 3 denota un valore intero i letterali 3. 3.0 3E0 3D denotano valori reali http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Il tipo double: operatori Gli stessi operatori degli int: + - * / % ma operazioni diverse Gli operatori aritmetici applicati ad operandi reali indicano un’operazione tra reali il risultato è un numero reale ad esempio, 7.0/2.0 restituisce 3.5 in questo caso, l’operatore / è interpretato come l’operatore di divisione tra numeri reali calcolano un risultato approssimato (invece l’aritmetica intera è una aritmetica esatta, anche se modulare) I risultati sono soggetti ad arrotondamenti, e quindi a perdita di precisione ad esempio, 1E100+1E-100 vale 1E100 Gli operatori aritmetici sono sovraccarichi Lo stesso simbolo indica operazioni diverse http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

La classe Math La classe Math del package java.lang contiene la definizione di molti metodi di utilità per la matematica ad esempio double Math.sqrt(double x): calcola la radice quadrata di x double Math.pow(double x, double y):calcola x elevato alla y double Math.log(double x): calcola il logaritmo naturale di x double Math.sin(double x): x e’ espresso in radianti double Math.random(): restituisce un numero casuale nell’intervallo semi-aperto [0.0, 1.0) La classe Math contiene anche la definizione di due costanti con la migliore approssimazione possibile (per un valore di tipo double) Math.E: 2.7182818284590452354 Math.PI: 3.14159265358979323846 http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Espressioni Molti elementi sintattici di Java sono classificati come espressioni ad esempio, il lato destro di una assegnazione, gli argomenti nell’invocazione di un metodo Le espressioni vengono formate mediante la composizione di operandi e operatori gli operatori sono simboli usati per denotare operazioni (come ad esempio gli operatori aritmetici) da valutare sui rispettivi argomenti, chiamati operandi attenzione: un operatore può rappresentare più operazioni A ciascuna espressione è associato un tipo determinato sulla base degli operandi e degli operatori che vi occorrono http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Espressioni semplici Sono formate da un singolo operando un letterale è una espressione denota un valore costante, il tipo viene stabilito sulla base della sua forma lessicale una variabile è una espressione denota il valore della variabile, il tipo viene stabilito sulla base della sua dichiarazione una costante è una espressione denota il valore della costante, il tipo viene stabilito sulla base della sua dichiarazione la creazione di un oggetto è una espressione denota il riferimento all’oggetto creato, il tipo è la classe da cui l’oggetto viene creato l’invocazione di un metodo è una espressione denota il valore restituito dal metodo, il tipo è il tipo di ritorno l’accesso a una variabile di un oggetto è una espressione denota il valore della variabile, il tipo è il tipo della variabile http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Espressioni composte … Sono formate da più operatori e operandi Esempio: se espr1 e espr2 sono espressioni, allora anche espr1 + espr2 e espr1 * espr2 sono espressioni Il tipo di una espressione viene determinato sulla base del tipo dei suoi operandi e delle caratteristiche degli operatori che vi occorrono Esempio 1: se espr1 e espr2 sono espressioni di tipo int, allora anche espr1 + espr2 è una espressione di tipo int Esempio 2: se espr1 e espr2 sono espressioni di tipo double, allora anche espr1 + espr2 è una espressione di tipo double L’operatore + è lo stesso nei due esempi ? http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

… Espressioni composte Esempio 2 * 3 + 4 è una espressione, in cui compaiono due operatori gli operandi dell’operatore * sono i letterali 2 e 3 gli operandi dell’operatore + sono l’espressione 2*3 e il letterale 4 nell’espressione 3.14 * r * r ci sono due operatori gli operandi dell’operatore * più a sinistra sono i letterali 3.14 e la variabile r gli operandi dell’operatore * più a destra sono l’espressione 3.14*r e la variabile r anche Math.sqrt(a) + Math.sqrt(b) è una espressione in cui l’operatore somma va applicato ai risultati delle invocazioni di metodi Math.sqrt(a) e Math.sqrt(b) anche Math.sqrt(a + b) è una espressione in cui il metodo Math.sqrt va invocato usando come argomento il risultato della valutazione dell’espressione a+b http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Valutazione delle espressioni Le espressioni vengono valutate calcolando il valore di ciascun operando, e applicando gli operatori uno alla volta, in un ordine che dipende: dalla precedenza degli operatori che vi occorrono normalmente gli operatori moltiplicativi vanno applicati prima di quelli additivi a parità di precedenza, dall’associatività degli operatori normalmente operatori con uguale precedenza vanno valutati da sinistra verso destra dalle parentesi che sono un operatore http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Valutazione delle espressioni Qual è il risultato delle seguenti espressioni? 6 + 2 + 1 vale 9 2 * 3 + 4 vale 10 — oppure 14? 4 + 2 * 3 vale 10 — oppure 18? 6 - 2 - 1 vale 3 — oppure 5? In questi semplici esempi, il valore delle espressioni è quello che uno si aspetta in generale, il valore di una espressione viene calcolato valutando un operatore alla volta se una espressione è composta da più operatori, in che ordine vengono applicati i diversi operatori e quali sono i loro operandi? le regole che stabiliscono l’ordine di valutazione delle espressioni sono basate sui concetti di precedenza e associatività tra operatori http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Precedenza degli operatori La precedenza degli operatori permette di stabilire, nell’ambito di una espressione, qual è l’operatore che deve essere applicato per primo ad esempio, una regola di precedenza è la seguente nelle espressioni aritmetiche, gli operatori moltiplicativi *, / e % hanno precedenza (ovvero, devono essere valutati prima degli) sugli operatori additivi + e - quindi 2 * 3 + 4 vale 10 — e non 14 4 + 2 * 3 vale 10 — e non 18 La tabella con le precedenze di tutti gli operatori e’ sul libro, quindi omessa 2 3 4 + * primo operatore a essere valutato secondo operatore a essere valutato http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Precedenza degli operatori Principali operatori di Java - precedenza decrescente Tipo operatori Operatori postfissi Operatori Operatori unari (prefissi) Creazione e cast Operatori moltiplicativi Operatori additivi Operatori di shift Operatori relazionale Operatori di uguaglianza Congiunzione logica Disgiunzione logica (XOR) Disgiunzione logica (OR) Congiunzione condizionale Disgiunzione condizionale Operatore condizionale Assegnazione [espressione] . (espressione) ++ -- ++ -- + – ~ ! new (tipo) * / % + – << >> >>> < > >= <= instanceof == != & ^ | && || ?= = += –= *= /= %= >>= <<= >>>= &= ^= |= + - http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Associatività degli operatori L’associatività degli operatori permette di stabilire l’ordine di applicazione tra operatori che hanno la stessa precedenza tutti gli operatori binari sono associativi a sinistra (ad eccezione degli operatori di assegnazione, che sono associativi a destra) quindi 6 + 2 + 1 viene interpretato come (6 + 2) + 1 e vale 9 6 - 2 - 1 viene interpretato come (6 - 2) - 1 e vale 3 (non 5) 2 1 6 – primo operatore a essere valutato secondo operatore a essere valutato http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Parentesi Le parentesi sono un operatore che ha precedenza massima tra gli operatori, che permette quindi di imporre l’ordine di valutazione desiderato ( 4 + 2 ) * 3 vale 18 6 - ( 2 - 1 ) vale 5 solo parentesi tonde, eventualmente annidate ( 10 * (10+1) ) / 2 vale 55 le parentesi quadre e graffe hanno un altro significato Stilisticamente, le parentesi andrebbero utilizzate solo per modificare la precedenza e/o l’associatività degli operatori http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Operatore di assegnazione Anche = è un operatore, l’operatore di assegnazione a = 5 l’operatore di assegnazione è binario il primo operando è il nome di una variabile il secondo operando è una espressione semantica dell’assegnazione essendo un operatore, la sua valutazione ha anche l’effetto di restituire un valore il valore dell’espressione, ovvero il valore assegnato alla variabile a = b = 5; System.out.println(a=8); questo uso è sconsigliato ! ! ! http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Operatori di assegnazione composti Gli operatori di assegnazione composti sono ottenuti componendo un operatore aritmetico binario con l’operatore di assegnazione a += 5 equivale all’assegnazione a = a + 5 a -= 5 equivale all’assegnazione a = a - 5 a *= 5 equivale all’assegnazione a = a * 5 a /= 5 equivale all’assegnazione a = a / 5 a %= 5 equivale all’assegnazione a = a % 5 http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Operatori di incremento e decremento Due operazioni molto comuni sono l’incremento e il decremento di uno di una variabile intera a = a+1; // equivalente a: a +=1 b = b-1; // equivalente a: b -=1 Queste operazioni sono molto comuni, e per questo motivo Java fornisce gli operatori di incremento ++ e decremento – – a++; // equivalente a: a +=1 b--; // equivalente a: b -=1 http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Interpretazione degli operatori sovraccarichi Per gli operatori aritmetici se entrambi gli operandi sono interi l’operando indica una operazione tra interi e il risultato è intero se entrambi gli operandi sono reali l’operando indica una operazione tra reali e il risultato è reale se un operando è reale e l’altro è intero viene convertito il valore intero a un valore reale e viene eseguita l’operazione tra reali 7 / 2 vale 3 7.0 / 2.0 vale 3.5 7 / 2.0 e 7.0 / 2 valgono 3.5 http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Esercizio Determinare tipo e valore per ciascuna delle seguenti espressioni 1/2 + 1/2 1.0/2 + 1/2.0 1.0/2 + 1/2 Il significato di un operatore dipende solo dal tipo dei suoi operandi, e non dal contesto in cui il suo risultato viene utilizzato ad esempio, l’ultima espressione vale 0.5 (e non 1.0). Infatti (almeno) un operando è di tipo double, pertanto vengono interpretati come operatori razionali entrambi gli operandi sono di tipo int, pertanto viene interpretato come operatore intero + / / 1.0 2 1 2 http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Divisione per zero A differenza di quanto avviene nell’aritmetica intera, la divisione per zero è una operazione consentita nell’aritmetica razionale il dominio dei tipi numerici reali comprende una rappresentazione dell’infinito Ad esempio double a, b, c; a = 2; b = 0; c = a/b; System.out.println(c); // stampa Infinity I valori infiniti possono essere acceduti come costanti notevoli delle classi Double e Float (del package java.lang) Double.POSITIVE_INFINITY e Double.NEGATIVE_INFINITY denotano rispettivamente + e – inoltre, Double.NaN (Not a Number) denota un valore che non è un numero (ad esempio, il risultato di 0.0/0.0) http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Il tipo boolean Rappresentazione Dominio Operatori Concettualmente … 1 bit Dominio Due elementi: true (vero), false (falso) Operatori And: &, && Or: I, II Not: ! http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Algebra di Boole e tipo primitivo boolean Un tipo di dato molto importante e utile nella programmazione è il tipo delle espressioni usate nella scrittura di condizioni per le istruzioni di controllo questo tipo di dato è rappresentato in Java dal tipo primitivo boolean (in onore del matematico britannico George Boole (1815-1864)) il significato del tipo boolean può essere descritto con riferimento alla sua formulazione matematica, ovvero all’algebra di Boole http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Algebra di Boole L’algebra di Boole è formata dai seguenti elementi un dominio composto da due soli elementi, corrispondenti ai valori di verità “vero” e “falso”, che denoteremo rispettivamente mediante i simboli TRUE e FALSE tre operatori (chiamati operatori booleani) l’operatore unario ¬ (“not”) di complementazione o negazione l’operatore binario  (“and”) di congiunzione l’operatore binario  (“or”) di disgiunzione http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Operatori booleani Semantica degli operatori booleani ¬A vale TRUE se A vale FALSE, e vale FALSE altrimenti A  B vale TRUE se sia A che B valgono contemporaneamente TRUE, e vale FALSE altrimenti A  B vale TRUE se almeno una tra A e B vale TRUE, e vale FALSE altrimenti A ¬ A FALSE TRUE A B A  B FALSE TRUE A B A  B FALSE TRUE http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Alcune proprietà degli operatori booleani Idempotenza di  e  A  A = A A  A = A Commutatività di  e  A  B = B  A A  B = B  A Associatività di  e  A  (B  C) = (A  B)  C A  (B  C) = (A  B)  C Distributività A  (B  C) = (A  B)  (A  C) A  (B  C) = (A  B)  (A  C) http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Alcune proprietà degli operatori booleani Elementi neutri di  e  TRUE  A = A FALSE  A = A Elementi assorbenti di  e  FALSE  A = FALSE TRUE  A = TRUE Eliminazione della doppia negazione ¬ (¬ A) = A Leggi di De Morgan ¬ (A  B) = (¬ A)  (¬ B) ¬ (A  B) = (¬ A)  (¬ B) Altre identità notevoli A  (¬ A) = FALSE A  (¬ A) = TRUE http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Operatori logici A valori di tipo boolean è possibile applicare i seguenti operatori logici l’operatore ! di negazione ! true vale false ! false vale true l’operatore && di congiunzione condizionale a && b vale true se sia a che b valgono true l’operando b viene valutato solo se a vale true false && ... e true && false valgono false true && true vale true l’operatore | | di disgiunzione condizionale a | | b vale true se almeno uno tra a e b vale true l’operando b viene valutato solo se a vale false true | | ... e false | | true valgono true false | | false vale false http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Operatori logici (non condizionali) Java fornisce altri due operatori logici non condizionali, varianti degli operatori && e | | l’operatore & di congiunzione (non condizionale) a & b vale true se sia a che b valgono true entrambi gli operandi a e b vengono valutati l’operatore | di disgiunzione (non condizionale) a | b vale true se almeno uno tra a e b vale true http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Espressioni di tipo boolean Nella valutazione di espressioni di tipo boolean (che coinvolgono operatori logici) l’operatore di negazione ! ha la precedenza maggiore tra tutti gli operatori logici (condizionali e non) l’operatore di congiunzione && ha precedenza maggiore dell’operatore di disgiunzione | | gli operatori logici non condizionali | e & hanno precedenza maggiore di quelli condizionali | | e && Esercizio valutare le seguenti espressioni ! true && false ! (true && false) (true && false) | | ! (true && false) http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Operatori relazionali L’avere a disposizione il tipo boolean permette di confrontare una coppia di valori per verificare se tra questi valori sussiste o meno una certa relazione mediante gli operatori relazionali si applicano a coppie di operandi restituiscono un valore boolean l’operatore maggiore di, > l’operatore maggiore o uguale di, >= l’operatore minore di, < l’operatore minore o uguale di, <= l’operatore uguale a, == da non confondere con l’operatore di assegnazione = l’operatore non uguale a, != Gli operatori relazionali hanno precedenza minore dell’operatore di negazione, ma maggiore degli operatori logici http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Operatori relazionali Ad esempio 10 > 5 vale true 10.0 < 5.0 vale false 10 > 10 vale false 10 >= 10 vale true 10.0 >= 5.0 vale true 10 == 5 vale false 10 == 10 vale true 10 != 5 vale true 10 != 10 vale false 'a' > 'z' vale false 'a' > 'Z' vale true 'A' > '5' vale true http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Predicati Le espressioni di tipo boolean sono chiamate anche predicati (o condizioni) i predicati sono espressioni in cui possono apparire sia operatori relazionali che operatori logici ad esempio, il predicato (n>=0) && (n<=10) vale true se (e solo se) il valore di n è compreso tra 0 e 10 http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Variabili boolean È possibile dichiarare variabili di tipo boolean le variabili di tipo boolean vanno normalmente documentate con un commento che descrive la proprietà che è verificata se la variabile assume il valore true boolean nPari; // n è pari boolean nPositivo; // n è positivo boolean nPariEPositivo; // n è pari e positivo È possibile assegnare a una variabile boolean il valore (della valutazione) di un predicato /*n è pari se il resto della divisione per 2 e’ zero */ nPari = (n%2) == 0; nPositivo = n>0; Nei predicati è possibile usare anche variabili boolean nPariEPositivo = nPari && nPositivo; http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Esercizio Qual è il valore stampato dal seguente frammento di codice? Perché? boolean a, b, c; a = true; b = true; c = a && !b; b = (b && c) || (!b && !c); a = (b && c) || (!b && !c); c = !(a && b); if ((a && b && !c) || (a && !b)) System.out.println("Ho capito!"); else System.out.println("Non ho capito!"); http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Espressioni booleane e operatori relazionali In teoria, è possibile usare gli operatori di uguaglianza (== e !=) per verificare se una certa espressione booleana è vera o falsa boolean nPari; // n è pari ... if (nPari==true) System.out.println(n + " è pari"); else System.out.println(n + " è dispari"); Questa modalità di scrittura è assolutamente Sconsigliata!!! è inutile nPari==true è equivalente a nPari nPari==false è equivalente a !nPari è soggetta a errori (logici, non rilevati dal compilatore) ad esempio, se si scrive in una condizione nPari=true anziché nPari==true http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Leggi di De Morgan Le leggi di De Morgan sono delle leggi di dualità tra espressioni che coinvolgono operatori logici sono leggi definite per gli operatori logici non condizionali, che valgono anche per gli operatori logici condizionali Siano b1, b2, ..., bn espressioni di tipo boolean, allora ! ( b1 & b2 & ... & bn ) è equivalente a ! b1 | ! b2 | ... | ! bn la negazione di una congiunzione di termini è uguale alla disgiunzione dei termini negati ! ( b1 | b2 | ... | bn ) è equivalente a ! b1 & ! b2 & ... & ! bn la negazione di una disgiunzione di termini è uguale alla congiunzione dei termini negati Ad esempio ! ( (a>=0) && (a<b) ) è equivalente a !(a>=0) | | !(a<b) che è poi anche equivalente a (a<0) | | (a>=b) http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Esercizio Sia anno una variabile intera che rappresenta un anno scrivere una espressione booleana, in cui compare la variabile anno, che è vera se e solo se anno è bisestile normalmente, anno è bisestile se anno è divisibile per 4 tuttavia, normalmente se anno è divisibile per 100 allora non è bisestile, come nel caso dell’anno 1900 tuttavia, se anno è divisibile per 400 allora è bisestile, come nel caso dell’anno 2000 Lasciarlo qui o rimandare alle eserciazioni????? http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Gli altri tipi primitivi di Java byte – un intero relativo tra -128 e +127 (8 bit) short – un intero relativo tra -32768 e +32767 (16 bit) long – un intero relativo tra -9223372036854775808 e +9223372036854775807 (64 bit) float – un numero reale in virgola mobile secondo lo standard IEEE 754-1985 a 32 bit (mantissa con 9 cifre significative, ed esponente tra -45 e +38) http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Conversione tra tipi Talvolta è possibile / necessario effettuare conversioni da un tipo a un altro per trasformare la rappresentazione di un valore in un’altra rappresentazione Ad esempio: si vuole calcolare il cubo di un numero intero. Nelle librerie di java c’è il metodo Math.pow: static double pow(double a, double b) Returns the value of the first argument raised to the power of the second argument Uno o piu’ esempi di necessita’ di conversione completare l’esempio http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Conversione implicita Si consideri il seguente frammento di codice int intero; // un valore intero double reale; // un valore reale ... assegna un valore a intero ... reale = intero; questa assegnazione è corretta? sì, è possibile assegnare un valore intero a una variabile di tipo double che cosa vuole dire questa assegnazione? il valore di intero (come sequenza di bit) non può semplicemente essere trascritto nella variabile reale bisogna prima convertire il valore di intero a un valore equivalente di tipo double si tratta di una conversione implicita o promozione http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Assegnazioni e conversioni implicite Una assegnazione variabile = espressione è valida se variabile ed espressione hanno lo stesso tipo, oppure se il tipo di variabile è “più ampio” di quello di espressione in quest’ultimo caso la semantica dell’assegnazione consiste nella valutazione di espressione, nella conversione implicita del valore calcolato al tipo di variabile e in una assegnazione a variabile intero = 10; reale = intero; /* ora reale vale 10.0 */ Le conversioni implicite vengono effettuate anche in altri casi Math.sqrt(144) 7.0/2 http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Conversione esplicita Si consideri il seguente frammento di codice int intero; // un valore intero double reale; // un valore reale ... assegna un valore a reale ... intero = reale; questa assegnazione è corretta? no, il tipo di intero non è più ampio di quello di reale posso voler effettuare una assegnazione di questo tipo? in alcuni casi con quale significato? arrotondando il valore di reale a un intero – nel modo migliore possibile è necessaria una conversione esplicita perché è possibile la perdita di precisione http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Conversione esplicita e cast Se T è un tipo, allora la forma sintattica (T ) è un operatore unario – operatore di cast - che indica una conversione di un valore al tipo T reale = 10.8; intero = (int) reale; /* ora intero vale 10 */ la conversione viene effettuata perdendo di precisione in questo caso, arrotondando per difetto http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Esercizi Si vuole calcolare il cubo di un numero intero int num; int cubo; cubo = (int) Math.pow(num,3.0); Siano: double a=3.0; int b=2; int c=10; Quale valore calcola l’espressione c/b+b*a ? Trasformare un carattere minuscolo nel relativo carattere maiuscolo Trasformare un carattere maiuscolo nel relativo minuscolo http://www.dia.uniroma3.it/~java/fondinf/ Tipi ed espressioni

Riepilogo della dispensa… La nozione dei tipi di dato nei linguaggi di programmazione e’ simile a quella delle strutture algebriche: elementi del dominio e operatori definiti sul dominio dato. Tutti gli elementi del linguaggio sono caratterizzati da un tipo di dato Due categorie di tipi di dato: tipi primitivi (int, byte, short, long, char, float, double, boolean) e tipi riferimento (String, tutte le classi) Anche un’espressione e’ caratterizzata da un tipo, che viene definito sulla base del tipo con il dominio piu’ ampio tra il dominio degli operandi cui il tipo appartiene. http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione

…Riepilogo della dispensa Le espressioni vengono valutate secondo la precedenza degli operatori presenti (a parita’ vengono valutate da sinistra verso destra). Le parentesi modificano la priorita’ degli operatori. Anche = e’ un operatore: l’operatore di assegnazione. Gli operatori si dicono sovraccarichi quando sono definiti per diversi tipi di dato. Quando in una espressione compaiono operandi di tipi diversi, tra loro compatibili, il tipo dell’espressione e’ determinato dal tipo con il dominio piu’ grande, tra quelli presenti. In questo caso tipi con il domino piu’ piccolo vengono trasformati in tipi con il dominio piu’ grande e poi viene realizzata la valutazione dell’espressione. In questo caso avviene una conversione impliicita. La conversione esplicita puo’ essere solo realizzata dall’utente che prevede un eventuale troncamento nel valore del dato che, essendo diventando elemento di un domnio piu’ piccolo, potrebbe perdere delle infomrazioni. http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione

La rappresentazione dell’informazione Conoscenze acquisite Analogia tra il tipo di dato e la classe Tipi primitivi di Java Differenza nella rappresentazione dei diversi tipi primitivi Alcuni operatori hanno un significato diverso in corrispondenza dei tipi degli operandi su cui operano Espressioni e loro valutazione Cast impliciti ed espliciti tra tipi diversi http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione

La rappresentazione dell’informazione Competenze acquisite Applicare correttamente operatori coerenti con diversi tipi di dato Gestire le espressioni formate da diversi tipi di dato avendo in mente La precedenza tra gli operatori Il modo in cui vengono valutate le espressioni Sapendo gestire gli operatori sovraccarichi Effettuare conversioni esplicite e sapere quando si verificano le conversioni implicite http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione

La rappresentazione dell’informazione Parole chiave Tipi di dato primitivi/riferimento Rappresentazione, interpretazione, dominio, operatori Variabili, costanti, parametri Opratori relazionali, operatori logici, predicati Espressioni, operatori sovraccarichi, cast, conversioni esplicite/implicite http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione

Rifermimenti al libro di testo Per lo studio di questi argomenti si fa riferimento al libro di testo, e in particolare al capitolo 11 – Tipi ed espressioni http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione

Esercizi di autovalutazione Vedi sul sito: 04-autovalutazione.doc http://www.dia.uniroma3.it/~java/fondinf/ La rappresentazione dell’informazione