Dr. Francesco Fabozzi Corso di Informatica

Slides:



Advertisements
Presentazioni simili
Gli algoritmi L’elaboratore come macchina universale
Advertisements

1 Pregnana Milanese Assessorato alle Risorse Economiche Bilancio Preventivo P R O P O S T A.
Linguaggi algoritmici
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Algoritmi e Programmazione
Informatica Generale Marzia Buscemi
Frontespizio Economia Monetaria Anno Accademico
Sommario Gli algoritmi I linguaggi per la formalizzazione di algoritmi
1 Istruzioni, algoritmi, linguaggi. 2 Algoritmo per il calcolo delle radici reali di unequazione di 2 o grado Data lequazione ax 2 +bx+c=0, quali sono.
Reaching Definitions. Tino CortesiTecniche di Analisi di Programmi 2 Reaching definitions Dato un punto del programma, quali sono i comandi di assegnamento.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie di analisi.
Informatica Problema Algoritmo Programma
Informatica di base A.A. 2003/2004 Algoritmi e programmi
Algoritmo di Ford-Fulkerson
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Algoritmi e Strutture Dati Capitolo 2 Modelli di calcolo e metodologie.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Problemi e algoritmi Anno Accademico 2009/2010.
Realizzazione e caratterizzazione di una semplice rete neurale per la separazione di due campioni di eventi Vincenzo Izzo.
Programmazione Un programma descrive al computer, in estremo dettaglio, la sequenza di passi necessari a svolgere un particolare compito L’attività di.
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
Introduzione alla programmazione ll
Introduzione alla programmazione lll
DAL PROBLEMA ALL'ALGORITMO Problemi e Programmi Paolo Amico
ALGORITMI E PROGRAMMAZIONE STRUTTURATA
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
Istruzioni di selezione in Java Programmazione Corso di laurea in Informatica.
Unità Didattica 1 Algoritmi
Unità Didattica 2 I Linguaggi di Programmazione
Strutture di controllo in C -- Flow Chart --
CAPITOLO 7.
Fondamenti di Informatica Algoritmi
Algoritmi e Programmazione (in C) Stefano Cagnoni e Monica Mordonini
Gli algoritmi.
Analisi e programmazione
Contatore: esempio di circuito sequenziale
Biologia Computazionale - Algoritmi
ELEMENTI DI PROGRAMMAZIONE
1 Negozi Nuove idee realizzate per. 2 Negozi 3 4.
Elementi di Informatica di base
Algoritmi e Programmazione strutturata
INFORMATICA MATTEO CRISTANI.
CODIFICA Da flow-chart a C++.
TURBOPASCAL …. ripassiamo - prof. V. Riboldi -.
PROBLEMA ALGORITMO PROGRAMMA LINGUAGGI di PROGRAMMAZIONE
Programmazione di Calcolatori
Programmazione di Calcolatori
BIOINFO3 - Lezione 15 ISTRUZIONI
ECDL Patente europea del computer
Programmazione Strutturata
TURBOPASCAL …. ripassiamo - prof. V. Riboldi -.
TRASFORMATA DI FOURIER
Linguaggi algoritmici
A.P. cat. B - 1 Per chi vuole: Libro di testo D.P. Curtis, K. Foley, K. Sen, C. Morin Informatica di base 2° edizione Mc Graw-Hill Companies.
Dal problema all’ algoritmo
Tecnologie Informatiche ed Elettroniche per le Produzioni Animali
13 ottobre Decisioni F. Bombi 13 ottobre 2002.
Algoritmi.
Realizzazione software
Algoritmi e Programmazione (in C) Stefano Cagnoni e Monica Mordonini
Diagrammi a blocchi.
Informatica e Informatica di Base
Problemi, algoritmi e programmazione
ALGORITMI Dal problema al programma Definizione di algoritmo
Strutture di controllo
Informatica Problemi e algoritmi. una situazione che pone delle domande cui si devono dare risposte. Col termine problema o situazione problematica s’indica.
Istruzioni e algoritmi. Istruzioni Operative I passi elementari che compongono l’algoritmo sono le istruzioni. Distinguiamo: Istruzioni di input Istruzioni.
Transcript della presentazione:

Dr. Francesco Fabozzi Corso di Informatica Algoritmi Dr. Francesco Fabozzi Corso di Informatica

