Appunti per il corso di Programmazione I A.A

Dimensione: px
Iniziare la visualizzazioe della pagina:

Download "Appunti per il corso di Programmazione I A.A. 2005 06"

Transcript

1 Appunti per il corso di Programmazione I A.A Marco Baioletti Dipartimento di Matematica ed Informatica Facoltà di Scienze MM.FF.NN. Università degli Studi di Perugia 28 gennaio 2006

2 Capitolo 1 Problemi e algoritmi La programmazione di un calcolatore si svolge essenzialmente in una prima fase, in cui si delinea un algoritmo che risolve il problema di interesse, ed in una seconda fase, in cui l algoritmo è tradotto in un programma scritto in un linguaggio di programmazione. In questo e nel prossimo capitolo si vedranno tutti questi concetti e tutti gli strumenti da utilizzare nella programmazione. 1.1 Problemi e istanze Un problema da risolvere mediante un agente di calcolo (dalla soluzione manuale con carta e penna, a quella semimanuale con la calcolatrice, fino a quella completamente automatica con un calcolatore) può essere descritto in termini di dati di ingresso e dati in uscita. Una serie di esempi di problemi, essenzialmente matematici, è la seguente 1. dato un numero reale x ed un numero intero positivo n, calcolare x n 2. dati i coefficienti di un equazione di secondo grado, trovare le soluzioni o indicare che non ci sono soluzioni reali 3. dati n numeri interi, trovare il maggiore 4. dato un numero intero n, stabilire se è primo 5. dato un sistema di n equazioni lineari in n incognite, trovare la soluzione o determinare che il sistema ha zero o infinite soluzioni 6. dato un grafo di n nodi, cioè un insieme di elementi collegati tra di loro attraverso delle connessioni, dette archi, trovare il percorso di minima lunghezza che porta da un dato vertice ad un altro 7. dato un insieme di n stringhe, ordinarle alfabeticamente 8. dato un numero intero n, scomporlo in fattori primi In maniera più formale un problema P può essere descritto tramite un insieme I, contenente tutti i possibili valori dei dati di ingresso, un insieme R, contenenti tutti i possibili risultati del problema, e una funzione sol : I R, che ad ogni combinazione dei dati di ingresso associa il risultato corrispondente 1. 1 in generale un istanza potrebbe anche avere più soluzioni o nessuna e quindi non sol non sarebbe una funzione, ma una relazione matematica 1

