Laboratorio di algoritmi e strutture dati

Documenti analoghi
Laboratorio di algoritmi e strutture dati

Laboratorio di Informatica I

Puntatori in C. Fondamenti di Informatica. Daniele Loiacono

Allocazione dinamica della memoria

Laboratorio di Algoritmi e Strutture Dati

Esercitazioni di Fondamenti di Informatica - Lez. 7 20/11/2018

Allocazione dinamica della memoria: calloc() Se T è il nomed di un tipo, la chiamata calloc(n, sizeof(t)) è equivalente a malloc(n * sizeof(t))

Uso avanzato dei puntatori Allocazione dinamica della memoria

Problemi legati all'uso dei Puntatori

Laboratorio di algoritmi e strutture dati

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO VI.2017

Allocazione dinamica memoria

Strutture. Array dei nomi degli esami (MAX ESAMI è il massimo numero degli esami). Array con i crediti degli esami.

Introduzione al C Lez. 4. Allocazione Dinamica della memoria

Stringhe e allocazione dinamica della memoria

GLI ARRAY 17/05/2013. Per definire un array è necessario fornire: Nome Come per le altre variabili. Tipo. int v [5];

Strutture dinamiche in heap nel linguaggio C. E.Mumolo DIA

L Allocazione Dinamica della Memoria

Fondamenti di Informatica 2

Laboratorio di algoritmi e strutture dati

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Introduzione al C Lez. 4

Lezione 8: Stringhe ed array multidimensionali

Laboratorio di algoritmi e strutture dati

Array. Aggragati di variabili omogenee...

Liste. Marco Alberti Programmazione e Laboratorio, A.A

Laboratorio di algoritmi e strutture dati

Esercitazioni di Fondamenti di Informatica - Lez. 8 27/11/2018

char *s; s = (char *) malloc(5*sizeof(char)); scanf( %s, s); Stringhe

I parametri e il sovraccarico

ERRATA CORRIGE. void SvuotaBuffer(void); void SvuotaBuffer(void) { if(getchar()!=10) {svuotabuffer();} }

Fondamenti di Informatica 2

Introduzione al linguaggio C Dati aggregati

Fondamenti di Informatica 2

Variabili dinamiche. Obiettivi: Presentare le variabili dinamiche, allocate e deallocate nell area HEAP, e le funzioni malloc e free

Lezione 12: Allocazione Dinamica della Memoria

Esercitazione 11. Liste semplici

Strutture Dati Dinamiche

Introduzione al linguaggio C Funzioni

L'Allocazione Dinamica della Memoria nel linguaggio C

Introduzione al C. Lezione 4 Allocazione dinamica della memoria. Rossano Venturini. Pagina web del corso

Fondamenti di Programmazione

Informatica 1. Corso di Laurea Triennale in Matematica. Gianluca Rossi

La gestione della memoria dinamica Heap

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Allocazione dinamica della memoria

Laboratorio di Algoritmi e Strutture Dati

Passare argomenti al programma

Puntatori. Grazie ai puntatori:

C: panoramica. Violetta Lonati

Dati aggregati. Violetta Lonati

Titolo presentazione INFORMATICA. sottotitolo A.A Milano, XX mese 20XX Laboratorio n 6 Ing. Gian Enrico Conti Dott.

Esercizio 2: Algebra dei Puntatori e Puntatori a Puntatori

ESERCIZIO allochi staticamente un vettore V1 di 10 float e allochi dinamicamente un vettore V2 di 10 double;

Dati due punti sul piano calcolare la loro distanza

- matrici - stringhe - file (lettura/scrittura, di testo/binari) - strutture, puntatori - allocazione dinamica della memoria (malloc)

ESEMPIO: Ordinamento di parole in un testo

Applicando lo stesso meccanismo al tipo puntatore, possiamo dichiarare un array di puntatori:

Introduzione al linguaggio C Primi programmi

Esercitazione di Laboratorio - 5

Tipi strutturati in C. Stringhe

