Algoritmi – Ing Daniele Corti FONDAMENTI DI PROGRAMMAZIONE Dato e informazione Definizione di “algoritmo” e procedure risolutive di semplici problemi. Rappresentazione di semplici algoritmi mediante diagrammi di flusso o pseudocodifica. Differenza tra linguaggio naturale e linguaggio di programmazione. L’algebra di Boole : funzioni di base (connettivi logici) AND, OR, NOT e tavole di verità. 1 Algoritmi – Ing Daniele Corti Informazione L’informazione è tutto ciò che possiede un significato per l’uomo, e che può essere utilizzato o comunicato immediatamente o conservato per usi futuri. NB Ottenere o possedere informazioni, infatti, consente di aumentare le nostre conoscenze su un fenomeno/attività da svolgere oppure consente di prendere opportune decisioni in riferimento ad una azione da svolgere. Il concetto stesso di informazione presuppone che vi sia un soggetto che trasmette l’informazione, l’emittente e uno che la riceve e la utilizza, il ricevente. Per trasmettere informazioni da un emittente a un ricevente serve un oggetto o supporto (mezzo di trasmissione) con il quale rappresentare l’informazione. Informazione Direzione da prendere Possibilità di attraversare la strada Fatto di cronaca Regola grammaticale inglese Determinazione di un’area Supporto Cartelli stradali Semaforo Pagina di un quotidiano Manuale d’inglese Formula matematica Affinché le informazioni, trasmesse dall’emittente, siano ricevute e comprese correttamente dal destinatario occorre che quest’ultimo sia in grado di interpretare il linguaggio dell’emittente. Esempio1 Quando si deve decidere la strada da prendere a un bivio occorre guardare i cartelli stradali che indicano i nomi delle varie città; il linguaggio in questo caso è unico ed è quello che indica i nomi delle città. 2 Algoritmi – Ing Daniele Corti Esempio2 Se un utente telefona ad un altro utente, il linguaggio usato dagli utenti è quello della lingua italiana. Ma, affinché la comunicazione possa avvenire attraverso il cavo telefonico, i suoni emessi dalla nostra voce devono essere convertiti dall’apparecchio telefonico in segnali elettrici e riconvertiti di nuovo in segnali acustici dall’apparecchio telefonico di destinazione. Allora, in questo caso l’informazione deve essere convertita in un codice di trasmissione compatibile con il mezzo di trasmissione (in questo esempio il cavo telefonico) che si è scelto per la trasmissione delle informazioni. Spesso, però, il linguaggio in cui è espressa l’informazione deve essere convertito in un codice di trasmissione compatibile con il mezzo che si è scelto per la trasmissione stessa. I messaggi (le informazioni che il trasmittente vuole trasmettere al destinatario) da trasmettere, costituiti da caratteri e simboli, devono essere convertiti dal trasmettitore in una serie di segnali, e in seguito devono essere riconvertiti dal ricevitore in messaggi affinché il destinatario possa comprenderli. Il mezzo di trasmissione è detto canale. Dati Per caratterizzare i fenomeni o per risolvere problemi del mondo reale possiamo produrre dei dati. I dati possono così essere memorizzati in un calcolatore per un trattamento futuro al fine di produrre l’informazione. L’informazione potrà in questo modo fornire una maggiore conoscenza della realtà, sulla quale si intendono attivare operazioni di controllo, modifica o direzione. 3 Algoritmi – Ing Daniele Corti Dal Dato all’Informazione Si evince, quindi, che esiste una differenza fra dato e informazione. Il dato è l’elemento grezzo, elementare che rappresenta un’entità o un fenomeno reale, mentre l’informazione è un insieme di dati elaborati al fine di fornire all’utente un certo grado di interesse. Il trattamento dei dati per ottenere le informazioni è indicato con il termine elaborazione. DATI INFORMAZIONI ELABORAZIONE Comunicazione Processo che consente lo scambio d’informazioni fra due entità (uomo o macchina) nel rispetto di regole comuni (protocolli). Linguaggi informatici Linguaggio umano linguaggio di programmazione linguaggio macchina Vedi il file linguaggi.pdf per dettagli. 4 Algoritmi – Ing Daniele Corti Risoluzione di un problema Per risolvere un problema in uno specifico ambito reale occorre seguire le seguenti procedure: Analizzare il problema: individuazione le caratteristiche fondamentali e gli elementi che entrano in gioco. Formalizzazione del problema: rappresentazione semplificata della realtà, che ne evidenzia solo gli aspetti più importanti per la risoluzione del problema. Si costruisce quindi un modello. Individuazione dei dati disponibili (input). Individuazione del processo risolutivo: dai dati d’ingresso devo applicare una certa procedura che consenta di ottenere dei risultati (output). Costruzione del processo risolutivo: stesura dell’algoritmo. Esecuzione dell’algoritmo. Comunicazione dei risultati. 5 Algoritmi – Ing Daniele Corti DEF. DI ALGORITMO L’algoritmo è la sequenza di passi, definiti con precisione e chiaramente comprensibili per l’esecutore, che portano alla realizzazione di un compito. È la sequenza ordinata e finita di operazioni, definite con precisione e chiaramente comprensibili per l’esecutore, che l’esecutore deve compiere per raggiungere il risultato richiesto da un problema. L’esecutore è una “macchina astratta” capace di eseguire le operazioni specificate dall’algoritmo. L’esecutore può essere, quindi, l’uomo o un computer. Il risolutore è colui che progetta il percorso di risoluzione di un problema e successivamente l’algoritmo. Il risolutore, nell’indicare la successione delle operazioni da eseguire, deve sapere quale sarà l’esecutore. 6 Algoritmi – Ing Daniele Corti Proprietà algoritmo: Ogni operazione deve essere eseguita dall’esecutore in un tempo finito. Ogni operazione non deve essere ambigua da parte dell’esecutore. Il numero totale di operazioni dell’algoritmo deve essere finito. NB Non tutti i problemi sono risolvibili. Esempi di algoritmi (risolutore = uomo) Le istruzioni di montaggio di un modellino. Le istruzioni di installazione di un software. La procedura per il calcolo del massimo comune divisore di un insieme di numeri interi. Una ricetta di cucina. VARIABILI Sono nomi simbolici usati negli algoritmi per denotare i dati. Possiamo immaginare di avere un contenitore nel calcolatore utilizzabile per salvarci un dato. Scrivendo l’operazione X3 significa che nel contenitore X salverò il valore intero 3. Operatore di assegnazione Consente l’assegnazione ad una variabile di un valore ottenuto dal risultato di una qualsiasi espressione. Esempio: YX*2 Assegno alla variabile Y il risultato dell’espressione X * 2. Se X vale 3 allora Y assumerà il valore 6. 7 Algoritmi – Ing Daniele Corti RAM La RAM, la memoria di lavoro, può essere immaginata come una sequenza di celle. Ogni cella può contenere un dato grande 1 Byte (8 bit). La cella è individuata da un indirizzo numerico. Ind. 0 1 n Cella …….. …….. Ad una cella possiamo dare un nome simbolico (Variabile); in questo modo, l’istruzione di assegnazione x 3 indica che nella memoria RAM esiste una cella a cui è stato attribuito il nome x e al cui interno viene salvato il valore numerico 3. STESURA DI UN ALGORITMO RIGA DI INTESTAZIONE: nome dell’algoritmo SEZIONE DICHIARATIVA: elenco dei dati (variabili in/out e costanti/variabili di lavoro) che utilizza l’algoritmo. SEZIONE ESECUTIVA: compresa fra le parole INIZIO e FINE ed elenca le operazioni/istruzioni (dichiarazione, immissione, assegnazione, controllo, scrittura) che l’esecutore deve compiere. ESEMPIO 1 Si scriva un algoritmo per cercare il numero di telefono di una persona noto il nome, il cognome e l’indirizzo usando l’elenco telefonico. Suggerimenti: Usare una scomposizione per passi. Considerare anche il caso in cui la persona non sia in elenco. 8 Algoritmi – Ing Daniele Corti Provare a descrivere diverse procedure di ricerca. ESEMPIO 2 Costruire un algoritmo per calcolare il prezzo di un prodotto sul quale è praticato uno sconto. DATI INPUT: il prezzo del prodotto (Prezzo), la percentuale di sconto (Percentuale). La percentuale di sconto può essere considerata una costante (es 20%). DATI OUTPUT: lo sconto (Sconto), e il prezzo scontato (PrezzoScontato). RISOLUZIONE: la formula per il calcolo dello sconto: Sconto = Prezzo * Percentuale /100 la formula per il calcolo del prezzo scontato: PrezzoScontato = Prezzo – Sconto nell’algoritmo si deve prevedere: L’acquisizione del prezzo del prodotto Il calcolo dello sconto Il calcolo del prezzo scontato La comunicazione del valore calcolato PSEUDOCODIFICA Algoritmo ProdottoScontato Dati costanti: dichiara Percentuale come numero intero di valore 20 Dati variabili: dichiara Prezzo, Sconto, PrezzoScontato come numeri reali Inizio: immetti Prezzo assegna a Sconto: Prezzo * Percentuale /100 assegna a PrezzoScontato: Prezzo – Sconto scrivi a video PrezzoScontato Fine. 9 Algoritmi – Ing Daniele Corti ESEMPIO 3 Problema Un automobilista si appresta ad attraversare un incrocio semaforico. Formalizzare il problema mettendo in evidenza i dati, le informazioni, le decisioni da intraprendere e quindi la procedura risolutiva del problema. Dati Colore del semaforo, limiti di velocità Informazione Attraversare l’incrocio/fermarsi allo stop Decisioni Se Verde posso attraversare l’incrocio rispettando i limiti di Velocità Se Giallo devo rallentare e fermarmi allo stop Se Rosso devo fermarmi allo stop Processo risolutivo Controllo il colore del semaforo Se è verde accelero ed attraverso l’incrocio rispettando i limiti di velocità. Se invece è giallo decelero e mi fermo allo stop. Se invece è rosso mi fermo allo stop. 10 Algoritmi – Ing Daniele Corti DIAGRAMMI DI FLUSSO - FLOWCHART I diagrammi a blocchi (detti anche diagrammi di flusso, flow chart in inglese) sono un linguaggio di modellazione grafico per rappresentare gli algoritmi. Blocchi elementari Blocco iniziale Blocco finale INIZIO FINE Blocco INPUT Blocco OUTUP OUTPUT DATO INPUT DATO Blocco di controllo Falso Frecce di connessione Vero Test binario Blocco Operazione Insieme di operazioni INSIEME DI OPERAZIONE OPERAZIONE Una combinazione di blocchi elementari descrive un algoritmo se: Viene usato un numero finito di blocchi. 11 Algoritmi – Ing Daniele Corti Lo schema inizia con un blocco iniziale e termina con un blocco finale. Ogni blocco soddisfa delle condizioni di validità. Condizioni di validità condizioni sui blocchi: o blocco azione e blocco lettura/scrittura: ogni blocco di questi due tipi ha una sola freccia entrante e una sola freccia uscente o blocco di controllo: ogni blocco di questo genere ha una sola freccia entrante e due frecce uscenti condizioni sulle frecce: o ogni freccia deve entrare in un blocco condizioni sui percorsi: o dal via deve essere possibile raggiungere ogni blocco o da ogni blocco deve essere possibile raggiungere il blocco finale GRAFO DI FLUSSO - approfondimento Dalla matematica, il grafo è un ente matematico costituito da due insiemi: un insieme di nodi (o vertici) e un insieme di archi (o rami). Nel campo informatico il flow chart lo possiamo rappresentare mediante un grafo (orientato) in cui: i nodi sono blocchi di istruzioni o le istruzioni condizionali gli archi rappresentano i possibili flussi di esecuzione Un grafo informatico contiene: un blocco iniziale un blocco finale un numero finito di blocchi di azione un numero finito di blocchi di controllo per il quale valgono le seguenti condizioni: 12 Algoritmi – Ing Daniele Corti 1. 2. 3. 4. 5. Ciascun blocco di AZIONE ha una freccia entrante ed una uscente (fig.1); Ciascun blocco di CONTROLLO ha una freccia entrante e due uscenti (fig.2); Ciascuna FRECCIA entra in un blocco oppure si inserisce in un’altra freccia (fig. 3a e 3b); Ciascun blocco è raggiungibile dal blocco INIZIALE; Il blocco FINALE è raggiungibile dal blocco iniziale Strutture di controllo All’interno di un algoritmo le istruzioni sono organizzate nei soli seguenti possibili modi: Sequenza Selezione (binaria) Iterazione. Sequenza istruzioneA istruzioneB …………. istruzioneN L’algoritmo è costituito da 1 o più istruzioni eseguite in sequenza una dopo l’altra. Equivalente, una sequenza di istruzioni può essere sostituita da un unico blocco, come indicato nella seguente figura: SottoProgramma Questa sostituzione è lecita se si pensa di scomporre il programma in sottoprogrammi e ogni sottoprogramma in un certo numero istruzioni; ogni sottoprogramma svolge una determinata 13 Algoritmi – Ing Daniele Corti operazione. Un sottoprogramma può anche essere costituito da una sola istruzione. Selezione binaria (o alternativa) Consente di fare la scelta tra due possibili alternative. ………………………. SE condizione ALLORA sottoprogramma1 ALTRIMENTI Sottoprogramma2 FINE SE ……………………….. Iterazione ………………. ESEGUI sottoprogramma1 RIPETI FINCHE’ condizione …………….. Viene eseguito il sottoprogramma1 finché non diventa vera la condizione. 14 Algoritmi – Ing Daniele Corti Esempio 1: l’esecutore è il calcolatore. Si vuole acquisire da tastiera due numeri (base e altezza di un rettangolo) e calcolarne l’area e successivamente comunicare all’utente (sul suo monitor) il risultato del calcolo: INIZIO INPUT BASE INPUT ALTEZZA AREA BASE * ALTEZZA OUTPUT AREA FINE 15 Algoritmi – Ing Daniele Corti Esempio 2: l’esecutore è l’essere umano. che molto semplicemente descrive la situazione in cui alla mattina suona la sveglia e bisogna capire se alzarsi dal letto oppure no. 16 Algoritmi – Ing Daniele Corti LINGUAGGI 1) LINGUAGGI ARTIFICIALI (DI PROGRAMMAZIONE) a) LINGUAGGI A BASSO LIVELLO b) LINGUAGGIO MACCHINA c) LINGUAGGIO ASSEMBLY 2) LINGUAGGI AD ALTO LIVELLO a) LINGUAGGI NATURALI LINGUAGGI NATURALI I linguaggi naturali sono i linguaggi che gli esseri umani apprendono spontaneamente da bambini quando imparano a parlare, di cui si servono nella vita quotidiana, che si tramandano da generazioni in generazioni, e che consentono di comunicare e capirsi e scambiarsi informazioni. LINGUAGGI DI PROGRAMMAZIONE I linguaggi di programmazione sono analoghi ai linguaggi naturali, con la differenza che vengono usati per comunicare con una macchina. I linguaggi di programmazione consentono di scrivere programmi, visti come sequenze di istruzioni/operazioni. Come i linguaggi naturali sono caratterizzati dalle seguenti componenti: Insieme di simboli (alfabeto) e di parole (dizionario) che possono essere usati per formare le frasi del linguaggio. Insieme di regole grammaticali (sintassi) per definire le frasi corrette composte dalle parole del linguaggio. Significato (semantica) delle frasi del linguaggio. Per utilizzare correttamente un linguaggio è necessario conoscerne la pragmatica (ad es: quali frasi è opportuno usare a seconda del contesto). 17 Algoritmi – Ing Daniele Corti I linguaggi di programmazione, a differenza dei linguaggi naturali, non devono essere ambigui e devono essere formalizzati (definiti in maniera non equivocabile). I linguaggi di programmazione sono strumenti per comunicare ad una macchina come risolvere un problema. Sono, quindi, strumenti per la comunicazione uomo-macchina. Permettono di esprimere e rappresentare i programmi: programmi = algoritmi + strutture dati comprensibili ed eseguibili da una macchina. LINGUAGGIO MACCHINA Il linguaggio macchina è il linguaggio immediatamente comprensibile da una macchina (calcolatore, elaboratore, sistema di elaborazione). Istruzioni e dati sono sequenze di numeri binari. Le istruzioni operano direttamente sull’hardware (registri, locazioni di memoria, unità fisiche di I/O del calcolatore). Sono specifici per un determinato processore o famiglia di processori. Assumono il modello computazionale di Von Neumann. LINGUAGGIO ASSEMBLY Non potendo il programmatore ricordarsi a quale sequenza binaria corrisponde una determinata operazione può utilizzare il linguaggio assembly che è la forma simbolica del linguaggio macchina. In questo linguaggio si usano nomi simbolici (esempio: ADD A, LOAD A, ecc) al posto dei codici binari (sequenze di zeri e uni) per le operazioni e le locazioni di memoria delle macchine. LINGUAGGIO AD ALTO LIVELLO Il linguaggio ad alto livello permette di scrivere programmi con un linguaggio più vicino a quello naturale. Sono definiti astraendo rispetto alla macchina fisica. 18 Algoritmi – Ing Daniele Corti Realizzano una macchina virtuale sovrastante alla macchina fisica e visibile al programmatore. Richiedono di essere implementati su un particolare sistema di calcolo tramite strumenti opportuni (compilatori o interpreti). LIVELLI DI RAPPRESENTAZIONE E MACCHINE ASTRATTE ESEMPIO Calcolo della somma S di due numeri A e B Linguaggio macchina Linguaggio Assembly 00000010101111001010 LOAD A (A UN DATO IN) 00000010111111001000 ADD B (A A + B) Linguaggio ad alto livello S = A + B Linguaggio naturale Alla variabile S assegno la somma della variabile A e della variabile B Es: Pascal, C, C++, C#, Visual Basic, Java 19 Algoritmi – Ing Daniele Corti ALGEBRA BOOLEANA L’algebra booleana deve il suo nome a Boole che ne formalizzò le regole. L’algebra di Boole opera solo su variabili, cioè che possono assumere solo due valori (0,1). Tali variabili vengono dette logiche o booleane; i valori che possono assumere sono solo due: o (1, 0) o (Vero, Falso) o (On, Off) o (Close, Open) Le variabili si possono indicare con le lettere A, B, C, X, Y, W, Z. Il valore 1 è solitamente associato alla condizione logica Vero, mentre lo 0 è associato alla condizione logica Falso. L’algebra booleana è adatta per rappresentare “eventi binari”, cioè condizioni che possono assumere solo due valori. Esempio: una lampadina può essere accesa (a questa condizione si 20 Algoritmi – Ing Daniele Corti associa il valore 1 o Vero) oppure spenta (valore 0 o Falso). Le operazioni di base nell’algebra booleana sono: o AND ( • ) o OR (+) o NOT ( ¯ ) Possiamo definire questi operatori tramite le tabella di verità. Tramite questa algebra si possono comporre espressioni logiche che possono essere Vere o False. Esempio: (x AND y) OR z. PROPOSIZIONI DICHIARATIVE PROPOSIZIONE = SOGGETTO + VERBO PROPOSIZIONE DICHIARATIVA È una proposizione nei confronti della quale è possibile stabilire se è vera o se è falsa. Vero e Falso sono gli unici valori che può assumere una proposizione dichiarativa. La proposizione che non può sussistere in altre proposizioni, si dice elementare. 21 Algoritmi – Ing Daniele Corti Il valore di una proposizione dichiarativa (Vero o Falso) può essere espresso in vari modi, a seconda del contesto. Generalmente, si attribuisce alla cifra numerica uno il significato di Vero, mentre a zero si attribuisce il valore Falso. La variabile che può assumere solo il valore risultante da una proposizione dichiarativa, è una variabile logica. Un'espressione logica è quella che produce un risultato Vero o Falso. L'espressione logica può essere costituita da proposizioni dichiarative, da valori costanti (espressi secondo la forma prevista per rappresentare Vero o Falso) e da variabili logiche. Per connettere o comunque per intervenire nei valori delle varie componenti dell'espressione, si utilizzano degli operatori. CONNETTIVI LOGICI Si distinguono generalmente gli operatori logici in «unari» e in «connettivi logici», per distinguere se intervengono in un solo valore logico, oppure su due o più valori logici. Gli operatori logici si possono vedere come delle scatoline, che hanno uno o più ingressi, con una sola uscita. Gli operatori logici unari ottengono in ingresso un solo valore logico; sono disponibili l'invertitore logico (NOT) e il noninvertitore logico. L'invertitore logico è l'operatore unario che inverte il valore logico ricevuto in ingresso: se in ingresso riceve il valore Vero (1), in uscita genera il valore Falso (0); se in ingresso riceve il valore Falso (0), in uscita genera il valore Vero (1). A titolo di esempio, se la variabile logica «A» contiene il risultato della proposizione dichiarativa «Antonio mangia», l'espressione 22 Algoritmi – Ing Daniele Corti logica «NOT A» è equivalente alla proposizione dichiarativa «Antonio non mangia». I connettivi logici sono gli operatori che utilizzano due ingressi. Il connettivo AND restituisce il valore Vero solo se entrambi i valori in ingresso sono pari a Vero. Per esempio, se la variabile logica «A» contiene il risultato della proposizione dichiarativa «Antonio mangia» e la variabile «B» contiene il risultato di «Piero legge», l'espressione «A AND B» equivale alla proposizione «Antonio mangia e Piero legge». Il connettivo OR restituisce il valore Vero se almeno uno dei due ingressi dispone di un valore pari a Vero. Per esempio, se la variabile logica «A» contiene il risultato della proposizione dichiarativa «Antonio mangia» e la variabile «B» contiene il risultato di «Piero legge», l'espressione «A OR B» equivale alla proposizione «Antonio mangia e/o Piero legge». Tabella: Tavola di verità dei connettivi and, or e not X Y not X not Y X and Y X or Y not(X or Y) (not X) and (not Y) 0 0 1 1 0 0 1 1 0 1 1 0 0 1 0 0 1 0 0 1 0 1 0 0 1 1 0 0 1 1 0 0 23 Algoritmi – Ing Daniele Corti CONNETTIVO LOGICO AND Se “il NomeUtente è corretto” e “la Password è corretta” allora “puoi accedere al sistema”. Proposizione1 Proposizione2 Espressione NomeUtente Password è è corretto corretta …… puoi accedere al sistema FALSO FALSO FALSO FALSO VERO FALSO 24 Algoritmi – Ing Daniele Corti VERO FALSO FALSO VERO VERO VERO Se quindi indico con A la variabile logica associata alla proposizione dichiarativa “il nome Utente è corretto” (e A può assumere solo lo stato VERO o FALSO) e con B indico la variabile logica associata alla proposizione dichiarativa “la Password è corretta” allora l’espressione Y = A and B equivale alla proposizione “Il nome Utente è corretto e la Password è corretta”. Y = A and B A B Y 25 Algoritmi – Ing Daniele Corti 0 0 0 0 1 0 1 0 0 1 1 1 26 Algoritmi – Ing Daniele Corti CONNETTIVO LOGICO OR Se “supero l’esame di Fisica” oppure “supero l’esame di Elettrotecnica” allora “posso accedere all’esame di Elettronica” Fisica Elettrotecnica Espressione FALSO FALSO FALSO FALSO VERO VERO VERO FALSO VERO VERO VERO VERO 27 Algoritmi – Ing Daniele Corti Y = A or B A B Y 0 0 0 0 1 1 1 0 1 1 1 1 CONNETTIVO LOGICO NOT il monitor è funzionante Espressione1 Negazione(Espressione1) monitor funzionante monitor non funzionante 28 Algoritmi – Ing Daniele Corti VERO FALSO FALSO VERO Y = not A ES: SE A=0 ALLORA Y=1 SE A=1 ALLORA Y=0 29 Algoritmi – Ing Daniele Corti Esempio (da completare): un alunno supera l’anno se si verifica almeno una delle seguenti condizioni: Supera sia il primo quadrimestre sia il secondo quadrimestre. Non supera il primo quadrimestre, ma supera sia la prova comune sia il secondo quadrimestre. Assegniamo ad ogni evento una variabile booleana: x primo quadrimestre y prova comune z secondo quadrimestre Con tre variabili ci sono 23 = 8 possibili combinazioni. La tabella della verità della funzione booleana “superamento dell’anno” S(x, y, z) = (x AND z) OR (NOT x AND y AND z) sarà: x y Z 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 0 1 1 1 S 30 Algoritmi – Ing Daniele Corti 31