Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


informatica università, Sintesi del corso di Elementi di Informatica

informatica riassunto libro universitario

Tipologia: Sintesi del corso

2019/2020

Caricato il 22/04/2020

nathalye_pascone
nathalye_pascone 🇮🇹

4.5

(2)

11 documenti

1 / 47

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Che cos’è l’informatica ?
Cap 1
Innanzitutto diremo che l’informatica non è soltanto la scienza e la tecnologia dei calcolatori elettronici :
questi ultimi sono solo uno strumento che permette all’informatico di operare concretamente. Possiamo
considerare l’informatica come la scienza della rappresentazione e dell’elaborazione delle informazione.
Questa impostazione consente di mettere in evidenza che il prodotto principale della tecnologia
informatica è l’informazione , e che l’informatica come disciplina comprende non solo la tecnologia dei
calcolatori , ma anche il modo in cui i cui l’informazione viene strutturata ed elaborata .Da un lato ,
l’accento “sull’informazione “ fornisce un’informazione del perché l’informatica stia diventando parte
integrante di tutte le attività umane . Dall’altro lato il termine scienza sottolinea il fatto che , l’informatica ,
l’elaborazione dell’informazione avviene in maniera sistematica e rigorosa e per tanto può essere
automatizzata .
L’informatica è lo studio sistematico degli algoritmi che descrivano e trasformano l’informazione ; la loro
teoria ,analisi, progetto, efficienza, realizzazione e applicazione . Questa definizione utilizza il termine
Algoritmo , che possiamo informalmente definire come una sequenza precisa di operazioni comprensibili e
perciò seguibili da uno strumento automatico .Inoltre essa mette alla luce gli aspetti progettuali e
realizzativi che caratterizzano l’attività di un’ informatico .
Il concetto di algoritmo
Gli algoritmi vengono descritti tramite programmi , cioè sequenze di istruzioni scritte in un opportuno
linguaggio , comprensibile al calcolatore .Compito dell’esperto informatico è produrre algoritmi ( cioè
capire la sequenza di passi che portano alla soluzione di un problema ) e codificabili in programmi cioè
rendendoli comprensibili al calcolatore . Il calcolatore esegue i programmi passo passo , in modo preciso
veloce e potente , senza però deviare dalla loro esecuzione anche quando quest’ultima è palesemente
sbagliata ; Un algoritmo è corretto se esso perviene alla soluzione del compito cui è preposto senza
difettare di alcun passo fondamentale . Un’altra caratteristica auspicabile degli algoritmi è di essere
efficienti , cioè di pervenire alla soluzione del problema nel modo più veloce possibile e/o usando la minima
quantità di risorse fisiche compatibilmente con la sua correttezza . I linguaggi per la descrizione degli
algoritmi : i cosiddetti linguaggi di programmazione . Un’attività importante degli informatici è la
definizione di linguaggi per la codifica degli algoritmi , cioè linguaggi che consentono di scrivere gli algoritmi
sotto forma di programmi che possono essere compresi dal calcolatore , che ne è l’esecutore .Anche se
questa attività ha poco più di mezzo secolo di vita, gli informatici sono riusciti in questo breve arco di
tempo a imitare il comportamento del genere umano , che ha creato nei secoli un grandissimo numero di
diversi linguaggi , almeno uno per ogni gruppo etnico . La presenza di cosi tanti linguaggi di
programmazione , da un lato, offre il vantaggio di poter scegliere il linguaggio più adatto a codificare
specifici algoritmi , dall’altro provoca non pochi problemi , legati all’esigenza di imparare linguaggi diversi e
di comunicare informazioni fra programmi scritti in linguaggi diversi . L’uomo per comunicare i suoi
algoritmi al calcolatore, doveva imparare il linguaggio della macchina , cioè l’insieme dei comandi che la
macchina era in grado di eseguire . Nella seconda metà degli anni 50 il linguaggio con cui l’uomo
comunicava alla macchina gli algoritmi cominciò ad alzarsi di livello diventando in primo luogo più adatto a
codificare gli algoritmi e in secondo luogo molto più comprensibile ; la fatica di tradurre il programma fu
affidata alla macchina stessa .Poichè allora l’uso principale dei calcolatori consisteva nel risolvere il
problema di calcolo numerico . Il primo linguaggio di alto livello fu il Fortan che stava per “ Formula “ adatto
per descrivere l’elaborazione di formule matematiche . Di poco posteriore al Forten è il COBOL , il primo
linguaggio orientato alle applicazioni gestionali particolarmente adatto alla memorizzazione ed
elaborazione dei dati .COBOL E FORTEN sono rimasti per lungo tempo i linguaggi di memorizzazione più
1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f

Anteprima parziale del testo

Scarica informatica università e più Sintesi del corso in PDF di Elementi di Informatica solo su Docsity!