3 Un istanza di un problema è una possibile combinazione dei dati di ingresso, cioè un elemento di I. Un istanza si ottiene sostituendo dei valori ammissibili alle variabili che compaiono nell enunciato del problema. Ad esempio, nel problema 1 se si sostituiscono ai due dati x e n due valori numerici ammissibili si ottengono tutte le possibili istanze: tre possibili istanze sono x = 1.5 e n = 4, x = 7.1 e n = 10 e x = 81.5 e n = 2. Le istanze del problema 6 sono tutti i possibili grafi di n nodi con tutte le possibili lunghezze per gli archi. In generale il numero delle istanze di un problema è quasi sempre molto elevato. Ad esempio nel problema 4, I è l insieme di tutti i numeri positivi, R è l insieme {sì,no e { sì se i è primo sol(i) = no se i non è primo Quando R è l insieme {sì,no (o forme equivalenti) il problema si dice decisionale. 1.2 Gli algoritmi Per risolvere un problema con un agente di calcolo è necessaria una descrizione precisa del procedimento da eseguire. Il procedimento, detto algoritmo, deve essere descritto in termini di operazioni elementari (o passi) che l agente di calcolo conosce bene, è in grado di eseguire senza nessun tipo di abilità (in altre parole meccanicamente) e che può portare a termine soltanto con le risorse di calcolo ad esso disponibili. Uno dei primi algoritmi, se non il primo algoritmo che la storia ricordi, è l algoritmo di Euclide (detto antenaresis) per calcolare il massimo comun divisore di due numeri interi: Dati due numeri diversi, si sottragga ripetutamente il minore dei due dall altro fino a che i due numeri non diventino uguali: il numero così ottenuto è il massimo comun divisore dei due numeri iniziali Ciò dimostra che l idea di algoritmo è ben distinta dall idea di programma e inoltre il concetto di algoritmo non é necessariamente connesso con l informatica. In generale gli algoritmi possono essere descritti a parole, purchè si dia una descrizione dettagliata e rigorosa dei passi da utilizzare. Ad esempio due algoritmi per la soluzione del problema dell elevamento a potenza sono Esempio 1 (Algoritmo A1) Calcolo della potenza con moltiplicazioni successive 1. memorizza il valore 1 nella variabile P 2. ripeti N volte (a) moltiplica P per X 3. il risultato è in P Esempio 2 (Algoritmo A2) Calcolo della potenza con elevamenti al quadrato e dimezzamento dell esponente 1. memorizza il valore 1 nella variabile P 2. ripeti finché N non diventa 0 (a) se N è dispari moltiplica P per X (b) moltiplica X per sé stesso 2

4 (c) dimezza N (tralasciando il resto) 3. il risultato è in P Gli algoritmi possono anche essere con un meccanismo abbastanza semplice e molto diffuso: i diagrammi di flusso. Essi sono basati su un sistema grafico in cui ogni passo è rappresentato da un rettangolo (istruzioni di calcolo) o un parallelogramma (istruzioni di ingresso/uscita), i punti di scelta dell algoritmo sono rappresentati con dei rombi contenenti la condizione da controllare e i passi sono collegati tra di loro con degli archi orientati. Nella figura seguente viene presentato il diagramma di flusso per l algoritmo A2. Inizio X, N (INPUT) sì N=0? no sì N dispari? P P X no X X 2 N N/2 P (OUTPUT) Fine Figura 1.1: Il diagramma di flusso E opinabile l uso dei diagrammi di flusso perché induce il programmatore ad utilizzare l istruzione di salto GOTO che già dalla fine degli anni 60 è ritenuta un istruzione da evitare in quanto rende illeggibili i programmi. Un altro sistema abbastanza diffuso in ambito scientifico è quello basato sulla pseudo codifica in cui l algoritmo è descritto attraverso un linguaggio di programmazione semplificato, con le istruzioni tratte dal linguaggio naturale (del tipo se... allora... altrimenti... fine se, mentre... ripeti... fine ripeti) o basate su istruzioni di linguaggi di programmazione esistenti, come l Algol. 1.3 Proprietà degli algoritmi Le tre proprietà fondamentali che un algoritmo deve possedere sono la finitezza, la correttezza e l efficienza. 3

5 1.3.1 Finitezza Per finitezza si intende che l algoritmo deve usare sempre una quantità finita di risorse per risolvere una qualunque istanza del problema. Dato che ciò vale anche per il tempo di calcolo, si richiede che l algoritmo termini sempre, dopo un numero finito, anche se non limitato, di passi. Detto in altri termini, un procedimento che in alcuni casi non termina entro un tempo finito, ossia richiede un tempo infinito o comunque un numero infinito di risorse, non è considerato valido come algoritmo Correttezza Per correttezza di un algoritmo si intende che l algoritmo deve essere in grado di risolvere il problema in tutte le sue possibili istanze, ovvero, secondo il formalismo precedente, che ricevendo come input l istanza i produca come output sol(i). Dimostrare che un algoritmo è corretto non sempre è semplice. Per algoritmi semplici si può fornire una dimostrazione matematica, basata solitamente sul metodo di induzione. Nella maggior parte dei casi si può tentare di capire se l implementazione dell algoritmo in programma è corretta utilizzando un insieme di test che riescano a coprire in qualche modo l insieme, solitamente estremamente grande, delle possibili istanze del problema. Un modo molto usato è quello di trovare degli esempi per diverse classi di istanze. Ad esempio i due algoritmi utilizzati per risolvere il problema dell elevamento a potenza sono entrambi corretti. Infatti A1 calcola X N moltiplicando X per sè stesso N volte e ciò corrisponde alla definizione di potenza con esponente positivo. Per vedere che A2 é corretto bisogna considerare che ad ogni iterazione il valore di P X N, detto invariante di ciclo, resta uguale a X N, ove X è il valore iniziale di X e N è il valore iniziale di N. All inizio del ciclo P vale 1, X e N hanno i valori di X e N e quindi l invariante è uguale a N X. Supponiamo ora che ad ogni passo 3 dell algoritmo l invariante di ciclo sia uguale a X N. Se N è dispari, allora N diventa N 1 2, P diventa P X e X diventa X2, perciò l invariante calcolato con i nuovi valori resta uguale a X N. Se invece N è pari, allora N diventa N 2, P rimane inalterato e X diventa X2, e perciò l invariante continua a rimanere uguale a X N. Alla fine del ciclo N sarà pari a 0 e perciò P varrà X N. Una possibile variazione sul concetto di correttezza è data dal concetto di algoritmo probabilistico. Un algoritmo probabilistico è un algoritmo con alta probabililità produce la soluzione corretta dell istanza data del problema da risolvere. Se non ci riesce può dare una soluzione errata o ammettere di non essere stato in grado di risolvere il problema. Spesso un algoritmo probabilistico può dare risposte diverse sulla stessa istanza. Un algoritmo probabilistico, benchè non sia corretto al 100%, come richiederebbe la teoria, è però utile in situazioni in cui non si conoscono algoritmi corretti efficienti, come ad esempio, per il problema di controllare se un numero intero è primo (anche se esistono algoritmi esatti che rispondono in tempo polinomiale non sono per ora competitivi con quelli probabilistici) Efficienza Per efficienza si intende che l algoritmo per risolvere il problema deve utilizzare al meglio le risorse di calcolo. In teoria sarebbe auspicabile utilizzare solo algoritmi ottimi, ossia quelli che utilizzano la minor quantità possibile di risorse rispetto a tutti gli altri algoritmi in grado di risolvere il problema in questione, ma non sempre questo è possibile. Infatti per alcuni problemi non si conoscono algoritmi ottimali: in tal caso si usano i migliori algoritmi 4

6 noti, che potrebbero essere non ottimali. Per valutare l efficienza di un algoritmo bisogna calcolare la quantità di risorse di calcolo necessarie ad un algoritmo. 1.4 Introduzione alla complessità computazionale Per calcolo del costo, o complessità computazionale, di un algoritmo si intende la quantificazione delle risorse utilizzate durante l esecuzione di un algoritmo. Due misure comuni di complessità sono la complessità temporale, ossia quanti passi impiega l algoritmo, e la complessità spaziale, ossia di quanta memoria ha bisogno l algoritmo. La risorsa su cui ci concentreremo sarà il tempo di calcolo (complessità temporale), benchè le considerazioni seguenti vanno bene anche per gli altri tipi di risorse. Come t A (i), misura del tempo utilizzato dall algoritmo A per risolvere l istanza i, non si può utilizzare il tempo effettivo in secondi perchè questo presuppone di utilizzare una macchina reale, con certe caratteristiche tecniche, e di avere un implementazione ben precisa dell algoritmo scritta in un linguaggio di programmazione ben determinato: tutti questi fattori possono influenzare anche parecchio i risultati, ma non sono assolutamente legati all algoritmo stesso. Quindi la complessità temporale è usualmente valutata in termini del numero di operazioni svolte, presupponendo che il tempo di calcolo effettivo (cioè quello finale in secondi) sarà all incirca proporzionale ad esso. Una prima ipotesi semplificativa è quella del costo uniforme, cioè che ogni operazione abbia lo stesso costo, e quindi conti per una. Ma ciò è irrealistico: ci possono essere operazioni più veloci e operazioni più lente. In generale si suddividono le operazioni in tipi omogenei per tempo di esecuzione (cioè le istruzioni all interno di un tipo hanno più o meno lo stesso tempo di calcolo) e si contano le operazioni di ogni tipo. In alcuni casi la differenza esistente tra i tempi dei vari tipi di istruzione potrebbe essere così netta che le operazioni più veloci possono essere trascurate rispetto a quelle più lente. Ad esempio per gli algoritmi dell elevamento a potenza le operazioni su interi sono trascurabili rispetto alle operazioni a virgola mobile e quindi ha senso contare solo queste ultime. Per poter confrontare due algoritmi che risolvono lo stesso problema o per sintetizzare l andamento del costo dell algoritmo non si può usare direttamente la funzione t A (i) in quanto è un oggetto difficilmente utilizzabile per fare confronti o ragionamenti. Un principio quasi sempre riscontrato è che la quantità di tempo (o di qualunque risorsa) utilizzata dall algoritmo dipenderà in generale dalla grandezza dell istanza del problema: tanto più grande (e quindi più difficile) sarà l istanza da risolvere e quanto maggiore sarà il tempo necessario a risolverla. Un modo ragionevole per misurare la grandezza delle istanze di un problema è quello di contare i bit che servono a rappresentare l istanza. Non c è quasi mai bisogno di scendere a questo livello e spesso una misura grossolana è sufficiente. Ad esempio la dimensione di un istanza per il problema dell elevamento a potenza sarà il numero di cifre della base e dell esponente, mentre nel problema dell ordinamento delle stringhe sarà proprio il numero di stringhe. Perciò lo scopo dell analisi computazionale di un algoritmo è quello di valutare una funzione di costo C(n), che ad ogni valore n come possibile valore della dimensione di un istanza del problema, associa la quantità di risorse utilizzata per risolvere le istanze di quella dimensione n. Poichè in generale la quantità di risorse non dipende solo dalla grandezza dell istanza, ma anche da altri fattori, tra i quali l istanza stessa, bisogna in qualche modo trovare una sintesi tra tutte le istanze di dimensione n. La metodologia più utilizzata in assoluta è la cosiddetta complessità nel caso peggiore che verrà spiegata in seguito. 5

7 1.4.1 Complessità nel caso peggiore Per formalizzare meglio il calcolo della complessità temporale nel caso peggiore, definiamo T A (n), per un fissato n, come il massimo tempo impiegato da A a risolvere un istanza di dimensione n. Detto in altri termini, T A (n) rappresenta il tempo necessario a risolvere la peggiore istanza possibile di dimensione n. Quest ultima considerazione spiega il termine di complessità nel caso peggiore. La funzione T A ha svariate caratteristiche positive. Innanzitutto non è difficile da calcolare, in quanto ci si deve sempre mettere nell ottica di cercare il peggior caso possibile, che di solito è un caso estremo e regolare. Ad esempio in alcuni algoritmi di ordinamento il caso peggiore è quello di ordinare un insieme già ordinato ma in senso inverso. Inoltre vale l ovvia relazione che per ogni istanza i t A (i) T A (dim(i)) ossia T A fornisce un limite superiore al tempo necessario ad una qualunque istanza, in quanto è il massimo tempo possibile e ogni altra istanza si deve risolvere con minor o ugual tempo. Uno svantaggio è che in certi casi la complessità nel caso peggiore restituisce una stima troppo pessimistica del tempo di calcolo. Un esempio lampante è il celeberrimo algoritmo del simplesso per la programmazione lineare 2. Nonostante si sappia che nel caso peggiore si comporta veramente male (con tempi di calcolo che crescono in modo esponenziale rispetto alle dimensioni del problema), questo algoritmo è molto utilizzato nella pratica perchè la stragrande maggioranza delle istanze vengono risolte molto velocemente. Il motivo sembra essere che il caso peggiore di quel problema è un caso patologico, che non si presenterà mai (o quasi) in pratica Esempi di calcolo della complessità Diamo ora alcuni esempi di calcolo della complessità nel caso peggiore di acluni algoritmi. I due algoritmi A1 e A2 presentati per risolvere il problema dell elevamento a potenza hanno comportamenti diversi. Per calcolare la complessità computazionale calcoliamo il numero delle moltiplicazioni al variare dell esponente N, poichè il loro numero non varia se invece cambiasse X. Per calcolare X N A1 esegue sempre N moltiplicazioni, quindi il costo è T (N) = N. Si noti che questo vuol dire che l algoritmo A1, nonostante le apparenze, ha una complessità esponenziale nella grandezza dell esponente! Infatti per rappresentare l esponente N in base 2 si ha bisogno di log 2 N bit e quindi è questa la dimensione dell istanza. Per cui T (N) = N andrebbe letta come T (n) = 2 n 1, ove n rappresenta la dimensione in bit di N, e 2 n 1 è proprio il più grande numero intero positivo rappresentabile con n bit. Per capire quante operazioni sono svolte da A2 si deve innanzitutto notare che ad ogni passo vengono svolte una moltiplicazione, talvolta un altra moltiplicazione, (punto 3a), ed una divisione intera. Quest ultima è un operazione più veloce delle altre e può essere trascurata dal computo totale delle operazioni svolte. Il numero di iterazioni che vengono effettuate è la parte intera di log 2 N, poichè questo numero equivale al numero di volte che si può dimezzare un numero fino a farlo diventare 1, e quindi T (N) 2 log 2 N. Per cui, riprendendo la considerazione fatta per A1, A2 ha complessità lineare nella dimensione dell istanza: T (n) = 2n. In generale poi non interessa nemmeno una valutazione precisa della complessità computazionale, ma è sufficiente conoscerne il comportamento asintotico. Ad esempio viene riportato che T (n) è dell ordine di n 2, in simboli T (n) = O(n 2 ), per diversi algoritmi di ordinamento di array di n elementi, anzichè indicare espressamente la formula precisa di T (n). 2 calcolare il massimo (o il minimo) di una funzione lineare a più variabili non negative sotto il vincolo di disequazioni lineari 6

8 Un altro esempio si ha nel confronto dei seguenti due algoritmi per il calcolo del massimo di n numeri. Il primo algoritmo, chiamato M1, è basato sulla definizione di massimo, cioè di quel numero che è maggiore o uguale di tutti gli altri. Per trovarlo basta prendere a turno ciascuno degli n numeri e controllare se essi soddisfano la condizione di massimo, l algoritmo si ferma quando un siffatto numero viene trovato. In pseudo codifica l algoritmo M1 è 1. prendi a turno ciascuno degli n elementi, sia A k l elemento preso 2. confronta ogni altro numero A i con A k contando quanti elementi A i sono A k 3. se il conteggio dà n 1, tutti gli altri sono minori o uguali a A k e quindi il numero più grande è proprio A k, altrimenti continua con il numero successivo Il secondo algoritmo, chiamato M2, consiste nel calcolare un massimo parziale, aggiornandolo ad ogni numero preso in considerazione. Si parte ponendo come massimo parziale il primo elemento dell insieme. Per ogni altro elemento dell insieme, si confronta l elemento in questione con il massimo parziale e se l elemento corrente risulta essere maggiore del massimo parziale, il massimo parziale diventa proprio l elemento corrente. E facile vedere che dopo aver passato in rassegna tutti gli elementi dell insieme si trova come massimo parziale proprio il massimo elemento dell insieme In pseudo codifica l algoritmo è 1. memorizza il primo numero in MAX 2. confronta ogni altro numero A i con MAX: se A i > MAX allora poni MAX pari a A i 3. Alla fine MAX il numero pi grande In termini di efficienza il secondo algoritmo è molto più efficiente del primo, valutandone la complessità nel caso peggiore. Il caso peggiore per l algoritmo M1 è quando il massimo è l ultimo elemento: ad ogni ciclo l algoritmo fa n 1 confronti per contare gli elementi A k e deve arrivare all ultimo elemento per trovare il massimo, in totale perciò fa n (n 1) confronti. Quindi T A1 (n) = O(n 2 ) Invece M2 fa sempre N 1 confronti, quindi T A2 (n) = O(n). Perciò essendo M1 è quadratico in n, mentre M2 è lineare in n, M2 è nettamente superiore a M1 in fatto di efficienza. Per inciso si può vedere che M2 usa il minor numero possibile di confronti e quindi è anche un algoritmo ottimale. 7

9 Capitolo 2 Programmi e linguaggi di programmazione 2.1 Introduzione In generale un programma è una serie di istruzioni di un determinato linguaggio di programmazione in grado di svolgere un determinato compito. Un programma solitamente è ottenuto implementando un algoritmo ed è perciò il risultato finale della risoluzione di un problema: il problema viene inizialmente risolto mediante la progettazione di un algoritmo che verrà successivamente implementato mediante un programma. L implementazione di un algoritmo con un programma introduce una serie di dettagli che nella stesura dell algoritmo non appaiono, quindi un programma è molto più espressivo dell algoritmo da cui deriva, anche se le linee principali sono le stesse. Si noti inoltre che lo stesso algoritmo può essere scritto in linguaggi di programmazione diversi e anche usando lo stesso linguaggio, implementato in modi diversi. Quindi da un algoritmo possono nascere molti programmi che, anche se all apparenza molto diversi, sono tutti equivalenti e condividono la correttezza e la complessità. La programmazione di un calcolatore nel senso più preciso della parola non può che avvenire in linguaggio macchina. Infatti il calcolatore può eseguire solo programmi scritti in tale linguaggio. La programmazione direttamente in linguaggio macchina può essere però estremamente complessa e difficile a causa della mancanza di astrazione delle istruzioni del linguaggio macchina (le istruzioni operano direttamente sui registri o sulle celle della memoria, non è possibile definire espressioni matematiche, non esistono strutture di controllo, non si possono trattare dati strutturati, ecc.), sull estrema povertà nella scelta delle istruzioni e anche su alcune stranezze proprie del linguaggio macchina (ad esempio in alcuni linguaggi macchina alcune istruzioni possono essere eseguite solo su determinati registri, ma non su tutti). Un altro grave ed evidente difetto del linguaggio macchina è che ogni programma scritto in un linguaggio macchina per un certo calcolatore può essere eseguito solo in quel tipo di calcolatore. Quindi se si vuole eseguire tale programma in un altro calcolatore, c è bisogno di riscriverlo completamente. Inoltre l implementazione di un algoritmo in linguaggio macchina può richiedere l utilizzo di tecniche e di trucchi propri della macchina in cui si lavora e che risultano inutilizzabili quando l algoritmo viene implementato in un altra macchina. 8

10 2.2 I principali linguaggi di programmazione I linguaggi di programmazione ad alto livello nascono per evitare al programmatore di dover lavorare in linguaggio macchina o in linguaggio assembler. Essi hanno reso possibile la diffusione della programmazione e la creazione di programmi molto complessi e molto lunghi. Come si è visto, la programmazione in linguaggio macchina è molto difficile perché si deve lavorare direttamente con la risorse della macchina, perdendosi dietro ad una miriade di dettagli tecnici che nulla o ben poco hanno a che fare con gli algoritmi che si vorrebbe implementare. Utilizzare un linguaggio di programmazione consente al programmatore di lavorare con una macchina astratta in cui ci si può concentrare sui dettagli realmente significativi. Inoltre scrivere un programma con un linguaggio di programmazione consente di poter facilmente utilizzare il programma su macchine diverse I paradigmi di programmazione Esistono svariati linguaggi di programmazione, sia general purpose (adatti a qualsiasi tipo di applicazione), sia orientati ad un particolare tipo di applicazione. I linguaggi di programmazione sono classificati in base al paradigma di programmazione che seguono. Esistono quattro importanti paradigmi di programmazione Nella programmazione imperativa un programma è visto come sequenza di comandi che la macchina deve svolgere. Il programma viene eseguito in un certo ordine, che può essere modificato con istruzioni condizionali, istruzioni di iterazione e salti. La memoria viene suddivisa in variabili a cui è possibile assegnare dei valori e di cui è possibile riutilizzare in seguito il valore. Molti linguaggi, soprattutto quelli più diffusi (C, Pascal, Fortran, Cobol, Basic, ecc.), sono imperativi. Sarà dedicata una piccola sezione alla descrizione delle caratteristiche più importanti dei linguaggi imperativi. Sono i linguaggi in qualche modo più vicini al funzionamento della macchina. Nella programmazione funzionale un programma è visto come una serie di espressioni da valutare in cui compaiono funzioni e funzionali (cioè funzioni che restituiscono come risultato altre funzioni) predefinite e definite dal programmatore, spesso in maniera ricorsiva. Non esistono, almeno nei linguaggi funzionali puri, né variabili né istruzioni vere e proprie. I linguaggi più famosi sono Lisp e APL. Nella programmazione logica un programma è visto come il controllo di relazioni tra dati. Le relazioni possono essere date esplicitamente (fatti) o possono essere dedotte attraverso delle regole, anch esse spesso ricorsive, a partire da relazioni già note e fatti. Non esistono anche in questo caso né variabili né istruzioni vere e proprie. E il paradigma più astratto e più lontano dal funzionamento della macchina. Il linguaggio più famoso è il Prolog. Nella programmazione orientata agli oggetti, che spesso compare insieme alla programmazione imperativa, un programma è visto come una serie di messaggi inviati ad oggetti. Ogni oggetto risponde ad un messaggio eseguendo un metodo di risposta. I metodi sono scritti essenzialmente come sequenze di istruzioni e invio di messaggi ad altri oggetti. E una tecnica recente e molti linguaggi moderni sono ad oggetti. I linguaggi ad oggetti più famosi sono C++, Java, Eiffel, Smalltalk. Inoltre molti linguaggi già esistenti si stanno convertendo alla programmazione ad oggetti (Ada, Fortran, Pascal, ecc.) I principali linguaggi di programmazione In generale i linguaggi di programmazione più famosi sono: 9

11 FORTRAN (1954) E stato il primo linguaggio di programmazione ad alto livello indipendente dall architettura (prima di allora si programmava nel linguaggio macchina). E nato ed è sempre stato utilizzato per scopi scientifici, prima tra tutte le applicazioni numeriche (FORTRAN sta infatti per FORmula TRANslation). Ha subito con il passare del tempo molte modifiche ed esistono diverse versioni : FORTRAN IV (1966), FORTRAN 77, Fortran 90, Fortran 95. COBOL (1959) E un linguaggio ideato per applicazioni aziendali ed ampiamente utilizzato per la gestione degli archivi. E il linguaggio di programmazione più vicino all inglese. ALGOL (1960) E stato il primo linguaggio definito in modo formale (sintassi BNF) ed ha introdotto molti dei concetti utilizzati in altri linguaggi di programmazione. E utilizzato per la descrizione degli algoritmi. Non ha mai avuto una diffusione apprezzabile. PL/1 (1963) Linguaggio ideato dall IBM come sintesi di FORTRAN, COBOL e ALGOL. Poco diffuso al di fuori degli ambienti IBM poiché è un linguaggio molto complesso. Basic (1965) Linguaggio elementare di uso generico, diffuso e utilizzato nei primi home computer e personal computer. Molto primitivo e poco standardizzato, con decine di dialetti diversi e incompatibili. Attualmente la Microsoft ne distribuisce una versione avanzata, il Visual Basic, per la programmazione rapida di applicazioni per il sistema Windows. Pascal (1971) Linguaggio ideato e molto utilizzato per l insegnamento della programmazione. Ha avuto una certa diffusione sui PC grazie al Turbo Pascal. C (1975) Linguaggio ideato per scrivere il sistema operativo UNIX ed utilizzato in seguito per scrivere applicazioni di base (sistemi operativi, compilatori, programmi di utilità). E abbastanza diffuso in ambito aziendale. ADA (1979) Linguaggio estremamente potente e complesso ideato per scrivere applicazioni sicure. E poco diffuso a causa della difficoltà nella progettazione di compilatori efficienti per questo linguaggio. E uno degli strumenti più usati nell ingegneria del software. C++ (1985) Versione orientata agli oggetti del linguaggio C. E uno dei linguaggi più utilizzati sia in ambito aziendale, grazie al Visual C++, sia in ambito scientifico, ove è in competizione con il FORTRAN. Java (1995) Linguaggio fortemente ispirato al C++ e ideato per applicazioni sulle pagine Web. Ha la peculiarità di essere compilato per un processore virtuale (JVM) che poi viene emulato dai processori reali, che consente di poter eseguire un programma Java già compilato in una serie molto ampia di piattaforme. La caratteristica di essere perfettamente portabile lo rende uno dei mezzi più semplici per la diffusione di programmi, anche tramite Internet. 2.3 I concetti fondamentali della programmazione imperativa Un programma nella programmazione imperativa è un insieme di istruzioni che operano su dati. Vediamo ora in dettaglio ciascuno di questi due concetti. 10

12 2.3.1 Dati I dati trattati in un programma possono essere dati costanti e dati variabili. La differenza ovviamente consiste nel fatto che i primi non cambiano durante il corso del programma, mentre i secondi possono essere modificati dal programma. I dati normalmente vengono classificati in tipi di dato. Tipi di dato Un tipo di dato è definito da un insieme D di possibili valori, detto dominio ed un insieme O di operazioni possibili. Ad esempio il tipo di dato intero è definito dall insieme dei numeri interi utilizzabili, per esempio tutti i numeri compresi tra e , e un insieme di operazioni, ad esempio somma, prodotto, differenza, quoziente, resto. I tipi di dati che si trovano negli usuali linguaggi di programmazione si suddividono in dati elementari e dati strutturati. I dati elementari sono costituiti da un unico valore e si suddividono in dati numerici (numeri interi e numeri reali) e dati non numerici (stringhe e valori booleani). I dati strutturati sono costituiti attraverso dei costrutti a partire da più valori, sia elementari, sia strutturati a loro volta. Il costrutto array consente di memorizzare n dati, tutti dello stesso tipo T. Un esempio di array è un vettore di 10 componenti intere. Ogni componente dell array è numerata e si può accedere alle singole componenti specificando un indice, cioè un numero che rappresenta la posizione della componente voluta nell array (la prima, la seconda,... ). Il costrutto record consente di memorizzare un insieme di dati di tipi diversi T 1, T 2,..., T n detti campi ai quali, solitamente, è attribuito un nome. Un esempio di record è fornito dai dati di una persona: nome, cognome, data di nascita, indirizzo, numero di telefono, stipendio. Per accedere ad una delle componenti di un record si indica il nome del campo desiderato. Variabili Una variabile è una parte della memoria su cui è possibile memorizzare un dato appartenente ad un certo tipo di dato. Le variabili utilizzate normalmente sono associate ad un nome che permette di accedere al dato memorizzato, sia per leggere il valore, sia per modificare il valore. Molti linguaggi associano ad una variabile un tipo di dato fisso che deve essere dichiarato dal programmatore. Inoltre in molti linguaggi ci sono regole che stabiliscono la durata di una variabile (cioè quando la variabile sarà presente in memoria) e l area di visibilità (cioè la zona del programma in cui è possibile usare la variabile) Istruzioni Le istruzioni di un linguaggio imperativo si suddividono in istruzioni elementari e istruzioni strutturate. Istruzioni elementari La principale istruzione elementare è l assegnamento, che consente di memorizzare un valore, calcolato come risultato di un espressione, all interno di una variabile. Altre istruzioni elementari sono le istruzioni di I/O, lettura e scrittura di dati attraverso le usuali periferiche quali tastiera, video e memorie di massa. Un altra istruzione è la chiamata di un sottoprogramma, di cui accenneremo in seguito. 11

13 Istruzioni strutturate Le istruzioni strutturate sono istruzioni composte, costituite da più istruzioni, elementari o a loro volta strutturate, utilizzando tre costrutti fondamentali: sequenza : è una successione di istruzioni I1, I2,..., In che sono eseguite in modo sequenziale, cioè una dopo l altra secondo l ordine indicato; si usa anche per raggruppare le istruzioni in modo da considerarle come se fossero una sola istruzione; scelta : è un punto di scelta del programma, in cui si valuta una condizione 1 e a seconda del risultato si esegue un insieme di istruzioni S1 (se la condizione è vera) o un insieme di istruzioni S2 (se la condizione è falsa). E possibile anche avere forme di scelta a più valori; iterazione è un modo per ripetere un insieme di istruzioni, si distinguono iterazioni a conteggio, in cui il numero di ripetizioni è fissato a priori (ad esempio ripeti S per 10 volte), e iterazioni a condizione, in cui la ripetizione continua fintantochè una data condizione è vera (ad esempio ripeti S mentre X è diverso da 0) oppure è falsa (ad esempio ripeti S fintantochè A non diventa positivo). Sottoprogrammi Infine in molti linguaggi di programmazione è possibile definire delle parti di programma, dette sottoprogrammi, che possono avere tutte le caratteristiche dei programmi interi (ad esempio variabili proprie) e che possono essere mandati in esecuzione, anche in più punti del programma o da altri sottoprogrammi, attraverso opportune istruzioni di chiamata a sottoprogrammi. La chiamata di un sottoprogramma sospende temporaneamente l esecuzione del programma o del sottoprogramma in corso, attivando l esecuzione del sottoprogramma chiamato. Quando l esecuzione di quest ultimo finirà, il programma o il sottoprogramma sospeso riprenderà ad essere eseguito a partire dal punto in cui era stato sospeso, cioè l istruzione immediatamente successiva alla chiamata. Questo meccanismo è simile al concetto di sub routine visto nella parte di programmazione in linguaggio macchina, ma molto più raffinato, potendosi distinguere le procedure dalle funzioni (quest ultime producono un risultato esplicito) e potendo utilizzare dei parametri mediante i quali il programma chiamante e il sottoprogramma chiamato possono scambiarsi dei dati. 2.4 Strumenti per la programmazione Il programmatore ha a disposizione diversi strumenti per la scrittura e l esecuzione di un programma: editor sono programmi che permettono di scrivere il codice del programma; alcuni possono controllare parzialmente la correttezza del programma (almeno dal punto di vista lessicale) e aiutare il programmatore nella digitazione del codice, completando le istruzioni; traduttori sono programmi che traducono un programma da un linguaggio ad un altro; se ne parlerà in seguito; debuggger sono programmi che consentono di far eseguire un programma un passo per volta e consentendo di entrare dentro al programma : vedere il contenuto delle variabili, modificarlo, ecc. Sono ottimi strumenti per scoprire eventuali errori di programmazione. 1 un espressione il cui risultato è vero o falso 12

14 2.4.1 Tecniche di traduzione Poichè è estremamente complicato programmare in linguaggio macchina e inoltre è impossibile far eseguire da una macchina un programma scritto nel linguaggio macchina di una macchina diversa, sono stati ideati i linguaggi ad alto livello, tra i quali i più famosi sono stati descritti nel paragrafo precedente. Nonostante l introduzione di questi linguaggi, le CPU tradizionali sono in grado solo di eseguire programmi scritti in linguaggio macchina e quindi è necessario tradurre i programmi dal linguaggio ad alto livello al linguaggio macchina. Esistono due tecniche distinte di traduzione di un programma: l interpretazione e la compilazione. Si dice che un programma P è interpretato se la fase di traduzione è eseguita durante l esecuzione stessa. In pratica, tramite un particolare programma, chiamato interprete, ogni singola istruzione di P viene tradotta in linguaggio macchina e poi eseguita. Se un istruzione deve essere eseguita più volte verrà di conseguenza tradotta più volte. Si dice che un programma P è compilato se la fase di traduzione è eseguita interamente prima dell esecuzione. In pratica tutto il programma P, detto sorgente viene tradotto da un programma, detto compilatore, nel programma P, detto eseguibile, equivalente a P ma scritto in linguaggio macchina. I programmi interpretati sono eseguiti in modo molto più lento perchè ogni istruzione deve essere tradotta prima di essere eseguita, mentre nella compilazione il programma tradotto P è eseguito direttamente dalla macchina. Un secondo vantaggio offerta dalla compilazione è che la traduzione in linguaggio macchina può essere svolta in modo da ottenere un codice molto efficiente (fase di ottimizzazione) a scapito della velocità della fase di traduzione. Un terzo vantaggio è che la traduzione viene svolta solo una volta, cioè prima che il programma deve essere eseguito per la prima volta. Infatti una volta ottenuto l eseguibile, questo può essere eseguito tutte le volte che se ne ha bisogno. Anche l interpretazione offre dei vantaggi. Innanzitutto per eseguire un programma tramite interpretazione non si ha bisogno di una fase precedente di traduzione: il sorgente viene eseguito direttamente, senza il ritardo di una traduzione completa, come se la macchina capisse veramente il linguaggio ad alto livello in cui è scritto. Inoltre, mentre ogni volta che si modifica un programma in un linguaggio compilato questo va ritradotto nuovamente, un programma interpretato potrebbe addirittura essere modificato anche durante l esecuzione stessa. Con l esecuzione interpretata di un programma è possibile effettuare un esecuzione passo passo, per vedere cosa succede dopo ogni istruzione eseguita, o inserire dei punti di arresto. La caratteristica dell immediatezza dell interpretazione si utilizza nei programmi interattivi (ad esempio pacchetti matematici o statistici) in cui l utente dialoga in modo diretto con il programma dando dei comandi che devono essere eseguiti subito, senza dover essere tradotti completamente. In generale, però, il confronto tra la velocità di esecuzione di un programma interpretato e quella di un programma compilato è talmente sfavorevole per i programmi interpretati, che per molti linguaggi ad alto livello (Pascal, C, Fortran, C++, Cobol, ecc.), utilizzati per applicazioni che devono essere veloci, si usa solo la modalità di esecuzione compilata I compilatori Diamo ora uno sguardo più dettagliato ai compilatori. La fase di traduzione di un programma ad alto livello in un programma in linguaggio macchina è svolta in più fasi. Nella prima fase, detta analisi lessicale, il programma viene sottoposto ad una verifica di correttezza lessicale, trovando errori di ortografia (essenzialmente parole chiave scritte in modo errato) e scomposto in parti elementari, dette token: parole chiave, numeri, identificatori, ecc. 13

15 Nella seconda fase, detta analisi sintattica o parsing, il programma viene sottoposto ad una verifica di correttezza sintattica, trovando errori di sintassi (cioè di istruzioni grammaticatamente scorrette). L analisi sintattica decompone il programma nelle sue componenti principali (istruzioni, costrutti, espressioni, dichiarazioni, ecc.). Può esserci a questo punto una fase in cui avviene una prima traduzione del programma in un formato intermedio (non ancora in linguaggio macchina), in cui ad esempio le espressioni aritmetiche sono trascritte in modo semplificato, che può facilitare il passaggio seguente. Nella fase successiva il programma viene tradotto in linguaggio macchina. Può essere poi eseguita una fase di ottimizzazione del codice macchina, in cui si cerca di velocizzare il programma spostando e riscrivendo le istruzioni attraverso l uso di regole che producono un codice equivalente ma più efficiente. Il codice così si chiama oggetto. Nell ultima fase il programma in linguaggio macchina è collegato attraverso una programma detto linker, che può essere esterno rispetto al compilatore stesso, alle librerie di procedure e funzioni predefinite, quali le procedure di input/output, le funzioni matematiche, ecc. Il programma risultato di quest ultima fase si chiama eseguibile. 14

16 Capitolo 3 Gli algoritmi elementari In questo capitolo vengono descritti brevemente gli algoritmi elementari sviluppati durante il corso. Per maggiori delucidazioni si rimanda al libro di testo. 3.1 Somma di un array La somma di un array X di n elementi numerici si calcola utilizzando una variabile accumulatore, chiamata nel codice sottostante somma, su cui si sommano successivamente tutti gli elementi dell array. somma=0; for(i=0;i<n;i++) somma +=x[i]; 3.2 Conteggio degli elementi di un array che verificano una data proprietà Il conteggio degli elementi di un array X che verificano una data proprietà (nell esempio contiamo gli elementi pari) si calcola utilizzando una variabile contatore conta=0; for(i=0;i<n;i++) if(x[i]%2==0) conta++; 3.3 Fattoriale e coefficiente binomiale Il fattoriale n! è la produttoria di tutti i numeri da 1 a n e perciò si calcola in modo simile alla sommatoria. fatt=1; for(i=1;i<=n;i++) fatt *= i; Esiste una versione ricorsiva del fattoriale (che è uno degli esempi più famosi di funzione ricorsiva) 15

17 int fattoriale(int n) { if (n==0) return 1; else return n*fattoriale(n-1); Il coefficiente binomiale ( n k) si può calcolare attraverso il calcolo di tre fattoriali secondo la formula ( ) n n! = k k!(n k)! ma si può calcolare in modo più efficiente come ( ) n n(n 1) (n k + 1) = k k! coeff_bin=1; for(i=1;i<=k;i++) coeff_bin *= (n-i+1)/i; 3.4 Massimo e minimo di un array Per calcolare il massimo (o il minimo) di un array di n elementi si usa un meccanismo già descritto nella parte dedicata agli algoritmi ed alla complessità. Si usa una variabile di nome MAX che contiene il valore massimo corrente (cioè il più alto valore fino a quel momento trovato). MAX è inizializzata con il valore del primo elemento del vettore e poi, passando in rassegna tutti gli altri elementi del vettore, è aggiornata con il valore dell elemento corrente se questo supera l attuale valore di MAX. Il codice è il seguente max=a[0]; for(i=1;i<n;i++) if (a[i]>max) max=a[i]; Si può anche utilizzare un ciclo FOR che comprende anche il primo elemento, inizializzando MAX con un valore molto basso (ad esempio un numero negativo grande in valore assoluto, tipo per numeri reali, o per numeri interi a 16 bit, ecc.) max=-1.0e38; for(i=0;i<n;i++) if (a[i]>max) max=a[i]; Alla prima iterazione sicuramente a[0] > MAX e quindi MAX prenderà il valore di a[0]. Questo può essere utile se non si vuole trattare a sè il primo elemento (si pensi al caso in cui gli elementi anzichè risiedere in un vettore sono generati da programma). In modo simile si può calcolare il minimo elemento min=a[0]; for(i=1;i<n;i++) if (a[i]<min) min=a[i]; 16

18 Anche per il minimo si può anche utilizzare un ciclo for che comprende anche il primo elemento ma allora bisogna inizializzare MIN ad un valore molto alto (ad esempio un numero positivo grande in valore assoluto, tipo per numeri reali o per numeri interi a 16 bit) min=1.0e38; for(i=0;i<n;i++) if (a[i]<min) min=a[i]; 3.5 Gli algoritmi di ricerca in un array Gli algoritmi di ricerca risolvono il problema di cercare un elemento x all interno di un vettore a di n elementi Ricerca lineare Il metodo più elementare è quello della ricerca lineare. Questo algoritmo restituisce il più piccolo valore di i per cui a[i] = x oppure, qualora l elemento cercato non sia presente, il valore di i restituito è pari a n. int i=0; bool trovato=false; while(i<n &&!trovato) { if(a[i]==x) trovato=true; else i++; In C e in C++ questo algoritmo potrebbe anche essere espresso in modo molto più compatto tramite un unico ciclo for. for(i=0;i<n && a[i]!=x;i++) ; In questo caso alla fine del ciclo for la variabile i assume un valore minore di n se l elemento da cercare è stato trovato. La ricerca lineare ha complessità nel caso peggiore, che si verifica quando l elemento non c è oppure si trova all ultimo posto, pari a O(n), infatti vengono effettuati al più n confronti Ricerca binaria Se il vettore a è ordinato in senso crescente si può usare un algoritmo più efficiente, chiamato ricerca binaria (o dicotomica). int s=0,d=n-1,m; bool trovato=false; do { m=(s+d)/2; if(a[m]==x) trovato=true; else if(a[m]>x) { d=m-1; else { s=m+1; while(s<=d &&!trovato); 17

19 Nella ricerca binaria la ricerca viene effettuata su una parte del vettore, detta parte valida, delimitata dai due indici s e d. All inizio la parte valida corrisponde all intero vettore. Ad ogni passo la parte valida del vettore viene suddivisa in due parti uguali. Se l elemento cercato è minore dell elemento centrale, la ricerca continua nella parte di sinistra, se è maggiore dell elemento centrale, la ricerca continua nella parte di destra, infine se è uguale, la ricerca termina con successo. La ricerca termina con insuccesso quando la parte valida non può essere più ulteriormente suddivisa, cioè quando è composta da un solo elemento. La complessità nel caso peggiore è O(log 2 n), in quanto log 2 n è il numero massimo di volte in cui un vettore di n elementi può essere dimezzato fino ad arrivare ad un solo elemento. Questo è ovviamente il caso peggiore, sia per la ricerca con successo, che per la ricerca con insuccesso. 3.6 Gli algoritmi di ordinamento Gli algoritmi di ordinamento cercano una permutazione degli elementi di un vettore di n elementi ordinabili 1 in modo che gli elementi così permutati siano in ordine crescente (o descrescente) Ordinamento a bolle (Bubblesort) L ordinamento a bolle è molto semplice, ma non molto efficiente. Si basa sul seguente principio: se tra due elementi consecutivi, il primo è maggiore del secondo, allora questi due elementi sono sicuramente fuori posto e, come minimo, bisogna scambiarli fra di loro. Questo controllo deve essere ripetuto più volte, infatti l effetto di una singola passata che controlla ogni elemento con il precedente e in caso sfavorevole li scambia è di garantire che l elemento più grande sia messo al posto giusto, cioè all ultimo posto dell array. Una seconda passata sarà in grado di portare il secondo elemento più grande al penultimo posto. Si noti che il confronto tra il penultimo e l ultimo è inutile in quanto l ultimo è il più grande. In generale occorreranno n 1 passate, ognuna delle quali controllerà sempre meno elementi: for(i=0;i<n-2;i++) { for(j=0;j<n-i;j++) { if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; Il numero di scambi è fisso e pari a (n 1) + (n 2) , cioè quadratico in n. Il numero di scambi nel caso peggiore è anch esso quadratico in n. L algoritmo può essere migliorato osservando che, se dopo un intero ciclo for interno non si sono fatti scambi, allora il vettore è già ordinato e si può uscire dal ciclo esterno (che diventa un ciclo do while). i=0; bool scambia; do { scambia=false; 1 cioè appartenenti ad un insieme in cui è definita una relazione d ordine 18

20 for(j=0;j<n-i;j++) { if(a[j]>a[j+1]) { temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; scambia=true; i++; while(scambia); Ordinamento per selezione Questo secondo algoritmo di ordinamento si basa su questo semplice principio: l elemento più piccolo in un vettore ordinato sta al primo posto, il secondo elemento più piccolo sta al secondo posto, ecc. Da questa idea nasce il seguente algoritmo. Si trova l elemento più piccolo del vettore e lo si mette al primo posto, mettendo l elemento che si trovava al primo posto nella posizione originaria in cui si trovava l elemento più piccolo, in pratica li si scambia di posto. Poi si trova il secondo elemento più piccolo e lo si scambia con il secondo elemento del vettore. E facile trovare il secondo elemento più piccolo, in quanto sarà l elemento minore del vettore tranne il primo elemento (che contiene l elemento più piccolo). Generalizzando si ottiene il seguente codice for(i=0;i<n-1;i++) { jmin=i; for(j=i+1;j<n;j++) if(a[j]<a[jmin]) temp=a[i]; a[i]=a[jmin]; a[jmin]=temp; jmin=j; E uno degli algoritmi più efficienti, perchè fa solo n 1 scambi. Purtroppo anche questo algoritmo ha bisogno di un numero quadratico di confronti Quicksort Nel quick sort si divide il vettore da ordinare in due parti scegliendo un elemento discriminatore (detto pivot) mettendo in una parte gli elementi minori del pivot e dall altra quelli maggiori. Poi si ordinano ricorsivamente le due parti e tutto il vettore risulta ordinato, dato che ogni elemento della prima parte è minore di ogni elemento della seconda. Anche in questo caso la parte di vettore in cui l algoritmo opera è delimitata dai due indice s e d. void quicksort(int a[], int s, int d) { if(s<=d) { int i,j; int x; i=s; j=d; x=... // elemento pivot scelto in qualche modo 19

21 do { while (a[i]<x) { i++; while (a[j]>x) { j--; if(i<=j) { int temp=a[i]; a[i]=a[j]; a[j]=temp; i++; j--; while(i<=j); quicksort(a,s,j); quicksort(a,i,d); La scelta dell elemento pivot è cruciale. Una scelta pessima è quella del minimo o del massimo elemento del vettore, perchè si dimostra che in questo caso l algoritmo usa un numero quadratico di operazioni. Una scelta ottima sarebbe la mediana del vettore, ma poichè trovare la mediana è difficile non è possibile usarla. Un alternativa è quella di prendere tre elementi a caso e calcolare la mediana solo di questi tre. Di solito si prende un elemento fisso (ad esempio il primo o l ultimo o quello centrale), o un elemento scelto a caso o, se i dati sono numerici, la media del vettore o di alcuni elementi, ad esempio tra il primo e l ultimo. Tante altre scelte sono possibili. Si dimostra comunque che, scegliendo un pivot non in modo pessimo, il quick sort è veloce in media quanto il miglior algoritmo teorica, il merge sort, avendo una complessità di O(n log 2 n). Ciò spiega il nome e la notevole velocità dimostrata nelle prove empiriche. 20

22 Capitolo 4 I puntatori e le variabili dinamiche 4.1 Introduzione In questo capitolo saranno introdotti i concetti di puntatore e di variabile dinamica. Questi concetti saranno di cruciale importanza per l implementazione delle strutture dati dinamiche, introdotte nel capitolo successivo. 4.2 I puntatori Definizione di variabili puntatori e indirizzi Una variabile usualmente contiene un dato, sia esso un numero, una stringa, un valore di verità, ecc. Una variabile V, essendo una zona di memoria, ha un proprio indirizzo, corrispondente all indirizzo della prima cella di RAM assegnata a V. Per estrarre l indirizzo di una variabile si usa l operatore prefisso &, ad esempio per trovare quello di V si usa &v. Un indirizzo è essenzialmente un numero intero senza segno, la cui grandezza dipende dal sistema operativo, dal processore e dalla quantità di RAM; normalmente è a 32 bit. E possibile creare delle variabili che contengono gli indirizzi di altre variabili o, in generale, di dati presenti in memoria. Questo nuovo tipo di variabili, detto puntatore, consente di raggiungere in modo indiretto un dato all interno della memoria. Non esistono in C e in C++ variabili puntatore generiche, è possibile creare solo puntatori specializzati a contenere indirizzi di variabili o di dati di un determinato tipo di dati T e non di altri tipi di dati. Per dichiarare che la variabile p è un puntatore di tipo T si usa la sintassi T *p, ad esempio per dichiarare che p1 è un puntatore a int, p2 e p3 sono puntatori a double e p4 è un puntatore a bool si usa int *p1; double *p2,*p3; bool *p4;. La variabile p1, per esempio, può contenere l indirizzo di un int ed è possibile assegnargli l indirizzo di una variabile int: p1=&v; Con questo comando p1 contiene l indirizzo di v e si dice che p1 punta a v. Se successivamente si dichiara un secondo puntatore a int di nome p2, posso assegnare a p2 l indirizzo contenuto in p1 con 21

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA LINGUAGGI DI ALTO LIVELLO Si basano su una macchina virtuale le cui mosse non sono quelle della macchina hardware COS È UN LINGUAGGIO? Un linguaggio è un insieme di parole e di metodi di combinazione delle

Dettagli

4 3 4 = 4 x 10 2 + 3 x 10 1 + 4 x 10 0 aaa 10 2 10 1 10 0

4 3 4 = 4 x 10 2 + 3 x 10 1 + 4 x 10 0 aaa 10 2 10 1 10 0 Rappresentazione dei numeri I numeri che siamo abituati ad utilizzare sono espressi utilizzando il sistema di numerazione decimale, che si chiama così perché utilizza 0 cifre (0,,2,3,4,5,6,7,8,9). Si dice

Dettagli

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi. Algoritmi 1 Sommario Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi. 2 Informatica Nome Informatica=informazione+automatica. Definizione Scienza che si occupa dell

Dettagli

Linguaggi e Paradigmi di Programmazione

Linguaggi e Paradigmi di Programmazione Linguaggi e Paradigmi di Programmazione Cos è un linguaggio Definizione 1 Un linguaggio è un insieme di parole e di metodi di combinazione delle parole usati e compresi da una comunità di persone. È una

Dettagli

Algoritmo. I dati su cui opera un'istruzione sono forniti all'algoritmo dall'esterno oppure sono il risultato di istruzioni eseguite precedentemente.

Algoritmo. I dati su cui opera un'istruzione sono forniti all'algoritmo dall'esterno oppure sono il risultato di istruzioni eseguite precedentemente. Algoritmo Formalmente, per algoritmo si intende una successione finita di passi o istruzioni che definiscono le operazioni da eseguire su dei dati (=istanza del problema): in generale un algoritmo è definito

Dettagli

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI Indice 1 Le frazioni algebriche 1.1 Il minimo comune multiplo e il Massimo Comun Divisore fra polinomi........ 1. Le frazioni algebriche....................................

Dettagli

Capitolo 2. Operazione di limite

Capitolo 2. Operazione di limite Capitolo 2 Operazione di ite In questo capitolo vogliamo occuparci dell operazione di ite, strumento indispensabile per scoprire molte proprietà delle funzioni. D ora in avanti riguarderemo i domini A

Dettagli

Fasi di creazione di un programma

Fasi di creazione di un programma Fasi di creazione di un programma 1. Studio Preliminare 2. Analisi del Sistema 6. Manutenzione e Test 3. Progettazione 5. Implementazione 4. Sviluppo 41 Sviluppo di programmi Per la costruzione di un programma

Dettagli

INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI

INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI Prima di riuscire a scrivere un programma, abbiamo bisogno di conoscere un metodo risolutivo, cioè un metodo che a partire dai dati di ingresso fornisce i risultati attesi.

Dettagli

INFORMATICA 1 L. Mezzalira

INFORMATICA 1 L. Mezzalira INFORMATICA 1 L. Mezzalira Possibili domande 1 --- Caratteristiche delle macchine tipiche dell informatica Componenti hardware del modello funzionale di sistema informatico Componenti software del modello

Dettagli

Corso di Informatica Generale (C. L. Economia e Commercio) Ing. Valerio Lacagnina Rappresentazione in virgola mobile

Corso di Informatica Generale (C. L. Economia e Commercio) Ing. Valerio Lacagnina Rappresentazione in virgola mobile Problemi connessi all utilizzo di un numero di bit limitato Abbiamo visto quali sono i vantaggi dell utilizzo della rappresentazione in complemento alla base: corrispondenza biunivoca fra rappresentazione

Dettagli

Lezione 8. La macchina universale

Lezione 8. La macchina universale Lezione 8 Algoritmi La macchina universale Un elaboratore o computer è una macchina digitale, elettronica, automatica capace di effettuare trasformazioni o elaborazioni su i dati digitale= l informazione

Dettagli

FONDAMENTI di INFORMATICA L. Mezzalira

FONDAMENTI di INFORMATICA L. Mezzalira FONDAMENTI di INFORMATICA L. Mezzalira Possibili domande 1 --- Caratteristiche delle macchine tipiche dell informatica Componenti hardware del modello funzionale di sistema informatico Componenti software

Dettagli

LINGUAGGI DI PROGRAMMAZIONE

LINGUAGGI DI PROGRAMMAZIONE LINGUAGGI DI PROGRAMMAZIONE Il potere espressivo di un linguaggio è caratterizzato da: quali tipi di dati consente di rappresentare (direttamente o tramite definizione dell utente) quali istruzioni di

Dettagli

Appunti del corso di Informatica 1 (IN110 Fondamenti) 4 Linguaggi di programmazione

Appunti del corso di Informatica 1 (IN110 Fondamenti) 4 Linguaggi di programmazione Università Roma Tre Dipartimento di Matematica e Fisica Corso di Laurea in Matematica Appunti del corso di Informatica 1 (IN110 Fondamenti) 4 Linguaggi di programmazione Marco Liverani (liverani@mat.uniroma3.it)

Dettagli

Corso di Matematica per la Chimica

Corso di Matematica per la Chimica Dott.ssa Maria Carmela De Bonis a.a. 203-4 I sistemi lineari Generalità sui sistemi lineari Molti problemi dell ingegneria, della fisica, della chimica, dell informatica e dell economia, si modellizzano

Dettagli

Introduzione al MATLAB c Parte 2

Introduzione al MATLAB c Parte 2 Introduzione al MATLAB c Parte 2 Lucia Gastaldi Dipartimento di Matematica, http://dm.ing.unibs.it/gastaldi/ 18 gennaio 2008 Outline 1 M-file di tipo Script e Function Script Function 2 Costrutti di programmazione

Dettagli

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo. DALLE PESATE ALL ARITMETICA FINITA IN BASE 2 Si è trovato, partendo da un problema concreto, che con la base 2, utilizzando alcune potenze della base, operando con solo addizioni, posso ottenere tutti

Dettagli

Corso di Informatica

Corso di Informatica Corso di Informatica Modulo T2 3-Compilatori e interpreti 1 Prerequisiti Principi di programmazione Utilizzo di un compilatore 2 1 Introduzione Una volta progettato un algoritmo codificato in un linguaggio

Dettagli

Complessità Computazionale

Complessità Computazionale Complessità Computazionale Analisi Algoritmi e pseudocodice Cosa significa analizzare un algoritmo Modello di calcolo Analisi del caso peggiore e del caso medio Esempio di algoritmo in pseudocodice INSERTION

Dettagli

Come ragiona il computer. Problemi e algoritmi

Come ragiona il computer. Problemi e algoritmi Come ragiona il computer Problemi e algoritmi Il problema Abbiamo un problema quando ci poniamo un obiettivo da raggiungere e per raggiungerlo dobbiamo mettere a punto una strategia Problema Strategia

Dettagli

Corso di Informatica

Corso di Informatica Corso di Informatica Modulo T3 1-Sottoprogrammi 1 Prerequisiti Tecnica top-down Programmazione elementare 2 1 Introduzione Lo scopo di questa Unità è utilizzare la metodologia di progettazione top-down

Dettagli

DI D AGRA R MM M I M A BLOCC C H C I TEORI R A E D D E SERC R I C ZI 1 1

DI D AGRA R MM M I M A BLOCC C H C I TEORI R A E D D E SERC R I C ZI 1 1 DIAGRAMMI A BLOCCHI TEORIA ED ESERCIZI 1 1 Il linguaggio dei diagrammi a blocchi è un possibile formalismo per la descrizione di algoritmi Il diagramma a blocchi, o flowchart, è una rappresentazione grafica

Dettagli

Funzioni in C. Violetta Lonati

Funzioni in C. Violetta Lonati Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Funzioni - in breve: Funzioni Definizione di funzioni

Dettagli

3. Programmazione strutturata (testo di riferimento: Bellini-Guidi)

3. Programmazione strutturata (testo di riferimento: Bellini-Guidi) Corso di Fondamenti di Informatica Corso di Laurea in Ingegneria Meccanica (A-K) 3. (testo di riferimento: Bellini-Guidi) Ing. Agnese Pinto 1 di 28 Linguaggi di programmazione Un programma è un algoritmo

Dettagli

Introduzione alla programmazione in C

Introduzione alla programmazione in C Introduzione alla programmazione in C Testi Consigliati: A. Kelley & I. Pohl C didattica e programmazione B.W. Kernighan & D. M. Ritchie Linguaggio C P. Tosoratti Introduzione all informatica Materiale

Dettagli

Algoritmi e strutture dati. Codici di Huffman

Algoritmi e strutture dati. Codici di Huffman Algoritmi e strutture dati Codici di Huffman Memorizzazione dei dati Quando un file viene memorizzato, esso va memorizzato in qualche formato binario Modo più semplice: memorizzare il codice ASCII per

Dettagli

Uso di base delle funzioni in Microsoft Excel

Uso di base delle funzioni in Microsoft Excel Uso di base delle funzioni in Microsoft Excel Le funzioni Una funzione è un operatore che applicato a uno o più argomenti (valori, siano essi numeri con virgola, numeri interi, stringhe di caratteri) restituisce

Dettagli

Esempi di algoritmi. Lezione III

Esempi di algoritmi. Lezione III Esempi di algoritmi Lezione III Scopo della lezione Implementare da zero algoritmi di media complessità. Verificare la correttezza di un algoritmo eseguendolo a mano. Imparare a valutare le prestazioni

Dettagli

LE FUNZIONI A DUE VARIABILI

LE FUNZIONI A DUE VARIABILI Capitolo I LE FUNZIONI A DUE VARIABILI In questo primo capitolo introduciamo alcune definizioni di base delle funzioni reali a due variabili reali. Nel seguito R denoterà l insieme dei numeri reali mentre

Dettagli

Risolvere un problema significa individuare un procedimento che permetta di arrivare al risultato partendo dai dati

Risolvere un problema significa individuare un procedimento che permetta di arrivare al risultato partendo dai dati Algoritmi Algoritmi Risolvere un problema significa individuare un procedimento che permetta di arrivare al risultato partendo dai dati Il procedimento (chiamato algoritmo) è composto da passi elementari

Dettagli

LABORATORIO DI PROGRAMMAZIONE 2012 2013 EDIZIONE 1, TURNO B

LABORATORIO DI PROGRAMMAZIONE 2012 2013 EDIZIONE 1, TURNO B LABORATORIO DI PROGRAMMAZIONE 2012 2013 EDIZIONE 1, TURNO B 23.XI.2012 VINCENZO MARRA Indice Esercizio 1 1 Menu 1 Tempo: 35 min. 2 Commento 1 2 Esercizio 2 2 Ordinamento e ricerca binaria con la classe

Dettagli

10 - Programmare con gli Array

10 - Programmare con gli Array 10 - Programmare con gli Array Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it

Dettagli

Nozione di algoritmo. Gabriella Trucco

Nozione di algoritmo. Gabriella Trucco Nozione di algoritmo Gabriella Trucco Programmazione Attività con cui si predispone l'elaboratore ad eseguire un particolare insieme di azioni su particolari informazioni (dati), allo scopo di risolvere

Dettagli

Corso di Calcolo Numerico

Corso di Calcolo Numerico Corso di Calcolo Numerico Dott.ssa M.C. De Bonis Università degli Studi della Basilicata, Potenza Facoltà di Ingegneria Corso di Laurea in Ingegneria Meccanica Sistemi di Numerazione Sistema decimale La

Dettagli

I sistemi di numerazione

I sistemi di numerazione I sistemi di numerazione 01-INFORMAZIONE E SUA RAPPRESENTAZIONE Sia dato un insieme finito di caratteri distinti, che chiameremo alfabeto. Utilizzando anche ripetutamente caratteri di un alfabeto, si possono

Dettagli

Convertitori numerici in Excel

Convertitori numerici in Excel ISTITUTO DI ISTRUZIONE SUPERIORE G. M. ANGIOY CARBONIA Convertitori numerici in Excel Prof. G. Ciaschetti Come attività di laboratorio, vogliamo realizzare dei convertitori numerici con Microsoft Excel

Dettagli

SISTEMI DI NUMERAZIONE E CODICI

SISTEMI DI NUMERAZIONE E CODICI SISTEMI DI NUMERAZIONE E CODICI Il Sistema di Numerazione Decimale Il sistema decimale o sistema di numerazione a base dieci usa dieci cifre, dette cifre decimali, da O a 9. Il sistema decimale è un sistema

Dettagli

EVOLUZIONE DEI LINGUAGGI DI ALTO LIVELLO

EVOLUZIONE DEI LINGUAGGI DI ALTO LIVELLO EVOLUZIONE DEI LINGUAGGI DI ALTO LIVELLO Linguaggi di programmazione classificati in base alle loro caratteristiche fondamentali. Linguaggio macchina, binario e fortemente legato all architettura. Linguaggi

Dettagli

Introduzione agli algoritmi e alla programmazione in VisualBasic.Net

Introduzione agli algoritmi e alla programmazione in VisualBasic.Net Lezione 1 Introduzione agli algoritmi e alla programmazione in VisualBasic.Net Definizione di utente e di programmatore L utente è qualsiasi persona che usa il computer anche se non è in grado di programmarlo

Dettagli

Dispensa di Informatica I.1

Dispensa di Informatica I.1 IL COMPUTER: CONCETTI GENERALI Il Computer (o elaboratore) è un insieme di dispositivi di diversa natura in grado di acquisire dall'esterno dati e algoritmi e produrre in uscita i risultati dell'elaborazione.

Dettagli

Esercizi per il corso di Algoritmi e Strutture Dati

Esercizi per il corso di Algoritmi e Strutture Dati 1 Esercizi per il corso di Algoritmi e Strutture Dati Esercizi sulla Tecnica Divide et Impera N.B. Tutti gli algoritmi vanno scritti in pseudocodice (non in Java, né in C++, etc. ). Di tutti gli algoritmi

Dettagli

LE SUCCESSIONI 1. COS E UNA SUCCESSIONE

LE SUCCESSIONI 1. COS E UNA SUCCESSIONE LE SUCCESSIONI 1. COS E UNA SUCCESSIONE La sequenza costituisce un esempio di SUCCESSIONE. Ecco un altro esempio di successione: Una successione è dunque una sequenza infinita di numeri reali (ma potrebbe

Dettagli

Il concetto di valore medio in generale

Il concetto di valore medio in generale Il concetto di valore medio in generale Nella statistica descrittiva si distinguono solitamente due tipi di medie: - le medie analitiche, che soddisfano ad una condizione di invarianza e si calcolano tenendo

Dettagli

Variabili e tipi di dato

Variabili e tipi di dato Variabili e tipi di dato Tutte le variabili devono essere dichiarate, specificandone il tipo La dichiarazione deve precedere l uso Il tipo è un concetto astratto che esprime: L allocazione di spazio per

Dettagli

Prof. Giuseppe Chiumeo. Avete già studiato che qualsiasi algoritmo appropriato può essere scritto utilizzando soltanto tre strutture di base:

Prof. Giuseppe Chiumeo. Avete già studiato che qualsiasi algoritmo appropriato può essere scritto utilizzando soltanto tre strutture di base: LA STRUTTURA DI RIPETIZIONE La ripetizione POST-condizionale La ripetizione PRE-condizionale INTRODUZIONE (1/3) Avete già studiato che qualsiasi algoritmo appropriato può essere scritto utilizzando soltanto

Dettagli

Appunti di Sistemi Elettronici

Appunti di Sistemi Elettronici Prof.ssa Maria Rosa Malizia 1 LA PROGRAMMAZIONE La programmazione costituisce una parte fondamentale dell informatica. Infatti solo attraverso di essa si apprende la logica che ci permette di comunicare

Dettagli

La selezione binaria

La selezione binaria Andrea Marin Università Ca Foscari Venezia Laurea in Informatica Corso di Programmazione part-time a.a. 2011/2012 Introduzione L esecuzione di tutte le istruzioni in sequenza può non è sufficiente per

Dettagli

SISTEMI DI NUMERAZIONE DECIMALE E BINARIO

SISTEMI DI NUMERAZIONE DECIMALE E BINARIO SISTEMI DI NUMERAZIONE DECIMALE E BINARIO Il sistema di numerazione decimale (o base dieci) possiede dieci possibili valori (0, 1, 2, 3, 4, 5, 6, 7, 8 o 9) utili a rappresentare i numeri. Le cifre possiedono

Dettagli

Dispense di Informatica per l ITG Valadier

Dispense di Informatica per l ITG Valadier La notazione binaria Dispense di Informatica per l ITG Valadier Le informazioni dentro il computer All interno di un calcolatore tutte le informazioni sono memorizzate sottoforma di lunghe sequenze di

Dettagli

Più processori uguale più velocità?

Più processori uguale più velocità? Più processori uguale più velocità? e un processore impiega per eseguire un programma un tempo T, un sistema formato da P processori dello stesso tipo esegue lo stesso programma in un tempo TP T / P? In

Dettagli

Programmazione dinamica

Programmazione dinamica Capitolo 6 Programmazione dinamica 6.4 Il problema della distanza di edit tra due stringhe x e y chiede di calcolare il minimo numero di operazioni su singoli caratteri (inserimento, cancellazione e sostituzione)

Dettagli

Fondamenti di Informatica PROBLEMI E ALGORITMI. Fondamenti di Informatica - D. Talia - UNICAL 1

Fondamenti di Informatica PROBLEMI E ALGORITMI. Fondamenti di Informatica - D. Talia - UNICAL 1 Fondamenti di Informatica PROBLEMI E ALGORITMI Fondamenti di Informatica - D. Talia - UNICAL 1 Specifica di un algoritmo Primo approccio, scrittura diretta del programma: la soluzione coincide con la codifica

Dettagli

Informatica. Rappresentazione dei numeri Numerazione binaria

Informatica. Rappresentazione dei numeri Numerazione binaria Informatica Rappresentazione dei numeri Numerazione binaria Sistemi di numerazione Non posizionali: numerazione romana Posizionali: viene associato un peso a ciascuna posizione all interno della rappresentazione

Dettagli

Correttezza. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 10. A. Miola Novembre 2007

Correttezza. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 10. A. Miola Novembre 2007 Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1 Dispensa 10 Correttezza A. Miola Novembre 2007 http://www.dia.uniroma3.it/~java/fondinf1/ Correttezza 1 Contenuti Introduzione alla correttezza

Dettagli

Obiettivi dell Analisi Numerica. Avviso. Risoluzione numerica di un modello. Analisi Numerica e Calcolo Scientifico

Obiettivi dell Analisi Numerica. Avviso. Risoluzione numerica di un modello. Analisi Numerica e Calcolo Scientifico M. Annunziato, DIPMAT Università di Salerno - Queste note non sono esaustive ai fini del corso p. 3/43 M. Annunziato, DIPMAT Università di Salerno - Queste note non sono esaustive ai fini del corso p.

Dettagli

DAL DIAGRAMMA AL CODICE

DAL DIAGRAMMA AL CODICE DAL DIAGRAMMA AL CODICE Un diagramma di flusso Appare, come un insieme di blocchi di forme diverse che contengono le istruzioni da eseguire, collegati fra loro da linee orientate che specificano la sequenza

Dettagli

Rappresentazione dei numeri in un calcolatore

Rappresentazione dei numeri in un calcolatore Corso di Calcolatori Elettronici I A.A. 2010-2011 Rappresentazione dei numeri in un calcolatore Lezione 2 Università degli Studi di Napoli Federico II Facoltà di Ingegneria Rappresentazione dei numeri

Dettagli

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP)

12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) 12 - Introduzione alla Programmazione Orientata agli Oggetti (Object Oriented Programming OOP) Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica,

Dettagli

Codifica: dal diagramma a blocchi al linguaggio C++

Codifica: dal diagramma a blocchi al linguaggio C++ Codifica: dal diagramma a blocchi al linguaggio C++ E necessario chiarire inizialmente alcuni concetti. La compilazione Il dispositivo del computer addetto all esecuzione dei programmi è la CPU La CPU

Dettagli

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto:

Tipi primitivi. Ad esempio, il codice seguente dichiara una variabile di tipo intero, le assegna il valore 5 e stampa a schermo il suo contenuto: Tipi primitivi Il linguaggio Java offre alcuni tipi di dato primitivi Una variabile di tipo primitivo può essere utilizzata direttamente. Non è un riferimento e non ha senso tentare di istanziarla mediante

Dettagli

Linguaggi di programmazione

Linguaggi di programmazione Linguaggi di programmazione Un calcolatore basato sul modello di von Neumann permette l esecuzione di un programma, cioè di una sequenza di istruzioni descritte nel linguaggio interpretabile dal calcolatore

Dettagli

( x) ( x) 0. Equazioni irrazionali

( x) ( x) 0. Equazioni irrazionali Equazioni irrazionali Definizione: si definisce equazione irrazionale un equazione in cui compaiono uno o più radicali contenenti l incognita. Esempio 7 Ricordiamo quanto visto sulle condizioni di esistenza

Dettagli

Le equazioni. Diapositive riassemblate e rielaborate da prof. Antonio Manca da materiali offerti dalla rete.

Le equazioni. Diapositive riassemblate e rielaborate da prof. Antonio Manca da materiali offerti dalla rete. Le equazioni Diapositive riassemblate e rielaborate da prof. Antonio Manca da materiali offerti dalla rete. Definizione e caratteristiche Chiamiamo equazione l uguaglianza tra due espressioni algebriche,

Dettagli

Cosa è un foglio elettronico

Cosa è un foglio elettronico Cosa è un foglio elettronico Versione informatica del foglio contabile Strumento per l elaborazione di numeri (ma non solo...) I valori inseriti possono essere modificati, analizzati, elaborati, ripetuti

Dettagli

la scienza della rappresentazione e della elaborazione dell informazione

la scienza della rappresentazione e della elaborazione dell informazione Sistema binario Sommario informatica rappresentare informazioni la differenza Analogico/Digitale i sistemi di numerazione posizionali il sistema binario Informatica Definizione la scienza della rappresentazione

Dettagli

Informazione analogica e digitale

Informazione analogica e digitale L informazione L informazione si può: rappresentare elaborare gestire trasmettere reperire L informatica offre la possibilità di effettuare queste operazioni in modo automatico. Informazione analogica

Dettagli

Ottimizzazione delle interrogazioni (parte I)

Ottimizzazione delle interrogazioni (parte I) Ottimizzazione delle interrogazioni I Basi di Dati / Complementi di Basi di Dati 1 Ottimizzazione delle interrogazioni (parte I) Angelo Montanari Dipartimento di Matematica e Informatica Università di

Dettagli

Processo di risoluzione di un problema ingegneristico. Processo di risoluzione di un problema ingegneristico

Processo di risoluzione di un problema ingegneristico. Processo di risoluzione di un problema ingegneristico Processo di risoluzione di un problema ingegneristico 1. Capire l essenza del problema. 2. Raccogliere le informazioni disponibili. Alcune potrebbero essere disponibili in un secondo momento. 3. Determinare

Dettagli

Analisi sensitività. Strumenti per il supporto alle decisioni nel processo di Valutazione d azienda

Analisi sensitività. Strumenti per il supporto alle decisioni nel processo di Valutazione d azienda Analisi sensitività. Strumenti per il supporto alle decisioni nel processo di Valutazione d azienda Premessa Con l analisi di sensitività il perito valutatore elabora un range di valori invece di un dato

Dettagli

Dimensione di uno Spazio vettoriale

Dimensione di uno Spazio vettoriale Capitolo 4 Dimensione di uno Spazio vettoriale 4.1 Introduzione Dedichiamo questo capitolo ad un concetto fondamentale in algebra lineare: la dimensione di uno spazio vettoriale. Daremo una definizione

Dettagli

Il database management system Access

Il database management system Access Il database management system Access Corso di autoistruzione http://www.manualipc.it/manuali/ corso/manuali.php? idcap=00&idman=17&size=12&sid= INTRODUZIONE Il concetto di base di dati, database o archivio

Dettagli

GESTIONE INFORMATICA DEI DATI AZIENDALI

GESTIONE INFORMATICA DEI DATI AZIENDALI GESTIONE INFORMATICA DEI DATI AZIENDALI Alberto ZANONI Centro Vito Volterra Università Tor Vergata Via Columbia 2, 00133 Roma, Italy zanoni@volterra.uniroma2.it Rudimenti di programmazione Programming

Dettagli

Numeri naturali numeri naturali minore maggiore Operazioni con numeri naturali

Numeri naturali numeri naturali minore maggiore Operazioni con numeri naturali 1 Numeri naturali La successione di tutti i numeri del tipo: 0,1, 2, 3, 4,..., n,... forma l'insieme dei numeri naturali, che si indica con il simbolo N. Tale insieme si può disporre in maniera ordinata

Dettagli

+ / operatori di confronto (espressioni logiche/predicati) / + 5 3 9 = > < Pseudo codice. Pseudo codice

+ / operatori di confronto (espressioni logiche/predicati) / + 5 3 9 = > < Pseudo codice. Pseudo codice Pseudo codice Pseudo codice Paolo Bison Fondamenti di Informatica A.A. 2006/07 Università di Padova linguaggio testuale mix di linguaggio naturale ed elementi linguistici con sintassi ben definita e semantica

Dettagli

Matematica generale CTF

Matematica generale CTF Successioni numeriche 19 agosto 2015 Definizione di successione Monotonìa e limitatezza Forme indeterminate Successioni infinitesime Comportamento asintotico Criterio del rapporto per le successioni Definizione

Dettagli

Slide Cerbara parte1 5. Le distribuzioni teoriche

Slide Cerbara parte1 5. Le distribuzioni teoriche Slide Cerbara parte1 5 Le distribuzioni teoriche I fenomeni biologici, demografici, sociali ed economici, che sono il principale oggetto della statistica, non sono retti da leggi matematiche. Però dalle

Dettagli

Alessandro Pellegrini

Alessandro Pellegrini Esercitazione sulle Rappresentazioni Numeriche Esistono 1 tipi di persone al mondo: quelli che conoscono il codice binario e quelli che non lo conoscono Alessandro Pellegrini Cosa studiare prima Conversione

Dettagli

Introduzione. Informatica B. Daniele Loiacono

Introduzione. Informatica B. Daniele Loiacono Introduzione Informatica B Perchè studiare l informatica? Perchè ha a che fare con quasi tutto quello con cui abbiamo a che fare ogni giorno Perché è uno strumento fondamentale per progettare l innovazione

Dettagli

Cenni su algoritmi, diagrammi di flusso, strutture di controllo

Cenni su algoritmi, diagrammi di flusso, strutture di controllo Cenni su algoritmi, diagrammi di flusso, strutture di controllo Algoritmo Spesso, nel nostro vivere quotidiano, ci troviamo nella necessità di risolvere problemi. La descrizione della successione di operazioni

Dettagli

Introduzione. Classificazione di Flynn... 2 Macchine a pipeline... 3 Macchine vettoriali e Array Processor... 4 Macchine MIMD... 6

Introduzione. Classificazione di Flynn... 2 Macchine a pipeline... 3 Macchine vettoriali e Array Processor... 4 Macchine MIMD... 6 Appunti di Calcolatori Elettronici Esecuzione di istruzioni in parallelo Introduzione... 1 Classificazione di Flynn... 2 Macchine a pipeline... 3 Macchine vettoriali e Array Processor... 4 Macchine MIMD...

Dettagli

Linguaggi per COMUNICARE. Il linguaggio è un sistema codificato di segni che consente la comunicazione, intesa come scambio di informazioni

Linguaggi per COMUNICARE. Il linguaggio è un sistema codificato di segni che consente la comunicazione, intesa come scambio di informazioni Linguaggi per COMUNICARE Il linguaggio è un sistema codificato di segni che consente la comunicazione, intesa come scambio di informazioni Sintassi e semantica dei linguaggi Un informazione può : Essere

Dettagli

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica

Algebra di Boole: Concetti di base. Fondamenti di Informatica - D. Talia - UNICAL 1. Fondamenti di Informatica Fondamenti di Informatica Algebra di Boole: Concetti di base Fondamenti di Informatica - D. Talia - UNICAL 1 Algebra di Boole E un algebra basata su tre operazioni logiche OR AND NOT Ed operandi che possono

Dettagli

Sistema operativo: Gestione della memoria

Sistema operativo: Gestione della memoria Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Sistema operativo: Gestione della memoria La presente dispensa e

Dettagli

Gli algoritmi: definizioni e proprietà

Gli algoritmi: definizioni e proprietà Dipartimento di Elettronica ed Informazione Politecnico di Milano Informatica e CAD (c.i.) - ICA Prof. Pierluigi Plebani A.A. 2008/2009 Gli algoritmi: definizioni e proprietà La presente dispensa e da

Dettagli

Capitolo 13: L offerta dell impresa e il surplus del produttore

Capitolo 13: L offerta dell impresa e il surplus del produttore Capitolo 13: L offerta dell impresa e il surplus del produttore 13.1: Introduzione L analisi dei due capitoli precedenti ha fornito tutti i concetti necessari per affrontare l argomento di questo capitolo:

Dettagli

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a. 2009-10. prof.

Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica. Programmazione I - corso B a.a. 2009-10. prof. Università di Torino Facoltà di Scienze MFN Corso di Studi in Informatica Programmazione I - corso B a.a. 009-10 prof. Viviana Bono Blocco 9 Metodi statici: passaggio parametri, variabili locali, record

Dettagli

PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI

PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI PROBLEMA DELLA RICERCA DI UN ELEMENTO IN UN ARRAY E ALGORITMI RISOLUTIVI PROBLEMA DELLA RICERCA in termini generali: Dati in input un insieme S di elementi (numeri, caratteri, stringhe, ) e un elemento

Dettagli

Il simbolo. è è = = = In simboli: Sia un numero naturale diverso da zero, il radicale. Il radicale. esiste. esiste 0 Il radicale

Il simbolo. è è = = = In simboli: Sia un numero naturale diverso da zero, il radicale. Il radicale. esiste. esiste 0 Il radicale Radicali 1. Radice n-esima Terminologia Il simbolo è detto radicale. Il numero è detto radicando. Il numero è detto indice del radicale. Il numero è detto coefficiente del radicale. Definizione Sia un

Dettagli

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

3 - Variabili. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo 3 - Variabili Programmazione e analisi di dati Modulo A: Programmazione in Java Paolo Milazzo Dipartimento di Informatica, Università di Pisa http://www.di.unipi.it/ milazzo milazzo di.unipi.it Corso di

Dettagli

MANUALE MOODLE STUDENTI. Accesso al Materiale Didattico

MANUALE MOODLE STUDENTI. Accesso al Materiale Didattico MANUALE MOODLE STUDENTI Accesso al Materiale Didattico 1 INDICE 1. INTRODUZIONE ALLA PIATTAFORMA MOODLE... 3 1.1. Corso Moodle... 4 2. ACCESSO ALLA PIATTAFORMA... 7 2.1. Accesso diretto alla piattaforma...

Dettagli

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni

Dall Algoritmo al Programma. Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni Dall Algoritmo al Programma Prof. Francesco Accarino IIS Altiero Spinelli Sesto San Giovanni IL PROGRAMMA Gli algoritmi sono modelli di descrizione astratti e per controllarne il funzionamento devono essere

Dettagli

CREAZIONE DI UN DATABASE E DI TABELLE IN ACCESS

CREAZIONE DI UN DATABASE E DI TABELLE IN ACCESS CONTENUTI: CREAZIONE DI UN DATABASE E DI TABELLE IN ACCESS Creazione database vuoto Creazione tabella Inserimento dati A) Creazione di un database vuoto Avviamo il programma Microsoft Access. Dal menu

Dettagli

Note su quicksort per ASD 2010-11 (DRAFT)

Note su quicksort per ASD 2010-11 (DRAFT) Note su quicksort per ASD 010-11 (DRAFT) Nicola Rebagliati 7 dicembre 010 1 Quicksort L algoritmo di quicksort è uno degli algoritmi più veloci in pratica per il riordinamento basato su confronti. L idea

Dettagli

Architettura hardware

Architettura hardware Architettura dell elaboratore Architettura hardware la parte che si può prendere a calci Sistema composto da un numero elevato di componenti, in cui ogni componente svolge una sua funzione elaborazione

Dettagli

Logica Numerica Approfondimento 1. Minimo Comune Multiplo e Massimo Comun Divisore. Il concetto di multiplo e di divisore. Il Minimo Comune Multiplo

Logica Numerica Approfondimento 1. Minimo Comune Multiplo e Massimo Comun Divisore. Il concetto di multiplo e di divisore. Il Minimo Comune Multiplo Logica Numerica Approfondimento E. Barbuto Minimo Comune Multiplo e Massimo Comun Divisore Il concetto di multiplo e di divisore Considerato un numero intero n, se esso viene moltiplicato per un numero

Dettagli

Informatica B a.a 2005/06 (Meccanici 4 squadra) PhD. Ing. Michele Folgheraiter

Informatica B a.a 2005/06 (Meccanici 4 squadra) PhD. Ing. Michele Folgheraiter Informatica B a.a 2005/06 (Meccanici 4 squadra) Scaglione: da PO a ZZZZ PhD. Ing. Michele Folgheraiter Architettura del Calcolatore Macchina di von Neumann Il calcolatore moderno è basato su un architettura

Dettagli

Librerie digitali. Video. Gestione di video. Caratteristiche dei video. Video. Metadati associati ai video. Metadati associati ai video

Librerie digitali. Video. Gestione di video. Caratteristiche dei video. Video. Metadati associati ai video. Metadati associati ai video Video Librerie digitali Gestione di video Ogni filmato è composto da più parti Video Audio Gestito come visto in precedenza Trascrizione del testo, identificazione di informazioni di interesse Testo Utile

Dettagli

Sistemi di Numerazione

Sistemi di Numerazione Fondamenti di Informatica per Meccanici Energetici - Biomedici 1 Sistemi di Numerazione Sistemi di Numerazione I sistemi di numerazione sono abitualmente posizionali. Gli elementi costitutivi di un sistema

Dettagli

Reti sequenziali sincrone

Reti sequenziali sincrone Reti sequenziali sincrone Un approccio strutturato (7.1-7.3, 7.5-7.6) Modelli di reti sincrone Analisi di reti sincrone Descrizioni e sintesi di reti sequenziali sincrone Sintesi con flip-flop D, DE, T

Dettagli