DATI(1) FONDAM ENTI INFORMAZIONE – DATO – TIPO DI DATO Col termine INFORMAZIONE si intende l’espressione, in forma COMPRENSIBILE e SIGNIFICATIVA, di una notizia o messaggio che, in un certo contesto o ambiente, apporta maggiori CONOSCENZE circa una realtà o fenomeno. In altri termini, l’informazione è ciò che riduce la INCERTEZZA delle conoscenze in relazione ad un certo argomento o al verificarsi di un certo evento. Il concetto di informazione è strettamente legato a quello di COMUNICAZIONE: l’informazione è ciò che un soggetto sorgente S intende comunicare ad un soggetto destinatario D quando S e D convergono verso uno stesso RAPPORTO SEMIOTICO (in altri termini, quando S e D stabiliscono un accordo univoco circa i significati, cioè la semantica, di ciò che viene comunicato). L’informazione può essere acquisita in diverse forme da diverse fonti (suoni, immagini, gesti, alfabeto, simboli, cifre), secondo diverse modalità (in tempo reale o differito, in modo diretto o indiretto se trasformata) e secondo vari GRADI DI ATTENDIBILITÀ, infatti, siccome in qualche modo l’informazione implica la comunicazione, si pone almeno il problema della UNIVOCITÀ DI INTERPRETAZIONE dell’informazione. La trasmissione dell’informazione, quale fase di un processo di comunicazione, implica che l’informazione sia rappresentata tramite un modello, fondamentalmente basato su di un LINGUAGGIO (in senso lato); una entità minima di senso compiuto di tale modello viene a costituire ciò che si chiama DATO. Stabilire una entità minima di informazione consente di poter parlare di quantità di informazione, cioè di poter definire una MISURA DELLA INFORMAZIONE (vedi seguito). Per ora e per il seguito si farà riferimento anche alle slide DATI01 e DATI02. Col termine DATO si intende una RAPPRESENTAZIONE FORMALIZZATA o codificata di una informazione, tale da poter essere interpretata, comunicata ed elaborata da esseri umani o sistemi automatici. prof. Felice Zampini Dati(1) 1/47 La parola Dato deriva dal latino Datum, traducibile col termine fatto: i dati sono fatti, anche ipotetici, che diventano informazioni quando trasmettono un significato, ciò che è come dire che l’informazione è il significato dei dati, i quali codificano fatti. Un dato è dunque una rappresentazione formale di eventi, concetti, istruzioni, comandi (espressi in forme opportune, p.es. simboli o caratteri di un alfabeto, simboli grafici o icone, ecc.) cui può essere assegnato e/o riconosciuto un significato e rispetto al quale sia possibile compiere delle OPERAZIONI (in senso lato) ed instaurare una comunicazione. Un dato costituisce pertanto (o contiene) un’informazione per un soggetto se, fornendone una chiave interpretativa (significato o SEMANTICA del dato), ciò comporta un reale aumento delle conoscenze del soggetto circa la realtà che il dato rappresenta. Come già accennato, il concetto di dato, in quanto derivato da un processo di formalizzazione, implica l’esistenza di un MODELLO DI RAPPRESENTAZIONE, fondamentalmente basato su di un LINGUAGGIO, in cui il dato stesso gioca il ruolo di entità minima dotata di senso compiuto. Tramite i dati, espressi in forma opportuna (simboli, caratteri, icone, ecc.), è dunque possibile MODELLARE LA REALTÀ (eventi, concetti, comandi, ecc.) dandone una rappresentazione formale cui sia assegnato e/o riconosciuto un significato certo ed in cui sia possibile effettuare delle OPERAZIONI e la comunicazione. Distinguendo i dati in base alla loro natura (o al loro dominio di definizione) ed alle operazioni su di essi definibili si perviene al concetto di TIPO DI DATO. Col termine TIPO DI DATO si intende un insieme di dati cui sia associato un insieme di operazioni. In altri termini, un tipo di dato è un insieme di dati dotato di una struttura di tipo algebrico. Oppure, un tipo di dato è definito quando è dato un insieme di “oggetti” o “valori” (elementi costituenti l’insieme di supporto del tipo di dato) ed un insieme di operazioni eseguibili su di essi (algebra associata). Distinguendo i dati in base alla loro natura (ciò che si rappresenta) e le operazioni in base alle loro proprietà (ciò che si può fare) si possono ottenere per astrazione diversi tipi di dati. I Tipi di Dati sono trattati più avanti in questa dispensa e nella Dispensa DATI(2). prof. Felice Zampini Dati(1) 2/47 MISURA DELLA INFORMAZIONE Come già accennato, almeno da un punto di vista intuitivo si può dire che la INFORMAZIONE è ciò che riduce la incertezza delle conoscenze su di un certo argomento o, in altri termini, il grado di incertezza del verificarsi di un certo evento E. Viene dunque spontaneo esprimere una misura H della quantità di informazione associata ad E in base alla probabilità P(E) del verificarsi di E, ovvero esprimere H come una funzione di P(E): H=f(P(E)) In tal senso, informazione non va confusa con significato; in particolare, per quanto concerne la teoria delle comunicazioni, il termine informazione riguarda non tanto ciò che si dice effettivamente quanto piuttosto ciò che si potrebbe dire: l'informazione esprime una misura del grado di libertà di scelta nella scelta di un messaggio fra un insieme di messaggi possibili. Quale UNITÀ DI MISURA DELL'INFORMAZIONE si può fare riferimento alla informazione minima per prendere una decisione tra due eventi equiprobabili, in altri termini, una situazione a due alternative (del tipo "tutto o nulla") possiede una unità elementare di informazione, alla quale viene naturale associare la cifra binaria, cioè il BIT. In tale ottica, H cresce al diminuire di P(E) (da 1 a 0) e dovrà risultare nulla per P(E)=1 ed infinita per P(E)=0, in conformità con la constatazione, ovvia, che l'evento certo non fornisce informazione ed il verificarsi dell'evento impossibile implica un contenuto informativo teoricamente infinito (casi limite). P(E) 0 (evento impossibile) H (informazione "infinita") 1 (evento certo) 0 (informazione nulla) Rimane da determinare le caratteristiche della funzione: f:P(E)H Una funzione che può descrivere H, in base alle considerazioni svolte, può essere la funzione logaritmica (in base 2). Siccome H è proporzionale ad 1/P(E) allora può porsi: H=log2(1/P(E))=-log2P(E) prof. Felice Zampini Dati(1) 3/47 La quantità di informazione è quindi esprimibile tramite la formula: H = -log2P(E) Tale relazione, nei casi più elementari, definisce la quantità di informazione come logaritmo del numero di scelte possibili (vedi esempio seguente, ove la formula va presa col segno positivo) e, più in generale, stabilisce uno stretto legame col concetto di entropia, ricorrente in termodinamica. Si noti che il segno meno davanti al logaritmo sarebbe comunque necessario per rendere positiva H, in quanto P(E) varia tra 0 e 1. La formula dell'informazione è generalizzabile ad insiemi di n simboli (o messaggi completi) indipendenti con associate probabilità di scelta P1,P2,...,Pn (formula dell’informazione media pesata): n H = -Pilog2Pi i=1 L’analisi del caso discreto non è restrittiva in quanto lo studio di un segnale analogico può essere ricondotto a quello di un corrispondente segnale discreto (teoria di campionamento). Esempio Un dispositivo bistabile - p.es. un relè - può trattare una situazione di unità di informazione a 2 alternative di messaggi (chiuso=0, aperto=1), percui esso fornisce una quantità di informazione pari a: H=Log22=1 bit Com'è noto, dati n relè - p.es. 4 - si hanno: 24=16 scelte (configurazioni, messaggi o alternative) possibili (da 0000 a 1111), cioè il quadruplo che nel caso singolo (2x2x2x2), sensatamente con il risultato: H=Log216=4 bit prof. Felice Zampini Dati(1) 4/47 DATI ASTRATTI E CONCRETI Definito un insieme minimo di Dati Elementari si possono introdurre MECCANISMI ASTRATTI DI STRUTTURAZIONE DEI DATI che consentono di costruire Dati Derivati, a partire da quelli semplici, e nuove operazioni, pervenendo così al concetto di Struttura Astratta o Logica di Dati. Traducendo le rappresentazioni logiche dei dati in rappresentazioni interne ad un elaboratore elettronico si perviene al concetto di Struttura Concreta o Fisica di Dati, la cui implementazione dipende dai meccanismi di strutturazione dei dati offerti dai linguaggi di programmazione e dalle caratteristiche hardware dei sistemi di elaborazione dati. Si noti che in tale passaggio la rappresentazione logica del dato, la cui semantica è attibuita dall’uomo, viene a sua volta rappresentata nella macchina, traducendosi nella semantica interna dei tipi di dati. Vediamo di cogliere le differenze tra strutture logiche e fisiche di dati da un punto di vista un pò più generale di quello dell’EDP. A tale scopo, esaminiamo come possono essere considerati gli elementi che caratterizzano un dato (nome, indirizzo, tipo, valore, significato) da parte dell’uomo (U) e della macchina (M). Nome M) Determina l’identificazione del dato e consente di referenziarlo (il nome è collegato all’indirizzo); U. Determina l’identificazione del dato e consente di referenziarlo. Indirizzo M) Determina l’ubicazione del dato e consente di accederlo; U. Nessun significato in generale. Tipo M) Determina la semantica del dato in termini di spazio allocato, codifica, operazioni ammesse, valori ammessi (limitati dalla natura discreta e finita delle rappresentazioni macchina); U. Determina la proprietà di appartenenza del dato ad un certo insieme di “oggetti” I. Valore M) Determina il contenuto del dato, variabile nell’ambito del range di valori ammessi dal suo tipo (insieme di definizione o dominio del dato) secondo la codifica adottata; U. Determina un elemento dell’insieme I di appartenenza del dato. Significato M) Nella semantica della macchina il significato del dato non può che essere quello stabilito dal suo TIPO; U. Nella semantica dell’uomo il dato rappresenta un MODELLO di una certa realtà (eventualmente da trasferire ad un elaboratore, il cui modello coincide col Tipo). prof. Felice Zampini Dati(1) 5/47 Conclusione: la semantica dei modelli logici di dati è vista dall’elaboratore solo in termini di tipi di dati, insufficienti da soli per modellare le realtà che i modelli logici possono descrivere. La possibilità di trasferire all’elaboratore la semantica dell’uomo è una funzione che deve essere svolta dal software, attraverso la definizione di strutture di dati, relazioni e vincoli tra dati, procedure. Dal punto di vista logico il contenuto informativo dei dati (in quanto rappresentazioni di realtà) è palesato quando è noto: Il Significato Intensionale dei Dati, cioè la chiave di interpretazione, la semantica, ciò che essi rappresentano in quanto attributi, forme o modelli, ovvero il modello di rappresentazione o SCHEMA dei dati (che nell’ambito dei linguaggi di programmazione coincide col modello fornito dai tipi di dati); Il Significato Estensionale dei Dati, cioè i loro valori specifici o ISTANZE (estensioni, esemplari) dello schema, ovvero ciò che essi sono contestualmente in quanto valori di attributi, esemplari di forme o modelli. Si può dunque definire uno Schema o Modello di Dati come una rappresentazione del significato intensionale dei dati, a prescindere dalle particolari istanziazioni di essi; un modello fornisce una descrizione degli oggetti reali da rappresentare attraverso i dati in termini di talune proprietà formali tramite le quali essi sono individuati. Giova richiamare ancora l’attenzione sulla differenza tra il concetto di Schema o Modello di Dati e Istanza dello schema: lo schema descrive gli aspetti formali di una certa realtà (indipendentemente dagli aspetti “concreti” che potrebbero riguardarla), fornendone la chiave interpretativa, una istanza è invece uno dei possibili reali stati di tale realtà (uno dei possibili “valori” assumibili dagli attributi nel loro dominio di definizione), cioè una estensione o esemplare dello schema (ovvero uno dei possibili “riempimenti” dello schema). Nota I modelli di dati sono trattati nella dispensa Data Base Management System (1); vengono qui fornite alcune definizioni come premessa didattica. Un Modello di Dati identifica: Le CATEGORIE che individuano e suddividono i dati (classi di oggetti della realtà da rappresentare); Gli ATTRIBUTI di ciascuna categoria (proprietà interessanti tramite le quali si individuano e caratterizzano gli oggetti di una data classe); Le eventuali ASSOCIAZIONI definite tra categorie (relazioni tra classi di oggetti) e gli eventuali attibuti di ciascuna associazione (proprietà informative interessanti relative alle relazioni); I VINCOLI DI INTEGRITÀ cui sono soggetti i dati (restrizioni cui sono soggetti i dati). Tali vincoli possono essere: - IMPLICITI: in quanto imposti dalla categoria cui i dati appartengono; - ESPLICITI: in dichiarazioni. prof. Felice Zampini quanto imposti Dati(1) dall’esterno tramite esplicite 6/47 STRUTTURE INFORMATIVE La Rappresentazione della Informazione tramite i dati è un processo di rappresentazione e modellizzazione della realtà che coinvolge il Significato dei dati e si basa sul concetto di STRUTTURA INFORMATIVA. Una Struttura Informativa implica la considerazione aspetti concernenti i dati ed è costituita da: di 2 - un INSIEME DI DATI, dato in senso estensionale, quale insieme di valori che costituiscono l’informazione, o in senso intensionale, quale insieme di attributi; - una STRUTTURA DEI DATI, data dalle relazioni logiche secondo le quali i dati sono tra loro correlati. Esempio L’informazione “distanza tra 2 città” è acquisibile da una tabella (struttura informativa di tipo bidimensionale) scandendone righe e colonne Tabella Distanze Stradali (Km) CITTÀ Milano Bologna Roma Napoli Milano * 220 640 860 Bologna 220 * 410 640 Roma 640 410 * 235 Napoli 860 640 235 * La struttura (forma della tabella) non varia al variare dei suoi valori (p.es. per la realizzazione di nuove strade) ma potrebbe essere modificata p. es. a scopi di ottimizzazione (minor spazio, eliminazione di ridondanze) Milano Bologna 220 Bologna Roma 640 410 Roma Napoli 860 640 235 Da un punto di vista concerne i sistemi EDP considerare che: prof. Felice Zampini concreto, in (elaboratori Dati(1) particolare per quanto elettronici) occorrerà 7/47 - UN TIPO DI DATO AVRÀ UNA RAPPRESENTAZIONE IN MEMORIA cioè andrà ad occupare uno spazio fisico (in memoria centrale e/o di massa), percui, per la natura stessa dei sistemi, potranno perdere di validità talune proprietà generali delle algebre, intese in senso matematico, qualora queste siano applicate in tali contesti, dovendosi in essi considerare, di necessità, ALGEBRE DISCRETE SU ELEMENTI A RAPPRESENTAZIONE FINITA; - la RAPPRESENTAZIONE LOGICA di un dato o informativa costruita per via astratta (per essere poi trasferita alla macchina) RAPPRESENTAZIONE FISICA del dato o della macchina si costruirà al suo interno. di una struttura dall’essere umano sarà diversa dalla struttura che la Nel parlare di Tipi di Dati, quindi di Strutture Dati, occorrerà dunque tenere sempre presente due distinti livelli concettuali: - la Rappresentazione Logica dei dati; - la Rappresentazione Macchina dei dati. RAPPRESENTAZIONE LOGICA DEI DATI La rappresentazione logica dei dati, in quanto attività di idealizzazione e schematizzazione compiuta dal programmatore allo scopo di modellare la realtà, corrisponde alla visione logica dei dati, “esterna” all'elaboratore e tendente a prescindere dagli aspetti fisici riguardanti i dati e la loro manipolazione. L’attività di modellizzazione consiste in un processo di ASTRAZIONE DEI DATI (DATA ABSTRACTION) che consente di definire le STRUTTURE ASTRATTE O LOGICHE DI DATI Le Strutture Logiche di Dati sono costruzioni mentali di strutture dati che, partendo da dati semplici, per astrazioni sempre più spinte possono divenire via via più ricche e complesse (si pensi, ad esempio, al maggior livello di astrazione implicato nella rappresentazione logica e macchina di un numero reale rispetto ad un carattere, pur trattandosi di tipi elementari). Nella pratica della programmazione i dati di tipo elementare e le strutture logiche di dati realizzabili sono generalmente dipendenti dal linguaggio utilizzato. RAPPRESENTAZIONE MACCHINA DEI DATI La rappresentazione macchina dei dati è la rappresentazione dei dati nelle memorie dell’elaboratore, cioè la visione “interna”, fisica, dei dati da parte della macchina. prof. Felice Zampini Dati(1) 8/47 Tali rappresentazioni riguardano principalmente hardware della macchina e sono chiamate: STRUTTURE CONCRETE O FISICHE O INTERNE DI il livello DATI Nella pratica della programmazione le strutture fisiche di dati sono generalmente dipendenti dal sistema EDP utilizzato. PROBLEMATICHE DI IMPLEMENTAZIONE In linea generale, a livello applicativo la natura di un certo tipo di problema da risolvere determina il tipo di struttura informativa cui ricorrere per la rappresentazione dei dati. Una problematica che si pone a più basso livello è quella di tradurre le strutture logiche di dati in corrispondenti strutture fisiche o interne di dati. In altri termini, le strutture logiche di dati, su cui opera il programmatore (software applicativo), dovranno trovare corrispondenti rappresentazioni interne alla macchina (hardware/software di base), tramite Implementazioni che organizzino ed interconnettano gli elementi di memoria (sequenze lineari di celle, o Word di memoria, con associati indirizzi) in modo opportuno. In altri termini ancora, occorrerà disporre meccanismi che siano in grado di effettuare la: ALLOCAZIONE DI STRUTTURE ASTRATTE IN STRUTTURE INTERNE di appositi DI MEMORIA Tali meccanismi sono di norma moduli del Sistema Operativo i quali, tra i vari compiti, devono assolvere anche ai suddetti. Questi moduli sono i seguenti: Sistema di Gestione della Memoria (Memory Management) avente il compito di tradurre le strutture logiche di dati in corrispondenti strutture fisiche di dati in Memoria Centrale. Sistema di Gestione dei File (File System o Information Management) avente il compito di tradurre le strutture logiche di dati in corrispondenti strutture fisiche di dati nelle Memorie Periferiche (memorie di massa). prof. Felice Zampini Dati(1) 9/47 Dalle considerazioni sopra esposte emerge che il linguaggio di definizione delle strutture interne, quindi in particolare il sistema di gestione della memoria, dovrà disporre, in via generale, dei seguenti meccanismi: Allocazione Assegnazione di una zona di memoria ad una struttura dati. Qualora gli elementi costituenti la zona siano adiacenti, la generazione degli indirizzi sarà additiva altrimenti si attuerà una concatenazione, dotando ogni elemento di un'informazione che consenta di rintracciare il successivo o correlarlo con altri (puntatori). Rappresentazione Codificazione dei dati e conversione tra i diversi sistemi di rappresentazione di essi. Manipolazione Lettura, scrittura, modifica della struttura dati in modo da consentire la manipolazione a programma degli stessi. Recupero Riconoscimento, compattamento e riallocazione delle aree di memoria resesi disponibili durante l'esecuzione del programma. prof. Felice Zampini Dati(1) 10/47 TIPI DI DATI Date le informazioni, o, meglio, i Dati: DATI = INFORMAZIONI CODIFICATE si possono individuare Tipi di Dati definendo delle Operazioni su ben determinati insiemi di dati, cioè delle Algebre sugli insiemi sostegno di dati: TIPI DI DATI = DATI + OPERAZIONI Si porranno allora questioni quali le seguenti: 1. Come rappresentare (ed organizzare) i Tipi di Dati? 2. Come realizzare gli algoritmi per definire le operazioni? 3. Come rappresentare (ed implementare) i Tipi di Dati ammessi nei linguaggi di programmazione? 4. Come classificare i Tipi di Dati? Anche se non c'è un vero e proprio standard nella definizione e classificazione dei Tipi di Dati - essendo il problema non facilmente svincolabile dai sistemi EDP e dai linguaggi di programmazione specifici, soprattutto per quanto concerne i dati primitivi - di fatto si riscontra una certa concordanza di opinioni per poter dare una prima classificazione, relativa e sufficientemente generale, dei Tipi di Dati. Possiamo pertanto pensare di suddividere logicamente i dati in tre categorie primarie: 1. Dati elementari (semplici, primitivi o fondamentali); 2. Dati strutturati di tipo statico (dati derivati); 3. Dati strutturati di tipo dinamico (dati derivati). DATI ELEMENTARI Un Tipo di Dato si dice elementare se esso è direttamente fruibile tramite un linguaggio di programmazione e non è ulteriormente scomponibile; vista la differente natura dei linguaggi di programmazione e dei sistemi EDP si potranno considerare alcuni tipi principali come dati di tipo elementare, cioè quei tipi primitivi generalmente presenti in quasi tutti i contesti implementativi; in pratica, questi Tipi di Dati vengono dichiarati a programma con dichiarazioni semplici e l'allocazione di memoria è per essi fissa e predeterminata. Possiamo considerare come dati elementari i seguenti tipi: Carattere; Intero; Reale; Booleano; Tipi definiti per Enumerazione. prof. Felice Zampini Dati(1) 11/47 Nelle varie implementazioni per i tipi elementari sono previste delle varianti (con/senza segno, corti/lunghi, con maggiore o minore precisione ed intervallo di rappresentazione). DATI STRUTTURATI Un Tipo di Dato si dice Strutturato, o Derivato, se esso è definito a partire dai dati semplici. Per costruire un dato derivato si possono utilizzare appositi strumenti logicolinguistici (costruttori e generatori di tipo) e procedimenti di tipo creativo (in un certo senso) che, a seconda delle possibilità offerte dal linguaggio di programmazione, consentono di definire strutture di dati, sia astratte che concrete, di tipo Statico e Dinamico. STRUTTURE STATICHE DI DATI I dati strutturati di tipo statico sono quei tipi di dati (costruibili a partire dai tipi semplici) le cui dimensioni non possono essere modificate durante l'esecuzione del programma (gli elementi sono in numero costante); in pratica, questi dati vengono dichiarati a programma unitamente alle loro dimensioni, sicchè l'allocazione di memoria per essi è staticamente determinata. Possiamo considerare le seguenti strutture statiche di dati: Array (vettori e matrici); Stringa; Record; Tabella; Insieme. Nota Il tipo di dato Stringa costituisce un caso particolare, essendo considerato di tipo elementare o no a seconda della sua disponibilità in modo diretto o meno nel linguaggio di programmazione. Il tipo di dato Record in alcuni casi (eccezioni) potrebbe essere considerato come non propriamente statico (record a lunghezza variabile non omogenei). Anche per il tipo Array in alcuni contesti sono possibili particolari operazioni di allocazione dinamica. STRUTTURE DINAMICHE DI DATI I dati strutturati di tipo dinamico sono quei tipi di dati le cui dimensioni possono essere modificate durante l'esecuzione del programma (gli elementi possono essere in numero variabile); in pratica, questi dati vengono solo dichiarati a programma (in modo adimensionale), sicchè per essi si ha una ALLOCAZIONE DINAMICA di memoria (memoria heap). prof. Felice Zampini Dati(1) 12/47 Possiamo considerare le seguenti strutture dinamiche di dati: Puntatore (pointer); Lista; Coda (queue); Pila (stack); File; Albero (tree); Grafo. Nota Il tipo di dato File, in particolare il tipo File Dati, data la sua importanza in informatica e la varietà delle strutture con esso definibili, meriterà un discorso a parte. I tipi di dati Albero e Grafo (nelle loro diverse varianti) rientrano in una categoria di strutture chiamate STRUTTURE NON LINEARI (gli elementi o nodi di informazione possono avere più predecessori e più successori). Altri tipi di oggetti complessi e particolari, da parte, sono i seguenti: Funzioni (functions); Unioni; Strutture; Classi. prof. Felice Zampini Dati(1) esaminare a 13/47 TIPO INTERO Il tipo di dato intero è un tipo elementare definito sull'insieme I dei numeri interi con associata algebra basata sulle ordinarie regole ed operazioni aritmetiche (+ - * /). La Rappresentazione Macchina (rappresentazione interna in memoria centrale o struttura fisica del dato) del tipo intero si effettua in 2 modi: - Rappresentazione in Segno/Modulo; - Rappresentazione in Complemento a 2. Tali rappresentazioni macchina sono limitate dal numero di bit prefissati per codificare un intero (word di memoria); detto n tale numero ed i un generico intero dell'insieme I si ha infatti: i 2n-1 (i 0) Riservando un bit per la codifica del segno, al fine rappresentare interi positivi e negativi, riesce pertanto: di -2n-1 i 2n-1-1 Nei piccoli sistemi (p.es. PC) è tipico il valore n=16, percui gli interi rappresentabili cadono nell'intervallo: -215 -32728 215-1 32727 Situazioni determinanti interi non rappresentabili, cioè non compresi nel range dei valori codificabili, andranno a causare condizioni di OVERFLOW o di UNDERFLOW oppure approssimazioni per ARROTONDAMENTO o TRONCAMENTO (mod 2n), a seconda del sistema Hw/Sw utilizzato. RAPPRESENTAZIONE IN SEGNO/MODULO Il bit più significativo (MSB - Most Significant Bit) della word di memoria viene riservato per la rappresentazione del segno (0=+, 1=-) ed i restanti n-1 bit per la rappresentazione del modulo del numero. Rappresentazione Segno/Modulo Bit Word (16 bit) prof. Felice Zampini 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 -----------------------------------------------| 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 | = -9 -----------------------------------------------MSB M o d u l o Segno Dati(1) 14/47 La rappresentazione Segno/Modulo, abbastanza utilizzata nelle precedenti generazioni di elaboratori elettronici, è ora in fase di abbandono causa alcuni inconvenienti riscontrabili nella implementazione per la realizzazione delle operazioni aritmetiche elementari (oltre la doppia rappresentazione, positiva e negativa, dello zero), inconvenienti decisamente non compensati dalla immediatezza interpretativa di tale rappresentazione. RAPPRESENTAZIONE IN COMPLEMENTO A DUE Questa rappresentazione è identica a quella in Segno/Modulo per numeri interi i0 (con MSB=0), mentre se i0 si pone MSB=1 e si codifica un modulo dato da: 2n-1-|i| (complemento a 2n-1 di i). Rimandando all'aritmetica dei calcolatori, per quanto concerne le regole di complementazione e le operazioni su numeri rappresentati in complemento a 2, facciamo alcune osservazioni su tale rappresentazione ricorrendo ad un esempio, basato per semplicità su 4 bit. Rappresentazione in complemento a 2 Codifica dell'intero positivo 5: 0101 = 1*22+0*21+1*20 = 5 Codifica dell'intero negativo -5: 24-1-5 = 3 => 1011 Da notare che nella rappresentazione: Il decimale codificato è ottenibile attribuendo a MSB peso: -2n-1; p.es. 1011=1*(-23)+0*22+1*21+1*20=-8+2+1=-5 tale peso è ininfluente per i positivi in quanto ad essi è associato MSB=0; Lo zero ha un'unica codifica (0000); Si evidenziano alcune "simmetrie", come in tabella: Codifica | Decimale a |-----------4 bit |MSB=0 MSB=1 ---------|-----------0 0 0 | 0 -8 0 0 1 | 1 -7 0 1 0 | 2 -6 0 1 1 | 3 -5 1 0 0 | 4 -4 1 0 1 | 5 -3 1 1 0 | 6 -2 1 1 1 | 7 -1 Si noti ancora che: Invertendo i bit di un numero negativo (complementazione ad uno) si ottiene il suo modulo diminuito di 1 (per esempio, da: -3 = 1101 si ottiene 0010 = 2); Aggiungendo 1 al max positivo si ottiene il min negativo (max in modulo). La rappresentazione in complemento a due si rivela particolarmente conveniente per gli elaboratori elettronici, apportando diversi vantaggi nella realizzazione dei circuiti aritmetici (aritmetica dei calcolatori). prof. Felice Zampini Dati(1) 15/47 TIPO CARATTERE Il tipo di dato carattere è un tipo elementare definito sulla base dei simboli costituenti l'usuale alfabeto umano (occidentale), classificabili in caratteri: ALFABETICI ABCDEFGHIJKLMNOPQRSTUVWXYZ (upper-case) abcdefghijklmnopqrstuvwxyz (lower-case) à á è é ì í ò ó ù ú (accentati) ç ö â ¢ (ed altri) (anche lo SPAZIO o BLANK è da considerarsi un carattere) CIFRE DECIMALI 0123456789 SPECIALI - Interpunzione: , ; : ! ? ' " ÷ (ed altri) - Matematici: + - * / ( ) < = > (ed altri) - Commerciali: & $ £ % (ed altri) - Vari: \ | @ # ^ « » § (ed altri) GRAFICI ® (ed altri) CARATTERI DI CONTROLLO Consistono in caratteri (in quanto corrispondenti ad una codifica) non riproducibili impiegati per attivare funzioni macchina (hardware/firmware). Si possono definire le seguenti operazioni di base: Lettura (Read) da un dispositivo di input o memoria; Scrittura (Write) su un dispositivo di output o memoria; considerarsi "distruttiva"; prof. Felice Zampini Dati(1) tale operazione è da 16/47 Codifica, COD(car) è la funzione (biunivoca) che associa ad ogni carattere un codice (numero naturale o intero): f:CN (C=insieme di caratteri, N=sottoinsieme dei numeri naturali); Decodifica, CAR(cod) è la funzione (biunivoca), inversa della COD(car), associa ad ogni Codice-carattere un carattere: che f-1:NC Confronto car1 car2 sse COD(car1) COD(car2). La Rappresentazione Macchina del tipo carattere avviene sulla base del codice testuale alfanumerico utilizzato per memorizzarne i relativi bit. Codici (alfanumerici) di vasto impiego nei contesti EDP sono il codice ASCII (standardizzato CCITT, set di caratteri normale od esteso), il codice EBCDIC ed il codice ISO (vedasi dispense Sistemi di Codifica). In genere, il tipo carattere viene allocato in 1 byte di memoria e, nella codifica ASCII, uno dei bit viene utilizzato o per estendere la codifica (a 256 caratteri) o per svolgere funzioni di controllo (parity-check). Esempio Visual Basic Operazione Visual Basic Risultato (nella var. ass.) ---------------------------------------------------------f:CN X%=Asc("i") Y%=Asc("l") 105 108 f-1:NC X$=Chr(105) Y$=Chr(108) Z%=X$<Y$ i l -1 (Vero) X$<Y$ Nota Tra le operazioni definibili sui caratteri un’altra di particolare interesse può essere quella che converte un carattere in una cifra (quindi in un valore numerico). prof. Felice Zampini Dati(1) 17/47 TIPO BOOLEANO Il tipo di dato booleano si identifica con l'Algebra Binaria di Boole (calcolo proposizionale, algebra di commutazione dal punto di vista elettronico) ed ammette 2 SOLI VALORI, tipicamente rappresentati tramite cifre binarie, 0/1, o da simboli quali V/F, Si/No, On/Off e similmente. si comprenda bene il collegamento tra le nozioni di: BIT - DISPOSITIVO BISTABILE SISTEMA BINARIO BYTE - - - STATO LOGICO DI UN DISPOSITIVO ALGEBRA BOOLEANA - ALGEBRA DI COMMUTAZIONE CODIFICA DIGITALE DELL'INFORMAZIONE - MEMORIA L'interpretazione insiemistica del calcolo proposizionale esplicita ed evidenzia l'isomorfismo tra le due algebre (vedi dispense sulle Strutture Algebriche): P R E D I C A T I ----------------Vero I N S I E M I ------------I (insieme "totale", di 1 elemento); Falso Negazione NOT x I-x (insieme vuoto); (differenza o complemento); Disgiunzione x OR y xy (unione); Congiunzione x AND y xy (intersezione). Oltre alle operazioni NOT, OR, AND definibili sull'insieme di supporto del tipo di dato booleano (predicati) se ne possono definire altre (NOR, XOR, NAND), per le quali si rimanda al corso di matematica e/o elettronica (Logica ed Algebra di Boole). Varrà invece la pena ricordare che: SI CHIAMA IN CAUSA UNA VARIABILE DI TIPO BOOLEANO OGNI QUALVOLTA SI OPERI UN QUALCHE CONFRONTO ove si ammettono confrontabile. prof. Felice Zampini TRA coppie COPPIE dello DI DATI DELLO STESSO stesso tipo o Dati(1) TIPO comunque di tipo 18/47 Si ricordi inoltre che le Tavole di Verità consentono di verificare in modo esaustivo (estensivamente) le operazioni booleane (ove non siano implicate relazioni definite intensivamente), al pari dei Diagrammi di Eulero-Venn nel versante insiemistico. La Rappresentazione Macchina di una variabile booleana può effettuarsi allocando per essa anche semplicemente 1 bit (in tal caso per la sua manipolazione diretta occorre che il linguaggio di programmazione sia dotato di apposite funzioni per operare sui singoli bit). Sono esempi di variabili booleane le seguenti espressioni (valutabili come proposizioni, cioè entità che ammettono i 2 soli valori logici mutuamente esclusivi Vero o Falso): x < y (x, y grandezze confrontabili) Oggi Rossi è assente. Si noti che in Informatica l’espressione Delta=0 (ove Delta è una grandezza numerica e = è l’operatore binario di assegnamento) può assumere significati diversi, dipendenti dal contesto, mentre l’espressione Delta==0 è non ambigua (ove == è l’operatore relazionale di uguaglianza): Delta=0 l’espressione è un’assegnazione if (Delta=0) ... l’espressione può avere il senso di una variabile logica (p. es. in C) Delta==0 prof. Felice Zampini l’espressione è una variabile logica. Dati(1) 19/47 TIPO REALE I numeri reali, in quanto insieme infinito e continuo di elementi, sono rappresentabili tramite un elaboratore (in quanto sistema numerico discreto finito) solo in un (limitatissimo) intervallo, tra l’altro con valori necessariamente approssimati. L’ordine di grandezza dell’intervallo reale rappresentabile e la precisione con cui possono essere rappresentati i valori numerici dipendono dai sistemi e dalle implementazioni (metodi di codifica, numero di bit impiegati, tecniche di realizzazione delle operazioni); ad ogni modo, tramite i calcolatori si riescono a codificare grandezze numeriche adatte per ogni applicazione, sia per rappresentare parametri (lunghezze, pesi, tempi, ecc.) di tipo astronomico (distanze interplanetarie, masse di corpi celesti) che di tipo atomico (masse e cariche atomiche, vita media di particelle subatomiche). Nel seguito, per semplicità, si farà riferimento a numeri in base decimale (anziché in base b generica), fermo restando che le rappresentazioni dovranno comunque essere trasferite alla macchina in binario. Il tipo reale può essere rappresentato in 2 modi: rappresentazione in Virgola Fissa (FIXED POINT); rappresentazione in Virgola Mobile (FP-FLOATING POINT). Fixed Point La rappresentazione Fixed Point utilizza una quantità predefinita di memoria, cioè un numero predeterminato di bit, per rappresentare un reale, secondo un’adeguata codifica (segno/modulo, complemento a 2, complemento a 1), in modo che il separatore decimale resti in una posizione prefissata (da cui il nome della rappresentazione). Una esemplificazione è data in figura (i bit sono numerati). Rappresentazione Fixed Point | Segno 6 5 4 3 2 Parte Intera 1 0 0 1 2 3 4 5 Parte Decimale 6 7 | Separatore Decimale Questa rappresentazione, causa alcuni inconvenienti (limitatezza delle rappresentazioni, problematiche nelle operazioni) si è rivelata poco idonea per i numeri reali e, di fatto, ove impiegata lo è per i numeri interi. prof. Felice Zampini Dati(1) 20/47 FP-Floating Point I numeri reali vengono rappresentati secondo una notazione standard chiamata RAPPRESENTAZIONE SCIENTIFICA, in tale notazione un reale è identificato dai seguenti elementi: - il Segno; - una Parte Frazionaria chiamata MANTISSA. La mantissa esprime la precisione (numero di cifre decimali) del numero. - un Fattore di Scala, dato dalla base b del sistema di numerazione (10 per semplicità) elevata ad un intero, chiamato Esponente o CARATTERISTICA, tale che moltiplicando il fattore di scala per la parte frazionaria si ottiene il numero da rappresentare. Il fattore di scala esprime l’ordine di grandezza del numero. Numero Reale = Mantissa * 10Caratteristica Esempio Rappresentazioni del numero 80.52 Parte Frazionaria Fattore di Scala 8052 10-2 805.2 10-1 80.52 100 8.052 10+1 0.8052 10+2 Si ha una RAPPRESENTAZIONE SCIENTIFICA NORMALIZZATA quando: - la mantissa è minore di 1; - la cifra più significativa è non nulla. In altri termini, il separatore decimale deve posizionarsi immediatamente a sinistra della prima cifra significativa della mantissa (in base 10, la mantissa deve essere minore di 1 e non inferiore ad 1/10). La rappresentazione normalizzata pertanto data da: 0.8052*102 prof. Felice Zampini Dati(1) nel caso dell’esempio 21/47 è Da notare che la posizione del separatore decimale e la base di numerazione possono non essere rappresentati, in quanto invarianti (in alcuni casi si può pure evitare di rappresentare il bit di segno della mantissa). La rappresentazione FP consiste nel rappresentare i numeri reali tramite la rappresentazione scientifica normalizzata facendo riferimento ai numeri binari (base 2). Associando agli elementi della rappresentazione scientifica normalizzata (segno, mantissa, caratteristica) opportune codifiche ed opportune sequenze di bit si possono ottenere diverse implementazioni nella rappresentazione dei numeri reali. Una esemplificazione è data in figura. Rappresentazione Floating Point Bit S Caratteristica 0 1 7 8 prof. Felice Zampini M a n t i s s a 31 Dati(1) 22/47 TIPO ARRAY ARRAY UNIDIMENSIONALI Si dice Array Unidimensionale, o anche Vettore, un insieme di n dati dello stesso tipo in cui ciascun elemento è univocamente individuato tramite un Indice (o subscritto). Vettore di 4 elementi di nome V V(1) V(2) V(3) V(4) ogni componente V(i) è individuata tramite un indice (intero) i (0 i n) Un vettore consiste dunque (omogenee) le quali hanno un: in una collezione di variabili NOME COLLETTIVO: nome del vettore, V; NOME INDIVIDUALE: nome di ciascun elemento V(i) (0 i n) dell'array (nome collettivo + subscritto). Il nome individuale potrà, in generale, essere denotato da un'espressione (intera), la quale dovrà essere valutata prima di poter effettuare qualsiasi operazione sulle componenti del vettore. Associando (biunivocamente) all'insieme di elementi costituenti il vettore l'insieme dei primi numeri naturali allora l'indice di un componente ne fornirà il relativo posto nella struttura (al primo componente si attribuisce indice 0 o 1 a seconda dei linguaggi). Un vettore è un caso particolare di array (array unidimensionale, cioè ad un indice) e consiste in una struttura sequenziale (ordinata) in cui l'accesso ad ogni elemento è diretto (sulla base degli indici); la struttura è di tipo statico, nel senso che ha una lunghezza fissa (o almeno con limite max superiore - in alcuni casi sono ammessi array dinamici, ottenibili tramite allocazione dinamica della memoria) ed il tempo di accesso è costante per ogni elemento. La Rappresentazione Macchina, cioè in memoria centrale, di un vettore è data da una struttura sequenziale, ovvero gli elementi del vettore sono allocati ad indirizzi contigui (vettore di memoria, struttura monodimensionale). Posto: Ne = Numero di elementi o componenti del vettore; Le = Lunghezza degli elementi (supposta costante ed espressa in byte, word o frazione di word); Ib = Indirizzo base (indirizzo del primo componente); Ii = Indirizzo dell’elemento di indice i; Sm = Spazio di memoria occupato dal vettore; prof. Felice Zampini Dati(1) 23/47 la posizione di un vettore in memoria sarà allora individuata dalla terna: (Ib,Ne,Le) terna che, caratterizzando il vettore, consente di rappresentarlo con la scrittura: V(Ib,Ne,Le) L’elemento generico V(i) del vettore sarà dunque reperibile in RAM all'indirizzo: Ii = Ib + Le*(i-1) Lo spazio di memoria occupato dal vettore sarà dato da: Sm = Le*Ne Anche se il ricorso ai vettori si rivela particolarmente utile, soprattutto quando si ha a che fare con costrutti di tipo iterativo, le operazioni che ne modificano l'ordine logico dei componenti (inserimenti, cancellazioni, trasposizioni) non riescono sempre agevoli, nel senso che per far corrispondere ordine logico e fisico delle relative strutture (logiche e fisiche, comunque sequenziali) occorrerà spostare opportunamente gli elementi. Nota Con gli array si possono definire due tipi di operazioni: Operazioni tra elementi o componenti di array Operazioni tra gli elementi di uno o più array, corrispondenti alle operazioni effettuabili con i relativi tipi di dati costituenti gli array. Operazioni tra array Operazioni tra array in quanto tali, cioè in quanto entità distinte (variabili scalari); tali operazioni (quali p. es. il prodotto matriciale - righe per colonne), che sono oggetto di interesse dell’Algebra Matriciale, sono in genere direttamente disponibili solo in alcuni linguaggi special purpose di orientamento matematico (p. es. l’APL); nei linguaggi in cui queste operazioni non sono ammesse, un array non è manipolabile come una variabile scalare, percui sono illegali operazioni di assegnazione, confronto, prodotto, ecc. tra array: per realizzare tali operazioni, se necessario, il programmatore dovrà scrivere apposite routine e/o ricorrere ad eventuali funzioni di libreria (basandosi sulle operazioni tra i componenti). ARRAY MULTIDIMENSIONALI Si dice Array Multidimensionale, o anche Matrice, un array in cui ciascun elemento è univocamente individuato tramite 2 o più indici (o subscritti). Array Bidimensionale di 3x4 elementi di nome M M(1,1) M(1,2) M(1,3) M(1,4) M(2,1) M(2,2) M(2,3) M(2,4) M(3,1) M(3,2) M(3,3) M(3,4) ogni componente M(i,j) è individuata tramite una coppia di indici (i,j) (0 i 3 prof. Felice Zampini Dati(1) - 0 j 4) 24/47 Per un array a più dimensioni, che può riguardarsi come un array di array, il numero di elementi è dato dal prodotto dei suoi indici; considerato p. es. l’array tridimensionale M(i,j,k) valgono pertanto le formule: Ne = i * j * k Sm = Ne * Le Si hanno diversi tipi di matrici: quadrate, simmetriche, triangolari, ecc.; alcune esemplificazioni di array con relative interpretazioni sono date nelle slide DATI02 e DATI03. La Rappresentazione Macchina di una matrice, similmente che per i vettori, avviene memorizzando i suoi elementi in un vettore di memoria (struttura monodimensionale). Sia, per semplicità, M(r,c) una matrice bidimensionale, M(i,j) l’elemento generico ed I(i,j) il suo indirizzo; si possono avere 2 metodi di allocazione: Allocazione per righe (o lessicografica): la memorizzazione avviene per locazioni consecutive di memoria, ordinatamente riga per riga (fissato il primo indice - indice di riga - si fa variare il secondo indice - indice di colonna - nel suo range, iterando il procedimento nel range dell’indice di riga). Si ha: I(i,j) = Ib + (i-1)*c*Le + (j-1)*Le Allocazione per colonne: la memorizzazione avviene ordinatamente per colonne (fissato l’indice di colonna si fa variare nel suo range quello di riga, iterando il procedimento). Si ha: I(i,j) = Ib + (j-1)*r*Le + (i-1)*Le Le regole di allocazione e le espressioni precedenti si possono opportunamente generalizzare. Per quanto detto, nelle applicazioni conviene quindi, quanto più possibilmente, essere fedeli al tipo di allocazione effettuata (p.es. non scandendo l’array per colonne se memorizzato per righe, qualora ciò non sia necessario), al fine di ottimizzare i tempi di accesso e la gestione generale degli array. Altre considerazioni da fare circa l’impiego degli array sono le seguenti: la possibilità di utilizzare variabili indicizzate consente di fare riferimento ad un solo oggetto (l’array), operando sui suoi elementi in modo iterativo tramite gli indici (in alternativa all’uso di altrettante variabili singole); tramite gli array sono possibili classificazioni sempre più spinte (in proporzione al numero degli indici) dei dati, associando agli indici i significati o gli attributi richiesti allo scopo. Per una sintesi delle caratteristiche e delle problematiche concernenti gli array si veda la slide DATI02. prof. Felice Zampini Dati(1) 25/47 TIPO STRINGA Dato un alfabeto A (set di caratteri) sappiamo che si può costruire una ALGEBRA DELLE PAROLE (calcolo proposizionale) definendo in A delle operazioni; in particolare, ciò è possibile introducendo la nozione di parola vuota (Pv="") e l'operazione di CONCATENAZIONE (addizione tra stringhe) sugli elementi di A, definiti come parole (l'operazione è "chiusa" rispetto all'insieme delle parole di A, associativa, non commutativa). Il tipo stringa può identificarsi, in Informatica, con l'algebra delle parole; sebbene una stringa possa essere definita a partire da tipi di dati primitivi, più precisamente come Array di caratteri, spesso si considera tale tipo di dato, ove direttamente dichiarabile nel linguaggio, come elementare. Una stringa può dunque essere vista come una sequenza (teoricamente infinita, in pratica limitata dai vincoli imposti dall'hardware/software del sistema) di caratteri di un dato alfabeto (o la stringa vuota Sv=""); su tale tipo di dato, oltre alle operazioni suddette, se ne definiscono altre, di particolare interesse sul piano della programmazione. Alcune tra le operazioni stringa più comuni sono le seguenti (S=stringa; m,n interi non negativi): LUNGHEZZA della stringa LENGTH(S) SELEZIONE: Sottostringa iniziale LEFT(S,n) Sottostringa finale RIGHT(S,n) Sottostringa generica SUBSTR(S,m,n) Un’altra operazione interessante è quella di COPIA. Si può inoltre definire una relazione di ordinamento (lessicografico - sulla base del sistema di codifica dei caratteri), quindi un CONFRONTO tra stringhe ponendo: S1S2 sse 1°car.S11°car.S2 (iterativamente se vale =). La Rappresentazione Interna di una stringa corrisponde alla rappresentazione in codice testuale alfanumerico (ASCII) dei caratteri che la compongono, con eventuali caratteri di controllo aggiunti in dipendenza del linguaggio (di norma uno, del tipo: fine-stringa, fine-testo). prof. Felice Zampini Dati(1) 26/47 Esempio Visual Basic Sia: A$="Pippo"; B$="Pluto" Operazione Visual Basic Risultato (nella var. ass.) ---------------------------------------------------------------Concatenazione C$=A$+" e "+B$ Pippo e Pluto LENGTH L%=Len(C$) 13 LEFT L$=Left(C$,5) Pippo RIGHT R$=Right(C$,5) Pluto SUBSTR S$=Mid(C$,4,6) po e P A$<B$ Z%=A$<B$ -1 (Vero) ASC(i)=105<ASC(l)=108 => A$="Pippo" < B$="Pluto" prof. Felice Zampini Dati(1) 27/47 TIPO STRUTTURA O REC ORD Si dice Struttura, o anche Record, un tipo di dato derivato costituito da un aggregato di dati, omogenei o no, contraddistinti ciascuno da un nome e chiamati Campi; anche alla struttura è associato un nome (o comunque un identificatore) pertanto, per accedere ad un campo, occorrerà specificare sia il nome della struttura che quello del campo. Un modo tipico per definire un record a livello non tecnico, quindi al livello logico in cui concepisce i dati l’utente finale, consiste nel fornire il cosiddetto TRACCIATO RECORD. Un tracciato (o formato) record consiste nella descrizione di una certa realtà (attraverso i dati) sulla base di taluni attributi o proprietà formali che, in un dato contesto, si ritengono interessanti per individuarla. Tali attributi li chiameremo campi. Per esempio, volendo modellare l’agendina annuale degli amici (entità da rappresentare) si potrebbe avere il seguente tracciato record. RECORD: AGENDA N. NOME-CAMPO TIPO 01 02 03 04 05 06 07 08 COGNOME NOME INDIRIZZO SESSO ETÀ PROFESSIONE TELEFONO E-MAIL Alfanum. Alfanum. Alfanum. Alfab. Numerico Intero Alfanum. Alfanum. LUNGHEZZA 25 15 50 1 2 5 16 30 FORMATO Note Casato Codice M/F Abbrev. Si noti che i nomi dei campi (autoesplicativi nell’esempio) non vanno confusi coi loro possibili contenuti: i nomi rappresentano gli attributi, le proprietà tramite le quali si vuole descrivere una certa realtà, indipendentemente dai “valori” concreti (istanze) da essa assumibili. Un tracciato record è dunque un modello di dati, cioè ne esprime il loro significato intensionale. Si noti altresì che il significato dei campi (se non autoesplicativo) deve essere esplicitato, inoltre se un campo è codificato (quale il campo SESSO) anche la sua codifica deve essere esplicitata (M=Maschio, F=Femmina). I campi di una struttura possono essere non solo semplici ed eterogenei ma pure, a loro volta, strutturati (quali array o strutture); in tal caso si parla di CAMPI COMPOSTI e SOTTOCAMPI. In genere, i sottocampi vanno opportunamente distinti o qualificati, a seconda del loro livello di annidamento. prof. Felice Zampini Dati(1) 28/47 Per esempio, la schematizzazione data nella figura seguente (ove: S=Sesso, PR=Professione, SC=Stato Civile) potrebbe modellare un semplice archivio anagrafico in cui sono presenti campi composti e sottocampi. Record: Anagrafico COGNOME NOME An 25 An 15 DATANASCITA GG MM AA I 2 I 2 I 2 S LUOGONASCITA IND CAP CITTÀ PROV A 1 An 40 An 5 An 25 A 2 PR SC I 2 A 1 Tale rappresentazione grafica, interpretabile con semplicità ed immediatezza, costituisce un altro modo per definire un record a livello non tecnico. Una definizione un pò più tecnica della precedente (comunque ancora orientata a fornire una visione logica del record anche all’utente non specialista), in cui si qualificano i sottocampi e si evidenziano le codifiche dei campi o i rimandi ad esse, è la seguente: RECORD: ANAGRAFICO N. NOME-CAMPO TIPO 01 02 03 COGNOME NOME DATANASCITA 03.1 GG 03.2 MM 03.3 AA SESSO LUOGONASCITA 05.1 IND 05.2 CAP 05.3 CITTÀ 05.4 PROV PROFESSIONE STATOCIVILE Alfanum. Alfanum. Composto Intero Intero Intero Alfab. Composto Alfanum. Alfanum. Alfanum. Alfab. Intero Alfab. 04 05 06 07 LUNGHEZZA FORMATO 25 15 Note Casato 2 2 2 1 Codice M/F 40 5 25 2 2 1 Codice Codice Codice Sigle naz. Cod. interno Cod. interno Si noti che in quest'ultima definizione è data la lunghezza anche per i campi numerici; in effetti, per tali campi occorre considerare che le lunghezze sono, in genere, fisse, a seconda del loro tipo e del sistema (tipici i valori di 2, 4, 8 bytes rispettivamente per interi, reali in singola precisione, reali in doppia precisione), cosa di cui il programmatore dovrà ovviamente tenere conto. prof. Felice Zampini Dati(1) 29/47 Volendo, p.es., prevedere al massimo 2 cifre per il campo STATOCIVILE, che in quanto intero ammette un range di valori rappresentabili con più di 2 cifre, occorrerà effettuare un apposito controllo dell’input, acquisendo una stringa di max 2 caratteri e valutandola come un intero oppure limitando il valore immesso a non oltre il numero 99. Oltre a strutture del tipo suddetto è possibile pure definire RECORDS CON VARIANTI, nei quali è consentita la presenza di gruppi di campi associati ad un set di possibili valori di un campo, in modo che ad ogni valore del campo possa corrispondere un gruppo (p.es. si potrebbe associare al campo STATOCIVILE del record Anagrafico il gruppo di dati caratterizzanti il coniuge, qualora il suo valore corrisponda a "coniugato", e via dicendo); in tale eventualità l'accesso ai campi delle parti varianti va in genere opportunamente disciplinato. Il concetto di struttura, in quanto aggregato logico di dati teoricamente di natura e tipo qualunque, cioè un insieme di dati correlati trattabili come un unico oggetto, può essere generalizzato e consente di definire strutture complesse di strutture complesse, esso fornisce dunque un potente e flessibile Meccanismo di Astrazione per definite nuovi tipi di dati, allo scopo di poter modellare realtà anche complesse e diversificate. I campi definibili in un record possono essere di vario tipo, quali i seguenti: - Alfanumerico (carattere o stringa) Numerico (intero o reale) Logico Data (vari formati) Chiave (primaria/secondaria) Indice Puntatore Array Record È inoltre possibile gestire campi del tipo: - Testo o Memo (di norma è un riferimento a documento) - A calcolo - Oggetto (immagine, suono, video) Giova notare che in alcuni linguaggi di programmazione (p.es. il linguaggio C/C++) si hanno diverse possibilità di dichiarare la lunghezza dei dati di tipo numerico (specificando attributi quali short, long, double e simili). Seguono alcuni esempi di dichiarazioni di record in diversi linguaggi di programmazione (dichiarazioni strutturali di record cui in genere seguiranno definizioni di variabili di tipo record). prof. Felice Zampini Dati(1) 30/47 Visual Basic - Dichiarazione del record Agenda Public Type Agenda Cognome As String * 25 Nome As String * 15 Indirizzo As String * 50 Sesso As String * 1 Età As Integer Professione As Integer Telefono As String * 16 E-Mail As String * 30 End Type COBOL-Like - Definizione del record Anagrafico Var ANAGRAFICO: Record COGNOME: String,25; NOME: String,15; DATANASCITA: Record GG: Integer; MM: Integer; AA: Integer; end SESSO: Char LUOGONASCITA: Record IND: String,40; CAP: String,5; CITTÀ: String,25; PROV: String,2; end PROFESSIONE: Integer; STATOCIVILE: Char; end; C++ - Definizione del record Anagrafico struct Record { char COGNOME[25]; char NOME[15]; struct Data DATANASCITA; char SESSO; struct Luogo LUOGONASCITA; int PROFESSIONE; char STATOCIVILE; } Anagrafico; // Struttura nidificata // Struttura nidificata struct Data { int GG; int MM; int AA; } DATANASCITA; struct Luogo { char IND[40]; char CAP[5]; char CITTÀ[25]; char PROV[2]; } LUOGONASCITA; prof. Felice Zampini Dati(1) 31/47 FILES Tradizionalmente, il termine File denota un insieme di “documenti” e corrisponde al termine italiano Archivio. Ma l’interpretazione di un documento dipende almeno dalla struttura organizzativa dei suoi dati, dal loro formato e dal loro significato, quindi, già dalla semplice considerazione della differenza intercorrente tra documenti di tipo Testuale (lettere, appunti, annotazioni, dispense, ecc.) e documenti di tipo Schedario (archivi anagrafici, agende telefoniche, inventari, ecc.), tale definizione appare piuttosto vaga e restrittiva, dovendosi per l'appunto precisare di quale TIPO DI FILE si tratti. Una classificazione dei files nell’ambito informatico è dunque quanto mai essenziale, al fine di consentirne una corretta gestione ed amministrazione, sia da parte dell’utenza che del SO. Riguardando un file, in via generale, come un insieme di "oggetti" (dati che codificano informazioni), cui competerà un nome (secondo le regole del SO utilizzato), si può pensare ad una classificazione dei file sulla base dei seguenti fattori principali: Organizzazione logica delle informazioni (struttura logica dei dati); Formato delle informazioni (codifica dei dati e relativa struttura interpretativa); Organizzazione fisica delle informazioni (struttura fisica dei dati interna all'elaboratore o al supporto di registrazione); Metodi di accesso alle informazioni programmi possono operare sui dati); Destinazione d'uso del file. (modalità con cui i Il modulo del SO predisposto alla gestione dei files si chiama FILE SYSTEM, esso prevede la gestione di diversi tipi di files, con associate operazioni e rappresentazioni interne. Il File System è spiegato nella dispensa File System. Problematiche attuali circa i SO ed i File System tendono a dotare questi ultimi di pochi tipi di file (al limite un unico tipo elementare), rimandando l'implementazione di tipi complessi ai linguaggi di programmazione. Lo scopo di tali soluzioni tende ad essere quello di conseguire una maggiore portabilità del software ed una semplificazione dei File System, compensando adeguatamente taluni vantaggi cui si dovrebbe rinunciare trascurando un File System "ricco" di tipologie di files direttamente gestite. prof. Felice Zampini Dati(1) 32/47 CLASSIFICAZIONE DEI FILES In prima istanza, i file possono essere memorizzati sui supporti di registrazione, con riguardo alla loro occupazione di spazio, in due modi principali: File Multivolume: il file occupa più supporti di registrazione (di conseguenza la disponibilità on-line del file sarà limitata solo ad una sua parte se il sistema prevede meno unità di memorizzazione di quante ne occupa il file). Directory o VTOC: più file sono memorizzati sullo stesso supporto; in tal caso le descrizioni dei file, utili per la loro gestione (che è a carico del sistema, l'utente può comunque agire sulle directory), sono raccolte in un file speciale sul supporto, chiamato per l'appunto Directory o VTOC (Volume Table Of Contents). Una Directory è pertanto un file descrittore di file (l’argomento sarà approfondito nel capitolo dedicato al File System). Vediamo ora, in rassegna, i più comuni tipi di files amministrati dagli odierni File System (i tipi ammessi dipenderanno dall'hardware/software di base del sistema). File Utente Possiamo identificare i file utente come quei file più direttamente accessibili e gestibili da parte del programmatore e dell'utente (finale); in tal senso si possono distinguere: File di Testo (formattati e non formattati); File di Comandi (file batch); File di Programma (sorgente); File Dati. File di Testo Un file di testo è un insieme di caratteri, in corrispondenza ad una data codifica (in genere ASCII). Un file di testo viene detto NON FORMATTATO se in esso compaiono esclusivamente caratteri stampabili (file ASCII puro), se invece il file comprende sia caratteri stampabili che caratteri di controllo o gestionali (p.es. per definire lo stile e le dimensioni dei caratteri, l'allineamento del testo, il formato dei paragrafi, ecc.) allora il file testuale dicesi FORMATTATO. In genere, tramite un text editor (di un linguaggio di programmazione o del SO) si crea un file di testo non formattato mentre tramite un word processor si crea un file di testo formattato (è però possibile, coi moderni word processor, salvare il file come ASCII-file cioè come testo non formattato). prof. Felice Zampini Dati(1) 33/47 File di Comandi Sono file editabili (quindi testuali o ASCII) contenenti comandi (di sistema operativo), detti comunemente FILE BATCH. Questi file consentono di creare delle procedure batch e dei macrocomandi e sono utili ai fini di facilitare e migliorare la gestione del sistema e delle risorse tramite interventi dell’utente (procedure personalizzate, partenze automatiche, autoconfigurazioni del sistema). Nota: in ambiente riservata: .BAT. Windows per un file batch è tipica l’estensione File di Programma Sorgente Sono file contenenti programmi in formato sorgente (source), cioè originario (istruzioni espresse in un dato linguaggio di programmazione di tipo simbolico). Questi file, che sono editabili, si possono creare tramite un editor o con un word processor (purchè siano salvati come ASCII-file) e a tutti gli effetti sono file testuali. File Dati (vedasi dispensa Archivi) File Oggetto Sono file in formato macchina rilocabile, cioè codificati in linguaggio (binario) macchina. Essi consistono nell'output del processo di traduzione (compilazione o assemblaggio), processo che, a partire da un programma source (scritto in linguaggio assembler o ad alto livello), produce un file in linguaggio macchina chiamato File Oggetto o modulo object; di norma, tale modulo non è direttamente eseguibile dall’elaboratore in quanto privo dei "link" necessari per una corretta esecuzione. Nota: in ambiente Windows per un file object è comune l'estensione: .OBJ. File Eseguibili Sono file in formato macchina il cui codice include i riferimenti necessari per la loro eseguibilità. Un file eseguibile consiste, in pratica, nel risultato del processo di linkaggio che, a partire da un modulo object, produce il codice eseguibile, fruibile dall'elaboratore in modo diretto e completo per svolgere le attività previste dal programma. L'unica operazione possibile su tali tipi di file è l'esecuzione (oltre, ovviamente, alle operazioni globali quali quelle di copia, cancellazione, ridenominazione e simili). Nota: in ambiente Windows un file eseguibile deve avere come estensione l'estensione riservata: .EXE o .COM. prof. Felice Zampini Dati(1) 34/47 Directory Le directory (indirizzari) sono descrittori di files, che associano ai nomi simbolici dei file rappresentati le relative descrizioni. Una directory, indicabile anche con la sigla VTOC (Volume Table Of Contents), consiste in una struttura dati contenuta su aree riservate del supporto di registrazione (p.es. apposite tracce del disco) e utilizzata dal File System ove sono indicate le descrizioni dei file contenuti sul supporto (nomi, caratteristiche, indirizzi, ecc.). Tipicamente, le directory consistono in strutture ad albero (organizzazioni gerarchiche) nelle quali ogni nodo è un nomefile (foglia) o una (sub-)directory (sottindirizzario) e possiede un nome locale ed un nome globale (dato dal percorso), l'indirizzario principale (root directory o radice) è una directory ed ha nome unico. Le operazioni possibili su tali strutture sono quelle di creazione, rimozione, modifica, ricerca, visualizzazione, puntamento, ecc. (approfondimenti nel capitolo File System). Spesso si indica una directory col nome di CARTELLA. File Binari Si dicono file binari quei file costituiti da sequenze di bit per le quali non si ha una vera e propria struttura interpretativa di tipo logico; file di questo tipo sono, p.es., i file generati da processi di digitalizzazione di immagini, fotografie o suoni, in cui ogni singolo bit può intervenire nella codifica. Pseudo File Sono dei file speciali, associabili anche a dispositivi periferici o virtuali, utili per effettuare simulazioni, tests, operazioni fittizie, ecc. Altri tipi di files Si possono distinguere, in base all'utilizzazione, i seguenti tipi: alla funzione ed - File di Libreria; - File di Configurazione; - File Temporanei; - File di Spool; - File di Log; - File di Backup; - ecc. prof. Felice Zampini Dati(1) 35/47 La Rappresentazione Macchina di un file dipende da vari fattori, quali quelli sopra menzionati per classificarli, fattori che in alcuni casi sono deducibili dal contesto (p.es. codifica ASCII per file testuali non formattati, codice macchina per file eseguibili) ed in altri casi sono dipendenti da considerazioni applicative, implementative e di efficienza (p.es. tipo di applicazioni, tecniche di memorizzazione e metodi d’accesso ai dati, metodi di ricerca e ordinamento utilizzzati nei programmi). Anche per le Operazioni definibili considerazioni analoghe a quanto ora esposto. sui file valgono Per il momento si elencano alcuni tipi comuni di operazioni che possono essere generalmente svolte su tutti i file, considerati nella loro interezza, operazioni che (non agendo su parti dei file) si chiamano OPERAZIONI GLOBALI: Creazione (i file oggetto ed eseguibili sono automaticamente risp. dal compilatore e dal linker); creati Cancellazione; Copia; Ridenominazione. Le operazioni globali sono effettuabili dall’ambiente di sistema operativo. da programma o Data la varietà e complessità degli argomenti e delle alternative possibili, si rimanda alle dispense Device Management, File System, Archivi per altri studi ed approfondimenti. Seguono Windows. prof. Felice Zampini alcune liste dei più Dati(1) diffusi formati di file in 36/47 FORMATI DEI FILE Formati Generali .cgi Common Gateway Interface .class file interpretabile da Java prof. Felice Zampini .com eseguibile di ridotte dimensioni .diz file di informazioni .dll Dynamic Link Library .doc documento Word .dot modello Word .drv drive .emi messaggi e-mail Outlook .exe file eseguibile (o autoscompattante) .fon font di caratteri .frm form visual basic .htm HyperText Markup Language (.html) .ini file di configurazione .java source Java .js javascript .pdf Portable Document Format (Acrobat Reader) .pl script Perl .ppt file PowerPoint .ps PostScript .reg file di registro .rtf Rich Text Format .sys file di sistema .ttf True Type Font .txt text file .vbp Visual Basic Project .vcf Vcard (bigl. visita, Rubrica Windows) .wri Write for Windows .xls file Excel Dati(1) 37/47 File Compattati .arc PkArc o PkPak .arj ARJ .b64 Base 64 (MIME) encoding .rar WinRAR .uue Codifica UUEncode, WinZip .xx_ EXPAND (fornito con Windows) .zip WinZip File Audio .mid MIDI .mod MIDI evoluto .mpg compressione tracce audio CD .pcm file audio “grezzo” .ra RealAudio (.ram) .raw suono campionato in formato nativo .voc suono campionato in formato SoundBlaster .wav suoni digitalizzati File Video .avi Video for Windows .fli Animazioni .mov QuickTime Movie prof. Felice Zampini Dati(1) 38/47 File Grafici AI Adobe Illustrator BMP Bitmap Windows CDR CorelDraw CGM Computer Graphics Metafile (Freelance/Pagemaker/Harv.Graph./…) CLP Windows Clipboard DXF AutoCAD EPS Encapsulated PostScript GEM Graphics Environment Manager (formato a oggetti di GEM) GIF Graphics Interchange Format (CompuServe) HPGL HP Graphics Language (Plotter HP) JPEG Joint Photographers Experts Group (fotografia) PCD Kodak Photo CD (fotografia) PCL Printer Control Language (HP Laser Print) PCX Zsoft PaintBrush PICT MacDraw/Sw MAC PNG Portable Network Graphics (nuovo formato) PSD Adobe Photoshop RLE Run Lenght Encoded (CompuServe) TGA Truevision-AT&T(Targa/Vista/…) TIFF Tagged Image File Format (Aldus&Microsoft per MAC e PC) WMF Windows Metafile prof. Felice Zampini Dati(1) 39/47 TIPO PUNTATORE Un Puntatore (Link, Reference o Pointer) è un tipo di dato il cui contenuto è l'indirizzo di una cella di memoria: l'informazione associata ad un pointer è l'indirizzo di una zona di memoria centrale, contenente le informazioni di interesse (dati o ancora puntatori ad essi). Un pointer è una variabile che consente di fare riferimento, ”puntare”, accedere in modo indiretto ad un oggetto della memoria (variabile modificabile), in modo da poterlo manipolare, anzichè tramite il relativo nome o identificatore, tramite il corrispondente indirizzo (indirizzamento indiretto). I puntatori, in quanto variabili, cioè aree di memoria, sono caratterizzati da un identificatore e da un tipo e devono poter essere dichiarati ed assegnati. Ciò che caratterizza questo tipo di dato, che occuperà una determinata area di memoria di lunghezza prefissata indipendentemente dall’oggetto puntato, è il modo di interpretare il contenuto e la dimensione dell’oggetto da esso puntato: il tipo associato ad un puntatore deve corrispondere al tipo dell’oggetto puntato Si potranno pertanto definire puntatori ad interi, a carattere, a reale, a stringa, a file, ad altri puntatori, ecc. Le variabili di tipo puntatore, rappresentando l’oggetto puntato, possono comparire in qualsiasi espressione ammessa in cui può comparire l’oggetto puntato, è dunque possibile definire una ARITMETICA DEI PUNTATORI, purchè si prendano in considerazione pointers allo stesso tipo-base di dati. Per una illustrazione vedasi la slide DATI05. Le variabili di tipo puntatore consentono di definire strutture di dati dinamiche, cioè modificabili durante l'esecuzione del programma, tramite l’impiego di catene di puntatori (strutture concatenate di pointers cui corrispondono strutture logicamente ordinate di dati, indirizzati dai pointers); il caso più semplice è dato dalla Lista Semplice o lineare (vedi seguito). prof. Felice Zampini Dati(1) 40/47 OPERAZIONI Creazione Assegnazione, a tempo di esecuzione, di una zona di memoria non utilizzata ad una variabile tipo pointer. Lettura/Modifica/Cancellazione Dei dati contenuti nella zona di memoria puntata tramite una variabile tipo pointer. Assegnazione/Confronto Di variabili di tipo puntatore (in relazione allo stesso tipobase di dati). Le celle di memoria heap (su cui agiranno i pointer) durante l'esecuzione del programma potranno trovarsi in una delle seguenti situazioni: Libere Non allocate dinamicamente. Accessibili Direttamente o indirettamente, dalle variabili di programma, cioè puntate da tali variabili in modo diretto o indiretto tramite una catena di accessi. Non accessibili Non libere, cioè già allocate e resesi inaccessibili causa assegnamenti sui pointer o su campi di strutture dati dinamiche (tali celle dovranno essere oggetto di recupero, ed a ciò si usano diverse tecniche, al fine di ottimizzare e, in taluni casi, non congestionare la memoria heap disponibile). prof. Felice Zampini Dati(1) 41/47 TABELLA Si dice Tabella, o Tavola, un insieme finito di elementi ciascuno dei quali è individuato da due informazioni distinte: Chiave: informazione per individuare univocamente l'elemento; Valore: effettivo contenuto informativo dell'elemento. Una tabella consente di strutturare logicamente le informazioni, ai fini di individuare determinati ”oggetti” (libri, strumenti, persone, macchine, ecc.), sulla base di appositi attributi: ogni riga individua, tramite i valori di quegli attributi, un oggetto mentre ogni colonna rappresenta una sequenza di valori di uno stesso attributo di tutti gli elementi della tabella. Normalmente, la chiave è quell’informazione (aggiunta appositamente o direttamente appartenente all’insieme degli attributi) che consente di reperire univocamente un elemento della tabella (riga) mentre il valore è da intendersi come l’insieme dei valori di tutti gli attributi caratterizzanti l’elemento. La scelta della chiave e del criterio di ordinamento dell’insieme dei suoi valori riveste dunque fondamentale importanza ai fini della definizione di una tabella. Tabella ordinata per Chiave (codice-nome) CHIAVE VALORE 005 Rossi Giulio 010 Bianchi Pino 015 Verdi Paola 020 Crispi Ivo Tabella ordinata per Valore (nome) CHIAVE VALORE prof. Felice Zampini 010 Bianchi Pino 020 Crispi Ivo 005 Rossi Giulio 015 Verdi Paola Dati(1) 42/47 Tabella ordinata per Chiave (nome) CHIAVE V A L O R E Telefono Età Città Bianchi Pino 4655712 17 RM Crispi Ivo 4892100 19 MI Rossi Giulio 542231 18 RM Verdi Paola 4890234 16 NA Il criterio di ordinamento degli elementi di una tabella (senza il quale la ricerca dovrebbe avvenire in modo sequenziale) assume, come già detto, notevole importanza ai fini della consultazione della stessa. In particolare, un metodo abbastanza rapido ed efficiente (soprattutto per grandi tabelle) consiste nell’associare alla Tabella dei Dati un'altra tabella di dimensioni ridotte, chiamata Tabella degli Indici, contenente le chiavi organizzate in modo ordinato (o un loro sottoinsieme opportunamente scelto) ed i relativi indirizzi, che puntano alla zona del supporto di registrazione della Tabella Dati in cui le informazioni relative alla chiave cercata sono reperibili. L'indirizzo che punta all’informazione è in pratica un PUNTATORE (pointer) ed il tipo di accesso così definito prende il nome di Accesso per Indici. Per una illustrazione vedasi la slide DATI05. L’accesso indicizzato prevede che la ricerca sia svolta sulla tabella degli indici (ridotta ed ordinata per chiave) sulla base della chiave, in modo da consentire un accesso diretto all’elemento della tabella dati (o alla zona in cui esso è registrato) tramite l'indirizzo associato alla chiave cercata. La ricerca delle informazioni relative alla chiave cercata avviene dunque in modo diretto, o al massimo sequenziale ma non su tutta la tabella dati bensì solo all'interno della zona individuata (sono possibili altre tecniche più efficienti, p.es. la ricerca dicotomica). Va da se la considerazione che le operazioni condotte sulle due tabelle (aggiunte, cancellazioni, modifiche) suddette devono in generale procedere in parallelo, infatti, poichè l'accesso alla tabella dati è regolato tramite la tabella degli indici, un disallineamento fra le due tabelle si rifletterebbe in un disallineamento tra la visione logica dei dati e la effettiva realtà fisica. prof. Felice Zampini Dati(1) 43/47 LISTA LINEARE Si dice Lista Lineare (Sequenza) un insieme finito di n Dati (dello stesso tipo, detti pure Nodi) ordinati tali che ciascuno abbia un predecessore ed un successore, ad eccezione del primo (nessun predecessore) e dell'ultimo (nessun successore). Lista Lineare D(1) D(2) ..... D(i-1) D(i) D(i+1) ..... D(n-1) D(n) NODO INIZIALE NODO NODO PREDECESSORE SUCCESSORE NODO FINALE A seconda che il numero di nodi della struttura sia costante o variabile (nel tempo) si parlerà di lista lineare a lunghezza fissa o variabile. L'accesso alla lista lineare (reperimento di un elemento all'interno di essa) è di tipo Sequenziale: il dato D(i) è selezionabile a partire da D(1) scorrendo in sequenza ordinatamente; la stessa logica sequenziale si ripercuote nei processi di elaborazione applicabili alla lista (il dato arriva, si accoda, aspetta il suo turno, viene elaborato). OPERAZIONI Inserimento Di un elemento, anche in testa o coda (append). Estrazione Di un elemento, cioè prelievo e cancellazione. Fusione Di 2 o più liste in una nuova lista. Frazionamento Della lista in 2 o più parti. Ricerca Di un elemento, cioè lettura (selettiva). prof. Felice Zampini Dati(1) 44/47 Lista vuota, Test lista vuota, Lunghezza (N. nodi attuali) I criteri di Ordinamento e di Inserimento/Estrazione saranno da individuarsi in base ai contesti applicativi (priorità da gestire, data-flows, ecc.). In ambiente EDP rivestono particolare importanza, visto il loro impatto nelle applicazioni, quelle liste in cui inserimenti ed estrazioni avvengono sui nodi agli estremi, liste cui si è attribuito il nome di PILA e CODA (vedi seguito). Il modo più semplice per allocare una lista lineare, in quanto struttura sequenziale dinamica, è tramite una struttura sequenziale. Si hanno varie strutture a lista, in particolare, considerando liste i cui elementi siano a loro volta liste, si ottiene una generalizzazione della nozione di lista lineare (liste multiple). Le varie strutture a lista sono illustrate nelle slide DATI06, DATI07, DATI08. prof. Felice Zampini Dati(1) 45/47 CODA Si dice Coda (Queue) una struttura unidimensionale ordinata, dinamicamente variabile, in cui Inserimenti ed Estrazioni (e letture) avvengono agli estremi opposti (p.es., inserimenti in fondo ed estrazioni in cima o testa alla coda). Coda TESTA FONDO D(1) D(2) ..... D(i-1) D(i) D(i+1) ..... D(n-1) D(n) ESTRAZIONE INSERIMENTO In una Coda (riflettendo così la nozione comune di lista o coda di attesa: coda di attesa ad un sportello bancario, lista di attesa prenotazione volo, ecc.) si segue una logica di accesso percui il primo elemento inserito (temporalmente) è pure il primo ad essere estratto. In altri termini, gli elementi sono elaborati conservando il loro ordine di arrivo nella coda; tale criterio, o disciplina di accesso alla struttura, suole abbreviarsi con la sigla FIFO (First In First Out). Si noti che l'estrazione del dato D(i) dalla coda implica l'estrazione di tutti i predecessori; se, inoltre, una coda con numero limitato di posti è piena allora un inserimento (se ammesso in tale situazione) causa lo "scivolamento" degli elementi verso la testa (shift a sinistra nel nostro caso), con l'inevitabile risultato di perdere il primo elemento della coda. prof. Felice Zampini Dati(1) 46/47 PILA Si dice Pila (Stack) una struttura ordinata, a dimensione variabile, in cui Inserimenti ed Estrazioni avvengono solo ad un estremo (p.es., in fondo). Pila INSERIMENTO TESTA FONDO D(1) D(2) ..... D(i-1) D(i) D(i+1) ..... D(n-1) D(n) ESTRAZIONE In una Pila, pertanto, gli elementi vengono opposto a quello di arrivo, cioè il meccanismo criterio percui l'ultimo arrivato è il primo essere servito); tale disciplina di servizio (Last In First Out). elaborati in ordine di accesso segue il ad uscire (cioè ad dicesi perciò LIFO La Pila rispecchia la nozione comune di pila di oggetti (pacchi, libri, ecc., accatastati su di un piano) per i quali conviene che il primo da prelevarsi sia l'ultimo aggiunto. Pure un problema che generi a cascata altri problemi (sottoproblemi) genera una struttura a pila, nel senso che l'ultimo problema affiorato sarebbe in testa alla pila di problemi da risolvere. Si noti che l'estrazione del dato D(i) dalla Pila implica l'estrazione di tutti i successori. Anche in questo caso, similmente che in quello della coda, inserimenti incontrollati oltre il limite (necessariamente esistente in pratica) di capienza dello stack comportano la perdita di dati nella struttura o errori di programmazione piuttosto seri (spesso l'impossibilità di prosecuzione del programma, causa la perdita di indirizzi nella Stack Area e il malfunzionamento conseguente dello Stack Pointer). prof. Felice Zampini Dati(1) 47/47