====== 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 ?