Strumenti Utente

Strumenti Sito


informatica:sol:laboratorio17:esercitazionib:esercitazione3

Esercitazione 3

Esercizio 1: macro1

Scrivere una funzione macro 'CHECK_PTR' che prende due argomenti, un puntatore ed una stringa, e stampa utilizzando perror la stringa passata come argomento prima di uscire dal programma con EXIT_FAILURE. Esempio di utilizzo:

 FILE *fp;
 CHECK_PTR(fp=fopen("fileprova.txt", "r"), opening fileprova.txt);

NOTA: per il secondo argomento della macro non ci sono le virgolette!

Se il file 'fileprova.txt' non esiste il risultato sarà:

opening fileprova.txt: No such file or directory

Stampare il valore di ritorno di un programma che testa la macro 'CHECK_PTR' sia in caso di successo che di fallimento. Ricordare che il valore di ritorno dell'ultimo comando bash eseguito si può stampare accedendo alla variabile di ambiente bash ? nel modo seguente echo $?..

Esercizio 2: macro2

Dato il seguente codice main C:

#define dimN 16
#define dimM  8
int main() {
    long *M = malloc(dimN*dimM*sizeof(long));
    CHECK_PTR(M, "malloc"); 
    for(size_t i=0;i<dimN;++i)
	for(size_t j=0;j<dimM;++j)			
	    ELEM(M,i,j) = i+j;    
    
    PRINTMAT(M);
    return 0;
}

scrivere le 3 macros CHECK_PTR, ELEM e PRINTMAT. Al suo interno PRINTMAT usa la macro ELEM per accedere agli elementi della matrice. Esempio di output richiesto:

Stampo la matrice M:
   0    1    2    3    4    5    6    7 
   1    2    3    4    5    6    7    8 
   2    3 ....

Esercizio 3: somma da

Scrivere un programma C che implementa una funzione somma con la seguente segnatura:

int somma(int x);

La funzione 'somma' aggiunge l'intero x letto da un file che contiene un intero per ogni riga al valore calcolato fino a quel momento, quindi ritorna la somma. Il nome del file è passato come argomento. Il valore iniziale della somma deve essere INIT_VALUE che viene definito a compilazione utilizzando il flag del compilatore -D. Il programma non deve fare uso di variabili globali.

Valutare se la funzione somma cosi' come definita e' rientrante ed eventualmente fornire una versione rientrante 'somma_r'.

Esercizio 4: Makefile minimale

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 5: matdump

Scrivere un programma che prende in ingresso un intero (piccolo, es. <=512), alloca in memoria una matrice di 512×512 elementi float in modo che siano contigui in memoria. Inizializzare tale matrice (M1) in modo arbitrario (ad esempio M1(i,j) = (i+j)/2.0). Fare quindi il dump della matrice sia in formato binario che in formato testuale su un file il cui nome è 'mat_dump.dat' e 'mat_dump.txt' rispettivamente. Rileggere quindi la matrice dal file 'mat_dump.dat' memorizzandola 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'.

ULTERIORI ESERCIZI DA FARE COME HOMEWORK

Esercizio 6: my word count

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 7: lista di parole

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.

informatica/sol/laboratorio17/esercitazionib/esercitazione3.txt · Ultima modifica: 06/03/2017 alle 10:34 (7 anni fa) da Massimo Torquati