Programma Un elaboratore è una macchina universale in quanto può risolvere problemi di svariata natura Gestione prestiti di una biblioteca, sistema di prenotazione dei voli, risoluzione equazioni, … Ma non è una macchina intelligente Occorre impartire dall’esterno la sequenza delle istruzioni da eseguire per risolvere il problema (programma) Deve essere in un linguaggio comprensibile alla macchina (linguaggio di programmazione)

Analisi e programmazione La risoluzione di un problema mediante un elaboratore avviene in due fasi successive: Analisi del problema Ha come obiettivo la definizione di una procedura che permetta di risolvere il problema (algoritmo) Programmazione Ha come obiettivo la traduzione dell’algoritmo in un programma

Algoritmo L’algoritmo è una procedura che lavora su dati d’ingresso e fornisce dati in uscita con le seguenti caratteristiche: Generale Finita Completa Non ambigua Eseguibile

Caratteristiche di un algoritmo Generale Deve risolvere una intera classe di problemi al variare dei dati che li caratterizzano Finito Le istruzioni che lo compongono e il numero di volte che ogni istruzione viene eseguita devono essere finiti Completo Deve contemplare tutti i casi possibili

Caratteristiche di un algoritmo Non ambiguo Ogni istruzione deve essere definita in modo univoco, senza paradossi, contraddizioni o ambiguità Eseguibile Deve esistere un agente di calcolo in grado di eseguire ogni istruzione in un tempo finito

Efficienza di un algoritmo Uno stessa classe di problemi può essere risolta da diversi algoritmi, tutti corretti Un algoritmo efficiente deve pervenire alla soluzione del problema impiegando poco tempo e poca memoria Diversi algoritmi, anche se tutti corretti, possono avere diversi gradi di efficienza In genere algoritmi molto efficienti rispetto al tempo tendono ad occupare più memoria e viceversa

Efficienza rispetto al tempo Un algoritmo è veloce se arriva alla soluzione del problema eseguendo un numero piccolo di passi L’efficienza rispetto al tempo si esprime indicando il numero di operazioni da compiere in funzione del numero n di dati in input Esempi: Numero operazioni ~ n2 algoritmo di complessità O(n2) (=complessità quadratica) Numero operazioni ~ 2n algoritmo di complessità O(2n) (=complessità esponenziale)

Efficienza rispetto al tempo Esempio: Tempo impiegato da una CPU di 100 MIPS per il calcolo di un algoritmo di complessità lineare, quadratica ed esponenziale per diverse quantità di dati in input dati compl. 10 20 50 60 n 10-7 s 2 10-7 s 5 10-7 s 6 10-7 s n2 10-6 s 4 10-6 s 25 10-6 s 36 10-6 s 2n 10-5 s 6 10-2 s 1.6 107 s 1.6 1010 s

Efficienza rispetto al tempo Un algoritmo di complessità polinomiale O(nk) fornisce una soluzione al problema implementabile col calcolatore Ancora migliori sono gli algoritmi di complessità logaritmica O(logkn) Algoritmi di complessità esponenziale sono inutilizzabili

Efficienza rispetto alla memoria Un algoritmo è efficiente rispetto alla memoria se arriva alla soluzione del problema occupando un numero piccolo di locazioni L’efficienza rispetto alla memoria si esprime indicando il numero di locazioni occupate in funzione del numero n di dati in input Esempio: Numero locazioni ~ n algoritmo O(n) nel numero di celle di memoria impiegate

Analisi del problema La fase di analisi del problema ha come scopo la definizione dell’algoritmo. Viene effettuata in tre passi: Definizione del problema In questa fase non bisogna riferirsi al problema particolare (istanza) ma al caso generale cioè all’intera classe di problemi Scelta del metodo di soluzione più appropriato Sviluppo e descrizione dell’algoritmo

Analisi del problema Per problemi complessi è utile effettuare l’analisi seguendo l’approccio top-down Tale approccio si basa sulla scomposizione del problema in sottoproblemi più elementari Per ciascun sottoproblema viene definito un algoritmo Il vantaggio di questo approccio è che esso porta a definire algoritmi per problemi elementari che possono ritrovarsi in molti problemi complessi

Un semplice algoritmo Problema: confrontare le aree di due rettangoli (A e B) dati i rispettivi lati Algoritmo Acquisire lati di A in input Calcolare l’area di A Acquisire i lati di B in input Calcolare l’area di B Se l’area di A è maggiore dell’area di B: Comunica in output che Area(A) > Area(B) Se l’area di B è maggiore dell’area di A: Comunica in output che Area(B) > Area(A)