Che cos’è l’informatica? Cap 1 Innanzitutto diremo che l’informatica non è soltanto la scienza e la tecnologia dei calcolatori elettronici : questi ultimi sono solo uno strumento che permette all’informatico di operare concretamente. Possiamo considerare l’informatica come la scienza della rappresentazione e dell’elaborazione delle informazione. Questa impostazione consente di mettere in evidenza che il prodotto principale della tecnologia informatica è l’informazione , e che l’informatica come disciplina comprende non solo la tecnologia dei calcolatori , ma anche il modo in cui i cui l’informazione viene strutturata ed elaborata .Da un lato , l’accento “sull’informazione “ fornisce un’informazione del perché l’informatica stia diventando parte integrante di tutte le attività umane. Dall’altro lato il termine scienza sottolinea il fatto che , l’informatica , l’elaborazione dell’informazione avviene in maniera sistematica e rigorosa e per tanto può essere automatizzata. L’informatica è lo studio sistematico degli algoritmi che descrivano e trasformano l’informazione ; la loro teoria ,analisi, progetto, efficienza, realizzazione e applicazione. Questa definizione utilizza il termine Algoritmo , che possiamo informalmente definire come una sequenza precisa di operazioni comprensibili e perciò seguibili da uno strumento automatico .Inoltre essa mette alla luce gli aspetti progettuali e realizzativi che caratterizzano l’attività di un’ informatico. Il concetto di algoritmo Gli algoritmi vengono descritti tramite programmi , cioè sequenze di istruzioni scritte in un opportuno linguaggio , comprensibile al calcolatore .Compito dell’esperto informatico è produrre algoritmi ( cioè capire la sequenza di passi che portano alla soluzione di un problema ) e codificabili in programmi cioè rendendoli comprensibili al calcolatore. Il calcolatore esegue i programmi passo passo , in modo preciso veloce e potente , senza però deviare dalla loro esecuzione anche quando quest’ultima è palesemente sbagliata ; Un algoritmo è corretto se esso perviene alla soluzione del compito cui è preposto senza difettare di alcun passo fondamentale. Un’altra caratteristica auspicabile degli algoritmi è di essere efficienti , cioè di pervenire alla soluzione del problema nel modo più veloce possibile e/o usando la minima quantità di risorse fisiche compatibilmente con la sua correttezza. I linguaggi per la descrizione degli algoritmi : i cosiddetti linguaggi di programmazione. Un’attività importante degli informatici è la definizione di linguaggi per la codifica degli algoritmi , cioè linguaggi che consentono di scrivere gli algoritmi sotto forma di programmi che possono essere compresi dal calcolatore , che ne è l’esecutore .Anche se questa attività ha poco più di mezzo secolo di vita, gli informatici sono riusciti in questo breve arco di tempo a imitare il comportamento del genere umano , che ha creato nei secoli un grandissimo numero di diversi linguaggi , almeno uno per ogni gruppo etnico. La presenza di cosi tanti linguaggi di programmazione , da un lato, offre il vantaggio di poter scegliere il linguaggio più adatto a codificare specifici algoritmi , dall’altro provoca non pochi problemi , legati all’esigenza di imparare linguaggi diversi e di comunicare informazioni fra programmi scritti in linguaggi diversi. L’uomo per comunicare i suoi algoritmi al calcolatore, doveva imparare il linguaggio della macchina , cioè l’insieme dei comandi che la macchina era in grado di eseguire. Nella seconda metà degli anni 50 il linguaggio con cui l’uomo comunicava alla macchina gli algoritmi cominciò ad alzarsi di livello diventando in primo luogo più adatto a codificare gli algoritmi e in secondo luogo molto più comprensibile ; la fatica di tradurre il programma fu affidata alla macchina stessa .Poichè allora l’uso principale dei calcolatori consisteva nel risolvere il problema di calcolo numerico. Il primo linguaggio di alto livello fu il Fortan che stava per “ Formula “ adatto per descrivere l’elaborazione di formule matematiche. Di poco posteriore al Forten è il COBOL , il primo linguaggio orientato alle applicazioni gestionali particolarmente adatto alla memorizzazione ed elaborazione dei dati .COBOL E FORTEN sono rimasti per lungo tempo i linguaggi di memorizzazione più

diffusi. Il capostipite di tali linguaggi è ALGOL che proprio per questo ha grande importanza , pur non essendo mai stato utilizzato nella pratica i linguaggi più noti sono :

  1. Il Pascal , introdotto inizialmente con scopi prettamente didattici , ma che ha conosciuto anche un notevole successo in ambito industriale.
  2. Il C , che utilizzeremo anche in questo testo , forse il linguaggio che ha maggior successo relativamente alla costruzione di sistemi informatici.
  3. L’Ada , prescelto dal dipartimento della Difesa (DoD ) degli Stati Uniti , sul quale sono stati fatti molti investimenti industriali. In tempi più recenti si è affermato lo stile di programmazione orientato agli oggetti in cui si tende a mantenere una corrispondenza fra gli oggetti che caratterizzano un’applicazione e la loro codifica .Ciò ha portato alla nascita a linguaggi basati su questo stile , detti appunto linguaggi orientati agli oggetti. Tra essi menzioniamo C++, C# ( LETTO C sharp ) e Java derivati dal C ed Eiffel derivato dal Pascal. Tra ii linguaggi di Scripting i più noti e usati menzioniamo Python e Javascript. Con l’avvento di internet sono stati sviluppati nuovi linguaggi , allo scopo di permettere la programmazione di sistemare su reti di calcolatori , tra cui il menzionato Java. Infine ricordiamo linguaggi di tipo non convenzionale che vorrebbero evitare di condizionare lo stile di programmazione alle caratteristiche dello strumento di calcolo , rifacendosi a un modo di pensare più vicino al linguaggio matematico. I più noti sono:
  4. Il LIPS , basato sul concetto matematico di funzione
  5. Il PROLOG, basato sul formalismo della logica matematica.
  6. ML , anch’essi aspirato al concetto di funzione matematica. Architettura dei sistemi informatici Studiare l’architettura di un sistema informatico significa individuare ciascuna sua parte , comprendere i principi generali di funzionamento e capire come le vari parte interagiscono fra di loro. Hardware L’hardware di un elaboratore è composto da un insieme di elementi funzionali , presenti in ogni calcolatore anche se in vario numero e con caratteristiche assai diverse :
  7. L’unità di elaborazione o processore , spesso indicato come CPU , è la parte del sistema che svolge le elaborazioni e coordina il trasferimento dei dati all’interno dell’intero sistema informatico .Il processore ha il compito di eseguire i programmi.
  8. La memoria centrale , spesso indicata come RAM utilizzata per memorizzare dati e programmi utili al funzionamento dell’elaboratore. La memoria centrale sfrutta la tecnologia a stato solido , ha capacità limitata e contiene perciò una quantità ridotta di dati o programmi , inoltre essa è volatile , cioè il suo contenuto viene perduto quando il calcolatore viene spento, oppure quando c’è un guasto o un’interruzione di energia elettrica .In compenso , l’accesso all’informazione in questo tipo di memoria è molto rapido;
  9. La memoria secondaria , detta anche memoria di massa , utilizzata per memorizzata grandi quantità di dati o programmi. Solitamente viene realizzata mediante tecnologia , magnetica essendo stato solido non volatile , in tal caso detta memoria flash o SSD .In questo tipo di memoria l’informazione non viene persa quando il calcolatore viene spento. D’altro canto l’accesso alla memoria secondaria è molto lento rispetto alla memoria centrale
  10. L’unità periferica , sono utilizzate per far comunicare il calcolatore con l’ambiente esterno. esempio video , stampanti , mouse, uscite di tipo cartaceo.

