Cos’è l’informatica? Elementi di Informatica e Programmazione “L’informatica è lo studio sistematico degli algoritmi che descrivono e trasformano l’informazione: la loro teoria, analisi, progetto, efficienza, realizzazione applicazione” [ACM – Association for Computing Machinery] Il concetto di Algoritmo e di Calcolatore Corsi di Laurea in: L’informatica è dunque una scienza: l’elaborazione dell’informazione avviene in modo sistematico e rigoroso Ingegneria Civile Ingegneria per l’Ambiente e il Territorio Università degli Studi di Brescia L’elaborazione può essere automatizzata Docente: Daniela Fogli Daniela Fogli – Elementi di Informatica e Programmazione Alcuni concetti chiave I problemi e la loro risoluzione… Problema: classe di domande omogenee alle quali è possibile dare risposta mediante una procedura uniforme Algoritmo: una sequenza di operazioni che riguardano l’elaborazione di informazione e che sono comprensibili ed eseguibili da un esecutore Un esempio di esecutore: il calcolatore In realtà un calcolatore esegue un programma, Istanza del problema: ogni specifica domanda della classe Variabili di ingresso: termini variabili che caratterizzano la formulazione di un problema (permettono di generare le istanze) Variabili di uscita: termini variabili che caratterizzano le soluzioni attese (delle istanze) di un problema ovvero la descrizione formale di un algoritmo Dati: valori che possono assumere le variabili d’ingresso Necessità di linguaggi per la descrizione formale di algoritmi: linguaggi di programmazione Risultati: valori che possono assumere le variabili d’uscita Soluzione di un’istanza di un problema: risposta alla specifica domanda che l’istanza rappresenta Gli algoritmi di fatto “risolvono problemi”… vediamo cosa significa … Daniela Fogli – Elementi di Informatica e Programmazione 2 3 Daniela Fogli – Elementi di Informatica e Programmazione 4 Esempio Problema Quanto vale la radice quadrata intera Y di un numero intero positivo X ? Classe di domande omogenee Esempio Variabile di uscita Problema Variabile di ingresso Istanza Quanto vale la radice quadrata intera Y del numero 49? Quanto vale la radice quadrata Y del numero 50? Dati = Interi positivi Soluzione dell’istanza = 7 Risultati = Interi Daniela Fogli – Elementi di Informatica e Programmazione Daniela Fogli – Elementi di Informatica e Programmazione 5 3*3=9 Y=2 3*3=9 Y=3 2*2=4 Y=1 3*3=9, 4*4=16 6 Procedura di risoluzione Problema: Quanto vale la radice quadrata intera Y di un numero intero positivo X? Quale potrebbe essere una procedura di risoluzione? Partiamo dalle istanze 2*2=4, 2*2=4, 1*1=1, 2*2=4, Soluzione dell’istanza = 7,07… Risultati = Reali Un esempio di problema e di procedura di risoluzione X=5: X=9: X=1: X=10: Variabile di ingresso Quanto vale la radice quadrata Y di un numero intero positivo X ? Classe di domande omogenee Istanza Dati = Interi positivi Variabile di uscita Una possibile procedura di risoluzione per il problema dato è dunque: 1. 2. 3. 4. 5. Y=3 Idea! INIZIO: Assegna a Y il valore 0 Incrementa Y di 1 Se Y2< X allora torna all’istruzione 2 Se Y2 = X allora FINE Se Y2> X allora decrementa Y di 1: FINE Parto da Y=1, controllo se Y2<X Se sì allora provo con Y+1 e continuo Altrimenti significa che Y2>=X: Se Y2 = X allora Ok Altrimenti la soluzione deve essere Y-1 Daniela Fogli – Elementi di Informatica e Programmazione 7 Daniela Fogli – Elementi di Informatica e Programmazione 8 Procedure di risoluzione e algoritmi… Computazione Computazione: esecuzione di un algoritmo in corrispondenza di certi dati La procedura di risoluzione è quindi espressa come sequenza di istruzioni la cui esecuzione porta alla soluzione del problema ALGORITMO RISOLUTIVO Passo di computazione: ogni singolo passo elementare che un esecutore compie durante l’esecuzione di un algoritmo Sequenza di computazione: sequenza di passi elementari che un esecutore compie in corrispondenza di certi dati iniziali durante l’esecuzione di un algoritmo Algoritmo = concetto statico Computazione = concetto dinamico ALGORITMO DATI SOLUZIONE Daniela Fogli – Elementi di Informatica e Programmazione Daniela Fogli – Elementi di Informatica e Programmazione 9 Più formalmente … Esempio di sequenza di computazione Supponendo che la variabile in ingresso X = 8 eseguiamo l’algoritmo passo-passo 1 2 3 4 5 6 7 8 9 10 11 Problema P[X, Y] Y←0 Calcolo di Y+1 e risultato in Y Y =1 Controllo se Y2 < X è vero Calcolo di Y+1 e risultato in Y Y =2 Controllo se Y2 < X è vero Calcolo di Y+1 e risultato in Y Y =3 Controllo se Y2 < X è falso Controllo se Y2 = X è falso Controllo se Y2 > X è vero (ovviamente!) Calcolo di Y-1 e risultato in Y Y =2 Fine Daniela Fogli – Elementi di Informatica e Programmazione 10 (X1, X2, …, Xn): variabili di ingresso, con domini D1, D2, …, Dn (insiemi di dati) (Y1, Y2, …, Ym): variabili di uscita, con domini R1, R2, …, Rm (insiemi di risultati) Istanza del problema P[X, Y] 11 con X ∈ D = D1 x D2 x … x Dn Daniela Fogli – Elementi di Informatica e Programmazione 12 Calcolatore come Esecutore Universale di Algoritmi Algoritmo risolvente del problema Denotiamo con A[X, Y] l’algoritmo risolvente di P[X, Y] algoritmo A[X, Y] produce una soluzione per ogni possibile istanza di P[X, Y] A[X, Y] problema P[X, Y] Eseguendo l’algoritmo risolvente A[X, Y] con il dato di ingresso X Є D si otterrà come risultato la soluzione Y Є R dell’istanza P[X, Y] Problema P[X, Y] dato: X Algoritmo A[X, Y] CALCOLATORE risultato: Y soluzione Esecuzione di A con il dato X Sostituzione di X con X P[X, Y] Istanza P[X, Y] Risultato Y: soluzione di P[X, Y] Daniela Fogli – Elementi di Informatica e Programmazione istanza 13 Calcolatore come esecutore Daniela Fogli – Elementi di Informatica e Programmazione 14 Algoritmi, programmi e calcolatori Un esecutore deve essere in grado di interpretare la descrizione della procedura di risoluzione (algoritmo risolvente) Un algoritmo deve essere comprensibile per il suo esecutore Deve inoltre essere in grado di eseguire le azioni presenti nella descrizione interpretata Per essere comprensibili da un calcolatore, gli algoritmi devono essere espressi in un linguaggio di programmazione Il calcolatore è un esecutore di algoritmi identificate e descritte da esseri umani (in genere un team di progettisti, programmatori e utenti) Programma: descrizione formale di un algoritmo attraverso un linguaggio di programmazione Un programma è una sequenza di istruzioni scritte in un opportuno linguaggio comprensibile dal calcolatore Il calcolatore è dunque un esecutore di programmi Il compito di un esperto informatico consiste nel produrre algoritmi e codificarli in programmi Daniela Fogli – Elementi di Informatica e Programmazione 15 Daniela Fogli – Elementi di Informatica e Programmazione 16 Il calcolatore come esecutore di programmi Il calcolatore come esecutore (una definizione rivisitata) Programma sequenza di istruzioni di un linguaggio di programmazione (descrive un algoritmo) CALCOLATORE Dati iniziali Risultati dell’esecuzione in corrispondenza dei dati iniziali Assegnati a variabili di ingresso 18 Almeno 3 aspetti lo fanno preferire a un esecutore umano potenza n-esima di a: P[a, n, b] X Velocità Es. si pensi al calcolo strutturale, alla simulazione di processi, al controllo della traiettoria di un veicolo spaziale … ma anche a tutte quelle situazioni in cui occorre trattare una enorme quantità di dati – es. gestione anagrafe fiscale Y CALCOLATORE Risultati dell’esecuzione in corrispondenza dei dati iniziali Istanza del problema = P[2,5,b] Daniela Fogli – Elementi di Informatica e Programmazione Perché usare un calcolatore come esecutore Programma per il calcolo della a = 2, n = 5 programmi 17 Esempio dati iniziali Un calcolatore è un esecutore universale di elabora puri simboli (per esso “privi di significato”) non risolve problemi (il problema non è un suo ingresso) ma esegue programmi! Assegnati a variabili di uscita Daniela Fogli – Elementi di Informatica e Programmazione Un calcolatore è un sistema che, ricevendo in ingresso la descrizione, in un opportuno linguaggio, di un algoritmo risolvente A[X,Y] (cioè un programma) per un certo problema P[X,Y] e un dato X, produce un risultato Y, ovvero la soluzione Y dell’istanza P[X,Y] Affidabilità basso tasso di errore Economicità b = 32 Daniela Fogli – Elementi di Informatica e Programmazione ottimo compromesso costi/benefici 19 Daniela Fogli – Elementi di Informatica e Programmazione 20 L’ “unicità” del calcolatore nella storia della tecnologia Proprietà di un algoritmo La definizione di algoritmo presuppone che esso possa essere espresso in termini linguistici ben definiti, interpretato ed eseguito da un soggetto esecutore (il calcolatore). Da ciò conseguono le seguenti proprietà: Il fatto fondamentale: il calcolatore è un dispositivo programmabile Finitezza: un algoritmo deve essere costituito da un numero finito Consente di svolgere compiti diversi senza alcuna modifica della sua struttura fisica di istruzioni Definitezza: le istruzioni di cui un algoritmo è costituito devono appartenere a un insieme finito e prefissato di tipi elementari Basta intervenire sul livello software (programmi) lasciando inalterato il livello hardware (struttura fisica) per modificarne il comportamento Univocità: ogni istruzione deve essere univocamente interpretabile ed eseguibile Effettività: deve esistere un esecutore in grado di eseguire ogni istruzione dell’algoritmo in un tempo finito Daniela Fogli – Elementi di Informatica e Programmazione Daniela Fogli – Elementi di Informatica e Programmazione 21 Altre proprietà 22 Sequenza di computazione finita A[X, Y] Determinismo: per qualunque dato di ingresso, a ogni passo algoritmo della computazione, esiste al più un passo successivo. Ovvero: assegnato un dato di ingresso, esiste una e una sola computazione possibile dell’algoritmo dato: X ESECUTORE risultato: Y Correttezza: l’algoritmo perviene alla soluzione del compito cui è preposto Efficienza: l’algoritmo perviene alla soluzione del compito impiegando il numero minimo di risorse fisiche Risorse fisiche: tempo, memoria, …. passo 1 passo 2 passo 3 … … passo n Terminazione: l’esecuzione di un algoritmo deve terminare in un numero finito di passi Daniela Fogli – Elementi di Informatica e Programmazione In questo caso, la computazione produce un risultato 23 Daniela Fogli – Elementi di Informatica e Programmazione 24 Funzione calcolata da un algoritmo Sequenza di computazione infinita A[X, Y] algoritmo dato: X NB: l’algoritmo è comunque finito! D ESECUTORE fA • Un algoritmo A[X, Y] calcola una funzione da D (dominio delle variabili di ingresso) a R (dominio delle variabili di uscita): - fA: D→R tale che fA(X) = Y con Y prodotto dalla computazione di A[X, Y] con il dato X • La funzione è in generale parziale! passo 1 passo 2 passo 3 … … … … In questo caso, il risultato rimane indefinito Daniela Fogli – Elementi di Informatica e Programmazione Daniela Fogli – Elementi di Informatica e Programmazione 25 26 Due algoritmi che risolvono lo stesso problema Note 1. 2. 3. 4. 5. Funzione come concetto equivalente di problema Problema: come lo risolvo? Funzione: come la calcolo? Un algoritmo risolve 1 problema (calcola 1 funzione) INIZIO: Assegna a Y il valore 0 Incrementa Y di 1 Se Y2< X allora torna all’istruzione 2 Se Y2 = X allora FINE Se Y2> X allora decrementa Y di 1: FINE Viceversa, per ogni problema risolubile (ovvero, se esiste un algoritmo che lo risolve), esistono infiniti algoritmi che lo risolvono, infatti: Algoritmo modificato ma equivalente • un algoritmo è descritto da una sequenza di istruzioni • è sufficiente pensare che possiamo sempre aggiungere sequenze di istruzioni che non hanno effetto sul risultato • e possiamo farlo in infiniti modi (es. sommare e sottrarre 1 a/da una variabile, sommare e sottrarre 2, ecc. ecc.) Daniela Fogli – Elementi di Informatica e Programmazione R A[X, Y] 27 Algoritmo di partenza 1.INIZIO: Assegna a Y il valore 0 2.Incrementa Y di 1 3.Se Y2< X allora torna all’istruzione 2 4.Se Y2 = X allora FINE 5.Incrementa Y di 1 6.Decrementa Y di 1 7.Se Y2> X allora decrementa Y di 1: FINE Daniela Fogli – Elementi di Informatica e Programmazione 28 Cenni sulla macchina di Turing Informatica Teorica • Utilizzando strumenti matematici, studia macchine astratte Macchina astratta utilizzata nell’informatica teorica per formalizzare i concetti di algoritmo, esecutore e computazione descritte formalmente, anziché macchine concrete • Permette di ottenere risultati su “cosa una macchina è in grado di calcolare” e quindi “quali problemi possono essere risolti” a prescindere dalla tecnologia impiegata per realizzare i calcolatori • La tecnologia cambia, i risultati generali no: Macchine di estrema semplicità, ma… “ogni funzione effettivamente computabile, complessa quanto si vuole, può essere computata da una macchina di Turing purché non si pongano limiti di tempo e di memoria” (Tesi di Church-Turing) - La “macchina analitica” di Charles Babbage (mai realizzata) è stata progettata nel 1830 - La “macchina di Turing” (di Alan Turing) è stata pubblicata nel 1936 - Il primo calcolatore elettronico solo nel 1943 Daniela Fogli – Elementi di Informatica e Programmazione Questa tesi non può essere provata Rappresenta una definizione del concetto intuitivo di funzione computabile, ovvero una funzione che può essere calcolata da un algoritmo finito 29 La macchina di Turing … Daniela Fogli – Elementi di Informatica e Programmazione 30 Macchina di Turing … è composta da: Nastro (potenzialmente infinito) suddiviso in caselle in cui possono essere scritti o letti simboli di un alfabeto (simboli: s0, s1, …, sn) Testina di lettura/scrittura Unità di spostamento per muovere la testina a destra o sinistra in ogni istante Organo di controllo che determina il comportamento. E’ caratterizzato ad ogni istante da uno stato interno (stati: q1, q2, …, qm con m finito) Daniela Fogli – Elementi di Informatica e Programmazione s1 nastro B Testina di lettura/scrittura Unità di spostamento testina q1 31 Unità di controllo (contenente un elemento di stato) Daniela Fogli – Elementi di Informatica e Programmazione 32 Esecuzione di un programma Esempio di Macchina di Turing Tabella delle transizioni di stato Il programma per una macchina di Turing consiste in un insieme di istruzioni, ciascuna formata da una quintupla <qi, sj, sk, D, qu> dove Stati Ingressi qi: stato presente sj: simbolo letto dal nastro sk: simbolo sostituito sul nastro D: direzione del movimento (R, L, N) qu: stato futuro Ad ogni istante la macchina esegue la quintupla che può essere applicata per l’attuale stato interno e per il simbolo in lettura L’insieme delle quintuple che descrive una MTi può essere espresso tramite una tabella … Daniela Fogli – Elementi di Informatica e Programmazione q1 q2 0 0q1R 0q2R 1 0q2R 0q1R b 0qhN 1qhN Dato il simbolo di ingresso letto sul nastro (in questa macchina: 0, 1 o b) e lo stato corrente macchina (in questa: q1 o q2) la macchina scrive un nuovo simbolo sul nastro al posto di quello letto modifica lo stato della macchina sposta la testina di lettura/scrittura di un posto a destra (R/right) o a sinistra (L/left) o la lascia dov’è (N/none) Questa macchina calcola una ben precisa funzione: è quella MT che è in grado di “dire” se la sequenza in ingresso contiene un numero pari o dispari di 1 33 Funzioni calcolate e Macchine di Turing Daniela Fogli – Elementi di Informatica e Programmazione 34 Macchina di Turing Universale Ogni macchina di Turing definisce una particolare funzione matematica che agisce sui dati in ingresso forniti dal nastro Una Macchina di Turing MTi calcola una e una sola funzione fi Non è vero il contrario: se una funzione fj può essere calcolata da una Macchina di Turing MTj allora esistono infinite altre Macchine di Turing che calcolano la medesima funzione Esistono problemi (funzioni) non computabili, ovvero per i quali non esistono algoritmi risolventi (macchine di Turing che le calcolano) un esempio: non esiste un algoritmo che, dato un qualunque algoritmo e un dato, può decidere se esso termina oppure no E’ una macchina che può simulare il comportamento di una qualunque macchina di Turing una volta ricevuto in ingresso la descrizione della macchina da simulare (Se qualcuno è interessato all’informatica teorica, può consultare i capitoli 15, 16, 17 del libro di testo) Daniela Fogli – Elementi di Informatica e Programmazione 35 Daniela Fogli – Elementi di Informatica e Programmazione 36 Esercizio 1 Elementi di Informatica e Programmazione Scrivere l’algoritmo (in linguaggio naturale e con un diagramma di flusso) per il seguente problema: l’esecutore deve leggere in ingresso una sequenza di numeri naturali (i.e. interi positivi strettamente maggiori di zero) e calcolarne (per poi visualizzarli) il massimo, il minimo e la media La sequenza si interrompe non appena viene introdotto un numero negativo o uguale a zero Per esempio, data la sequenza 5, 1, 2, 3, 6, -5, il risultato deve essere: “Il massimo è 6, il minimo è 1, la media è 3.4” mentre, data la sequenza -2, il risultato deve essere “La sequenza inserita è nulla” Fare l’esecuzione passo-passo dell’algoritmo nei 2 casi sopra menzionati Esercizi sugli Algoritmi Corsi di Laurea in: Ingegneria Civile Ingegneria per l’Ambiente e il Territorio Università degli Studi di Brescia Docente: Daniela Fogli 2 inizio Algoritmo per esercizio 1 Schema a blocchi media ← 0 n←0 Descrizione dell’algoritmo in linguaggio naturale: sì x > max max ← x no x← sì n ← 0, media ← 0 Leggi un valore dall’esterno e inseriscilo nella variabile x Se x > 0 allora max ← x, min ← x Finché x > 0 ripeti Se x > max allora max ← x Se x < min allora min ← x media ← media + x n←n+1 Leggi un valore dall’esterno e inseriscilo nella variabile x Fine ciclo media ← media / n Visualizza “Massimo, minimo, media = ” seguita dai valori in max, min, media altrimenti Visualizza “La sequenza inserita è nulla” Fine x < min no min ← x x>0 no max ← x min ← x ‘La sequenza inserita è nulla” sì no media ← media / n x>0 media ← media + x n←n+1 x← sì Corpo del ciclo ← max ← min ← media 3 Corpo del ciclo fine 4 Esecuzione passo passo dell’algoritmo: data la sequenza 5, 1, 2, 3, 6, -5 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Esecuzione passo passo dell’algoritmo: data la sequenza 5, 1, 2, 3, 6, -5 media ← 0, n ← 0 Lettura di un numero e memorizzazione nella variabile x (x ← 5) Controllo se x > 0 è vero max ← 5, min ← 5 Controllo se x > 0 è vero Controllo se x > max non è vero Controllo se x < min non è vero media ← 0 + 5 = 5 n←0+1=1 Lettura di un numero e memorizzazione nella variabile x (x ← 1) Controllo se x > 0 è vero Controllo se x > max non è vero Controllo se x < min è vero min ← 1 15. 16. media ← 1 + 5 = 6 n←1+1=2 17. 18. 19. 20. Lettura di un numero e memorizzazione nella variabile x (x=2) Controllo se x > 0 è vero Controllo se x > max non è vero Controllo se x < min non è vero media ← 6 + 2 = 8 n←2+1=3 Lettura di un numero e memorizzazione nella variabile x (x=3) Controllo se x > 0 è vero Controllo se x > max non è vero Controllo se x < min non è vero media ← 8 + 3 = 11 n←3+1= 4 21. 22. 23. 24. 25. 26. 27. 28. 5 6 Esecuzione passo passo dell’algoritmo: data la sequenza 5, 1, 2, 3, 6, -5 29 30 31 32 33 34 35 36 37 38 39 40 41 42 Esecuzione passo passo dell’algoritmo: data la sequenza –2 (cioè sequenza nulla) Lettura di un numero e memorizzazione nella variabile x (x = 6) Controllo se x > 0 è vero Controllo se x > max è vero max ← 6 Controllo se x < min non è vero media ← 11 + 6 = 17 n←4+1=5 Lettura di un numero e memorizzazione nella variabile x (x = -5) Controllo se x > 0 non è vero media ← 17 / 5 = 3 Visualizza “il Massimo è” 6 Visualizza “Il minimo è” 1 Visualizza “La media è” 3.4 Fine 7 1 Lettura di un numero e memorizzazione nella variabile x (x = -2) 2 Controllo se x > 0 non è vero 3 Visualizza ‘La sequenza inserita è nulla’ 4 Fine 8 Esercizio 2 Sia y = r Algoritmo per esercizio 2 1 Descrizione dell’algoritmo in linguaggio naturale: ∑i Leggi un valore dall’esterno e inseriscilo nella variabile r Leggi un valore dall’esterno e inseriscilo nella variabile q Se (r>0) AND (q > 0) AND (r > q) allora y ← 0, i ← q Finché i <= r ripeti y ← y + 1/ i i←i+1 Fine ciclo Visualizza “Il risultato è”, y altrimenti Visualizza “Errore nell’immissione dati” Fine i =q Scrivere l’algoritmo in linguaggio naturale e il diagramma di flusso per il calcolo di y assumendo di acquisire r e q dall’esterno (dati di input) Nota: controllare che r e q siano interi positivi tali che r > q 9 10 r inizio Esercizio 3 1 y=∑ i =q i r← q← (r > 0) AND (q > 0) AND (r > q) k Sia y = y←0 i←q 2 j =1 Scrivere l’algoritmo in linguaggio naturale e il diagramma di flusso per il calcolo di y assumendo di acquisire k dall’esterno (dato di input) controllando che k sia intero positivo. In caso di errata immissione continuare a chiedere k. ‘Errore nell’immissione dei dati’ sì 1 ∑ (∑ i + j ) i =1 no i no i <= r sì y ← y + (1/i) i ← i +1 ←y fine 11 12 Algoritmo per esercizio 3 inizio k← Descrizione dell’algoritmo in linguaggio naturale: Inizio Ciclo Leggi un valore dall’esterno e inseriscilo nella variabile k Se k <= 0 allora Visualizza “Errore nell’immissione dati” Torna a Inizio Ciclo Finché k <= 0 y ← 0, i ← 1 Finché i <= k ripeti s ← 0, j ← 1 Finché j <= i ripeti s ← s + 1/(i + j) j←j+1 Fine ciclo s←s*s y←y+s i←i+1 Fine ciclo Visualizza “Il risultato è”, y Fine sì k <= 0 k i 1 2 ) j =1 i + j y =∑ (∑ no y←0 i←1 i =1 i<=k S ← S*S y←y+S i←i+1 Ciclo a condizione finale ‘Errore nell’immissione dei dati’ no sì ←y S←0 j←1 fine no j<=i sì 13 S ← S + 1/(i+j) j ← j+1 14 Risoluzione di un problema Elementi di Informatica e Programmazione Dato un problema da risolvere, non è facile né efficiente, scrivere un programma in linguaggio macchina che lo risolva Il Progetto degli Algoritmi Facciamo un passo indietro … Corsi di Laurea in: Fasi del procedimento di risoluzione di un problema: Ingegneria Civile Ingegneria per l’Ambiente e il Territorio 1. Analisi del problema e individuazione di una procedura di risoluzione 2. Descrizione della procedura di risoluzione 3. Interpretazione della procedura di risoluzione 4. Attuazione della procedura di risoluzione Università degli Studi di Brescia Docente: Daniela Fogli Daniela Fogli – Elementi di Informatica e Programmazione Esempio: montaggio di un elettrodomestico Processo di risoluzione di un problema Soggetto 1 Problema SOGGETTO 1 Individuazione procedura Analisi Stesura descrizione procedura attività ingresso/uscita 2 Soggetto 2 Conoscenza di come si risolve il problema Descrizione procedura Interpretazione descrizione Es. progettista di un elettrodomestico Descrizione interpretata Attuazione procedura oppure Daniela Fogli – Elementi di Informatica e Programmazione Soluzione 3 SOGGETTO 2 Effettiva capacità di risolvere il problema Es. l’acquirente dell’elettrodomestico Daniela Fogli – Elementi di Informatica e Programmazione 4 Analisi del problema Modellazione del problema Cos’è un modello? Dato un certo problema, un modello del problema è una rappresentazione semplificata del problema stesso che evidenzia: Gli elementi del problema Le loro proprietà e le relazioni fra di essi L’analisi di un problema consiste in: Comprensione del problema: eliminando ogni ambiguità nella sua formulazione, focalizzando gli obiettivi, evidenziando i dati impliciti ed espliciti del problema Modellazione del problema: creando un modello Ricerca di una procedura di soluzione: scomponendo il problema e individuando una sequenza di “passi” per risolverlo Esempio: l’archivio di una biblioteca - Mondo reale Daniela Fogli – Elementi di Informatica e Programmazione 6 Procedura di risoluzione di un problema Risolvere un problema = risolvere un’opportuna successione di problemi più semplici SCOMPOSIZIONE IN SOTTO-PROBLEMI I sotto-problemi potrebbero dover essere a loro volta scomposti in sotto-sotto-problemi, e così via La scomposizione deve giungere fino ai problemi elementari (o Un MODELLO è un’astrazione del problema. Rappresenta una semplificazione completa e autoconsistente della realtà, creata per comprendere il problema primitivi) Astrae dai dettagli irrilevanti del mondo analisi Modello Daniela Fogli – Elementi di Informatica e Programmazione 5 Relazione tra realtà e modello Mondo reale Titolo Autori stanza, scaffale … Ad ogni problema elementare corrisponde una istruzione elementare, che rappresenta la maniera di descrivere il problema elementare in modo che l’esecutore sia in grado di interpretarlo correttamente MODELLO f(x) = g'(y) ° h(z) Daniela Fogli – Elementi di Informatica e Programmazione 7 Daniela Fogli – Elementi di Informatica e Programmazione 8 Un esempio (informale) di scomposizione di un problema Problema: richiesta di un libro Gestione di una biblioteca in cui: Come procedo? 1. Decido quale libro richiedere 2. Prelevo il libro I libri sono disposti sugli scaffali La posizione di ogni libro è data da: numero dello scaffale e posizione nello scaffale Esiste un schedario ordinato in cui ogni scheda riporta le seguenti informazioni: Cognome e nome dell’autore Titolo del libro Data di pubblicazione Numero dello scaffale in cui si trova Posizione nello scaffale Daniela Fogli – Elementi di Informatica e Programmazione Il secondo passo va dettagliato, ovvero va scomposto in sotto-problemi (procedura per raffinamenti successivi o top-down) 9 Il problema diventa… 1. 2. 3. 4. 5. 6. Daniela Fogli – Elementi di Informatica e Programmazione 10 Cercare la scheda… Decido quale libro richiedere Cerco la scheda del libro nello schedario Mi segno numero dello scaffale e posizione nello scaffale Cerco lo scaffale Cerco il libro nella sua posizione all’interno dello scaffale Prelevo il libro Scompongo in sotto-sotto-problemi: 1. Prendo la prima scheda 2. Il titolo, l’autore e la data corrispondono a quelli del libro che sto cercando? Se sì allora ho individuato la scheda, altrimenti passo alla scheda successiva e ripeto il controllo 3. Se le schede sono esaurite, allora il libro non esiste Esistono metodi più efficienti per risolvere lo stesso problema… come fareste voi? Non è un problema elementare! Daniela Fogli – Elementi di Informatica e Programmazione 11 Daniela Fogli – Elementi di Informatica e Programmazione 12 Un metodo più efficiente… 1. 2. 3. Più precisamente … Dal problema a un programma comprensibile dal calcolatore Esamino la scheda centrale dello schedario Se la scheda corrisponde al libro cercato allora termino la ricerca Altrimenti cerco (con lo stesso metodo) nella metà inferiore o superiore dello schedario a seconda che il libro cercato preceda o segua il libro indicato sulla scheda • Analisi del problema e identificazione procedura di risoluzione In realtà il passo 2 deve “accorgersi” anche se il libro non esiste, diventa: “se la scheda corrisponde al libro cercato oppure se la parte di schedario da esaminare è vuota allora termino la ricerca” Daniela Fogli – Elementi di Informatica e Programmazione • Specifica dell’algoritmo risolutivo • Programmazione in linguaggio di alto livello • Traduzione del programma in linguaggio macchina • Esecuzione del programma Daniela Fogli – Elementi di Informatica e Programmazione 13 Dall’analisi del problema all’esecuzione problema analisi Algoritmo Attività dell’uomo svolte con l’ausilio di procedura di strumenti CASE e risoluzione (informale) e ambienti di sviluppo algoritmo (formale) specifica programazione La procedura di risoluzione è specificata in maniera formale come sequenza di istruzioni ALGORITMO RISOLUTIVO Attività programma automatica svolta (alto livello) da programmi traduttori traduzione Esecutore del linguaggio macchina Daniela Fogli – Elementi di Informatica e Programmazione 14 ALGORITMO Dati iniziali Dati finali (soluzione) programma (ling. macchina) Istruzioni che operano sui dati esecuzione 15 Daniela Fogli – Elementi di Informatica e Programmazione 16 Algoritmo = Dati + Istruzioni Come posso classificare i dati? In base alla visibilità da parte dell’utente Dati: Visibile (di ingresso o uscita) Trasparente (dati temporanei di supporto) Numeri (naturali, interi, reali, …) Caratteri alfanumerici (a, b, c, …) Dati logici (vero, falso) Vettori di elementi, matrici, … ([1,2,3], [[1,1],[1,2],…]) Immagini, suoni, … In base alla variabilità nel tempo Costanti Variabili (acquisizione dall’esterno o assegnazione) Istruzioni: In base alla struttura Istruzioni di ingresso/uscita (es. leggi, visualizza,…) Istruzioni aritmetico-logiche (es. c = a * b) Istruzioni di controllo (es. se … allora, ripeti…) Daniela Fogli – Elementi di Informatica e Programmazione Elementari (interi, alfanumerici, logici, …) Strutturati (vettori, matrici, …) Daniela Fogli – Elementi di Informatica e Programmazione 17 Variabili, espressioni e assegnamenti 18 Espressioni aritmetiche Variabile: “contenitore” di dati Ha un nome (es. x)… nel calcolatore i nomi delle variabili … sono formate da: Operandi: variabili e costanti (si ipotizza di considerare solo identificano una ben precisa locazione di memoria Ad una variabile può essere assegnato un valore: es. x ← 10… nel calcolatore diventa il contenuto della locazione di memoria identificata dal nome della variabile Le variabili possono comparire in espressioni aritmetiche (es. xy) o logiche, e in predicati logici Le espressioni possono essere assegnate ad altre variabili: ad es. scriveremo d ←x-y per indicare che d conterrà il risultato dell’espressione Si potrebbe anche usare x o y al posto di d, in questo modo si sovrascrive il precedente valore numeri interi) Operatori: addizione (+), sottrazione (-), moltiplicazione (*), divisione intera (/), modulo (mod) Semantica: quella usuale dell’aritmetica Esempi (a mod 5) + b * 3 (b – c)/2 + 3 * a Daniela Fogli – Elementi di Informatica e Programmazione 19 Daniela Fogli – Elementi di Informatica e Programmazione 20 Espressioni logiche Predicati logici … sono formati da: … sono formate da: Operandi: espressioni logiche e/o predicati Operandi: espressioni aritmetiche Operatori: operatori logici di congiunzione (AND), disgiunzione Operatori: operatori relazionali di uguaglianza (=), (OR) e negazione (NOT) minoranza (<) e maggioranza (>) fra numeri Semantica: quella dell’Algebra di Boole Semantica: quella delle disequazioni fra numeri Hanno un valore logico (vero o falso) Esempi Esempi a=b (b + d) < (10 * c) (a < b) AND (b < c) OR (c = d+2) Hanno un valore logico (vero o falso) Daniela Fogli – Elementi di Informatica e Programmazione Not( ( (a=10*b) AND (b = c) ) OR (c = 20) ) 21 Rappresentazione degli algoritmi Daniela Fogli – Elementi di Informatica e Programmazione 22 Linguaggio naturale/pseudo-codice Problema: determinare il maggiore di due numeri interi ricevuti in ingresso (si assuma di avere a disposizione solo le istruzioni aritmetiche e quella di confronto con lo zero) 1. Linguaggio naturale/pseudo-codice 2. Diagrammi di flusso 3. Linguaggi di programmazione Daniela Fogli – Elementi di Informatica e Programmazione Algoritmo in linguaggio naturale: Leggi un valore dall’esterno e inseriscilo nella variabile x Leggi un secondo valore e inseriscilo nella variabile y Calcola x-y e assegna il risultato a d Se d è diverso a 0 allora Se d è maggiore di 0 allora Visualizza “Il massimo è …” seguita dal valore contenuto in x altrimenti Visualizza “Il massimo è …” seguita dal valore contenuto in y altrimenti Visualizza “I due numeri sono uguali!” Fine 23 Daniela Fogli – Elementi di Informatica e Programmazione 24 I diagrammi di flusso La simbologia comunemente utilizzata Termini equivalenti: diagrammi a blocchi, schemi a blocchi, flowchart Formalismo grafico per descrivere algoritmi inizio Elementi del linguaggio: simboli per indicare inizio e fine, operazioni di ingresso/uscita (I/O), elaborazioni, condizioni, sottoprogrammi sì elaborazione Daniela Fogli – Elementi di Informatica e Programmazione Fine no selezione a 2 vie sottoprogramma 26 Blocco di I/O Il blocco ‘Inizio’ denota il punto da cui l’esecuzione dell’algoritmo deve iniziare x← Il blocco ‘Fine’ denota il punto in cui l’esecuzione dell’algoritmo termina Daniela Fogli – Elementi di Informatica e Programmazione cond Daniela Fogli – Elementi di Informatica e Programmazione 25 Blocchi Inizio e Fine Inizio fine I/O Contiene un’istruzione di lettura di un valore dall’esterno (esempio lettura da tastiera) oppure un’istruzione di scrittura verso l’esterno (esempio scrittura a video) x← lettura di un valore e sua memorizzazione nella variabile x ←x scrittura (invio) del valore di x all’esterno ←x 27 Daniela Fogli – Elementi di Informatica e Programmazione 28 Selezione a 2 vie (Blocco decisionale) Blocco di Elaborazione Condizione (predicato) Contiene un’istruzione di assegnamento come ad esempio: Esempi di condizioni: x←y x←0 Rappresenta un’istruzione di controllo sì x ← x+1 x=0 no x<z x >= z*w x ← y+z*w … … Possono anche indicarsi con V (vero) ed F (falso) Nei linguaggi di programmazione più comuni il simbolo ‘=‘ oppure ‘:=‘ viene usato al posto di ‘←’ Daniela Fogli – Elementi di Informatica e Programmazione x=y Daniela Fogli – Elementi di Informatica e Programmazione 29 Blocco Sottoprogramma Se la condizione risulta vera allora l’esecuzione prosegue lungo l’arco denotato con ‘sì’ altrimenti prosegue lungo l’arco denotato con ‘no’ 30 Collegamenti fra i blocchi I blocchi sono collegati fra loro da archi Contiene un’istruzione di chiamata di un sottoprogramma come ad esempio: orientati Max(x,y) Media(x,y,z) • L’arco identifica la sequenza delle operazioni da compiere MCD(y,z) … Nei linguaggi di programmazione più comuni si distingue fra chiamate di procedura e chiamate di funzione • La freccia identifica il flusso di esecuzione In ogni caso sono sottoprogrammi richiamabili dal programma principale o da altri sottoprogrammi Daniela Fogli – Elementi di Informatica e Programmazione 31 Daniela Fogli – Elementi di Informatica e Programmazione 32 Esempio: Problema 1 inizio Problema: determinare il maggiore di due numeri interi ricevuti in ingresso (si assuma di avere a disposizione solo le istruzioni aritmetiche e quella di confronto con lo zero) x← y← Algoritmo in linguaggio naturale: d←x-y Diagramma di flusso dell’algoritmo che risolve il problema 1 Leggi un valore dall’esterno e inseriscilo nella variabile x Leggi un secondo valore e inseriscilo nella variabile y Calcola x-y e assegna il risultato a d Se d è diverso a 0 allora Se d è maggiore di 0 allora Visualizza “Il massimo è …” seguita dal valore contenuto in x altrimenti Visualizza “Il massimo è …” seguita dal valore contenuto in y altrimenti Visualizza “I due numeri sono uguali!” Fine Daniela Fogli – Elementi di Informatica e Programmazione 33 sì d>0 no ‘Il max è’, ← y Daniela Fogli – Elementi di Informatica e Programmazione 34 Esempio: Problema 2 Lettura di un numero e memorizzazione nella variabile Calcolo del Massimo Comune Divisore (MCD) di due interi x ed y Lettura di un numero e memorizzazione nella variabile Individuazione della procedura di risoluzione: y (supponiamo che il numero acquisito sia 6, quindi in memoria si avrà y=6) Calcolo di x-y e risultato in d d = 2 Controllo se d ≠ 0 è vero Controllo se d>0 è vero Fai la scansione di tutti i numeri compresi fra 1 e il minimo tra x ed y. Per ognuno stabilisci se è un divisore comune ad x ed y (come? b è divisore di a se a mod b = 0, ovvero se la divisione di a per b dà come resto 0). Ogni volta che un numero preso in considerazione risulta divisore sia di x che di y memorizzalo come attuale MCD in una variabile all’inizio posta a 1. Alla fine della scansione la variabile conterrà il valore desiderato. Visualizzo “Il massimo è 8” Fine Daniela Fogli – Elementi di Informatica e Programmazione ‘numeri uguali’ fine x (supponiamo che il numero acquisito sia 8, quindi in memoria si avrà x=8) 2 3 4 5 6 sì d≠0 ‘Il max è’, ← x Esecuzione passo passo del programma 1 no 35 Daniela Fogli – Elementi di Informatica e Programmazione 36 Algoritmo per il Massimo Comune Divisore inizio Diagramma di flusso dell’algoritmo che risolve il problema 2 Descrizione dell’algoritmo in linguaggio naturale: Leggi un valore dall’esterno e inseriscilo nella variabile x Leggi un valore dall’esterno e inseriscilo nella variabile y Se x < y allora min ← x altrimenti min ← y mcd ← 1 contatore ← 1 Finché (contatore <= min) ripeti Se ((x mod contatore = 0) e (y mod contatore = 0)) mcd ← contatore allora contatore ← contatore + 1 fine ciclo Stampa “MCD =“ seguito dal valore in mcd Fine x← y← sì min ← x no … e se x e y sono uguali? … e il ramo “altrimenti” ? sì no mcd ← contatore contatore ← contatore + 1 Daniela Fogli – Elementi di Informatica e Programmazione 37 38 Esecuzione passo passo dell’algoritmo (cont.) Lettura di due numeri e memorizzazione nelle variabili x e y (supponiamo di acquisire 6 e 9, quindi in memoria si avrà x=6 e y=9) Controllo se x < y è vero min ← 6 mcd ← 1, contatore ← 1 controllo se (contatore <= min) è vero controllo se ((x mod contatore = 0) e (y mod contatore = 0)), cioè se 6 è divisibile per 1 e 9 è divisibile per 1 è vero mcd ← 1 contatore ← 2 controllo se (contatore <= min) è vero controllo se ((x mod contatore = 0) e (y mod contatore = 0)), cioè se 6 è divisibile per 2 e 9 è divisibile per 2 non è vero Daniela Fogli – Elementi di Informatica e Programmazione sì (x mod contatore = 0) AND (y mod contatore = 0) ‘MCD =’, ← mcd Esecuzione passo passo dell’algoritmo 7 8 9 10 Ciclo a condizione iniziale contatore<=min Daniela Fogli – Elementi di Informatica e Programmazione 2 3 4 5 6 min ← y mcd ← 1 contatore ← 1 fine 1. no x<y 11 12 13 14 15 16 17 18 19 20 39 contatore ← 3 controllo se (contatore <= min) è vero controllo se ((x mod contatore = 0) e (y mod contatore = 0)), cioè se 6 è divisibile per 3 e 9 è divisibile per 3 è vero mcd ← 3 contatore ← 4 controllo se (contatore <= min) è vero controllo se ((x mod contatore = 0) e (y mod contatore = 0)), cioè se 6 è divisibile per 4 e 9 è divisibile per 4 non è vero contatore ← 5 controllo se (contatore <= min) è vero controllo se ((x mod contatore = 0) e (y mod contatore = 0)), cioè se 6 è divisibile per 5 e 9 è divisibile per 5 non è vero Daniela Fogli – Elementi di Informatica e Programmazione 40 Esecuzione passo passo dell’algoritmo (cont.) Esempio: Algoritmo di Euclide Algoritmo di Euclide per il calcolo del Massimo Comun Divisore (MCD) di due interi un altro algoritmo che risolve lo stesso problema 21 contatore ← 6 22 controllo se (contatore <= min) è vero 23 controllo se ((x mod contatore = 0) e (y mod contatore = 0)), cioè se 6 è divisibile per 6 e 9 è divisibile per 6 non è vero 24 contatore ← 7 25 controllo se (contatore <= min) non è vero 26 Stampa “MCD = 3” (cioè stampo il valore nella variabile mcd) Descrizione dell’algoritmo in linguaggio naturale: Leggi un valore dall’esterno e inseriscilo nella variabile x Leggi un valore dall’esterno e inseriscilo nella variabile y Se x < y allora scambia x con y Dividi x per y: sia q il quoziente ed r il resto (cioè q ← x div y; r ← x mod y)* Finché r ≠ 0 ripeti x ←y y←r q ← x div y r ← x mod y Fine ciclo Visualizza “MCD = ” seguita dal valore in y * div = divisione Fine intera, mod = resto Esercizio: Rifare l’esecuzione passo passo assumendo di acquisire x = 18 e y = 12 della divisione Daniela Fogli – Elementi di Informatica e Programmazione Daniela Fogli – Elementi di Informatica e Programmazione 41 42 Esecuzione passo passo dell’algoritmo di Euclide che risolve il problema 2 inizio x← y← sì Diagramma di flusso che descrive l’algoritmo di Euclide (che risolve il problema 2) 1 x<y nota: per realizzare lo scambio ho bisogno di una variabile di appoggio (a) no a←x x←y y←a 2 3 4 5 6 7 8 9 10 q ← x div y r ← x mod y r≠0 no sì x←y y←r ‘MCD =’, ← y Lettura di due numeri e memorizzazione nelle variabili x e y (supponiamo di acquisire 6 e 9, quindi in memoria si avrà x=6 e y=9) Controllo se x < y è vero Faccio lo scambio: a ←6, x ←9, y ←6 q ← x div y (q ← 1), r ← x mod y (r ← 3) controllo se r ≠ 0 è vero x ← y (x ← 6), y ← r (y ← 3) q ← x div y (q ← 2), r ← x mod y (r ← 0) controllo se r ≠ 0 non è vero Stampa/visualizza “MCD = 3” Esercizio: Fine Rifare l’esecuzione passo passo assumendo di acquisire x = 18 e y = 12 q ← x div y r ← x mod y fine Daniela Fogli – Elementi di Informatica e Programmazione 43 Daniela Fogli – Elementi di Informatica e Programmazione 44 L’algoritmo di Euclide in forma più semplice Algoritmo di Euclide Si basa sulla constatazione che: Se x = y allora MCD(x,y) = x (oppure y) Se x ≠ y allora, supponendo x > y, MCD(x,y) = MCD(x-y,y) Infatti: 1. Se x > y e k è un divisore comune a x e a y, allora k è anche un divisore di x-y. Infatti x = k * d e y = k * r per qualche intero positivo d e r. Quindi: x-y = k*(d-r), essendo (d-r) ancora un intero positivo 2. Allo stesso modo è possibile dimostrare che se k è un divisore comune ad x-y e a y allora è un divisore anche di x 3. Quindi tutti i divisori comuni di x e y coincidono con i divisori comuni di x-y e y, dunque anche i massimi comuni divisori fra le due coppie di numeri coincidono Quindi: Se x > y Descrizione dell’algoritmo in linguaggio naturale: Leggi un valore dall’esterno e inseriscilo nella variabile x Leggi un valore dall’esterno e inseriscilo nella variabile y Finché x ≠ y ripeti Se x > y allora x ← x – y altrimenti y = y – x Fine ciclo Visualizza la frase “MCD = ” seguita dal valore in y Fine allora MCD(x,y) = MCD(x-y,y) altrimenti MCD(y,x) = MCD(y-x,x) Daniela Fogli – Elementi di Informatica e Programmazione Daniela Fogli – Elementi di Informatica e Programmazione 45 46 Esecuzione passo passo dell’algoritmo inizio x← y← Diagramma di flusso dell’algoritmo di Euclide (versione semplificata) Lettura di due numeri e memorizzazione nelle variabili x e y (supponiamo di acquisire 6 e 9, quindi in memoria si avrà x=6 e y=9) 2. Controllo se x ≠ y è vero 3. Controllo se x > y non è vero 4. y ← 3 (infatti: y ← 9 – 6) 5. Controllo se x ≠ y è vero 6. Controllo se x > y è vero 7. x ← 3 (infatti: x ← 6 – 3) 8. Controllo se x ≠ y non è vero 9. Stampa/visualizza “MCD = 3” Esercizio: 10. Fine 1. no x≠y sì sì no x>y x←x–y y←y –x ‘MCD =’, ← y Rifare l’esecuzione passo passo assumendo di acquisire x = 24 e y = 9 fine Daniela Fogli – Elementi di Informatica e Programmazione 47 Daniela Fogli – Elementi di Informatica e Programmazione 48 Due proprietà degli algoritmi Esempio: Problema 3 Determinare il massimo fra n numeri positivi, finchè non si inserisce 0 Correttezza: l’algoritmo risolve il problema per cui è stato progettato (efficacia). Gli algoritmi visti per il Descrizione dell’algoritmo in linguaggio naturale: max ← 0 (nota: la variabile max conterrà il risultato finale) Leggi un valore dall’esterno e inseriscilo nella variabile x Finché x ≠ 0 ripeti chiama il sottoprogramma Massimo(x, max) e inserisci il risultato nella variabile c Se c è uguale a ‘Vero’ allora max ← x Leggi un valore dall’esterno e inseriscilo nella variabile x Fine ciclo Stampa “Il massimo è” seguita dal valore contenuto in max Fine problema 2 sono tutti corretti rispetto al problema di calcolare il MCD Complessità: legata al numero di istruzioni eseguite, cioè di passi di computazione, necessari per risolvere il problema (efficienza). Il primo algoritmo visto per il calcolo del MCD è più complesso degli altri due (a parità di dati iniziali, 26 passi col primo e 10 passi con il secondo e il terzo) NOTA: Massimo(x,max) è un sottoprogramma che descrive la soluzione del seguente sottoproblema: ricevendo in ingresso x e max, ritorna un valore Vero se x>=max e un valore Falso se x<max (leggermente diverso dal problema 1… esercizio: fare lo schema a blocchi) Daniela Fogli – Elementi di Informatica e Programmazione 49 max ← 0 Calcolo della moltiplicazione fra due numeri naturali x e y utilizzando solo operazioni di somma e sottrazione x← Diagramma di flusso dell’algoritmo che risolve il problema 3 no Descrizione dell’algoritmo in linguaggio naturale: Leggi un valore dall’esterno e inseriscilo nella variabile x Leggi un valore dall’esterno e inseriscilo nella variabile y z←0 Finché y > 0 ripeti z←z+x y←y–1 Fine ciclo Stampa/visualizza la frase “Prodotto = ” seguita dal valore in z Fine sì x≠0 c ← Massimo (x,max) c=‘Vero’ ‘Il massimo è’, ← max 50 Calcolo della moltiplicazione Esercizio: Fare l’esecuzione passo passo assumendo di acquisire la sequenza 3,5,1,4,0 inizio Daniela Fogli – Elementi di Informatica e Programmazione no sì max ← x x← fine Daniela Fogli – Elementi di Informatica e Programmazione 51 Daniela Fogli – Elementi di Informatica e Programmazione 52 Esecuzione passo passo dell’algoritmo inizio Diagramma di flusso dell’algoritmo della moltiplicazione x← y← 1. z←0 2. 3. 4. 5. y>0 no sì 6. z←z+x y←y–1 7. 8. 9. 10. 11. ‘Prodotto =’, ← z 12. 13. 14. 15. fine Daniela Fogli – Elementi di Informatica e Programmazione Lettura di un numero e memorizzazione nella variabile x (supponiamo x=8) Lettura di un numero e memorizzazione nella variabile y (supponiamo y=3) Assegna 0 alla variabile z (che conterrà il risultato) Controllo se y > 0 è vero z=0+8=8 y=3–1=2 Controllo se y > 0 è vero z = 8 + 8 = 16 y=2–1=1 Controllo se y > 0 è vero z = 16 + 8 = 24 y=1–1=0 Controllo se y > 0 non è vero Stampa/visualizza “Prodotto = 24” Fine Daniela Fogli – Elementi di Informatica e Programmazione 53 54 Calcolo di xy inizio x← y← Calcolo di xy (con x e y numeri naturali) utilizzando il sottoprogramma ‘moltiplica(a,b)’ z←1 Descrizione dell’algoritmo in linguaggio naturale: Leggi un valore dall’esterno e inseriscilo nella variabile x Leggi un valore dall’esterno e inseriscilo nella variabile y z←1 Finché y > 0 ripeti z ← moltiplica(z, x) y←y–1 Fine ciclo Stampa/visualizza la frase “xy = ” seguita dal valore in z Fine Diagramma di flusso dell’algoritmo per il calcolo di xy sì z ← moltiplica(z,x) y←y–1 ‘xy =’, ← z fine * il sottoprogramma ‘moltiplica(a,b)’ riceve in ingresso due numeri naturali e ne restituisce il prodotto (può essere ad esempio definito attraverso l’algoritmo precedente) Daniela Fogli – Elementi di Informatica e Programmazione y>0 no 55 Daniela Fogli – Elementi di Informatica e Programmazione chiamata di un sottoprogramma 56 Esecuzione passo passo dell’algoritmo 1 2 3 4 5 6 7 8 9 Esecuzione passo passo dell’ algoritmo (cont.) Lettura di un numero e memorizzazione nella variabile x (supponiamo x=2) Lettura di un numero e memorizzazione nella variabile y (supponiamo y=4) Assegna 1 alla variabile z (che conterrà il risultato) Controllo se y > 0 è vero z = moltiplica(1, 2) = 2 y=4–1=3 Controllo se y > 0 è vero z = moltiplica(2, 2) = 4 y=3–1=2 Controllo se y > 0 è vero Daniela Fogli – Elementi di Informatica e Programmazione 10 z = moltiplica(4, 2) = 8 11 y=2–1=1 12 Controllo se y > 0 è vero 13 z = moltiplica(8, 2) = 16 14 y=1–1=0 15 Controllo se y > 0 non è vero 16 Stampa/visualizza “xy = ”, z 17 Fine Daniela Fogli – Elementi di Informatica e Programmazione 57 Calcolo del fattoriale 58 inizio N← Calcolo del fattoriale del numero N sì N! = N x (N-1) x (N-2) x … x 1 Esempio: 5! = 5 x 4 x 3 x 2 x 1 = 120 no N<0 ‘Errore nell’inserimento…’ Descrizione dell’algoritmo in linguaggio naturale: Inizio ciclo Leggi un valore dall’esterno e inseriscilo nella variabile N Se N < 0 allora Stampa/visualizza la frase “Errore nell’inserimento del valore di N” Torna a Inizio Ciclo Finché N < 0 fattoriale ← 1 no Diagramma di flusso dell’algoritmo del fattoriale fattoriale ← 1 Finché N > 1 ripeti fattoriale ← fattoriale x N N←N–1 Fine ciclo Stampa/visualizza la frase “Fattoriale = ” seguita dal valore in fattoriale Fine N>1 sì fattoriale ← fattoriale * N N←N–1 ‘Fattoriale =’, ← fattoriale fine Daniela Fogli – Elementi di Informatica e Programmazione 59 Daniela Fogli – Elementi di Informatica e Programmazione 60 Esecuzione passo passo dell’algoritmo 1 Esercizio 1 Lettura di un numero e memorizzazione nella variabile N (supponiamo Scrivere l’algoritmo (in linguaggio naturale e con un diagramma di flusso) per il seguente problema: l’esecutore deve leggere in ingresso una sequenza di numeri naturali (i.e. interi positivi strettamente maggiori di zero) e calcolarne (per poi visualizzarli) il massimo, il minimo e la media La sequenza si interrompe non appena viene introdotto un numero negativo o uguale a zero Per esempio, data la sequenza 5, 1, 2, 3, 6, -5, il risultato deve essere: “Il massimo è 6, il minimo è 1, la media è 3.4” mentre, data la sequenza -2, il risultato deve essere “La sequenza inserita è nulla” Fare l’esecuzione passo-passo dell’algoritmo nei 2 casi sopra menzionati N=4) 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Controllo se N < 0 non è vero Assegna 1 alla variabile fattoriale (che conterrà il risultato) Controllo se N > 1 è vero fattoriale = 1 * 4 = 4 N=4–1=3 Controllo se N > 1 è vero fattoriale = 4 * 3 = 12 N=3–1=2 Controllo se N > 1 è vero fattoriale = 12 * 2 = 24 N=2–1=1 Controllo se N > 1 non è vero (esce dal ciclo) Stampa/visualizza “Fattoriale = 24” Fine Daniela Fogli – Elementi di Informatica e Programmazione Daniela Fogli – Elementi di Informatica e Programmazione 61 Esercizio 2 r Sia y = 62 Esercizio 3 1 k ∑i Sia y = i =q i 1 ∑ (∑ i + j ) i =1 2 j =1 Scrivere l’algoritmo in linguaggio naturale e il diagramma di flusso per il calcolo di y assumendo di acquisire k dall’esterno (dato di input) controllando che k sia intero positivo. In caso di errata immissione continuare a chiedere k. Scrivere l’algoritmo in linguaggio naturale e il diagramma di flusso per il calcolo di y assumendo di acquisire r e q dall’esterno (dati di input) Nota: controllare che r e q siano interi positivi tali che r > q Daniela Fogli – Elementi di Informatica e Programmazione 63 Daniela Fogli – Elementi di Informatica e Programmazione 64 Perché gli algoritmi non bastano… Elementi di Informatica e Programmazione Un algoritmo descritto con i linguaggi visti è spesso interpretabile in modo ambiguo Dagli Algoritmi ai Programmi Non è utilizzabile da un esecutore automatico Ad esempio, in quegli algoritmi non si parlava di: Corsi di Laurea in: come sono codificati i dati come avviene l’interazione con operatori umani problemi legati alle caratteristiche fisiche: ad es. limiti nella dimensione dei numeri rappresentabili Ingegneria Civile Ingegneria per l’Ambiente e il Territorio Università degli Studi di Brescia Docente: Daniela Fogli Daniela Fogli – Elementi di Informatica e Programmazione Dall’analisi del problema all’esecuzione di un programma Programma problema analisi 2 Un programma è la descrizione formale di un algoritmo attraverso un linguaggio di programmazione proc. di risoluzione (informale) specifica Scrivere programmi è un compito complesso (alcuni programmi possono arrivare ad essere composti da alcuni milioni di righe di istruzioni) algoritmo (formale) programazione Il calcolatore esegue i programmi passo per passo: se i passi non sono completi o non sono nell’ordine corretto, oppure se ci sono dei conflitti tra i passi, il calcolatore non sarà in grado di portare a termine il suo compito programma (alto livello) traduzione Hw Daniela Fogli – Elementi di Informatica e Programmazione programma (ling. macchina) esecuzione 3 Daniela Fogli – Elementi di Informatica e Programmazione 4 Il lavoro dei programmatori Linguaggi di programmazione I programmatori Scrivono i programmi Verificano l’esecuzione dei programmi (debugging) Correggono eventuali errori Preparano le istruzioni per gli utenti finali (manuali) Modificano programmi esistenti per aumentarne l’efficienza o per adattarli a nuove esigenze I linguaggi di programmazione di alto livello sono nati per consentire uno sviluppo “rapido” e “facile” di applicazioni informatiche Questo tipo di linguaggi: hanno costrutti più vicini al ragionamento umano consentono al programmatore di descrivere i problemi a un livello di astrazione di poco inferiore a quello degli algoritmi permettono di ragionare secondo una logica vicina al problema piuttosto che alle caratteristiche fisiche del calcolatore In sintesi, permettono di descrivere l’algoritmo in un formalismo che fa uso di un insieme ridotto di termini linguistici (della lingua inglese) Con tali termini linguistici vengono formate le istruzioni che operano sui dati Le istruzioni hanno un significato preciso e univoco Ora anche utenti “poco esperti di programmazione” vengono messi in grado di scrivere programmi (linguaggi macro e di interrogazione sono presenti in molti ambienti applicativi) Daniela Fogli – Elementi di Informatica e Programmazione 5 Sintassi e semantica Daniela Fogli – Elementi di Informatica e Programmazione Cos’è in pratica un programma? Sintassi di un linguaggio: (ben formate), indipendentemente dal loro significato Un programma è dunque una sequenza di istruzioni di un linguaggio di programmazione di alto livello (ad es.: Fortran, Cobol, Basic, C, Pascal, Ada, C++, Java, Prolog, Lisp) Semantica di un linguaggio: Un programma viene poi tradotto in linguaggio macchina per essere eseguito dal calcolatore insieme delle regole che specificano la scrittura di istruzioni formalmente corrette insieme delle regole che specificano il significato di ciascuna istruzione, cioè La struttura Il significato Noi vedremo una parte del linguaggio C per scrivere programmi in C l’azione che viene compiuta quando l’istruzione viene eseguita Daniela Fogli – Elementi di Informatica e Programmazione 6 7 Daniela Fogli – Elementi di Informatica e Programmazione 8 Esempio: moltiplicazione tra numeri interi positivi Dallo pseudo-codice al programma in C inizio x← y← Aggiungiamo una dichiarazione dei dati Dati x, y interi positivi main() /* prodotto in C */ { unsigned int x, y; w, z interi z←0 int w, z; w>0 sì z←z+x w←w–1 leggi x e y scanf(“%d %d”, &x, &y); z←0 z = 0; w←y w = y; finchè w > 0 ripeti while (w > 0) z←z+x { z = z + x; w ← w –1 w = w – 1; fine ciclo ‘Prodotto =’, ← z } scrivi z printf(“%d”, z); fine fine Daniela Fogli – Elementi di Informatica e Programmazione 9 corpo del programma } Daniela Fogli – Elementi di Informatica e Programmazione 10 Dichiarazioni di variabili e assegnamento di valori Variabili e tipi Ogni variabile ha un tipo La dichiarazione della variabile ‘z’ di tipo ‘intero’ crea un contenitore per memorizzare un valore intero positivo Il tipo identifica le proprietà della variabile e le operazioni che su di essa possono essere compiute Ogni variabile viene dichiarata prima del suo utilizzo Dichiarazione del tipo delle variabili La dichiarazione associa il nome ‘z’ a tale contenitore Assegnamento dei valori alle variabili L’assegnamento usa il contenitore per memorizzarvi il valore Daniela Fogli – Elementi di Informatica e Programmazione dichiarazione variabili Risoluzione w←y no identificazione programma 11 z z Daniela Fogli – Elementi di Informatica e Programmazione 0 12 Tipi di dati in C Le istruzioni Il corpo del programma è composto da una sequenza di istruzioni Esempi di tipi in C: Char: per rappresentare caratteri Int: per rappresentare interi Float: per rappresentare numeri in virgola mobile in singola precisione (4 byte) Double: per numeri in virgola mobile in doppia precisione (8 byte) Nei linguaggi di programmazione si distinguono solitamente 3 tipi di istruzioni: Istruzioni di ingresso/uscita Istruzioni aritmetico-logiche Istruzioni di controllo Negli esempi seguenti useremo principalmente il tipo int Su variabili di tipo intero saranno applicabili operatori aritmetici (+, *, -, /, %) Daniela Fogli – Elementi di Informatica e Programmazione Daniela Fogli – Elementi di Informatica e Programmazione 13 Istruzioni di ingresso/uscita e istruzioni aritmetico-logiche Operazioni logiche Le operazioni logiche fanno riferimento a variabili o costanti di tipo booleano Le istruzioni di I/O consentono l’acquisizione (ingresso) di dati dall’esterno la presentazione dei risultati in uscita in linguaggio C: scanf (per l’input) e printf (per l’output) Al contrario di altri linguaggi, in C non esiste il tipo “boolean”, si usa il tipo int In C: Le istruzioni aritmetico-logiche consentono la manipolazione dei dati la generazione di nuovi risultati in quasi tutti i linguaggi (anche in C) sono assegnamenti sintassi (in C): nomevariabile = espressione esempio: y = (x+2)*3 Daniela Fogli – Elementi di Informatica e Programmazione 14 NOT corrisponde a ‘!’ OR corrisponde a ‘| |’ AND corrisponde a ‘&&’ Gli operatori logici restituiscono tutti un numero: 0 per “falso”, >0 per “vero” 15 Daniela Fogli – Elementi di Informatica e Programmazione 16 Esempi di utilizzo delle operazioni logiche main() { int h, i, j, k; int b1, b2, b3; … b1 = h > j; b2 = (h > j) || (j == k); b3 = b1 && b2; … Istruzioni di controllo Le istruzioni di controllo consentono di modificare il flusso di esecuzione delle istruzioni all’interno di un programma L’esecuzione sequenziale viene alterata attraverso le istruzioni di controllo che introducono dei salti Salto condizionato: il salto è condizionato al verificarsi di una condizione valutata durante l’esecuzione del programma I salti sono introdotti dalle istruzioni di controllo, ovvero: Nota: commenti delimitati da /* e */ Non sono istruzioni C ma servono al programmatore per “spiegare” il significato del codice /* b1 ← vero se h è maggiore di j */ /* b2 ← vero se h è maggiore di j o se j e k hanno lo stesso valore */ /* b3 ← vero se sia b1 che b2 sono veri */ dalle selezioni (semplici o a due vie) dai cicli (a condizione iniziale e a condizione finale) } Notare differenza fra = (per assegnamento) e == per confronto (valutazione di uguaglianza fra due valori) Daniela Fogli – Elementi di Informatica e Programmazione Selezione semplice … Sì Daniela Fogli – Elementi di Informatica e Programmazione 17 Esempio di selezione semplice main() { … V /* selezione semplice */ if (cond) {… /* blocco istruzioni */ /* eseguito solo se */ /* cond è vera */ … } … cond No blocco istruzioni … 18 B←C*D C←C+1 A=5 F main() { int A, B, C, D; … if (A = = 5) { B = C * D; C = C + 1; } … } } Daniela Fogli – Elementi di Informatica e Programmazione 19 Daniela Fogli – Elementi di Informatica e Programmazione 20 Selezione a due vie main() {… ... Sì … V /* selezione a 2 vie */ if (cond) { … /* blocco 1 */ } else { … /* blocco 2 */ } No cond blocco 1 Esempio di selezione a 2 vie F A>B A←A-B B←B-1 B←B-A A←A-1 blocco 2 … } … ... Daniela Fogli – Elementi di Informatica e Programmazione ... Si No test 1 blocco 1 Si No test 2 blocco 2 Si blocco n test n No blocco n+1 Daniela Fogli – Elementi di Informatica e Programmazione 21 Selezione a più vie main() { int A, B; … if (A > B) { A = A - B; B = B - 1; } else { B = B - A; A = A - 1; } … } 22 Ciclo a condizione iniziale main() {… /* selezione a più vie */ if (test1) { … /* blocco 1 */ } else if (test2) { … /* blocco 2 */ } … else if (testn) { … /* blocco n */ } else { … /* blocco n + 1*/ } ... } cond V Blocco istruzioni F main() {… /* ciclo a condizione iniziale */ while (cond) { /* blocco istruzioni eseguito quando cond è vero */ } … /* eseguito quando cond è falso */ } ... Daniela Fogli – Elementi di Informatica e Programmazione 23 Daniela Fogli – Elementi di Informatica e Programmazione 24 Esempio di ciclo a condizione iniziale Algoritmo di Euclide per il MCD in C inizio Tralasciamo dichiarazione dati Inizio J←0 I←0 I <= 10 V F fine I←I+1 J←J+I x← y← main() { int I, J; J = 0; I = 0; while (I <= 10) { I = I + 1; J = J + I; } } no x≠y sì sì no x>y x←x–y y←y –x main() /* MCD in C */ { int x, y; scanf(“%d”, &x); scanf(“%d”, &y); while (x != y) { if (x > y) x = x – y; else y = y – x; } printf(“%d”, y); } ‘MCD =’, ← y Esercizio: cosa fa il programma? Quali sono i valori finali di I e J? Daniela Fogli – Elementi di Informatica e Programmazione fine Daniela Fogli – Elementi di Informatica e Programmazione 25 Ciclo For Esempio di uso del ciclo For Pseudo-codice Si utilizza quando è noto a priori il numero di iterazioni da compiere Schema a blocchi Inizio Dati Ad esempio: Algoritmo che, preso in ingresso un numero n, calcola la somma dei quadrati dei numeri compresi fra 1 e n i, n, s interi n← Risoluzione Nell’algoritmo avrò un ciclo di n iterazioni (con n noto a priori, cioè prima di entrare nel ciclo) leggi n In tutti i linguaggi è previsto un costrutto del tipo “for i=1 to n do sequenza istruzioni”… la sintassi precisa ovviamente cambia da linguaggio a linguaggio for i=1 to i = n s←0 i←1 s=0 s = s + i*i fine for scrivi s Daniela Fogli – Elementi di Informatica e Programmazione 26 27 È un ciclo a condizione iniziale F i <= n V s←s+i*i i←i+1 Daniela Fogli – Elementi di Informatica e Programmazione ←s fine 28 Ciclo For in C Pseudo-codice Ciclo a condizione finale In C ... Dati i, n, s interi Risoluzione leggi n s=0 for i=1 to i = n s = s + i*i fine for main() { int i, n, s; scanf(“%d”, &n); s = 0; for ( i=1; i<=n; i++ ) { s = s + i*i; } printf(“%d”, s); } blocco istruzioni Sì cond main() { … /* ciclo a condizione finale */ do { /* blocco istruzioni eseguito almeno una volta e finchè cond rimane vera */ } while (cond) No … /* eseguito quando cond è falsa */ ... scrivi s } Daniela Fogli – Elementi di Informatica e Programmazione 29 Esempio di ciclo a condizione finale Daniela Fogli – Elementi di Informatica e Programmazione 30 Variabili strutturate: i vettori Inizio j←1 i ← 10 j←j*i i←i-1 i>0 V F ←j fine main() { int i, j; j = 1; i = 10; do { j = j * i; i = i – 1; } while (i > 0) printf(“%d”, j); } Le variabili dichiarate di un tipo predefinito diventano contenitori di singoli valori int x significa che la variabile x è un contenitore di un valore intero E se volessimo memorizzare i guadagni di 12 mesi in 12 variabili? Possiamo… a) … dichiarare dodici variabili di tipo intero: g1, g2, …, g12 b) … oppure dichiarare un VETTORE (ARRAY) g di 12 posizioni Ogni vettore ha un nome e un tipo e può contenere un numero stabilito n di elementi, ogni elemento è identificato da un indice che varia fra 1 e n Esercizio: cosa calcola questo programma? Daniela Fogli – Elementi di Informatica e Programmazione 31 Daniela Fogli – Elementi di Informatica e Programmazione 32 Esempio: somma dei guadagni di 1 anno main() { int g[12]; int w, z; Dati g[12] vettore di interi w, z interi positivi Risoluzione Esercizio Si consideri il problema di leggere una sequenza arbitraria di numeri interi in ingresso e mostrarla in uscita in ordine inverso Nota: In C il primo elemento di un array è quello con indice 0 w = 0; z = 0; while (w < 12) { z = z + g[w]; w = w + 1; } printf (“%d, z); w=1 z=0 finchè (w <= 12) ripeti z = z + g[w] w=w+1 fine ciclo scrivi z } Scrivere il corrispondente programma in C Daniela Fogli – Elementi di Informatica e Programmazione conta ← 0 fine ← 0 conta ← conta - 1 a[conta] ← conta≥0 no main() { int a[100], conta, fine; conta = 0; fine = 0; while ((conta < 100) && (!fine)) { scanf(“%d”, &a[conta]); if (a[conta] == 0) fine = 1; conta = conta + 1; } conta = conta - 1; while (conta >= 0) { printf(“%d”,a[conta]); conta = conta – 1; } } no sì sì no sì ← a[conta] fine fine ← 1 conta ← conta - 1 conta ← conta + 1 Daniela Fogli – Elementi di Informatica e Programmazione Daniela Fogli – Elementi di Informatica e Programmazione 34 Programma ‘inverti-sequenza’ (Ipotesi: massimo numero di elementi acquisibili = 100) (conta < 100) AND (fine = 0) a[conta]=0 33 Inversione della sequenza: diagramma di flusso inizio Si supponga che la fine della sequenza sia indicata dal numero 0 Ad esempio: se viene acquisita la sequenza 5, -3, 2, -1, 6, 4, 0 in uscita verrà mostrata la sequenza 0, 4, 6, -1, 2, -3, 5 Risolvere il problema usando i vettori e assumendo che il numero massimo di elementi acquisibili dall’esterno sia 100 Scrivere il diagramma di flusso 35 Daniela Fogli – Elementi di Informatica e Programmazione Potevo usare un ciclo for? 36 Variabili strutturate: matrici Matrice bidimensionale (in generale) Le matrici sono array multidimensionali, cioè i cui elementi sono identificati da più indici contemporaneamente Dati relativi al mese j-esimo Ogni indice identifica una dimensione della matrice Dati relativi al prodotto i-esimo Esempio: nella gestione del magazzino di un’azienda si vuole tenere traccia, per ognuno dei suoi 50 prodotti, della disponibilità mensile Usiamo una matrice d[i,j] dove i è l’indice che identifica l’i-esimo prodotto (1..50) e j è l’indice che identifica il mese a cui si riferisce la disponibilità (1..12) Daniela Fogli – Elementi di Informatica e Programmazione d[0,0] d[0,1] … d[1,0] d[1,1] … … d[i,j] d[50,1]d[50,2] … d[50,j] d[i,0] d[i,1] … d[i,j] F d[0,11] i < 50 V fine d[i,11] F j < 12 d[49,0] d[49,1] … d[49,j] V … d[49,11] d[i,j] ← 0 j←j+1 Daniela Fogli – Elementi di Informatica e Programmazione d[2,12] … d[i,12] … d[50,12] 38 Inizio d[1,11] … d[1,12] Daniela Fogli – Elementi di Informatica e Programmazione j←0 Indice i da 0 a 49 (per indicare i 50 prodotti) … d[2,j] d[i,1] d[i,2] i←0 d[1,j] d[1,j] Esempio: inizializzazione della matrice d ATTENZIONE: in C gli indici partono sempre da 0 d[0,j] … d[2,1] d[2,2] 37 Matrice bidimensionale (in C) Indice j da 0 a 11 (per indicare i 12 mesi) d[1,1] d[1,2] 39 i←i+1 main() /* inizializza matrice */ Ordine di { inizializzazione int i, j; d(0,0) int d[50,12]; d(0,1) i = 0; d(0,2) while (i < 50) … { d(0,11) d(1,0) j = 0; d(1,1) while (j < 12) … { d(1,11) d[i,j] = 0; … j = j + 1; … } d(49,0) i = i + 1; d(49,1) } … } Daniela Fogli – Elementi di Informatica e Programmazione d(49,11) 40 For anziché While Variabili strutturate: struct main() /* inizializza matrice */ { main() /* inizializza matrice */ int i, j; { int d[50,12]; int i, j; i = 0; int d[50,12]; while (i < 50) { j = 0; for (i = 0; i<50; i++) while (j < 12) { { for (j = 0; j<12; j++) d[i,j] = 0; d[i,j] = 0; } j = j + 1; } } i = i + 1; … anche queste avrei potuto con una sola istruzione posso } } ometterle Si supponga che per ogni elemento si vogliano però memorizzare diversi dati Ad esempio: per ogni studente si vuole memorizzare numero di matricola, nome, cognome, numero degli esami sostenuti Tipi definiti dall’utente: a partire dai tipi di dati disponibili nel linguaggio l’utente (programmatore) può definire altri tipi Ad esempio è possibile definire delle strutture Una variabile avente una certa struttura definita comprende più componenti (detti campi) omettere le parentesi graffe Daniela Fogli – Elementi di Informatica e Programmazione Daniela Fogli – Elementi di Informatica e Programmazione 41 Esempio: la struttura “studente” 42 Array di ‘struct’ e accesso diretto main() { struct studente { int matricola; char nome[30]; char cognome[30]; int num_esami; }; studente matricola = 25891 nome = Mario cognome = Rossi num_esami = 0 DEFINIZIONE DEL “TIPO” studente DICHIARAZIONE struct studente /* in C */ { int matricola; char nome[30]; char cognome[30]; int num_esami; } Nei vettori e nelle matrici gli elementi devono essere tutti dello stesso tipo struct studente stud; struct studente s[100]; … s[3].num_esami = 0; … ASSEGNAMENTO } stud.matricola = 25891; Assegna il valore 0 al numero di esami dello studente di indice 3 stud.num_esami = stud.num_esami + 1; Daniela Fogli – Elementi di Informatica e Programmazione 43 Daniela Fogli – Elementi di Informatica e Programmazione 44 I sottoprogrammi Strutturazione in sottoprogrammi Soluzione di problemi complessi Lavoro di più persone in modo coordinato La struttura dei programmi deve essere il più possibile comprensibile e modulare Ricordate il concetto di strutturazione in sottoproblemi e di Per ogni problema terminale esiste un’istruzione del linguaggio che lo risolve Ogni sottoproblema sufficientemente limitato può essere assunto come problema terminale Per ogni sottoproblema si scrive un sottoprogramma problemi elementari? I sottoprogrammi corrispondono alla soluzione di sottoproblemi A questo punto è come se il linguaggio si arricchisse di nuove istruzioni… ogni nuova istruzione è la chiamata di un sottoprogramma e quindi corrisponde all’esecuzione di un sottoprogramma (una certa sequenza di istruzioni del linguaggio di programmazione) Facilitati comprensione, controllo correttezza, manutenzione Daniela Fogli – Elementi di Informatica e Programmazione 45 46 Programma principale in pseudo-codice e in C Esempio di uso di sottoprogrammi Dati w intero z reale fine booleano Risoluzione fine = falso finchè (non fine) ripeti leggi w se (w > -1) z = media(w) scrivi z altrimenti fine = vero fine condizione fine ciclo fine Supponiamo di disporre di una matrice p contenente i valori dei fatturati relativi ai 100 prodotti di un’azienda per ogni mese dell’anno (p ha cioè 100 righe e 12 colonne) p[i,j] contiene il fatturato del prodotto i nel mese j Si vuole visualizzare il fatturato mensile medio di ogni prodotto specificato dall’utente attraverso l’inserimento dell’indice relativo al prodotto Scriviamo il programma supponendo di disporre di un sottoprogramma che calcola la media Daniela Fogli – Elementi di Informatica e Programmazione Daniela Fogli – Elementi di Informatica e Programmazione 47 main() { int w; float z; int fine; fine = 0; while (!fine) { scanf(“%d”,&w); if (w > -1) { z = media(w); printf(“%d”,z); } else fine = 1; } } Daniela Fogli – Elementi di Informatica e Programmazione 48 Due note La funzione ‘media’ Funzione media(w) Dati La variabile ‘fine’ è usata per contenere un valore booleano 0 vuol dire “falso”, >0 vuol dire “vero” (usiamo 1 in questo caso per indicare il valore “vero”) (!fine) vuole dire NOT(fine), per cui se fine=0 allora (!fine) è vero, mentre se fine>0 allora (!fine) è falso i, s interi z reale p[100,12] matrice di interi Risoluzione i = 0; s = 0; while (i < 12) { s = s + p[w][i]; i = i + 1; } z = s / 12; return (z); i=0es=0 finchè (i < 12) ripeti s = s + (p[w, i]) i=i+1 fine ciclo z = s / 12 restituisci z } fine funzione w è il parametro della funzione media La locazione p[0,0] contiene il fatturato del primo prodotto nel mese di gennaio la numerazione degli indici di vettori e matrici inizia dallo zero Se l’utente inserisce un indice (del prodotto) >-1 (cioè 0 o un numero positivo) allora viene fatto il calcolo della media e viene visualizzato il fatturato medio relativo al prodotto altrimenti l’esecuzione termina Daniela Fogli – Elementi di Informatica e Programmazione float media(int w) { int i, s; float z; int p[100][12]; 49 Daniela Fogli – Elementi di Informatica e Programmazione 50 Un altro esempio di uso di sottoprogrammi Domanda Che controllo manca nei programmi? …cosa succede se l’utente, come indice di prodotto, inserisse 120? Nella funzione ‘media’ si va ad accedere alle locazioni p[120,i] con i che varia fra 0 e 11 In ogni caso tutte queste locazioni sono al di fuori della nostra matrice! Uno stesso sottoproblema si può presentare più volte in momenti diversi Con i sottoprogrammi si riduce il numero delle istruzioni del programma Invece di ripetere la stessa sequenza di istruzioni più volte si scrive un sottoprogramma e lo si richiama tutte le volte che serve Esempio: calcolo di z = x2 + y2 Le stesse funzioni scanf e printf del C che abbiamo visto sono sottoprogrammi disponibili in (una libreria del) C Daniela Fogli – Elementi di Informatica e Programmazione 51 Daniela Fogli – Elementi di Informatica e Programmazione 52 Calcolo di Inizio leggi xey w ←x z ←0 V w> 0 z ←z+ +x w ←w -1 F x2 ←z w ←y z ←0 V w> 0 z ←z+ +y w ←w -1 F y2 ←z q ←x2+y2 scrivi “x2+ y2=q” I prodotti x*x e y*y sono ottenuti con somme successive fine x2 + Calcolo di x2 + y2 con chiamata di sottoprogramma y2 Funzione quad(a) main() { int x,y,x2,y2,q,w,z; scanf(“%d %d”,&x,&y); w = x; z = 0; while (w > 0) { z = z + x; w = w – 1; } x2 = z; w = y; z = 0; while (w > 0) { z = z + y; w = w - 1; } y2 = z; q = x2+y2; printf(“%d”,q); } Funzione quad (a) leggi xey V z ←z + a w ←w -1 w> 0 F Esercizio w←a z←0 Scrivere la funzione quad e il main in C x2 ←quad(x) y2 ←quad(y) V w> 0 F z ←z + a w ←w-1 q ← x2 + y2 scrivi “x2+ y2=q” ritorna z Daniela Fogli – Elementi di Informatica e Programmazione 53 La funzione ‘quad’ w←a z←0 Inizio fine Daniela Fogli – Elementi di Informatica e Programmazione Funzione quad (a) Calcolo di x2 + y2 Programma principale Inizio int quad(int a) { int w, z; w = a; z = 0; while (w > 0) { z = z + a; w = w - 1; } return (z); } main() { int x, y, x2, y2, q; scanf(“%d”,&x); scanf(“%d”,&y); x2 = quad(x); y2 = quad(y); q = x2 + y2; printf(“%d”,q); leggi xey x2 ←quad(x) y2 ←quad(y) } q ← x2 + y2 scrivi y2=q” “x2+ ritorna z fine Daniela Fogli – Elementi di Informatica e Programmazione 54 55 Chiamata di funzione a cui viene passato il parametro y Chiamata di funzione a cui viene passato il parametro x Daniela Fogli – Elementi di Informatica e Programmazione 56 Elementi di Informatica e Programmazione Il punto della situazione… STATO DATI Linguaggi di programmazione di alto livello, ambienti di programmazione sottosistema di ingresso-uscita periferica Corsi di Laurea in: periferica sottosistema unità centrale-memoria interfaccia di ingresso-uscita unità centrale interfaccia di ingresso-uscita Ingegneria Civile Ingegneria per l’Ambiente e il Territorio memoria centrale Università degli Studi di Brescia bus di sistema Docente: Daniela Fogli Daniela Fogli – Elementi di Informatica e Programmazione Limiti del linguaggio Assembler 2 Un passo indietro sull’Assembler … Esempio: gestione e ordinamento di una rubrica telefonica: Esempio: salto condizionato (beq = branch if equal) sarebbe poco praticabile ricorrere al linguaggio assembler istruzioni dati 0101011110011001 1101011110011111 0111000000011001 1101011100011101 0110011110011001 0101000111011000 1010011110011001 0101111110000000 0101010010011001 0111000000011001 0101000111011000 0101111110000000 0101000111011000 0101110111011000 MEMORIA … i==j Ciclo: add $r1, $r1, $r1 sì sub $r1, $r1, 1 beq $r1, $zero, ciclo no f ←g + h f ←f - i … Supponendo che f, g, h, i, j corrispondano ai registri $r0, $r1, $r2, $r3, $r4, la specifica in Assembler potrebbe essere la seguente Strutture di controllo: solo salti (condiz/incond) Programma “monolitico” (no sotto-programmi) Dati “troppo elementari” (numeri con segno / virgola mobile) Daniela Fogli – Elementi di Informatica e Programmazione 3 beq add L1: sub $r3, $r4, L1 $r0, $r1, $r2 $r0, $r0, $r3 # va a L1 se i è uguale a j #f=g+h #f=f-i Daniela Fogli – Elementi di Informatica e Programmazione 4 Linguaggi di programmazione di alto livello Un passo indietro sull’Assembler … Esempio: salto condizionato e salto incondizionato sì i!=j f ←g + h Permettono di specificare gli algoritmi in maniera no Precisa (termini linguistici di significato preciso e univoco) Ma più “astratta” rispetto al linguaggio macchina f ←g - h Ciascuna istruzione in un linguaggio di alto livello corrisponde solitamente a più istruzioni in linguaggio macchina Supponendo che f, g, h, i, j corrispondano ai registri $r0, $r1, $r2, $r3, $r4, la traduzione potrebbe essere la seguente bne $r3, $r4, Allora # branch if not equal sub $r0, $r1, $r2 j Esci Allora: add Esci: Vantaggi principali: consentono lo sviluppo di sistemi complessi gli errori commessi sono inferiori il codice è più facile da “mantenere” indipendenza dalla macchina # salto incondizionato (jump) $r0, $r1, $r2 … Daniela Fogli – Elementi di Informatica e Programmazione Tre tipi di istruzioni L’insieme delle caratteristiche che determina il modo di affrontare il progetto e la codifica di un programma, lo “stile di programmazione” Istruzioni di ingresso/uscita Istruzioni aritmetico-logiche Ruolo centrale dell’assegnamento Ad oggetti Imperativo Pascal, Cobol, C… C++, Java, VisualBasic,… Funzionale Lisp, APL, Haskell 6 Il paradigma imperativo Paradigmi di programmazione - Daniela Fogli – Elementi di Informatica e Programmazione 5 NB: le stesse del linguaggio macchina! Istruzioni di controllo Diversi tipi di astrazione CLOS Astrazione sui dati Tipi di dati predefiniti e definiti dal programmatore (vs. codici binari) Logico Prolog Astrazione sul controllo Prolog++ Condizionali e cicli (vs. istruz di salto condiz/incondiz) Astrazione procedurale (scarso supporto da ling. macchina) Daniela Fogli – Elementi di Informatica e Programmazione 7 Daniela Fogli – Elementi di Informatica e Programmazione 8 Astrazione sul controllo: esempio Astrazione procedurale Soluzione di problemi complessi (eventualmente lavoro di più persone in modo coordinato): è utile scomporre un programma in sotto-programmi, detti procedure // A, B, C, D costanti… V B←C*D C←C*2 A=B F main() /* C */ { int A, B, C, D; … if (A = = B) { B = C * D; C = C * 2; } … } lw $r1, $r0, A lw $r2, $r0, B lw $r3, $r0, C lw $r4, $r0, D … bne $r1, $r2, CONT mul $r2, $r3, $r4 sw $r2, $r0, B add $r3, $r3, $r3 sw $r3, $r0, C Facilitano leggibilità, funzionalità (controllo correttezza), manutenzione del programma Definizione di una procedura (nome + corpo istruzioni): nome_procedura(<parametri formali>) { istruzioni…} Parametri formali: sono gli argomenti della procedura (passati dalla procedura o dal programma chiamante): variabili utilizzate dalla procedura al suo interno CONT: … Daniela Fogli – Elementi di Informatica e Programmazione 9 Daniela Fogli – Elementi di Informatica e Programmazione 10 Passaggio dei parametri: 2 modalità Astrazione procedurale (cont.) Chiamata di una procedura nel programma: nome_procedura (<parametri attuali>) Parametri attuali: variabili o espressioni il cui valore Passaggio per valore: il corrispondente parametro attuale non è modificato (viene fatta una copia) Passaggio per indirizzo: la zona di memoria del parametro formale non contiene il valore, ma l’indirizzo del parametro attuale; tutte le operazioni sul parametro formale sono in realtà effettuate sul parametro attuale è attribuito ai parametri formali (passaggio dei parametri) I tipi dei parametri attuali devono corrispondere ai parametri formali Effetto della chiamata: In C è disponibile solo il passaggio per valore passaggio dei parametri controllo passato alla procedura, le cui istruzioni vengono eseguite (poi il controllo ritorna all’istruzione successiva alla chiamata) Daniela Fogli – Elementi di Informatica e Programmazione 11 Daniela Fogli – Elementi di Informatica e Programmazione 12 Esempio (in C) int calcolaFattoriale(int w) { int fatt; fatt=1; while (w>0) { fatt = fatt * w; w = w – 1; } return fatt; PROGRAMMA CHIAMANTE Se fosse un passaggio per indirizzo PROGRAMMA CHIAMATO CHIAMATA numero w int calcolaFattoriale(int w) { int fatt; fatt=1; while (w>0) { fatt = fatt * w; CHIAMATA w = w – 1; numero } PROGRAMMA CHIAMANTE PROGRAMMA CHIAMATO indirizzo di “numero” w return fatt; RITORNO } } fatt fattoriale main() { int numero, fattoriale; …. numero = 5; fattoriale = calcolaFattoriale(numero); printf (“%d”, fattoriale); } Al ritorno dal programma chiamato la variabile numero ha ancora valore 5 Daniela Fogli – Elementi di Informatica e Programmazione Al ritorno dal programma chiamato la variabile “numero” avrebbe valore 0 main() { int numero, fattoriale; …. numero = 5; fattoriale = calcolaFattoriale(numero); printf (“%d”, fattoriale); } MA IN C NON E’ COSI’ Daniela Fogli – Elementi di Informatica e Programmazione 13 Oltre il paradigma imperativo 14 Paradigma Funzionale Il paradigma imperativo si basa sul modello di calcolatore di Von Neumann (variabili come diretta astrazione delle parole di memoria, esecuzione stessa di un programma, …) Programma ≡ Funzione: In Out Esecuzione di un programma ≡ Valutazione di una funzione in corrispondenza di determinati valori di ingresso Paradigma funzionale: si basa sull’osservazione che ogni programma può essere formulato come la definizione di una funzione dall’insieme delle variabili di ingresso all’insieme delle variabili di uscita Esempio: fattoriale(n) ≡ Paradigma logico: si basa sull’osservazione che ogni programma può essere formulato come un’asserzione della quale si voglia dimostrare la verità (o la falsità); la prova dell’asserzione corrisponde all’esecuzione del programma if n=0 then 1 else n * fattoriale(n-1) si basa sulla definizione del fattoriale usa una chiamata ricorsiva Capostipite dei linguaggi funzionali è il LISP Daniela Fogli – Elementi di Informatica e Programmazione 15 Daniela Fogli – Elementi di Informatica e Programmazione 16 Paradigma Logico Paradigma logico: esempio (cont.) Consideriamo le seguenti asserzioni: genitore(abele, caino) figlio(caino, adamo) genitore(adamo, X) nonno(abele, X) Un programma logico è costituito da: Assiomi: asserzioni ritenute sempre vere nel dominio considerato Regole di inferenza: definiscono relazioni Asserzioni: rappresentano relazioni delle quali si vuole conoscere se sono vere o false L’esecuzione del programma genitore(abele, caino) figlio(caino, adamo) genitore(adamo, X) nonno(abele, X) Esempio: genitore(adamo, caino) genitore(adamo, abele) genitore(eva, abele) assiomi genitore(Y,X) => figlio(Y,X) genitore(X,Z), genitore(Z,Y) => nonno(X,Y) Capostipite dei linguaggi logici è il PROLOG regole di inferenza Daniela Fogli – Elementi di Informatica e Programmazione produce: falso vero vero per X = caino e X = abele vero per X = nessun valore Daniela Fogli – Elementi di Informatica e Programmazione 17 18 Occultamento e Incapsulazione nei linguaggi imperativi La programmazione a oggetti Con i linguaggi imperativi possiamo suddividere il programma in sotto-programmi, ognuno ha due parti: Nella programmazione ad oggetti, un programma è composto da un insieme oggetti che rappresenta una realtà di interesse Un programma in esecuzione è un insieme dinamico di oggetti che interagiscono tra loro Esempio: programma per la gestione della segreteria studenti dell’università sarà composto di oggetti che rappresentano oggetti concreti della realtà di interesse (gli studenti) e le entità concettuali relative (esami sostenuti, piani di studio, …) Esempi di linguaggi a oggetti: Java, VisualBasic, C# Interfaccia: la specifica delle funzionalità [e.g. function media(w as integer), function radice(i as integer)] Corpo: concreta implementazione delle funzionalità Realizza information hiding (“occultamento delle informazioni”) a livello di funzionalità Possiamo anche creare delle “strutture dati”, esempio: struct punto { float x; float y; float z;} Ma esse sono accessibili completamente dai moduli del programma che definiscono le procedure per accedere ai dati, manipolandone la struttura interna Daniela Fogli – Elementi di Informatica e Programmazione 19 Daniela Fogli – Elementi di Informatica e Programmazione 20 Occultamento e Incapsulazione nella Programmazione ad Oggetti Caratteristiche di un oggetto Usiamo un’analogia: il televisore* Realizza l’occultamento sia delle funzionalità che delle strutture dati Un oggetto realizza l’incapsulazione di una struttura dati: nasconde una struttura per la memorizzazione dei dati, rendendo disponibili all’esterno le procedure per accedervi e modificarla Realizza il principio dell’information hiding nella sua forma più completa ⇒ ha un nome per referenziarlo (lo chiamiamo televisore) ⇒ ha un comportamento ⇒ ha delle proprietà (dette anche attributi) Se cambia la rappresentazione interna dei dati, ma le definizioni delle procedure rimangono invariate, le modalità di utilizzo dell’oggetto dall’esterno non cambiano *Tratto da [Luca Cabibbo, “Fondamenti di informatica – Oggetti e Java”, McGraw Hill, 2004] Daniela Fogli – Elementi di Informatica e Programmazione 21 Il comportamento Daniela Fogli – Elementi di Informatica e Programmazione 22 Oggetti software e comportamento Il televisore sa fare delle cose: Sa accendersi Sa sintonizzarsi su un canale Sa variare il volume Sa spegnersi Anche un oggetto software sa eseguire delle operazioni che ne caratterizzano il comportamento Le operazioni sono dette metodi dell’oggetto Nella programmazione ad oggetti, la richiesta a un oggetto di eseguire un’operazione viene fatta attraverso l’invio di un messaggio all’oggetto (ovvero l’invocazione di un metodo) Obiezione: è l’utente che fa fare al televisore certe cose! No! L’utente richiede al televisore di eseguire queste operazioni, e il televisore le esegue Quando l’oggetto riceve un messaggio che è la richiesta di esecuzione di una operazione, allora esegue l’operazione richiesta L’utente invia un comando al televisore Daniela Fogli – Elementi di Informatica e Programmazione 23 Daniela Fogli – Elementi di Informatica e Programmazione 24 Le proprietà (o attributi) Lo stato di un oggetto Torniamo alla nostra analogia In ogni istante di tempo il televisore è in un certo stato Proprietà del televisore: Lo stato del televisore è descritto dai valori delle sue proprietà in un dato istante Accensione: descrive se il televisore è acceso o spento Canale: descrive il canale su cui il televisore è sintonizzato Volume: descrive il volume del televisore Esempio: Accensione = il televisore è acceso Canale = il televisore è sintonizzato sul canale 3 Volume = il volume del televisore è 8 Ciascuna proprietà è caratterizzata da: Nome Valore corrente Insieme dei valori ammessi per quella proprietà Nome → canale L’insieme dei valori (acceso, 3, 8) identificano lo stato attuale del televisore Valore corrente → 3 Insieme dei valori ammessi → 1..99 Daniela Fogli – Elementi di Informatica e Programmazione Daniela Fogli – Elementi di Informatica e Programmazione 25 26 Relazione fra metodi, proprietà e stato di un oggetto Lo stato di un oggetto software L’effetto dell’invocazione di un metodo di un oggetto consiste solitamente in un cambiamento dello stato dell’oggetto che la esegue Ciascun oggetto software ha uno stato Lo stato di un oggetto software è descritto da un insieme di proprietà Esempio: invocazione del metodo che fa variare il volume il valore della proprietà volume del televisore viene opportunamente cambiato Lo stato corrente di un oggetto software è dato dai valori correnti delle sue proprietà Cambiamento di una proprietà = cambiamento del valore corrente della proprietà (non del nome, né dell’insieme dei valori ammessi) Daniela Fogli – Elementi di Informatica e Programmazione 27 Daniela Fogli – Elementi di Informatica e Programmazione 28 Esempio di “classe” (in un linguaggio inventato) Oggetti e classi class punto Così come una variabile viene dichiarata a partire da un determinato tipo, anche un oggetto è dichiarato come istanza di una particolare classe La dichiarazione di una classe equivale a dichiarare il tipo di tutti public punto(float x, float y, float z) sposta(float dx, float dy, float dz) Parte visibile all’esterno (interfaccia) private attributi gli oggetti di quella classe Una classe definisce quindi le caratteristiche comuni degli oggetti che da essa possono essere creati (struttura interna e comportamento) Per lavorare su un elemento della classe bisogna creare un oggetto di quella classe (creare un’istanza) Tra i metodi di una classe esiste anche il costruttore, che specifica le modalità di creazione degli oggetti costruttore float cx; float cy; float cz; punto(float x, float y, float z) cx = x cy = y cz = z end sposta(float dx, float dy, float dz) cx = cx + dx cy = cy + dy cz = cz + dz end Parte non visibile all’esterno (comprende attributi e implementazione dei metodi) end-class Daniela Fogli – Elementi di Informatica e Programmazione 29 Creazione di un’istanza e uso Daniela Fogli – Elementi di Informatica e Programmazione 30 Programmazione ad oggetti Si fonda sulla distinzione fra due attività: Quella di creazione di classi Quella di uso di classi esistenti (creare istanze) Es. nella programmazione di un’interfaccia utente Posso programmare una nuova classe “pulsante” Posso programmare per istanziare la classe “button” già a disposizione nell’ambiente di sviluppo Definisco un oggetto di tipo “punto” class punto mio-punto Creo l’istanza invocando il costruttore con i parametri (per inizializzazione) mio-punto.punto(0, 0, 0) Un programmatore può fare entrambe le attività, ma la forza della programmazione ad oggetti sta proprio nella riusabilità di programmi già pronti (le classi) Assegno un diverso valore alle coordinate attraverso il metodo “sposta” mio-punto.sposta(7, 1, 5) Daniela Fogli – Elementi di Informatica e Programmazione 31 Daniela Fogli – Elementi di Informatica e Programmazione 32 Dall’analisi del problema all’esecuzione di un programma Traduttori I traduttori sono programmi che provvedono a convertire il codice di programmi scritti in un dato linguaggio di programmazione di alto livello, nella corrispondente rappresentazione in linguaggio macchina problema proc. di risoluzione (informale) analisi specifica algoritmo (formale) Due classi: Compilatori: traducono un programma scritto in un linguaggio di programmazione di alto livello (programma sorgente) in un programma equivalente direttamente eseguibile dal calcolatore (programma oggetto) Interpreti: traducono ed eseguono direttamente ciascuna programma (alto livello) programazione programma (ling. macchina) traduzione Hw istruzione del programma sorgente; in ingresso richiedono anche i dati iniziali esecuzione Daniela Fogli – Elementi di Informatica e Programmazione 33 compilatore linguaggio di alto livello Il programma P scritto in linguaggio L viene dato in ingresso a un programma PComp programma oggetto PComp è il programma compilatore del linguaggio L (ad esempio il programma compilatore del C) linguaggio macchina L’esecuzione da parte di un calcolatore di PComp su P (dove P è il dato di ingresso) produce Pexe PRIMA FASE segnalazione di errori L’esecuzione da parte di un calcolatore di Pexe su dei dati iniziali produce dei risultati finali SECONDA FASE dati interprete programma sorgente 34 Eseguire un programma scritto in un linguaggio compilato Compilatore e interprete programma sorgente Daniela Fogli – Elementi di Informatica e Programmazione risultati linguaggio di alto livello segnalazione di errori Daniela Fogli – Elementi di Informatica e Programmazione 35 Daniela Fogli – Elementi di Informatica e Programmazione 36 Eseguire un programma scritto in un linguaggio interpretato Domande Il programma P scritto in linguaggio L viene dato in ingresso a un programma PInt In che linguaggio sono scritti Pcomp e Pint ? PInt è il programma interprete del linguaggio L (ad esempio il programma interprete del Basic) Quali proprietà fondamentali distinguono un compilatore (o un interprete) da un altro? L’esecuzione da parte di un calcolatore di PInt su P con i dati in ingresso di P produce i risultati finali Daniela Fogli – Elementi di Informatica e Programmazione Il linguaggio di alto livello L’insieme delle istruzioni macchina (ISA) (semplificando, il tipo di processore) Il sistema operativo (lo vedremo dopo) Daniela Fogli – Elementi di Informatica e Programmazione 37 Confronto fra compilatori e interpreti Portabilità Velocità di esecuzione: i programmi compilati hanno in Si definisce portabilità la possibilità di utilizzare un programma su piattaforme hardware/software diverse da quella dove è stato sviluppato genere prestazioni migliori (nella compilazione si possono attuare processi di ottimizzazione dell’eseguibile) Messa a punto del programma: gli interpreti permettono di correggere gli errori non appena vengono scoperti, senza bisogno di ricompilare interamente il programma In conclusione: Tre modalità: portabilità del file eseguibile: richiede calcolatori con hardware e sistema operativo dello stesso tipo per il quale è stato compilato. Semplice ma restrittivo. portabilità tramite ricompilazione: richiede l’esistenza di un compilatore e di librerie per la nuova piattaforma e lo svolgimento della ricompilazione. Non fattibile dall’utente medio. portabilità tramite interpretazione: richiede l’esistenza di un interprete per la nuova piattaforma. Semplice (purchè l’interprete sia già installato) e non restrittivo. Compilazione: OK per i prodotti commerciali a larga diffusione Interpretazione: OK in fase di prototipazione Daniela Fogli – Elementi di Informatica e Programmazione 38 39 Daniela Fogli – Elementi di Informatica e Programmazione 40 Compilatore e linker Il ruolo del linker I compilatori consentono tipicamente la compilazione separata di parti di programmi (moduli oggetto) Libreria di moduli oggetto I diversi moduli possono essere progettati, costruiti e messi a punto separatamente, e archiviati in opportune librerie modulo oggetto Nel momento in cui un programma deve essere eseguito, un programma apposito, detto linker, si occupa di ritrovare e collegare opportunamente fra loro i moduli oggetto modulo oggetto modulo oggetto modulo oggetto modulo oggetto Il risultato del linker è un unico modulo, detto modulo eseguibile, pronto per il caricamento in memoria e l’esecuzione modulo oggetto modulo eseguibile linker modulo oggetto Daniela Fogli – Elementi di Informatica e Programmazione Daniela Fogli – Elementi di Informatica e Programmazione 41 42 Editor, Debugger, Strumenti di Interfaccia Alcuni ambienti di sviluppo includono gli strumenti di creazione, traduzione ed esecuzione dei programmi editor Editor: mette a disposizione le funzionalità di un programma per il trattamento di testi + strumenti che aiutano il programmatore nell’uso corretto del linguaggio, nell’inserimento di commenti, nella visualizzazione della struttura del programma Debugger: aiuta la localizzazione degli errori e la loro correzione programma sorgente consentono di arricchire il codice con delle direttive, allo scopo di aumentare le informazioni ricavabili dall’ispezione dei risultati intermedi (es. per vedere il valore di una variabile se si verifica una certa condizione, per vedere traccia dei valori assunti da una variabile) consentono di eseguire il programma in modo controllato CalcoloMedia.c (programma in C) compilatore Strumenti di interfaccia: mettono a disposizione primitive grafiche (finestre, menu, icone, bottoni, etc.) oltre a librerie di programmi che permettono la realizzazione in tempi brevi di interfacce programma oggetto CalcoloMedia.obj linker es. estensioni specifiche incluse all’interno di linguaggi, come in Visual-Basic e Visual-C librerie programma eseguibile CalcoloMedia.exe Daniela Fogli – Elementi di Informatica e Programmazione 43 Daniela Fogli – Elementi di Informatica e Programmazione 44