

















Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Programmazione 1 Introduzione teorica a Java Definizioni Classi e metodi
Tipologia: Appunti
1 / 25
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!


















Giacomo Savazzi
L’informatica è una scienza che studia l’informazione e tutti quei processi che portano alla sua memorizzazione, elaborazione e trasmissione/diffusione. Non si occupa della parte fisica (computer) e non è neanche focalizzata sul solo sviluppo di applicativi. INFORMAZIONE → entità che raccoglie la conoscenza derivata dallo studio e descrizione di qualcosa; L’informazione, una volta ottenuta, va poi rappresentata e memorizzata in particolari supporti. La stessa informazione potrebbe essere rappresentata e memorizzata anche in più modi diversi. RAPPRESENTARE → trascrivere l’informazione su supporti materiali non volatili con opportuna codifica (convenzione condivisa per la scrittura, necessaria per rendere l’informazione comprensibile a tutti); Il calcolatore (PC, in particolare il processore) può lavorare solo con informazioni codificate tramite la codifica binaria, codifica che permette di rappresentare qualunque informazione sotto forma di sequenza di 0 e 1. Questa codifica è l’unica compresa da tutti i calcolatori e deve essere rispettata per garantire la comprensione tra calcolatori diversi. BIT → il bit (BInary digiT) è l’unità minima di informazione; CALCOLATORE → macchina per l’elaborazione di dati in grado di comprendere la sola codifica binaria. Il calcolatore è un dispositivo attivo infatti è in grado di elaborare i dati prendendo decisioni in base a particolari input. Esempio: una pagina web mostra all’utente solo i dati che gli competono in base alle sue autorizzazioni. A differenza delle altre macchine, il calcolatore può essere programmato e quindi specializzato in base al compito che dovrà eseguire. Per tale motivo è detto dispositivo di General Purpose (di scopo generale); Per specializzare un calcolatore sono necessari particolari algoritmi, insiemi di operazioni eseguibili in modo automatico dalla macchina e non ambigue, comprensibili al calcolatore. La macchina non lavora però direttamente con l’algoritmo, ma si basa sui programmi, rappresentazioni dell’algoritmo a lei comprensibili: la macchina decodificherà il programma e otterrà le varie operazioni da eseguire.
Sistema di numerazione basato sui bit. Il bit permette di implementare un sistema di numerazione in base 2 con uniche cifre ammesse 0 e 1. Ogni bit assume o 0 o 1 e con più bit sono in grado di rappresentare informazioni di qualunque grandezza. Si decise di usare il bit perché facilmente rappresentabile a livello fisico (0 assenza tensione, 1 presenza tensione) ed anche perché in corrispondenza con i valori logici 1, vero, e 0, falso. Aumentando il numero di bit aumento il numero di informazioni rappresentabili, infatti, con N bit posso rappresentare 2N^ informazioni diverse. Al contrario, se voglio rappresentare M informazioni mi serviranno: log( 2 , M) bit Approssimando poi il risultato per eccesso.
Byte → 1 byte corrisponde a 8 bit; Kilo byte → 1 Kilo byte corrisponde a 1024 byte;
Mega byte → 1 Mega byte corrisponde a 1024 Kilo byte; Giga byte → 1 Giga byte corrisponde a 1024 Mega byte; Tera byte → 1 Tera byte corrisponde a 1024 Giga byte;
Per rappresentare un carattere sotto di forma di una sequenza di bit ci si avvale di particolari standard che definisco una serie di sequenze che identificano i miei caratteri. La comprensione tra i vari calcolatori sarà poi ottenuta se tutti adottano lo stesso standard. Quelli più diffusi sono gli standard ASCII (American Standard Code for Information Interchange) e UNICODE:
Fu la prima proposta di architettura hardware per un calcolatore e venne elaborata dall’ informatico John Von Neumann nel 1946. Questa architettura vede il calcolatore composto da più elementi:
Introduciamo intanto il concetto di astrazione… ASTRAZIONE → distinguere le proprietà esterne di un oggetto dai dettagli interni (utilizzo senza effettiva conoscenza). In informatica l’astrazione di un oggetto può essere divisa in livelli: dal basso verso l’alto, il livello di astrazione aumenta permettendo all’utente di utilizzare una risorse senza conoscerne tutti i dettagli (Es. Kernel del sistema operativo); ALGORITMI → insiemi di operazioni eseguibili in modo automatico dalla macchina e non ambigue, comprensibili al calcolatore. Proprietà che caratterizzano gli algoritmi sono la correttezza, riuscire a ottenere il risultato desiderato, e l’efficienza, ottenere quel risultato con il più basso spreco di risorse in termini di tempo e memoria. Unendo i concetti di algoritmo e astrazione nasce il paradigma dividi et impera basato sulla divisione del problema in sotto problemi, detti moduli, di più facile risoluzione. I vari moduli interagiranno poi tra loro per risolvere il problema iniziale.
Il computer non esegue direttamente l’algoritmo ma esegue il programma che implementa quel particolare algoritmo. Questi programmi sono sequenze di istruzioni scritte in particolari linguaggi, detti linguaggi di programmazione, comprensibili al calcolatore. Questi linguaggi, come quelli normali, definiscono per la comunicazione una serie di elementi divisi in:
Le istruzioni scritte in assembly o con linguaggi di alto livello non sono comprensibili al calcolatore. Vanno quindi tradotte in linguaggio macchina. Ad adempiere a questo compito ci pensa o il compilatore o l’interprete:
Proprietà degli identificatori – OBBLIGATORIE Tutti gli identificatori (classi, variabili etc.) devono rispettare le seguenti regole in modo da non sollevare errori sintattici in fase di compilazione:
I tipi primitivi in JAVA sono: Esempi di dichiarazioni e assegnamento a variabili di vario tipo: Intero → i valori interi assegnabili alle variabili intere sono numeri appartenenti all’insieme dei numeri relativi e sono identificati nel programma da numeri senza virgola (1 , 2 , 308 etc.); Virgola mobile → i valori in virgola mobile assegnabili alle variabili floating point sono numeri appartenenti all’insieme dei numeri reali approssimati in modo da poter essere rappresentati. I numeri DOUBLE sono identificati nel programma da numeri con il punto (1.2 , 2.0 , 3.4 etc.) mentre quelli FLOAT sono identificati da numeri con il punto più una F alla fine per dire che è FLOAT e non DOUBLE (1.2f , 3.0f , 3.4f etc.); Singolo carattere → un singolo carattere è identificato utilizzando i singoli pedici (‘a’ , ‘b’ , ‘1’ etc.). Ogni carattere ha un corrispondente codice UNICODE, infatti, in JAVA il carattere è gestito come un tipo intero solo che in fase di stampa, al posto del numero, viene stampato il corrispondete UNICODE.
La gerarchia dei tipi vista prima vale anche per le operazioni tra variabili, infatti: N.B. se divido tra loro due numeri interi sto eseguendo una divisione intera e infatti mi viene ritornato come risultato la sola parte intera della divisione. Per ottenere una divisione esatta devo utilizzare almeno un double o un float; N.B. l’operatore %, utilizzato per sapere il solo resto della divisione, può essere usato anche tra valori a virgola mobile e agisce in questo modo: N % D = N – (D*Q) dove Q è la parte intera di N/D Espressioni Le espressioni sono un misto di variabile, detti operandi, e operatori che producono come risultato un valore che può essere un valore intero, in virgola mobile, booleano etc. Gli operatori JAVA si dividono in:
N.B. l’operatore = è quello con precedenza minore perché sempre eseguito alla fine per assegnare il valore ottenuto dalla computazione dell’espressione alla variabile; Costanti In JAVA esistono altri valori, detti costanti o letterali, utilizzati per identificare quegli elementi il cui valore non può cambiare. Ad esempio, elementi come i numeri o i caratteri (2, 3, 5.0, ‘a’ etc.) non cambiano nel tempo. Queste costanti sono definite e sono utilizzate ad esempio nelle espressioni o negli assegnamenti. Anche le costanti si differenziano in base al tipo, infatti, 5 è diverso da 5.0. JAVA permette inoltre al programmatore di definire le proprie costanti dette costanti con nome. La sintassi è la seguente: Con la clausola PUBLIC definisco lo scope della costante, in questo caso tutta la classe, e con FINAL dico che il valore non è modificabile. Espressioni booleane Particolari espressioni che ritorna un valore di tipo booleane, true o false, e vengono utilizzate nelle strutture di selezione e nei cicli per decidere se eseguire alcune istruzioni oppure no. Tali espressioni sono composte da:
Come abbiamo visto, i caratteri si specificano tra singoli apici (‘a’) mentre le stringhe vanno obbligatoriamente specificate tra doppi apici proprio per distinguerle dalle variabili di tipo char. N.B. una stringa può essere composta da un solo carattere ma essere comunque una stringa e, inoltre, esiste anche la stringa vuota a differenza del tipo char che non ammette il carattere vuoto ‘’ perché tale carattere non ha corrispondente nella tabella UNICODE. Ogni carattere all’interno della stringa ha una posizione precisa a partire da 0 ad aumentare fino all’ultimo carattere della stringa. Esempio di stringa di lunghezza 12 con carattere ‘C’ in posizione 0. Inoltre, le stringhe possono essere concatenate semplicemente tramite l’utilizzo dell’operatore +, unico utilizzabile tra stringhe: Il tipo String, nelle operazioni, prevale su qualsiasi altro tipo, infatti, se vado a concatenare una stringa con un qualunque tipo, primitivo e non, il tutto verrà convertito a stringa. Utile , concatenando la stringa vuota a un qualunque tipo stampabile, posso convertirlo in stringa. Metodi della classe String Essendo String una classe, essa offre una serie di metodi per la manipolazione delle stringhe, come:
compareTo(), metodo che confronta due stringhe in senso lessicografico e ritona un valore intero (tipo int) che sarà 0, se le due stringhe sono uguali, maggiore di 0, se la prima stringa è successiva alla seconda, minore di 0, se la prima stringa è precedente alla seconda. Questa comparazione si basa sul valore UNICODE di ogni carattere delle stringe, infatti, se tutte le lettere sono maiuscole o minuscole, verrà eseguita una comparazione alfabetica mentre, ad esempio, se la prima stringa presenta anche una sola maiuscola in più dell’altra, tale stringa sarà sicuramente antecedente all’altra perché le lettere maiuscole, nella tabella UNICODE, sono precedenti alle minuscole;
replace(), metodo che permette di sostituire tutte le occorrenze di un certo carattere con un altro carattere da noi specificato. Metodo che richiede due parametri, il carattere che si vuole modificare e quello che si vuole inserire, e ritorna una nuova stringa con tutte le occorrenze del carattere specificato modificate, se il carattere era presente, oppure la stringa uguale, se il carattere non era presente;
Nel primo caso, se verificata la condizione verrà eseguita istruzione1 mentre istruzione2 viene eseguita sempre. Nel secondo caso, istruzione1 e istruzione2 sono eseguite solo se l’espressione è verificata. Altre tipologie di istruzione If-Else sono gli If annidati, selezioni con all’interno altre selezioni, e gli If multi-ramo, sequenza di selezioni consecutive. Nel primo caso siamo in presenza di un If annidato, quindi, solo se espressione1 e espressione2 sono verificate posso eseguite i struzione. Nel secondo caso siamo in presenza di un If multi-ramo. In questo caso se espressione1 è verificata eseguo istruzione1 , in caso contrario, controllo espressione2 e se verificata eseguo istruzione. N.B. a un blocco If o Else può anche essere associata una istruzione vuota specificando subito il ; dopo il blocco. In questo caso, se la condizione si verifica, non viene eseguito nulla. In riferimento all’esempio, se si verifica espressione non succede nulla, mentre, se non si verifica, viene eseguita istruzione.
Enunciamo prima di tutto il Teorema di Böhm-Jacopini: tale teorema afferma che ogni programma può essere implementato con le solo strutture di selezione, sequenza e ciclo. Lo switch è un costrutto che non previsto dal teorema ma comunque molto utile perché ci permette di scrivere in modo più semplice e pulito operazioni di controllo dell’uguaglianza del contenuto di una variabile, con più valore costanti dello stesso tipo. Senza lo switch tale operazione potrebbe comunque essere eseguita da un If-Else multi-ramo. Lo switch è utilizzabile solo per verificare l’uguaglianza di variabili di tipo Int, Short, Char e String (e basta!) con valori costanti dello stesso tipo della variabile (1, ‘a’, “ciao” etc.). N.B. non è vietato a livello sintattico l’utilizzo dello switch con variabili Float e Double ma è sconsigliato perché tali variabili vengono approssimate e quindi un confronto esatto, con ==, potrebbe dare problemi.
In questo esempio il valore della variabile x viene confrontato con i valori costanti 10 e 11. Nel caso nessuno dei due casi si verifichi allora si entra nella sezione default , opzionale. N.B. l’istruzione break esce dallo switch, senza andare a valutare le istruzioni successive, per far continuare l’esecuzione dalle istruzioni dopo tale costrutto. Il break può anche essere omesso ma, in quel caso, verrà eseguita anche l’istruzione presente nel blocco case subito successivo a quello che ho appena verificato, senza andare a controllare l’uguaglianza con il valore costante specificato in quest’ultimo. Se io non metto nessun break nel mio switch, allora verranno eseguite tutte le istruzioni a partire dal primo case verificato fino alla istruzione del default, se presente. In questo caso, se il valore contiene 10 o 11, viene stampato a video “X contiene 11”, perché il primo caso non ha break. N.B. questa situazione può tornare utile se si vogliono eseguite le stesse operazioni per più casi diversi.
Il break e il continue sono due istruzioni che permettono di modificare l’esecuzione di un ciclo:
Strutture fondamentali per l’implementazione della maggior parte dei programmi: permettono di eseguire una serie di istruzioni finché una espressione booleana è verificata. Esistono due tipi di cicli fondamentali, il While e il Do-While, più una terza tipologia opzionale, il For:
Con metodi si intendono blocchi di istruzioni che svolgono determinate funzioni, richiamabili all’interno del codice tutte le volte che si vuole senza riscrivere le istruzioni che la implementano ogni volta. I metodi sono molto utili perché permettono di dividere un programma in moduli e semplificarne così lo sviluppo. In JAVA, i metodi sono definiti all’interno della classe a cui appartengono; una classe può contenere un numero finito, ma molto elevato, di metodi che possono essere scritti in qualsiasi parte della classe perché, in JAVA, l’ordine in cui sono definiti i metodi non influisce sulla loro chiamata, a differenza del C dove sono necessari i prototipi. I metodi sono definiti da una intestazione, necessaria per la loro chiamata, e da un corpo, contenente, tra parentesi graffe, le istruzioni che verranno eseguite.