Laboratorio di Algoritmi e Strutture Dati
|
|
|
- Leone Fabbri
- 10 anni fa
- Visualizzazioni
Transcript
1 Laboratorio di Algoritmi e Strutture Dati Docente: Camillo Fiorentini 18 dicembre 2007 Esercizio 1: rappresentazione di una tabella di occorrenze L obiettivo è quello di rappresentare in modo efficiente una tabella di occorrenze, ossia una tabella che permette di contare le parole che compaiono in un testo. Formalmente, una occorrenza è una coppia word, num, dove word è una parola e num un intero positivo che rappresenta il numero di occorrenze di word. Operazioni Si richiede di implementare una struttura dati efficiente che permette di eseguire le seguenti operazioni. - addword(word) Se la parola word non è nella tabella, aggiunge alla tabella l occorrenza word, 1. Altrimenti incrementa di uno il numero di occorrenze di word. - addwordfromfile(f ilen ame) Se non esiste alcun file di nome filename stampa un messaggio di errore. Altrimenti, per ogni parola word nel file f ilen ame compie l operazione addword(word). - delword(word) Se la parola word è nella tabella, decrementa di uno il numero di occorrenze di word. Se il numero di occorrenze diventa 0, l occorrenza contenente word è tolta dalla tabella (è inutile mantenere nella tabella le coppie word, 0 ). - printocc(word) Stampa il numero di occorrenze della parola word. - printtab() Stampa il contenuto della tabella in ordine alfabetico (come nell esempio più avanti). Se la tabella è vuota, stampa un messaggio opportuno. - printtabinv() Stampa il contenuto della tabella in ordine alfabetico inverso (come nell esempio più avanti). Se la tabella è vuota, stampa un messaggio opportuno. Formato per l input e l output Il programma deve leggere da standard input una sequenza di linee, ciascuna delle quali corrisponde a una linea della prima colonna della tabella qui sotto, dove word è una parola e filename è il nome di un file. Si assume che tutte le parole abbiano al massimo WORD caratteri, dove il valore di WORD è definito nel programma. 1
2 Quando una linea è letta, viene eseguita l operazione associata. Le operazioni di stampa sono effettuate sullo standard output e ogni operazione deve iniziare su una nuova linea. Istruzione in input Operazione + word addword(word) r f ilen ame addwordfromfile(f ilen ame) - word delword(word)? word printocc(word) p printtab() i printtabinv() f termina l esecuzione Si assume che l input sia secondo il formato della tabella e che il file filename contenga delle parole aventi al massimo WORD caratteri separate da uno o più caratteri di spaziatura (spazi, a capo, ecc.). Struttura dati Occorre rappresentare un insieme di occorrenze su cui siano definite le usuali operazioni sugli insiemi dinamici (inserimento, cancellazione, ricerca, ecc.). Per rappresentare una occorrenza word, num usare la struttura struct occorrenza{ char* word; int num; }; typedef struct occorrenza occorrenza; Poiché tutte le operazioni (a parte le operazioni di stampa) richiedono la ricerca di una parola, occorre usare una struttura dati in cui la ricerca per nome sia efficiente. Utilizziamo un albero binario di ricerca dove: - L insieme V dei nodi è l insieme delle occorrenze word, num. - La relazione < sull insieme V è definita come segue word 1, num 1 < word 2, num 2 w 1 < l w 2 dove w 1 < l w 2 se e solo se w 1 è minore di w 2 rispetto all ordinamento lessicografico sulle parole. È facile verificare che < è un ordinamento lineare. 2
3 Per rappresentare un nodo dell albero usare la struttura: struct nodo { occorrenza* key; // indirizzo occorrenza rappresentata dal nodo struct nodo* up; struct nodo* left; struct nodo* right; }; typedef struct nodo nodo; Il campo key di un nodo dell albero di ricerca è l indirizzo dell occorrenza contenuta nel nodo; i campi up, left e right hanno il solito significato (indirizzo del nodi padre, figlio sinistro e figlio destro). Esempio Supponiamo che l input sia + il + cane + il + gatto + il + topo + il + gatto Dopo queste operazioni, viene costruito l insieme di occorrenze I occ così definito: L albero binario di ricerca ottenuto è: I occ = { il, 4, cane, 1, gatto, 2, topo, 1 } < il, 4 > <cane, 1> <topo, 1> <gatto, 2> Nota Se si cambia l ordine delle istruzioni di input, i nodi potrebbero essere disposti in modo diverso, tuttavia l insieme rappresentato è lo stesso I occ definito sopra. 3
4 Per rappresentare l albero delle occorrenze, in main() va definita una variabile root di tipo nodo* che rappresenta la radice dell albero. Questo significa che root vale NULL se l albero è vuoto, altrimenti root è l indirizzo del nodo radice dell albero. La rappresentazione in memoria dell albero della figura precedente è (per chiarezza le frecce corrispondenti ai campi up non sono segnate): root key up right word num 4 i l \0 left word num 1 c a n e \0 key key up right... up right... word num 1 t o p o \0 left left key up... word g a t t o \0 right num 2 left L output del comando p è: OCCORRENZE: cane 1 gatto 2 il 4 topo 1 L output del comando i è: OCCORRENZE: topo 1 il 4 gatto 2 cane 1 4
5 Struttura del codice Occorre completare il programma occ.c. Per gestire le operazioni sull albero si possono usare le funzioni per gli alberi binari di ricerca nel file tree.c. Tuttavia in C, a differenza di quanto avviene in Java (o più in generale nei linguaggi object oriented), per poter riutilizzare del codice occorre spesso intervenire per riscriverne delle parti. Le funzioni di tree.c riguardano alberi binari di ricerca di interi, infatti il campo next della struttura struct node (definita in tree.h) ha tipo int. Quindi vanno riscritte le parti in cui viene utilizzata l informazione del campo key di un nodo. Scrivere il codice delle operazioni seguendo l ordine qui indicato. addword(word) Occorre definire le seguenti funzioni. (1) La funzione occorrenza* newoccorrenza(char *w) crea l occorrenza w, 1 e restituisce un puntatore alla nuova occorrenza. L occorrenza deve contenere una nuova copia di w (usare la funzione newword()). (2) La funzione node* newnode(char* w) crea un nodo contenente l occorrenza w, 1 e restituisce un puntatore al nuovo nodo. Copiare la funzione newnode() di tree.c inizializzando correttamente il campo key del nuovo nodo (l occorrenza va creata con la funzione newoccorrenza()). (3) La funzione node *treeinsert(char *w, node *r) inserisce un nodo contenente l occorrenza w, 1 nell albero di radice r e restituisce l indirizzo del nuovo nodo. Copiare le funzione treeinsert() di tree.c facendo le dovute modifiche. In particolare, vanno modificate istruzioni n < q->key n < pq ->key che confrontano la chiave da inserire con la chiave di un nodo dell albero. Per il confronto, occorre definite una funzione strminore() per il confronto di parole. (4) La funzione node *findword(char *w, node *r) 5
6 cerca un nodo contenente l occorrenza di w nell albero r (ossia, il campo key del nodo è l indirizzo a una occorrenza contenente la parola w). Se il nodo esiste restituisce il suo indirizzo, altrimenti restituisce NULL. Copiare la funzione treefind() di tree.c riscrivendo opportunamente il codice per il confronto. In particolare, per controllare l uguaglianza definire una funzione struguale(). (5) La funzione void incrementaocc(node *p) incrementa di 1 il valore di num dell occorrenza in p. Si può ora scrivere il codice della funzione void addword(char *w, node **proot) che implementa l operazione addword(word), dove proot è un puntatore alla radice dell albero delle occorrenze (passaggio per indirizzo). Questo significa che, all interno della funzione, per denotare la radice dell albero si può usare l espressione *proot. Si noti che per implementare l operazione addword(word) occorre un parametro in più rispetto a quelli nominati nella sua definizione astratta. printocc(word) Occorre anzitutto scrivere il codice della funzione void printnode(node *p) che stampa l occorrenza nel nodo p. Scrivere quindi il codice della funzione void printocc(char *word, node* r) che implementa l operazione printocc(word), dove r è la radice dell albero delle occorrenze. Nell esempio precedente, le istruzioni? il? bue devono stampare il 4 bue 0 printtab() Per stampare la tabella in ordine alfabetico, occorre stampare l albero delle occorrenza facendo una visita inorder (se l albero non è vuoto, si stampa il sottoalbero sinistro, poi la radice, poi l albero destro). Scrivere il codice della funzione 6
7 void printinorder(node *r) che stampa l albero delle occorrenze r nel modo descritto. Scrivere quindi il codice della funzione void printtab(node *r) che implementa l operaziome printtab(), dove r è la radice dell albero delle occorrenze. printtabinv() Per stampare la tabella in ordine alfabetico inverso, occorre visitare i sottoalberi in ordine inverso rispetto al caso precedente. Procedere come nel punto precedente scrivendo il codice delle funzioni void printinorderinv(node *r) e void printtabinv(node *r) addfromfile(f ilen ame) Scrivere il codice della funzione void addfromfile(char* filename, node **proot) che implementa l operazione addfromfile(f ilen ame), dove proot è un puntatore alla radice dell albero delle occorrenze (passaggio per indirizzo). Occorre: - Aprire in lettura il file di nome filename con l istruzione fp = fopen(filename,"r"); dove la variabile fp deve avere tipo FILE* (file pointer). Se il file non esiste, fopen() restituisce NULL. - Leggere una parola per volta dal file fp chiamando fscanf(fp, "%s", word) dove word è un array di char (definire la dimensione in modo corretto!). La funzione fscanf() si comporta come scanf() (il primo parametro deve essere il file pointer associato al file da cui leggere), quindi salta automaticamente gli spazi fra le parole e resituisce 1 se è stata letta una stringa, EOF se il file è terminato. Per aggiungere la parola letta nell albero delle occorrenze usare addword(). - Al termine della lettura, il file fp va chiuso: fclose(fp); 7
8 delword(word) La funzione treedelete() di tree.c non richiede alcuna manipolazione. Occorre definire le seguenti funzioni. - La funzione void freenode(node *p) cancella la memoria occupata dal nodo p (va cancellato tutto lo spazio di memoria utilizzato per rappresentare il nodo). - La funzione void decrementaocc(node *p) decrementa di 1 il valore di num dell occorrenza in p. Si può ora scrivere il codice di void delword(char *word, node **proot) che implementa l operazione delword(word), dove proot è un puntatore alla radice dell albero delle occorrenze (passaggio per indirizzo). Ulteriori operazioni 1. Aggiungere una operazione per cancellare tutta la tabella. 2. Aggiungere una operazione per stampare la tabella in ordine di numero di occorrenze. Nell esempio precedente deve essere stampato: OCCORRENZE: il 4 gatto 2 cane 1 topo 1 In questo caso la struttura dati non permette di usare una strategia efficiente (non sempre esiste una struttura dati che risulti efficiente per tutte le operazioni richieste!). Occorre copiare le occorrenze in un array e ordinarlo. 3. Assumere che le parole abbiano lunghezza arbitraria (occorre scrivere una opportuna funzione strread() che legge una parola la cui lunghezza non è nota a priori e restituisce l array contenente la parola letta). 8
9 1 Esercizio 2: alberi generati casualmente Lo scopo è quello di scrivere un programma che genera casualmente un albero binario di ricerca contenente 2 k nodi, dove k è un valore inserito dall utente, in modo da valutare sperimentalmente quanto l altezza dell albero ottenuto si discosti dal valore minimo k e dal valore massimo 2 k 1. Per semplicità, consideriamo alberi di interi. 1. Scrivere in un file trand.c il codice della funzione node *treerand(int k) che genera un albero binario di ricerca contenente k nodi distinti generati casualmente e restituisce la radice dell albero ottenuto. Usare le funzioni in tree.c (in trand.c occorre includere tree.h). Suggerimento. Anzitutto occorre creare l albero vuoto. Quindi, si genera con rand() un intero casuale e, se non è già contenuto nell albero (verificarlo con treefind()), lo si inserisce (con treeinsert()). L operazione va ripetuta fino a quando sono stati inseriti k interi, quindi si restituisce la radice dell albero. In realtà la funzione non è molto efficiente nel caso k assuma valori molto alti in quanto il generatore potrebbe aver difficoltà a generare numeri nuovi (non ancora inseriti nell albero). 2. Per verificare il comportamento di treerand(), scrivere in trand.c una funzione main() che legge un intero k da standard input, genera un albero casuale di k elementi e lo stampa. Il programma termina quando viene inserito 0. Per compilarlo: gcc trand.c tree.c Ricordarsi che il generatore di numeri casuali va inizializzato ponendo all inizio di main() l istruzione srand(time(null)); // occorre includere <time.h> 3. Scrivere un programma che legge da standard input un intero k, genera un albero casuale di 2 k nodi e stampa il valore dell altezza dell albero ottenuto. Il programma termina quando viene inserito 0. Risultati ottenuti con k = 10 (1024 nodi): Altezza: 18 Altezza: 22 Altezza: 20 L altezza è vicina al valore minimo 10 (come ci si aspetta dal teorema visto a lezione). 4. Scrivere un programma che legge da standard input due interi k e h, quindi genera degli alberi casuali di 2 k nodi terminando quando viene generato un albero di altezza maggiore o uguale a h (si assume k h 2 k 1). Al termine dell esecuzione, il programma stampa il numero di alberi generati. 9
10 Esercizio 3: costruzione di un albero binario Lo scopo dell esercizio è quello di scrivere delle funzioni per costruire un alberi binario di interi a partire dalla sua definizione. Per l input usiamo la seguente convenzione. - L albero vuoto è denotato dal carattere b. - L albero n, T 1, T 2 (dove n è un intero positivo) è denotato da < n L R > dove L e R denotano rispettivamente T 1 e T 2. La descrizione di un albero è letta da standard input e deve terminare con end-of file. I vari simboli (token) della descrizione possono essere separati da uno o più caratteri di spaziatura (spazio, a capo, tabulazione, ecc.). L albero può essere descritto da < 50 < 13 b <38 b b> > < 75 < 60 < 55 b b> <85 b b> > b > > oppure <50 <13 b <38bb>> < 75 <60 <55bb><85bb>> b> > La descrizione di un albero viene codificata nel programma come una successione di interi (che sarà memorizzata in un array). Per codificare i caratteri <, > e b in modo che non vengano confusi con i valori di un nodo usare le seguenti definizioni: #define BEGIN_TREE -1 // inizio albero #define END_TREE -2 // fine albero #define EMPTY_TREE -3 // albero vuoto 10
11 Ad esempio, < 10 b <20bb> > è memorizzato come: a. Scrivere il codice della funzione int nextsymbol() che legge il prossimo simbolo da standard input e restituisce il codice corrispondente al simbolo letto. Se viene letto end-of-file, restituisce STOP definito come #define STOP -4 Si noti che in questo caso è pericoloso restituire EOF perché tale valore potrebbe coincidere con uno dei valori usati nelle definizioni precedenti. Suggerimento. Conviene anzitutto cercare di leggere da standard input un intero con la chiamata scanf("%d", &n) Se questa ha successo si restituisce l intero letto. In caso contrario, occorre leggere il prossimo carattere da standard input e restituire il valore opportuno (se il carattere letto è b va restituito EMPTY TREE, se è < va restituito BEGIN TREE, ecc.). b. Scrivere il codice della funzione int endtree(int tree[], int begin) che, dato un array tree[] di interi contenente la codifica di un albero T e un indice begin di tree[] tale che in tree[begin] inizia la codifica un sottoalbero T di T, restituisce l indice dell array tree[] in cui termina la codifica di T. Suggerimento. Per ipotesi, in tree[begin] si trova il valore EMPTY TREE oppure BEGIN TREE. Nel primo caso occorre restituire begin. Nel secondo caso bisogna cercare il simbolo END TREE che chiude il BEGIN TREE in tree[begin]. È sufficiente scorrere l array fino a quando il numero di END TREE è uguale a quello di BEGIN TREE. c. Scrivere il codice della funzione node *buildtree(int tree[], int begin) che, dato un array tree[] e un indice begin di tree[] tale che in tree[begin] inizia la codifica di un albero T, costruisce T e restituisce l indirizzo della radice di T. Suggerimento. Se l albero non è vuoto, fare due chiamate ricorsive per costruire i sottoalberi (per sapere dove inizia il codice del sottoalbero destro usare la funzione endtree() del punto precedente). Se i punti precedenti sono stati svolti correttamente, il codice seguente legge da standard input la descrizione di un albero, costruisce l albero e stampa i nodo in preorder (prima stampa la radice, poi ricorsivamente il sottoalbero sinistro e il sottoalbero destro). Si assume che la codifica dell albero contenga al massimo MAX simboli. 11
12 # define MAX // massimo numero simboli di una codifica... /* Stampa in preorder l albero di radice r */ void print(node* r){ if(r! = NULL){ printf("%d\n", r->key); // stampa radice print(r->left); // stampa sottoalbero sinistro print(r->right); // stampa sottoalbero destro } } int main(){ int k, s; node *root; // radice dell albero int treedescriptor[max]; // memorizza codifica dell albero for(k=0 ; (s=nextsymbol())!= STOP ; k++) // lettura input treedescriptor[k] = s; root = buildtree(treedescriptor,0); // costruisce albero print(root); // stampa albero return 0; } Supponiamo ora di voler costruire alberi di interi in cui i nodi possono assumere un qualunque valore intero. Il programma dell esercizio precedente non funziona in quanto, ad esempio, un nodo di valore 1 verrebbe confuso con BEGIN TREE. Per risolvere il problema senza dover riscrivere tutto il codice, per rappresentare un nodo di valore n usiamo la seguente codifica Code(n) = { n se n 0 n 4 se n < 0 In questo modo, l albero < -1 b <-2 bb> > è codificato come e ogni intero della codifica è univocamente interpretabile. c. Scrivere il codice della funzione int code (int n) che, dato un intero n, restituisce la sua codifica Code(n). Scrivere anche la funzione inversa decode() che, dato un valore k tale che k 0 oppure k 5, restituisce l intero n codificato da k (ossia, tale che Code(n) = k). d. Modificare la funzione nextsymbol() dell esercizio precedente facendo in modo che, nel caso venga letto un intero n, restituisca Code(n). 12
13 Per poter utilizzare il programma di prima, occorre ancora modificare la funzione per la stampa, in quanto il valore di un nodo, prima di essere stampato, va decodificato. void print(node * r){ if(r!= NULL){ printf("%d\n", decode(r->key)); // stampa nodo r print(r->left); print(r->right); } } 13
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
La struttura dati ad albero binario
La struttura dati ad albero binario L albero è una struttura dati nella quale le informazioni sono organizzate in modo gerarchico, dall alto verso il basso. Gli elementi di un albero si chiamano nodi,
Laboratorio di Programmazione 1. Docente: dr. Damiano Macedonio Lezione 18 31/03/2014
Laboratorio di Programmazione 1 1 Docente: dr. Damiano Macedonio Lezione 18 31/03/2014 Funzioni: Dichiarazione e Definizione La dichiarazione di una funzione serve a comunicare al compilatore quali sono
Gli array. Gli array. Gli array. Classi di memorizzazione per array. Inizializzazione esplicita degli array. Array e puntatori
Gli array Array e puntatori Laboratorio di Informatica I un array è un insieme di elementi (valori) avente le seguenti caratteristiche: - un array è ordinato: agli elementi dell array è assegnato un ordine
Alberi binari di ricerca
Alberi binari di ricerca Definizione Visita dell albero inorder Ricerca Ricerca minimo, massimo e successore. Inserimento ed eliminazione di un nodo Problema del bilanciamento dell albero Albero binario
Esempio: dest = parolagigante, lettere = PROVA dest (dopo l'invocazione di tipo pari ) = pprrlogvgante
Esercizio 0 Scambio lettere Scrivere la funzione void scambiolettere(char *dest, char *lettere, int p_o_d) che modifichi la stringa destinazione (dest), sostituendone i caratteri pari o dispari (a seconda
Fondamenti di Informatica T-1, 2009/2010 Modulo 2 Prova d Esame 5 di Giovedì 15 Luglio 2010 tempo a disposizione 2h30'
Prima di cominciare: si scarichi dal sito http://esamix.labx il file StartKit5.zip contenente i file necessari (solution di VS2008 e progetto compresi). Avvertenze per la consegna: apporre all inizio di
Gestione dei File in C
Gestione dei File in C Maurizio Palesi DIIT Università di Catania Viale Andrea Doria 6, 95125 Catania [email protected] http://www.diit.unict.it/users/mpalesi Sommario In questo documento saranno introdotte
Algoritmi di Ricerca. Esempi di programmi Java
Fondamenti di Informatica Algoritmi di Ricerca Esempi di programmi Java Fondamenti di Informatica - D. Talia - UNICAL 1 Ricerca in una sequenza di elementi Data una sequenza di elementi, occorre verificare
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
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
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
Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12};
ESERCIZI 2 LABORATORIO Problema 1 Definire all'interno del codice un vettore di interi di dimensione DIM, es. int array[] = {1, 5, 2, 4, 8, 1, 1, 9, 11, 4, 12}; Chiede all'utente un numero e, tramite ricerca
Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione
Algoritmi e Strutture Dati & Laboratorio di Algoritmi e Programmazione Esercizi II parte Esercizio 1 Discutere la correttezza di ciascuna delle seguenti affermazioni. Dimostrare formalmente la validità
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
16.3.1 Alberi binari di ricerca
442 CAPITOLO 16. STRUTTURE DI DATI DINAMICHE root 7 5 11 2 8 13 10 Figura 16.11 Esempio di albero binario: ogni nodo contiene il dato da immagazzinare e tre puntatori che definiscono le sue relazioni di
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
Strutture. Strutture e Unioni. Definizione di strutture (2) Definizione di strutture (1)
Strutture Strutture e Unioni DD cap.10 pp.379-391, 405-406 KP cap. 9 pp.361-379 Strutture Collezioni di variabili correlate (aggregati) sotto un unico nome Possono contenere variabili con diversi nomi
LISTE, INSIEMI, ALBERI E RICORSIONE
LISTE, INSIEMI, ALBERI E RICORSIONE Settimo Laboratorio LISTE E RICORSIONE SVUOTALISTA: CONSIDERAZIONI Per svuotare una lista si devono eliminare i singoli nodi allocati con la malloc... Come fare? Per
ESERCIZI DI PROBLEM SOLVING E COMPOSIZIONE DEI DIAGRAMMI DI FLUSSO per le classi terza
ESERCIZI DI PROBLEM SOLVING E COMPOSIZIONE DEI DIAGRAMMI DI FLUSSO per le classi terza vers.3 in lavorazione Docente SAFFI FABIO Contenuti 01.Esercizi generici sul diagramma di flusso - flow chart... 2
void funzioneprova() { int x=2; cout<<"dentro la funzione x="<<x<<endl; }
FUNZIONI 57. Cosa servono le funzioni? A spezzare il programma in diverse parti relativamente indipendenti fra loro, ovvero interagenti sono attraverso i parametri di input ed IL VALORE di uscita. In questo
Esercizi Capitolo 6 - Alberi binari di ricerca
Esercizi Capitolo 6 - Alberi binari di ricerca Alberto Montresor 23 settembre 200 Alcuni degli esercizi che seguono sono associati alle rispettive soluzioni. Se il vostro lettore PDF lo consente, è possibile
Inizializzazione, Assegnamento e Distruzione di Classi
Inizializzazione, Assegnamento e Distruzione di Classi Lezione 9 Operazioni Automatiche In ogni programma C++ oggetti classe vengono gestiti automaticamente dal compilatore Inizializzati al momento della
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
Funzioni matlab per la gestione dei file. Informatica B Prof. Morzenti
Funzioni matlab per la gestione dei file Informatica B Prof. Morzenti File Contenitori di informazione permanenti Sono memorizzati su memoria di massa Possono continuare a esistere indipendentemente dalla
Fondamenti di Informatica 2
Fondamenti di Informatica 2 della prova scritta del 28 Febbraio 2006 Esercizio 1 (4 punti) Date le seguenti variabili int A[] = 2,3,7,-2,5,8,-4; int N = 7; int min = 3; int i; Scrivere la porzione di codice
Matlab: Gestione avanzata dei file
Matlab: Gestione avanzata dei file Informatica B File 2 Contenitori di informazione permanenti Sono memorizzati su memoria di massa Possono continuare ad esistere indipendentemente dalla vita del programma
http://esamix.labx Quotazione compareto( ) Quotazione piurecente( ) Quotazione Quotazione Quotazione non trovato count( )
Materiale di ausilio utilizzabile durante l appello: tutto il materiale è a disposizione, inclusi libri, lucidi, appunti, esercizi svolti e siti Web ad accesso consentito in Lab06. L utilizzo di meorie
Strutturazione logica dei dati: i file
Strutturazione logica dei dati: i file Informazioni più complesse possono essere composte a partire da informazioni elementari Esempio di una banca: supponiamo di voler mantenere all'interno di un computer
Struttura a record. File ad accesso diretto. Modalità di apertura. Modalità di apertura
Struttura a record 2 File ad accesso diretto Il file è organizzato in record aventi tutti la stessa struttura e quindi dimensione record 0 record 1 record 2 Ver. 2.4 2010 - Claudio Fornaro - Corso di programmazione
Breve riepilogo della puntata precedente:
Breve riepilogo della puntata precedente: 1. In C, il passaggio dei parametri alle funzioni avviene sempre per copia, ovvero il valore del parametro viene copiato all'interno della variabile che rappresenta
B+Trees. Introduzione
B+Trees Introduzione B+Trees Il B+Trees e la variante maggiormente utilizzata dei BTrees BTrees e B+trees fanno parte della famiglia degli alberi di ricerca. Nel B+Trees i dati sono memorizzati solo nelle
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
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
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
E possibile modificare la lingua dei testi dell interfaccia utente, se in inglese o in italiano, dal menu [Tools
Una breve introduzione operativa a STGraph Luca Mari, versione 5.3.11 STGraph è un sistema software per creare, modificare ed eseguire modelli di sistemi dinamici descritti secondo l approccio agli stati
5.3 TABELLE 5.3.1 RECORD 5.3.1.1 Inserire, eliminare record in una tabella Aggiungere record Eliminare record
5.3 TABELLE In un sistema di database relazionali le tabelle rappresentano la struttura di partenza, che resta poi fondamentale per tutte le fasi del lavoro di creazione e di gestione del database. 5.3.1
(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)
(Esercizi Tratti da Temi d esame degli ordinamenti precedenti) Esercizio 1 L'agenzia viaggi GV - Grandi Viaggi vi commissiona l'implementazione della funzione AssegnaVolo. Tale funzione riceve due liste
Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE
Matematica - SMID : Programmazione Febbraio 2009 FOGLIO RISPOSTE NOME: COGNOME: ============================================================== Esercizio 1 ci sono tante "righe"; non è detto servano tutte...
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.
Introduzione al Linguaggio C
Introduzione al Linguaggio C File I/O Daniele Pighin April 2009 Daniele Pighin Introduzione al Linguaggio C 1/15 Outline File e dati Accesso ai file File I/O Daniele Pighin Introduzione al Linguaggio C
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
Le funzioni in C. I programmi C sono costituiti da definizioni di variabili e funzioni.
Le funzioni in C I programmi C sono costituiti da definizioni di variabili e funzioni. Una definizione di funzione ha il seguente formato: tipo-ritornato nome-funzione(lista-parametri) { dichiarazioni
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)
Leggere un messaggio. Copyright 2009 Apogeo
463 Leggere un messaggio SyllabuS 7.6.3.3 Per contrassegnare un messaggio selezionato puoi fare clic anche sulla voce di menu Messaggio > Contrassegna messaggio. Marcare, smarcare un messaggio I messaggi
Aprire WEKA Explorer Caricare il file circletrain.arff Selezionare random split al 66% come modalità di test Selezionare J48 come classificatore e
Alberi di decisione Aprire WEKA Explorer Caricare il file circletrain.arff Selezionare random split al 66% come modalità di test Selezionare J48 come classificatore e lanciarlo con i parametri di default.
RISOLUTORE AUTOMATICO PER SUDOKU
RISOLUTORE AUTOMATICO PER SUDOKU Progetto Prolog - Pierluigi Tresoldi 609618 INDICE 1.STORIA DEL SUDOKU 2.REGOLE DEL GIOCO 3.PROGRAMMAZIONE CON VINCOLI 4.COMANDI DEL PROGRAMMA 5.ESEMPI 1. STORIA DEL SUDOKU
Le Macchine di Turing
Le Macchine di Turing Come è fatta una MdT? Una MdT è definita da: un nastro una testina uno stato interno un programma uno stato iniziale Il nastro Il nastro è infinito suddiviso in celle In una cella
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
Prova di Laboratorio di Programmazione
Prova di Laboratorio di Programmazione 6 febbraio 015 ATTENZIONE: Non è possibile usare le classi del package prog.io del libro di testo. Oltre ai metodi richiesti in ciascuna classe, è opportuno implementare
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
USO DI EXCEL CLASSE PRIMAI
USO DI EXCEL CLASSE PRIMAI In queste lezioni impareremo ad usare i fogli di calcolo EXCEL per l elaborazione statistica dei dati, per esempio, di un esperienza di laboratorio. Verrà nel seguito spiegato:
Per scrivere una procedura che non deve restituire nessun valore e deve solo contenere le informazioni per le modalità delle porte e controlli
CODICE Le fonti in cui si possono trovare tutorial o esempi di progetti utilizzati con Arduino si trovano nel sito ufficiale di Arduino, oppure nei forum di domotica e robotica. Il codice utilizzato per
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
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
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
Editor vi. Editor vi
Editor vi vi 1 Editor vi Il vi è l editor di testo standard per UNIX, è presente in tutte le versioni base e funziona con qualsiasi terminale a caratteri Permette di visualizzare una schermata alla volta
MATLAB. Caratteristiche. Dati. Esempio di programma MATLAB. a = [1 2 3; 4 5 6; 7 8 9]; b = [1 2 3] ; c = a*b; c
Caratteristiche MATLAB Linguaggio di programmazione orientato all elaborazione di matrici (MATLAB=MATrix LABoratory) Le variabili sono matrici (una variabile scalare equivale ad una matrice di dimensione
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
puntatori Lab. Calc. AA 2007/08 1
puntatori Lab. Calc. AA 2007/08 1 parametri delle funzioni (dalla lezione scorsa) gli argomenti in C vengono passati by value dalla funzione chiamante alla funzione chiamata la lista degli argomenti viene
Appello di Informatica B
Politecnico di Milano Facoltà di Ingegneria Industriale 19 febbraio 2004 Appello di Informatica B Prof. Angelo Morzenti - Prof. Vincenzo Martena Cognome e nome: Matricola: Tipo di prova: recupero I prova
Programmazione C Massimo Callisto De Donato [email protected] www.cs.unicam.it/massimo.callisto
Università degli studi di Camerino Scuola di scienze e tecnologia - Sezione Informatica Programmazione C Massimo Callisto De Donato [email protected] www.cs.unicam.it/massimo.callisto LEZIONE
Le stringhe. Le stringhe
Informatica: C++ Gerboni Roberta Stringhe di caratteri (esempi di utilizzo dei vettori) Nel linguaggio C++ una stringa è semplicemente un vettore di caratteri Vettori di caratteri La stringa "hello" è
MANUALE UTENTE Fiscali Free
MANUALE UTENTE Fiscali Free Le informazioni contenute in questa pubblicazione sono soggette a modifiche da parte della ComputerNetRimini. Il software descritto in questa pubblicazione viene rilasciato
Concetto di Funzione e Procedura METODI in Java
Fondamenti di Informatica Concetto di Funzione e Procedura METODI in Java Fondamenti di Informatica - D. Talia - UNICAL 1 Metodi e Sottoprogrammi Mentre in Java tramite le classi e gli oggetti è possibile
Gestione dei File. dischi nastri cd
Gestione dei File Per mantenere disponibili i dati tra le diverse esecuzioni di un programma, questi si devono archiviare in file su memoria di massa (dati persistenti): dischi nastri cd Un file è un astrazione
GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL
GUIDA RAPIDA BOZZA 23/07/2008 INDICE 1. PERCHÉ UNA NUOVA VERSIONE DEI MODULI DI RACCOLTA DATI... 3 2. INDICAZIONI GENERALI... 4 2.1. Non modificare la struttura dei fogli di lavoro... 4 2.2. Cosa significano
I TUTORI. I tutori vanno creati la prima volta seguendo esclusivamente le procedure sotto descritte.
I TUTORI Indice Del Manuale 1 - Introduzione al Manuale Operativo 2 - Area Tutore o Area Studente? 3 - Come creare tutti insieme i Tutori per ogni alunno? 3.1 - Come creare il secondo tutore per ogni alunno?
costruttori e distruttori
costruttori e distruttori Costruttore E un metodo che ha lo stesso nome della classe a cui appartiene: serve per inizializzare un oggetto all atto della sua creazione Ce ne possono essere uno, più di uno,
GESTIONE INFORMATICA DEI DATI AZIENDALI
GESTIONE INFORMATICA DEI DATI AZIENDALI Alberto ZANONI Centro Vito Volterra Università Tor Vergata Via Columbia 2, 00133 Roma, Italy [email protected] Rudimenti di programmazione Programming
Lab 11 Gestione file di testo"
Fondamenti di Informatica e Laboratorio T-AB Ingegneria Elettronica e Telecomunicazioni Lab 11 Gestione file di testo" Lab15 1 Esercizio 1 n Realizzare un programma che, aperto un file di testo di nome
INFORMATICA - I puntatori Roberta Gerboni
1 2 I puntatori in C++ Il puntatore un tipo di dato scalare, che consente di rappresentare gli indirizzi delle variabili allocate in memoria. Dominio: Il dominio di una variabile di tipo puntatore è un
Università degli Studi di Cassino Corso di Fondamenti di Informatica Puntatori. Anno Accademico 2010/2011 Francesco Tortorella
Corso di Informatica Puntatori Anno Accademico 2010/2011 Francesco Tortorella Variabili, registri ed indirizzi Abbiamo visto che la definizione di una variabile implica l allocazione (da parte del compilatore)
I file di dati. Unità didattica D1 1
I file di dati Unità didattica D1 1 1) I file sequenziali Utili per la memorizzazione di informazioni testuali Si tratta di strutture organizzate per righe e non per record Non sono adatte per grandi quantità
Appunti sulla Macchina di Turing. Macchina di Turing
Macchina di Turing Una macchina di Turing è costituita dai seguenti elementi (vedi fig. 1): a) una unità di memoria, detta memoria esterna, consistente in un nastro illimitato in entrambi i sensi e suddiviso
Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica
Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica Dipartimento di Elettronica, Informazione e Bioingegneria Informatica B Sezione D Franchi Alessio Mauro,
LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO 2014 2015 15.V.2015. Indice
LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO 2014 2015 15.V.2015 VINCENZO MARRA Indice Parte 1. Input/Output standard dalla console 2 Esercizio 1 2 Eco
Analizzatore lessicale o scanner
Analizzatore lessicale o scanner Lo scanner rappresenta un'interfaccia fra il programma sorgente e l'analizzatore sintattico o parser. Lo scanner, attraverso un esame carattere per carattere dell'ingresso,
OTTAVA ESPERIENZA DI LABORATORIO. L elaborazione dei files in C
CORSO DI LABORATORIO DI INFORMATICA CORSO DI LAUREA IN SDM ANNO ACCADEMICO 2011-2012 Docente: R. Sparvoli Esercitazioni: R. Sparvoli, F. Palma OTTAVA ESPERIENZA DI LABORATORIO L elaborazione dei files
Introduzione al linguaggio C Gli array
Introduzione al linguaggio C Gli array Vettori nome del vettore (tutti gli elementi hanno lo stesso nome, c) Vettore (Array) Gruppo di posizioni (o locazioni di memoria) consecutive Hanno lo stesso nome
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
Esame del 3 febbraio 2010
Fondamenti di Informatica CdL in Ingegneria Gestionale a.a. 2009/2010 Docente: Andrea Prati Esame del 3 febbraio 2010 Esercizio 1 Vettori Sia data un vettore (array monodimensionale) di interi: int VETT[N];
I tipi di dato astratti
I tipi di dato astratti.0 I tipi di dato astratti c Diego Calvanese Fondamenti di Informatica Corso di Laurea in Ingegneria Elettronica A.A. 001/00.0 0 I tipi di dato astratti La nozione di tipo di dato
Uso di JUnit. Fondamenti di informatica Oggetti e Java. JUnit. Luca Cabibbo. ottobre 2012
Fondamenti di informatica Oggetti e Java ottobre 2012 1 JUnit JUnit è uno strumento per assistere il programmatore Java nel testing JUnit consente di scrivere test di oggetti e classi Java i test sono
risulta (x) = 1 se x < 0.
Questo file si pone come obiettivo quello di mostrarvi come lo studio di una funzione reale di una variabile reale, nella cui espressione compare un qualche valore assoluto, possa essere svolto senza necessariamente
Allocazione dinamica della memoria - riepilogo
Università degli studi di Milano Dipartimento di Scienze dell Informazione Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica In breve Storage duration Allocazione dinamica della
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
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
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
Dispensa 3. 1.1 YACC: generalità
Dispensa 3 1.1 YACC: generalità Il tool Yacc (acronimo per Yet Another Compiler Compiler) è uno strumento software che a partire da una specifica grammaticale context free di un linguaggio scritta in un
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
Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio
Appunti tratti dal videocorso on-line di Algoritmi e Programmazione Avanzata By ALeXio 1-La memoria dinamica La scrittura di un programma (indipendentemente dal linguaggio adottato) deve sempre tener conto
Caratteri e stringhe Esercizi risolti
Esercizi risolti 1 Esercizio: Conta vocali e consonanti Scrivere un programma in linguaggio C che legga una frase introdotta da tastiera. La frase è terminata dall introduzione del carattere di invio.
Testi di Esercizi e Quesiti 1
Architettura degli Elaboratori, 2009-2010 Testi di Esercizi e Quesiti 1 1. Una rete logica ha quattro variabili booleane di ingresso a 0, a 1, b 0, b 1 e due variabili booleane di uscita z 0, z 1. La specifica
Moduli (schede compilabili) in Word Esempio: scheda di alimentazione per un degente
Moduli (schede compilabili) in Word Esempio: scheda di alimentazione per un degente Vediamo come utilizzare Word per costruire un modulo compilabile, ovvero una scheda che contenga delle parti fisse di
Plate Locator Riconoscimento Automatico di Targhe
Progetto per Laboratorio di Informatica 3 - Rimotti Daniele, Santinelli Gabriele Plate Locator Riconoscimento Automatico di Targhe Il programma plate_locator.m prende come input: l immagine della targa
Database Manager Guida utente DMAN-IT-01/09/10
Database Manager Guida utente DMAN-IT-01/09/10 Le informazioni contenute in questo manuale di documentazione non sono contrattuali e possono essere modificate senza preavviso. La fornitura del software
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
Rappresentazione delle informazioni
Rappresentazione delle informazioni Abbiamo informazioni (numeri, caratteri, immagini, suoni, video... ) che vogliamo rappresentare (e poter elaborare) in un calcolatore. Per motivi tecnologici un calcolatore
