







































Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
informatica riassunto libro universitario
Tipologia: Sintesi del corso
1 / 47
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!








































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 :
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:
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.
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.
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
Cap 4 Esecuzioni di programma C su macchine reali Struttura dei programma C Un programma C deve contenere , nell’ordine :
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 :
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
È 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:
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: