Esercizi C sui tipi definiti dall’utente Typedef, tipi enumerativi e strutturati
Definire un nuovo tipo Sinonimi: typedef int Intero; Intero a; int b; typedef char Stringa[10]; Stringa c; char d[10]; Tipi enumerativi: typedef enum {lun,mar,mer,gio,ven,sab,dom} Settimana; Settimana giorno; giorno = lun; giorno = 3; /* 3 equivale a gio */ Non funziona con scanf() e printf().
Definire un nuovo tipo Tipi strutturati: typedef struct { char campo1; float campo2; int campo3[2]; } Record; Record ilMioRecord; ? ilMioRecord 24.56 23 A ilMioRecord 45 campo1 campo2 campo3 ilMioRecord.campo1 = 'A'; ilMioRecord.campo2 = 24.56; ilMioRecord.campo3[0] = 23; ilMioRecord.campo3[1] = 45; 1 x 1 byte + 1 x 4 byte + 2 x 2 byte = --------------- 9 byte
Numeri complessi L’utente inserisce due numeri complessi (parte reale e parte immaginaria) e l’elaboratore esegue l’operazione di somma Es: 3+4i + 5-6i = 8-2i Il programma chiede all’utente se vuole calcolare un’altra somma. Se l’utente inserisce il carattere ‘q’ il programma termina, altrimenti ricomincia daccapo.
Numeri complessi #include <stdio.h> void main() { typedef struct float reale; float immag; } Complesso; Complesso n1, n2, somma; char fine; .
Numeri complessi do { printf ("Numero 1, parte reale: "); scanf ("%f", &n1.reale); printf ("Numero 1, parte immag: "); scanf ("%f", &n1.immag); printf ("Numero 2, parte reale: "); scanf ("%f", &n2.reale); printf ("Numero 2, parte immag: "); scanf ("%f", &n2.immag); .
Numeri complessi somma.reale = n1.reale + n2.reale; somma.immag = n1.immag + n2.immag; printf ("Totale: %f%+fi\n", somma.reale, somma.immag); printf ("Fine? "); scanf (" %c", &fine); /*vedi nota su scanf()*/ }while (fine != 'q'); } "%f" stampa un numero float con il segno “-” se è negativo, senza segno se è positivo "%+f" stampa un numero float con il segno “-” se è negativo, con il segno “+” se è positivo "i" non fa parte degli specificatori di formato.
Una nota sulla scanf() Quando inserisco dei dati da tastiera, gli stessi vengono accodati nello standard input (stdin) del programma Anche in carattere ENTER finale viene accodato: Se inserisco: 123 [ENTER] Ottengo in stdin: 123 ‘\n’ Eseguo scanf(“%d”,&x); stdin diventa: ‘\n’ Inserisco il numero 432; stdin diventa: ‘\n’ 432 ‘\n’ La scanf() scarta l’eventuale ‘\n’ che incontra prima del numero da leggere ma lascia il ‘\n’ finale.
Una nota sulla scanf() Adesso proviamo a leggere un carattere: Inserisco il carattere ‘w’; stdin diventa: ‘\n’ ‘w’ ‘\n’ Eseguo scanf(“%c”,&y); stdin diventa: ‘w’ ‘\n’ La scanf(), quando legge un carattere (e solo in questo caso), NON scarta l’eventuale ‘\n’ iniziale! Lo mette nella variabile y e lascia il resto in stdin Senza immettere nient’altro, eseguo un’altra scanf(“%c”,&y); stdin diventa: ‘\n’ Questa volta la scanf() mette ‘w’ in y Quindi: se devo leggere caratteri (“&c”) ma prima ho effettuato altre letture, devo togliere da stdin il carattere ‘\n’ rimasto.
Squadra di calcio Il programma, partendo da un array che contiene i dati personali dei calciatori di una squadra, permette di calcolare: totale goal fatti dalla squadra goal fatti dagli attaccanti goal fatti dai centrocampisti goal fatti dai difensori totale goal subiti dalla squadra Il programma inoltre visualizza i dati personali di tutti i giocatori Per ogni giocatore, il programma memorizza: numero di maglia ruolo goal fatti (subiti, se è un portiere).
Squadra di calcio #include <stdio.h> void main() { typedef enum {portiere,difensore, centrocampista,attaccante} TipoRuolo; typedef struct unsigned int numero; unsigned int goal; TipoRuolo ruolo; } Giocatore; const unsigned int MAX = 30; Giocatore giocatori[MAX]; unsigned int i, numGiocatori; unsigned int totaleGoalFatti = 0, totaleGoalSubiti = 0; .
Squadra di calcio unsigned int goalAttaccanti=0, goalDifensori=0, goalCentrocampisti=0; /* DATI. In programma vero, letti da un file */ giocatori[0].numero = 9; giocatori[0].goal = 9; giocatori[0].ruolo = attaccante; giocatori[1].numero = 1; giocatori[1].goal = 9; giocatori[1].ruolo = portiere; numGiocatori = 2; /* Fine DATI. */ .
Squadra di calcio for (i = 0; i < numGiocatori; i++) { printf ("Giocatore:%u, ruolo:%u, goal:%u\n", giocatori[i].numero, giocatori[i].ruolo, giocatori[i].goal); if (giocatori[i].ruolo != portiere) totaleGoalFatti = totaleGoalFatti + giocatori[i].goal; if (giocatori[i].ruolo == attaccante) goalAttaccanti = goalAttaccanti + giocatori[i].goal; } .
Squadra di calcio else if (giocatori[i].ruolo==centrocampista) { goalCentrocampisti = goalCentrocampisti + giocatori[i].goal; } else goalDifensori = goalDifensori + giocatori[i].goal; else /* il giocatore è un portiere */ totaleGoalSubiti = totaleGoalSubiti + giocatori[i].goal; } .
Squadra di calcio } /* fine for */ printf ("Goal fatti: %u\n", totaleGoalFatti); printf ("Attacco:%u, centroc:%u, difesa: %u\n", goalAttaccanti, goalCentrocampisti, goalDifensori); printf ("Goal subiti:%u\n", totaleGoalSubiti); } .
Schedine Il programma, partendo da un array di dimensione prefissata che contiene in ogni cella: codice giocata data della giocata colonna con i tredici segni Copia in un altro vettore solo le giocate dell’anno 2002 Quindi, visualizza queste giocate.
Schedine #include <stdio.h> void main() { const unsigned int NUMSEGNI = 13, NUMGIOCATE = 3; const unsigned int ANNOCERCATO = 2002; typedef struct unsigned int giorno; unsigned int mese; unsigned int anno; } TipoData; unsigned int codice; TipoData data; char colonna[NUMSEGNI]; } Giocata; .
Schedine Giocata giocate[NUMGIOCATE], trovate[NUMGIOCATE]; unsigned int i, k, j = 0; for (i = 0; i < NUMGIOCATE; i++) { printf ("Codice: "); scanf ("%u", &giocate[i].codice); printf ("Giorno mese anno: "); scanf ("%u", &giocate[i].data.giorno); scanf ("%u", &giocate[i].data.mese); scanf ("%u", &giocate[i].data.anno); scanf ("%*c"); printf ("Colonna: "); for (k = 0; k < NUMSEGNI; k++) { /* tutti insieme */ scanf ("%c", &giocate[i].colonna[k]); } } .
Schedine for (i = 0; i < NUMGIOCATE; i++) { if (giocate[i].data.anno == ANNOCERCATO) trovate[j] = giocate[i]; j++; } } .
Schedine for (i = 0; i < j; i++) { printf ("Cod: %u ", trovate[i].codice); printf ("Data: %u/%u/%u\n", trovate[i].data.giorno, trovate[i].data.mese, trovate[i].data.anno); for (k = 0; k < NUMSEGNI; k++) printf ("%c ", trovate[i].colonna[k]); } printf ("\n"); } .