Guida informatica di base per principianti
Transcript
Guida informatica di base per principianti
Maxy Guida 2 __________________________________________________________________________________________ Indice Introduzione……………………………………..…… Pag 3 CAP I Struttura dell’Elaboratore…………………………... Pag 4 CAP II Linguaggi e Sistemi Operativi ..……………………... Pag 23 CAP III Sistemi di Numerazione……………………………… Pag 27 CAP IV Logica delle Proposizioni…………………………….. Pag 36 CAP V Struttura dei Dati…………………………………….. Pag 41 CAP VI L’Arte di Programmare……………………………... Pag 49 CAP VII Le Basi di Dati………………………………………... Pag 65 CAP VIII Virus Informatici…………………………………… Pag 95 Appendice A Basi di HTML.…………...…………………………… Pag 99 Appendice B Installare MySQL……………………………………. Pag 126 Appendice C Manuale del Dos…………………………...………. Pag 128 Informatica di Base 3 __________________________________________________________________________________________ INTRODUZIONE L’utilizzo del computer e i fondamenti dell’informatica sono diventati requisiti indispensabili per chi vuole affrontare qualsiasi tipo di lavoro. Le conoscenze di base dell’informatica sono ormai richieste in molti concorsi e l’utilizzo del computer è praticamente obbligatorio in moltissimi ambiti di lavoro o di studio. “Maxy Guida: Informatica di Base” nasce quindi per rendere disponibile in italiano una valida risorsa per chi vuole avvicinarsi a questo affascinante e oscuro mondo. Nel libro è infatti possibile trovare capitoli dedicati ai vari aspetti dell’informatica, dalle nozioni basilari come la struttura di un elaboratore fino agli argomenti più complessi come le basi di dati. Gli argomenti sono trattati in maniera semplice e concisa evitando lungaggini che avrebbero appesantito troppo il testo. Quasi tutti i capitoli hanno inoltre una serie di esercizi che consentono di mettere in pratica le nozioni apprese Distribuzione: Questo libro viene reso disponibile gratuitamente e può essere distribuito sotto qualsiasi forma (anche cartacea) alle seguenti condizioni: • • il materiale dovrà essere distribuito senza alcuna modifica ai suoi contenuti; niente sarà dovuto da chi lo acquisisce a colui che lo distribuisce, salvo rimborso di eventuali spese per il supporto che lo contiene; Potete spedire critiche, commenti, suggerimenti, segnalazione di errori o mancanze direttamente all’autore contattabile all'indirizzo e-mail [email protected]. 2002 Copyright di Massimiliano Teso Tutti i diritti riservati Massimiliano Teso Maxy Guida 4 __________________________________________________________________________________________ CAP I STRUTTURA DELL’ELABORATORE Introduzione Quando andiamo in un negozio per comprare un computer, normalmente ci viene presentato un foglio di questo tipo: TIPO CASE M/B CPU MEMORIE HD SCHEDA VIDEO CD-ROM FLOPPY MODEM MULTIMEDIA DESCRIZIONE ATX MIDITOWER ASUS CUV4X FCPGA PENTIUM III 800 128 DIMM 133MHZ SAMSUNG 30GB ULTRA66 RIVA TNT2 32MB CREATIVE 52X 1,44 MB 56K INTERNO SB CREATIVE 128 PCI In fondo alla pagina del preventivo è presente di norma un prezzo che può andare dai due ai quattro milioni. Naturalmente ognuno di noi vorrebbe sapere per cosa sta spendendo quei soldi ma, per farlo, è necessario sapere che cosa è un processore, un hard disk e che differenza c’è tra una marca e l’altra, tra un modello e l’altro. Scopo di questo corso è proprio quello di farvi entrare in quella scatola misteriosa chiamata Personal Computer per poter capire meglio cosa l’informatica moderna può offrire. Informatica di Base 5 __________________________________________________________________________________________ Un po’ di storia La storia del computer, come lo conosciamo oggi, è relativamente breve. Il primo calcolatore venne infatti costruito durante la seconda guerra mondiale. Si chiamava ENIAC (Electronic Numeric Integrator and Calculator). Già molto tempo prima però l’uomo cercò di realizzare macchine in grado di fare calcoli in maniera automatica. Il primo esempio di questo tipo lo abbiamo con Leonardo Da Vinci il quale disegnò, ma non realizzò, un piccolo dispositivo in grado di fare calcoli. Fu realizzata successivamente dal dottor Roberto Guatelli dell’IBM nel 1968. La prima macchina calcolatrice funzionante fu inventata e realizzata da Blaise Pascal nel 1642 (all’età di 21 anni!) mentre la prima calcolatrice prodotta in grandi quantità fu quella di Thomas de Colmar nel 1820. Nel 1832 viene realizzato il Difference Engine, il primo calcolatore a programma memorizzato. La prima persona a concepire una macchina capace di computazionalità programmabile fu Ada Lovelace Byron che lavorò al progetto della Analytical Machine. Questo calcolatore avrebbe dovuto sostituirsi alla Difference Engine ma non venne mai realizzato praticamente. Il grande stimolo a costruire macchine in grado di fare calcoli ad alta velocità fu la guerra. Il primo computer, L’ENIAC, venne infatti realizzato in segreto durante la seconda guerra mondiale. Il mondo seppe di questa straordinaria macchina solamente nel 1946. Essa occupava un intero scantinato di un dipartimento dell’Università della Pennsylvania. La svolta decisiva alla struttura del computer moderno però venne con lo scienziato John Von Neuman il quale nel 1944 si interessò al progetto ENIAC. Egli elaborò lo schema teorico con le caratteristiche fondamentali e le modalità di funzionamento del computer moderno. Solo nel 1951 venne costruito il primo esemplare di computer commerciale, si chiamava UNIVAC I e costava un milione di dollari. Ne vennero vendute 48 unità. Il primo calcolatore dell’IBM uscì nel 1952 e ne furono venduti 19 esemplari. Naturalmente si trattava ancora di computer estremamente costosi, lenti e ingombranti. Nel 1965 uscì il PDP-8 della DEC, la prima macchina a basso costo (20.000 dollari!), detta minicalcolatore mentre solo nel 1971 la Intel inventò e commercializzò il primo microprocessore, il 4004. Nel 1977 l’Apple creò il primo personal computer ma solo nel 1981 l’IBM ebbe grande successo mettendo sul mercato il suo personal computer basato sul processore 80X86 della Intel. Iniziavano a crearsi i primi standard: i processori Intel e il sistema operativo Microsoft Ms-DOS. Da allora l’evoluzione dell’informatica è andata di pari passo con quella dell’elettronica. Sono usciti nuovi microprocessori, sempre più potenti: 80X88, 80X286, 80X386, 80X486 e il Pentium della Intel mentre altre case si sono tuffate in questo ricco business (come, ad esempio, l’AMD). Il software si è evoluto sempre di più e, per mantenere alte le prestazioni anche l’hardware si è Massimiliano Teso Maxy Guida 6 __________________________________________________________________________________________ dovuto evolvere di conseguenza. Lo sviluppo dell’industria dei computer è stata così rapida che se l’industria dei trasporti avesse tenuto lo stesso ritmo, oggi si potrebbero attraversare gli Stati Uniti da costa a costa in trenta secondi spendendo meno di mille lire. Ferramenta Tutti noi ormai viviamo in una società dominata dai computer e dai microprocessori. Vedremo più avanti che il microprocessore è solo una parte del computer, la parte più importante, quella che esegue i calcoli. I microprocessori però non si trovano solo nei computer. Li troviamo nei telefonini, negli elettrodomestici di casa, in alcune tessere magnetiche, insomma dappertutto. E’ importante quindi conoscere un minimo come funzionano e quali cose possono fare. Veniamo ora ad alcune definizioni prima di passare allo schema generale di un computer: Hardware: Letteralmente “ferramenta”. Insieme di dispositivi fisici, meccanici ed elettronici di un computer: scheda madre, CPU, memorie, periferiche, schede di rete. Software: Insieme di linguaggi di programmazione e di programmi che agevolano, a vari livelli, l’utilizzo dell’hardware. Computer: Calcolatore ovvero dispositivo elettronico che consente di immettere, memorizzare, elaborare, emettere e trasmettere informazioni. L’immissione avviene attraverso una varietà di dispositivi di ingresso (Tastiera, Mouse), la memorizzazione attraverso sistemi di memoria volatile e permanente (Ram, Hard Disk), l’elaborazione attraverso l’unità centrale (CPU), l’emissione attraverso dispositivi di output (monitor, Stampante) e la trasmissione attraverso collegamenti in rete (Modem). Insomma, in generale, cosa fa un computer? • • • • • Legge un programma Esegue in ordine stabilito le istruzioni del programma Legge i dati in ingresso Elabora i dati Scrive i risultati dell’elaborazione Informatica di Base 7 __________________________________________________________________________________________ Per svolgere tutto questo un computer deve svolgere una serie di azioni: Ricevere dall’esterno le istruzioni, cioè il programma e i dati iniziali Memorizzare il programma Momorizzare i dati Elaborare i dati in base al programma Comunicare all’esterno i risultati ottenuti La Macchina di Von Neumann Lo schema a blocchi del computer ipotizzato da Von Neumann, detto anche macchina di Harvard, è questo: Le linee grosse indicano il flusso dei dati, quelle tratteggiate i comandi di controllo. I dati vengono prelevati dal dispositivo di ingresso (input) e mandati all’unità di calcolo la quale preleva il programma dalla memoria di programma. Per svolgere il proprio lavoro l’unità di calcolo deve poter leggere e scrivere nella memoria dati ed è per questo che ci sono due frecce tra le due unità citate. Infine, una volta terminato il programma, l’unità di calcolo manda i suoi risultati al dispositivo di uscita (output). Il tutto deve naturalmente essere fatto sotto il controllo di un’altra struttura indipendente detta appunto unità di controllo. L’unità di calcolo e quella di controllo formano la CPU, ovvero Central Processing Unit (unità centrale di elaborazione). Massimiliano Teso Maxy Guida 8 __________________________________________________________________________________________ Il modello della macchina di Harvard risale al 1944. Da allora si sono fatti enormi progressi nell’elettronica e nell’informatica ma la base del calcolatore è fondamentalmente sempre la stessa. Nel 1945 Von Neumann propose un modello più efficiente e generale quando si rese conto che dati e programmi potevano risiedere nella stessa memoria Principali componenti del computer Mother Board (Scheda Madre): Supporto che permette la comunicazione tra CPU, Ram, dispositivi di input e output CPU (spesso chiamata processore o microprocessore): Rappresenta il vero cuore del computer. I suoi componenti principale sono tre: i registri, l’unità aritmetico/logica (ALU) e l’unità di controllo. La CPU svolge semplici azioni in maniera sequenziale. La sua potenza sta nello svolgerne tante in modo molto veloce Registri: Sono contenitori di valori utilizzati dalla CPU per memorizzare al suo interno dei dati. Altri registri sono utilizzati dall’ALU per fare calcoli come la somma o la comparazione. Ogni processore ne ha un certo numero e possono contenere un numero fisso di bit (8, 16, 32). Sono molto pochi ma rappresentano l’elemento di memorizzazione più veloce che ci sia in quanto integrato all’interno del processore. Informatica di Base 9 __________________________________________________________________________________________ ALU (Arithmetic Logic Unit, unità aritmetico logica): Circuito logico digitale in grado di elaborare uno o due ingressi e di svolgere semplici operazioni aritmetico/logiche ROM (Read Only Memory): Memoria integrata con la scheda madre in cui risiede il così detto BIOS (Basic Input Output System =sistema di base di ingresso uscita), programma che serve al computer per svolgere le azioni più semplici al momento dell’accensione. Esso infatti gestisce le operazioni iniziali quali l’accensione, il controllo e l’utilizzo dei dispositivi di input e output oltre che delle memorie di massa (Hard Disk, CD Rom, Floppy Disk) RAM (Random Access Memory) Componente elettronico che il processore utilizza per memorizzare i dati. E’ costituita da un certo numero di “celle” (o locazioni) in grado di memorizzare una cifra binaria (0 o 1, cifre conosciute anche con il termine bit) e ogni cella è numerata tramite un indirizzo. La Ram è una memoria volatile in quanto il suo contenuto va perduto allo spegnimento del computer. Quando sentite che la RAM ha una capacità di 32 MegaByte, significa che è costituita da circa 32.000.000 di celle e che ognuna di esse può ospitare 8 bit (8 bit sono detti 1 byte). La RAM è immaginabile quindi come un grosso archivio cartaceo organizzato a “cassetti” in cui si può scrivere o leggere e ogni cassetto è identificato da un indirizzo. Quando, ad esempio, la CPU desidera sapere cosa c’è nel “cassetto” numero “12345”, manda una richiesta alla memoria la quale risponde aprendo quel cassetto e inviandone il contenuto al processore. Come fa la CPU ad indicare questo indirizzo? Essa ha un certo numero di piedini (il 386 della Intel ne ha 132). Quando vuole accedere ad una cella di memoria manderà un impulso elettrico a un certo numero di piedini (32 nel nostro esempio) per fare in modo che insieme formino un indirizzo binario della cella a cui si vuole accedere. Nei piedini potrà passare o meno corrente; il piedino in cui passa corrente indica un 1 mentre quello in cui non passa uno 0. La combinazione di 0 e 1 forma l’indirizzo voluto. Massimiliano Teso Maxy Guida 10 __________________________________________________________________________________________ Dispositivi di Input e Output Un computer senza periferiche non servirebbe a niente. Grazie ad esse è possibile immettere i dati e vedere i risultati delle elaborazioni del computer. Input Tastiera E’ il dispositivo di input più importante. Digitando su tasti è possibile scrivere un programma o immettere dati all’interno del computer. Mouse Questo dispositivo di input è costituito da una sfera di gomma che fa muovere due rotelline attraverso le quali il computer è in grado di sapere dove si trova l’indicatore del mouse. Informatica di Base 11 __________________________________________________________________________________________ Scanner Grazie a un lettore ottico, questo dispositivo è in grado di immettere immagini all’interno del computer Output Monitor Questo dispositivo è basato su un tubo a raggi catodici che scrive l’immagine una riga alla volta dalle 30 alle 60 volte al secondo. Tale frequenza di rigenerazione o rinfresco (refresh) dell’immagine consente di vedere un’immagine stabile senza tremolii. La superficie dello schermo è composta da una matrice di elementi (detti pixel) che andranno a comporre la figura. Un monitor a colori ha tre matrici per i tre colori base: rosso, verde e blu (RGB con R=red, G=gree e B=Blue). Stampante In questo caso le informazioni, invece di apparire su uno schermo, vengono stampate su fogli. Memorie di Massa Abbiamo visto che la RAM è una memoria volatile. E’ necessario quindi poter memorizzare programmi e dati in maniera permanente e sicura. Per questo scopo vengono utilizzate le memorie di massa che qui di seguito elenchiamo: Hard Disk E’ formato da un blocco di dischi di materiale ferromagnetico simile a quello impiegato nelle audiocassette. Per leggere e scrivere dati si utilizzato delle testine legate a un braccio mobile. L’impiego di parti meccaniche come il braccio mobile e i motorini che fanno girare i dischi comporta tempi di accesso superiori rispetto a quelli delle memorie elettroniche (RAM) di fattori superiori a 100.000. I vari dischi si chiamano piatti: ogni piatto è diviso in tracce e ogni traccia in settori. La testina individua prima la traccia e poi deve aspettare che il settore giusto le passi sotto (per questo l’accesso è detto semicasuale) Massimiliano Teso Maxy Guida 12 __________________________________________________________________________________________ Floppy Disk Si chiamano floppy perché sono flessibili ma il funzionamento è pressoché identico a quello degli hard disk. I floppy attualmente in circolazione sono da 3 pollici e ½ e hanno la capacità di circa 1,44 MegaByte. CD Rom Realizzati in materiale plastico, i CD Rom rappresentano l’ultima frontiera delle memorie di massa. La loro capacità è di circa 700 MegaByte. Fino a qualche tempo fa erano dispositivi di sola lettura ma oggi la diffusione dei masterizzatori e dei CD riscrivibili ha reso questo prodotto un sistema molto comodo dove poter archiviare i propri dati. Schede Multimediali Sotto questo nome vanno annoverate schede video, schede audio e tutto ciò che permette al computer di far girare programmi multimediali. Il Bus Quando il processore deve effettuare una qualsiasi operazione sulla RAM o su una periferica, deve poter “muovere” i dati da un punto all’altro dell’elaboratore. Il Bus funziona da canale di comunicazione attraverso il quale i dati “viaggiano”. Un dato che caratterizza il BUS è la sua “ampiezza” in termini di bit. Un bus a 32 bit, ad esempio, può “trasportare” 32 bit alla volta. Nei computer esistono diversi tipi di Bus. Normalmente c’è un Bus degli indirizzi (dove viaggiano solo le informazioni relative a gli indirizzi della RAM e delle periferiche) e un Bus dei dati (dove viaggiano dati veri e propri). Informatica di Base 13 __________________________________________________________________________________________ Approfondimento sulla RAM Abbiamo visto che la Ram può essere schematizzata come un insieme di elementi, ciascuno dei quali contiene un bit di informazione. Questi elementi di memoria sono organizzati in una rete di collegamento a matrice bidimensionale che permette di individuare, tramite due decodificatori, la posizione di ciascuna cella e di scambiare il contenuto con l’esterno nelle operazioni di lettura e scrittura. Dalla figura si vede come l’indirizzo, in questo caso di 12 bit, viene decodificato dai decodificatori di riga e di colonna sei bit alla volta, attivando quindi una sola delle 26=64 linee e, conseguentemente, una sola delle 64X64=4096 celle di memoria. Poiché per rappresentare un numero o altro ente significativo sono necessari gruppi ordinati di più bit, le “celle di memoria” sono organizzate in configurazioni multiple, dette parole, la cui lunghezza è fissata una volta per tutte all’atto della costruzione della macchina (di solito 8, 16, 32 bit per parola). Massimiliano Teso Maxy Guida 14 __________________________________________________________________________________________ La parola è dunque l’unità minima di informazione che ha significato per la macchina: ogni dato o istruzione viene tradotto (“codificato”) usando una o più parole. All’interno della RAM le parole sono disposte sequenzialmente l’una all’altra e sono individuate in modo univoco da un “indirizzo”. Gli indirizzi sono organizzati in modo che, scelta una qualunque parola (“a caso”), il tempo di accesso sia sempre lo stesso, indipendentemente dalla posizione della parola. Proprio per questo la RAM è detta ad accesso casuale. L’unità base di misura della quantità di memoria è il byte (pari a 8 bit), un blocco di memoria capace di contenere al massimo 256 elementi differenti. Nella tabella sottostante sono indicati i multipli del byte usati per indicare la dimensione della RAM e delle altre memorie. Simbolo Kb Mb Gb Nome Khilo byte Mega byte Giga byte Quantità 1.024 byte 1.048.576 byte 1.073.741.824 byte Gerarchia di Memoria e Memoria Virtuale Abbiamo visto che il computer memorizza nella RAM le informazioni che gli servono per poter eseguire i vari programmi. La RAM è però una memoria relativamente piccola ma, soprattutto, è volatile. E’ necessario quindi mantenere memorizzati dati e programmi in un luogo sicuro e capiente come le memorie di massa (Hard Disk, Floppy Disk, CD Rom). Quando accendiamo il computer, il primo programma che viene eseguito è il BIOS attraverso il quale la macchina gestisce gli elementi hardware fondamentali. Subito dopo viene caricato il sistema operativo (DOS, Linux, Windows), un programma che, come vedremo, gestisce le risorse del computer permettendo all’utente di utilizzare altri programmi (programmi applicativi). Questi programmi (come Word, Acces, etc.) vengono prelevati dall’hard disk e messi nella RAM per essere utilizzati dal processore. Per poter velocizzare gli accessi ai dati in memoria si utilizza un altro elemento, normalmente posto tra CPU e RAM, detto cache. La cache altro non è che una memoria molto piccola rispetto alla RAM ma estremamente veloce. In essa vengono memorizzati i dati che, secondo il sistema operativo, verranno utilizzati più frequentemente. Esiste quindi all’interno del computer una vera e propria gerarchia di memoria come mostrato in figura: Informatica di Base 15 __________________________________________________________________________________________ Come si vede dalla figura, man mano che ci allontaniamo dal processore la capacità di memorizzazione aumenta mentre la velocità di accesso ai dati diminuisce. Il processore va a leggere il dato che gli serve prima nella cache, se non lo trova allora lo prende dalla RAM e lo mette nella cache. Accedere ad una memoria più piccola e veloce è molto più agevole che non accedere ad una più grande e lenta. Un altro problema è la limitata quantità di memoria disponibile nella RAM. I moderni sistemi oprativi permettono di lanciare più programmi contemporaneamente (multitasking) e questi devono naturalmente andare nella RAM per poter essere processati dalla CPU. Molto spesso la quantità di memoria che questi programmi occupano è maggiore della RAM disponibile e questo potrebbe causare diversi problemi. Per ovviare a questo inconveniente è stata inventato il concetto di Memoria Virtuale. Con questo termine si intende la possibilità di avere una memoria virtualmente molto grande. Come elemento di memorizzazione virtuale viene utilizzato l’hard disk che è molto lento ma anche molto capiente. Supponiamo che il processore richieda un dato non presente nella RAM e che quest’ultima sia tutta occupata da altri programmi. Il sistema operativo allora cerca nella RAM dei dati che non sono momentaneamente indispensabili e li memorizza sull’hard disk (in questo modo libera memoria), recupera poi dall’hard disk il dato richiesto e lo mette nella RAM. La memoria virtuale permette quindi una condivisione efficiente della memoria da parte di più programmi oltre a esonerare il programmatore dal preoccuparsi di gestire direttamente la memorizzazione del programma. Massimiliano Teso Maxy Guida 16 __________________________________________________________________________________________ Reti di Computer Prima che il concetto di rete fosse introdotto nell’informatica, lo scambio di dati fra due computer presentava diverse difficoltà, soprattutto se questi erano distanti. Diverso era il discorso nel caso in cui gli utenti, ad esempio, erano tutti nello stesso palazzo. Esisteva infatti il così detto centro di calcolo dove risiedeva un computer grande e potente collegato a diversi terminali. Più utenti , quindi, condividevano le stesse risorse (processore, hard disk, etc.) e avevano la possibilità di scambiarsi dati. Questo modello aveva però diversi problemi. In primo luogo la condivisione delle risorse portava a rallentamenti dovuti al fatto che, ad esempio, se un utente stava accedendo all’hard disk, un altro utente doveva attendere. Inoltre, nel caso in cui il centro di calcolo si fosse guastato, l’intera struttura era inutilizzabile. Quando poi l’azienda voleva aggiornare il sistema o aggiungere nuovi utenti, avrebbe dovuto cambiare l’intera struttura. Questi e altri problemi, oltre allo sviluppo dei sistemi di comunicazione, portarono a un diverso concetto di collegamento tra computer: la rete di computer. Invece di un unico, grande computer, si pensò di collegare tra loro computer più piccoli, economici e indipendenti. Questo permetteva di condividere risorse solo quando era strettamente necessario. Inoltre un sistema di questo tipo era estremamente affidabile in quanto, se un computer si fosse guastato, il resto della rete avrebbe continuato a funzionare. Era poi possibile aggiungere utenti e aggiornare il sistema mantenendo la stessa architettura della rete. Analizziamo ora la struttura di una rete partendo dai concetti fondamentali: In figura è rappresentato un computer che si collega a un altro mediante un qualsiasi tipo di collegamento (telefonico, fibre ottiche, satellitare, etc.). Il così detto client è colui che chiede un servizio all’altro computer, detto server. In questo modello la comunicazione generalmente ha la forma di un messaggio di richiesta che parte dal client e arriva al server. Il server esegue il compito richiesto e spedisce al client la risposta. Naturalmente un computer può svolgere entrambi i ruoli, sia quello di client che quello di server. Informatica di Base 17 __________________________________________________________________________________________ Lo sviluppo delle reti ha consentito la realizzazione della più grande e complessa rete di computer al mondo: Internet. Grazie ad essa non solo grandi aziende ma anche singoli cittadini hanno la possibilità di accedere a servizi e risorse completamente inimmaginabili fino a qualche anno fa. Alcuni di quest servizi sono: la posta elettronica, il World Wide Web, le videoconferenze, le chat, etc… Vediamo ora di approfondire meglio gli aspetti hardware delle reti. Esistono due tipi di tecnologie per la trasmissione: • Reti a diffusione globale (broadcast) • Reti punto-a-punto (point-to-point) Le reti broadcast hanno un unico canale di comunicazione che è condiviso da tutte le macchine della rete. Brevi messaggi, detti pacchetti, inviati da una qualsiasi macchina vengono ricevuti da tutte le altre. Un campo indirizzo all’interno del pacchetto indica il computer a cui è diretto. Dopo la ricezione del pacchetto, un computer controlla il campo indirizzo; se coincide con il suo allora lo elabora, altrimenti lo ignora. Al contrario, le reti point to point consistono di molte connessioni fra coppie individuali di macchine. Per andare dal mittente al destinatario, un pacchetto su questo tipo di rete potrebbe dover visitare una o più macchine intermedie. Un altro criterio utilizzato per classificare le reti è legato alla loro scala: Massimiliano Teso Maxy Guida 18 __________________________________________________________________________________________ Reti Locali Le reti locali, generalmente chiamate LAN (Local Area Network), sono reti private all’interno di un singolo edificio o università, di dimensioni al più di qualche chilometro. Le LAN spesso usano una tecnologia di trasmissione a un solo cavo al quale tutte le macchine sono collegate. Sono possibili differenti tipologie per tali reti: a) a bus b) ad anello La rete a bus più diffusa è quella chiamata Ethernet e permette trasmissioni da 10 a 100 Mbps (Megabit per secondo, indicando con Megabit 1.000.000 di bit). Reti metropolitane Una rete metropolitana o MAN (Metropolitan Area Network) è sostanzialmente una versione ingrandita della LAN e, normalmente, usa tecnologie simili. Può coprire un gruppo di edifici vicini della medesima azienda oppure gli edifici di un’intera città. Reti geografiche Una rete geografica o WAN (Wide Area Network), copre una grande area geografica, spesso una nazione o un continente. In una WAN ci sono una serie di computer chiamati host (ospiti) collegati tra loro in una LAN a sua volta collegate a sottoreti. Nella maggior parte delle reti geografiche, la sottorete è costituita da due componenti distinte: le linee di trasmissione e gli elementi di commutazione. Le linee di trasmissione (dette anche circuiti o canali) spostano bit fra le varie macchine, mentre gli elementi di commutazione sono calcolatori specializzati usati per collegare due o più linee di trasmissione. Quando i dati arrivano su una linea di ingresso, l’elemento di commutazione, in base all’indirizzo dei singoli pacchetti, deve scegliere una linea di uscita per farli proseguire. Il termine usato per definire questi calcolatori è Router. Informatica di Base 19 __________________________________________________________________________________________ Se due Router che non condividono un cavo desiderano comunicare, devono farlo in modo indiretto attraverso altri Router intermedi. In questi computer il pacchetto viene ricevuto interamente, memorizzato fino a che la linea di uscita richiesta non risulti libera e quindi viene fatto proseguire. Una sottorete che utilizza questo principio è detta point-to-poit store-andforward (memorizza e fai proseguire) o sottorete packet switched (commutazione di pacchetto). Quasi tutte le reti geografiche utilizzano sistemi di questo tipo. Quando si utilizza una rete point-to-point, un aspetto importante del progetto riguarda la topologia di interconnessione dei Router. La figura sottostante mostra diversi tipi di topologia: a) b) c) d) e) f) Stella Anello Albero Completa Anelli secanti Irregolare Massimiliano Teso Maxy Guida 20 __________________________________________________________________________________________ Internetwork Esistono molte reti con hardware e software differenti. Chi si collega a una rete desidera spesso comunicare con persone collegate ad altre reti. Questo necessita di collegare insieme reti diverse e spesso incompatibili, qualche volta usando macchine chiamate gateway per realizzare la connessione e provvedere alle necessarie traduzioni tra i diversi sistemi. Una collezione di reti collegate viene detta internet (con la lettera minuscola). La rete Internet (con la lettera maiuscola) è l’internetwork più grande e complessa del mondo. Una forma comune di internetwork è una collezione di LAN collegate da una WAN. Per poter comunicare tra di loro i computer devono utilizzare delle regole comuni per evitare ambiguità ed errori. Queste regole vanno sotto il nome di protocollo grazie al quale si possono spedire e ricevere dati attraverso la rete. Fondamentalmente un protocollo è un accordo fra i partecipanti a una comunicazione su come essa deve procedere. In una rete è molto importante il concetto di indirizzo. Ogni computer in rete è infatti individuato da un indirizzo univoco. In questo modo un qualsiasi altro computer potrà contattarlo per lo scambio di dati. Vedremo in maniera più approfondita quali protocolli vengono utilizzati in Internet e come viene assegnato l’indirizzo a un computer in rete. La rete mondiale Internet All'inizio degli anni '70 il Dipartimento della Difesa americano creò una rete di collegamento chiamata ARPANET che metteva in connessione centri militari e centri di ricerca. Essa era strutturata in modo insolito e finalizzata, tra l'altro, a mantenere i collegamenti anche in caso di attacco atomico. Arpanet funzionava con un criterio di trasmissione dei dati che si chiama TCP/IP (Trasmission Control Protocol/Internet Protocol). La novità tecnologica rispetto alla trasmissione telefonica delle informazioni era che i segnali non erano analogici ma digitali, e che venivano spezzettati in "pacchetti" di segnali ognuno dei quali conteneva l'indicazione del mittente e del destinatario, attraverso opportune sigle. Successivamente iniziarono a collegarsi a questa rete anche le Università e grandi aziende. Stava nascendo la rete globale Internet oggi diffusissima anche tra i singoli cittadini. Internet è quindi sostanzialmente una grande rete di reti che sta crescendo a dismisura e che offre tanti e tali servizi da divenire quasi indispensabile per aziende e per alcune categorie di privati cittadini (liberi professionisti, giornalisti, etc.). Fin’ora abbiamo parlato di pacchetti invece che di dati ma non abbiamo specificato di cosa si tratta. Quando fu inventata Internet ci si rese subito conto che mandare i dati così come erano non era vantaggioso per diversi motivi. In primo luogo in termini di velocità: ogni nodo intermedio avrebbe dovuto Informatica di Base 21 __________________________________________________________________________________________ ricevere l’intero file che si voleva trasferire e poi rimandarlo al successivo nodo. Questo avrebbe generato molti tempi morti. Inoltre se ad un certo punto il file veniva perso, il mittente avrebbe dovuto rimandarlo nella sua interezza. Ci si rese conto quindi che il metodo migliore per trasferire i dati era quello di dividerli in tanti pacchetti autonomi. Una volta arrivati a destinazione sarebbero stati riuniti per formare il dato originale. Questo sistema si chiama Packet Switching e permette inoltre la comunicazione di più host contemporaneamente. Tra la sorgente e la destinazione ci sono i così detti Router che provvedono a spedire i pacchetti nella giusta direzione. Il pacchetto, una volta arrivato al Router, viene inserito in un input buffer, processato e infine messo in un output buffer. Questo naturalmente crea un ritardo. Se il Router è occupato a processare altri pacchetti, il pacchetto appena arrivato viene messo in coda. Alcune volte però la coda è piena e quindi il nuovo pacchetto viene eliminato e perso. Il mittente dovrà quindi rispedire esclusivamente il pacchetto perso e non l’intero messaggio o file. Ogni pacchetto, per poter essere spedito dal mittente al destinatario, deve contenere delle informazioni aggiuntive (oltre al dato originale). Queste vengono inserite nel così detto Header (intestazione) e contengono fondamentalmente le informazioni relative all’indirizzo del mittente e del destinatario e un numero che indica la posizione del pacchetto relativamente al dato originale. Grazie a questo Header il pacchetto può arrivare a destinazione ed essere assemblato con gli altri pacchetti ricreando il dato spedito dal mittente. I Protocolli di Internet Internet offre diversi servizi ognuno dei quali utilizza uno specifico protocollo (ovvero un insieme di regole per la comunicazione). I servizi più utilizzati sono il World Wide Web e la Posta Elettronica (o Email). Con il primo possiamo visitare accattivanti pagine informative con testo, immagini e animazioni mentre con l’Email possiamo comunicare in tempo quasi reale con qualsiasi parte del mondo a bassissimo costo. Vediamo quindi un po’ meglio i protocolli che sono alla base di questi importanti servizi. TCP/IP E' il protocollo base di rete per le comunicazioni su Internet, colui che organizza la spedizione dei file, scompattandoli in pacchetti di bit spedibili in rete. All’inizio e alla fine del pacchetto da mandare vengono messi dei segni di riconoscimento relativi al mittente e al ricevente. Il pacchetto viene "instradato" da apparecchi che si chiamano Router e fatto rimbalzare da nodo a nodo fino a quando non arriva a destinazione. Massimiliano Teso Maxy Guida 22 __________________________________________________________________________________________ HTTP Hyper Text Transfer Protocol è il protocollo che permette all’utente di visualizzare sullo schermo le informazioni in formato testo e grafico che risiedono sul Web. Quando si digita un indirizzo con la sigla "http://" prima del "www" si vuole indicare l’utilizzo del protocollo http. FTP File Transfer Protocol consente di trasferire file da un PC ad un altro accedendo a centinaia di biblioteche di file di ogni tipo: software, giochi, documenti storici, testi di canzoni, etc. SMTP Simple Mail Transfer Protocol è il protocollo che serve per spedire messaggi di posta elettronica dal computer al mail server. POP3 Post Office Protocoll-versione 3 è il protocollo utilizzato per scaricare la posta dal mail server al computer. Gli Indirizzi in Internet Abbiamo più volte detto che quando un computer in rete vuole comunicare con un altro computer, anch’esso collegato, deve specificare il suo indirizzo. Questo significa che ad ogni computer collegato viene attribuito un indirizzo univoco in modo che possa essere contattato senza ambiguità. Ogni computer ha quindi associato quello che si chiama indirizzo IP, identificato da quattro campi di 8 bit divisi da un punto (ad esempio 124.234.111.65). Se si vuole spedire un messaggio al computer 124.234.111.65 tutti i pacchetti ad esso destinati dovranno riportare questo indirizzo. Mentre per i computer è agevole lavorare con i numeri, noi umani preferiamo qualcosa di più esplicativo e quindi preferiamo indicare l’indirizzo di un computer attraverso un nome mnemonico (www.yahoo.com). Esistono quindi in rete dei computer che mediante un database distribuito (DNS ovvero Domain Name System) traducono gli indirizzi mnemonici in indirizzi IP. Collegandoci quindi a www.yahoo.com il DNS lo trasforma nell’indirizzo IP relativo e quindi i Router (che leggono solo gli indirizzi IP) possono instradare correttamente i pacchetti a destinazione. Informatica di Base 23 __________________________________________________________________________________________ CAP II LINGUAGGI E SISTEMI OPERATIVI Introduzione La comunicazione tra due individui è possibile soltanto quando essi parlano la stessa lingua. Se un italiano e un francese si incontrano essi riescono a comunicare solo nei casi in cui: - l’italiano conosce il francese - il francese conosce l’italiano - entrambi conoscono una terza lingua, ad esempio l’inglese. Lo stesso vale nella comunicazione tra uomo e computer. Il computer conosce solo il così detto “Linguaggio Macchina” costituito da una successione di 0 e 1. Storicamente i primi computer erano programmabili solo in linguaggio macchina. Ben presto però si sentì la necessità di avere dei linguaggi più comprensibili all’utente e quindi maggiormente orientati alla soluzione dei problemi. Nascono quindi i così detti linguaggi ad alto livello come il Fortran (1954), il Cobol (1959) e il C (1972). Da allora il numero dei linguaggi evoluti è notevolmente aumentato fino ad arrivare ai giorni nostri in cui si utilizza molto la programmazione orientata agli oggetti mediante l’utilizzo di linguaggi come il C++ e Java. E’ necessario subito porre in evidenza alcune caratteristiche sostanziali dei linguaggi di programmazione che li distinguono dai linguaggi comuni. Questi ultimi sono spesso ambigui e, in molte occasioni, il significato di una frase dipende dal contesto in cui è inserita. La frase “Ho visto Maria con un amico” è ambigua in quanto potrebbe assumere i due significati: “mentre ero con un amico ho visto Maria” oppure “ho visto Maria che si trovava con un amico” Consideriamo poi le due frasi “il conto è salato” e “il pollo è salato”. La parola “salato” assume un diverso significato a seconda del contesto. Nei linguaggi di programmazione questo non può avvenire: non è infatti ammessa alcun tipo di ambiguità e ogni parola ha in genera un'unico significato non dipendente dal contesto. Queste regole servono ad evitare incomprensioni tra il programmatore e il computer e quindi a generare programmi corretti. Massimiliano Teso Maxy Guida 24 __________________________________________________________________________________________ Dal Linguaggio Macchina all’Assembler Abbiamo già detto che il computer comprende esclusivamente un linguaggio di due simboli (0 e 1) chiamato linguaggio macchina. Ogni tipo di processore ha un linguaggio macchina differente ed è quindi necessario conoscerne la struttura interna per poter programmare direttamente con questo tipo di linguaggio. Si può capire quanto sia difficile per un programmatore comunicare con il computer tramite il linguaggio macchina. Fin dagli inizi dell’informatica si è quindi cercato di creare un linguaggio “più familiare” rispetto all’utente, il linguaggio Assembler, avente un carattere simbolico anche se ancora molto vicino alla struttura hardware della macchina. Il linguaggio Assembler, in quanto simbolico, ha la necessità di essere tradotto in linguaggio macchina e per questo scopo viene utilizzato un particolare programma detto Assemblatore. Grazie all’Assembler il programmatore non ha a che fare con infinite sequenze di 0 e 1 ma con strutture di questo tipo: MOVW R5, R0 ADD R1, R2 Che verranno poi tradotte dall’Assemblatore nelle relative sequenze binarie. Linguaggi ad alto livello Malgrado l’Assembler sia di tipo simbolico esso è ancora molto legato alla struttura hardware del processore e inoltre necessita di un numero molto grande di istruzioni per svolgere un compito banale. Si è quindi cercato di creare linguaggi di programmazione più semplici e veloci da utilizzare ma soprattutto più vicini al nostro modo di ragionare. I linguaggi di questo tipo prendono il nome di linguaggi ad alto livello. In essi una singola istruzione può eseguire compiti anche molto complessi che richiederebbero molte istruzioni assembler. I programmi scritti con questi linguaggi devono naturalmente essere tradotti in linguaggio macchina per poter essere compresi dal computer. Per ogni processore, la casa costruttrice commissiona la produzione di programmi software in grado di eseguire questa operazione. Questi programmi, a seconda del loro modo di funzionare, sono chiamati compilatori o interpreti. Informatica di Base 25 __________________________________________________________________________________________ Un compilatore ha come dato in ingresso un programma in linguaggio ad alto livello scritto dall’utente (detto programma sorgente), esegue su di esso le conversioni necessarie e ottiene come prodotto finale in uscita un programma scritto in linguaggio macchina (detto programma oggetto). Se il programma sorgente è corretto dal punto di vista sintattico il compilatore esegue la traduzione nel programma oggetto che potrà poi essere eseguito Nel caso in cui ci sia un errore il compilatore lo segnala senza creare il programma oggetto. Un interprete invece agisce in maniera differente schematizzabile nei seguenti passi: - viene presa in esame la prima riga e su di essa si esegue l’analisi sintattica per verificare se è ammessa dal linguaggio - se la risposta alla domanda precedente è positiva, allora la riga viene tradotta in linguaggio macchina e immediatamente eseguita - altrimenti si ha l’interruzione del programma e la segnalazione dell’errore Questo ciclo viene ripetuto per ogni istruzione del programma. A questo punto ci si potrebbe chiedere se sia meglio compilare o interpretare un programma. La compilazione richiede più tempo rispetto all’interpretazione ma una volta creato il programma oggetto questo è naturalmente più veloce del programma interpretato. Si preferisce quindi utilizzare un programma interprete in fase di debbugging in cui si cercano eventuali errori (detti bugs, ovvero “insetti”). In questo modo si evita di compilare ogni volta l’intero programma. In un secondo tempo, quando si è sicuri della correttezza del programma, si ricorre alla compilazione per produrre l’eseguibile definitivo. I Sistemi Operativi I primi computer potevano svolgere solamente un programma alla volta. Un operatore era incaricato di inserire le schede perforate all’interno della macchina la quale, in base alle istruzioni, eseguiva le operazioni richieste. Questa forma di elaborazione è detta elaborazione batch monoutente. Questo metodo, oltre a richiedere operatori umani specializzati, prevedeva dei tempi di elaborazione molto lunghi e l’inevitabile presenza di tempi morti quando si dovevano inserire nuove schede. Si sentì quindi la necessità di creare un programma che sostituisse l’operatore umano. Nacquero i così detti sistemi operativi allo scopo di rendere più agevole l’uso del computer. I primi sistemi gestivano una serie di compiti in sequenza cercando di sfruttare al meglio le risorse. In questo modo aumentava il carico di lavoro che i computer potevano sostenere. Man mano che aumentava la potenza dei computer si capì che l’elaborazione batch monoutente non permetteva di sfruttare a pieno le loro potenzialità. Si pensò quindi che i computer potevano elaborare più programmi Massimiliano Teso Maxy Guida 26 __________________________________________________________________________________________ contemporaneamente per permettere a più utenti di utilizzare simultaneamente lo stesso elaboratore. Negli anni ’60 nacquero quindi i primi sistemi operativi timesharing ( in inglese “condivisione di tempo”). Grazie a sistemi operativi di questo tipo diversi utenti possono accedere allo stesso elaboratore e condividerne le risorse. Il computer in realtà non soddisfa simultaneamente tutte le richieste degli utenti, ma esegue una piccola parte del compito di un utente, quindi passa ad eseguire una piccola parte del compito di un altro utente e così via. Poiché queste azioni vengono svolte molto velocemente, il computer può tornare sulla richiesta di un singolo utente diverse volte al secondo e si ha quindi l’impressione che tutti i compiti siano eseguiti simultaneamente. Quindi mentre nei primi sistemi operativi un utente doveva attendere che il programma dell’utente precedente fosse concluso prima di poter eseguire il suo, con i sistemi timesharing si possono eseguire i due programmi contemporaneamente sfruttando al meglio le potenzialità del computer. Informatica di Base 27 __________________________________________________________________________________________ CAP III I SISTEMI DI NUMERAZIONE Sistema di numerazione decimale Il sistema di numerazione decimale posizionale (detto anche in base 10), ormai comunemente usato in tutto il mondo, fu introdotto per la prima volta dagli Indiani e si diffuse in Europa intorno al 1200, per merito del matematico italiano Leonardo Fibonacci che l’aveva appreso dagli arabi in uno dei suoi viaggi. Si basa sull’uso di dieci simboli: 0123456789 i quali, combinati opportunamente, danno luogo a tutti i numeri. I numeri superiori a 9 vengono rappresentati con più di una cifra, ciascuna delle quali acquista valore particolare a seconda della posizione in cui si trova. Ciò che importa è la posizione della cifra e quindi possiamo considerare la seguente notazione posizionale: 9402210=9*104+4*103+0*102+2*101+2*100 Il pedice 10 sta ad indicare che ci troviamo in base 10. Con lo stesso significato possiamo introdurre le cifre 0,1= 1/10=10-1 0,01=1/100=10-2 0,001=1/1000=10-3 e quindi il numero 820,031 = 8*102 + 2*101 + 0*100 + 0*10-1 + 3*10-2 + 1*10-3 viceversa avendo il numero in notazione esponenziale è possibile passare alla notazione decimale eseguendo le operazioni proposte 8*102 + 2*101 + 3*100 + 2*10-1 diventa uguale a 800 + 20 + 3 + 0,2 = 823,2 Massimiliano Teso Maxy Guida 28 __________________________________________________________________________________________ Sistemi di numerazione diversi dal decimale Oltre al decimale esistono tantissimi altri sistemi di numerazione posizionali. I sistemi di cui noi ci occuperemo sono: binario (in base 2) 2 elementi [0, 1] ottale (in base 8) 8 elementi [0, 2, 3, 4, 5, 6, 7] esadecimale (in base 16) 16 elementi [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F] Si potrebbero però concepire sistemi di numerazioni in base 5, 7 o 15. Conversione da base N a base 10 Dato un numero N=(dndn-1….d2d1d0)N in base N, per convertilo in base 10 occorre effettuare la somma dei singoli termini pesati opportunamente in base alla loro posizione: dn *Nn + dn-1*Nn-1 + …+ d2 *N2 + d1*N1 +d0 *N0 Esempio 11012 = 1*23 + 1*22 + 0*21 + 1*20 = 8 + 4 + 0 + 1= 1310 Informatica di Base 29 __________________________________________________________________________________________ Conversione da base 10 a base N Supponiamo di avere un numero decimale, ad esempio, 109, e di volerlo portare in notazione N-aria. Quello che si deve fare è dividere 109 per N, scrivere il risultato e calcolare il resto. A sua volta il resto verrà nuovamente diviso per N e così via fino a che il dividendo non risulti pari a zero. I resti ottenuti, letti al contrario, danno il valore nella base N. Esempio Volgiamo portare 109 dalla base 10 alla base 5 109 : 5 = 21 con resto 4 21 : 5 = 4 con resto 1 4 : 5 = 0 con resto 4 quindi 10910 = 4145 Sistema di numerazione binario E’ sicuramente il più semplice tra tutti i sistemi di numerazione con base diversa da 10. E’ dotato di due soli simboli 0 e 1, comunemente detti bit, ed è per questo che viene chiamato a base due. Anche in questo caso siamo di fronte a un sistema posizionale e, quindi, ogni cifra assume un diverso valore a seconda della sua posizione. Si ha che: 1102 = 1*22 + 1*21 + 0*20 e la lettura suonerebbe come “1 quartina, 1duina e 0 unità”. Vediamo quindi come possiamo passare dal sistema binario a quello decimale. 101,1101 = 1*22 + 0*21 + 1*20 + 1*2-1 + 1*2-2 + 0*2-3 + 1*2-4 = = 4 + 0 + 1 + 0,5 + 0,25 + 0 + 0,065 = 5,8125 Mentre abbiamo visto precedentemente come sia possibile passare dalla notazione decimale a quella binaria. Massimiliano Teso Maxy Guida 30 __________________________________________________________________________________________ Sistema di numerazione ottale Il sistema di numerazione ottale, ovvero in base otto, si avvale di otto cifre per rappresentare i valori 01234567 La tecnica di conversione di un numero ottale in un numero decimale è la stessa mostrata a titolo esemplificativo per il sistema decimale, con la differenza che la base di numerazione è otto. Per esempio, per convertire il numero ottale 123458 si procede come segue: 1*84 + 2*83 + 3*82 + 4*81 + 5*80 = 4096 +1024 + 192 + 32 + 5 = 5349 Per passare dal sistema decimale a quello ottale si procede nel modo usuale: 5349 / 8 = 668 con il resto di 5 668 / 8 = 83 con il resto di 4 83 / 8 = 10 con il resto di 3 10 / 8 = 1 con il resto di 2 1 / 8 = 0 con il resto di 1 Ecco che così si riottiene il numero ottale 123458. Sistema di numerazione esadecimale La numerazione esadecimale, ovvero in base 16, funziona in modo analogo a quella ottale, con la differenza che si avvale di 16 cifre per rappresentare i valori. Si usano le cifre numeriche da zero e nove, più le lettere da «A» a «F» per i valori successivi. In pratica, la lettera «A» nelle unità corrisponde al numero 10 e la lettera «F» nelle unità corrisponde al numero 15. La tecnica di conversione è la stessa già vista per il sistema ottale, tenendo conto della difficoltà ulteriore introdotta dalle lettere aggiuntive. Per esempio, per convertire il numero esadecimale 19ADF16, si procede come segue: 1*164 + 9*163 + 10*162 + 13*161 + 15*160 = 105.183 Per passare dalla base 10 alla base 16 si procede nel medesimo modo illustrato per il sistema binario e ottale. Aritmetica binaria Vediamo ora come si eseguono le operazioni tra i numeri binari. Fondamentalmente si seguono le stesse regole della notazione decimale riferite però alla nuova base considerata. Informatica di Base 31 __________________________________________________________________________________________ Addizione 0+0=0 0+1=1 1+0=1 1+1=0 con riporto di 1 Esempio 1111 1101+ 111= ----------10100 Moltiplicazione 0*0=0 1*0=0 0*1=0 1*1=1 Esempio 1101* 11= -----------1101 1101----------100111 Massimiliano Teso Maxy Guida 32 __________________________________________________________________________________________ Divisione Si usa lo stesso algoritmo dei decimali riferito però alla base due ____ 1111101 |1011 -----1 11111101 |1011 1011 ---------1 100 -- 1111101 |1011 1011 ---------10 1001 -- 1111101 |1011 1011 ---------101 10010 1011 --------111 -1111101 |1011 1011 ---------1011 10010 1011 --------1111 1011 ----------100 Il risultato è quindi 1011 con resto 100 Informatica di Base 33 __________________________________________________________________________________________ Sistemi di numerazione in programmazione Risulta evidente l’importanza in informatica della rappresentazione binaria. A che cosa servono allora le rappresentazioni ottale e esadecimale? Esaminiamo questa tabella: decimale 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 binario 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 ottale 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 esadecimale 0 1 2 3 4 5 6 7 8 9 A B C D E F Si può notare che con tre bit posso rappresentare tutti e soli i numeri che vanno da 0 a 7 mentre, con 4 bit, tutti e soli i numeri che vanno da 0 a 15. Quindi 3 e 4 bit rappresentano rispettivamente tutti e soli i simboli dei sistemi ottale e esadecimale. Questo facilita molto la conversione da un sistema ottale/esadecimale a quello binario e viceversa. Ottale -> Binario Ogni cifra può essere rappresentata da tre bit quindi la conversione veloce si svolge in questo modo. Se, ad esempio, vogliamo convertire il numero 6738 6 diventa 110 7 diventa 111 3 diventa 011 quindi 6738 = 1101110112 Massimiliano Teso Maxy Guida 34 __________________________________________________________________________________________ Binario-> Ottale In questo caso si divide il numero binario in blocchi di tre bit che verranno convertiti singolarmente in base 8. 1101110112 viene diviso in 110 111 011 = 6738 Esadecimale -> Binario Il metodo è identico a quello per il sistema ottale. 7E16 = 0111 1110 = 011111102 Binario -> Esadecimale Anche in questo caso il sistema è il medesimo. 1010 1011 0101 = A B 5 Come si vede, il sistema esadecimale è in grado di rappresentare un raggruppamento di 8 bit (1 byte) con due soli simboli e questa sua sinteticità è sicuramente di più rapida memorizzazione da parte di un utente. E’ questa ultima caratteristica che determina il largo impiego quando si vuole, ad esempio, fare riferimento a un indirizzo di memoria. E’ infatti più agevole scrivere 8 caratteri esadecimali piuttosto che 32 caratteri binari per indicare un indirizzo di memoria. Informatica di Base 35 __________________________________________________________________________________________ Esercizi 1. Di quanti simboli è dotato il sistema di numerazione in base 4 2. Quanti numeri con due cifre si possono ottenere con un sistema binario, se ciascuna di esse non può essere ripetuta? 3. Quanti numeri diversi di 3 cifre si possono ottenere con le cifre binarie? 4. Qual è il massimo numero decimale rappresentabile da un numero binario costituito di 16 bit? 5. Scrivere i seguenti numeri in base 10 secondo la notazione esponenziale (6835; 381; 408; 9875,324) 6. Trovare la rappresentazione binaria dei seguenti numeri decimali (34, 159, 512, 255, 254) 7. Eseguire le seguenti somme: (1101 + 1101); (11011 + 101); (1110111 + 111); (101101 + 110 + 11101); (11111 + 11) 8. Eseguire le seguenti moltiplicazioni: (111011 * 11); (10011*10); (111011*1001) 9. Eseguire le seguenti sottrazioni: (1011 – 101); (10101 – 11); (11011 – 111); (11000 - 101) 10. Eseguire le seguenti divisioni: (1101/10); (100110/101); (11010/111) 11. Convertire in binario i seguenti numeri ottali: (37; 121, 7032; 976) 12. Convertire in binario i seguenti numeri esadecimali: (37; 7032; 976; 5A7B) 13. Convertire in ottale i seguenti numeri binari (101111100; 1001000; 11011110) 14. Convertire in esadecimale i seguenti numeri binari (10111100; 111110101010000; 101101110111) Massimiliano Teso Maxy Guida 36 __________________________________________________________________________________________ CAP IV LOGICA DELLE PROPOSIZIONI Introduzione La logica, come scienza autonoma, nasce con la filosofia greca; il primo a trattare l’argomento fu Aristotele (385-322 a.C.) il quale si propose di indagare sulla correttezza formale del ragionamento concentrando la sua attenzione sulla forma del “sillogismo”, ovvero su una forma specifica di deduzione del ragionamento filosofico. E’ merito però di Gorge Boole (1815-1864) se la logica ha assunto le caratteristiche di uno strumento di calcolo potente per indagare le proposizioni elementari e le regole formali della loro composizione. Questa algebra ha assunto notevole importanza sia nel campo della matematica pura che in quella della teoria dei calcolatori. Definiamo proposizioni semplici le espressioni in forma orale o scritta per le quali si possa dire se sono vere o false (ad esempio “20 è un numero pari”) Definiamo proposizione composta la combinazione di più proposizioni semplici. D’ora in avanti faremo uso di variabili del tipo a, e, r… per indicare una generica proposizione semplice, con l’ovvia convenzione che due proposizioni diverse saranno indicate con variabili diverse. Negazione (NOT) Data la proposizione “20 è un numero pari” (che è vera) posso creare la sua negata “20 NON è un numero pari” (che è falsa). La negazione si indica con i simboli ~ o b. Si ha quindi la seguente “tavola delle verità” a V F b F V Si ha naturalmente che ~(~a) = a Congiunzione (AND) Supponiamo di avere le proposizioni “il sole splende”, “è una bella giornata” e indichiamo la prima con a e la seconda con e. La proposizione composta dall’affermazione contemporanea delle due risulta “il sole splende ed è una bella giornata” e verrà scritta con il simbolo a r (oppure a*r) e si legge <<a “ed” r>> . La congiunzione ha la seguente “tavola di verità” Informatica di Base 37 __________________________________________________________________________________________ a V V F F r V F V F a r V F F F La congiunzione gode delle seguenti proprietà: • associativa, cioè (a e) r a (e r) • commutativa, cioè a e e a • idempotenza a a a Disgiunzione non esclusiva (OR) Abbiamo le proposizioni a: ”leggo il giornale”, r: “mangio una mela”. La proposizione composta “leggo il giornale o mangio una mela” viene indicata con il simbolo a r (oppure a+r) e si legge <<a “o” r>>. Essa esprime il fatto che possono essere eseguite contemporaneamente due azioni oppure una soltanto. Questa è la “tavola delle verità” a V V F F r V F V F a r V V V F La congiunzione gode delle seguenti proprietà: • associativa, cioè (a e) r a (e r) • commutativa, cioè a e e a • idempotenza a a a Regole di composizione delle proposizioni logiche I connettivi introdotti, da soli o combinati in vario modo, formano proposizioni composte a volte anche di notevole complessità. Per definire la tavola delle verità di una proposizione composta è opportuno definire uno schema di procedimento utilizzabile nella generalità dei casi e di facile comprensione. Massimiliano Teso Maxy Guida 38 __________________________________________________________________________________________ Esempio 1 Analizziamo la proposizione ~(a r). Si tratta di costruire una tabella che presenti nella testata tutte le proposizioni elementari e le operazioni logiche presenti nella proposizione da analizzare. Le colonne relative alle due proposizioni elementari a ed r saranno completate da tutte le possibili combinazioni dei valori di verità. ~ F F F V (2) a V V F F V V V F (1) r V F V F I numeri ai piedi della tabella indicano l’ordine di esecuzione delle operazioni. Il numero maggiore, nell’esempio (2), rappresenta la colonna dei valori di verità della proposizione composta ~(a r). Esempio 2 Analizziamo la proposizione (e ~a) r e V V V F V F F F F F V F V F F F (2) ~a F F V F V F V V (1) a V V F V F V F F V F V V V F V F (3) r V F V V F F V F Informatica di Base 39 __________________________________________________________________________________________ Proprietà aggiuntive Esistono ulteriori proprietà fondamentali che legano la congiunzione alla disgiunzione non esclusiva: • Proprietà distributiva della congiunzione e disgiunzione l’una rispetto all’altra: o (a e) r (a r) (e r) o (a e) r (a r) (e r) • Leggi di De Morgan o ~(a e) ~a o ~(a e) ~a ~e ~e Disgiunzione esclusiva (XOR) La frase composta “vado in macchina o a piedi” implica una scelta indiscutibile e alternativa tra due possibilità, poiché non possono verificarsi contemporaneamente entrambe. La disgiunzione esclusiva si indica con il simbolo a r e si legge << a “xor” b>>. La “tavola delle verità” è la seguente: a V V F F Si ha che: a r ~[(a r) r V F V F a r F V V F (~a ~r)] Massimiliano Teso Maxy Guida 40 __________________________________________________________________________________________ Esercizi 1. Se a è la proposizione “Anna parla francese” e r la proposizione “Anna parla inglese”, si traduca la forma simbolica delle seguenti proposizioni nel linguaggio naturale: a r ; a r; ~a r; ~a ~r; ~(~a ~r) 2. Usando De Morgan, scrivere gli enunciati seguenti: non è vero che conosce l’inglese o il francese; non è vero che le vendite aumentano e i prezzi calano; non mango e non bevo 3. Scrivere la tavola delle verità delle seguenti proposizioni: (a r) (~a r); [a (~a r)] ~a 4. Risolvere le seguenti funzioni (a= Vero, r= Falso, q= Falso, p=Vero): [a (~a r)] [~a (q p) ~(a r)] ; ~{~[(a ~p) ~(q p)] [(a ~p) ~(q p)]} Informatica di Base 41 __________________________________________________________________________________________ CAP V STRUTTURA DEI DATI Introduzione Lo scopo del capitolo è quello di precisare quali sono i tipi di dato computabili e come essi vengono rappresentati fisicamente a livello della macchina, ben sapendo che, pur essendoci delle convenzioni comunemente accettate dai costruttori di hardware, esistono delle varianti nei diversi sistemi. Prima di entrare nel dettaglio ricordiamo che all’interno del computer le informazioni sono memorizzate in binario, cioè utilizzando solamente due simboli: 0 e 1. L’unità minima di memorizzazione è una sequenza di 8 bit detto byte e la memoria del computer si misura in multipli di questa quantità. Variabili di tipo boolean Questo tipo di dato permette di rappresentare due valori di verità: true (vero) e false (falso). Nei computer è normalmente convertito automaticamente nei valori interi 1 e 0. Dal punto di vista della rappresentazione fisica delle variabili booleane ciascuna di esse esigerebbe teoricamente un solo bit per memorizzare i due valori. In pratica, poiché l’unità minima indirizzabile è il byte si avrà che il valore true è uguale alla combinazione 00000001 mentre false a 00000000. Tipo degli Interi Consideriamo l’insieme dei numeri Interi Z={- , ..., -1, 0, +1,... + } Vogliamo rappresentare gli elementi di questo insieme in forma binaria. Avendo a che fare con multipli di byte, non possiamo naturalmente rappresentare l’intero insieme ma solamente una parte di esso.. Questa restrizione limita naturalmente l’esecuzione delle operazioni. Se prendiamo ad esempio la somma, bisogna fare attenzione alla grandezza dei singoli addendi poiché, qualora i valori siano prossimi ai limiti dell’intervallo, il risultato potrebbe cadere fuori dall’intervallo rappresentabile (overflow ovvero straripamento). L’unica operazione non soggetta a rischi di overflow è la divisione di due interi mentre la più esposta è chiaramente l’elevamento a potenza. Massimiliano Teso Maxy Guida 42 __________________________________________________________________________________________ Una possibile rappresentazione è quella con modulo e segno in cui l’ottavo bit viene utilizzato per rappresentare il segno del numero mentre gli altri sette bit il suo modulo. Per un numero rappresentato con 8 bit avremo questo intervallo di rappresentazione: -127 N 127 Si noti che lo zero è rappresentato sia da 10000000 che da 00000000. Questa rappresentazione presenta però problemi quando si devono eseguire le operazioni aritmetiche elementari. Si vedano questi due esempi: 3+ 00000011+ 2= 00000010 = ___ __________ 5 00000101 5+ 00000101+ -2= 10000010 = ___ _________ 3 10000111 (= -7) Subentrano quindi dei problemi quando si sommano due numeri negativi o uno negativo e l’altro positivo. Per uscire da questa difficoltà si introduce la rappresentazione in complemento a due. Per rappresentare un numero negativo (ad esempio –2) si prende la rappresentazione del numero positivo ( 2: 00000010) e si complementa bit a bit, mettendo cioè al posto di zero l’uno e al posto di uno lo zero (-2: 11111101). In questo caso lo zero ha un’unica rappresentazione, 00000000, mentre 10000000 rappresenta il numero –128. Quindi nella rappresentazione in complemento a due si ha il seguente intervallo. -128 N 127 Proviamo a ripetere la somma proposta precedentemente. 5+ 00000101+ -2= 11111101 = ___ _________ 3 00000010 L’ultimo riporto di 1 non viene naturalmente preso in considerazione dovendo il numero rientrare negli 8 bit previsti. Informatica di Base 43 __________________________________________________________________________________________ Tipo dei Reali Consideriamo l’insieme dei numeri reali R. Come per gli interi non possiamo rappresentarli tutti ma solo un sottoinsieme finito. Oltre a un limite inferiore e superiore, inoltre, abbiamo il problema dell’arrotondamento. Ogni elemento di R, in generale, può essere espresso come somma di un intero con un numero frazionario.In pratica, un numero reale è individuato univocamente da: • una parte intera I • una parte frazionaria F Rappresentazione dei reali in virgola fissa: In questa rappresentazione un numero prefissato di cifre viene dedicato alla parte intera ed a quella frazionaria (rappresentazione in virgola fissa). <+,-> <rappresentazione I> . <rappresentazione F> ad esempio: 331,697510= 00101001011,10110 (riservando 11 bit per la parte intera e 5 per quella frazionaria). Rappresentazione dei numeri reali in virgola mobile: In questa rappresentazione ad un numero reale r vengono associati due numeri: • m = mantissa • n = esponente (o caratteristica) La mantissa è un numero frazionario con segno. Il suo valore è quindi compreso nell’intervallo ]-1, +1[ ,mentre l’esponente è un intero con segno. la mantissa e l’esponente sono legati dalla relazione: r = m * bn dove b e' un numero intero che indica una base utilizzata per la notazione esponenziale (normalmente b= 10 oppure b= 2 in binario) Per portare un numero reale in base dieci nella notazione in virgola mobile in base due si passa attraverso due passi: • il numero viene prima convertito in base due (123,45)10= (1111011.01110011)2 • Il punto decimale viene spostato in modo che tutti i bit si trovino alla sua destra (0.111101101110011*27) Per ogni numero reale vengono quindi utilizzati n bit: Massimiliano Teso Maxy Guida 44 __________________________________________________________________________________________ mantissa (cifre a destra della virgola) segno esponente n n-1 n-2 segno numero 1 l valore assoluto esponente In una rappresentazione a 32/64 bit si ha: • 1 bit per il segno della mantissa; • 1 bit per il segno dell'esponente; • 7/10 bit per il valore assoluto dell'esponente; • 23/52 bit per la mantissa. Spesso invece di utilizzare il bit di segno l’esponente è rappresentato in complemento a due. L’esponente per una rappresentazione a 32 bit potrà quindi andare da –128 a 127. La mantissa di 23 bit consente di rappresentare 23 cifre binarie che corrispondono a un numero decimale con un massimo di sette cifre (223-1= 8.388.607). Quindi l’intervallo numerico rappresentabile è: -0.8388608* 2-128 N +0,8388607*2127 Poiché 2127 è approssimabile con il valore 1,7*1038 e la mantissa assume valori nell’intervallo ] –1, +1 [ possiamo approssimativamente dire che un numero reale rappresentato con 32 bit varia nell’intervallo -1,7*10-38 N 1,7*1038 Abbiamo detto che si presentano degli errori dovuti all’arrotondamento. Si può, in generale, osservare che: • Quanto maggiore è il numero di bit riservati alla mantissa tanto maggiore è il numero di cifre significative che possono essere memorizzate (precisione= data dal numero di cifre in base 10 rappresentabili con la mantissa). Le cifre meno significative della mantissa che non possono essere rappresentate nel numero di bit a disposizione vengono eliminate mediante troncamento od arrotondamento. • Quanto maggiore è il numero di bit riservati all’esponente tanto maggiore è l’ordine di grandezza della cifra che può essere rappresentata. Informatica di Base 45 __________________________________________________________________________________________ Tipo dei Caratteri Esistono molti problemi in cui è necessario confrontare o eseguire operazioni su variabili non numeriche ma costituite da sequenze di caratteri, alfabetici e non. Per poter costruire programmi che operano su caratteri è necessario definire un nuovo tipo di dati che chiameremo “char” (abbreviazione della parola carattere in inglese). Il tipo char è costituito da un insieme di elementi quali i caratteri alfabetici, le cifre numeriche, simboli speciali e di punteggiatura, di ciascuno dei quali dovrà essere data una codifica univoca per rappresentarlo simbolicamente sulla macchina. Il sistema di codifica più usato e' il codice ASCII (American Standard Code for Information Interchange). Esso utilizza 8 bit per rappresentare 256 caratteri. Tabella del codice ASCII dec hex char binario dec hex char binario 1 0 00 00000000 129 128 80 10000000 2 1 01 00000001 130 129 81 10000001 3 2 02 00000010 131 130 82 ‚ 10000010 4 3 03 00000011 132 131 83 ƒ 10000011 5 4 04 00000100 133 132 84 „ 10000100 6 5 05 00000101 134 133 85 … 10000101 7 6 06 00000110 135 134 86 † 10000110 8 7 07 00000111 136 135 87 ‡ 10000111 9 8 08 00001000 137 136 88 ˆ 10001000 10 9 09 00001001 138 137 89 ‰ 10001001 11 10 0A 00001010 139 138 8A & 10001010 12 11 0B 00001011 140 139 8B ‹ 10001011 13 12 0C 00001100 141 140 8C Œ 10001100 14 13 0D 00001101 142 141 8D 10001101 15 14 0E 00001110 143 142 8E Ä 10001110 16 15 0F 00001111 144 143 8F ˜ 10001111 17 16 10 00010000 145 144 90 10010000 18 17 11 00010001 146 145 91 ‘ 10010001 19 18 12 00010010 147 146 92 ’ 10010010 20 19 13 00010011 148 147 93 “ 10010011 21 20 14 00010100 149 148 94 ” 10010100 22 21 15 00010101 150 149 95 • 10010101 23 22 16 00010110 151 150 96 – 10010110 Massimiliano Teso Maxy Guida 46 __________________________________________________________________________________________ 24 23 17 00010111 152 151 97 — 10010111 25 24 18 00011000 153 152 98 ˜ 10011000 26 25 19 00011001 154 153 99 ™ 10011001 27 26 1A 00011010 155 154 9A š 10011010 28 27 1B 00011011 156 155 9B › 10011011 29 28 1C 00011100 157 156 9C œ 10011100 30 29 1D 00011101 158 157 9D 10011101 31 30 1E 00011110 159 158 9E h 10011110 32 31 1F 00011111 160 159 9F Ÿ 10011111 00100000 161 160 A0 10100000 34 33 21 ! 00100001 162 161 A1 ¡ 10100001 35 34 22 " 00100010 163 162 A2 ¢ 10100010 36 35 23 # 00100011 164 163 A3 £ 10100011 37 36 24 $ 00100100 165 164 A4 ¤ 10100100 38 37 25 % 00100101 166 165 A5 ¥ 10100101 39 38 26 & 00100110 167 166 A6 ¦ 10100110 40 39 27 ' 00100111 168 167 A7 § 10100111 41 40 28 ( 00101000 169 168 A8 ¨ 10101000 42 41 29 ) 00101001 170 169 A9 © 10101001 43 42 2A * 00101010 171 170 AA ª 10101010 44 43 2B + 00101011 172 171 AB « 10101011 45 44 2C , 00101100 173 172 AC ¬ 10101100 46 45 2D - 00101101 174 173 AD 10101101 47 46 2E . 00101110 175 174 AE ® 10101110 48 47 2F / 00101111 176 175 AF w 10101111 49 48 30 0 00110000 177 176 B0 ° 10110000 50 49 31 1 00110001 178 177 B1 ± 10110001 51 50 32 2 00110010 179 178 B2 ² 10110010 52 51 33 3 00110011 180 179 B3 ³ 10110011 53 52 34 4 00110100 181 180 B4 ´ 10110100 54 53 35 5 00110101 182 181 B5 } 10110101 55 54 36 6 00110110 183 182 B6 ¶ 10110110 56 55 37 7 00110111 184 183 B7 · 10110111 57 56 38 8 00111000 185 184 B8 ¸ 10111000 58 57 39 9 00111001 186 185 B9 ¹ 10111001 59 58 3A : 00111010 187 186 BA º 10111010 60 59 3B ; 00111011 188 187 BB » 10111011 61 60 3C < 00111100 189 188 BC ¼ 10111100 33 32 20 SPAZIO Informatica di Base 47 __________________________________________________________________________________________ 62 61 3D = 00111101 190 189 BD ½ 10111101 63 62 3E > 00111110 191 190 BE ¾ 10111110 64 63 3F ? 00111111 192 191 BF ¿ 10111111 65 64 40 @ 01000000 193 192 C0 À 11000000 66 65 41 A 01000001 194 193 C1 Á 11000001 67 66 42 B 01000010 195 194 C2  11000010 68 67 43 C 01000011 196 195 C3 à 11000011 69 68 44 D 01000100 197 196 C4 Ä 11000100 70 69 45 E 01000101 198 197 C5 Å 11000101 71 70 46 F 01000110 199 198 C6 Æ 11000110 72 71 47 G 01000111 200 199 C7 Ç 11000111 73 72 48 H 01001000 201 200 C8 È 11001000 74 73 49 I 01001001 202 201 C9 È 11001001 75 74 4A J 01001010 203 202 CA Ê 11001010 76 75 4B K 01001011 204 203 CB Ë 11001011 77 76 4C L 01001100 205 204 CC Ì 11001100 78 77 4D M 01001101 206 205 CD Í 11001101 79 78 4E N 01001110 207 206 CE Î 11001110 80 79 4F O 01001111 208 207 CF Ï 11001111 81 80 50 P 01010000 209 208 D0 Ð 11010000 82 81 51 Q 01010001 210 209 D1 Ñ 11010001 83 82 52 R 01010010 211 210 D2 Ò 11010010 84 83 53 S 01010011 212 211 D3 Ó 11010011 85 84 54 T 01010100 213 212 D4 Ô 11010100 86 85 55 U 01010101 214 213 D5 Õ 11010101 87 86 56 V 01010110 215 214 D6 Ö 11010110 88 87 57 W 01010111 216 215 D7 × 11010111 89 88 58 X 01011000 217 216 D8 Ø 11011000 90 89 59 Y 01011001 218 217 D9 Ù 11011001 91 90 5A Z 01011010 219 218 DA Ú 11011010 92 91 5B [ 01011011 220 219 DB Û 11011011 93 92 5C \ 01011100 221 220 DC Ü 11011100 94 93 5D ] 01011101 222 221 DD Ý 11011101 95 94 5E ^ 01011110 223 222 DE Þ 11011110 96 95 5F _ 01011111 224 223 DF ß 11011111 97 96 60 ` 01100000 225 224 E0 à 11100000 98 97 61 a 01100001 226 225 E1 á 11100001 99 98 62 b 01100010 227 226 E2 â 11100010 Massimiliano Teso Maxy Guida 48 __________________________________________________________________________________________ 100 99 63 c 01100011 228 227 E3 ã 11100011 101 100 64 d 01100100 229 228 E4 ä 11100100 102 101 65 e 01100101 230 229 E5 å 11100101 103 102 66 f 01100110 231 230 E6 æ 11100110 104 103 67 g 01100111 232 231 E7 ç 11100111 105 104 68 h 01101000 233 232 E8 è 11101000 106 105 69 i 01101001 234 233 E9 è 11101001 107 106 6A j 01101010 235 234 EA ê 11101010 108 107 6B k 01101011 236 235 EB ë 11101011 109 108 6C l 01101100 237 236 EC ì 11101100 110 109 6D m 01101101 238 237 ED í 11101101 111 110 6E n 01101110 239 238 EE î 11101110 112 111 6F o 01101111 240 239 EF ï 11101111 113 112 70 p 01110000 241 240 F0 ð 11110000 114 113 71 q 01110001 242 241 F1 ñ 11110001 115 114 72 r 01110010 243 242 F2 ò 11110010 116 115 73 s 01110011 244 243 F3 ó 11110011 117 116 74 t 01110100 245 244 F4 ô 11110100 118 117 75 u 01110101 246 245 F5 õ 11110101 119 118 76 v 01110110 247 246 F6 ö 11110110 120 119 77 w 01110111 248 247 F7 ÷ 11110111 121 120 78 x 01111000 249 248 F8 ø 11111000 122 121 79 y 01111001 250 249 F9 ù 11111001 123 122 7A z 01111010 251 250 FA ú 11111010 124 123 7B { 01111011 252 251 FB û 11111011 125 124 7C | 01111100 253 252 FC ü 11111100 126 125 7D } 01111101 254 253 FD ý 11111101 127 126 7E ~ 01111110 255 254 FE þ 11111110 128 127 7F 01111111 256 255 FF ÿ 11111111 Informatica di Base 49 __________________________________________________________________________________________ CAP VI L’ARTE DELLA PROGRAMMAZIONE Il concetto di algoritmo Spesso sentiamo dire che i computer si “programmano” ma non abbiamo un’idea precisa di cosa voglia dire. I computer si chiamano anche elaboratori elettronici e sono strumenti utili per risolvere una vasta gamma di problemi in maniera rapida e corretta. Questo deriva dal fatto che sono macchine programmabili, cioè accettano istruzioni e comandi secondo modalità ben precise. Un computer infatti svolge le azioni indicate in un programma il quale è scritto in un linguaggio che occupa una posizione intermedia tra quello naturale (l’inglese) e quello binario (composto da cifre 0 e 1). Ciò che il programmatore deve fare quindi è analizzare un problema, dividerlo in istruzioni semplici e tradurre queste istruzioni secondo determinate regole in modo che il computer possa interpretarle. Vediamo un esempio Problema: Determinare l’area del cerchio circoscritto ad un quadrato avente il lato di misura L. La prima cosa da fare è individuare le grandezze che ci interessano anche se non esplicitamente riportate nel testo del problema e determinare il procedimento attraverso il quale si giunge alla soluzione: AC = L * R = AC/2 Area = 3,14 * R2 Avendo indixcato con AC la diagonale del quadrato inscritto al cerchio. Il metodo utilizzato può essere schematizzato nei seguanti passi: 1) Individuazione dei dati e dei risultati 2) Ricerca del procedimento 3) Scomposizione del procedimento con l’indicazione delle operazioni necessarie per il calcolo di eventuali risultati intermedi Massimiliano Teso Maxy Guida 50 __________________________________________________________________________________________ Prima di programmare dobbiamo quindi definire il progetto dell’algoritmo che, in linea di massima, rispetta i seguenti punti: Passo 1) Definire eventuali dati iniziali Passo 2) Richiedere eventuali dati che l’utente deve immettere (input) Passo 3) Effettuare eventuali controlli sui dati immessi dall’utente Passo 4) Svolgere le operazioni necessarie per la risoluzione del problema utilizzando i dati a disposizione Passo 5) Scrivere l’output Questa fase non deve rispettare particolari regole formali ma l’importante è che sia chiara ed esaustiva. Vediamo ad esempio il progetto dell’algoritmo del problema che abbiamo visto precedentemente: 1) 2) 3) 4) 5) Chiedi all’utente di inserire il lato del quadrato Calcola la diagonale del quadrato (AC = L * ) Calcola il raggio del cerchio circoscritto al quadrato (R = AC/2) Calcola l’area del cerchio (Area = 3,14 * R2) Stampa l’area del Cerchio Con l’elencazione dei passi da svolgere per risolvere il problema, abbiamo dato origine a un algoritmo, termine che deriva dal matematico arabo Al Khwarismi. Eccone la definizione: a) E’ una successione finita di azioni, o passi, che determinano la risoluzione di un problema. Si intuisce che, dati due algoritmi che risolvono lo stesso problema, viene preferito quello col minor numero di passi. b) Le azioni specificate devono essere univocamente interpretabili ovvero devono essere comprensibili senza ambiguità da colui che le esegue (solitamente un computer) c) Se la successione di azioni viene ripetuta in momenti diversi ma con gli stessi dati iniziali, allora deve essere restituito sempre lo stesso risultato; si dice che l’algoritmo deve essere non casuale. d) In ogni istante, l’azione successiva da interpretare deve essere univocamente determinabile a partire dall’analisi del valore di particolari dati. Informatica di Base 51 __________________________________________________________________________________________ Struttura dei Flow-Chart Il secondo passo da fare è disegnare il così detto diagramma di flusso o flowchart. Il diagramma di flusso del problema precedente è questo: Ogni diagramma contiene un blocco iniziale e uno finale, almeno un blocco intermedio che indica un’azione da svolgere e può contenere uno o più blocchi di controllo o schemi condizionali. Tutti i blocchi sono collegati da linee nelle quali è contrassegnata, mediante una freccia, la direzione di percorrenza del flusso. I simboli sono rispettivamente: Per ogni blocco che indica un’azione si ha una sola linea di ingresso e di uscita; per ogni blocco di esame condizione si ha una sola linea di ingresso e due linee di uscita. Per indicare le operazioni di input useremo il simbolo di azione nel quale verrà indicato l’elenco dei dati da immettere seguiti dal punto interrogativo, dalla parola “immissione” o dalla parola “input”. Massimiliano Teso Maxy Guida 52 __________________________________________________________________________________________ Per indicare le operazioni di output useremo sempre lo stesso simbolo di azione con l’indicazione delle variabili precedute dalla parola “stampa”, “mostra” o “output”. In altri testi sono usati simboli diversi per le azioni di input e output ma qui abbiamo preferito utilizzare sempre il simbolo di azione per non sovraccaricare il diagramma di flusso con simboli non strettamente necessari. Rappresentazione con Pseudo-Codice L’ultimo passo prima della programmazione vera e propria è la traduzione dell’algoritmo in pseudo-codice, un codice che assomiglia più ad un linguaggio di programmazione che a quello umano (si avvicina molto al PASCAL). Ciò che si ottiene è una descrizione discorsiva soggetta però a regole ben precise (in gergo informatico si dice che sono soggette ad una precisa sintassi). Se la progettazione dell’algoritmo e il diagramma di flusso sono abbastanza esplicativi e ben fatti, questa fase si può anche saltare passando direttamente alla programmazione su computer. Lo pseudo-codice del problema precedente è questo: program Area begin { Input L AC:= L* R:=AC/2 Area:=3,14*R2 Output Area } end Analizziamone la struttura • Viene dato un nome al programma • Si definisce la struttura begin..end • Si scrive il corpo principale del programma con le operazioni di input e output. Vediamo ora le principali istruzioni di programmazione. Informatica di Base 53 __________________________________________________________________________________________ Istruzione IF-ELSE Il comando IF-ELSE permette la selezione tra due possibili alternative in base al valore di verità di una espressione iniziale. IF (condizione) {istruzioni_1} ELSE {istruzione_2} Le istruzioni_1 vengono eseguite se la condizione è vera altrimenti vengono eseguite le istruzioni_2. Nel caso in cui ci sia una sola istruzione le parentesi graffe possono essere omesse. Vediamo meglio come funziona analizzando un esempio. Problema: Dati due numeri A e B appartenenti all’insieme dei numeri naturali, eseguire la differenza in N. Il diagramma di flusso del problema è il seguente Massimiliano Teso Maxy Guida 54 __________________________________________________________________________________________ Che tradotto in pseudo-codice diventa: program Differenza begin { Input A, B IF (A>B) DIF:= A–B ELSE DIF:= B–A Output DIFF } end Istruzione SWITCH Quando si devono eseguire tanti IF uno dopo l’altro, è preferibile usare l’istruzione SWITCH: SWITCH (espressione) { Valore 1: istruzioni_1 Valore 2: istruzioni_2 ….. Valore n: istruzioni_n } In questo caso viene valutato il valore dell’espressione e confrontato con i Valori elencati. Verranno svolte esclusivamente le istruzioni il cui Valore coincide con il risultato dell’espressione. Problema: Il prezzo di un abbonamento tranviario mensile è di 30.000 lire. Su tale prezzo vengono fatte le seguenti riduzioni: • il 50% per i bambini sotto i 10 anni; • il 40% per gli studenti; • l’80% per i militari; • il 30% per i pensionati Determinare le diverse tariffe di abbonamento ogni volta che l’utente lo richiede Informatica di Base 55 __________________________________________________________________________________________ Il diagramma di flusso del problema è il seguente Che tradotto in pseudo-codice diventa: program Sconti begin { PREZZO= 30.000 SBAM= 0.5 //sconto bambini SSTU=0.4 //sconto studenti SMIL= 0.8 //sconto militari SPEN= 0.3 //sconto pensionati SORD= 0 //nessuno sconto Input UTENTE; SWITCH (UTENTE) { “BAMBINO” : SCONTO:=SBAM “STUDENTE” : SCONTO:=SSTU “MILITARE” : SCONTO:=SMIL “PENSIONATO”: SCONTO:=SPEN “NORMALE” : SCONTO:=SORD } Massimiliano Teso Maxy Guida 56 __________________________________________________________________________________________ } end TARIFFA:= PREZZO–PREZZO*SCONTO Output TARIFFA Istruzione WHILE E’ una struttura iterativa che esegue un determinato numero di istruzioni fino a quando la condizione valutata ad ogni ciclo non diventa falsa. In questo caso il programma esce dal ciclo while. WHILE (condizione) {istruzioni} Le istruzioni vengono eseguite in maniera iterativa fino a che la condizione rimane vera. Quando la condizione diventa falsa il programma esce dal ciclo WHILE. Nel caso in cui ci sia una sola istruzione le parentesi graffe possono essere omesse. Problema: Dato il numero intero N determinare se è primo Il diagramma di flusso del problema è il seguente Informatica di Base 57 __________________________________________________________________________________________ Che tradotto in pseudo-codice diventa: program Numero Primo begin { Input N PRIMO:= TRUE DIV:= N-1 WHILE (DIV 1) { Q:= N/DIV IF (Q= INT(Q)) { PRIMO:= FALSE DIV:= DIV-1 } IF (PRIMO) Output (“N è primo”) ELSE Output (“N non è primo”) } } end Istruzione DO-WHILE L’istruzione viene eseguita in maniera iterativa fino a che la condizione rimane vera. Quando la condizione diventa falsa il programma esce dal ciclo. DO { Istruzioni }WHILE(condizione) La struttura DO-WHILE esegue almeno una volta il gruppo delle istruzioni al suo interno anche se la condizione è falsa, mentre nella struttura WHILE se la condizione iniziale è falsa non viene eseguita alcuna istruzione al suo interno. Massimiliano Teso Maxy Guida 58 __________________________________________________________________________________________ Problema: Determinare il massimo comun divisore (MCD) tra due numeri A e B Il diagramma di flusso del problema è il seguente Che tradotto in pseudo-codice diventa: program Massimo Comun Divisore begin { Input A, B IF (A<B) { C:= A A:= B B:= C } DO { Q:= INT(A/B) R:= A-B*Q A:= B B:= R }WHILE(R= 0) Informatica di Base 59 __________________________________________________________________________________________ } end MCD:= A Output MCD; Istruzione FOR L’istruzione esegue un blocco di istruzioni per un determinato numero di volte. FOR (valore iniziale) TO (valore finale) {Istruzioni} Il blocco di istruzioni viene ripetuto un numero di volte pari all’intervallo tra il valore iniziale e il valore finale. Problema: Determinare la somma degli interi compresi tra N1 e N2 Il diagramma di flusso del problema è il seguente Massimiliano Teso Maxy Guida 60 __________________________________________________________________________________________ Che tradotto in pseudo-codice diventa: program Somma; begin { Input N1, N2 FOR (I:= N1) TO (N2) DO { SOMMA:= SOMMA+1 } Output SOMMA } end Istruzioni BREAK e CONTINUE Queste due istruzioni si utilizzano in presenza di cicli. Quando il programma incontra l’istruzione BREAK esce immediatamente dal ciclo corrente senza eseguire il resto delle istruzioni. Quando invece incontra CONTINUE salta al ciclo successivo. Sottoprogrammi e Procedure Abbiamo visto come sia possibile scomporre un problema e come creare i relativi flow-chart e pseudo-codice. I problemi complessi però richiedono di norma l’uso di una tecnica specifica per realizzare una scomposizione modulare del programma in sottoproblemi. Ciascun sottoproblema costituisce ora un programma di più facile soluzione che verrà quindi affrontato secondo gli schemi visti precedentemente. Per eseguire la scomposizione modulare è necessario: • individuare sottoprogrammi il più possibile autonomi e indipendenti tra loro; • definire dei caratteri per collegare tra loro i singoli moduli in un insieme organizzato, o programma principale, che indichi l’ordine di esecuzione dei vari sottoprogrammi Problema: Per i numeri da 1 a 100, stampare una tavola che contenga in ogni riga il numero, il quadrato, il cubo e la radice dello stesso. Dare una veste grafica soddisfacente alle singole pagine stampate. Scomponiamo il problema: • se sei all’inizio della pagina allora stampa la testata del foglio; Informatica di Base 61 __________________________________________________________________________________________ • calcola il valore dei dati richiesti (quadrato, cubo e radice); • stampa la riga di dettaglio; • se hai scritto 20 righe allora volta pagina; Queste istruzioni devono essere ripetute cento volte. Le quattro righe in cui è stato scomposto il problema possono essere pensate come piccoli sottoproblemi ciascuno dei quali deve essere ripetuto più volte. Nello pseudo-codice ciascuno di questi sottoproblemi prende il nome di funzione; per distinguere le une dalle altre a ciascuna deve essere assegnato un nome convenzionale e ciascuna deve essere sviluppata indipendentemente dalle restanti. Anche per le singole funzioni si può disegnare il diagramma di flusso con l’unica accortezza di inserire il nome della funzione stessa nel blocco inizio del diagramma. Saltiamo questa fase e presentiamo esclusivamente lo pseudocodice delle funzioni: FUNZIONE Stampa Testata begin { Output (“ TAVOLA NUMERICA ”) Output (“________________________”) Output (“| N | QUA | CUBO | RAD |”) Output (“________________________”) INIZIO:= FALSE } end FUNZIONE Calcolo begin { Q:= N*N C:= Q*N R:= SQR(N) } end FUNZIONE Stampa Dettaglio; begin { Output (“|”,N,“|”,Q,“|”,C,“|”,R,“|”); } end Massimiliano Teso Maxy Guida 62 __________________________________________________________________________________________ FUNZIONE Volta Pagina begin { NewPage INIZIO:= TRUE RIGA:= 0 } end Abbiamo visto che le procedure vanno poi richiamate da un programma principale il cui diagramma di flusso è il seguente Informatica di Base 63 __________________________________________________________________________________________ Che tradotto in pseduo-codice diventa: program Tabella begin { TOT= 100 RIGA:= 0 INIZIO:= TRUE FOR N:= 1 TO TOT DO { IF (INIZIO) { Stampa Testata } Calcolo Stampa Dettaglio RIGA:= RIGA + 1 IF (RIGA= 20) { Volta Pagina INIZIO = TRUE } } end } Nel blocco variabili del programma principale sono inseriti tutti gli identificatori necessari per l’esecuzione, non solo del programma, ma anche di tutte le procedure che vanno scritte prima del programma principale. Tutte le variabili definite quindi sono comuni al programma e ai sottoprogrammi che ne fanno uso. Variabili di questo tipo si chiamano globali. Variabili definite all’interno di una singola procedura non sono utilizzabili dal programma principale né tantomeno da altre procedure. Variabili di questo tipo si chiamano locali. Massimiliano Teso Maxy Guida 64 __________________________________________________________________________________________ Esercizi 1. Data una misura di tempo espresso in H (ore), M (minuti), S (secondi), determinare la misura equivalente in secondi. 2. Costruire un convertitore lire/euro e viceversa secondo una scelta iniziale dell’utente. 3. Dati tre numeri A, B, C, trovarne il minimo e il massimo. 4. Dati due numeri naturali A e B, verificare se uno è multiplo dell’altro. 5. Suddividendo gli individui in 4 classi di età: 0-12 bambini, 13-18 adolescenti, 19-60 adulti, da 61 in poi anziani, costruire un programma che dopo aver immesso l’età di un individuo risponda indicando la classe di età di appartenenza, rispettivamente bambino, adolescente, adulto, anziano. Inserire inoltre un menù di scelta con cui l’utente può decidere o meno di interrompere il programma oppure continuare con l’inserimento di un nuovo dato. 6. Esegui il prodotto di due numeri interi positivi utilizzando al meglio esclusivamente l’addizione. 7. Scrivere un programma in cui l’utente inserisce un numero N rappresentate il numero di valori che vuole inserire in input. Successivamente inserisce gli N valori e come uscita deve ottenere la media dei valori immessi. 8. Scrivere un programma che consenta il seguente gioco interattivo: il computer genera un numero casuale da 1 a 100, senza mostrarlo, utilizzando la funzione Number(100). Il giocatore deve indovinare per tentativi il numero immettendo le prove da tastiera (per un massimo di 20 tentativi); ad ogni tentativo la macchina risponderà a seconda dei casi: “è troppo grande”, “è troppo piccolo”, “hai esaurito i tentativi, gioco concluso”, “hai indovinato”. In questo ultimo caso dovrà scrivere anche quanti sono stati i tentativi necessari e se è stato migliorato il risultato della sessione di gioco, producendo il messaggio “questa è la migliore prestazione ottenuta in ... tentativi, la precedente era di ... tentativi”. Risolvere il problema con l’uso dei sottoprogrammi. Informatica di Base 65 __________________________________________________________________________________________ CAP VII LE BASI DI DATI Introduzione Un sistema informativo è sistema che permette la disponibilità e la gestione delle informazione. L’esistenza di un sistema informativo è indipendente dalla sua automazione; lo dimostra il fatto archivi e servizi anagrafici esistono da vari secoli. Per indicarne la porzione automatizzata viene utilizzato il termine sistema informatico. La diffusione dell’informatica ha fatto si che la quasi totalità dei sistemi informativi siano anche sistemi informatici. Le informazioni vengono rappresentate e scambiate in varie forme, quali la lingua, i disegni, le figure e i numeri. In alcuni casi può anche non esistere una rappresentazione esplicita delle informazioni, come nel caso di informazioni trasmesse oralmente e ricordate a memoria. Col progredire delle attività umane, tuttavia, è nata l’esigenza di individuare opportune codifiche per la memorizzazione dei dati. Nei sistemi informatici il concetto di rappresentazione e codifica viene portato all’estremo: le informazioni vengono rappresentate per mezzo di dati, che hanno bisogno di essere interpretati per fornire informazioni. Basi di dati, la definizione La più generale definizione di una base di dati è: “collezione di dati utilizzati per rappresentare le informazioni di interesse per un sistema informativo”. Tale definizione è molto semplicistica e troppo generale. Più avanti si cercherà di definire il termine in maniera più precisa. Occorre tuttavia trarre una prima considerazione sulle basi di dati. Se prendiamo come esempio i dati relativi alle applicazioni bancarie noteremo che essi hanno una struttura sostanzialmente invariata da decenni, mentre le procedure che agiscono su di essi variano con una certa frequenza. Inoltre, quando viene introdotta una nuova procedura, occorre prima di tutto “ereditare” (cioè importare) i dati da quella vecchia, se pur con le necessarie trasformazioni. Questa caratteristica di stabilità porta ad affermare che i dati costituiscono una “risorsa” per l’organizzazione che li gestisce, un patrimonio significativo da sfruttare e proteggere. L’approccio “convenzionale” alla gestione dei dati sfrutta la presenza di archivi (o file) per memorizzare i dati in modo persistente sulla memoria di massa. Tale approccio presenta delle macroscopiche deficienze per quanto riguarda la ricerca e la condivisione dei dati. Con una simile metodologia di lavoro, infatti, ogni utente lavora con la propria copia “locale”, con i relativi problemi ridondanza e possibilità di incoerenze. Massimiliano Teso Maxy Guida 66 __________________________________________________________________________________________ Le basi di dati sono state concepite in buona parte per ovviare ad inconvenienti di questo tipo. Un sistema di gestione di basi di dati, detto DBMS (Data Base Management System) è un sistema software in grado di gestire collezioni di dati che siano grandi, condivise e persistenti assicurando la loro affidabilità e privatezza. Inoltre, in quanto prodotto informatico, deve essere efficiente e efficace. Una base di dati è quindi una collezione di dati gestita da un DBMS. Alcuni dei più famosi DBMS sono Access, Db2 dell' Ibm, Oracle e MySQL che, oltretutto, è OpenSource.. Riassumendo, un DBMS si occupa di basi di dati con le seguenti caratteristiche: Grandi: nel senso che possono avere anche dimensioni enormi e quindi oltre le capacita della memoria centrale di un elaboratore. Di conseguenza un DBMS deve essere in grado di gestire memorie secondarie. Condivise: perché un DBMS deve permettere a più utenti di accedere contemporaneamente ai dati comuni. In tal modo viene anche ridotta la ridondanza e inconsistenza dei dati, dato che esiste una sola copia dei dati. Per controllare l’accesso condiviso di più utenti il DBMS dispone di un meccanismo apposito, detto controllo di concorrenza . Affidabilità: dato che un DBMS deve garantire l’integrità dei dati anche in caso di malfunzionamento hardware e software, prevedendo per lo meno procedure di recupero dei dati. I DBMS forniscono, per tali scopi, procedure di salvataggio e ripristino della base di dati (backup e recovery). Privatezza: i DBMS gestiscono un sistema di autorizzazioni che definisce i diritti di ciascun utente ( lettura, scrittura ecc.). Nell’appendice B sono riportate le istruzioni per installare MySQL, un potente DBMS scaricabile gratuitamente all’indirizzo www. mysql.com. Basi di dati relazionali La maggior parte dei sistemi di basi di dati oggi sul mercato si basa sul modello relazionale, proposto in una pubblicazione scientifica nel 1970 al fine di superare le limitazioni logiche dei modelli allora utilizzati, che non permettevano di realizzare efficacemente la proprietà di indipendenza dei dati, già riconosciuta come fondamentale. Sebbene i primi prototipi di basi di dati basati sul modello relazionale risalgano ai primi anni settanta bisognerà aspettare la metà degli anni ottanta perché tale modello acquisisca una frazione significativa di mercato. Il modello relazionale si basa su due concetti fondamentali : relazione e tabella. Mentre il concetto di tabella è facilmente intuibile, quello di relazione proviene dalla matematica, ed in particolare dalla teoria degli insiemi. E’ opinione diffusa Informatica di Base 67 __________________________________________________________________________________________ che parte del successo del modello relazionale derivi dalla presenza contemporanea di questi due concetti, uno intuitivo ed uno formale. Infatti, mentre le tabelle risultano naturali e facilmente comprensibili, le relazioni garantiscono una formalizzazione semplice e chiara che ha permesso uno sviluppo teorico del modello finalizzato al raggiungimento di risultati di interesse concreto. Il modello relazionale risponde al requisito dell’indipendenza dei dati e, pertanto, prevede un livello fisico ed un livello logico. Utenti e programmatori interagiscono solo col livello logico e quindi non è necessario che essi conoscano le strutture fisiche della base di dati. Anche questo aspetto è responsabile del suo successo dato che i suoi principali concorrenti (reticolare e gerarchico) obbligavano gli utilizzatori a conoscerne, almeno a grandi linee, la struttura realizzativa. Il concetto di relazione è legato al concetto puramente matematico di prodotto cartesiano tra due insiemi. Avendo due insiemi D1 e D2 il prodotto cartesiano (D1 x D2) è l’insieme delle coppie ordinate (v1 e v2) tale che v1 è un elemento di D1 e v2 è un elemento di D2. Quindi il prodotto cartesiano è l’insieme di tutti le combinazioni tra gli insiemi dati. La relazione è un sottoinsieme prodotto cartesiano tra due insiemi ed è rappresentata da un insieme di tuple omogenee, dove per tuple si intende un elemento definito tramite i suoi attributi. Ad esempio dati due insiemi A e B dove A= {1,2,3} e B={h,k} il prodotto cartesiano è uguale all’insieme A x B={(1,h),(2,h),(3,h),(1,k),(2,k),(3,k)} mentre una relazione possibile è {(1,h),(1,k),(3,h)}. Generalizzando la relazione ad un numero di insiemi n>0 avremmo D1,D2,…,Dn, il prodotto D1 x D2 x … x Dn e un sottoinsieme che descriverà la relazione. Il numero n delle componenti dell’insieme è detto grado del prodotto cartesiano e della relazione. Il numero degli elementi che della relazione è detta cardinalità della relazione. Le tabelle nascono dall’esigenza di rappresentare graficamente le relazioni presentandole in una forma più facilmente comprensibile. In questo caso le righe della tabella saranno rappresentate dalle tuple mentre le colonne ne rappresentano i campi (detti anche attributi). E’ importante chiarire che in una relazione, in quanto insieme, non vi è alcun ordinamento fra le tuple che la compongono; nelle tabelle che la rappresentano l’ordine c’è per necessità, ma è occasionale in quanto due tabelle con le stesse righe, ma in ordine diverso, rappresentano la stessa relazione. Inoltre le tuple di una relazione sono distinte l’una dall’altra, in quanto tra gli elementi di un insieme non possono essere presenti due elementi uguali; da cui si deduce che una tabella può rappresentare una relazione solo se le righe che la formano sono diverse l’una dall’altra. Una base di dati è quindi costituita da più relazioni, le cui tuple contengono valori comuni, ove necessario per stabilire corrispondenze. Consideriamo ad esempio la seguente base di dati: Massimiliano Teso Maxy Guida 68 __________________________________________________________________________________________ Matricola 276545 485784 569885 452587 125847 STUDENTE Cognome Nome Rossi Maria Neri Anna Verdi Fabio Rossi Luca Bruni Mario Anno_Iscrizione 1990 2000 1997 1995 2000 ESAME Corso Data_Esame MtrStudente 276545 Analisi 14/04/2001 485784 Chimica II 21/07/2001 125847 Chimica I 13/04/2001 125847 Analisi 08/05/2001 Voto 28 27 25 24 CORSO Anno_di_ Corso Nome Analisi Primo Chimica I Primo Chimica II Terzo In essa abbiamo che: • la prima relazione contiene informazioni relative a un insieme di studenti, con numero di matricola, cognome, nome e data di nascita • la terza relazione contiene informazioni su alcuni corsi con codice, titolo e docente • la seconda relazione contiene informazioni relative agli esami: il numero di matricola dello studente, il codice del corso e il voto; questa relazione fa riferimento ai dati contenuti nelle altre due. Nei sistemi relazionali è ammissibile la presenza del valore null che viene utilizzato per indicare una serie di situazioni che è possibile trovare in un campo di una tabella. Ad esempio ci si può trovare di fronte ad una tabella del tipo: Città Roma Firenze Tivoli Prato Indirizzo_prefettura Via Quattro Novembre Null Null Null Informatica di Base 69 __________________________________________________________________________________________ In questo esempio il valore null indica tre diverse situazioni: Valore sconosciuto : nel primo caso dato che Firenze è un capoluogo di provincia e avrà sicuramente una prefettura; significa che il DBMS non dispone del suo indirizzo. Valore inesistente : nel caso di Tivoli, dato che questa città non ha di Prefettura. Senza informazione : siccome la provincia di Prato è di recente istituzione significa che non sappiamo se la mancanza di un indirizzo dipenda dal fatto che essa ancora non esista, oppure da un deficit del DBMS. Le strutture del modello relazionale ci permettono di organizzare le informazioni di interesse per le nostre applicazioni. In molti casi però non è vero che qualsiasi insieme di tuple sullo schema rappresenti informazioni corrette per l’applicazione. Ad esempio nella base di dati dell’esempio precedente i voti devono essere compresi tra 18 e 30 e si deve imporre che due studenti differenti abbiano matricole differenti. I vincoli di un DBMS si dividono in intrarelazionali, se riguardano l'interno nella relazioni, ed extrarelazionali, più pesanti perché riguardano i legami fra le relazioni e quindi la natura stessa di un DBMS relazionale. Il più caratterizzante esempio di violazione di un vincolo extrarelazionale si ha qualora non vi sia corrispondenza tra le istanze di due tabelle che, per ragioni intrinseche allo schema della base di dati, sono legate tra loro da un vincolo detto di integrità referenziale, il quale impone che per ogni valore di una tabella vi sia un corrispondente nell'altra. Nell’esempio precedente c’è un vincolo di integrità referenziale tra il campo Matricola della tabella STUDENTI e il campo Studente della tabella ESAMI. Un vincolo intrarelazionale, al contrario, trova il suo soddisfacimento rispetto alle singole relazioni del DBMS; esso può essere : • vincolo su valori, o vincolo di dominio : quando si impone a certi valori del database di rientrare in determinate caratteristiche (ad esempio il voto di un esame universitario deve obbligatoriamente rientrare tra il 18 ed il 30, ed un DBMS incaricato raccogliere tali dati deve prevederlo). • vincolo di tupla: che esprime delle condizioni sui valori di ciascuna tupla, indipendentemente dalle altre tuple. Consideriamo l'esempio dei voti degli esami universitari e ipotizziamo di avere un DBMS che debba memorizzarli; poniamo, inoltre, di destinare un campo all'eventuale lode (campo di tipo booleano, vero/falso). In questo caso avremmo che l'attributo "lode" potrà essere vero solo se il voto di quella tupla è uguale a trenta. Cercando di dare una forma a tale vicolo potremmo scrivere che: Massimiliano Teso Maxy Guida 70 __________________________________________________________________________________________ ( not ( lode =vero ) ) or ( voto = 30 ) mentre in questo caso il vincolo di dominio (visto precedentemente) potrebbe essere espresso con la formula: ( voto >= 18 ) and ( voto <= 30 ) Il più importante vincolo del modello relazionale è il così detto vincolo di chiave utilizzato per identificare in maniera univoca le tuple di una relazione. Nell’esempio precedente il campo Matricola della tabella STUDENTI identifica univocamente ogni studente. Ciascuna relazione deve quindi avere una chiave rappresentata da uno o più attributi detta chiave primaria. Gli attributi che fanno parte della chiave primaria vengono spesso evidenziati attraverso la sottolineatura e su di essi si vieta la presenza di valori nulli. Progettazione di una base di dati Il primo passo per la realizzazione di una base di dati è la progettazione che prevede i seguenti passaggi: Definizione dei processi: in questa fase si acquisiscono le conoscenze dei processi aziendali tramite interviste per avere un’idea chiara di come dovrà funzionare la base di dati. Definizione degli oggetti aziendali: in questa fase si dovranno individuare gli elementi che costituiscono il processo come ad esempio il cliende e la videocassetta nel caso di una videoteca. Per ogni oggetto vanno poi definite le cratteristiche che lo descrivono (come nome, cognome, data di nascita etc per il cliente). Definizione delle regole aziendali: in questa fase si identificano i vincoli che la base di dati deve rispettare. In una videoteca, ad esempio, il cliente potrebbe non poter affittare più di due videocassette alla volta. Realizzazione del modello di database: in questa fase finale della progettazione si realizza uno schema (detto schema ER) che rappresenti in maniera chiara è completa l’intero progetto. Informatica di Base 71 __________________________________________________________________________________________ Un semplice schema ER di un possibile progetto per la gestione degli esami universitari è il seguente: Una delle fasi più importanti è la realizzazione delle relazioni tra le varie entità. Esistono tre tipi di relazioni: Relazione uno a uno: in cui un record di una tabella corrisponde a un record di un’altra tabella. Ad esempio è la relazione che potrebbe intercorrere tra la tabella “Ordine” e la tabella “Bolla di accompagno” in quanto un ordine fa rifermento a una sola bolla e viceversa. Relazione uno a molti: in cui un record di una tabella può corrispondere a più record di una seconda tabella mentre non vale il viceversa. Tale relazione potrebbe intercorrere tra la tabella “Studente” ed “Esame” in quanto uno studnete può fare più esami ma un esame può essere sostenuto da un solo studente. Massimiliano Teso Maxy Guida 72 __________________________________________________________________________________________ Relazione molti a molti: in cui un record di una tabella può corrispondere a più record d una seconda tabella e viceversa. Tale relazione potrebbe intercorrere tra le tabelle “Impiegato” e “Progetto” in quanto un impiegato può partecipare a più progetti e ogni progetto può essere realizzato da più impiegati. Le relazioni molti a molti possono creare diversi problemi se lasciate così come sono in fase di progettazione ed è quindi utile inserire una tabella intermedia che colleghi le altre due. Una volta finita la fase di progettazione è possibile creare le tabelle vere e proprie consideranzo il fatto che ogni relazione diventa una tabella con i campi specificati più le chiavi delle tabelle a essa collegate. La base di dati dello schema ER per la gestione degli esami universitari è l’insieme delle seguenti tabelle: Matricola STUDENTE Cognome Nome MtrStudente Anno_Iscrizione ESAME Corso Data_Esame CORSO Anno_di_ Corso Nome Voto Informatica di Base 73 __________________________________________________________________________________________ Cenni di algebra e calcolo relazionale L’algebra relazionale è un linguaggio procedurale basato su concetti di tipo algebrico che deriva da quella parte della matematica che si occupa degli insiemi. I concetti trattati sono molto astratti, poco legati al pratico utilizzo dei DBMS. In questo paragrafo ci limiteremo a descrivere i concetti generali senza entrare nel dettaglio delle formule e delle dimostrazioni. Di seguito descriveremo gli operatori fondamentali dell’algebra relazionale, lo stretto necessario per comprendere da cosa deriva l’SQL, il linguaggio di interrogazione delle basi di dati. L'algebra relazionale definisce una serie di operatori e regole per la creazione e la modifica delle relazioni. Di seguito vengono trattati i più comuni. • Unione: Appurato che le relazioni sono insiemi, ha senso intervenire sulle relazioni con gli operatori dell’algebra insiemistica, quali l’unione la differenza e l’intersezione. Tuttavia, dato che una relazione è un insieme di tuple omogenee (ovvero definite dagli stessi attributi), questi operatori potranno essere usati solo con relazioni aventi gli stessi attributi, o almeno degli attributi comuni. Detto questo è possibile dire che l'unione tra due relazioni r1 ed r2, definite sullo stesso insieme di attributi X ( si scrive r1(X) e r2(X) ), è indicata con r1 U r2 ed è una relazione ancora su X contenente le tuple che appartengono ad r1 oppure ad r2, oppure ad entrambe. Nella fattispecie delle basi di dati l'unione di due tabelle è l'insieme delle righe che appartengono alle tabelle ( alla prima, alla seconda o a entrambe). • Intersezione: L'intersezione di r1(X) ed r2(X) è indicata con r1 r2 ed è una relazione su X contenente le tuple che appartengono sia ad r1 che ad r2. Riferito alle tabelle l'intersezione di due di queste è l'insieme delle righe che appartengono a entrambe. • Differenza: La differenza di r1(X) ed r2(x) è indicata con r1 - r2 ed è una relazione su X contenente le tuple che appartengono a r1 e non appartengono ad r2. Quindi la differenza tra due tabelle è l'insieme delle righe che appartengono alla prima tabella e non alla seconda. • Ridenominazione: Per risolvere il problema derivante dal fatto che gli operatori sopra citati possono essere usati solo con attributi uguali, l'algebra relazionale ci mette a disposizione l'operatore di ridenominazione. Questo operatore ci permette di ridefinire il nome dell'attributo in modo da poter usare le operazioni di unione, differenza ed intersezioni anche su relazioni con diversi attributi (sempre ammesso che ciò possa avere un senso). Massimiliano Teso Maxy Guida 74 __________________________________________________________________________________________ • Selezione: La selezione produce un sottoinsieme di tuple su tutti gli attributi. La selezione introduce un concetto fondamentale dell'algebra relazionale e, di conseguenza, delle basi di dati: il concetto di condizione. Infatti la discriminante che permette di stabilire quali tuple andranno a formare il risultato della selezione è il fatto che esse rispondano o meno a una determinata condizione. • Proiezione: La proiezione è un concetto simile a quello della selezione. Essa produce, alla pari della selezione, un sottoinsieme della relazione genitrice ma, a differenza della selezione, il sottoinsieme prodotto contiene tutte le tuple originali ma con un numero inferiore di attributi. • Join: L'operatore di join è il più caratteristico dell'algebra relazionale. Il join naturale è un operatore che correla i dati di due relazioni sulla base di valori uguali in attributi con lo stesso nome. Esistono diversi tipi di join, a seconda delle diverse situazione di relazioni, che sono tuttavia riconducibili al modello del join naturale. Un'analisi più approfondita esula dai compiti di questo lavoro volto all'aspetto pratico delle basi di dati. Ulteriori informazioni circa il join si possono trovare nel paragrafo successivo, che mostra l’implementazione di tale operatore nel linguaggio SQL. Data la seguente base di dati vediamo degli esempi pratici degli operatori appena visti: Cognome Rossi Neri Verdi Cognome Verdi Bruni IMPIEGATI Agenzia Stipendio Roma 45 Milano 53 Latina 33 OPERAI Fabbrica Latina Monza Salario 33 32 Prima di poter utilizzare gli operatori di unione, intersezione e differenza è necessario rinominare alcuni attributi della tabella OPERAI (Fabbrica in Agenzia e Salario in Stipendio). A questo punto sia ha che: Informatica di Base 75 __________________________________________________________________________________________ IMPIEGATI Cognome Rossi Neri Verdi Bruni Agenzia Roma Milano Latina Monza IMPIEGATI Cognome Verdi Agenzia Latina OPERAI Stipendio 45 53 33 32 OPERAI Stipendio 33 IMPIEGATI - OPERAI Cognome Rossi Neri Agenzia Roma Milano Stipendio 45 53 SELEZIONE (Stipendio > 40) [IMPIEGATI] Cognome Rossi Neri Agenzia Roma Milano Stipendio 45 53 PROIEZIONE (Cognome,Stipendio) [IMPEGATI] Cognome Stipendio Rossi 45 Neri 53 Verdi 33 Massimiliano Teso Maxy Guida 76 __________________________________________________________________________________________ Data la seguente base di dati: IMPIEGO Impiegato Reparto Rossi vendite Neri produzione Verdi produzione DIREZIONE Reparto Capo produzione Mori vendite Bruni IMPIEGO JOIN DIREZIONE Impiegato Rossi Neri Verdi Reparto vendite produzione produzione Capo Bruni Mori Mori Informatica di Base 77 __________________________________________________________________________________________ Il linguaggio SQL SQL è l’acronimo di Structured Query Language, ed è un linguaggio di interrogazione delle basi di dati sviluppato dall’IBM nella seconda metà degli anni settanta. L’SQL è largamente diffuso e riveste una notevole importanza nel mondo delle applicazioni per basi di dati. Tale diffusione nasce principalmente dalla sua standardizzazione che lo pone come il linguaggio "universale" di accesso ai database. Infatti quasi tutti i DBMS, nonostante abbiano delle caratteristiche proprietarie, riconoscono i comandi SQL in modo che ci si possa interfacciare con essi in modo univoco. Per definiere la sintassi dei comandi SQL utilizeremo le parentesi quadre per indicare che il termine è opzionale, quelle graffe che il termine racchiuso può non comparire o essere ripetuto un numero arbitrario di volte mentre le barre verticali per indicare che deve essere scelto uno tra i termini proposti (l’elenco dei termini può essere racchiuso tra parentesi angolate). Le parentesi tonde dovranno essere sempre intese come termini del linguaggio SQL. SQL può gestire diversi tipi di dato tra cui i seguenti • Carattere : singoli caratteri oppure stringhe o Varchar [ ( lunghezza ) ] • Tipi numerici esatti : per i valori interi o per valori decimali a virgola fissa. o Numeric [ ( Precizione [ , Scala ] ) ] o Decimal [ ( Precizione [ , Scala ] ) ] o Int • Tipi numerici approssimativi : o Float [ ( Precisione ) ] o Double precision o Real • Data e ora o Date con i campi year, month, day o Time [ ( Precisione ) ] i campi hour, minute, second Per prima cosa è necessario creare una base di dat con il comando Create DataBase Nome; Massimiliano Teso Maxy Guida 78 __________________________________________________________________________________________ Una volta creato lo schema occorre inserire il comando Use Nome; per indicare il database in uso. A qusto punto occorre inserire le tabelle che andranno a creare la base di dati. Successivamente le tabelle verranno popolate mendiante l’inserimento delle tuple che costituiranno la vera risorsa della base di dati. Definizione delle tabelle: Una tabella SQL è costituita da una collezione di attributi e da un insieme (eventualmente vuoto) di vincoli. La sintassi è : CREATE TABLE NomeTabella ( NomeAttributo Dominio [ valore di default ] [ vincoli ] { , NomeAttributo Dominio [ valore di default ] [ vincoli ] } ); quindi una tabella viene definita associandole un nome ed elencandone gli attributi che ne compongono lo schema. Ecco un esempio: CREATE TABLE Studente ( Matricola INT PRIMARY KEY NOT NULL, Cognome VARCHAR(20) NOT NULL, Nome VARCHAR(20), Anno_Iscrizione DATE, ); I valori di default sono i valori che deve assumere l’attributo quando viene inserita una riga nella tabella senza che venga specificato il valore dell’attributo stesso. La parola chiave primari key indica che la Matricola è una chiave primaria. Possiamo naturalmente definire dei vincoli, cioè delle proprietà che devono essere verificate da ogni istanza della base di dati. Esistono vincoli intrarelazionali, ovvero interni alla tabella, e vincoli interelazionali, che rappresentano i vincoli di integrità referenziale (detti anche vincoli di riferimento). Informatica di Base 79 __________________________________________________________________________________________ Vincoli intrarelazionali: In SQL i vincoli intrarelazionali che possono essere definiti sugli attributi di una tabella sono i vincoli di not null, unique e primary key. • Not null: significa che l'attributo deve essere sempre specificato. • Unique: si applica a uno o più attributi imponendo che righe differenti abbiano valori differenti. Viene fatta eccezione solo per il valore null. • Primary Key: specifica quali attributi rappresentano la chiave primaria. Gli attributi che fanno parte della chiave primaria devono essere indicati come “Not Null”. Mentre i vincoli not null e unique possono essere definiti più volte, la primary key può essere definita una volta sola (sia che sia specificata a livello di attributo che in calce per indicare una serie di attributi). Esempio: CREATE TABLE Persona ( Nome VARCHAR(20) NOT NULL, Cognome VARCHAR(20) NOT NULL, Indirizzo VARCHAR(20), Città VARCHAR(20), PRIMARY KEY (Nome, Cognome) ); crea una tabella in cui la chiave primaria è rappresentata dall'insieme del nome e del cognome. CREATE TABLE Persona ( Matricola VARCHAR (6) PRIMARY KEY NOT NULL, Nome VARCHAR(20) NOT NULL, Cognome VARCHAR(20) NOT NULL, Indirizzo VARCHAR(20), Città VARCHAR(20), UNIQUE (Nome, Cognome) ); crea una tabella in cui la chiave primaria è il codice di matricola e gli attributi nome e cognome devono essere obbligatoriamente specificati (per via del not null) ed in cui non possono comparire due righe aventi stesso nome e cognome. Massimiliano Teso Maxy Guida 80 __________________________________________________________________________________________ Vincoli interelazionali: In SQL tali vincoli si definisco tramite l'apposito costrutto della chiave esterna (vincolo di foreign key). L’attuale versione di MySQL non supporta questo tipo di vincoli che quindi, per ora, devono essere realizzati a livello di applicazione. Questo vincolo impone che ogni valore dell'attributo di una tabella (se diverso da null) sia presente tra i valori di un attributo delle righe appartenenti ad un'altra tabella (detta tabella esterna). I vincoli interelazionali possono essere definiti in due modi: con l'uso del costrutto sintattico references, con il quale si specificano la tabella esterna con il quale l'attributo deve essere legato, oppure con l'uso del costrutto foreign key. Di seguito compare un esempio con la definizione di un vicolo di integrità referenziale con un'altra tabella ("Dipartimento"). Il vincolo è specificato tramite l'uso di references per fare in modo che nella tabella Persona l'attributo Dipart sia obbligatoriamente un valore contenuto nella tabella esterna nell'attributo NomeDipart. CREATE TABLE Persona ( Matricola VARCHAR(6) PRIMARY KEY NOT NULL, Nome VARCHAR(20) NOT NULL, Cognome VARCHAR(20) NOT NULL, Indirizzo VARCHAR(50), Dipart VARCHAR(15) REFERENCES Dipartimento(NomeDip), Città VARCHAR(20), UNIQUE (Nome, Cognome) ); Invece il costrutto foreign key (posto non a livello di attributo ma in calce e seguito da references) offre delle possibilità maggiori. Innanzitutto permette di definire dei vincoli per un'insieme di attributi; inoltre permette di definire la reazione del DBMS ad eventuali forzature dei vincoli di integrità referenziale. Infatti, trovandosi di fronte ad una relazione tra tabelle, occorre prendere in considerazione quale sarà la reazione della tabella interna (o master) all'atto della modifica di una riga della tabella esterna (detta slave). Le operazioni che possono mettere in crisi il nostro sistema di vincoli sono, ovviamente, le operazioni di cancellazione e modifica sulla tabella esterna, operazioni alle quali la tabella interna dovrà adeguarsi. SQL ci permette di definire, come opzioni del costrutto foreign key, quattro reazioni del DBMS del caso di modifica (update) e cancellazione (delete): Informatica di Base 81 __________________________________________________________________________________________ Cascade Set null Set default No action On update Il nuovo valore viene riportato su tutte le relative righe della tabella master Nella tabella master viene inserito null al posto dei valori relativi all'attributo modificato Nella tabella master viene inserito il valore di default al posto dei valori relativi all'attributo modificato Non viene eseguita alcuna operazione. Il DBMS respinge la richiesta di update. On delete Tutte le relative righe della tabella master vengono cancellate Nella tabella master viene inserito null al posto dei valori relativi all'attributo modificato Nella tabella master viene inserito il valore di default al posto dei valori relativi all'attributo modificato Non viene eseguita alcuna operazione. Il DBMS respinge la richiesta di cancellazione. Esempio di utilizzo del foreign key: CREATE TABLE Persona ( Matricola VARCHAR(6) PRIMARY KEY NOT NULL, Nome VARCHAR(20) NOT NULL, Cognome VARCHAR(20) NOT NULL, Indirizzo VARCHAR(50), Dipart VARCHAR(15) REFERENCES Dipartimento(NomeDip), Città VARCHAR(20), FOREIGNKEY(Dipart) REFERENCES Dipartimento(NomeDip) ON DELETE SET NULL, ON UPDATE CASCADE, UNIQUE (Nome, Cognome) ); Massimiliano Teso Maxy Guida 82 __________________________________________________________________________________________ Modifica delle tabelle: Il linguaggio implementa anche delle istruzioni dedicate alla modifica delle strutture esistenti. Tali comando sono alter, che permette di modificare domini e schemi di tabelle, e drop , che permette di rimuovere dei componenti siano essi schemi, domini o tabelle. Ecco un esempio che aggiunge un attributo alla tabella Dipartimenti. ALTER TABLE Dipartimenti ADD COLUMN NroUffici INT; in questo modo la tabella ha una colonna in più che rappresenta, ad esempio, il numero degli uffici. Invece il comando : DROP TABLE Dipartimenti; cancella la colonna appena creata. Interrogazioni: La parte di SQL dedicata all'interrogazione del DBMS è probabilmente la parte più importante ed utilizzata del linguaggio. Per essere eseguita, l'interrogazione deve essere analizzata dall'interprete SQL (che è un componente del DBMS) per essere tradotta in un'interrogazione equivalente in linguaggio procedurale. Le interrogazioni in SQL sono specificate tramite l'uso dell'istruzione select la cui struttura essenziale è la seguente : SELECT ListaAttributi FROM ListaTabelle [ WHERE Condizione ] L'interrogazione SQL seleziona, tra le righe che appartengono al prodotto cartesiano delle tabelle elencate nella clausola from, quelle che soddisfano la clausola where (se è assente vengono selezionate tutte le righe). Se al posto della ListaAttributi c’è un asterisco (*) vengono selezionati tutti gli attributi del prodotto cartesiano. Nella ListaAttributi possono essere definiti degli alias, ovvero dei nomi che possono essere usati, successivamente, per richiamare il campo. Ad esempio, data la base di dati: Informatica di Base 83 __________________________________________________________________________________________ DIPARTIMENTO NomeDip Indirizzo Amministrazione Via Milano 7 Produzione Via Torino 4 Ricerca Via Roma 10 Direzione Via Morone 6 Nome Mario Carlo Maria Marco Paola Citta Roma Milano Firenze Aosta IMPIEGATO Cognome Dipart Rossi Amministrazione Neri Direzione Meli Richerca Bruni Sviluppo Bruni Direzione Stipendio 500 800 650 950 900 L’interrogazione SELECT Stipendio AS Salario FROM Impiegato WHERE Cognome = "Rossi"; prende il valore dello stipendio di "Rossi" dalla tabella Impiegato ridefinendolo come Salario. Nella ListaAttributi possono essere inserite anche espressioni generiche (addizione, sottrazione, moltiplicazione ecc.). Ad esempio : SELECT Stipendio AS Salario, Stipendio/12 AS SalarioMensile FROM Impiegato WHERE Cognome = "Rossi"; Per quanto riguarda la clausola from essa rappresenta l'insieme delle tabelle a cui si vuole accedere e delle quali verrà eseguito il prodotto cartesiano. Considerando l'esempio del paragrafo precedente (tabelle Impiegato e Dipartimento) e volendo prendere valori da entrambe le tabelle: SELECT Impiegato.Nome, Impiegato.Cognome, Dipartimento.Citta FROM Impiegato, Dipartimento WHERE Impiegato.Dipart = Dipartimento.NomeDip; Rispetto agli esempi precedenti si nota l'uso del punto per indicare a quali a quale tabella si riferisce l'attributo. La clausola where ammette una serie di espressioni booleane; è possibile, all'interno della clausola, combinare predicati semplici con gli operatori logici Massimiliano Teso Maxy Guida 84 __________________________________________________________________________________________ and, or e not. Ciascun predicato semplice confronta (con gli operatori =,<>,<,>,<= e >=) una espressione costruita a partire dai valori degli attributi per la riga o con un valore costante o con il risultato della valutazione di un'altra espressione. Ad esempio: SELECT Nome FROM Impiegato WHERE Cognome = “Rossi” and (Dipart = “Amministrazione” OR Dipart = “Produzione”); seleziona l'impiegato di nome "Rossi" appartenente al dipartimento “Amministrazione” o “Produzione”. Oltre agli operatori standard già citati SQL mette a disposizione l'operatore like per il confronto di stringhe. Tale operatore si comporta come l'operatore di uguaglianza ma, a differenza di quest'ultimo, supporta anche i caratteri "%" (percentuale) e "_" (trattino sottolineato). Il primo rappresenta una sringa arbitraria (anche vuota) mentre il secondo un carattere arbitrario. Ad esempio: SELECT * FROM Impiegato WHERE Cognome like “_o%i”; seleziona tutti gli impiegati il cui cognome termina con la lettera "i" e la cui seconda lettera è una "o". Di particolare importanza la gestione dei valori nulli nella valutazione dei predicati. Infatti nell'algebra booleana convenzionale si prendono in considerazione unicamente due valori (vero o falso) mentre abbiamo visto che avendo a che fare con delle basi di dati, possiamo avere anche il valore null (cioè sconosciuto). Le ultime versioni di SQL gestiscono i campi null considerandoli nella valutazione di relazioni complesse, estendendo a tre valori, vero | falso | null, il possibile risultato. Quindi avremmo invece delle classe tabelle di verità le nuove tabelle comprensive del valore null. Not Falso Null Vero Vero Null Falso Informatica di Base 85 __________________________________________________________________________________________ And Vero Null Falso Vero Vero Null Falso Null Null Null Falso Falso Falso Falso Falso Or Vero Null Falso Vero Vero Vero Vero Null Vero Null Null Falso Vero Null Falso Diciamo inoltre che la selezione dei campi null si effettua tramite la sintassi: Attributo IS [NOT] NULL Tale predicato risulta vero solo se il valore è null. Il predicato not null è il suo contrario. Si potrebbero ad esempio selezionare tutte le righe con il campo stipendio non nullo mediante la condizione WHERE Stipendio IS NOT NULL Inserimento nelle tabelle: Il comando di inserimento di righe nella base di dati presenta due sintassi alternative: INSERT INTO NomeTabella [( ListaAttributi) ] < VALUES ( ListaDiValori ) | SelectSQL >; Questa sintassi permette di inserire una riga specificandone i valori dei suoi attributi. Ad esempio: INSERT INTO Dipartimento(NomeDip, Citta) VALUES(“Produzione”, “Torino”); Una seconda sintassi, meno usata ma più consona all'impostazione SQL che ha come oggetto le tabelle e non le singole righe, permette di aggiungere degli insiemi di righe mediante il comando SELECT. La sua sintassi è: INSERT INTO NomeTabellaDestinazione [( ListaAttributi) ] SELECT ListaAttributi FROM NomeTabellaOrigine WHERE Condizione; Massimiliano Teso Maxy Guida 86 __________________________________________________________________________________________ Ad esempio il seguente comando: INSERT INTO ProdottiMilanesi (codice, descrizione) SELECT codice, descrizione FROM Prodotto WHERE LuogoProd=”Milano”; Inserisce nei campi codice e selezione della tabella ProdottiMilanesi il risultato della selezione della relazione Prodotto di tutte le righe aventi “Milano” come valore dell’attributo LuogoProd. Cancellazione delle righe: Il comando SQL delete permette di eliminare delle righe dalle tabelle di una base di dati. La sintassi è: DELETE FROM NomeTabella [ WHERE Condizione ]; Quando la condizione della clausola where non viene specificata, il comando cancella tutte le righe della tabella, altrimenti vengono rimosse solo le righe che soddisfano la condizione. La condizione rispetta la sintassi SQL, per cui potremmo avere al suo interno delle interrogazioni nidificate che fanno riferimento ad altre tabelle. Un semplice esempio che elimina i dipartimenti con sede a Roma: DELETE FROM Dipartimento WHERE Citta= “Roma” E' da notare la differenza tra il comando delete ed il comando drop. Ad esempio il comando: DELETE FROM Dipartimento; elimina tutte le righe della tabella dipartimento, ma lo schema rimane immutato; il comando, infatti, cancellerà solo le istanze della tabella. Mentre il comando: DROP TABLE Dipartimento; elimina tutte le istanze della tabella, nonché lo schema. Informatica di Base 87 __________________________________________________________________________________________ Modifica delle righe: In SQL la modifica delle righe avviene mediante l'utilizzo del comando update, seguendo la sintassi: UPDATE NomeTabella SET Attributo = < Espressione | SelectSQL | Null | default > { , Set Attributo = < Espressione | SelectSQL Null | default> } [ WHERE Condizione ]; Questo comando permette di aggiornare uno o più attributi delle righe di NomeTabella che soddisfano l'eventuale condizione. Se la condizione non compare ovviamente si suppone di default il valore vero e si esegue la modifica su tutte le righe della tabella. Ecco un esempio che aumenta del 20% lo stipendio degli impiegati che si chiamano "Mario": UPDATE Impiegato SET Stipendio = Stipendio * 1.2 WHERE Nome = 'Mario' Uso del join: Supponiamo di voler sapere i nomi di tutti gli studenti che hanno sostenuto un esame in base alle tabelle riportate a pagina 68. Per farlo dobbiamo realizzare un join confrontando l’attributo Matricola della tabella Studente e l’attributo MtrStudente della tabella Esame. Si deve quindi scrivere: SELECT S.Nome FROM Studente AS S, Esame AS E WHERE S.Matricola = E.MtrMatricola; L'ultima versione di SQL (SQL-2) ha introdotto una sintassi alternativa per l'espressione di join che permette di distinguere tra le condizioni che rappresentano le selezioni di join e quelle che rappresentano di selezioni di riga. Inoltre il linguaggio è stato arricchito di nuove espressioni di join. La sintassi è la seguente: SELECT AttrExpr [ [AS] Alias ] {, AttrExpr [ [AS] Alias ] } FROM Tabella [ [AS] Alias ] {, TIPOJOIN Tabella [ [AS] Alias ] ON CondizioneDiJoin } [ WHERE AltraCondizione ] Massimiliano Teso Maxy Guida 88 __________________________________________________________________________________________ Mediante questa sintassi la condizione di join non compare come argomento della clausola where, ma viene invece spostata nell'ambito della clausola from, associata alle tabella che vengono coinvolte nel join. Il parametro TipoJoin specifica quale è il tipo di join da usare, e ad esso si possono sostituire i termini INNER, RIGHT OUTER, LEFT OUTER o FULL. L'operatore inner join è il più comune e prorio per questo la parola chiave INNER può essere omessa. Ad esempio l'interrogazione realizza precedentemente con l'utilizzo del where ora può essere riscritta: SELECT S.Nome FROM Studente AS S JOIN Esame AS E D ON S.Matricola = E.MtrStudente; Questo è il caso di un join interno, perché le righe che vengono coinvolte nel join sono in un sottoinsieme delle righe di ciascuna colonna. Può infatti capitare che alcune righe non vengano considerate in quanto non esiste una corrispondente riga nell'altra tabella per cui la condizione sia soddisfatta. Questo comportamento molto spesso non rispetta le esigenze delle applicazioni, le quali, alla eliminazione delle righe operata dal join, possono preferire di mantenere le righe, ponendo eventualmente opportuni valori null. Il join esterno (outer join) ha proprio questo compito. Esistono tre diversi tipi di join esterno: left, right e full. Il left join fornisce come risultato il join interno con le righe della relazione che compare a sinistra nel join per le quali non esiste una corrispondente riga nella tabella di destra; il right join restituisce invece, oltre al join interno, le righe escluse della relazione di destra; infine il full join restituisce il join interno esteso con le righe eslcuse di entrambe le relazioni. Ad esempio, sulla base delle tabelle riportate a pagina 83, la selezione: SELECT * FROM Dipartimento LEFT JOIN Impiegato ON (Dipartimento.NomeDip=Impiegato.Dipart); fornisce la seguente tabella NomeDip Indirizzo Amministrazione Via Milano 7 Produzione Via Torino 4 Ricerca Via Roma 10 Direzione Via Morone 6 Direzione Via Morone 6 Citta Roma Milano Firenze Aosta Aosta Nome Mario NULL Maria Carlo Paola Cognome Stipendio Rossi 500 NULL NULL Meli 650 Neri 800 Bruni 900 Informatica di Base 89 __________________________________________________________________________________________ SELECT * FROM Impiegato FULL JOIN Dipartimento ON (Impiegato.Dipart= Dipatimento.NomeDip) fornisce la seguente tabella Nome Mario Carlo Paola Maria Marco NULL Cognome Rossi Neri Bruni Meli Bruni NULL Stipendio 500 800 900 650 950 NULL Dipart Amministrazione Direzione Direzione Richerca Sviluppo Produzione Indirizzo Via Milano 7 Via Morone 6 Via Morone 6 Via Roma 10 NULL Via Torino 4 Citta Roma Aosta Aosta Firenze NULL Milano Talvolta è necessario convolgere più tabelle in una selezione. Supponiamo infatti di voler conoscere oltre al nome di tutti gli studenti che hanno sostenuto un esame, anche il nome dell’esame e l’anno di corso. Queste informazioni sono riportate su tre tabelle differenti e quindi l’interrogazione sarà la seguente: SELECT S.Nome, C.Nome, C.Anno_di_Corso FROM Studente AS S, Esame AS E, Corso AS C WHERE S.Matricola = E.MtrMatricola AND E.Corso = C.Nome; Ordinamento: Abbiamo visto che una relazione è costituita da un insieme non ordinato di tuple. Spesso però nell'uso reale delle basi di dati sorge il bisogno di costruire un ordine sulle righe delle tabelle. SQL permette di costituire un ordine con l'istruzione order by posta dopo la clausola where. La sintassi è : ORDER BY AttrDiOrdinamento [ ASC | DESC ] { , AttrDiOrdinamento [ ASC | DESC ] } In questo modo si specificano gli attributi che devono essere presi in considerazione per realizzare l'ordinamento (crescente o decrescente). Se l’operatore è omesso si assume un ordine ascendente. Ad esempio: SELECT * FROM Impiegato ORDER BY Nome DESC, Cognome; Massimiliano Teso Maxy Guida 90 __________________________________________________________________________________________ Ordina la tabella degli Impiegato in maniera discendente per nome e in maniera ascendente per i cognomi nel caso ci siano nomi uguali. Operatori aggregati: Tali operatori sono una serie di parole chiave del linguaggio SQL dedicate all'aggregazione dei dati, grazie ai quali è possibile definire interrogazioni di notevoli interesse applicativo. E' necessario ricorrere a questi operatori ogni qual volta occorra valutare delle proprietà che dipendono da insiemi di righe. Lo standard SQL prevede cinque operatori aggregati, divisibili in due gruppi: count da una parte e sum, max, min, avg dall'altra. L'operatore count permette di determinare il numero di righe di una interrogazione; la sintassi è la seguente: COUNT ( * | [ DISTINCT ] | [ ALL ] ListaAttributi ); L'opzione * restituisce il numero delle righe; l'opzione distinct, invece, restituisce il numero dei diversi valori degli attributi mentre l'opzione all restituisce il numero dei valori diversi da null. Ad esempio: SELECT COUNT(DISTINCT Stipendio) FROM Impiegato; restituisce il numero dei diversi valori dell'attributo Stipendio fra tutte le righe della tabella Impiegato. Oppure: SELECT COUNT(ALL Nome, Cognome) FROM Impiegato; restituisce il numero delle righe che possiedono un valore diverso da null sia per l'attributo Nome che per l'attributo Cognome. Gli altri operatori di aggregazione richiedono invece solo un attributo o un'espressione, eventualmente preceduta dalle parole chiave distinct o all. Le funzioni sum ed avg ammettono come argomento solo espressione numeriche mentre max e min accettano anche intervalli di tempo e stringhe. Gli operatori hanno il seguente significato: • sum: restituisce la somma dei valori posseduti dall'attributo su tutte le righe; • max e min: restituiscono il massimo ed il minimo valore tra quelli di ciascuna riga (su questi operatori distinct o all non hanno alcun effetto) • avg: restituisce il valore medio tra quelli dell'attributo; Informatica di Base 91 __________________________________________________________________________________________ Ad esempio: SELECT SUM(Stipendio) FROM Impiegato WHERE Dipart= “Ricerca”; restituisce la somma degi stipendi del dipartimento “Ricerca” SELECT MAX(Stipendio) FROM Impiegato, Dipartimento WHERE Dipart= NomeDip AND Citta=“Milano”; restituisce il massimo stipendio tra quelli degli impiegati che lavorano in un dipartimento con sede a “Milano”. Interrogazioni con raggruppamento: Qualora occorra produrre delle aggregazioni occorre fare ricorso alla clausola group by. Questa istruzione può essere utilizzata con un operatore aggregato e permette di creare dei raggruppamenti parziali, mostrando una sola riga per ogni insieme che ha uno stesso valore nell'attributo passato come parametro. Ad esempio: SELECT Dipart, SUM(Stipendio) FROM Impiegato GROUP BY Dipart; Esegue in sequenza i seguenti passi: • per prima cosa viene eseguita la clausola where come se il group by non esistesse • Il risultato viene proiettato su tutti gli attributi che compaiono o come argomento della group by o all’interno dell’espressione argomento dell’operatore aggregato Dipart Amministrazione Direzione Richerca Sviluppo Direzione Stipendio 500 800 650 950 900 Massimiliano Teso Maxy Guida 92 __________________________________________________________________________________________ • La tabella viene poi raggruppata secondo le indicazioni del group by Dipart Amministrazione Direzione Direzione Richerca Sviluppo Stipendio 500 800 900 650 950 • Infine viene applicato l’operatore aggregato Dipart Amministrazione Direzione Richerca Sviluppo Stipendio 500 1700 650 950 Una volta eseguito un raggruppamento in sottoinsiemi con la clausola group by è possibile selezionare solo alcuni gruppi usando la clausola Having. La clausola having è il corrispondente per i gruppi della clausola where per gli attributi. Essa descrive le condizioni che si devono applicare al termine dell'esecuzione di una interrogazione che fa uso della clausola group by. Ad esempio: SELECT Dipart, SUM(Stipendio) AS SommaStipendi FROM Impiegato GROUP BY Dipart HAVING SommaStipendi>800 fornisce la seguente tabella: Dipart Direzione Sviluppo Stipendio 1700 950 Volendo riassumere la sintassi SQL dell'istruzione select con tutte le clausole analizzate avremmo che: SELECT ListaAttributiOEspressioni FROM ListaTabelle [ WHERE CondizioniSemplici ] [ GROUP BY ListaAttributiDiRaggruppamento ] [ HAVING CondizioniAggregate ] [ ORDER BY ListaAttributiDiOrdinamento ] Informatica di Base 93 __________________________________________________________________________________________ Interrogazioni nidificate: Nella clausola where l’SQL ammette anche l’uso di predicati con una struttura più complessa rispetto a quelli visti. In questo caso si confronta un valore (ottenuto come risultato di una espressione valutata sulla singola riga) con il risultato dell’esecuzione di un’interrogazione SQL. L’interrogazione che viene usata per il confronto viene definita direttamente nel predicato interno alla clausola where. Si parla in questo caso di interrogazioni nidificate. Se in un predicato si confrontano un attributo con il risultato di una interrogazione sorge il problema di disomogeneità dei termini del confronto. Infatti, da una parte abbiamo il risultato dell’esecuzione di un’interrogazione SQL, in genere un insieme di valori, mentre dall’altra abbiamo il valore dell’attributo per la particolare riga. La soluzione consiste nell’estendere, con le parole all e any, i normali operatori di confronto relazionale (=, <>, <, >, <= e >=). La parola chiave any specifica che la riga soddisfa la condizione se risulta vero il confronto tra il valore dell’attributo per la riga e almeno uno degli elementi restituiti dall’interrogazione. La parola chiave all invece specifica che la riga soddisfa la condizione solo se tutti gli elementi restituiti dall’interrogazione nidificata rendono vero il confronto. Ecco un esempio di interrogazione nidificata: SELECT * FROM Impiegato WHERE Dipart = ANY ( SELECT Nome FROM Dipartimento WHERE Citta=”Firenze” ); L’attuale versione di MySQL non supporta le query nidificate. Massimiliano Teso Maxy Guida 94 __________________________________________________________________________________________ Esercizi 1. Data la seguente base di dati CLIENTE Cliente_ID Nome Cognome Anno_Nascita Telefono LIBRO Libro_ID Nome_Autore Cognome_Autore Titolo Pagine Genere Anno Prezzo ORDINE Ordine_ID Cliente_ID Libro_ID Data Realizzare le sequenti query in SQL a) Trovare i Titoli dei libri pubblicati dopo il 1980 b) Trovare i Titoli dei libri ordinati da Mario Rossi c) Trovare i titoli di tutti i libri ordinati con i relativi acquirenti d) Raddoppia il prezzo a tutti i libri pubblicati prima del 1960 e) Calcolare il prezzo medio dei libri f) Contare i numero di clienti che hanno effettuato un ordine g) Trovare Nome e Cognome di tutti i clienti che hanno fatto un ordine e indicare per ognuno di essi il numero di libri acquistati. Ordina i dati in maniera decrescente relativamente al nome e al cognome.Trovare il peso medio degli articoli di colore rosso h) Trovare Titolo e numero di copie vendute di tutti i libri pubblicati dopo il 1980 2. Creare e popolare la base di dati precedente in MySQL. Realizzare in codice SQL le query proposte. 3. Progettare e realizzare una base di dati per la gestione dei noleggi di una videoteca. Creare le tabelle e definire le interrogazioni necessarie per la corretta gestione dell’attività. Informatica di Base 95 __________________________________________________________________________________________ CAP VIII VIRUS INFORMATICI Introduzione Al giorno d’oggi quasi tutti i possessori di PC hanno avuto la brutta esperienza di contrarre un virus informatico. Pochi sanno però cosa sia in realtà, come agisca e come sia possibile debellarlo. Un virus non è altro che un programma scritto con lo scopo di creare un danno sul computer che lo ospita o, nella migliore delle ipotesi, procurare dei disagi all’utente. A differenza dei programmi tradizionali, un virus fa di tutto per non rendere visibile la sua presenza fino a quando non entra in azione provocando danni al computer che ha infettato. La prima persona che parlò di virus informatico pubblicamente, fu il dr. F. Cohen nel 1983 che definì il virus come << un programma che può “infettare” altri programmi, trasformandoli in modo da aggiungervi una copia (in alcuni casi evoluta) di se stesso>>. Quindi la caratteristica principale di questi programmi sta nell’autoreplicazione, come avviene per i virus biologici. Cosa fanno e cosa non fanno I virus possono creare danni di diversa entità ai programmi residenti sul computer. In particolare possono: - infettare programmi, fogli di calcolo, documenti di testi e alcune parti del sistema operativo - infettare floppy disk e hard disk modificando i programmi di avvio del sistema operativo memorizzati in particolari aree del disco chiamate Dos Boot Sector (per i floppy) e Master Boot Record (per gli hard disk) Ci sono però cose che, malgrado si senti dire il contrario, i virus non possono assolutamente fare: - danneggiare elementi hardware del sistema - danneggiare fisicamente i dischi - infettare dischi protetti da scrittura - infettare le e-mail in quanto semplice testo. Il virus può però risiedere nell’eventuale file allegato all’e-mail. E importante infine ricordare che il codice di un virus per essere pericoloso deve essere eseguito, non è sufficiente che sia consultato o letto. Si può tranquillamente affermare che non esiste sistema operativo inattaccabile dai virus. Poiché l’autore di un virus vuole ottenere la massima visibilità del suo Massimiliano Teso Maxy Guida 96 __________________________________________________________________________________________ prodotto, gli ambienti maggiormente colpiti sono i sistemi più diffusi come l’MS-DOS prima e Microsoft Windows adesso. Tipi di Virus In base alla definizione di Cohen, solo i programmi in grado di replicarsi sono virus. Esistono molti altri tipi di programmi dannosi, che assieme ai virus in senso stretto, costituiscono il cosiddetto malware, neologismo dato dalla fusione dei termini MALicious e softWARE (software dannoso). Virus in senso stretto: I virus possono essere a loro volta divisi in diverse categorie: Program virus: Si tratta di virus che infettano applicazioni e sistemi operativi. Attaccano file con estensioni COM, EXE, SYS, DLL, OVL o SCR. Il virus si attiva caricandosi in memoria per poi attaccare altri programmi. Esso può inserire il proprio codice nel file infettato oppure può sostituire completamente il file. In ogni caso il file attaccato risulta modificato ed è anche su questo che si basa l’azione di ricerca ed eliminazione degli antivirus. System o Boot-Sector Virus: Il primo settore di un floppy disk, chiamato Dos Boot Sector, contiene il codice di avvio del sistema operativo mentre il primo settore di un hard disk, detto Master Boot Sector, contiene la tabella delle partizioni, indicazioni su come è suddiviso il disco e altre informazioni importanti. Entrambi i settori sono fondamentali per l’avvio del sistema operativo e proprio per questo vengono attaccati dai virus che generalmente infettano prima il Master Boot Sector dei dischi fissi e poi il Dos Boot Sector dei dischetti. In questo modo il virus si può trasferire da un computer all’altro. Macro Virus: Con l’avvento di Word Processor, capaci di supportare le così dette macro, si sono diffusi anche questo genere di virus. Le macro sono una serie di istruzioni da poter inserire in programmi come ad esempio Microsoft Word. La loro potenza è aumentata a tal punto da permettere ai virus di replicarsi e danneggiare il contenuto del documento. Polimorfici: Sono virus in grado di mutare il proprio codice mediante algoritmi particolari che li rendono diversi ad ogni generazione. In questo modo diventano più difficili da individuare. Questa caratteristica permette loro Informatica di Base 97 __________________________________________________________________________________________ di mimetizzarsi all’interno dei programmi infettati rendendo difficile all’antivirus il compito di rivelarne la presenza. Esaminiamo ora alcuni tipi di malware: Worm: Il Worm (dall’inglese verme) non è un vero e proprio virus ma un programma progettato per replicarsi e diffondersi attraverso sistemi di elaborazione connessi in rete. Il Worm non cerca di danneggiare il sistema che lo ospita. Esso si limita ad autoreplicarsi in memoria sprecando tutte le risorse del sistema che inevitabilmente diventa inutilizzabile. L’esempio più famoso è probabilmente l’Internet Worm che nel 1988 si diffuse su oltre 6.000 sistemi di reti collegati in tutto il mondo Troijan: Questi programmi devono il loro nome al famoso espediente escogitato da Ulisse per conquistare la città greca. Come il famoso cavallo di legno offerto in dono agli abitanti di Troia nascondeva al suo interno soldati armati così i programmi di questa categoria sembrano all’apparenza software normali, ma in realtà svolgono funzioni tutt’altro che utili. I Troijan infatti installano silenziosamente un virus vero e proprio mentre il programma apparentemente innocuo è in esecuzione. Questo genere di virus è individuabile solo quando si carica in memoria e inizia a spargersi, quando quindi è troppo tardi per un’azione preventiva. Backdoor: Una backdoor, permette al nostro computer di diventare un server della rete. Chi ha diffuso il programma è quindi in grado di prendere possesso della nostra macchina da qualsiasi parte del mondo. Affinché sia possibile questo però il nostro computer deve essere collegato in rete. Le backdoor più diffuse sono BO (Back Orifice, Il nome è tutto un programma) e NetBus. Esse sfruttano i malfunzionamenti costruttivi di Windows, permettendo l’accesso al PC tramite alcune porte che questo sistema operativo lascia aperte. Gli Antivirus L’enorme diffusione di questi programmi dannosi ci fa comprendere quanto sia necessario avere installato un buon antivirus sul proprio computer. Ne esistono di diverso tipo, sia gratuiti che commerciali. Generalmente le due tecniche utilizzate dagli antivirus sono le seguenti: - A confronto di pattern: l’antivirus ha una lista con le stringhe che identificano i vari virus e la usa per individuare l’infezione nei file Massimiliano Teso Maxy Guida 98 __________________________________________________________________________________________ sottoposti a scansione. Se in un file viene rilevata una stringa nota viene eliminata e il file ripristinato. - A ricerca euristica: l’antivirus ricerca all’intero del programma il codice che “potrebbe” essere utilizzato da un virus. Entrambi i metodi sono buoni ma hanno dei limiti. Il primo ha la necessità di essere aggiornato frequentemente per rinnovare la lista delle stringhe mentre il secondo potrebbe indicare infetti dei file che in realtà non lo sono. Per essere efficace un antivirus dovrebbe utilizzare entrambi i metodi di scansione e per maggiore sicurezza sarebbe utile avere a disposizione due antivirus diversi. E’ fondamentale poi aggiornare frequentemente l’antivirus visto che vengono scoperti circa 300 virus nuovi ogni mese. Un buon antivirus gratuito è l’AVG, scaricabile all’indirizzo www.grisoft.com. Informatica di Base 99 __________________________________________________________________________________________ APPENDICE A BASI DI HTML Il linguaggio utilizzato dalle pagine World Wide Web, l’HyperText Markup Language (HTML), non è un linguaggio di programmazione ma un Markup Language, una serie di istruzioni che definiscono le caratteristiche di un documento e ne guidano la composizione sullo schermo. In questo paragrafo vengono descritti sinteticamente tutti i principali comandi dei quali vengono proposte le opzioni più utili. I comandi principali vengono scritti con font Courier New grassetto mentre le relative opzioni in semplice Courier New. Gli elementi da inserire che non fanno parte del linguaggio (come “immagine”, “colore”, etc..) sono scritti in font Times New Roman. Nel testo sono riportati alcuni esempi di pagine web per chiarire meglio l’utilizzo dei comandi HTML. Alla fine di questo paragrafo trovate inoltre le tabelle con i codici dei colori e dei caratteri speciali. Struttura di base della pagina La struttura elementare di una pagina HTML è la seguente: <HTML> <HEAD> <TITLE> Titolo della Pagina </TITLE> </HEAD> <BODY> Corpo del documento </BODY> </HTML> <HTML> ... </HTML> <HEAD> ... </HEAD> Apre e chiude una pagina Html. <TITLE> Titolo della Pagina </TITLE> Assegna un titolo alla pagina che viene visualizzato nella barra superiore del browser. Apre e chiude la parte relativa all’intestazione della pagina. Quanto riportato nell’intestazione non viene visualizzato nella pagina ma serve per fornire informazioni sul documento.. Massimiliano Teso Maxy Guida 100 __________________________________________________________________________________________ <BODY> ... </BODY> Racchiude il corpo del documento HTML. BGCOLOR=“colore” Colore dello sfondo della pagina. BACKGROUND=“immagine” Nome o URL dell’immagine da disporre come sfondo della pagina. BGPROPIERTIES=“FIXED” Fissa lo sfondo della pagina. TEXT=”colore” Colore di default del testo della pagina. <META> Inserisce alcune informazioni sul documento utili ad esempio ai motori di ricerca per creare riferimenti corretti alla pagina in questione. NAME=“nome” Tipo di informazione. Due dei valori possibili sono DESCRIPTION e KEYWORDS. CONTENT=“contenuto” Contenuto dell’informazione. Se NAME è di tipo DESCRIPTION allora CONTENT sarà una stringa che descrive sommariamente il contenuto del documento, se invece è di tipo KEYWORDS sarà una serie di parole chiave separate da virgole. Suoni <BGSOUND SRC=“percorso/suono.est”> Riproduce il file audio specificato non appena viene visualizzata la pagina. LOOP=”volte” Numero di volte per cui riprodurre il file (-1 o INFINITE indica di riprodurre a ciclo continuo). Informatica di Base 101 __________________________________________________________________________________________ Titoli e Paragrafi <H1>...</H1> <H2>...</H2> <H3>...</H3> <H4>...</H4> <H5>...</H5> <H6>...</H6> Il testo diventa un titolo e quindi viene rappresentato in grassetto e viene lasciata una riga di spazio rispetto al resto del testo. Più alto è il numero minore è la dimensione del carattere. <P> ... </P> Definisce un paragrafo normale. Il tag </P> è opzionale. ALIGN=“[LEFT/CENTER/RIGHT]” Allinea il contenuto del paragrafo a sinistra, centro o destra. <DIV> Definisce un’area di testo da ... formattare.. </DIV> ALIGN=“[LEFT/CENTER/RIGHT]” Allinea il contenuto dell’area di testo a sinistra, centro o destra. Attributi del Testo e Altri Elementi <EM>...</EM> <I>...</I> Testo in corsivo. <STRONG>...</STRONG> <B>...</B> Testo in Grassetto. <KBD>...</KBD> <CODE>...</CODE> Font di testo inserito da tastiera (solitamente Courier). <BASEFONT SIZE=”grandezza”> Si inserisce all’inizio di ogni pagina e definisce la grandezza di default del testo. <FONT > ... </FONT> Definisce il carattere del testo con la grandezza e il colore indicati. Massimiliano Teso Maxy Guida 102 __________________________________________________________________________________________ SIZE=“grandezza” Dimesione del carattere. Più il valore è grande più il carattere è grande. La grandezza del carattere può anche essere relativa a quella definita in BASEFONT inserendo numeri con segno positivo o negativo. COLOR=“colore” Colore del carattere. <BR> Interruzione di riga. <HR> Linea orizzontale. <BLINK> ... </BLINK> <CENTER> ... </CENTER> <!-- Commento --> Fa lampeggiare il testo. Centra testo e immagini. Crea un commento che non viene visualizzato nella pagina. Con i comandi precedenti è già possibile creare una semplice pagina web. Editare il testo che segue con un qualsiasi editor di testo e salvarlo con il nome “esempio1.htm”. Per visionare il file è necessario aprirlo con un browser come Netscape o Internet Explorer. <HTML> <HEAD> <TITLE>La mia prima pagina</TITLE> <META NAME=”DESCRIPTION” CONTENT=”pagina web con alcuni elementi tipografici”> <META NAME=”KEYWORDS” CONTENT=”internet, pagina, web, corsivo, grassetto, titoli, font, colori”> </HEAD> <BODY BGCOLOR="gray" BACKGROUND="sfondo.gif" TEXT="blue"> <BGSOUND SRC=“base.mid” LOOP=”INFINITE”> <BASEFONT SIZE=4> <!-- Font di defalut pari a 4 --> <CENTER><H1>Corsivo e Grassetto</H1></CENTER> <P> Pagina di prova per testare le potenzialità del linguaggio HTML4. <P><I> Scritta in corsivo</I> <P><B> Scritta in grassetto<B> <P><I><B> Scritta in grassetto corsivo</B></I> Informatica di Base 103 __________________________________________________________________________________________ <BR> <BR> <HR> <CENTER><H1>Font e Colori</H1></CENTER> <P><FONT SIZE=-1 COLOR="red"> Scritta rossa con font più piccolo </FONT> <P><FONT SIZE=+1 COLOR="green"> Scritta verde con font più grande </FONT> <BR> <BR> <HR> </BODY> </HTML> Massimiliano Teso Maxy Guida 104 __________________________________________________________________________________________ Liste: <UL> <LI> ... </LI> Lista non ordinata in cui ogni elemento della lista, inserito tra i due tag <LI>...</LI>, è individuato da un pallino. <LI> ... </LI> Lista ordinata in cui ogni elemento della lista, inserito tra i due tag <LI>...</LI>, è individuato da un numero crescente. ... </UL> <OL> ... </OL> <DL> <DT> ... </DT> <DD> ... </DD> Elenco di definizioni in cui il termine della definizione è tra i due tag <DT>...</DT> mentre la definizione tra i due tag <DD>...</DD>. ... </DL> Ecco una pagina che utilizza i comandi appena definiti. <HTML> <HEAD> <TITLE> Pagina con liste </TITLE> </HEAD> <BODY > <CENTER><H1>Pagina con liste</H1></CENTER> <P>Lista non ordinata <UL> <LI>Primo elemento</LI> <LI>Secondo elemento</LI> <LI>Terzo elemento</LI> <LI>Quarto elemento</LI> </UL> <BR> <P>Lista ordinata Informatica di Base 105 __________________________________________________________________________________________ <OL> </OL> <LI>Primo elemento</LI> <LI>Secondo elemento</LI> <LI>Terzo elemento</LI> <LI>Quarto elemento</LI> <BR> <P>Elenco di definizioni <DL> <DT>Definizione <DD>Spiegazione <DT>Definizione <DD>Spiegazione <DT>Definizione <DD>Spiegazione </DL> 1</DT> della prima definizione</DD> 2</DT> della seconda definizione</DD> 3</DT> della terza definizione</DD> </BODY> </HTML> Massimiliano Teso Maxy Guida 106 __________________________________________________________________________________________ Link <A HREF=“indirizzo”> ... </A> Tutto ciò che viene compreso da questo comando diventa un link all’indirizzo specificato che può essere un indirizzo esterno (http://www.nomesito.com), un indirizzo di posta elettronica (mailto:[email protected]) o un indirizzo interno (vedi sotto) TARGET=”nome_frame” Nome del frame in cui deve apparire il documento collegato. <A HREF=“#Marc”>...</A> Tutto ciò che viene compreso dal primo comando diventa un link interno alla pagina stessa collegandosi con il punto della pagina dove compare il secondo comando (chiamato ancora). <A NAME=“Marc”>...</A> Immagini <IMG SRC=“percorso/nome.est”> Inserisce l’immagine specificata. ALT=“testo alternativo” Testo alternativo che verrà visualizzato se l’immagine per diversi motivi non viene caricata. ALIGN=“[LEFT/RIGHT/ Con LEFT o RIGHT l’immagine TOP/MIDDLE/BOTTOM]” viene allineata a destra o sinistra e il testo che segue scorre ai lati. TOP, MIDDLE e BOTTOM determinano l’allineamento verticale dell’immagine con altri elementi sulla stessa riga. VSPACE=“spazio verticale” Spazio tra l’immagine e il testo sopra e sotto di essa. HSPACE=“spazio orizzontale” Spazio tra l’immagine e il testo ai lati. Informatica di Base 107 __________________________________________________________________________________________ BORDER=“bordo” Disegna un bordo dello spessore specificato in pixel attorno all’immagine. Vediamo meglo cosa succede al testo e alle immagini quando si inserisce l’opzione ALIGN. ALIGN=LEFT: Allinea l'immagine sul bordo sinistro della finestra di visualizzazione del browser, il testo che segue circonda la parte destra dell'immagine. Allineamento di tipo left, il contorno immagine e stato riempito volutamente per meglio risaltare questo tipo di allineamento. Provate a variare le dimensioni della finestra del browser per meglio capirne l'allineamento. ALIGN=RIGHT: Allinea l'immagine sul bordo destro della finestra di visualizzazione del browser, il testo che segue circonda la parte sinistra dell'immagine. Allineamento di tipo right, il contorno immagine e stato riempito volutamente per meglio risaltare questo tipo di allineamento. Provate a variare le dimensioni della finestra del browser per meglio capire l'allineamento. Massimiliano Teso Maxy Guida 108 __________________________________________________________________________________________ ALIGN=TOP: Allinea il testo che segue l'immagine con la parte superiore dell'elemento più alto nella riga. Allineamento di tipo top, il contorno immagine e stato riempito volutamente per meglio risaltare questo tipo di allineamento. Provate a variare le dimensioni della finestra del browser per meglio capire l'allineamento. ALIGN=MIDDLE: Allinea la linea di base della riga corrente con la parte centrale dell'immagine. Allineamento di tipo middle, il contorno immagine e stato riempito volutamente per meglio risaltare questo tipo di allineamento. Provate a variare le dimensioni della finestra del browser per meglio capire l'allineamento. ALIGN=BOTTOM: Allinea il testo che segue l'immagine con la parte inferiore dell'elemento più basso nella riga di testo. Allineamento di tipo bottom, il contorno immagine e stato riempito volutamente per meglio risaltare questo tipo di allineamento. Provate a variare le dimensioni della finestra del browser per meglio capire l'allineamento. Informatica di Base 109 __________________________________________________________________________________________ Ecco un esempio di pagina che utilizza i link e le immagini: <HTML> <HEAD> <TITLE> Link e immagini </TITLE> </HEAD> <BODY > <CENTER><H1>Pagina con link e immagini</H1></CENTER> <BR> <P ALIGN="CENTER"><B>Link a elementi di questa pagina</B> <P> <A HREF="#ancora1">Collegamento a Immagine 1</A><BR> <A HREF="#ancora2">Collegamento a Immagine 2</A><BR> <A HREF="#ancora3">Collegamento a Immagine 3</A><BR> <A HREF="#ancora4">Collegamento a Immagine 4</A><BR> <A HREF="#ancora5">Collegamento a Immagine 5</A><BR> <A HREF="#ancora6">Collegamento a Immagine 6</A><BR> <BR> <BR> <HR> <P ALIGN="CENTER"> <B>Link a pagine esterne e a indirizzi e-mail</B> <P> <A HREF="http://www.yahoo.com">Link a Yahoo</A><BR> <A HREF="mailto:[email protected]"> Link a indirizzo e-mail</A> <BR> <BR> <HR> <P ALIGN="CENTER"><B>Immagini</B> <P><FONT COLOR="red"> <A NAME="ancora1">Immagine 1</A></FONT> <P> Immagine con link <P ALIGN="CENTER"> <A HREF="http://www.astavista.com"> <IMG SRC="tarta.jpg"></A> <BR> <P><HR> <P><FONT COLOR="red"> <A NAME="ancora2">Immagine 2</A></FONT> <P><IMG SRC="tarta.jpg" ALIGN="LEFT"> Allineamento di tipo left,il contorno immagine e stato riempito volutamente per megliorisaltare questo tipo di allineamento. Provate a variare le dimensioni della finestra del browser per meglio capirne l'allineamento. Massimiliano Teso Maxy Guida 110 __________________________________________________________________________________________ <BR> <P><HR> <P><FONT COLOR="red"> <A NAME="ancora3">Immagine 3</A></FONT> <P><IMG SRC="tarta.jpg" ALIGN="RIGHT"> Allineamento di tipo right,il contorno immagine e stato riempito volutamente per megliorisaltare questo tipo di allineamento. Provate a variare le dimensioni della finestra del browser per meglio capirne l'allineamento. <BR> <P><HR> <P><FONT COLOR="red"> <A NAME="ancora4">Immagine 4</A></FONT> <P><IMG SRC="tarta.jpg" ALIGN="TOP"> Allineamento di tipo top,il contorno immagine e stato riempito volutamente per megliorisaltare questo tipo di allineamento. Provate a variare le dimensioni della finestra del browser per meglio capirne l'allineamento. <BR> <P><HR> <P><FONT COLOR="red"> <A NAME="ancora5">Immagine 5</A></FONT> <P><IMG SRC="tarta.jpg" ALIGN="MIDDLE"> Allineamento di tipo middle,il contorno immagine e stato riempito volutamente per megliorisaltare questo tipo di allineamento. Provate a variare le dimensioni della finestra del browser per meglio capirne l'allineamento. <BR> <P><HR> <P><FONT COLOR="red"> <A NAME="ancora6">Immagine 6</A></FONT> <P><IMG SRC="tarta.jpg" ALIGN="BOTTOM"> Allineamento di tipo left,il contorno immagine e stato riempito volutamente per megliorisaltare questo tipo di allineamento. Provate a variare le dimensioni della finestra del browser per meglio capirne l'allineamento. <BR> <P><HR> </BODY> </HTML> Informatica di Base 111 __________________________________________________________________________________________ Tabelle <TABLE> ... </TABLE> Crea una tabella. BORDER=“bordo” Inserisce un bordo esterno del numero di pixel indicati. WIDTH=”grandezza” Indica la grandezza della tabella espressa in pixel (ad esempio 100) oppure come percentuale dell’intera pagina (ad esempio 80%). CELLSPACING=“bordo tra celle” Indica il numero di pixel che c’è tra due celle. CELLPADDING=“bordo nelle celle” Indica il numero di pixel che c’è tra la cella è il suo contenuto. ALIGN=“[LEFT/CENTER/RIGHT]” Allinea la tabella come indicato. BGCOLOR=“colore” Colore di sfondo dell’intera tabella. Per inserire righe e colonne nella tabella si utilizzano i seguenti comandi: <TR> ... </TR> Definisce una riga della tabella. ALIGN=“[LEFT/CENTER/RIGHT]” Allineamento orizzontale del contenuto della cella nella riga. VALIGN=“[TOP/MIDDLE/BOTTOM]” Allineamento verticale del contenuto delle celle nella riga. BGCOLOR=“colore” Colore di sfondo di tutte le celle nella riga. Massimiliano Teso Maxy Guida 112 __________________________________________________________________________________________ <TH> ... </TH> <TD> ... </TD> Definisce una cella di intestazione della quale possiamo definire l’allineamento (orizzontale e verticale) e il colore di sfondo utilizzando le stesse opzioni viste per <TR></TR>. Indica una cella della quale possiamo definire l’allineamento (orizzontale e verticale) e il colore di sfondo utilizzando le stesse opzioni viste per <TR></TR>. Se questi elementi non sono definiti si fa riferimento a quelli definiti per la riga. Ecco un esempio di pagina con una tabella: <HTML> <HEAD> <TITLE>Le Tabelle</TITLE> </HEAD> <BODY> <CENTER><H1>Pagina con Tabelle</H1></CENTER> <P><TABLE BORDER=2 WIDTH=100% CELLSPACING=3 CELLPADDING=3 BGCOLOR="yellow"> <CAPTION>commento della tabella</CAPTION> <TR> <TH> Lista </TH> <TH> Foto </TH> </TR> <TR ALIGN="CENTER" VALIGN="CENTER"> <TD WIDTH=20%> <P>Lista non ordinata <UL> <LI>Primo elemento</LI> <LI>Secondo elemento</LI> <LI>Terzo elemento</LI> <LI>Quarto elemento</LI> </UL> </TD> <TD BGCOLOR="white"> <H1>Titolo della Pagina</H1> <IMG SRC="foto.gif"> </TD> </TR> <TR ALIGN="LEFT" VALIGN="TOP"> <TD> Informatica di Base 113 __________________________________________________________________________________________ </BODY> </HTML> <P>Lista non ordinata <UL> <LI>Primo elemento</LI> <LI>Secondo elemento</LI> <LI>Terzo elemento</LI> <LI>Quarto elemento</LI> </UL> <TD BGCOLOR="white"> <H1>Titolo della Pagina</H1> <IMG SRC="foto.gif"> </TD> </TR> Massimiliano Teso Maxy Guida 114 __________________________________________________________________________________________ Moduli <FORM> ... </FORM> Indica un modulo di input. ACTION=“URL” URL dove il modulo verrà inviato. Se inviato per posta si scrive ad esempio: mailto:[email protected] METHOD=“metodo” Indica il modo con cui vengono inviati i dati. I valori possibili sono GET e POST. <INPUT> Elemento di input per un modulo. TYPE=“tipo” Tipo dell’elemento di input. I valori possibili sono: TEXT (area di testo), SUBMIT (pulsante di spedizione), RESET (pulsate di reset dei campi), RADIO (caselle a scelta esclusiva), CHECKBOX (caselle a scelta multipla), HIDDEN (elemento nascosto). NAME=“nome” Nome dell’elemento. VALUE=“valore” Per un elemento di testo o nascosto, il valore di default. Per una casella di controllo o un pulsante di opzione, il valore da inviare. Per pulsanti di reset o invio, l’etichetta del pulsante. CHECKED Per caselle di controllo e pulsanti di opzione, indica che il controllo è attivato. Informatica di Base 115 __________________________________________________________________________________________ <TEXTAREA> ... </TEXTAREA> Elemento per l’input di testo su più righe. NAME=”nome” Nome dell’elemento. ROWS=”righe” Numero di righe visualizzate dall’area di testo . COLS=”colonne” Numero di colonne(caratteri) visualizzate dall’area di testo. WRAP Permette di andare a capo automaticamente nell’area di testo. <SELECT> ... </SELECT> Crea un menù o elenco a discesa di elementi. NAME=”nome” Nome dell’elemento. SIZE=”dimensione” Numero di elementi da visualizzare. Se è specificato diventa un menù a scorrimento altrimenti diventa un menù a discesa. MULTIPLE Consente di selezionare più elementi dall’elenco. <OPTION> Indica un possibile elemento all’interno di una SELECT SELECTED L’elemento viene selezionato per default. VALUE=”valore” Valore da inviare se questa OPTION viene selezionata. Massimiliano Teso Maxy Guida 116 __________________________________________________________________________________________ Ecco un esempio di pagina con un modulo: <HTML> <HEAD> <TITLE>I Moduli</TITLE> </HEAD> <BODY> <CENTER><H1>Pagina con un Modulo</H1></CENTER> <P>Questo testo non fa parte del modulo <HR> <FORM METHOD=POST ACTION="mailto:[email protected]"> <P>Nome e Cognome <INPUT TYPE="TEXT" NAME="Nome" SIZE=30> <P>Quanti anni hai?<BR> <INPUT TYPE="RADIO" NAME="eta" 10-20<BR> <INPUT TYPE="RADIO" NAME="eta" 20-50<BR> <INPUT TYPE="RADIO" NAME="eta" 50-70<BR> <INPUT TYPE="RADIO" NAME="eta" >70<BR> VALUE="10-20"> VALUE="20-50" CHECKED> VALUE="50-70"> VALUE=">70"> <P>Quanto sei alto?<BR> <SELECT NAME="altezza"> <OPTION> Meno di 1 metro</OPTION> <OPTION> tra 1 metro e 1 metro e 20</OPTION> <OPTION SELECTED> tra 1 metro e 20 e 1 mentro e 50</OPTION> <OPTION> tra 1 metro e 50 e 1 mentro e 80</OPTION> <OPTION> Più di 1 metro e 80</OPTION> </SELECT> <P>Cosa acquisti normalmente?<BR> <SELECT NAME="acquisti" SIZE=4 MULTIPLE> <OPTION> Quotidiano</OPTION> <OPTION> Riviste di Computer</OPTION> <OPTION> Riviste Scientifiche</OPTION> <OPTION> CD Musicali</OPTION> <OPTION> Videocassette</OPTION> <OPTION> DVD</OPTION> </SELECT> <P>Quali sono i tuoi interessi?<BR> <INPUT TYPE="CHECKBOX" NAME="musica"> Musica<BR> <INPUT TYPE="CHECKBOX" NAME="cinema"> Cinema<BR> <INPUT TYPE="CHECKBOX" NAME="internet"> Internet<BR> <INPUT TYPE="CHECKBOX" NAME="sport"> Sport<BR> <P>Hai commenti o suggerimenti da proporre?<BR> <TEXTAREA NAME="consigli" ROWS=7 COLS=25 WRAP> </TEXTAREA> <HR> Informatica di Base 117 __________________________________________________________________________________________ <CENTER> <INPUT TYPE="RESET" VALUE="Resetta Tutto"> </CENTER><BR> <CENTER> <INPUT TYPE="SUBMIT" VALUE="Spedisci i dati"> </CENTER> </FORM> </BODY> </HTML> Massimiliano Teso Maxy Guida 118 __________________________________________________________________________________________ Applet <APPLET> ... </APPLET> Inserisce un applet Java a esecuzione automatica. CLASS=”nome.class” Nome dell’applet. SRC=”percorso” URL della directory dove si trova l’applet compilato. Non si deve includere il nome dell’applet specificato con l’attriuto CLASS. ALIGN=“[TOP/MIDDLE/BOTTOM]” Indica come allineare l’applet rispetto al testo che lo segue. WIDTH=“larghezza” Larghezza dell’area di output dell’applet, in pixel. HEIGHT=“altezza” Altezza dell’area di output dell’applet, in pixel. <PARAM> Parametri specifici del programma. NAME=“tipo” Tipo di informazioni fornite all’applet. VALUE=“valori” Informazioni da fornire all’applet. Ecco un esempio di pagina con un applet: <HTML> <HEAD> <TITLE> Pagina con Applet </TITLE> </HEAD> <BODY > <CENTER><H1>Pagina con Applet</H1></CENTER> <P ALIGN="CENTER"> <APPLET CODE="FadesInOut2b.class" WIDTH=510 HEIGHT=32> <PARAM NAME="TextToDisplay" VALUE=" Questo Applet; Visualizza una scritta che sfuma; passando il testo da visualizzare; come parametro;"> Informatica di Base 119 __________________________________________________________________________________________ <PARAM NAME="FontSize" VALUE="30"> <PARAM NAME="FontName" VALUE="TimesRoman"> <PARAM NAME="FontStyle" VALUE="BOLD"> <PARAM NAME="Steps" VALUE=10> <PARAM NAME="Delay" VALUE=120> <PARAM NAME="bgCOLOR" VALUE=255,255,255> <PARAM NAME="textCOLOR" VALUE="255,0,0"> <PARAM NAME="Author" VALUE="George Eleftheriou"> <PARAM NAME="Email" VALUE="[email protected]"> </APPLET> </BODY> </HTML> Massimiliano Teso Maxy Guida 120 __________________________________________________________________________________________ Frame <FRAMESET> ... </FRAMESET> Suddivide la finestra principale in una serie di frame che possono visualizzare ciascuno un documento separato ROWS=“righe” Suddivide verticalmente la finestra o i frame in un numero di righe specificato come numero (esempio 7), come percentuale della larghezza totale della finestra (esempio 25%) o come asterisco (*) per indicare che il frame deve occupare tutto lo spazio rimanente o che tale spazio va suddiviso tra i frame (se sono specificati più frame con l’asterisco). COLS=“colonne” Funziona in modo simile a ROWS eccetto per il fatto che la finestra o i frame sono suddivisi orizzontalmente in colonne. FRAMEBORDER=“[YES/NO]” Visualizza o meno i bordi dei frame. FRAMESPACING=“spessore” Spazio tra i frame in pixel. <FRAME> Definisce un singolo frame. SRC=“sorgente” URL del documento da visualizzare. NAME=“nome” Nome da utilizzare per assegnare un target al frame. Ad esso si farà riferimento nell’attributo TARGET presente in collegamenti <A HREF>. SCROLLING=“[YES/NO/AUTO]” Determina se un frame presenta o meno barre di scorrimento. Nel caso di AUTO verranno inserite solo se necessario. Informatica di Base 121 __________________________________________________________________________________________ NORESIZE Impedisce all’utente di ridimensionare il frame con il mouse. <BASE TARGET=”NomeFrame”> Da inserire in una pagina se tutti i documenti a cui fa riferimento devono essere necessariamente visualizzati nel frame indicato. Per creare un sito con frame è necessario realizzare una prima pagina che contenga la suddivisione in righe e colonne. In questa pagina al posto del tag <BODY> ci sarà il tag <FRAMESET>. Ecco un esempio di pagina con tre frame (due righe di cui la prima occupa il 20% dell’intera pagina e due colonne di cui la prima occupa il 15% dell’intera pagina): index.html <HTML> <HEAD> <TITLE> Pagina con Frame </TITLE> </HEAD> <FRAMESET ROWS="15%,*"> <FRAME SRC="testa.html" NAME="Testa" SCROLLING="NO"> <FRAMESET COLS="20%,*"> <FRAME SRC="menu.html" NAME="Menu" SCROLLING="AUTO"> <FRAME SRC="pagina1.html" NAME="Corpo" SCROLLING="AUTO"> </FRAMESET> </FRAMESET> </HTML> Ed ecco i codici delle singole pagine che vengono richiamate all’interno dei frame: testa.html <HTML> <HEAD> <TITLE> Testa </TITLE> </HEAD> <BODY > <P ALIGN="CENTER"> <APPLET CODE="FadesInOut2b.class" WIDTH=680 HEIGHT=32> <PARAM NAME="TextToDisplay" Massimiliano Teso Maxy Guida 122 __________________________________________________________________________________________ VALUE=" Pagina di presentazione con Frame; La pagina è divisa in tre frame; un'intestazione, un menù e il corpo della pagina;"> <PARAM NAME="FontSize" VALUE="30"> <PARAM NAME="FontName" VALUE="TimesRoman"> <PARAM NAME="FontStyle" VALUE="BOLD"> <PARAM NAME="Steps" VALUE=10> <PARAM NAME="Delay" VALUE=120> <PARAM NAME="bgCOLOR" VALUE=255,255,255> <PARAM NAME="textCOLOR" VALUE="255,0,0"> <PARAM NAME="Author" VALUE="George Eleftheriou"> <PARAM NAME="Email" VALUE="[email protected]"> </APPLET> </BODY> </HTML> menu.html <HTML> <HEAD> <TITLE> Menu </TITLE> </HEAD> <BODY > <BASE TARGET="Corpo"> <P ALIGN="CENTER"><IMG SRC="toto.gif"> <P><H3>Menù</H3> <P><A HREF="pagina1.html">Pagina 1</A><BR> <P><A HREF="pagina2.html">Pagina 2</A><BR> <P><A HREF="pagina3.html">Pagina 3</A><BR> </BODY> </HTML> pagina1.html <HTML> <HEAD> <TITLE> Menu </TITLE> </HEAD> <BODY > <BASE TARGET="Corpo"> <CENTER><H1>Pagina 1</H1></CENTER><BR> <P ALIGN="CENTER"><IMG SRC="programm.jpg"><BR> <HR> </BODY> </HTML> Informatica di Base 123 __________________________________________________________________________________________ pagina2.html <HTML> <HEAD> <TITLE> Menu </TITLE> </HEAD> <BODY > <BASE TARGET="Corpo"> <CENTER><H1>Pagina 2</H1></CENTER><BR> <P ALIGN="CENTER"><IMG SRC="sciacqua.jpg"><BR><BR> <HR> </BODY> </HTML> pagina3.html <HTML> <HEAD> <TITLE> Menu </TITLE> </HEAD> <BODY > <BASE TARGET="Corpo"> <CENTER><H1>Pagina 3</H1></CENTER><BR> <P ALIGN="CENTER"><IMG SRC="bunny.gif"><BR><BR> <P ALIGN="CENTER"><IMG SRC="astro.gif"><BR><BR> <P ALIGN="CENTER"><IMG SRC="drago.gif"><BR><BR> <P ALIGN="CENTER"><IMG SRC="tuoni.gif"><BR><BR> <HR> </BODY> </HTML> Massimiliano Teso Maxy Guida 124 __________________________________________________________________________________________ Caratteri Speciali Per inserire nelle pagine caratteri o simboli particolari è necessario fare ricorso al loro codice numerico o nominale (è preferibile utilizzare sempre il primo). Ecco dunque un elenco non esaustivo dei codici da inserire in un listato HTML per ottenere determinati caratteri. Carattere Codice Numerico Codice Nominale à à à À À À á á á Á Á Á è è è È È È é é é È É É ì ì ì Ì Ì Ì í í í Í Í Í ò ò ò Ò Ò Ò ó ó ó Ó Ó Ó ù ù ù Ù Ù Ù ú ú ú Ú Ú Ú ñ ñ Ũ Ñ Ñ Ñ < < < > > > « « nessuna » « nessuna ® ® ® & & & © © © " " " Informatica di Base 125 __________________________________________________________________________________________ Tabella dei Colori Per alcuni dei colori più diffusi è possibile utilizzare il loro nome inglese. Questi i sedici valori standard: green (verde), silver (argento), lime (cedro), gray (grigio), olive (verde oliva), white (bianco), yellow (giallo), maroon( castano), navy (blue), red (rosso), blue (azzurro), purple (porpora), teal (verde scuro), fucsia (fucsia) e acqua (acquamarina). Per gli altri colori è necessario utilizzare un codice esadecimale. Ecco un elenco non esaustivo: Colore Codice NERO #000000 BIANCO #FFFFFF ROSSO #FF0000 CICLAMINO #FF3296 ARANCIONE #F19600 GIALLO #FAFA50 GIALLO CANARINO #EBFF64 OCRA #FAC878 VERDE #00FF00 VERDE SCURO #00641E VERDE CHIARO #00FF96 VIOLA #6432C8 LILLA #BE6EFA AZZURRO #0096C8 AZZURRO SCURO #3C5AC8 BLU CHIARO #3232C8 BLU #0000FF Massimiliano Teso Maxy Guida 126 __________________________________________________________________________________________ APPENDICE B INSTALLARE MYSQL MySQL è nato per sistemi Unix ed è uno dei più diffusi database utilizzati su Internet. Veloce, affidabile, disponibile pressoché per tutti i sistemi operativi e privo di bugs, è la soluzione ideale per siti Web di qualsiasi dimensione e traffico. Gratuito nelle versioni per Linux e recentemente anche per Windows. Prima di tutto è necessario prelevare i file necessari all’indirizzo internet http://www.mysql.com/. Una volta entrati nella pagina si vada nella sezione downloads per scaricare l’ultima versione stabile del programma. Sempre da questo sito consiglio di scaricare il manuale completo (in inglese) dove si possono trovare maggiori dettagli sulle varie funzionalità supportate. Nella pagina dedicata alle utilities troviamo anche moltissimi strumenti che facilitano il nostro lavoro di gestione e manutenzione del database. Ora possiamo installare MySQL sul nostro computer Windows. Installazione è quanto di più semplice si possa desiderare: è sufficiente decomprimere il file zip e lanciare il file setup.exe. Il programma verrà installato nella directory c:\mysql. A questo punto dobbiamo portarci nella directroy c:\mysql\bin\ e avviare prima di tutto il server con il comando: mysqld Possiamo controllare in ogni momento se il server è attivato con il comando mysqladmin ping E’ poi necessario lanciare il client SQL richiamabile con il comando: mysql A questo punto MySQL è stato avviato. Nella shell possiamo inviare direttamente i comandi per creare, modificare, cancellare e visualizzare i database. In MySQL tutti i comandi devono terminare con un punto e virgola. Si tratta di una misura resa necessaria dalla possibilità di distribuire una medesima istruzione su più righe. Informatica di Base 127 __________________________________________________________________________________________ E’ necessario ora creare un database con il comando: mysql>CREATE DATABASE nomeDatabase; ad esempio creiamo il database di nome agenda mysql>CREATE DATABASE agenda; Per usare il database appena creato si scrive mysql>USE agenda; A questo punto è possibile utilizzare il lingaggio SQL per creare la struttura della propria base di dati e per popolarla. Per semplificare il lavoro è possibile creare con un editor di testo un file con tutti i comandi per la creazione della base di dati che può essere poi importato in mysql con il comando mysql>source NomeFile.txt; Per chiudere il client si deve digitare il comando mysql> QUIT; mentre per disattivare il server è necessario digitare il comando mysqladmin –u root shutdown; Massimiliano Teso Maxy Guida 128 __________________________________________________________________________________________ APPENDICE A MANUALE DEL DOS Indice Introduzione al DOS Il comando help Il comando dir Il comando cls Il comando cd Il comando del Il comando ren Il comando md Il comando rd Il comando copy Il comando xcopy Il comando move Il comando mem I Comandi date e time Il comando attrib I comandi label e vol Il comando chkdsk Il comando diskcopy Il comando sys Il comando edit Il comando type Il comando find Pag 129 Pag 129 Pag 130 Pag 131 Pag 131 Pag 132 Pag 132 Pag 133 Pag 133 Pag 133 Pag 134 Pag 134 Pag 135 Pag 136 Pag 137 Pag 138 Pag 139 Pag 139 Pag 140 Pag 140 Pag 141 Pag 141 Informatica di Base 129 __________________________________________________________________________________________ Introduzione al DOS Il DOS è uno dei primi sistemi operativi scritti per i computer ed è l’abbreviazione di Disk Operative System (MSDOS sta per Microsoft DOS, dal nome dell’azienda che lo ha implementato). In queste dispense vengono presentati dei comandi che potrebbero non essere supportati dalle ultime versioni di DOS presenti nei sistemi operativi Microsoft Windows. Una volta acceso il computer il DOS ci appare con una linea di testo di questo tipo: C:\> (detta root principale) La lettera C: indica l’hard disk mentre il simbolo > è il così detto prompt e indica che il computer si aspetta dei dati in ingresso immessi attraverso la tastiera. All’interno dell’Hard Disk i fle sono organizzati in Directory che potrebbero essere paragonate alle cartelle presenti nel sistema operativo Windows. Per accedere a questi file DOS non supporta un’interfaccia grafica come Windows e quindi tutte le operazioni si svolgono in maniera testuale immettendo comandi attraverso la tastiera. Il DOS non è Case Sensitive cioè non distingue le maiuscole dalle minuscole come invece fanno altri sistemi operativi (ad esempio Linux). Per accedere a un nuovo disco basta digitare la lettera relativa al disco seguita dai due punti. Ad esempio, per accedere al Floppy Disk basta digitare C:\> a: e premere invio. Il computer si posizionerà sul prompt di A A:\> Il comando help Mostra sul monitor una spiegazione di ciascun comando DOS, la sua sintassi e il significato delle opzioni utilizzabili. sintassi: help comando il comando è uno qualsiasi dei comandi DOS. Esempio: C:\> help dir Massimiliano Teso Maxy Guida 130 __________________________________________________________________________________________ mostra il significato del comando “DIR”, la sua sintassi e le opzioni a disposizione. Parlando della sintassi dei comandi DOS, abbiamo visto che sono presenti delle opzioni, cioè dei parametri che modificano l’effetto del comando al seguito del quale sono stati digitati. Il DOS 5 ha introdotto una opzione valida per tutti i comandi. Digitando C> dir /? otteniamo lo stesso effetto del comando “help”: appare sul monitor una spiegazione del comando, la sua sintassi, e il significato delle opzioni utilizzabili. Questo parametro è a disposizione di qualunque comando DOS e deve essere usato da solo, senza alcuna indicazione di drive, path, nomefile o altre opzioni. Quando, nel corso di queste dispense, indichiamo i parametri a disposizione di ciascun comando, non indicheremo mai l’opzione “/?”, ma è utile tenere presente che in caso di dubbio sulla esatta sintassi di un comando è sempre possibile utilizzarla. Il comando dir Uno dei comandi più utilizzati è dir il quale elenca tutti i file di una determinata directory. Il DOS permette di inserire, dopo un comando, una serie di parametri che permettono di rendere più specifico il comando stesso. Vediamo un elenco di parametri relativi al comando dir: Comando C:\>dir /p C:\>dir /s C:\>dir C:\>dir C:\>dir C:\>dir C:\>dir C:\>dir C:\>dir /ah /ad /as /w /on /os /? Azione Lista i file e le sotto cartelle e aspetta che si prema un tasto per accedere alle altre schermate Lista tutti i file nella cartella corrente e in tutte le sotto cartelle Lista solo i file nascosti Lista solo le sottocartelle Lista solo i file di sistema Mette i file in quattro colonne Lista i file ordinati per nome Lista i file ordinati per grandezza elenca tutte le opzioni... Informatica di Base 131 __________________________________________________________________________________________ Si può usare il carattere asterisco "*" come una specie di accumulatore di nomi. Se, ad esempio, si vogliono elencare tutti i files con estenzione "txt" basta digitare dir *.txt Se si vogliono elencare tutti i file che iniziano per marco (ad esempio marcopeppe.txt, marco2.doc, marcone.exe), basta digitare dir marco.* Il comando cls Digitando C:\> cls che sta per Clear Screen si cancella lo schermo da tutte le scritte presenti. Il comando cd Per potersi spostare nelle varie directory si usa il comando cd che sta per Change Directory. Se quindi si è nella directory C:\WINDOWS> e si vuole andare in C:\WINDOWS\SYSTEM> basta digitare il comando cd system Per tornare indietro si deve digitare il comando cd.. mentre se si vuole tornare direttamente alla root principale si deve digitare il comando cd\ Massimiliano Teso Maxy Guida 132 __________________________________________________________________________________________ Se si vuole raggiungere una determinata directory da un qualunque punto dell’hard disk è necessario indicare tutto il percorso. Se, ad esempio, ci si trova nella cartella C:\GIOCHI\ e e sio vuole accedere alla cartella C:\WINDOWS\SYSTEM\ si possono fare i seguenti passi: C:\GIOCHI\> cd\ C:\>cd windows C:\WINDOWS\>cd system Ma è preferibile accedere direttamete scrivendo il percorso assoluto: C:\GIOCHI\> cd\windows\system oppure C:\GIOCHI\>cd c:\windows\system Il comando del Per cancellare un file si usa il comando del (abbreviazione di delete da to delete che in inglese significa appunto cancellare ). Anche in questo caso è possibile utilizzare l’asterisco come accumulatore. Se volgiamo cancellare da una directory tutti i file con estensione txt basta scrivere il comando del *.txt Se invece volgiamo eliminare tutti i file della directory è necessario inserire il comando del *.* Il comando ren Per cambiare nome ad un file ad un file si usa il comando C:\> ren nome1.estensione1 nome2.estensione2 Il file nome1.estensione1 non esiste più e al suo posto è apparso il file nome2.estensione2 che ha lo steso contenuto. Anche in questo comando si può usare il carattere asterisco. Informatica di Base 133 __________________________________________________________________________________________ Comando ren: Rinomina i file. sintassi: ren [drive:] [path] nomefile1 nomefile2 il drive è quello in cui si trova il disco con il file da rinominare la path è quella in cui si trova il file da rinominare il nomefile1 è il nome del file da rinominare. E’ possibile usare i caratteri “?” e “*”. Si usa “?” per sostituire un carattere, e “*” per un gruppo imprecisato di caratteri il nomefile2 è il nuovo nome del file. E’ possibile usare i caratteri “?” e “*”. Si usa “?” per sostituire un carattere, e “*” per un gruppo imprecisato di caratteri. Il comando md Per creare una nuova directory si utilizza il comando md che sta per Make Directory seguito dal nome della directory che si vuole creare. Se, ad esempio, siamo nella root principale e volgiamo creare una directory di nome temp, basta digitare il comando md temp Il comando rd Per rimuovere una directory si usa il comando rd che sta per Remove Directory. La directory deve essere completamente vuota altrimenti il DOS visualizza un messaggio di errore. Per rimuovere la directory temp basta digitare il comando rd temp Il comando copy Per copiare un file da una parte all’altra dell’Hard Disk o dall’Hard Disk a un dischetto si utilizza il comando copy con la seguente sintassi: copy [drive1:][path1]nomefile1 [drive2:][path2]nomefile2 [Opzioni] drive1 è quello in cui si trova il disco con il file originale, path1 è quella della subdirectory in cui si trova il disco con il file originale, Massimiliano Teso Maxy Guida 134 __________________________________________________________________________________________ nomefile1 è il nome del file che si vuole copiare. E’ possibile usare i caratteri “?” e “*”. Si usa “?” per sostituire un carattere, e “*” per un gruppo imprecisato di caratteri drive2 è quello in cui si trova il disco in cui si vuole copiare il file path2 è quella della subdirectory in cui si vuole copiare il file nomefile2 è l’eventuale nome finale del file copiato. Se si omette, il DOS gli attribuisce lo stesso nome di quello originale. L’opzione principale è: /v per verificare la corretta duplicazione del file Il comando xcopy Questo comando permette di copiare oltre ai file anche le sottodirectory di una determinata directory. La sintassi è la seguente: xcopy [drive1:] path1 [drive2:] [path2] [opzioni] drive1 è quello in cui si trova il disco la subdirectory originale path1 è quella della directory originale drive2 è quello in cui si trova il disco dove si vuole registrare la directory path2 è quella della directory in cui si vuole registrare. le opzioni principali sono: /s espande l’esecuzione della copia a tutte le subdirectory contenute in quella originale, tranne quelle vuote /e aggiunge, all’opzione precedente, anche le subdirectory vuote /d date effettua la copia solo dei file modificati dalla data indicata in poi /v per verificare la corretta duplicazione Il comando move Per spostare un file da una directory all’altra si usa il comando move. Ad esempio il comando C:\TEMP\>move a:*.exe Sposta tutti i files exe dal floppy alla cartella corrente TEMP. Informatica di Base 135 __________________________________________________________________________________________ Il comando mem Questo comando serve per visualizzare la quantità di memoria disponibile e utilizzata dal computer. Digitando C:\> mem Avrete come risposta un elenco dettagliato dello stato della memoria nel vostro PC. Si ottiene normalmente una risposta di questo tipo: 656384 bytes total conventional memory 655360 bytes available to MS-DOS 608640 largest executable program size 3145728 bytes total contiguos extended memory MS-DOS resident in High Memory Area nella quale possono variare con molta probabilità sia le cifre che le frasi che le accompagnano, in quanto entrambi corrispondenti alle diverse configurazioni di memoria e di sistema. Lo schema che il computer ci ha appena mostrato, ci da le seguenti indicazioni: - la memoria convenzionale è di 656384 bytes (pari a 640Kb); - di questa, il DOS può lavorare con 655360 bytes; - di questi, 608640 bytes sono ancora liberi a disposizione dei programmi e dei dati da caricare in memoria, mentre il resto è occupato dal DOS stesso; - inoltre sono presenti 3145728 bytes (pari a 3Mb) utilizzati come memoria estesa per quei programmi che la possono utilizzare; - il DOS si è installato nella parte alta di memoria, cioè nei primi 64Kb della memoria estesa, per lasciare libera la maggiore quantità possibile di memoria convenzionale per i programmi ed i dati. Tirando le somme, la RAM presente nel computer è dei classici 640Kb più una espansione di 3Mb per la memoria estesa. Ma se esiste la memoria estesa, vuol dire che esistono anche 384Kb di memoria (chiamata upper memory area) utilizzata, ad esempio per la gestione del monitor, e non disponibile per il DOS ed i programmi. Il totale della memoria installata è quindi di 4Mb: Massimiliano Teso Maxy Guida 136 __________________________________________________________________________________________ - 1Mb costituita da 640Kb di memoria convenzionale e da 384Kb di upper memory area (non utilizzabile) - 3Mb memoria estesa. le opzioni del comando mem sono: /program mostra anche i programmi caricati in memoria /debug mostra informazioni utili ai programmatori sullo stato della memoria /classify mostra i programmi caricati nella memoria convenzionale e nella upper memory area con informazioni utili ai programmatori Si può usare solo una opzione per ciascuna volta che si introduce il comando. I comandi time e date Per visualizzare l’ora digitate C:\> time il computer vi chiederà inoltre se volete cambiarla. Per cambiarla immettete l’ora esatta nella forma 15:21:00 Altrimenti premete invio Per visualizzare la data digitate C:\> date Anche in questo caso vi viene chiesto se volete cambiarla. Se volete farlo immettete la giusta data nella forma: 21/11/92 Comando date: Mostra la data corrente o resetta il calendario del computer. sintassi: date [giorno/mese/anno] L’espressione giorno/mese/anno deve essere immessa nella forma XX/XX/XXXX di due cifre per il giorno, due per il mese e quattro per l’anno. Se il comando DATE viene usato senza alcuna indicazione, il DOS mostra la data registrata nel calendario del computer. Informatica di Base 137 __________________________________________________________________________________________ Comando time: Mostra l’ora attuale o resetta l’orologio del computer. sintassi: time [ore:minuti:secondi] L’espressione ore:minuti:secondi deve essere immessa nella forma XX:XX:XX di due cifre per l’ora, due per i minuti e due per i secondi. Se il comando TIME viene usato senza alcuna indicazione, il DOS mostra l’ora registrata nell’orologio del computer. Il comando attrib I file possono avere vari attributi che ne specificano alcune caratteristiche, come ad esempio se un file è nascosto oppure se è un file di sistema e via dicendo. Attrib A H R S Significato Archivio, ossia normalmente un file ha questo attributo nascosto, i file con questo attributo non vengono listati con un comando dir standard Lettura, i file con questo attributo possono essere solo letti Sistema, ossia i file di sistema come MSDOS.SYS e IO.SYS Le lettere che contrassegnano gli attributi sono le iniziali delle rispettive voci in lingua inglese, ossia, Archive, Hidden, Read Only, System. Per modificare gli attributi di un file esiste il comando attrib, che ha la seguente sintassi: attrib nomedelfile.estenzione + Attributo (per attivarlo) oppure – Attributo (per disattivarlo) Dove attributo è specificato dalla lettera corrispondente nella tabella sopra. Ad esempio per rendere un file di sola lettura è sufficiente scrivere: (supponiamo che vogliamo rendere di sola lettura il file leggimi.txt che si trova in C:\DOC) C:\DOC\> attrib leggimi.txt +R Gli attributi possono essere messi in cascata quindi ad esempio: C:\DOC\> attrib leggimi.txt +R +H –A è un comando legittimo. Massimiliano Teso Maxy Guida 138 __________________________________________________________________________________________ I comandi label e vol Se non avete attribuito un’etichetta ad un dischetto, o se volete modificare quella esistente, è possibile dare un nome a un disco anche dopo la preparazione. Il comando è C:\> label A:nuovo_nome che attribuisce al disco presente nel drive A il nome di nuovo_nome. L’etichetta deve essere al massimo di 11 lettere. Il comando label senza alcuna opzione C:\> label a: ci mostra sul video il nome attuale del disco presente nel drive A, il suo numero di serie, e ci propone di inserire una nuova etichetta. Premendo solo il tasto “Invio” il DOS chiede se si vuole cancellare il nome attuale del disco o se si vuole lasciarlo inalterato. Il numero di serie non può essere modificato. Se si vuole solo conoscere l’etichetta attuale di un disco, senza volerla modificare, basta il comando C:\> vol a: che mostra nome e numero di serie del disco nel drive A senza altra possibilità. Comando label: Modifica, cambia o cancella l’etichetta di un disco sintassi: label [drive:] [nomedisco] il drive: è quello nel quale si trova il disco il nomedisco è l’etichetta da attribuire al disco; può essere lungo fino a 11 caratteri. Se nel comando non viene specificato un nomedisco il DOS mostra l’etichetta attuale e chiede se si vuole modificarla, confermarla o cancellarla. Comando vol: Visualizza nome e numero di serie di un disco sintassi: vol [drive:] il drive: è quello nel quale si trova il disco di cui si vuole conoscere l’identificazione Informatica di Base 139 __________________________________________________________________________________________ il comando chkdsk Se un dischetto provoca errori di scrittura o lettura, è bene dare il comando C:\> chkdsk a: che effettua un controllo approfondito dello stato del dischetto e cerca eventuali errori. Vengono inoltre testati tutti i settori del disco ed eventuali blocchi difettosi vengono segnati come inutilizzabili. Alla fine viene mostrata sullo schermo una sintesi dello stato del disco: capacità, numero dei file invisibili, numero delle subdirectory, dei file ordinari, dei settori difettosi, e lo spazio ancora libero. Comando chkdsk: Controlla un disco e ne visualizza lo stato. sintassi: chkdks [drive:] [path] [opzioni] il drive: è quello nel quale si trova il disco da controllare la path è l’eventuale subdirectory che si vuole controllare le opzioni sono: /f ripara automaticamente gli errori incontrati nella verifica /v visualizza il nome dei documenti mentre vengono controllati Se non viene utilizzata l’opzione /f il DOS chiede conferma della riparazione ad ogni errore incontrato. Il comando diskcopy Di tanto in tanto sarà necessario fare la copia di un dischetto per darlo a un collega o un amico. Il comando C:\> diskcopy a: a: serve a copiare un dischetto da 3,5 pollici utilizzando lo stesso drive. Il DOS avvertirà prima di inserire il dischetto originale, e quindi di estrarlo per inserire quello di destinazione. Questo scambio sarà ripetuto più volte. Se il dischetto di destinazione non è formattato, il DOS provvederà a farlo con lo stesso numero di tracce, settori e capacità del dischetto originale. Prima dell’operazione di copiatura al dischetto di destinazione verrà attribuito un numero di serie diverso da quello dell’originale, di modo che il DOS possa distinguere i due dischetti durante i vari scambi nel drive. Massimiliano Teso Maxy Guida 140 __________________________________________________________________________________________ Comando diskcopy: Effettua la copia di un disco sintassi: diskcopy [drive1:] [drive2:] [opzione] il drive1: è il drive nel quale si trova il dischetto originale il drive2: è il drive nel quale si trova il dischetto destinazione l’opzione principale è: /v verifica la corretta copiatura del disco Se drive1: e drive2: sono uguali il DOS provvede a richiedere l’inserimento alternato del disco originale e di quello di destinazione. I dischi indicati nel drive1: e nel drive2: devono avere lo stesso formato e la stessa formattazione. Il comando sys Se si vuole creare un disco di sistema è sufficiente digitare C:\> sys a: che registra i file di sistema nel dischetto del drive A, rendendo possibile caricare da questo disco, all’accensione del computer, il sistema operativo. Comando sys: Rende di sistema un disco di dati sintassi: sys drive: il drive: è quello nel quale si trova il disco da rendere di sistema Il comando edit Per creare un file nel quale scrivere del testo o dei comandi è necessario digitare il comando C:\> edit nomefile.estensione Se il file già esiste verrà aperto e visualizzato dall’editor altrimenti l’editor sarà vuoto e potrete creare un nuovo file salvando prima di uscire dal programma. Informatica di Base 141 __________________________________________________________________________________________ Il comando type Se vogliamo vedere il contenuto di un file è possibile digitare C:\> type command.com Il DOS legge il file indicato e ne visualizza il contenuto sullo schermo. Naturalmente si avrà un risultato comprensibile solamente se il file è formato da testo, negli altri casi verranno visualizzati un insieme di simboli incomprensibili. Un risultato incomprensibile, ad esempio, si ottiene con C:\> type c:\dos\fdisk.exe Comando type: Visualizza su schermo il contenuto di un file. sintassi: type [drive:] [path] nomefile il drive: è quello in cui si trova il disco con il file da visualizzare la path è quella in cui si trova il file da visualizzare il nomefile è il nome del file da visualizzare. Il comando find E’ possibile cercare un testo all’interno di un file, con il comando FIND. C:\> find “Caro amico” C:\lettere\giovanni.doc cerca le parole “Caro amico” nel file giovanni.doc contenuto nella subdirectory C:\lettere e mostra il risultato negativo o positivo della ricerca. Comando find: Esamina il contenuto di un file alla ricerca di un testo. sintassi: find [opzioni] “testo” [drive:] [path] nomefile il “testo” è il testo da cercare, va compreso fra virgolette il drive: è quello in cui si trova il disco con il file da esaminare la path è quella in cui si trova il file da esaminare il nomefile è il nome del file da esaminare le opzioni principali sono: /v mostra le righe del file che non contengono il testo cercato /c mostra il numero di righe che contengono il testo da cercare /n mostra numerate le righe del file /i cerca il testo senza differenza fra maiuscolo e minuscolo Massimiliano Teso Maxy Guida 142 __________________________________________________________________________________________