Applicazione dell’algoritmo Un algoritmo deve fornire la soluzione per un’intera classe di problemi Per risolvere un singolo problema di una certa classe si applica l’algoritmo sui dati che lo caratterizzano Nell’esempio precedente i dati sono i lati di due particolari rettangoli da confrontare L’insieme costituito da tutti i possibili dati prende il nome di insieme di definizione dell’algoritmo

Algoritmo e dati Un algoritmo interagisce con l’esterno in due fasi: Quando acquisisce i dati del particolare problema da risolvere (fase di input) Quando comunica messaggi o risultati (fase di output) Dati del problema Ambiente esterno Algoritmo Messaggi / risultati

Costanti e variabili I dati su cui opera un algoritmo possono essere: Costanti: il valore non può essere cambiato durante l’esecuzione dell’algoritmo Variabili: il valore può essere cambiato

Variabili scalari Una variabile scalare è una coppia (nome, valore) Il valore della variabile è indeterminato in fase di definizione dell’algoritmo Il valore viene definito durante l’esecuzione dell’algoritmo (valore attuale) mediante un’istruzione di assegnazione Nome Valore Variabile scalare

Variabili vettore Una variabile vettore (o array) è una coppia (nome, insieme ordinato di valori) I valori (elementi o componenti del vettore) sono numerati a partire da 1 (o da 0) Si possono avere anche vettori di vettori Vettori multidimensionali

Variabili vettore Se nome_v è il nome di un vettore si indica con nome_v( i ) la componente del vettore che è associata al numero intero i (indice del vettore) Vettore V V(1) V(2) V(3) V(4) V(1), V(2), V(3), V(4) sono i 4 elementi del vettore

Assegnazione di una variabile L’istruzione di assegnazione permette di definire il valore attuale di una variabile nome variabile ← espressione A destra della freccia: espressione costituita da variabili, costanti e operatori Si valuta l’espressione sostituendo ai nomi di variabile i rispettivi valori attuali e il valore calcolato sarà il valore attuale della variabile a sinistra della freccia

Assegnazione di una variabile In un’assegnazione occorre rispettare la regola dell’ordinamento Una variabile che compare nell’espressione deve essere già stata istanziata (cioè deve avere un valore attuale definito)

Assegnazione di una variabile Esempio: area ← lunghezza * larghezza Dopo l’assegnazione Prima dell’assegnazione 3 2 6 3 2 larghezza area lunghezza larghezza lunghezza Esempio: x ← x + 2 prima dopo 5 7 x x

Istruzioni La procedura di un algoritmo è descritta per messo di una sequenza di istruzioni Esistono vari tipi di istruzioni: Operative Di controllo Di salto Di ingresso/uscita Di inizio esecuzione Di fine esecuzione

Tipi di istruzioni Istruzioni operative Istruzioni di controllo La loro esecuzione provoca un risultato Istruzioni di controllo Controllano il verificarsi di una certa condizione Il risultato del controllo determina il flusso di istruzioni da eseguire successivamente

Tipi di istruzioni Istruzioni di salto Alterano il normale ordine di esecuzione delle istruzioni specificando esplicitamente un salto a una specifica istruzione Istruzioni di salto condizionato Il salto viene eseguito al verificarsi di una condizione Istruzioni di salto incondizionato Il salto viene eseguito sempre Nella programmazione strutturata il loro uso viene scoraggiato

Tipi di istruzioni Istruzioni di ingresso/uscita Indicano la modalità di trasmissione dati o messaggi tra algoritmo e ambiente esterno Istruzione di inizio esecuzione Indica inizio algoritmo Istruzione di fine esecuzione Indica fine algoritmo

Descrizione di un algoritmo L’algoritmo dell’esempio iniziale è stato descritto usando il linguaggio naturale I linguaggi naturali sono: Ambigui (una parola può avere più significati) Ridondanti (una stessa operazione può essere descritta in modi diversi)

Descrizione di un algoritmo Per illustrare un algoritmo in maniera precisa e sintetica sono introdotti dei formalismi (formalismi di codifica) che non hanno i difetti del linguaggio naturale Nel seguito mostreremo due esempi di formalismi: diagrammi di flusso (flow-chart) pseudocodifica

Diagrammi di flusso Rappresentazione grafica degli algoritmi Indicano il flusso (o sequenza) delle istruzioni Ogni istruzione è rappresentata da un simbolo grafico (blocco elementare) Simboli diversi per diversi tipi di istruzioni I blocchi sono collegati da linee di flusso Frecce che indicano l’ordine con cui si susseguono le istruzioni