L'allocazione dinamica della memoria

APPELLO SCRITTO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO VII.2019

L'allocazione dinamica della memoria

Scrivere un funzione ricorsiva che stampa a video i valori di una lista di elementi con campo info di tipo intero.

I tipi strutturati e i record in C++

JAVA. import java.util.*; #include <stdio.h> public static class test { int variable; private int variable; int main (int argc, char *argv[]) {

Sistemi Operativi (M. Cesati)

MatLab - Testo pagina 1 di 5 101

Le strutture. Una struttura C è una collezione di variabili di uno o più tipi, raggruppate sotto un nome comune.

Lezione 21 e 22. Valentina Ciriani ( ) Laboratorio di programmazione. Laboratorio di programmazione. Lezione 21 e 22

Fondamenti di Programmazione

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Ogni variabile in C è una astrazione di una cella di memoria a cui corrisponde un nome, un contenuto e un indirizzo.

Laboratorio di Algoritmi e Strutture Dati

Allocazione Dinamica. Allocazione Statica. malloc() La funzione malloc()

Allocazione dinamica della memoria

Implementazione di DFA in C

Fondamenti di Informatica 2

Sistemi Operativi (M. Cesati)

Le basi del linguaggio Java

INFORMATICA A. Titolo presentazione sottotitolo. Laboratorio n 6 Dott. Michele Zanella Ing. Gian Enrico Conti

Nella propria home directory creare una sottodirectory chiamata es08, in cui metteremo tutti i file C di oggi.

Esempio: Mergesort. void mergesort(int *a, int *b, int l, int r) { int i,j,k,m;

Liste concatenate e allocazione dinamica

! Per quanto sappiamo finora, in C le variabili sono sempre definite staticamente

Allocazione Dinamica della Memoria

Politecnico di Milano. Strutture dati dinamiche

Corso di Informatica A.A

Introduzione al linguaggio C Puntatori

Informatica per Statistica Riassunto della lezioni del 14/11/2012 e 16/11/2012

Transcript:

Laboratorio di algoritmi e strutture dati Docente: Violetta Lonati mercoledì 5 novembre 2008 1 Esercizi introduttivi 1.1 La vostra malloc Scrivete una funzione my_malloc che allochi memoria usando la funzione malloc della libreria standard (file di intestazione stdlib.h) e verifichi il buon esito dell allocazione. In caso di esito ositivo, la funzione deve restituire l indirizzo dello sazio allocato; in caso contrario la funzione deve stamare un messaggio di errore e rovocare la terminazione del rogramma attraverso una chiamata della funzione exit). Scrivete un analoga funzione my_realloc. 1.2 Rovescia Scrivete tre rogrammi che leggano una sequenza di interi e la stamino al contrario, allocando la memoria necessaria in modo dinamico attraverso l uso della funzione malloc. 1. L inut è data da un intero n e da una sequenza di n numeri; basta una sola chiamata di malloc er allocare un vettore di dimensione n. 2. L inut è data da una sequenza di numeri terminata da 0; non otendo revedere quanti numeri verranno inseriti, il vettore andrà ridimensionato man mano: artite da una dimensione fissata iccola (es: 2) e raddoiate la lunghezza del vettore ogni volta che questo si riemie. 3. L inut è data da una sequenza di numeri terminata da 0, come nel caso recedente; di nuovo, il vettore andrà ridimensionato man mano: artite da una dimensione fissata (es: 15) e allungate il vettore di una lunghezza fissa (es: 10) ogni volta che questo si riemie. 1.3 Lettura di stringhe con allocazione di memoria Scrivete due funzioni che leggano da standard inut una sequenza di caratteri e la memorizzino in una stringa di dimensione oortuna allocata dinamicamente (scegliete la strategia che referite, ad esemio una di quelle rooste nell esercizio recedente): 1. char *read_line( void ) deve leggere una riga terminata da \n; 2. char *read_word( void ) deve leggere una arola di caratteri alfanumerici (nota: se il rimo carattere letto non è alfanumerico, la stringa restituita sarà la stringa vuota). Entrambe le funzioni devono restituire l indirizzo del rimo carattere della stringa memorizzata o il untatore NULL in caso di errore. 1

