Fondamenti di Programmazione     a.a. 2011-2012
Soluzioni prova scritta - 17 luglio 2012


Soluzione esercizio 1
#include <stdlib.h>
#include <string.h>

int *rows(int n, char *M[n][n], char *s, int *pR) {
    int *ind = NULL;
    int nr = 0;
    for (int i = 0 ; i < n ; i++) {
        int j = 0;
        while (j < n && strcmp(M[i][j], s) != 0) j++;
        if (j < n) {
            ind = realloc(ind, (nr + 1)*sizeof(int));
            ind[nr++] = i;
        }
    }
    *pR = nr;
    return ind;
}
Soluzione esercizio 2
#include <stdio.h>

void update(char *fname, void (*upF)(Rec *)) {
    FILE *f = fopen(fname, "r+b");
    if (f == NULL) return;
    Rec r;
    while (fread(&r, sizeof(Rec), 1, f) == 1) {
        upF(&r);
        fseek(f, -sizeof(Rec), SEEK_CUR);
        fwrite(&r, sizeof(Rec), 1, f);
    }
    fclose(f);
}
Soluzione esercizio 3
#include <stdlib.h>
#include <string.h>

void compact(List L) {
    Elem *prev = NULL;        //Il puntatore al primo elemento di una sequenza di elementi da sostituire
    long code;                
    while (L != NULL) {
        if (prev != NULL && code == L->code) {   //Se è un elemento di una sequenza
            int newLen = strlen(prev->str) + strlen(L->str);   //di elementi da sostituire
            prev->str = realloc(prev->str, (newLen + 1)*sizeof(char));    //Rialloca un blocco sufficiente per mantenere la concatenazione
            strcat(prev->str, L->str);     //Concatena la stringa del nuovo elemento
            prev->next = L->next;          //Sgancia l'elemento dalla lista
            free(L->str);                  //Rilascia la memoria della stringa
            free(L);                       //e dell'elemento.
            L = prev->next;             
        } else {
            code = L->code;
            prev = L;
            L = L->next;
        }
    }
}