direttamente dai costruttori del calcolatore ;tali programmi agiscono direttamente al di sopra dello strato hardware, e possono svolgere funzioni più o meno complesse. Il software di un sistema si basa su 2 classificazioni:

  1. Il software di base, dedicato alla gestione dell elaboratore che opera direttamente al di sopra dell ‘ Hardware o del firmware.
  2. Il software applicativo, dedicato alla realizzazione di specifiche esigenze applicative , che opera al di sopra del software. Il principale programma del software di base e il cosiddetto sistema operativo ,che gestisce le varie risorse hardware presenti nel elaboratore svolgendo funzioni differente a seconda della complessità del sistema di elaborazione sotto il suo controllo. in un personal computer ,Il sistema operativo svolge prevalentemente 3 funzioni: interpretare ed eseguire comandi elementari, organizzare le risorse della macchina e gestire l'accesso alle reti cui il computer è eventualmente collegato. Nella sua prima funzione, il sistema operativo è in grado per esempio di mandare in esecuzione un programma, di stampare il contenuto di un file oppure dimostrarlo sul video ; nella seconda, esso organizza e gestisce lo spazio della memoria di massa, disco rigido e supporti rimovibili, consentendo di leggere scrivere e copiare e cancellare i file ;Nella terza fase esso permette il collegamento con gli altri calcolatori della rete e l'accesso ai relativi servizi. Il sistema operativo fa vedere a ciascun utente un sistema di elaborazione apparentemente dedicato, in cui l'accesso ogni risorsa fa parte di un utente avviene come se gli altri utenti non esistessero .Il software è anche in gran parte il responsabile della gestione delle trasmissioni dei dati e delle reti di calcolatori .in particolare mentre i canali di trasmissione hanno la responsabilità di trasportare segnali tipicamente elettrici, i protocolli di comunicazione ossia il software di comunicazione hanno il compito di garantire la corretta comunicazione cui canali stessi ,garantendo la trasmissione dei dati dai terminali all'elaboratore e viceversa , oppure dei messaggi fra 2 laboratori collegati in rete. Ambiente di programmazione Anche se ai linguaggi di programmazione sono molto diversi tra loro, ciascuno di essi è caratterizzato da un proprio ambiente di programmazione. Gli ambienti di programmazione, pur essendo diversi fra loro hanno molti aspetti in comune. In particolare quasi tutti comprendano un editor, un compilatore , un linker è un controllore dell’ esecuzione.
  3. L'editor, serve per la costruzione di file che contengono testi , cioè sequenze di caratteri appunto in particolare gli editor sono di un ambiente di programmazione servono per costruire i programmi sorgente, cioè programmi scritti in un linguaggio di programmazione di alto livello.
  4. Il compilatore, opera la traduzione di un programma sorgente in un programma oggetto scritto in un linguaggio direttamente eseguibile. in tal caso, il programma eseguibile non viene generato ;il programmatore viene però informato sulla natura degli errori trovati dal compilatore e aiutato nella correzione del programma sorgente.
  5. A volte, al posto del compilatore viene usato un interprete. Quest 'ultimo esegue direttamente il codice sorgente senza tradurlo nel linguaggio macchina appunto l'interprete e quindi una sorte di processore di alto livello in grado di eseguire in modo diretto codice sorgente di alto livello. Per linguaggi normali come il C, il Pascal, il Fortran e l’Ada, l'esecuzione tramite interprete e meno efficiente del compilazione del codice sorgente Seguita dalla esecuzione del programma oggetto. Alcuni linguaggi per esempio Java , utilizzano un approccio intermedio basato su un compilatore

capace di generare un particolare codice intermedio, (byte code) che è indipendente dal linguaggio macchina l'interprete che esegue il codice intermedio chiamato macchina virtuale è in grado di raggiungere prestazioni maggiori .In questo caso ciascun modo può essere compilato separatamente ;un linker componeva di programmi oggetto ciascuno dei quali utilizzando il compilatore di un unico programma eseguibile. Un controllore dell esecuzione (debugger)serve per eliminare errori eventualmente presenti in un programma. Software di produttività personale Alcuni sistemi software non richiedono di saper programmare e si adattano a funzioni tipiche della vita quotidiana come scrivere e comunicare ;essi sono entrati nell'uso Comune di moltissimi utenti dei calcolatori virgola e vengono in genere indicati col nome di software personale.

  1. i sistemi di videoscrittura, consentono di costruire testi e di dare loro un formato di stampa.
  2. le agenda elettronica consentono di memorizzare un programma di lavoro o un indirizzo personale
  3. Gli ipertesti, consentono di costruire strutture reticolari complesse , al cui interno trovano posto pezzi di testo, elenco di vocabolari , paragrafi ,riferimenti. Gli ipermedia sono estensioni degli ipertesti ,Che consentono di aggiungere immagini, audio e video al contenuto testuale appunto il più famoso sistema ipertestuale e il Word wide web (www).
  4. la posta elettronica consente lo scambio di messaggi fra 2 qualsiasi utenti di sistemi informatici.
  5. i fogli elettronici permettono di effettuare efficientemente l'analisi della gestione e la presentazione di dati soprattutto numerici
  6. i sistemi per la gestione di basi di dati , che oltre a essere elementi del software di base , possono essere visti come sistemi di software personale, i browser mediante i quali l'utente può accedere al web e con esso a tutte le applicazioni disponibili su internet.
  7. Il cloud computing termina largamente usato per indicare l'evoluzione dei sistemi distribuiti in cui diversi elementi disponibili in diversi siti vengono di volta in volta coinvolti nella costruzione di nuovi sistemi applicativi. Applicazioni dell’informatica La tecnologia multimediale ha consentito nuove e precedentemente inimmaginabile applicazioni. Tale termine indica la possibilità di rappresentare, gestire e trasferire informazioni che possono provenire da altri media differenti. Le applicazioni numeriche Le applicazioni di tipo numerico sono state il punto di partenza del calcolo automatico. da tempo esse hanno raggiunto un ottimo livello di maturità tecnica e scientifica e un buon rapporto costi -benefici.Da un punto di vista tecnologico, i problemi connessi con il calcolo numerico, sia esso dedicato al fa statistiche demografiche, fa previsioni meterologiche oh alla ricerca di giacimenti petroliferi. Le applicazioni gestionali Le applicazioni gestionali e ormai tradizionale e costituisce da tempo la porzione più rilevate dal Merc. informatico .le classiche applicazioni gestionali che operano su grandi basi di dati realizzando sistemi informativi integrati ,tra più tipi di ambienti come i sistemi di prenotazione, intendenza di finanza , immatricolazione. I sistemi telematici

