Eccomi qui in questo nuovo articolo, dove andremo avanti con la guida alla programmazione Java.
Prima di leggere quanto segue ti consiglio di leggere gli articoli precedenti che li troverai nelle categorie segnate sopra la pagina.
Il rettangolo in verde evidenzia queste categorie.
Bene, ora possiamo procedere.
Nello scorso articolo sul Java avevamo visto tre tipi nuovi di operatori. O meglio, ne abbiamo visti 2, perché il terzo lo affronteremo più avanti. Questi di cui stiamo parlando sono gli operatori unari, binari e ternari.
Avevo anche annunciato che avremmo fatto gli algoritmi. Ed eccomi qui per presentarveli 🙂
Questo argomento non è valido soltanto per il Java, ma è valido per tutti i tipi di linguaggi di programmazione e quindi potrete definire un qualcosa in più, che non riguarda specificatamente la programmazione in Java, ma che può dare un’aiuto molto importante nella realizzazione di programmi.
Questo argomento, inoltre, ti aiuterà a capire molti aspetti della programmazione e ti fornisce un perché per molti aspetti sintattici che hai imparato di recente e che molti imparerai in futuro.
Detto questo partiamo con la definizione di Algoritmo, così potrai capire di cosa stiamo parlando.
Un algoritmo è composto da una sequenza ordinata di istruzioni e che deve avere un’inizio e una fine.
Un algoritmo deve essere composto da istruzioni facili da comprendere e non ambigue.
Detta così potrà sembrare una definizione da nulla, ma ora andiamo a vedere nel dettaglio questa definizione e ti farò vedere che è molto più composita di quello che sembra e soprattutto è molto importante.
Un algoritmo possiamo definirlo come uno schema mentale che si utilizza per riuscire a risolvere nel miglior modo possibile un problema, anzi una vasta gamma di problemi.
Mi spiego meglio.
Quando si va a realizzare un programma, fondamentalmente lo si fa per risolvere un determinato problema. Sicuramente un programmatore non va a realizzare un software (che sia un’applicazione per smartphone o un programma per pc) per sfizio, ma lo fa perché o deve risolvere un proprio problema oppure un cliente gli ha chiesto di realizzare un programma che facesse determinate azioni, che fondamentalmente il concetto si ricollega al fatto che si necessita la risoluzione di un problema.
Quando dicevo che non si risolve un solo problema, ma una classe di problemi, vuol dire che quando si realizza un programma si fa in modo di risolvere tutti i tipi di problemi legati al problema principale.
Faccio un esempio sciocco: se dovessi realizzare un programma che mi calcoli l’area di un triangolo, non creo un programma che mi calcoli l’area di quel triangolo, ma che mi calcoli l’area di tutti i triangoli esistenti.
Stessa cosa una calcolatrice. Una calcolatrice non calcola una sola operazione, ma tutti i tipi di operazioni.
Quindi ora sai cosa vuol dire risolvere una classe di problemi.
Un algoritmo è uno schema logico che si impiega prima della scrittura del codice del programma per risolvere il problema in meno tempo possibile, usando meno righe di codice possibile, meno variabili possibili. In poche parole per risolvere il problema nel miglior modo possibile.
Perché è importante tutto questo?
Tutto questo è importante per un discorso di ottimizzazione del programma. Non so se hai mai sentito parlare di questo.
Se non hai sentito nulla riguardante questo concetto, non preoccuparti, te lo spiegherò qui sotto.
Ci sono programmi che sono più veloci rispetto ad altri, che sono più efficienti rispetto ad altri. Questo dipende da moltissimi fattori; dipende dalla complessità del programma stesso, dipende dalle funzionalità del software, ma dipende anche dal livello di ottimizzazione.
Più un programma ha meno variabili, meno righe di codice (quindi meno istruzioni da far fare ad un computer -> una riga di codice solitamente è un’istruzione. Ad esempio la riga del metodo di stampa, si dice al computer di stampare a video una certa cosa), più questo programma sarà veloce, reattivo ed efficiente.
Se invece non è ottimizzato bene, il programma tenderà a diventare molto lento e poco reattivo.
Un algoritmo serve anche per risparmiare tempo. Al posto di fare magliaia di prove con il codice con l’eventualità di dover riscrivere tutto il software del programma è possibile fare questo schema logico per evitare questo e quindi limitare anche il tempo di produzione di un programma. Certo per programmi piccoli e semplici come quelli che stiamo facendo ora non serve, ma per programmi complessi invece si, può risultare davvero utilissimo.
Ora che sai queste cose, direi di andare ad analizzare la definizione generale di un algoritmo.
Il primo punto della definizione è che un algoritmo è formato da una sequenza ordinata di istruzioni.
Un algoritmo è uno schema logico per aiutare nella risoluzione di una classe di problemi e quindi di conseguenza serve come aiuto per la creazione del programma.
Essendo uno schema logico, deve avere un certo ordine nelle sue istruzioni. Quest’ordine si rispecchia appieno nella scrittura del codice.
Hai mai notato che quando scrivi un programma segui un determinato ordine? Ad esempio quando devi stampare il valore di 2 variabili, prima dichiari e inizializzi le variabili e poi successivamente le stampi. Non fai il contrario. Ma vediamo perché non puoi fare il contrario.
Proviamo a farlo:
[java]
System.out.printlnv1 + "-" + v2);
int v1 = 0, v2 = 0;
[/java]
Prova innanzi tutto a scriverlo su Eclips.
Potrai notare che anche se hai inizializzato le variabili dopo averle stampate, comunque il compilatore ti darà errore nel metodo di stampa perché non riesce a riconoscere queste due variabili, non sa neppure che esistono.
Questo è causato da una delle tre forme principali della programmazione, che è la sequenziale.
Questa prima forma prevede che tutte le istruzioni siano scritte in un ordine logico. Questo si collega a un punto più avanti della definizione di un algoritmo, ovvero che tutte le istruzioni non devono essere ambigue.
Il computer è una macchina pseudo stupida. Riesce a fare calcoli mostruosi che noi umani ci potremo sognare di fare, perché il nostro cervello non è abbastanza veloce e “potente” per farli.
E per questo è intelligente.
Ma il problema è che non sa cosa deve fare. Anche se inizializzi una variabile dopo che venga stampata, in computer non capisce, non riesce a capire che la variabile da stampare sia dopo. Proprio non ci arriva. E l’esempio che ho scritto sopra è una forma molto grave di ambiguità, perché il computer non ci capisce nulla e quindi il compilatore ci blocca avvertendoci che il computer non capirebbe nulla di quello che deve fare.
Quindi per essere il meno ambigui possibile è necessario scrivere le cose in un certo ordine logico. Quindi in questo caso prima si scrivono le variabili e poi successivamente le si stampano.
L’ultima cosa che non ho accennato della definizione di algoritmo è il fatto che deve avere un inizio e una fine.
Per un computer non esiste l’infinito, non è rappresentabile, non lo accetta. Per un qualsiasi tipo di computer un qualsiasi dato o operazione deve avere per forza di cosa un inizio e una fine.
Questo perché un computer ha una limitazione di calcolo fisica. Ha una memoria RAM finita, ovvero che è capiente un tot di GB e non di più. ha un processore finito, ovvero che ha un certo livello di potenza di calcolo e non oltre. Ha un HDD (Hard Disk -> memoria che si utilizza per salvare le proprie immagini, video, sistema operativo ecc…) finito, ovvero che ha un tot di capienza e oltre non può memorizzare.
Essendoci queste limitazioni è normale che non ci possa essere l’infinito, perché non potrebbe essere ne calcolato, ne gestito, ne memorizzato dal computer che ha elementi fisici finiti.
L’inizio e la fine di un programma si rappresenta con il linguaggio di programmazione con le graffe.
{ questo è l’inizio.
} questo è la fine.
In tutti i metodi c’è un inizio e una fine e anche nella classe c’è un inizio e una fine.
Detto questo vediamo la sintassi di un algoritmo.
Qui ho scritto un algoritmo di esempio.
Vediamo insieme la sintassi, che ora è molto semplice perché è uno schema per la realizzazione di un programma molto banale.
Innanzi tutto ci sono le due ellissi, una in cui c’è scritto START e nell’altra END.
Queste due ellissi sono obbligatorie in quanto rappresentano l’inizio e la fine di un programma
Poi ci sono i 2 parallelogrammi, che servono per contenere delle variabili. È possibile all’interno di esse scrivere delle variabili, inizializzarle o fare addirittura dei calcoli, com’è possibile fare tra l’altro anche nel codice Java:
[java]
int v1 = 2, int v2 = 3;
int v3 = v1 + v2;
[/java]
Questo è semplicemente un esempio.
Il rettangolo non solo serve per fare delle operazioni, ma serve per stampare, per fare operazioni complesse, eseguire delle parti di programma, creare delle funzionalità ecc…
Come vedrai più avanti, è una forma geometrica in grado di fare tantissime cose.
Prima di chiudere l’articolo ti do un’ottimo consiglio per creare al meglio un algoritmo.
Per crearlo come si deve è necessario usare un programma decente e non come ho fatto io per l’algoritmo qui sopra che ho usato il Libreoffice (infatti puoi notare benissimo che è allineato da schifo).
Puoi usare un programma gratuito e libero di nome Dia, scaricabile dai repository della tua distribuzione con il terminale o con il software center o da questo indirizzo.
Un consiglio che ti posso dare per la creazione di un algoritmo è di colorare le varie figure geometriche. Questo ti aiuterà a non confonderti quando andrai a realizzare algoritmi veramente molto complessi.
Detto questo io posso chiudere l’articolo e noi ci rivediamo al prossimo 🙂