Strumenti Utente

Strumenti Sito


informatica:sol:laboratorio16:esercitazionib:esercitazione1

Esercitazione 1

Dove si richiama il C sequenziale: in particolarere puntatori, strutture ricorsive, puntatori a funzione. Poi si introduce con un esempio il concetto di libreria (che verra' approfondito nelle lezioni di teoria) e si fa la conoscenza con il debugger.

Esercizio 1: sul debugging

Usare il debugger ddd per trovare cosa non va nel seguente programma C:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#define N 5
 
int a[N];
int i;
int main(void)
{
  srand(time(NULL));
  i=0;
  while (i<N)
    {
 
      a[++i]=rand()%2;
      printf("iterazione %d\n",i);
    } 
  printf("exiting ...\n"); 
}

in pratica il codice, salvato in “file.c” compilato con

gcc -Wall -pedantic -o ese file.c

ed eseguito con

$ ./ese

va inspiegabilmente in ciclo all'interno del ciclo. Per eseguire in modalita' interattiva di debugging:

  • Compilare con opzione “-g”, ad esempio
    gcc -Wall -pedantic -g -o ese file.c
  • lanciare l'eseguibile usando il debugger come in
    $ ddd ./ese

a questo punto e' possibile fermare il programma durante la sua esecuzione, ispezionare le variabili etc..

Elaborazione: Per i solutori piu' che abili, provare a trovare cosa non va nel programma C che risolve il problema dell' Game of life in esempi.tar

Esercizio 2: liste concatenate di interi

Implementare in C le seguenti funzioni che lavorano su liste concatenate di interi di tipo

typedef struct nodo {
  int valore;
  struct nodo * next;
} nodo;
 
typedef nodo * lista_t;

e definire le seguenti funzioni che operano sulla lista

/** crea una lista vuota
   \retval NULL il puntatore alla lista vuota */
lista_t newList (void);
 
/** dealloca la lista 
    \param l la lista
*/
void freeList (lista_t l);
 
/** iserisce n nella lista l creando un nuovo nodo  
   \param l  la lista 
   \param n  elemento da inserire
 
   \retval p puntatore alla nuova lista se l'allocazione ha avuto successo
   \retval NULL in caso di errore
 
    */
lista_t insertList (lista_t l, int n);
 
/** cancella n dalla lista (se c'e')
   \param l  la lista 
   \param n  elemento da cancellare
 
   \retval p puntatore alla nuova lista
    */
lista_t removeList (lista_t l, int n);
 
/** salva la lista su file (formato testuale o binario a scelta dello studente)
   \param f  file su cui salvare la lista (gia' aperto) 
   \param l  puntatore alla testa della lista
 
   \retval -1 se si e' verificato un errore
   \retval 0 se tutto e' andato bene
    */
int saveList (FILE* f, lista_t l);
 
/** legge la lista da file (formato testuale o binario a scelta dello studente)
   \param f  file da cui leggere la lista (gia' aperto) 
 
   \retval NULL se si e' verificato un errore
   \retval p puntatore alla testa della lista se tutto e' andato bene
    */
lista_t readList (FILE* f);

Testare il funzionamento delle funzioni implementate con un opportuno main().

Esercizio 3: map e reduce su liste

Usando le liste dell'esercizio 1 implementare le seguenti funzioni:

/** trasforma una lista applicando ad ogni elemento la funzione f 
   \param l la lista
   \param f la funzione da mappare
 
*/
void mapList (int (*f) (int), lista_t l);
 
/** combina gli elementi della lista l usando un operatore binario associativo 
   \param l la lista
   \param f l'operatore binario
   \param en l'elemento neutro di f
 
   \return la 'somma' degli elementi di l secondo f (l1, f ( l2 , f (... f (lN, en)))...))*/
int reduceList(int (*f) (int,int), int en, lista_t l);

Testare il risultato con un opportuno main.

informatica/sol/laboratorio16/esercitazionib/esercitazione1.txt · Ultima modifica: 01/03/2016 alle 09:21 (8 anni fa) da Susanna Pelagatti