Algoritmo algoritmo: un insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce un risultato e si arresta in un tempo finito in termini informali: un algoritmo è una sequenza ordinata di operazioni che risolve un problema specifico
Proprietà un algoritmo deve essere: non ambiguo (i risultati non devono variare in funzione della macchina o persona che esegue l'algoritmo) corretto (deve risolvere un dato problema) realizzabile (deve essere eseguibile con le risorse a disposizione) finito (deve essere composto da un numero finito di passi elementari; le operazioni sono eseguite un numero finito di volte) efficiente (deve avere un costo accettabile, se non ottimo, in termini di risorse consumate: tempo di CPU richiesto per completare, quantità di memoria utilizzata, quantità di bit trasferiti)
Efficienza efficienza è il termine usato per descrivere l’uso attento delle risorse da parte di un algoritmo come si misurano il tempo e lo spazio consumati da un algoritmo, in modo da determinare se è efficiente? efficienza rispetto allo spazio: si può giudicare in base alla quantità di informazioni che l’algoritmo deve registrare nella memoria del computer per svolgere il proprio compito, oltre ai dati iniziali sui quali opera efficienza rispetto al tempo: è un’indicazione della quantità di “lavoro” richiesto dall’algoritmo stesso; è una misura dell’efficienza implicita del metodo, indipendente dalla velocità della macchina su cui è eseguito, dai valori dei dati di ingresso elaborati ma non dalla loro quantità
Complessità descrive l'efficienza dell'algoritmo numero di operazioni svolte dall'algoritmo relativamente alla misura dell'informazione su cui opera l'algoritmo esempio: per mettere in ordine una lista di N numeri interi un algoritmo può eseguire N*N operazioni oppure logN operazioni complessità tipiche degli algoritmi, in ordine crescente: logN, N, NlogN, N2, 2N
Descrizione di un algoritmo un algoritmo è descritto in un linguaggio il linguaggio di descrizione di un algoritmo deve essere adeguato alle caratteristiche del suo esecutore esecutore umano: linguaggio naturale linguaggio grafico (ad esempio i diagrammi di flusso) esecutore automatico (computer): linguaggio di programmazione
Esecuzione l'esecuzione delle azioni nell'ordine specificato dall'algoritmo consente di ottenere, a partire dai dati di ingresso, i risultati che risolvono il problema ESECUTORE una macchina astratta capace di eseguire le azioni specificate dallo algoritmo.
Esempio: la preparazione del caffè Esecutore: essere umano corredato di caffettiera "moka", cucina a gas e macina-caffè; Algoritmo: svitare la caffettiera; se si dispone di caffè macinato: riempire il filtro con il caffè macinato e andare al punto 3 altrimenti se si dispone di caffè in chicchi: macinarlo e tornare al punto 2 altrimenti terminare (il caffè non si può fare..) riempire la parte inferiore della caffettiera con acqua inserire il filtro nella macchina avvitare la caffettiera accendere il fuoco a gas collocare la moka sul fuoco attendere l'uscita del caffè spegnere il fuoco terminare (il caffè è pronto)
Esempio: assicurazione auto scrivere un algoritmo per decidere se l'assicurazione della macchina è scaduta anno corrente < anno scadenza polizza? non è scaduta, fine anno corrente > anno scadenza polizza? è scaduta, fine mese corrente < mese scadenza polizza? non è scaduta, fine mese corrente > mese scadenza polizza? è scaduta, fine giorno corrente < giorno scadenza polizza? non è scaduta, fine giorno corrente > giorno scadenza polizza? è scaduta, fine non è scaduta ma lo sarà tra 24 ore
Il concetto di variabile per eseguire una qualsiasi algoritmo, abbiamo bisogno di poter immagazzinare i risultati temporanei e finali dell'algoritmo concettualmente, le variabili possono essere viste come delle scatole con: un'etichetta che ci permette di identificarne il contenuto dei pezzi di carta al loro interno su cui si possono annotare/modificare i valori di un calcolo che si sta facendo
Variabili una variabile rappresenta una zona di memoria RAM che può essere usata per memorizzare un valore analogia con una scatola di scarpe etichettata in uno scaffale (che rappresenta la RAM): la scatola ha un'etichetta con un nome una posizione nello scaffale un valore (le scarpe che si trovano dentro la scatola) [un tipo (forma della scatola)]* (* vedremo più avanti cos'è e a che serve il tipo di una variabile)
Variabili nella pratica: ogni variabile ha un nome mnemonico, che si usa nel programma per riferirsi alla variabile stessa. ogni variabile contiene un valore che può essere letto e modificato a piacimento durante l’esecuzione di un programma, il sistema operativo mantiene una associazione tra il nome di ogni variabile e l’indirizzo della cella di memoria in cui è memorizzato il suo valore in definitiva una variabile è semplicemente un'astrazione della cella di memoria fisica
Variabili A = Valore oppure A ← Valore significa che il valore specificato a destra dell'uguale viene memorizzato nella zona di memoria RAM etichettata con l'etichetta "A": attenzione: non si tratta di un'equivalenza matematica!!! Valore A
Variabili B = A oppure B ← A significa che un certo valore, precedentemente memorizzato nella zona di memoria etichettata con "A", viene copiato nella zona di memoria etichettata con "B": Valore A B
A A Esempio: incremento Valore + 1 A = A + 1 oppure A ← A + 1 (N.B.: matematicamente ciò non ha alcun senso!) in informatica significa "prima calcoliamo A+1 e poi memorizziamo il risultato del calcolo in A" stiamo quindi considerano il valore di A in due istanti diversi: prima per leggerne il valore e incrementarlo e dopo per memorizzare il suo nuovo valore Valore + 1 A A
Diagrammi di flusso un diagramma di flusso (flow chart) è la definizione grafica delle operazioni che costituiscono un algoritmo è uno strumento efficace per la descrizione degli algoritmi i diagrammi di flusso usano forme geometriche diverse per rappresentare: trasferimento di informazioni (lettura dati, scrittura risultati, visualizzazione dati intermedi) esecuzione di calcoli assunzione di decisioni esecuzione di iterazioni (ripetizione di sequenze di operazioni)
Diagrammi di flusso v E elaborazione – i blocchi rettangolari rappresentano istruzioni di assegnazione di valori o una modifica dello stato globale della computazione input/output - i blocchi a forma di parallelogramma corrispondono a operazioni di input/output dei dati (lettura da tastiera, visualizzazione su video) decisione – i blocchi a forma di rombo vengono utilizzati per rappresentare istruzioni di salto condizionato inizio/fine – i blocchi ovali vengono utilizzati per rappresentare l’inizio e la fine dell’algoritmo operation yes no condition start stop
Calcolo dell’area di un rettangolo leggi da input l’altezza (H) leggi da input la base (B) calcola l’area H*B dai in output il risultato
Calcola l’area di un rettangolo START Leggi Altezza Leggi Base Area = Base*Altezza Stampa Area STOP
Conversione lire in Euro leggi da input l'importo in lire (antica moneta usata in Italia fino al secolo XX) calcola il corrispettivo in Euro dai in output il risultato
Conversione lire in Euro START Leggi Lire Euro = Lire/1936,27 Stampa Euro STOP
IF-THEN-ELSE selezione tra due istruzioni sulla base di una condizione
Massimo tra due numeri leggi X leggi Y se X > Y altrimenti stampa X stampa Y
Massimo tra due numeri
Pari o dispari leggi N dividi N per 2 se resto = 0 altrimenti scrivi “N è pari” altrimenti scrivi “N è dispari”
Pari o dispari
WHILE-DO I O
ESEMPIO CALCOLO DEL FATTORIALE N!=N*(N-1)*(N-2)*…*2 no N>1? yes START CALCOLO DEL FATTORIALE N!=N*(N-1)*(N-2)*…*2 Leggi N F = N no N>1? yes N=N-1 Stampa F F=F*N STOP
DO-WHILE I O
ESEMPIO CALCOLO DEL FATTORIALE N!=N*(N-1)*(N-2)*…*2 yes no N>1? START CALCOLO DEL FATTORIALE N!=N*(N-1)*(N-2)*…*2 Leggi N F = N N=N-1 F=F*N yes no Stampa F N>1? STOP
Scambio dei valori di due variabili Leggi valore prima variabile X Leggi valore seconda variabile Y Conserva X in una variabile temporanea Aux Assegna il valore di Y ad X Assegna il valore di Aux a Y Scrivi X Scrivi Y
Scambio dei valori di due variabili
Esercizi dati 2 numeri in input trovare e stampare in output il max dati 3 numeri in input stamparli in ordine crescente dati 2 numeri in input stampare in output la somma sul prezzo di un prodotto viene praticato lo sconto del 3% se costa meno di 1.000.000 e del 5% se costa di più; dato in input il prezzo P, calcolare il prezzo da pagare secondo la regola sopra descritta sul prezzo di un biglietto di un treno viene applicato un supplemento del 7% se il treno è di tipo "a", del 12% se è di tipo "b" e del 18% se è di tipo "c"; per gli altri treni non c'è supplemento; calcolare il prezzo totale del biglietto, a seconda del tipo di treno e comunicare il tipo di treno con il prezzo calcolato
Esercizi dati in input i min, ore e sec stampare in output il totale dei secondi data in input una data verificare se è giusta dato in input 100 valori stampare in output la somma dei numeri positivi e la somma dei negativi dato in input una parola stampare in output se è una palindrome o no dato in input una parola stampare in output il numero delle vocali
Programma ogni computer è una macchina in grado di eseguire azioni elementari su dati l'esecuzione delle azioni elementari viene attivata tramite sequenze di istruzioni le istruzioni sono espresse attraverso frasi di un opportuno linguaggio di programmazione un programma non è altro che la formula-zione testuale di un algoritmo in un linguaggio di programmazione
Algoritmo e programma un programma è la formulazione, in un certo linguaggio di programmazione, di un algoritmo che risolve un dato problema
Algoritmi vs. programmi calcolo del fattoriale: esiste un solo algoritmo per calcolare il fattoriale esistono teoricamente infinite implementazioni (e quindi programmi) per il calcolo del fattoriale, una per ogni linguaggio di programmazione esistente e quindi: per ogni programma esiste un solo algoritmo per ogni algoritmo esistono infiniti programmi
Linguaggi di programmazione I linguaggi di programmazione ad alto livello permettono di scrivere programmi con una notazione adatta agli esseri umani, e in alcuni casi molto intuitiva. Usando degli opportuni traduttori (compilatori ed interpreti) lo stesso programma può essere usato su macchine diverse Fortran, Cobol, Pascal, Ada, C, C++, Java, Lisp, ML, Prolog,...
Il compilatore un programma scritto in un linguaggio ad alto livello è detto programma sorgente. per essere eseguito su un computer, va tradotto nel linguaggio macchina del computer (il linguaggio del processore) il compilatore è un programma che esegue la traduzione, producendo il programma oggetto, ossia una sequenza di istruzioni in linguaggio macchina il compilatore segnala anche eventuali errori di sintassi nella scrittura del programma sorgente
Il compilatore programma P scritto nel linguaggio L compilatore per P sul computer M programma P’ nel linguaggio macchina di M esecuzione di P’ su M
L'interprete in alternativa alla compilazione, un programma sorgente può essere interpretato. un interprete è un programma che non produce alcun programma oggetto, ma legge il ogni istruzione del programma sorgente e genera le istruzioni macchina corrispondenti, che vengono passate all’hardware per l'esecuzione.
Compilatori Vs. Interpreti programma compilato vantaggi: la traduzione avviene una sola volta, e poi il programma oggetto può essere eseguito quanto si vuole svantaggi: la compilazione richiede un certo tempo di esecuzione programma interpretato vantaggi: il programma può essere eseguito subito senza dover attendere la fine della compilazione svantaggi: la traduzione avviene mentre si esegue il programma con conseguenze rallentamento dell'esecuzione alcuni linguaggi permettono entrambe le scelte attualmente, i computer sono così potenti che anche la compilazione di lunghi programmi non richiede molto tempo