Blocchi elementari Blocchi di inizio e fine algoritmo Blocco di azione istruzione Blocco di azione Blocco contenente una istruzione di I/O ingresso/uscita Blocco di controllo condizione Linea di flusso

Caratteristiche di una flow-chart Un diagramma di flusso possiede: 1 blocco di inizio algoritmo 1 blocco di fine algoritmo n ≥ 1 blocchi di azione o di I/O, n finito Ciascuno di questi blocchi ha una sola linea di flusso entrante e una sola linea di flusso uscente m ≥ 0 blocchi di controllo, m finito Ciascuno di questi blocchi ha una sola linea di flusso entrante e due linee di flusso uscenti

Caratteristiche di una flow-chart In un diagramma di flusso: Una linea di flusso entra in un blocco o si inserisce in un’altra linea di flusso Ciascun blocco è raggiungibile dal blocco di inizio algoritmo Il blocco di fine algoritmo è raggiungibile da qualsiasi altro blocco Esiste una sequenza di blocchi X1, …,Xn tali che A=X1, B=Xn e per ogni i=1, …, n-1 Xi è connesso con una freccia al blocco Xi+1 Blocco B raggiungibile dal blocco A

Schemi di flusso In un algoritmo le sequenze di istruzioni si possono raggruppare secondo schemi caratteristici detti schemi di flusso: Schema di sequenza Schema di selezione Schema di iterazione La giustificazione è fornita dal Teorema di Böhm-Jacopini Qualunque algoritmo è rappresentabile utilizzando solo questi tre schemi di flusso

Schema di sequenza Una semplice sequenza di istruzioni (o anche di schemi di flusso) S1 Si = schemi di flusso istruzione 1 S2 istruzione 2 istruzione n Sn

Schema di selezione Due istruzioni (o anche schemi di flusso) alternative da eseguirsi in base al verificarsi o meno di una certa condizione F V condizione istruzione 1 istruzione 2

Schema di selezione Altra possibilità F V condizione istruzione

Condizione Nello schema di selezione compare una condizione Il flusso delle istruzioni viene determinato in base al verificarsi o meno della condizione Per esprimere in maniera formale una condizione dobbiamo introdurre alcuni elementi di logica

Proposizioni Proposizione: costrutto linguistico di cui si può asserire o meno la veridicità Esempi: “8 è un numero pari”  vera “Potenza si affaccia sul mare”  falsa Valore di verità di una proposizione: l’essere vera o falsa Vero / Falso : valori logici o booleani

Predicati Predicato: proposizione il cui valore di verità dipende dal valore attuale di alcune variabili Esempi: “la variabile x è un numero pari” “l’angolo theta è minore di 90 gradi” Valutazione di un predicato: determinazione del suo valore di verità

Operatori relazionali Si chiamano operatori relazionali degli operatori che permettono di esprimere concisamente proposizioni e predicati Predicato semplice: predicato che contiene un solo operatore relazionale  uguale > maggiore ≥ maggiore o uguale ≠ diverso < minore ≤ minore o uguale

Negazione logica Tabella di verità per il not p = predicato not p = negazione logica di p Predicato con valore di verità opposto a quello di p Esempio: not( x > 2)  vero solo quando x ≤ 2 Tabella di verità per il not p not p vero falso

Congiunzione logica Tabella di verità per l’and p, q = predicati p and q = congiunzione logica di p e q Predicato con valore di verità vero quando p e q sono entrambi veri Esempio: ( x > 2) and (x < 5) Tabella di verità per l’and p q p and q falso vero

Disgiunzione logica Tabella di verità per l’or p, q = predicati p or q = disgiunzione logica di p Predicato con valore di verità vero quando almeno p o q è vero Esempio: ( x < 2) or (x > 5) Tabella di verità per l’or p q p or q falso vero

La flow-chart dell’esempio iniziale Leggi in input lato 2B di B inizio Leggi in input lato 1A di A S(B)  1B*2B S(A)>S(B) Leggi in input lato 2A di A F V S(A)  1A*2A Scrivi in output “Area di B maggiore di area di A” Scrivi in output “Area di A maggiore di area di B” Leggi in input lato 1B di B fine

Schema di iterazione Ripetizione di un’istruzione (o schema di flusso) per un numero finito di volte Lo schema da ripetersi si dice corpo dell’iterazione Deve essere in grado di modificare la condizione altimenti si entra in un “loop” infinito Iterazione per falso Corpo dell’iterazione F Controllo in coda (il corpo è eseguito almeno una volta) condizione V