1.4 Rettangoli Aggiungete al rogramma dell esercizio 2.5 del 29 ottobre una funzione che crei un nuovo rettangolo e lo inizializzi con dati inseriti dall utente, allocando la memoria necessaria attrverso l uso della funzione malloc. 2 Esercizi da svolgere in laboratorio 2.1 Registro di renotazione L obiettivo dell esercizio è scrivere un rogramma er gestire un registro di renotazione di osti numerati da 0 a n 1. Il valore di n (numero dei osti renotabili) è inserito dall utente all atto della creazione del registro. Un cliente è identificato da una stringa. Funzionalità da imlementare Il rogramma deve imlementare varie funzionalità. E oortuno strutturare il rogramma in funzioni e commentare ciascuna funzione indicando chiaramente cosa fa e quali arametri usa. newbook (n) Crea un nuovo registro che ermetta la renotazione di n osti, da 0 a n 1. renotazione, quest ultimo deve essere cancellato. Se esiste già un registro di book(k, name) Se il osto k è libero, renota il osto k er il cliente identificato da name. Altrimenti, stama un messaggio di errore. cancel(k) Se il osto k è occuato, cancella la renotazione di k. Altrimenti, stama un messaggio di errore. move( f rom,to) Sosta il cliente dal osto f rom al osto to se ciò è ossibile (ossia, f rom è occuato e to libero). Altrimenti, stama un messaggio di errore. rintbook() Stama il contenuto del registro (osti renotati). Notate che l imlementazione in C delle recedenti oerazioni di alto livello uò richiedere l uso di arametri in iù risetto a quelli indicati. Riflettete quindi su quali siano i rototii iù oortuni da imlementare! Struttura dati Per raresentare il registro occorre usare un array book allocato dinamicamente in quanto la dimensione è stabilita durante l esecuzione del rogramma. Sia n la dimensione di book. Allora, in ogni istante del rogramma er ogni 0 k < n deve valere la seguente rorietà: - Se il osto k è renotato da w, allora book[k] è l indirizzo a un vettore contenente w. - Altrimenti, book[k] vale NULL (indirizzo 0). Anche se avete la tentazione di definire book come una variabile globale, rovate a definirla nel main e a assarla come argomento alle varie funzioni. 2