Cap 2 Architettura di un calcolatore L macchina di Von Nemann è costituita da quattro elementi funzionali fondamentali , unità di elaborazione (cpu ) , la memoria centrale, le periferiche e i bus di sistema. L’unità di elaborazione contiene i dispositivi elettronici in grado di acquisire , interpretare ed eseguire le istruzioni del programma. La memoria centrale contiene le informazioni necessarie alle esecuzione di un programma, cioè istruzioni e dati. Le periferiche permettono lo scambio delle informazioni fra l’elaboratore ed il mondo esterno , attraverso operazioni d’ingresso – tra l’esterno e l’elaboratore -e di uscita – dell’elaboratore al mondo esterno. in particolare , fanno parte del calcolatore le sole interfacce di collegamento verso le periferiche , mentre queste ultime vengono considerate come dispositivi separati. Nell’architettura di Von Nemann , le periferiche includono anche le memorie di massa che dal punto di vista dell’interazione con il calcolatore si comportano in modo funzionalmente analogo a terminali , stampanti e altri dispositivi collegati verso l’esterno. Infine il Bus di sistema opera il collegamento tra questi elementi funzionali. Questa architettura elementare è una estrazione della macchina reale in cui, possono essere presenti componenti ulteriori. Il modello di Von Nemann anche se ha ormai più di 70 anni di vita è tutt’ora adottato dalla maggior parte dei calcolatori il suo principale limite è che tutte le operazioni , vengono eseguite in stretta sequenza , determinata dall’unità di elaborazione. Modelli evolutivi di questa macchina prevedono di introdurre vare forme di parellelismo cioè , di esecuzione contemporanea delle attività di elaborazione. Codifica dei dati e delle istruzioni di un programma In un calcolatore, i dati e le istruzioni di programma sono codificate in forma binaria, ossia in una sequenza finita di 1 e di 0 .La più piccola unità di informazione memorizzabile o elaborabile da un colacolatore , il bit corrisponde allo stato di un dispositivo fisico che viene interpretato come 1° come 0. Un'altra importante unità di informazione è il byte , pari a 8 bit. I numeri Naturali Iniziamo a trattare i numeri naturali. Il sistema di numerazione che comunemente utilizziamo si dice arabico, in quanto fu introdotto in Europa dagli arabi nel corso del medioevo. Esso rappresenta i numeri naturali tramite sequenze di cifre; le cifre sono 10 ( 0,1,…,9) e per tanto questo sistema di numerazione si dice in base 10 ; E’ poi un sistema posizionale , perché il significato attribuito a ciascuna cifra è in funzione della posizione che tale cifra occupa nel numero. Non tutti i sistemi di numerazione posizionali ; la principale alternativa è data dai sistemi addittivi , in cui il significato dei simboli che compongono un numero è indipendente dalla posizione in cui tali simboli compaiono. Numeri interi I numeri interi si differenziano dai numeri naturali , perché includono , oltre allo zero e ai numeri positivi , anche i numeri negativi. Per tanto , dovrà essere rappresentato il segno del numero , oltre al suo valore. Prendiamo in considerazione due diverse codifiche binarie di numeri interi : la prima , la rappresentazione in modulo e segno , risulta più intuitiva ; la seconda , detta rappresentazione in complemento a 2 , è ampiamente utilizzata per semplificare l’esecuzione di operazioni aritmetiche tra numeri interi.