Schema di iterazione Altra possibilità Iterazione per vero F condizione V Controllo in testa (il corpo può anche non essere mai eseguito) Corpo dell’iterazione

Esempio di algoritmo con iterazione Problema: calcolo di a4 inizio Leggi a in input Variabile b che immagazzina il risultato del calcolo b  1 m  0 Variabile m che conta il numero di volte che si effettua l’operazione (“contatore”) b  b*a m m+1 F V Scrivi b in output m = 4 fine

Esempio di algoritmo con iterazione Vediamo che l’algoritmo è OK in un caso particolare Input = 2  Output = 24 = 16 Passi dell’iterazione Iniziali # 1 # 2 # 3 # 4 Finali a 2 b 1 4 8 16 m 3

Esempio di algoritmo con iterazione Verificare che il seguente algoritmo è sbagliato per il calcolo di a4 inizio Leggi a in input m  1 a  a*a m m+1 F V Scrivi a in output m = 4 fine

Esempio di algoritmo con iterazione Verifichiamo che l’algoritmo non è OK usando un caso particolare Input = 2  Output = 256 = 28 Passi dell’iterazione Iniziali # 1 # 2 # 3 Finali a 2 4 16 256 m 1 3

Pseudocodifica L’algoritmo viene descritto mediante un linguaggio formale e rigoroso Vicino a un linguaggio di programmazione La descrizione mediante pseudocodifica si compone di due parti Dichiarazione delle variabili usate nell’algoritmo Descrizione delle azioni

Pseudocodifica Nella pseudocodifica: Si utilizzano parole chiave (in maiuscolo) BEGIN, END, IF, … Si utilizzano operatori +, *, -, >, … Si indentano le istruzioni Rientro di tabulazione per gruppi di azioni che appartengono a un certo schema di flusso

Tipo delle variabili Indica l’insieme di definizione di una variabile (o di una costante) Cioè l’insieme dei valori che può assumere INTEGER Una variabile a cui possono essere assegnati numeri interi relativi Una costante numero intero relativo Ex.: 2, -139 REAL Una variabile a cui possono essere assegnati numeri razionali Una costante numero razionale Ex.: 5.17, -0.345, 23.476 E-3

Tipo delle variabili BOOLEAN STRING-q Una variabile a cui possono essere assegnati valori logici Una costante true oppure false STRING-q Una variabile a cui possono essere assegnate stringhe (parole) di q caratteri Una costante stringa di q caratteri Sono racchiuse tra apici Ex.: ‘PIPPO’ è una costante STRING-5 Ex.: ‘?’ è una costante STRING-1 Ex.: ‘278’ è una costante STRING-3

Dichiarazione delle variabili Elenco delle variabili su cui opera l’algoritmo Preceduto dalla parola chiave VAR VAR i, j, k(10): INTEGER; p, q: REAL; cognome: STRING-20: ishigh: BOOLEAN. La virgola separa variabili dello stesso tipo I due punti separano l’elenco delle variabili dal loro tipo Il punto e virgola termina la dichiarazione di variabili dello stesso tipo Il punto termina la dichiarazione

Descrizione delle azioni Regole La prima azione dell’algoritmo deve essere preceduta da BEGIN L’ultima azione dell’algoritmo deve essere seguita da END Un’azione di lettura si indica con READ Un’azione di scrittura si indica con WRITE Si usano parole chiave per identificare gli schemi di flusso

Schema di sequenza Istruzione 1 Istruzione 2 … Istruzione n S1 S2 … Sn

Schema di selezione IF condizione THEN istruzione 1 ELSE istruzione 2 ENDIF IF condizione THEN istruzione ENDIF

Schema di iterazione REPEAT corpo dell’iterazione UNTIL condizione Controllo in coda REPEAT corpo dell’iterazione UNTIL condizione ENDREPEAT Controllo in testa WHILE condizione corpo dell’iterazione ENDWHILE

Esempi di pseudocodifica VAR a1, a2, b1, b2, sa, sb: REAL. BEGIN READ a1 READ a2 sa  a1 * a2 READ b1 READ b2 sb  b1 * b2 IF sa > sb THEN WRITE “Area A maggiore area B” ELSE WRITE “Area B maggiore area A” ENDIF END

Esempi di pseudocodifica VAR a, b: REAL; m: INTEGER. BEGIN READ a b  1 m  0 REPEAT b  b * a m  m + 1 UNTIL m = 4 ENDREPEAT WRITE b END