Formato di inut e outut Il rogramma deve leggere da standard inut una sequenza di istruzioni secondo il formato nella tabella, dove k, n, f rom e to sono interi e name una arola. Riga di inut b n Oerazione newbook (n) + k name book(k, name) - k cancel(k) m f rom to f move( f rom,to) rintbook() Termina l esecuzione I vari elementi sulla riga sono searati da uno o iù sazi. Quando una riga è letta, viene eseguita l oerazione associata; le oerazioni di stama sono effettuate sullo standard outut, e ogni oerazione deve iniziare su una nuova riga. Si assume che l inut sia inserito correttamente. Conviene scrivere le istruzioni di inut in un file in.txt ed eseguire il rogramma redirigendo lo standard inut. La lettura e l interretazione dei comandi uò essere gestita con un ciclo contenente uno switch: while( ( c = getchar () )!= f ){ switch(c){ case b : // b n --> newbook(n) case + : // + k name --> book(k, name) //... case - : // - k --> cancel(k) case m : // m from to ---> move from to //.. case : // ---> rintbook() 3

Esemio di funzionamento INPUT b 10 + 1 Rossi + 3 Bianchi m 1 5 + 9 Verdi - 3 b 20 + 10 Mario m 1 10 m 10 11 f OUTPUT 1 --> Rossi 9 --> Verdi 9 --> Verdi REGISTER[0..19]: 10 --> Mario move(1,10): errore REGISTER[0..19]: 11 --> Mario 3 Altri esercizi 3.1 Cristalli Consideriamo un cristallo che si evolve nel temo nel modo seguente. All istante t = 0 il cristallo è costituito da un solo elemento quadrato di lato unitario. All istante t + 1, il cristallo ha al centro un elemento quadrato di lato unitario e, a ciascuno dei quattro vertici del quadrato è adiacente un cristallo ottenuto al temo t. Ad esemio, indicando con * un elemento quadrato di lato unitario del cristallo e con con. un quadrato unitario vuoto, i cristalli ottenuti ai temi t = 0,1,2 sono: t = 0 t = 1 t = 2 t = 2 * *.*.*. *.*.*...*....*....*...*......*...*........*........*...*..... 4

L obiettivo è quello di costruire una matrice di char che raresenta il cristallo ottenuto all istante t. Ogni cella della matrice raresenta un quadrato unitario dello sazio che uò essere ieno o vuoto, come nell esemio recedente. 1. Scrivete una funzione ricorsiva int latocristallo( int t ) dove t 0, che calcola la misura del lato l del cristallo al temo t. Ad esemio, er t = 0 il valore di l è 1; er t = 1 l vale 3. 2. Scrivete una funzione char **creamatrice( int n ) che crea dinamicamente una matrice quadrata di char di lato n (ossia, una matrice n n) in cui tutti gli elementi risultano vuoti. 3. Scrivete una funzione void stamamatrice( char **m, int n ) che stama il contenuto della matrice quadrata n n assata come rimo arametro. 4. Il cristallo va costruito ricorsivamente. Non essendo ossibile in C assare una sottomatrice di una matrice, occorre assare alla funzione l intera matrice, secificando le righe e le colonne della sottomatrice da considerare. La funzione ricorsiva void crist( char **m, int r0, int c0, int l ) costruisce il cristallo di lato l nella sottomatrice della matrice m comosta dagli elementi M[r][c] tali che: r 0 r < r 0 + l c 0 c < c 0 + l La funzione deve riemire la sottomatrice in esame in base alla definizione di cristallo. Assumete che gli indici r 0, c 0,l siano corretti (ossia, m[r][c] è effettivamente un elemento della matrice m). Suggerimento: Il caso base si ha quando l = 1 (cristallo al temo 0). Nel asso induttivo, occorre riemire l elemento centrale della sottomatrice e fare quattro chiamate ricorsive er riemire le quattro sottomatrici che descrivono i cristalli adiacenti ai vertici dell elemento centrale (cristalli costruiti al temo immediatamente recedente a quello attuale). Un altro suggerimento: essendo i cristalli di lato l uguali, si uò in realtà fare una sola chiamata ricorsiva er determinare un cristallo C 1 al temo immediatamente recedente, che ha come lato l/2; er gli altri tre cristalli è sufficiente coiare C al osto giusto. A tal fine è utile definire una funzione coiasottomatrice( Cell **m, int l, int r0, int c0, int r1, int c1 ) che coia in osizione (r1, c1) la sottomatrice di m di dimensione l che si trova in osizione (r0,c0). 5. Scrivete una funzione er fare la chiamata rinciale della funzione del unto recedente. La funzione deve avere intestazione void cristallo( char **m, int l ) dove l è la misura del lato di un cristallo e m è una matrice quadrata l l. La funzione deve riemire la matrice in modo che raresenti il cristallo di lato l. Se l esercizio è stato svolto correttamente, le seguenti linee di codice stamano il cristallo al temo t, dove il valore di t è letto da standard inut. char ** matrix; int t, lato; scanf( "%d", &t ); // legge il temo if( t >= 0 ){ lato = latocristallo ( t ); // dimensione della matrice matrix = creamatrice ( lato ); // crea matrice er raresentare il cristallo cristallo ( matrix, lato ); // costruisce il cristallo avente lato assegnato stamamatrice ( matrix, lato ); // stama la matrice Se non si usa la ricorsione, la soluzione non è banale!! Comletare l esercizio inserendo istruzioni er liberare lo sazio occuato dalla matrice. 5