Numeri frazionari I numeri frazionari sono numeri reali compresi fra 0 e 1 ; essi si rappresentano tramite uno zero , il punto decimale e una sequenza di cifre che rappresentano una frazione di unità .I numeri frazionari possono introdurre approssimazioni , dovute alla presenza di un numero limitato di cifre dopo la virgola. La maniera più semplice di convertire un numero frazionario in base 10° nella forma binaria è rappresentata dalla moltiplicazione del numero frazionario per 2. Numeri reali I numeri reali possono essere rappresentati in un calcolatore sono in realtà numeri razionali , dotati di una parte intera e una parte frazionaria ; essi però, come sempre in matematica, approssimano i numeri reali con una precisione arbritaria. Concettualmente, per tanto, per la rappresentazione dei numeri reali è sufficiente giustapporre due numeri ( uno intero e uno frazionario ) .Il calcolo numerico è la disciplina che studia le proprietà dell’esecuzione delle operazioni tramite calcolatore , consentendo di valutare l’entità degli errori numerici introdotti durante l’esecuzione delle operazioni. Codifica dei caratteri I carrettieri che costituiscono un testo vengono codificati tramite sequenze di bit , utilizzando un codice di traduzione. Un codice ancora molto usato è il codice ASCII a 7 bit ; esso consente quindi di rappresentare al massimo 128 caratteri. i caratteri vengono classificati in 3 categorie : caratteri di comando , caratteri alfanumerici , e simboli. I caratteri di comando descrivono codici di trasmissione o di controllo delle stampe. I caratteri alfanumerici descrivono le lettere ( maiuscole, da “ a” a “z”, e minuscole , da “a” a “z” ) e le cifre (da “ 0 “ a “9”); i simboli includono i separatori utilizzati per la punteggiatura e gli operatori aritmetici. Si noti che il codice ASCII non comprende tutti i possibili caratteri di uso comune ; mancano, per esempio, le lettere accentate e le lettere greche. Codifica delle immagini Le immagini vengono anch’esse codificate come una sequenza di bit. Il passaggio da un’immagine a una sequenza binaria prende il nome di digitalizzazione : l’immagine è suddivisa in punti , o pixel ,e ciascun punto è codificato con un numero, che corrisponde ad un particolare colore ( o nelle immagini in bianco e nero, un particolare tono di grigio ). Si utilizza in genere un numero di colori o sfumature che sia potenza di 2 , in modo da poter codificare l’informazione associata a un pixel tramite un opportuno numero di bit. Le immagini vengono spesso memorizzate come sequenze molto lunghe di bit ; per interpretare queste sequenze è necessario conoscere le dimensioni delle immagini.Per i caratteri cosi come anche per le immagini sono stati definiti alcuni standard di codifica , che assicurano la compatibilità fra sistemi differenti per quanto concerne la trasmissione e la visualizzazione. tra i più diffusi citiamo TIFF ,JPEG,PNG.La compressione dei dati è importante anche perché permette di ridurre la quantità di memoria necessaria per memorizzare le immaginie i tempi necessari per trasmettere le immagini fra i vari dispositivi. Le tecniche di compressione si distinguono in tecniche lossless (non provocano perdita di informazioni, sono adatte solo per immagini con ampie aree monocromatiche codificando in forma compatta sequenze di punti aventi la stessa tonalità). Addizioni e sottrazioni di numeri interi La somma di due numeri positivi di lunghezza k in base T viene eseguita incolonnando i numeri e calcolando la somma di coppie di cifre di ugual posto ;Quando la somma di due cifre di posto i supera il valore di p -1, viene aggiunto un riporto unitario al posto i + 1 .Si parla di overflow quando, a fronte di due operandi dello stesso segno , si produce un risultato di segno differente da quello comune ai 2 operandi.

Il bus di sistema è costituito da un insieme di connessioni elementari , o linee lungo le quali viene trasferita informazione. Esso collega fra di loro l’unità di elaborazione , la memoria , e le varie interfacce di ingresso \ uscita. Il bus è in genere un collegamento aperto ( cioè non limitato a un estremo ) cui si collegano le varie unità funzionali. In ogni istante di tempo il bus è dedicato a collegare due unità funzionali : una trasmette i dati e l’altra li riceve. Le possibili interconnessioni sono tra l’unità di elaborazione e la memoria , oppure tra l’unità di elaborazione e l’interfaccia di una specifica periferica. Il Bus è in genere sotto il controllo dell’unità di elaborazione, che selezione l’interconnessione da attivare e indica l’operazione da compiere.

  1. Il bus dati trasferisce i dati dall’unità master all’unità slave o viceversa
  2. Il bus indirizzi serve per esempio per trasmettere il contenuto del registro indirizzi alla memoria centrale ;in questo modo, viene selezionata una specifica cella di memoria per un operazione di lettura o scrittura.
  3. Bus controlli trasferisce dall’unità master all’unità slave un codice corrispondente all’istruzione da eseguire e dall’unità slave all’unità master informazioni relative all’avvenuto espletamento dell’operazione richiesta. L’unità di elaborazione L’unità di elaborazione (CPU) contiene gli elementi circuitali che regolano il funzionamento dell’elaboratore. La sua funzione è quella di eseguire programmi contenuti nella memoria centrale prelevando , decodificando ed eseguendo una dopo l’altra le istruzioni che le costituiscono.
  4. Unità di controllo (CU) è responsabile del prelievo di decodifica delle istruzioni nonché l’invio dei segnali di controllo che provocano i trasferimenti o le elaborazioni necessarie per l’esecuzione dell’istruzione decodificata.
  5. Orologio di sistema , sincronizza le operazioni rispetto a una data frequenza
  6. Unità aritmetico logica , analizza le operazioni aritmetiche e logiche eventualmente richieste per l’esecuzione dell’istruzione. Inoltre la CPU ha diversi registri .Un registro è un elemnto di memoria che può essere letto o scritto molto velocemente e che è utilizzabile per memorizzare risultati parziali o informazioni necessarie al controllo. I principali registri dell’unità di elaborazione sono :
  7. Registro dati e il registro indirizzi
  8. Registro istruzione corrente , che contiene istante per istante , l’istruzione che risulta in esecuzione da parte dell’elaboratore ;
  9. Il contatore di programma che contiene l’indirizzo della prossima istruzione
  10. Registro interruzione che contiene alcune informazioni relative allo stato di funzionamento delle periferiche
  11. Registro di lavoro del tutto analoghi a celle di memoria ma che possono essere letti e scritti in modo molto più rapido senza ricorrere a operazioni di lettura e scrittura.
  12. Un registro particolare è detto Registro di stato , riporta alcuni suoi bit indicazioni relative al risultato delle operazioni svolte dalla ALU. --- IL bit di carry , che indica la presenza di un riporto --- il bit zero , che indica la presenza di un valore nullo nel registro A ---il bit di segno che riporta il segno del risultato --- il bit overflow che consente di rilevare la condizione di overflow che si verifica quando il risultato dell’ultima operazione supera il valore massimo riportato in A

