Algoritmi e programmazione
Programmazione
Programmazione: attività di scrittura delle azioni da far eseguire al computer per la risoluzione di un problema. Sono necessarie le tecnologie (strumenti per la realizzazione di programmi) e le metodologie (metodi che consentano di utilizzare efficacemente le tecnologie di programmazione).
Problemi e soluzioni
Problema: per risolvere un problema è necessario possedere informazioni, che devono essere elaborate per ottenere una soluzione.
Soluzione: procedura che genera un risultato partendo dai dati iniziali. La creazione e l’esecuzione di una soluzione sono generalmente distinte: l’essere umano è in grado di formulare la soluzione, il calcolatore è invece in grado di eseguirla.
Processo di risoluzione
- Il soggetto umano identifica una soluzione
- Il soggetto umano traduce la soluzione in termini comprensibili al calcolatore
- Il calcolatore interpreta e attua la soluzione
Processo di definizione del problema
- Eliminare dati superflui
- Individuare il risultato che si ricerca
- Considerare le regole da rispettare (principi), i vincoli (condizioni), i dati espliciti e impliciti
(I problemi possono essere risolti in tanti modi, ma se è posto un vincolo bisogna seguire un certo procedimento).
Descrizione della soluzione
La soluzione deve essere comprensibile dall’esecutore. Generalmente l’approccio che si segue è top-down:
- Si scompone il problema in sottoproblemi
- Si scompongono i sottoproblemi in sotto-sottoproblemi
- Si scompone fino a giungere a problemi elementari (primitivi), ovvero problemi risolvibili dall’esecutore con azioni elementari
Azioni elementari
Esse vanno svolte in successione, secondo un ordine definito. La loro interpretazione avviene in termini funzionali vi sono entità che trasformano gli input (dati che vengono ricevuti in ingresso) in output (risultati). Assumono un modello a scatola nera (black box).
Proprietà delle azioni elementari
- Finitezza: l’azione deve concludersi in un tempo finito
- Osservabilità: l’azione deve avere un effetto osservabile
- Riproducibilità: a partire dagli stessi input, l’azione deve produrre sempre lo stesso output
Esecutore
- Il linguaggio (sintassi) in grado di interpretare
- L’insieme delle azioni che sa compiere
- Le regole che associano a ogni istruzione le relative azioni da compiere (semantica)
Algoritmo
Descrive la soluzione di un problema, e quindi come calcolare un risultato partendo da dati in ingresso. È costituito da una sequenza infinita di istruzioni che devono essere comprensibili da un esecutore automatico. Permette di risolvere una classe di problemi omogenei. (esempio: istruzioni di montaggio di un mobile, uso di un terminale bancomat).
Proprietà degli algoritmi
- Correttezza: l’algoritmo non presenta nessun errore
- Efficienza: l’algoritmo utilizza la minima quantità di risorse (tempo di esecuzione, memoria) per giungere alla soluzione del problema
Programma
Algoritmo scritto in un linguaggio di programmazione, e quindi comprensibile al calcolatore. I programmi eseguibili da un calcolatore sono scritti in linguaggio macchina, linguaggio effettivamente compreso da un calcolatore che presenta istruzioni primitive. Il suo alfabeto è quello binario.
Fasi per la risoluzione di un problema
Modello ideale a cascata. Ideale perché non si giunge mai in maniera così liscia alla soluzione.
- Definire le esigenze di un problema e analizzarle, trovando una soluzione informale
- La soluzione va formalizzata come una sequenza determinata di passi, che porta allo sviluppo di un algoritmo.
- Esso verrà tradotto nel linguaggio di programmazione per ottenere il programma.
- Con il software effettueremo una traduzione automatica così da produrre un programma eseguibile, che venga mandato al calcolatore che effettuerà l’esecuzione giungendo così alla soluzione.
Introduzione ai computer e a Java
Compilazione e interpretazione
Quando si forniscono a un computer un programma e dei dati di input e si indica di eseguire le istruzioni si sta eseguendo un programma.
I linguaggi di programmazione ad alto livello (Java, Python) non sono comprensibili a un calcolatore, bensì la comprensione avviene solo tramite il linguaggio macchina; la traduzione viene affidata ad un altro programma, detto compilatore, e l’operazione è detta compilazione del programma.
Compilatore
È un programma che traduce un programma di alto livello in uno di basso livello (in linguaggio macchina). Una volta eseguita la compilazione, il programma di basso livello viene somministrato al computer, e si può eseguire il programma quante volte si vuole, senza doverlo ricompilare.
Il programma di input (prima della compilazione) è detto programma sorgente (source code), mentre il linguaggio macchina è detto programma oggetto.
Interprete
Alcuni linguaggi di alto livello non vengono tradotti da compilatori, bensì da altri tipi di programmi detti interpreti. La differenza con un compilatore è che l’interprete esegue la traduzione di ogni istruzione del programma nel linguaggio binario e immediatamente dopo essa viene eseguita. Nel processo di compilazione, invece, il programma viene prima tutto tradotto e poi tutto sottoposto all’esecuzione da parte del computer. Utilizzare un interprete è utile nella progettazione di software articolati, per capire subito se ci sono errori da sistemare interrompendo l’esecuzione del programma.
Approccio di Java
Uno svantaggio dei processi appena visti consiste nel fatto che occorre un compilatore/interprete differente per ogni tipo di computer. Invece Java presenta un compilatore che traduce il programma in un linguaggio intermedio detto bytecode; esso non è un linguaggio macchina, bensì è un linguaggio macchina di una macchina virtuale. Il programma bytecode viene poi interpretato dalla macchina virtuale Java (JVM), che si occupa della traduzione in linguaggio macchina del bytecode, giungendo così all’esecuzione delle istruzioni in linguaggio macchina. Ottengo poi la produzione dell’output. Il bytecode dona a Java il vantaggio della portabilità: dal bytecode è possibile eseguire il programma su ogni computer dotato di una macchina virtuale Java, senza dover ricompilarlo. Ecco perché Java è utile per lo sviluppo di applicazioni.
Come è fatto il programma Java
Un programma Java è solitamente sviluppato su più file: queste porzioni di programma su più file vengono dette classi. Le classi si combinano a sviluppare una visione globale; ognuna interagisce con le altre in maniera diversa, e può essere necessario dover modificare delle porzioni di programma. Il bytecode che viene riprodotto sarà solo quello modificato, senza che sia necessario riprodurre tutto. Per eseguire il programma, i bytecode delle diverse classi devono essere collegati: l’operazione di collegamento viene svolta dal loader.
Linguaggio Java
Il linguaggio Java adotta precise regole, che servono a indicare come scrivere le parti di un programma. Le regole costituiscono la grammatica del linguaggio.
Tipi di errori
- Errori di sintassi: errore grammaticale nel programma. Il compilatore si accorge dell’errore e indica la tipologia del problema. Non sempre il computer indica l’esatto errore.
- Errori run-time: errori a tempo d’esecuzione, ovvero che si verificano quando il programma è finito e viene mandato in esecuzione. A volte l’errore è indicato con esattezza, altre volte è di difficile comprensione.
- Errori logici: errori presenti nel ragionamento applicato nella soluzione del problema. Esempio: scrivo + invece che x. Il computer quindi esegue e non produce errori, ma alla fine dell’esecuzione vediamo che l’output non è quello desiderato.
Esempio di programma Java
- java.util.Scanner: carico dal package java.util la classe Scanner che ha le informazioni per interpretare i tasti della tastiera.
- public class: qui va inserito il nome che voglio dare a questa porzione di programma (e quindi alla classe). Vi sono regole da seguire per assegnare il nome: maiuscole come lettere iniziali e non vi deve essere uno spazio tra parole.
- public static void: definisco il programma principale, chiamato main. Viene aperta una parentesi graffa. All’interno delle graffe sono inseriti dei metodi (=porzioni di programma).
- System.out.println: sono istruzioni di stampa. Questo significa che sullo schermo verranno proiettati i contenuti riportati tra parentesi tonde. Il contenuto va sempre riportato tra virgolette, e viene chiamato stringa. println è il metodo e significa “stampa (print) e vai a capo (ln)”. System.out è un oggetto, ovvero rappresenta il monitor, mezzo tramite cui rappresentare le informazioni = viene detto che bisogna stampare sul video la scritta “Eseguo la somma di due numeri”. Quello che viene scritto è ciò che viene comunicato all’utente, dice di cosa si occuperà il programma. Il “;” rappresenta la fine dell’istruzione e quindi l’invio dell’output.
- int: n1, n2; indica che n1 e n2 sono variabili che contengono interi. Sono contenitori/variabili, in questo caso predisposti per contenere numeri interi (int).
- Scanner tastiera: abilita il programma a leggere i dati che l’utente inserisce tramite la tastiera. Viene scelto il nome tastiera perché è una variabile significativa, ovvero è una parola intuitiva che indica direttamente un oggetto ben preciso.
- n1=tastiera.nextInt: Il simbolo “=” significa “assegna”. Ciò che è a destra viene assegnato a ciò che è a sinistra dell’uguale. L’istruzione tastiera.nextInt significa che deve essere preso il prossimo valore che l’utente inserisce nella tastiera e deve essere considerato come numero intero. Il numero che verrà inserito deve essere inserito nel contenitore n1 (questo avviene grazie all’ “=”). Secondo la codifica ASCII i numeri n1 e n2 inseriti verranno percepiti tramite l’operazione nextInt: per noi però è una scatola nera, non sappiamo come questo avviene. Esempio: inserimento del numero n1=35. Il riconoscimento del numero 3 e 5 uniti a formare 35 è per noi una scatola nera.
- System.out.println(n1 + n2): vediamo che n1 + n2 non è tra virgolette, perché io non voglio che venga scritto “n1 + n2”, bensì io voglio che venga stampato il risultato. n1 e n2 vengono prelevati dalla memoria, viene svolta la somma, e infine viene restituito il risultato, poi proiettato nel video.
Riutilizzo del software
C’è una raccolta di classi che vengono rese disponibili: la Java Class Library (chiamata anche API o Java Application Programming). Le classi di questa collezione sono organizzate in package; la classe “Scanner”, ad esempio, è contenuta nel package java.util.
Creare un programma
- Creare un nuovo progetto (cartella che contiene i file del programma e informazioni per Eclipse): File New Project. Il nome deve avere la lettera maiuscola iniziale e non avere spazi.
- Creare un package (cartella che raccoglie i soli file del programma, si trova nel progetto): File New Package. Il nome del package inizia con lettera minuscola e non hanno spazi.
- Creare una classe (file del programma vero e proprio dove si scrive il codice, contenuta nel package) File New Class. Il nome inizia con la lettera maiuscola senza spazi.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Appunti di Programmazione Java
-
Appunti Java
-
Appunti di Programmazione ad oggetti - Java
-
Appunti Laboratorio Programmazione (JAVA) + Progetto