====== Esercitazione 8 ======
===== Esercizio 1 =====
Realizzare un programma C che legge e memorizza in un VLA una sequenza di double di lunghezza non nota a tempo di compilazione.
Richiedere all'utente di specificare la lunghezza prima di immettere la sequenza.
===== Esercizio 2 =====
Modificare la soluzione all'esercizio 1 in modo da utilizzare la funzione ''malloc()'' per allocare l'array dopo aver letto la lunghezza.
Verificare la corretta allocazione e gestire gli errori.
===== Esercizio 3 =====
Le matrici possono essere rappresentate come array di puntatori a righe.
Si richiede di implementare le procedure per la creazione e la deallocazione di matrici ''nxm'' di double. In particolare, la procedura
/** crea una matrice di double con n righe ed m colonne e assegna il puntatore a tale struttuta al puntatore mat,
se c'e' stato un errore assegna al puntatore mat la costante NULL.
*/
void mat_new (double ***mat, unsigned n, unsigned m);
E
/** libera la memoria occupata da una matrice di double rappresentata come array di puntatori a righe e
pone il puntatore alla struttura mat a NULL.
*/
void mat_free (double*** mat, unsigned n);
Sviluppare un opportuno main che testa che l'allocazione e la deallocazione siano stata effettuata correttamente, anche in caso di errori in corso d'opera.
===== Esercizio 4 =====
Le matrici possono essere rappresentate come array di puntatori a righe.
E se invece di una procedura per l'allocazione avessimo usato una funzione? Implementare adesso una funzione per la creazione di matrici ''nxm'' di double. In particolare, la funzione deve essere
/** crea una matrice di double rappresentata come array di puntatori a righe e restituisce
il puntatore alla struttura creata, NULL se c'e' stato un errore,
*/
double** mat_new_fun (unsigned n, unsigned m);
Sviluppare un opportuno main che testa che l'allocazione sia stata effettuata correttamente, anche in caso di errori in corso d'opera.
===== Esercizio 5=====
Modificare la soluzione all'esercizio 2 in modo da utilizzare la funzione ''relloc()'' per fare crescere dinamicamente l'array senza richiedere la lunghezza della sequenza.
Verificare la corretta allocazione e gestire gli errori.
===== Esercizio 6 =====
Eseguire il seguente programma C
#include
#include
#define SIZE 10000000000
int main (void) {
double * h;
h = malloc(SIZE*sizeof(double));
if ( h == NULL ) {
perror("malloc");
exit(EXIT_FAILURE);
}
printf("Allocato h = %p\n",(void *) h);
return 0;
}
cosa succede ? Cercate di capire che cosa succede quando va in esecuzione ''perror()'' andando a verificare il manuale (sezione 3 ''man 3 perror'')
===== Esercizio 7 (Strutture) =====
Scrivete una funzione C nuovo_mazzo() che crea un mazzo (mischiato!) di 40 carte utilizzando i
seguenti tipi:
/** i valori delle carte */
typedef enum valori{ASSO,DUE,TRE,QUATTRO,CINQUE,SEI,SETTE,FANTE,DONNA,RE}
valori_t;
/** i semi delle carte */
typedef enum semi{CUORI,QUADRI,FIORI,PICCHE } semi_t;
/** una carta e' data da un valore ed un seme */
typedef struct carta {
/** valore */
valori_t val;
/** seme */
semi_t seme;
} carta_t;
ed una funzione
stampa_mazzo()
che stampa le carte del mazzo sullo standard output in modo
gradevole. Definite i parametri ed i valori restituiti dale funzioni opportunamente.
===== Esercizio 8 (Strutture) =====
Utilizzando le funzioni dell'esercizio precedente realizzate un programma C che gioca a briscola
con un utente. Il programma crea il mazzo di carte, stampa sullo standard output il nome della
briscola e le carte in mano all'utente ed attende sullo standard input la giocata. Il programma puo'
giocare con una strategia semplice a piacere (ad esempio la prima carta della mano). Ad esempio:
$./briscola
Nuova partita, briscola CUORI
Mano #1: Hai in mano
4Fiori 5Picche QCuori
Cosa giochi ?
se digitiamo
4Fiori
io gioco 2Cuori, preso
Mano #2: Hai in mano
KFiori 5Picche QCuori
io gioco 7Picche
Cosa giochi ?