Interfacce di ingresso \ uscita Le interfacce ingresso\ uscita costituiscono gli elementi circuitali che consentono il collegamento dell’elaboratore con le varie periferiche. Un interfaccia contiene registri per inviare comandi alla periferica , cambiare i dati e controllare il funzionamento della periferica. Le interfacce sono molto diverse a seconda del tipo di periferica considerata ( stampanti, plotter, robot ecc) .Per esempio una tipica evoluzione dell’architettura di Von Neumann consiste nel dedicare alcune unità di elaborazione

  1. Un registro dati della periferica per scambiare dati con la periferica. Lo scambio può avvenire verso la periferica ( per esempio , con una stampante ) oppure verso l’elaboratore ( per esempio con i lettori ottici )
  2. Un registro comando della periferica che contiene il comando che la periferica stessa dovrà eseguire ; 3. Un’informazione sullo stato della periferica ( per esempio per una stampante lo stato può essere: pronta a ricevere un nuovo dato , occupata a stampare oppure in una condizione di errore per mancanza di carta o d’inchiostro ). Esecuzione dei programmi Il programma è costituito da due parti distinte : la prima contiene le istruzioni codificate , la seconda contiene i dati. Le due parti sono divise dalla speciale istruzione “ halt “ ; quando la macchina esegue questa istruzione l’esecuzione del programma si arresta. La fase di acquisizione , chiamata anche FETCH PHASE , si svolge a sua volta in quattro passi ; ogni passo corrisponde ad un trasferimento di dati fra i registri della CPU e \o allocazioni specifiche della memoria centrale. La fase successiva , della detta fase di interpretazione , è dedicata alla decodifica dell’istruzione. Infine , la fase di esecuzione , che è differente per ogni operazione. Cap 3 Il nucleo del linguaggio C Per descrivere il linguaggio C faremo riferimento ad una macchina astratta – la macchina C in grado di “ comprendere “ ed eseguire i programmi codificati nel suo linguaggio. Essa è basata sulla macchina di Von Neumann. La macchina C è dotata di un unità CPU , una memoria centrale e un bus, come nell’architettura di Von Neumann. Differentemente dalla macchina di Von Neumann , però ha un'unica unità d’ingresso detta standard input , e un'unica unità di uscita chiamata standard output .Esse possono essere realizzate con supporti fisici profondamente diversi tra loro ( terminali video , stampanti , nastri magnetici ecc…) .Lo standard input , lo standard output e la memoria sono divisi in celle elementari , contenenti ciascuna un dato quest’ultimi possono essere sia valori numerici sia caratteri .Essi hanno un numero di celle illimitato e ogni singola cella può contenere un qualsiasi valore numerico ( sia intero sia reale) o un qualsiasi carattere , il che richiede un numero variabile di bit. Le celle di memoria vengono chiamate anche variabili per sottolineare il fatto che il loro contenuto può cambiare durante l’esecuzione del programma. Le variabili, le istruzioni , e altri elementi del programma sono indicati tramite identificatori simbolici definito dal programmatore. Un identificatore simbolico è definito come una successione di lettere e cifre , in cui al primo posto vi è una lettera. Alcuni identificatori sono predefiniti e riservati, nel senso che sono associati a

Cap 4 Esecuzioni di programma C su macchine reali Struttura dei programma C Un programma C deve contenere , nell’ordine :

  1. Una parte contenente direttive per il compilatore ;
  2. Gli identificatori predefiniti int main seguiti dalle parentesi (); Due parti , sintatticamente racchiuse dalle parentesi {} :
  • La parte dichiarativa ; -la parte esecutiva ; La parte dichiarativa di un programma elenca tutti gli elementi che fanno parte di quest’ultimo , con le loro principali caratteristiche. La parte esecutiva consiste in una successione d’istruzioni. La parte dichiarativa dei programmi La parte dichiarativa è posta prima della codifica dell’algoritmo e contiene ,oltre ad altre dichiarazioni che contiene i seguenti elementi :
  1. La sezione della dichiarazione delle costanti
  2. La sezionie della dichiarazione delle variabili Dichiarazione di variabili Lo scopo della dichiarazione di variabili è di elencare tutte le variabili che saranno utilizzate nella parte esecutiva e di attribuire a ognuno di esse un Tipo , ossia di specificarne le caratteristiche che ne regolano l’uso. Ogni dichiarazione di variabile consiste in uno specificatore di tipo , seguito da una lista di uno o più identificatori di variabili separati da una virgola. Dichiarazione di costanti Una dichiarazione di costante associa permanentemente un valore a un identificatore. Ogni dichiarazione, a sua volta , consiste in :
  3. La parola chiave const ;
  4. Lo specificatore di tipo , che appunto specifica il tipo di costante ;
  5. L’identificatore della costante ;
  6. Il simbolo = ;
  7. Il valore della costante .Esso può essere un numero intero, con o senza segno , un numero reale o un carattere ;
  8. Il solito terminatore La parte esecutiva dei programmi : istruzioni di ingresso \ uscita

Il programmatore C può sfruttare un insieme di funzioni predefinite sottoprogrammi specializzate per la realizzazione di particolari operazioni. Queste funzioni appartengono alla standard library le cui funzioni sono disponibili in ogni ambiente di programmazione ANSI \ISO C. La stringa di controllo è una stringa che viene stampata in uscita e che può contenere due tipi di oggetti : caratteri semplici che sono semplicemente copiati sul dispositivo di standard output e caratteri di conversione o di formato % che determinano come devono essere stampati gli argomenti successivi La stringa di controllo di un istruzione printf , come ogni stringa , non può essere spezzata su più righe. Anche scanf richiede la specifica di una stringa di controllo e di un insieme di elementi. La stringa di controllo può contenere diversi tipi di oggetti , tra i quali al momento prendiamo in considerazione : caratteri assimilabili allo spazio ( spazio, tabulazione, ritorno a capo e altri )che permettono di oltrepassare una o più istanze di tale carattere posizionandosi sul primo carattere diverso da esso ; Caratteri di conversione o di formato % e determinano come devono essere letti gli argomenti successivi. Cap 5 Tipi di dato Classificazione dei tipi di dato Le variabili di un programma possono rappresentare informazioni semplici , quali per esempio una velocità oppure una temperatura : in questi casi l’uso di una variabile numerica è una soluzione naturale. I tipi di dato utilizzati per rappresentare queste informazioni vengono chiamati Tipi semplici. Esistono anche informazioni più complesse , quali per esempio una data composta da (anno mese e giorno ), oppure la scheda relativa a un cliente di studio medico. E’ possibile rappresentare tali informazioni variabili separate. Quando le informazioni sono costituite dalla aggregazione di diversi componenti , i relativi tipi di dato si dicono Tipi strutturati La differenza fondamentale tra tipi semplici e tipi strutturati , risiede non tanto nella quantità di memoria necessaria , quanto nel fatto che l’informazione contenuta in una variabile di tipo semplice è logicamente indivisibile. Invece l’informazione contenuta in una variabile di tipo strutturato può essere scomposta nelle sue componenti Il C, come quasi tutti i linguaggi più moderni, ci offre una semplice e potente soluzione per questo problema: la possibilità di definire e costruire nuovi tipi, detti tipi definiti dall’utente , da affiancare a quelli già esistenti nel linguaggio. Di conseguenza , possiamo definire un nuovo tipo di dato per ogni categoria d’informazioni ( date , fatture , stipendi ecc) e trattare le variabili di questo tipo in maniera astratta Tipi semplici predefiniti Il linguaggio C prevede quattro tipi di base : char (caratteri ), int (interi ), float (reali ) , double (reali in precisione doppia ).

