Sistemi Operativi … e altro. Susanna Pelagatti email: [email protected] Dipartimento di Informatica, Via Buonarroti, 2 stanza 346 DE Tel. 050.2212.772 ricevimento prima o dopo le lezioni o per appuntamento oppure per posta elettronica sito web www.di.unipi.it/~susanna/masterSO 1 Materiale Didattico • Copie Lucidi • Testi Introduttivi (per non informatici) – Sciuto, Bonanno, Fornaciari, Mari Introduzione ai sistemi informatici (seconda ed) McGraw-Hill, 2002 – Tosoratti Introduzione all’informatica (seconda ed), Casa Editrice Ambrosiana 2 Materiale Didattico (2) • Testi di approfondimento (specifici sui SO), in ordine di complessità – Sliberschatz et al. Sistemi Operativi, Addison Wesley Italia – Ancilotti et al., Sistemi Operativi, McGrowHill, 2004 – Tanenbaum, Modern Operating Systems, 2nd Edition, Prentice Hall, 2001 – Stallings, Operating Systems, Internals and Design Principles, Prentice Hall, 2004 3 Organizzazione del corso: • Le basi (8) – – – – – – Cosa è l’informatica? Algoritmi e programmi Eseguire un algoritmo sulla macchina Hardware e software Cosa è un Sistema Operativo Cenni di rappresentazione dei dati • L’hardware (4) – Il processore – Le memorie – Le periferiche 4 Organizzazione del corso (2) • Il software (16) – – – – – – Software applicativo e di sistema Caratteristiche di un sistema operativo Gestione del processore Gestione della memoria Gestione delle periferiche File System 5 Introduzione 6 Una domanda di base ... • Cos’è l’informatica ? 7 Informatica Informazione+automatica • Informazione insieme di entità astratte , che raccolgono ‘conoscenza’ derivata dallo sforzo di descrizione ed interpretazione del mondo (materiale o immateriale) – es.: un libro, una sinfonia, un quadro, un insieme di dati relativi agli studenti di un corso di laurea 8 Informatica Informazione+automatica (2) • Rappresentazione dell’informazione trascrizione e registrazione dell’informazione su supporti materiali – es: la scrittura, un CD che registra un melodia, un insieme di schede che mantengono le informazioni relative agli studenti …..secondo una opportuna codifica… – es: le convenzioni di rappresentazione dei caratteri, il formato del CD, la struttura dei campi di una scheda studente 9 Informatica Informazione+automatica (3) • Calcolatore : un supporto per la rappresentazione di informazione ‘attivo’ che può – (1) raccogliere grandi quantità di dati es: tutto l’archivio del British Museum – (2) rendere disponibili questi dati in modo istantaneo e con prospettive diverse a utenti diversi e in parti diverse del mondo es: permettendo a utenti di tutto il mondo di collegarsi a parti delle informazioni di BM via Internet, lasciando altre private (accesso ristretto all’amministrazione del museo) 10 Informatica Informazione+automatica (4) • Calcolatore (continua) un supporto per la rappresentazione di informazione ‘attivo’ che può – (3) elaborare automaticamente la rappresentazione dei dati in modo da • presentarli in modo diverso a diversi soggetti • di prendere delle decisioni in base alle proprietà degli oggetti rappresentati esempi: • stampare la lista delle opere acquisite del BM in un certo mese, • decidere se una data statua passa o no per una data porta 11 Alcuni concetti base • Informazione – l’idea di rosa • Rappresentazione dell’informazione – rosa, [CAT: fiore, NOME: rosa], 12 Alcuni concetti base (2) Consideriamo un antenato del calcolatore : il pallottoliere … – informazione : due numeri da addizionare – rappresentazione dell’informazione : i gruppi di dischetti che rappresentano ciascun numero – elaborazione dell’informazione : manipolare i due gruppi di dischetti in modo da avere un gruppo unico che rappresenti correttamente il risultato finale 13 Alcuni concetti base (3) Consideriamo un antenato del calcolatore : il pallottoliere – algoritmo : insieme di operazioni da effettuare sulla rappresentazione dell’informazione per ottenere il risultato finale, nel nostro caso • scegli una fila vuota F • sposta un disco alla volta dal primo addendo a F • sposta un disco alla volta dal secondo addendo a F • termina 14 Alcuni concetti base (4) • Peculiarità del Calcolatore – programmabilità : capacità di specializzare il dispositivo con algoritmi complessi di elaborazione dell’informazione 15 Alcuni concetti base (5) • Quindi nei moderni calcolatori – Anche loro rappresentano informazione di natura estremamente più varia • dati di vario tipo (immagini, numeri, suoni, testo, etc.) – … ma anche ... • gli algoritmi per elaborare questi dati (come sommare due numeri, come impaginare correttamente un testo etc) – La rappresentazione è uniforme : ogni cosa è rappresentata da una sequenza di zeri (0) e di uni (1) – La parte fisica (hardware) è in grado di interpretare e realizzare i passi richiesti dalle algoritmi 16 Alcuni concetti base (6) • Per specializzare il calcolatore per un nuovo compito ‘basta’ • immaginare una strategia di soluzione del compito (algoritmo) • rappresentare l’algoritmo in modo che sia comprensibile alla macchina (cioè fornire il programma che realizza quell’algoritmo) • chiedere alla macchina di decodificare il programma (cioè risalire dalla codifica ai passi di cui è composto) ed eseguirlo (cioè portare a termine i passi richiesti) 17 Sulla stessa macchina ... • elaborazione di dati medici : risonanza magnetica, TAC, presentazione • progettazione di prodotti complessi • editoria elettronica • elaborazione di dati del territorio 18 Struttura di un calcolatore • L’architettura di Von Neumann Memorie (RAM,dischi, etc) Mantiene Dati e Programmi Processore (CPU) E’ un esecutore capace di interpretare i singoli passi richiesti dai programmi (istruzioni elementari) Sottosistema di Interfaccia Permette di comunicare dati e programmi alla macchina e di ottenere i risultati (tastiera, micr., stampante, schermo, ) 19 Struttura di un calcolatore (2) Processore Memorie Sottosistema di Interfaccia bus La comunicazione fra i tre sottosistemi viene effettuata attraverso un dispositivo fisico detto bus di interconnessione. Attraverso il bus la CPU - legge\scrive dati e programmi in memoria - trasferisce da\a la memoria al dispositivo di interfaccia - recupera la prossima istruzione da eseguire 20 Struttura di un calcolatore (3) Processore Memorie Sottosistema di Interfaccia bus Il sottosistema di interfaccia cura anche la comunicazione fra due calcolatori diversi (es. via telefono\modem , via ethernet\ con opportune schede di connessione) 21 Struttura di un calcolatore (4) • Hw e sw Hardware Processore Memorie Sottosistema di Interfaccia bus Mantiene Dati e Programmi Software 22 Problemi, algoritmi e programmi Alcuni cenni su come progettare e scrivere nuovi algoritmi e programmi 23 Risolvere un problema • Come viene risolto un problema : Dati di ingresso Elaborazione Descrivono il caso in esame Manipolazione dei dati di ingresso in modo da costruire la soluzione cercata Dati di uscita Rappresentano la soluzione del caso in esame 24 Risolvere un problema (2) • es : riconoscere qualcuno fra la folla Dati di ingresso Immagine della folla Elaborazione Ricerca nell’immagine Dati di uscita SI, NO, chi è la persona riconosciuta 25 Risolvere un problema (3) • es : torta di carote Dati di ingresso Ingredienti Elaborazione Combinazione degli ingredienti secondo una opportuna ricetta Dati di uscita La torta ! 26 Risolvere un problema (4) • Una prima considerazione : essere capaci di risolvere un problema non significa essere capaci di spiegare esattamente come questo avviene Dati di ingresso Immagine della folla Elaborazione Ricerca nell’immagine Come avviene la ricerca ?????? Dati di uscita SI, NO, chi è la persona riconosciuta 27 Risolvere un problema (6) • Seconda considerazione : vogliamo essere capaci di specificare la strategia seguita dal passo di elaborazione in modo da farla eseguire ‘automaticamente’ dal computer quindi dobbiamo : – riuscire a descrivere accuratamente i vari passi della soluzione attraverso azioni che il calcolatore è in grado di effettuare e con un linguaggio che è in grado di comprendere 28 Risolvere un problema (7) Dati di ingresso Ingredienti Elaborazione Combinazione degli ingredienti secondo una opportuna ricetta Dati di uscita La torta ! Descrizione del ‘come’ espressa attraverso la combinazione di azioni elementari Io Cuoco (che sa ‘come’) ricetta (che conosco alcune azioni elementari: accendere il forno, sbattere le uova) 29 Algoritmi e programmi • La situazione con il calcolatore è Dati di ingresso Codificati opportunamente Elaborazione Dati di uscita Trasformazione dei dati di ingresso seguendo i passi specificati da un opportuno algoritmo Ovvero la descrizione dell’algoritmo secondo un linguaggio comprensibile al calcolatore Umano (che conosce l’algoritmo) Calcolatore programma (che conosce alcune azioni elementari: es confrontare due numeri, eseguire semplici operazioni aritmetiche 30 Algoritmi e programmi (2) • Algoritmo (def) : una sequenza di azioni non ambigue che trasformi i dati iniziali nel risultato finale utilizzando un insieme di azioni elementari che possono essere eseguite da un opportuno esecutore. • Programma (def) specifica di un algoritmo utilizzando un linguaggio non ambiguo e direttamente comprensibile dal computer • es: C, Java ... 31 Algoritmi e programmi (3) • Due punti importanti: – fissare in modo meno vago le azioni elementari eseguibili da un computer • dipende dal livello di astrazione a cui operiamo • es. in hw leggere-scrivere la memoria, addizionare, confrontare con 0 • es in Java, interagire con schermo, tastiera, effettuare interazioni con computer remoti ... – capire come passare dal problema all’algoritmo • è generalmento lasciato all’intuizione e alla fantasia, vedremo degli esempi 32 Algoritmi e programmi (4) • Ma insomma, una ricetta è proprio un algoritmo? … quasi, ovvero è molto simile ad un algoritmo con due importanti differenze: – La sequenza di azioni contiene spesso degli elementi di ambiguità risolti da un esecutore intelligente • es: spesso non si specificano gli strumenti da utilizzare, confidando che l’esecutore umano sbatta le uova nel posto giusto – Non tutti i possibili casi vengono specificati • es: è chiaro che se c’e’ puzza di bruciato conviene spegnere il forno, anche se la ricetta non lo specifica • anche qua si confida nelle capacità deduttive dell’esecutore 33 Dal problema all’algoritmo Un esempio 34 Dal problema all’algoritmo: un esempio • La biblioteca – Libri disposti sugli scaffali – La posizione di ogni libro è fissata dalle due coordinate (S,P) dove • S è il numero dello scaffale dove si trova il libro • P è la posizione all’interno dello scaffale – La biblioteca ha uno schedario con una scheda per ogni libro. Ogni scheda contiene, nell’ordine: • cognome e nome dell’autore • titolo del libro • numero scaffale (S) e posizione nello scaffale (P) 35 Dal problema all’algoritmo: esempio (2) • La biblioteca (cont.) – Le schede sono ordinate in ordine alfabetico del campo autore • Problema: Vogliamo specificare un algoritmo che spieghi all’utente della biblioteca come trovare un libro cercato supponendo di sapere : Autore e Titolo 36 Dal problema all’algoritmo: esempio (3) • Un primo algoritmo per il prestito: 1. Decidi il libro da richiedere 2. Cerca la scheda nello schedario 3. Trascrivi la posizione (S,P) 4. Accedi alla posizione (S,P) 5. Preleva il libro e compila la scheda di prestito • Le operazioni elementari in questo caso sono piuttosto complesse… 37 Dal problema all’algoritmo: esempio (4) • … e se non so come si effettua la ricerca nello schedario ? – Tutte le operazioni specificate devono essere ‘elementari’ per chi esegue l’algoritmo. – Se non lo sono è possibile spiegarle a parte per mezzo di un sotto-algoritmo • es : nello spiegare una ricetta spesso si fa riferimento a parti spiegate in altre ricette, tipicamente ‘… preparare la pasta frolla (ricetta p. 212) usando i primi 3 ingredienti, poi preparare il ripieno come segue ….’ 38 Dal problema all’algoritmo: esempio (5) • Un sotto algoritmo per cercare nello schedario : 1. Apri il classificatore 2. Prendi la prima scheda 3. Confronta il campo autore e titolo con quelli cercati 4. Se sono uguali, allora la ricerca è terminata, altrimenti prendi la scheda successiva e vai al passo 3 5. Se le schede sono esaurite, allora il libro cercato non esiste. 39 Dal problema all’algoritmo: esempio (6) Due considerazioni : – Per ogni problema\sotto-problema ci sono algoritmi più o meno veloci • es: per la ricerca nello schedario si può utilizzare l’algoritmo che utilizziamo solitamente (e spesso non consapevolmente) per cercare una parola sul dizionario – L’algoritmo presentato, per quanto semplice presenta sia operazioni elementari (confronta, prendi) che strutture di controllo (istruzioni che organizzano la sequenza in cui vengono effettuate le operazioni elementari, es. se….altrimenti … vai a …) 40 Dal problema all’algoritmo: le strutture di controllo • La struttura di controllo condizionale 1. Apri il classificatore 2. Prendi la prima scheda 3. Confronta il campo autore e titolo con quelli cercati 4. Se (sono uguali), allora la ricerca è terminata, altrimenti prendi la scheda successiva e vai al passo 3 5. Se (le schede sono esaurite) allora il libro cercato non esiste. (….) specifica la condizione 41 Dal problema all’algoritmo: le strutture di controllo (2) • La struttura di salto (vai a o go_to) 1. Apri il classificatore 2. Prendi la prima scheda 3. Confronta il campo autore e titolo con quelli cercati 4. Se sono uguali, allora la ricerca è terminata, altrimenti prendi la scheda successiva e vai al passo 3 5. Se le schede sono esaurite allora il libro cercato non esiste. 42 Dal problema all’algoritmo: le strutture di controllo (3) • La struttura di iterazione (finchè…ripeti) 1. Apri il classificatore 2. Prendi la prima scheda 3. Confronta il campo autore e titolo con quelli cercati 3. Finchè (il campo autore e titolo sono diversi da quelli cercati) ripeti a. Prendi la scheda successiva b. Confronta il campo autore e titolo con quelli cercati 5. Se le schede sono esaurite allora il libro cercato non esiste. 43 Algoritmi: ancora esempi ... • Immaginiamo degli algoritmi per i seguenti problemi : 1. Trovare il maggiore fra 2 numeri interi x e y 2. Trovare il maggiore fra 3 numeri interi x, y e z 3. Trovare il massimo fra N numeri • assumiamo le seguenti operazioni elementari – somma (+), sottrazione (-), stabilire se un numero è maggiore o minore di 0, leggere/scrivere dallo schermo • … dove ragionevole : – definiamo dei sottoalgoritmi e utilizziamo le strutture di controllo 44 Il maggiore fra 2 numeri interi x, y • Algoritmo max 1. Leggi i valori di x e y dall’esterno 2. Calcola la differenza d fra x e y (d=x-y) 3. Se d è maggiore di 0 vai al passo 5 altrimenti prosegui in sequenza 4. Stampa ‘il massimo è …’ seguito dal valore di y e vai a 6 5. Stampa ‘il massimo è …’ seguito dal valore di x 6. Termina l’esecuzione 45 Il maggiore fra 2 numeri interi x e y (2) • x, y, d sono le ‘variabili’, cioè i contenitori per i dati coinvolti nell’elaborazione. Ogni variabile ha un nome (x,y…) e un valore: il dato contenuto o memorizzato in essa • Dobbiamo specificare esplicitamente come e quando l’esecuzione termina! 46 Il maggiore fra 3 numeri interi • Possiamo sfruttare l’algoritmo max come ‘sottoalgoritmo’ • Algoritmo max_3 1. Leggi i valori di x, y, z dall’esterno 2. Valuta se x> y usando l’algoritmo max 3. In caso affermativo vai al passo 5 4. Trova il massimo fra y e z (con max) e termina 5. Trova il massimo fra x e z (con max) e termina 47 Il massimo fra N numeri interi • Possiamo ancora sfruttare l’algoritmo max come ‘sottoalgoritmo’! • Idea … trovare prima il maggiore fra i primi due numeri, poi confrontare il risultato con il terzo, poi con il quarto etc … • In pratica, possiamo usare la struttura di controllo iterativa finchè…ripeti per effettuare le operazioni di max su tutti i numeri in ingresso 48 Determinare il massimo fra N numeri interi • Algoritmo max_N 1. Leggi il valore di N dall’esterno 2. Leggi i primi due numeri 3. Trova il maggiore m fra i primi due numeri (con max) 4. Finchè (hai esaminato meno di N numeri) a. Leggi un nuovo numero x b. Trova il maggiore fra m e x usando l’algoritmo max c. Assegna il valore del maggiore a m 5. Stampa ‘il massimo è…’ ed il valore di m e termina 49 Diagrammi di Flusso • Sono grafici che permettono di esprimere un algoritmo in modo preciso ed intuitivo • Si costruiscono a partire da un certo numero di ‘blocchi base’ che rappresentano le operazioni elementari ed i costrutti di controllo 50 Diagrammi di Flusso (2) I blocchi base : Inizio Sottoprog. Operazione I/0 Fine Si No Cond. Elaborazione 51 Diagrammi di Flusso (3) • I blocchi base vengono collegati tramite ‘freccie’ che collegano un’azione alla successiva all’interno dell’algoritmo • Vediamo i diagrammi di flusso degli algoritmi per il calcolo del massimo già visti 1. Trovare il maggiore fra 2 numeri interi x e y 2. Trovare il maggiore fra 3 numeri interi x, y e z 3. Trovare il massimo fra N numeri 52 Il maggiore fra 2 numeri interi x, y • Algoritmo max 1. Leggi i valori di x e y dall’esterno 2. Calcola la differenza d fra x e y (d=x-y) 3. Se d è maggiore di 0 vai al passo 5 altrimenti prosegui in sequenza 4. Stampa ‘il massimo è …’ seguito dal valore di x e vai a 6 5. Stampa ‘il massimo è …’ seguito dal valore di y 6. Termina l’esecuzione 53 DF di max Inizio Leggi x e y d=x-y Si No d>0? Scrivi ‘max è y’ Scrivi ‘max è x’ Fine 54 DF di max Inizio Passo 1 Leggi x e y Passo 2 d=x-y Si Passo 3No d>0? Scrivi ‘max è y’ Scrivi ‘max è x’ Passo 5 Passo 4 Fine Passo 6 55 Determinare il massimo fra N numeri interi • Algoritmo max_N 1. Leggi il valore di N dall’esterno 2. Leggi i primi due numeri 3. Trova il maggiore m fra i primi due numeri (con max) 4. Finchè (hai esaminato meno di N numeri) a. Leggi un nuovo numero x b. Trova il maggiore fra m e x usando l’algoritmo max c. Assegna il valore del maggiore a m 5. Stampa ‘il massimo è…’ ed il valore di m e termina 57 DF per il problema del massimo di N numeri Inizio Leggi i primi due numeri x1 e x2 e memorizzali nelle variabili a e b m = max(a,b) Si Leggi il nuovo numero in a Ancora numeri da esaminare ? No Scrivi ‘max è m’ Fine m = max(a,m) Supponiamo N fissato 58 DF e programmi (1) • I DF sono un primo passo verso la formalizzazione di un algoritmo in modo non ambiguo • Per ottenere una codifica interpretabile direttamente dalla macchina dobbiamo però specificare molti più dettagli : – trasformare tutte le ‘frasi’ in variabili e modifiche su di esse : • es : ‘ancora numeri da esaminare’ deve essere tradotto in qualcosa di calcolabile dalla macchina usando solo le operazioni elementari 59 Leggi N Inizio Leggi i primi due numeri x1 e x2 e memorizzali nelle variabili a e b m = max(a,b) Si I=2 No I<N? I=I+1 Leggi il nuovo numero in a Scrivi ‘max è m’ Fine DF per il problema del massimo di N numeri (seconda versione) m = max(a,m) Supponiamo N almeno 2 60 DF e programmi (2) • Per ottenere una codifica interpretabile direttamente dalla macchina dobbiamo anche : – decidere come codificare l’informazione • non banale in esempi più complessi del nostro, ad esempio se voglio codificare un’immagine o un video – scrivere il tutto con una codifica ‘leggibile’ dalla macchina • … ma la macchina lavora molto a basso livello (linguaggio macchina, codificato con zeri e uni) !!!! 61 DF e programmi (3) • … soluzione…. – usare linguaggi di ‘livello’ più alto (linguaggi di programmazione ad alto livello) – usare dei programmi appositi per far tradurre i nostri programmi in linguaggio macchina (i compilatori) • importante …. – I tipici linguaggi (C, Java, Fortran, Basic…) permettono di definire strutture del tutto analoghe ai diagrammi di flusso che abbiamo visto finora 62 DF e programmi : max in C main() /* calcola max */ { int x, y, d; scanf ("%d %d”, &x, &y) ; d = x - y ; if (d > 0) printf (”il max è %d\n”, &x) ; else printf (”il max è %d\n”, &y) ; return ; } 63 DF e programmi : max in Java public class Max { public static void main(String [] args){ int x, y, d; x = readfromconsole () ; y = readfromconsole () ; d = x - y ; if (d > 0) System.out.println(”il max è %d” + x) ; else System.out.println(”il max è %d” + y) ; } 64 DF e programmi : max_N in C (1) main() /* calcola max_N */ { unsigned int m, i, a, b; i = 2 ; scanf ("%d %d”, &a, &b); m = max(a,b); while (i < N) { scanf ("%d ”, &a) ; m = max(a,m); } printf (”il max è %d”, &m) ; return ; } 65 DF e programmi : max_N in C (2) int max(int x, int y) /* sottoprogramma che calcola max */ { int d; d = x - y ; if (d > 0) return x; else return y; } 66 Riassumendo … • Abbiamo dato alcuni esempi di algoritmi • Abbiamo introdotto i diagrammi di flusso (DF), dei grafici che permettono di esprimere un algoritmo tramite una combinazione grafica di passi elementari e strutture si controllo. • Abbiamo discusso la distanza fra DF e tipici linguaggi di programmazione ad alto livello 67 Altri esempi ... 68 Altri esempi • Formalizzimo un algoritmo che effettua la ricerca della scheda relativa a un certa coppia (Autore, Titolo) usando la strategia della ricerca nel dizionario • Modifichiamo l’algoritmo max_N in modo da ordinare gli N numeri (diagramma di flusso) 69 La ricerca stile ‘dizionario’ 1. Apri il classificatore 2. Prendi la scheda X al centro dello schedario 3. Confronta il campo autore e titolo di X con quelli cercati 4. Se sono uguali, allora termina, altrimenti prosegui 5. Se il campo autore di X è minore di quello cercato allora prosegui la ricerca sulla metà inferiore delle schede altrimenti considera la metà superiore 6. Se la metà selezionata al passo 5 è vuota allora termina (lo schedario non contiene il libro cercato) altrimenti scegli come X la scheda al centro della metà scelta e vai al passo 3 70 La ricerca stile ‘dizionario’ (2) schedario Situazione iniziale 71 La ricerca stile ‘dizionario’ (3) Ogni volta elimino la metà delle schede, oppure mi fermo perché ho trovato la scheda cercata Ogni volta divido il numero N delle schede per 2, mi fermo quando N è diventato 1 o 0 Al più eseguo x passi dove x è il logaritmo in base 2 di N Scheda cercata! 72 Ordinare N numeri interi • Problema: Servono N variabili ! – X_1 … X_N per memorizzare i numeri letti dall’esterno durante l’elaborazione • Supponiamo che max_N restituisca una coppia di valori (m,i) dove m è il valore del massimo ed i è la posizione all’interno della sequenza cui corrisponde – es (45,3), il massimo valore è 45 e corrisponde al terzo numero nella sequenza lunga N 73 Ordinare N numeri interi (2) • Algoritmo ordina_N 1. Leggi il valore di N dall’esterno 2. Finchè (hai letto meno di N numeri) a. Leggi un nuovo numero nella variabile X_i 3. Trova il maggiore (m, i) fra X_1 … X_N (con max_N modificato) 4. Scambia fra loro X_i e X_N 5. Considera adesso solo i primi N-1 numeri (N=N-1) 6. Se N = 1 termina, altrimenti vai al passo 3 74 Ordinare N numeri interi (3) 8 7 3 1 N=4 Max_N = 8 in posizione 1 Scambio la posizione 1 e 4 1 7 3 8 N=3 Max_N = 7 in posizione 2 Scambio la posizione 1 e 3 1 3 7 8 N=2 Max_N = 3 in posizione 2 Nessuno scambio 1 3 7 8 N=1 Termina 1 3 7 8 75 Ordinare N numeri interi (4) • … problema…. – La variabile X_i che deve essere scambiata è diversa ogni volta! Questo non è possibile esprimerlo utilizzando solo le cose viste finora – Inoltre se N cambia devo aggiungere/togliere variabili … – Soluzione : utilizzare un meccanismo di rappresentazione ‘più potente’ della singola variabile, che mantenga l’informazione che stiamo elaborando una sequenza di valori (strutture dati) 76 Strutture dati • Le strutture dati, cioè variabili ‘con struttura’, permettono di rappresentare agevolmente dati più complessi di quelli visti finora e • ne discuteremo alcuni esempi 77 Strutture dati (2) • Tutti i linguaggi ad alto livello per la programmazione permettono di definire due tipi di aggregati di variabili (o strutture dati) – array : tabelline di valori tutti dello stesso tipo (a una o più dimensioni) – record : gruppi di variabili di tipo diverso 78 Array – Possiamo definire una sequenza lunga N per il nostro problema di ordinamento, es. 1 3 7 Array di 4 valori interi (a una sola dimensione) 8 – Possiamo definire una tabella a due dimensioni, ad esempio per memorizzare le vendite di un prodotto in un trimestre dell’anno I II III Prod 1 1 32 7 8 Prod 2 9 3 3 8 Prod 3 14 3 723 82 IV Array 3x4 di 12 valori interi (a due dimensioni) 79 Array (2) • Come si specifica la struttura di un array ? e come si usano le singole variabili nella struttura ? – La struttura si specifica con il tipo e l’ampiezza di ogni dimensione – es : • int x[4] 1 • int tab[3][4] Nomi delle tabelle 3 7 8 I II III Prod 1 1 32 7 8 Prod 2 9 3 3 8 Prod 3 14 3 723 82 IV 80 Array (3) • Uso di una singola variabile : – Si specificano le coordinate della variabile desiderata : – Ogni elemento di ogni dimensione è identificato da un valore da 1 a N (o da 0 a N-1, dipende dal linguaggio) Noi generalmente seguiremo la convenzione C, Java di partire da 0 0 1 2 3 1 3 7 8 valore I II III Prod 1 1 32 7 8 Prod 2 9 3 3 8 Prod 3 14 3 723 82 x[1] tab[1][0] posizione IV 81 Usiamo gli array ... • Costruiamo una versione dell’algoritmo che ordina N numeri che usa un array int X[N]per memorizzare i numeri della sequenza da ordinare 82 Usiamo gli array (2) • Per prima cosa costruiamo 2 sottoalgoritmi – leggi_Na che legge i numeri da ordinare e li inserisce nell’array X – max_Na che trova il valore del massimo numero in X e la sua posizione 83 Input : vuoto (void) Inizio Leggi il valore di N Strutture dati: Int X[N] // la sequenza I=0 Si Sottoalgoritmo per la lettura di N numeri (leggi_Na) No I<N? Fine Leggi il nuovo numero in X[I] Output : Int X[N] // la sequenza letta Int N // la sua lunghezza I=I+1 84 Esempio di leggi_Na Sequenza di numeri da leggere : 8, 1, 9, 7 quindi Inizialmente X è vuoto Passo 1, leggo il primo numero N=4 X= posizione I=0 Leggo 8 e lo scrivo nella posizione 0, cioè X[0]=8 0 1 2 3 8 Passo 2, leggo il secondo numero I=1 Leggo 1 e lo scrivo nella posizione 1, cioè X[1]=1 8 1 8 1 9 8 1 9 Passo 3, leggo il terzo numero I=2 Leggo 9 e lo scrivo nella posizione 2, cioè X[2]=9 Passo 4, leggo il quarto numero I=3 Leggo 7 e lo scrivo nella posizione 3, cioè X[3]=7 Termina I=4, quindi I< N non è più verificata 7 85 Input: Int X[N], Int N Sottoalgoritmo per la trovare il massimo di N numeri in un array (max_Na) Inizio m = X[0] Imax = 0, I = 0 Si Strutture dati: Int X[N] // la sequenza No I<N? Fine Si No m > X[i] ? I=I+1 Output: Int m // il valore del massimo Int Imax // l’indice del massimo m = X[i], Imax = I 86 Esempio di max_Na Trova il valore m del massimo in X e la sua posizione Imax , la lunghezza di X è N=4 Passo 1, esamino X[0], I=0 m=8 X= 8 1 posizione Imax = 0 (Valore e posizione del massimo trovato fra gli elementi già esaminati) 9 7 0 1 2 3 8 1 9 7 8 1 9 7 8 1 9 7 8 1 9 7 Passo 2, esamino X[1], I=1 m=8 Imax = 0 Passo 3, esamino X[2], I=2 m=9 Imax = 2 Passo 4, esamino X[3], I=3 m=9 Termina Imax = 2 I=4, quindi I< N non è più verificata 87 Ordinare N numeri interi 8 7 3 1 N=4 Max_Na = 8 in posizione 1 Scambio la posizione 1 e 4 1 7 3 8 N=3 Max_Na = 7 in posizione 2 Scambio la posizione 1 e 3 1 3 7 8 N=2 Max_Na = 3 in posizione 2 Nessuno scambio 1 3 7 8 N=1 Termina 1 3 7 8 88 Ordinare N numeri interi (2) • Algoritmo ordina_Na 1. Leggi il valore di N dall’esterno 2. Leggi gli N numeri della sequenza nell’array X 3. Trova il maggiore (m, imax) fra i primi N numeri dell’array X (con max_Na) 4. Scambia fra loro X[imax] e X [N] 5. Considera adesso solo i primi N-1 numeri dell’array (N=N-1) 6. Se N = 1 continua, altrimenti vai al passo 3 7. Stampa X, termina 89 Input : vuoto (void) (X,N)=leggi_Na() Inizio Si N>1? (m,I) = max_Na(X,N) T = X[N] X[N] = X[I] X[I] = T N = N-1 Lung=N No Stampa(X,Lung) Strutture dati: Int X[N] // la sequenza Fine Output : vuoto (void) Scambio dei due valori DF per il problema del ordinare di N numeri (ordina_Na) 90 Record • Finora abbiamo visto solo variabili di tipo intero • Normalmente è possibile avere variabili di tipo diverso che rappresentano informazioni di natura diversa : – interi, reali … – caratteri (‘a’,’b’, …) – sequenze di caratteri (dette stringhe, ”gatto ”, ”oggi piove !” …) • I record sono aggregati di variabili di tipo diverso e permettono di definire nuovi tipi 91 Record (2) • A cosa possono servire…... – A rappresentare le schede della biblioteca stringa Nome Autore stringa Cognome Autore Titolo intero Scaffale Posizione Costo stringa intero reale … altre informazioni ….. Campi del record 92 Record (3) • Il tipo record scheda espresso in C struct scheda { char nome[100]; //stringa di al più //100 caratteri char cognome[100]; char titolo[300]; int scaffale; int posizione; double costo ; } ; 93 Record (4) //Come dichiaro che voglio //una variabile di tipo ‘scheda’ struct scheda nuovo_libro; // come assegno valori ai diversi campi nuovo_libro.nome =”Jorge"; nuovo_libro.cognome =”Amado"; nuovo_libro.titolo =”Dona Flor e i suoi due mariti"; nuovo_libro.scaffale =”8"; nuovo_libro.posizione =”356"; 94 Record (5) • Si possono definire array di record – questo può servire, ad esempio a definire l’insieme delle schede di una biblioteca: struct scheda archivio[100000] – possiamo quindi formalizzare il nostro algoritmo ‘stupido’ per la ricerca nello schedario 95 Input : struct scheda archivio Ricerca ‘stupida’ (ricerca) Inizio Leggi Nome, Cognome e Titolo del libro cercato Strutture dati: struct scheda archivio // l’array di schede I=0 Si No I < 100000 ? Fine archivio[I].nome = Nome archivio[I].cognome = Cognome archivio[I].titolo = Titolo ? Si No I=I+1 Fine Non l’ho trovata! Output : la scheda cercata e un valore (si/no) che dice se c’è L’ho trovata! 96 DF e programmi DF Codifica in un linguaggio di programmazione (C, Java etc) Programma Input : programma Compilatore Eseguibile Output : rappresentazione comprensibile alla macchina 97 DF e programmi (2) • L’eseguibile dipende dalla macchina che dobbiamo specializzare (es. processore Intel, o processore SUN), dal sistema operativo (es. Windows, Linux …) e dal linguaggio usato (es: C o Java) • Gli eseguibili di alcuni linguaggi (come Java) contengono operazioni complesse che non possono essere eseguite direttamente! • In questo caso si utilizza un programma interprete (es Java Virtual Machine) che realizza le operazioni elementari complesse 98 DF di max Inizio Leggi x e y d=x-y Si No d>0? Scrivi ‘max è y’ Scrivi ‘max è x’ Fine 99 DF e programmi : max in C main() /* calcola max */ { int x, y, d; //def. Delle variabili scanf ("%d %d”, &x, &y) ; //lettura x,y d = x - y ; if (d > 0) //scrittura risultati printf (”il max è %d”, &x) ; else printf (”il max è %d”, &y) ; return ; //terminazione } 10 DF e programmi : max in Java public class Max { public static void main(String [] args){ int x, y, d; x = readfromconsole () ; y = readfromconsole () ; d = x - y ; if (d > 0) System.out.println(”il max è %d” + x) ; else System.out.println(”il max è %d” + y) ; } 10 Leggi N Inizio Leggi i primi due numeri x1 e x2 e memorizzali nelle variabili a e b m = max(a,b) Si I=2 No I<N? I=I+1 Leggi il nuovo numero in a Scrivi ‘max è m’ Fine DF per il problema del massimo di N numeri (seconda versione) m = max(a,m) Supponiamo N almeno 2 10 DF e programmi : max_N in C (1) main() /* calcola max_N */ { int m, i, a, b; i = 2 ; scanf ("%d %d”, &a, &b); m = max(a,b); while (i < N) { scanf ("%d ”, &a) ; m = max(a,m); } printf (”il max è %d”, &m) ; return ; } 10 DF e programmi : max_N in C (2) int max(int x, int y) /* sottoprogramma che calcola max */ { int d; d = x - y ; if (d > 0) return x; else return y; } 10 DF e programmi : ordina_Na in C main() /* calcola max_N */ { int m, i, t, X[N], N, lung; leggi_Na (N, X) ; m = X[0]; lung = N ; while (N > 1) { max_Na(X,N,&m,&i) ; t = X[N]; X[N] = X[i] ; X[i] = t ; N = N - 1 ; } stampa_Na (X,lung) ; return ;} 10 Esercizi proposti • Dare il DF per il sottoalgoritmo stampa_Na • Trovare un algoritmo (e fornire il DF) per i seguenti problemi : – trovare la somma dei primi K numeri (K letto dall’esterno) – trovare la media di una sequenza di numeri positivi (la sequenza viene letta dall’esterno e si interrompe al primo numero negativo letto) – leggere una data (un record che indica giorno, mese ed anno) e stampare il numero di giorni passati dall’inizio dell’anno 10