Fondamenti di Programmazione     a.a. 2011-2012
Soluzioni prova scritta - 26 giugno 2012


Soluzione esercizio 1
#include <stdlib.h>

List extr(char *sA[], int n, int (*f)(char *)) {
    List L = NULL;
    for (int i = 0 ; i < n ; i++)
        if (f(sA[i])) {
            Elem *e = malloc(sizeof(Elem));
            e->str = sA[i];
            e->next = L;
            L = e;
        }
    return L;
}
Soluzione esercizio 2

#include <stdio.h>
#include <string.h>

int txt2bin(char *tF, char *bF) {
    FILE *t = fopen(tF, "r");
    FILE *b = fopen(bF, "wb");
    int n = 0;
    char info[100];
    Rec r;
    while (fscanf(t, "%ld %s", &(r.cod), info) == 2) {
        if (strlen(info) < 10) {
            strcpy(r.info, info);
            fwrite(&r, sizeof(Rec), 1, b);
            n++;
        }
    }
    fclose(t);
    fclose(b);
    return n;
}
Soluzione esercizio 3
#include <stdlib.h>
#include <string.h>

SList repcpy(SList L, int k, SList R) {
    SList *p = &L;
    while (*p != NULL && k > 1) {
        p = &((*p)->next);
        k--;
    }
    if (*p != NULL) {            //Se l'elemento da sostituire esiste...
        SElem *next = (*p)->next;    //Salva il puntatore al prossimo elemento
        free((*p)->str);             //Libera la memoria dell'elemento
        free(*p);                    //da sostituire.
        while (R != NULL) {                       //Per ogni elemento di R...
            SElem *e = malloc(sizeof(SElem));     //Crea un nuovo elemento per
            e->str = malloc(strlen(R->str) + 1);  //copiarci l'elemento di R
            strcpy(e->str, R->str);
            *p = e;                   //Aggancia il nuovo elemento alla lista L
            p = &((*p)->next);
            R = R->next;
        }
        *p = next;
    }
    return L;
}