Ogni elemento di una sequenza è individuato mediante un indice , appartenente anch’esso a un determinato tipo. La dichiarazione di un tipo ottenuto con il costruttore array consiste nella sequenza dei seguenti elementi :

  1. La parole chiave typedef ;
  2. L’identificatore del tipo degli elementi dell’ array ; Questo può essere un tipo ( predefinito o definito dall’utente ,semplice o strutturato ) ;
  3. L’identificatore del nuovo tipo ottenuto mediante il costruttore array ;
  4. La dimensione dell’array , che deve essere un numero intero racchiuso nella coppia di parentesi [] Invece, la dichiarazione abbreviata di una singola variabile di un tipo ottenuto mediante il costruttore array consiste in :
  5. L’identificatore del tipo dell’elemento dell’array ,
  6. L’identificatore della variabile,
  7. La dimensione dell’array Esaminiamo ora varie caratteristiche delle dichiarazioni di array L’array è un costruttore di tipo ,non un tipo. La dichiarazione di un tipo array può essere implicita nella dichiarazione di una variabile. Un array ha dimensioni fisse .Gli estremi di variabilità degli indici di un array non possono cambiare durante l’esecuzione di un programma. Il costruttore puntatore Introduciamo il concetto di puntatore ad una variabile. Questo termine indica l’indirizzo della variabile cui fa riferimento. L’accesso a una variabile “puntata “ dal puntatore C avviene mediante l’operatore di deferenziazione , indicato dal simbolo * posto prima dell’identificatore del puntatore. I puntatori possono essere oggetti di assegnamento , essendo essi stessi variabili. Il C risulta caratterizzato dall’uso ampio e flessibile che esso consente nel costruttore di tipo puntatore .L’importanza del costruttore di tipo puntatore per il linguaggio C risulta chiaro solo dopo aver considerato :
  8. Lo stretto legamene tra array e puntatori
  9. Il trattamento delle funzioni
  10. La possibilità di allocazione dinamica della memoria e di riferimento esplicito a essa
  11. La possibilità di definizione di strutture dati dinamiche Array puntatori Per comprendere la “ parentela” esistente in C tra array e puntatori è necessario considerare il modo con cui un array viene allocato in memoria.
  12. Gli elementi di un array occupano in memoria un numero di parole che dipende dal loro tipo Il linguaggio C consente di eseguire operazioni di somma e sottrazione su puntatori. Il C e la tipizzazione forte Le regole di tipizzazione del C sono basate sulle linee guida :

 Sono eseguibili le espressioni che coinvolgono variabili eterogenee  Sono non eseguibili le espressioni che coinvolgono variabili eterogenee Queste regole per la gestione del tipo delle variabili sono tutte verificabili ; questo consente di dire che il C persegue l’obiettivo della tipizzazione forte. Compatibilità tra tipi Espressioni che coinvolgono elementi eterogenei in tipo Le regole sono applicate a espressioni aritmetiche del tipo x op y. Esse sono dette regole di conversione implicita. Cap 6 Struttura di controllo Teorema di Boehm-Jacopini Le strutture di controllo di linguaggio C sono equivalenti alle strutture di controllo del linguaggio assemblatore basate sulla diretta , condizione manipolazione del registro contatore di programma : tutti gli algoritmi che possono essere codificati con una possono esserlo anche con l’altro e viceversa. Il fatto che le strutture C siano simulabili da quelle del linguaggio assemblatore può essere facilmente compreso osservando che l’attività del compilatore richiede appunto una traduzione automatica della struttura. Istruzioni di selezione L’istruzione condizionale if – else è costruita per scegliere l’esecuzione di un’ istruzione in alternativa a un'altra a seconda del valore di una certa condizione .In molti casi le alternative tra cui scegliere possono essere molteplici. Il C offre una struttura di controllo di tipo selettivo. Il costrutto switch L’istruzione switch si presta a indicare la scelta di un’istruzione tra altre sulla base del valore di una particolare variabile o espressione.  La parola chiave switch seguita da  Un espressione racchiusa tra ()  Una sequenza di istruzioni case racchiuse tra parentesi graffe

  • Una sequenza di clausole case separate una dall’altra da due punti e conclusa da due punti .Ogni clausola case è costituita dalla parola chiave Al posto dell’istruzione casa può trovarsi l’ istruzioni default .Quest’ultima consiste semplicemente nella parola default seguita da una o più istruzioni. Il significato del costrutto switch è abbastanza intuitivo la macchina deve valutare l’espressione dopo la parola switch. Altri tipi di alternative multiple

