Questa è una vecchia versione del documento!
Esercitazione 4
Esercizio 1:
Scrivere un programma che prende in ingresso un intero 'N' ('N' e' piccolo, es. <html>⇐512</html>), alloca in memoria una matrice di NxN elementi float
in modo che siano contigui in memoria.
Inizializzare tale matrice (chiamata M1) in modo arbitrario (ad esempio M1(i,j) = (i+j)/2.0).
Fare quindi il salvataggio in un file della matrice sia in formato binario che in formato testuale in modo da ottenere 'mat_dump.dat' per il formato binario e 'mat_dump.txt' per quello testuale. Chiudere i file creati.
Rileggere quindi la matrice dal file 'mat_dump.dat' memorizzando il contenuto in una matrice differente
da quella di partenza (chiamata M2). Al termine dell'operazione di lettura effettuare il confronto delle due matrici con la funzione 'confronta'. Tale funzione deve essere implementata in modo “generico” cioe' prende come argomenti un puntatore a funzione con tipo opportuno, il puntatore alle due matrici da confrontare e la size. Testare il programma passando alla funzione 'confronta' la funzione di libreria memcmp
(man 3 'memcmp'). Notare la differenza di size tra 'mat_dump.dat' e 'mat_dump.txt'.
Esercizio 2:
Scrivere un Makefile
minimale per compilare l'esercizio precedente. Utilizzare il compilatore g++
ed i flags -g -O3 -Wall
. Il Makefile
deve avere anche il target “phony” clean.
Esercizio 3:
Scrivere un programma che implementa una versione semplificata del comando Unix wc
limitatamente alle opzioni -l e -w (man 1 wc
). Usare getopt
per il parsing degli argomenti (man 3 getopt
).
Se non vengono passate opzioni, il programma stampa sia il numero
di linee che il numero di parole del/dei file i cui nomi sono passati come argomento
(mywc [-l -w] file1 [file2 file3 ….]).
Esercizio 4:
Scrivere un programma C che dato un file testuale come argomento, inserisca tutte le parole del file in una lista ordinando le parole alfabeticamente. Ogni linea del file testuale puo' contenere piu' parole. Implementare la seguente interfaccia:
list_t *createList(); // crea una lista vuota int destroyList(list_t *L); // libera tutta la memoria allocata dalla lista int insertList(list_t *L, const char *); // inserisce una parola nella lista void printList(list_t *L); // stampa tutta la lista
Fornire i metodi di creazione e gestione della lista in una libreria statica (libList.a). Scrivere il Makefile per creare la libreria e generare l'eseguibile.