Programmazione in Java (I modulo) Lezione 3: Prime nozioni
La volta scorsa Abbiamo avuto un primo assaggio! Abbiamo analizzato riga per riga due semplici programmi Java. Abbiamo provato a usare l editor per scrivere/correggere un programma Java. Abbiamo provato a scrivere, compilare ed eseguire dei piccoli programmi Java.
Terminologia Un programma è una sequenza di istruzioni che verranno eseguite dal computer. La persona che scrive il programma è il programmatore (programmer). La persona che interagisce (usa) il programma è l utente (user).
Terminologia Un programma viene scritto in un linguaggio detto linguaggio di programmazione. Il compilatore (interprete) lo traduce in linguaggio macchina, perchè possa essere eseguto dal computer. Perchè il programma possa essere compreso dal compilatore deve essere ben scritto e rispettare tutte le regole grammaticali del linguaggio di programmazione. Tali regole sono chiamate la sintassi del linguaggio.
Programmare Programmare è un processo creativo Bisogna imparare delle tecniche standard e integrarle con le soluzioni dei problemi che vogliamo risolvere. Tali tecniche di programmazione sono poi applicabili a quasi tutti i linguaggi di programmazione (Java incluso).
Algoritmi L essenza di un programma consiste nell algoritmo utilizzato. Un algoritmo descrive il modo con cui un azione dovrà essere realizzata. Una volta che abbiamo definito bene l algoritmo, esprimerlo in Java (o in un altro linguaggio di programmazione) non è un compito difficile.
Algoritmi Un algoritmo è un insieme di istruzioni per risolvere un problema. Un algoritmo deve essere espresso in maniera completa e precisa dal punto di vista matematico. Un algoritmo può essere espresso in un linguaggio naturale (italiano, inglese, ) o in pseudocodice.
Algoritmi Utilizziamo algoritmi nella vita quotidiana tutte le volte che:, seguiamo le istruzioni per il montaggio di una apparecchiatura, per impostare il ciclo di lavaggio di una lavastoviglie, per prelevare contante da uno sportello Bancomat, ecc..
Algoritmi Un algoritmo è una sequenza di passi che, se intrapresa da un esecutore, permette di ottenere i risultati attesi (output) a partire dai dati forniti (input). Una volta in grado di specificare un algoritmo per risolvere un problema, siamo anche in grado di automatizzare il procedimento descritto dall algoritmo.
Curiosità Il termine algoritmo deriva dal nome del matematico persiano Muhammadibn Musa al-khwarizmi (Corasmia 780 circa - 850 circa). Esercitò la professione nella città di Baghdad, dove insegnava, e introdusse nel mondo arabo i numeri indiani. La sua opera Il calcolo degli indiani venne successivamente tradotta in latino da un monaco europeo, con il titolo Liber algarismi - (Il libro di al- Khwarizmi).
Dall algoritmo al programma.. L algoritmo in psedocodice viene tradotto dal programmatore in un linguaggio di programmazione seguendo la sintassi del linguaggio. Il programma viene tradotto dal compilatore (interprete) in linguaggio macchina per essere eseguito. Il compilatore ci aiuta anche a correggere gli errori del programma
Errori Un errore in un programma è chiamato bug. Il processo di eliminazione errori è chiamato debugging. Tre tipi di errori Errori di sintassi Errori di esecuzione Errori logici
Errori di sintassi (sintax errors) Sono errori grammaticali le regole di scrittura sono molto strette Il compilatore rileva gli errori di sintassi e scrive un messaggio di errore Esempio: dimenticare un ; alla fine di una istruzione
(Errori di esecuzione) Runtime Errors Errori che vengono individuati mentre si esegue il programma (non durante la compilazione) Quando il computer trova un errore, il programma termina e viene stampato sullo schermo un messaggio di errore. Esempio: attempting to divide by 0
Errori Logici (Logic Errors) Errori che non vengono segnalati nè durante la compilazione nè durante l esecuzione ma che portano il programma a produrre risultati sbagliati. DIFFICILI da individuare! Occorre testare il programma con particolari dati in input
Riutilizzare il Software Programmi non sono di solito creati da zero In genere contengono delle parti che sono state create in altri contesti Si utilizzano delle classi generali già definite Java fornisce già molte classi Controllare la documentazione Java
Riutilizzare il Software
Variabili Variabili sono utilizzate per memorizzare dati come numeri e lettere. sono una specie di contenitore sono implementate come locazioni di memoria Il dato memorizzato in una variabile è chiamato il suo valore. il valore è conservato nella locazione di memoria. Il valore di una variabile può essere cambiato.
Memoria Principale RAM
Dichiarazione di variabili Dichiarare una variabile significa sceglierne il nome e il tipo. int numerocestini,uovapercestino; Il tipo di una variabile determina quale genere di valore potrà contenere. (int, double, char, etc.). Una variabile deve essere dichiarata prima di essere utilizzata in una istruzione.
Sintassi ed esempi sintassi <tipo> <identif_1>,<identif_2>, ; esempi int num1, valore, contapassi; double media, tassointeresse; char risposta;
Identificatori Java Un identificatore è un nome (es. il nome di una variabile). Identificatori possono contenere soltanto: Lettere Cifre (0.9) il carattere underscore (_) Il primo simbolo non può essere una cifra. Identificatori possono essere lunghi a piacere Java è case sensitive, valore, Valore, e VALORE sono identificatori diversi.
Parole chiave o riservate Alcune parole che fanno parte proprio del linguaggio Java non possono essere usate come identificatori. Esempi: int, public, class,
Convenzioni sui nomi Tipi Class iniziano con lettera maiuscola (es. String). Tipi Primitivi iniziano con lettera minuscola (es. int). Variabili sia di tipo class che primitive iniziano con lettera minuscola (es. mionome, numero). Nomi formati da più parole contengono le maiuscole all inizio delle successive parole
Tipi di dati Un tipo primitivo è usato per valori semplici tipo come numeri o singoli caratteri. int, double, char sono tipi primitivi. Un tipo classe è usato per una classe di oggetti ed ha sia dati che metodi "Java is fun" è un valore del tipo classe String
Tipi Primitivi 4 tipi integer (byte, short, int, long) int è il più utilizzato 2 tipi floating-point (float,double) double è il più utilizzato 1 tipo carattere (char) 1 tipo booleano (boolean)
Tipi Integer 0-1 365 12000 Esempi Tipi Floating-point 0.99-22.8 3.14159 5.0 Tipi carattere 'a' 'A' '#' ' ' Tipi Booleani true false
Notazione esponenziale Chiamata anche scientifica o a virgola mobile (floating-point). Esempi: 865000000.0 corrisponde a 8.65e8 0.000483 corrisponde a 4.83e-4
Inprecisione nei numeri Floating-Point I numeri a virgola mobile sono spesso solo approssimazioni visto che possono contenere solo un numero finite di cifre. Quindi 1.0/3.0 è un po' meno di 1/3. Se faccio : 1.0/3.0 + 1.0/3.0 + 1.0/3.0 ottengo un po' meno di 1. ATTENZIONE!
Tipi Primitivi
Dichiarare le Variabili All inizio della sezione del programma public static void main(string[] args) { /* dichiara variabili qui */... } (Immediatamente prima del loro utilizzo)
Istruzioni di assegnamento Utilizzate per dare un valore ad una variabile risposta = 42; media = 55.3 / 7; scala = b ; Il simbolo di =" si chiama operatore di assegnamento.
Sintassi dell istruzione di assegnamento <variabile> = <espressione> dove espressione può essere un altra variabile, una costante (es. un numero) o qualche espressione aritmetica o logica. (che utilizza operatori aritmetici o logici) NOTA: espressione può contenere anche la stessa variabile Esempio: somma = somma + 4;
Istruzioni di assegnamento L espressione a destra dell operatore di assegnamento (=) è calcolata per prima. Il risultato è poi utilizzato per assegnare il valore alla variabile posta a sinistra del segno = Esempio: somma = somma + 4; dopo l istruzione il valore della variabile somma risulterà incrementato di 4 unità.
Inizializzare le Variabili Una variabile che è stata dichiarata ma a cui non è stato dato un valore si dice non inizializzata. In genere tutte le variabili hanno un qualche valore di default ( null per quelle di tipo class, 0 per quelle primitive numeriche) Meglio non fidarsi dei valori di default e inizializzarle!
Inizializzare le Variabili: sintassi L inizializzazione può essere fatta insieme alla dichiarazione: tipo var1 = valore1, var2 = valore2, ;
Operatori Aritmetici Espressioni aritmetiche sono formate usando gli operatori +, -, *, / insieme a variabili e numeri (operandi). Il risultato è un numero. Se entrambi gli operandi sono dello stesso tipo, il risultato è di quel tipo. Quando un operando è di tipo float e l altro è di tipo intero il risultato è di tipo float. Se gli operandi sono di vari tipi, il risultato è del tipo più a destra della lista sotto: byte -> short -> int -> long -> float -> double
L operatore divisione Se uno dei due operandi è di tipo float, l operatore divisione (/) si comporta come ci aspettiamo. ATTENZIONE! Se entrambi gli operandi sono interi, il risultato è troncato e non arrotondato. Esempio: 99/100 dà come risultato 0.
L operatore modulo (mod ) L operatore modulo (%) è usato con operandi interi e calcola il resto della divisione Esempio: 14 diviso 4 dà 3 con il resto di 2. quindi 14 % 4 è uguale a 2.
Altri operatori unari Si usano per incrementare o decrementare una variabile di 1 Non possono essere usati su costanti o espressioni Operatore Incremento ++ cont++ o ++cont Operatore Decremento -- cont-- or--cont
Operatori ++ e -- (Incremento e Decremento) Le seguenti espressioni sono equivalenti: cont++; ++cont; cont = cont + 1; cont--; --cont; cont = cont - 1;
NOTA la differenza! Se scrivo int m = 4; int ris = 3 * (++m) Dopo l esecuzione, ris vale 15 e m vale 5 Se scrivo int m = 4; int ris = 3 * (m++) Dopo l esecuzione, ris vale 12 e m vale 5
Parentesi Le espressioni aritmetiche possono contenere anche delle parentesi (, ) che cambiano l ordine di precedenza con cui applicare gli operatori In assenza di parentesi gli operatori vanno applicati seguendo le regole di precedenza (analoghe a quelle dell algebra!) e, a parità di precedenza, si procede da sinistra verso destra.
Regole di precedenza Operatori unari +, -, ++, -- Operatori binari *, /, %, Operatori binari +, -. Più alta Operatore di assegnamento = Esempio: val= -cont + n1 * ++n2 Più bassa
Altri operatori di assegnamento Esistono altri operatori di assegnamento ottenuti combinando l operatore = con gli operatori aritmetici. Sono: +=,-=,*=, /= ESEMPIO: num += 5; è equivalente a num = num + 5;
esercizio Ese03_1 Scrivere un programma che chiede all utente di inserire 5 numeri double corrispondenti al prezzo in euro di 5 oggetti da comprare. Assumiamo che i costi singoli siano <=3 Euro. Restituisce in output il costo totale da pagare per l'acquisto. Scrive in output anche il resto che il cassiere deve restituire (supponendo che l'utente paghi con una banconota da 20 Euro). NOTA1: Per acquisire in input valori double usare n = tastiera.nextdouble(); NOTA2: utilizzare SOLTANTO le variabili prezzo, totale, resto
esercizio Ese03_1plus Continuare il precedente esercizio, preparando il resto da restituire al cliente. Il cassiere deve dare il minor numero possibile di «pezzi» e dispone di: Carte da 5 Euro Monete da 2 e 1 Euro Monete da 50, 20 e 10 cent Quale algoritmo utilizziamo?
Analizziamo una soluzione per Ese02-4 assegnato nella scorsa lezione di laboratorio