È chiaro che nell’uso di variabili di tipo ElencoFatture o ElencoCosti si avrà bisogno di operazioni come”Calcolo del fatturato complessivo”, “Fatturato relativo al periodo x”, “Calcolo della somma dei costi complessivi” ecc. Tali meccanismi sono disponibili praticamente in ogni linguaggio (anche in quelli privi di strumenti per definire nuovi tipi di dato) e sono generalmente chiamati sottoprogrammi , poiché assomigliano a interi programmi ma sono “asserviti” ad altri programmi che costituiscono il programma principale. Un sottoprogramma deve essere in primo luogo definito , occorre cioè specificare quale operazione astratta esso realizza, come può essere identificato e quali parametri di ingresso e uscita coinvolge. Dei parametri di ingresso e uscita devono essere precisati sia il tipo sia l’identificatore. Tale utilizzazione dell’operazione rappresentata dal sottoprogramma si dice chiamata dello stesso. IN C, come ella maggior parte dei linguaggi di programmazione, esistono due tipi fondamentali di sottoprogrammi rispondenti diverse esigenze di utilizzazione: le funzioni e le procedure. Le funzioni Da un punto di vista matematico, tutte le operazioni astratte considerate finora sono funzioni. Addizione, Prodotto, Fatturato tale ecc. sono tutte funzioni con un ben preciso dominio e un ben preciso condominio (alcune di esse possono rappresentare in realtà una famiglia di “funzioni simili” con diversi domini e codomini: la somma è le altre operazioni aritmetiche, per esempio, possono essere definite sui numeri interi, sui numeri reali e su altri domini). Definizione delle funzioni Un sottoprogramma di tipo funzione viene in genere chiamato brevemente funzione. La struttura di una funzione è molto simile a quella di un programma; la sua definizione consiste in:  una testata (header);  due parti, sintatticamente racchiuse fra parentesi graffe:

  • la parte dichiarativa (detta parte dichiarativa locale );
  • la parte esecutiva (detta corpo della funzione). La testata contiene le informazioni più rilevanti per l’uso corretto del sottoprogramma, dalla lista dei parametri. La lista dei parametri è racchiusa da una coppia di parentesi tonde e consiste in una successione di dichiarazioni di parametri formali , separate tra loro da una virgola. Il risultato di una funzione può essere di tipo built-in o di tipo user-defined. In particolare, unafunzione non può restituire array o funzioni ma può restituire un puntatore a qualsiasi tipo. Chiamata delle funzioni Una funzione applicata a un valore dell’argomento, appartenente al suo dominio, fornisce un valore appartenente al suo condominio. All’interno dei programmi, i valori dei vari tipi sono denotati dagli elementi che compongono le espressioni. I parametri attuali indicano i valori degli argomenti rispetto ai quali la funzione deve essere calcolata. Ogni parametro può essere quindi un’espressione qualsiasi, eventualmente contenente un’altra chiamata di funzione. Inoltre il tipo dei parametri attuali deve essere compatibile con il tipo dei corrispondenti parametri formali. Il tipo dei parametri viene fissato una volta per tutte dalla definizione della funzione; di conseguenza, al momento della chiamata esso non va ripetuto. Ovviamente la stessa funzione può essere chiamata in diversi punti dello stesso programma con diversi parametri attuali. Prototipo delle funzioni

All’interno di un programma C una funzione può essere chiamata purché risulti definita oppure dichiarata. Qui definizione è dichiarazione non sono termini equivalenti. Talvolta infatti la chiamata di una funzione precede, nel codice, la definizione della funzione, altre volte le funzioni utilizzate da un programma sono definite in file propri del sistema C. Seil prototipo di una funzione viene inserito nella parte dichiarativa globale del programma o nella parte dichiarativa propria del codice che usa la funzione in modo da precedere le chiamate, il compilatore non è costretto a fare ipotesi sul tipo dei parametri è del risultato, ipotesi che dovrebbe poi verificare quando incontra la definizione della funzione. Le procedure Non sempre tutte le operazioni astratte di cui abbiamo bisogno sono descritte in modo naturale come funzioni matematiche. Abbiamo dunque bisogno di un’operazione StampaFatture che ha molti elementi in comune con gli esempi precedenti ma, diversamente da essi, ha come scopo non il calcolo di un valore da assegnare a una variabile o da comporre nel calcolo di un’ulteriore espressione, bensì la produzione di un tabulato stampa. Aspetti avanzati nell’uso dei sottoprogrammi Le proprietà dei sottoprogrammi esaminate finora ne permettono un uso sufficientemente efficace e generale. Esistono però alcune caratteristiche e tecniche di utilizzazione non ancora viste che permettono una programmazione più sofisticata e talvolta più potente. Il primo argomento che vogliamo trattare in maggior dettaglio è costituito dalle regole che stabiliscono l’accesso agli elementi del programma, dette scope rules nella letteratura internazionale, o regole di visibilità, e la durata o tempo di vita delle variabili durante l’esecuzione di un programma C. La struttura di un programma C La struttura di un programma C consiste in:  una parte di direttive ;  una parte di dichiarazioni globali che comprende:

  • dichiarazioni di costanti;
  • dichiarazioni di tipi;
  • dichiarazioni di variabili;
  • prototipi di procedure e funzioni;  un programma principale;  definizioni disfunzioni o procedure. Un programma C può essere descritto come un insieme di funzioni e variabili proprie dell’ambiente globale del programma. Una delle funzioni deve essere identificata come main. Infatti valgono le seguenti considerazioni.  Le procedure e il main possono essere considerati casi particolari di funzioni;  un main deve esistere: l’esecuzione del programma globale inizia con la prima istruzione della parte esecutiva del main. Analizzando ciò che succede quando una funzione o una procedura vengono eseguite abbiamo avuto modo di illustrare la differenza tra ambiente globale di programma e ambiente locale di funzione. L’ambiente globale del programma è ciò che potrebbe essere visibile e usabile dalle istruzioni che compongono la parte esecutiva del main, e dalle funzioni e procedure che costituiscono il programma. Ogni singola funzione, ogni procedura e il main possiedono poi un ambiente locale costituito da ciò che viene dichiarato nella parte dichiarativa, dai parametri ricevuti e dalla dall’eventuale risultato.