8 maggio 2002 Avvisi: • Le lezioni di giovedi’ 9 maggio e giovedi 16 maggio saranno tenute dalla dott.ssa Di Ianni. Vediamo le vostre soluzioni per… Esercizio 6.28 (Eliminazione dei duplicati) Scrivere un programma che produca 20 numeri casuali tra 1 e 20. Il programma dovra’ immagazzinare in un vettore i suddetti numeri considerando solo quelli distinti. Utilizzare un vettore piu’ piccolo possibile per questo compito Vediamo le vostre soluzioni per… Esercizio 6.30 (Crivello di Eratostene) Scrivere un programma che utilizza un vettore di 1000 elementi per calcolare tutti i numeri primi tra 1 e 999 utilizzando la tecnica del “crivello di Eratostene”: •Creare un vettore con tutti gli elementi inizializzati a 1 (alla fine il valore 1 indichera’ che il numero,corrispondente all’indice e’ primo, 0 che non e’ primo) •Partendo dall’indice 2, se il valore e’ 1, scorrere il resto del vettore azzerando tutti i valori corrispondenti a multipli di 2. (questo azzerera’ tutti i valori corrispondenti a indici pari). Poi andare all’indice 3 e se il valore e’ 1, scorrere il resto del vettore azzerando tutti i valori corrispondenti a multipli di 3. Poi andare all’indice 4, 5,… e rifare sempre lo stesso. Alla fine restera’ valore 1 solo in corrispondenza dei numeri primi. Strutture – Collezioni di variabili collegate (aggregati) sotto un unico nome • Possono contenere variabili di tipi di dati diversi. – Spesso usate per definire record da immagazzinare nei file. – Combinate con i puntatori possono creare liste, pile, code e alberi. Definizione • Esempio struct card { char *face; char *suit; }; – struct introduce la definizione della struttura card – card e’ il nome della struttura ed e’ usato per dichiarare le variabili di quel tipo di struttura – card contiene due membri di tipo char * (face e suit) Definizione – – – – – I membri di una struttura possono essere di vari tipi: tipi fondamentali o aggregati (es. array o anche altre strutture) Una struttura non puo’ contenere come membro una istanza di se stessa Puo’ contenere pero’ un membro che e’ un puntatore allo stesso tipo struttura (struttura ricorsiva). La definizione di una struttura non riserva spazio in memoria. Crea un nuovo tipo di dato che puo’ essere usato per dichiarare variabili. Definizione . • Dichiarazione – Come per altre variabili: card oneCard, deck[ 52 ], *cPtr; – Posso dichiarare le variabili insieme alla struttura: struct card { char *face; char *suit; } oneCard, deck[ 52 ], *cPtr; Definizione • Operazioni valide – Assegnare variabli di un certo tipo di struttura ad un’altra dello stesso tipo – Prendere l’indirizzo di una variabile struttura (&) – Accedere ai membri di una variabile struttura – Usare l’operatore sizeof per determinare lo spazio occupato da una variabile struttura • Non si puo’… – Confrontare due variabili struttura Inizializzazione • Liste di inizializzazione – Esempio: card oneCard = { "Three", "Hearts" }; • Istruzioni di assegnazione – Esempio : card threeHearts = oneCard; oppure: card threeHearts; threeHearts.face = “Three”; threeHearts.suit = “Hearts”; Accedere ai membri delle strutture – Operatore “punto” (.) – si usa con le variabili struttura card myCard; printf( "%s", myCard.suit ); – Operatore “freccia”(->) – si usa con i puntatori a variabili struttura card *myCardPtr = &myCard; printf( "%s", myCardPtr->suit ); myCardPtr->suit e’ equivalente a ( *myCardPtr ).suit Usare le strutture con le funzioni • Per passare strutture a funzioni – O passo la struttura per intero – Oppure passo i membri singolarmente – In entrambi i casi il passaggio e’ per valore • Per passare strutture per riferimento – Passo il suo indirizzo • Per passare un array per valore – Creo una struttura con un array come membro – Passo la struttura Typedef – Crea sinonimi (alias) per tipi di dati definiti precedentemente – Use typedef to create shorter type names. – Esempio: • typedef Card *CardPtr; • Definisce un nuovo nome di tipo CardPtr come sinonimo per il tipo Card * – Attenzione! typedef non crea un nuovo tipo di dato: crea soltanto un alias! 1 /* Fig. 10.3: fig10_03.c 2 The card shuffling and dealing program using structures */ 3 #include <stdio.h> 4 #include <stdlib.h> 5 #include <time.h> 6 7 struct card { 8 const char *face; 9 const char *suit; 10 }; 11 12 typedef struct card Card; 13 14 void fillDeck( Card * const, const char *[], const char *[] ); 16 void shuffle( Card * const ); 17 void deal( const Card * const ); 18 19 int main() 20 { 21 Card deck[ 52 ]; 22 const char *face[] = { "Ace", "Deuce", "Three", 23 "Four", "Five", 24 "Six", "Seven", "Eight", 25 "Nine", "Ten", 26 "Jack", "Queen", "King"}; 27 const char *suit[] = { "Hearts", "Diamonds", 28 "Clubs", "Spades"}; 29 30 srand( time( NULL ) ); 32 fillDeck( deck, face, suit ); 33 shuffle( deck ); 34 deal( deck ); 35 return 0; 36 } 37 38 void fillDeck( Card * const wDeck, const char * wFace[], 39 const char * wSuit[] ) 40 { 41 int i; 43 for ( i = 0; i <= 51; i++ ) { 44 wDeck[ i ].face = wFace[ i % 13 ]; 45 wDeck[ i ].suit = wSuit[ i / 13 ]; 46 } 47 } 48 49 void shuffle( Card * const wDeck ) 50 { 51 int i, j; 52 Card temp; 54 for ( i = 0; i <= 51; i++ ) { 55 j = rand() % 52; 56 temp = wDeck[ i ]; 57 wDeck[ i ] = wDeck[ j ]; 58 wDeck[ j ] = temp; 59 } 60 } 61 62 void deal( const Card * const wDeck ) 63 { 64 int i; 65 66 for ( i = 0; i <= 51; i++ ) 67 printf( "%5s of %-8s%c", wDeck[ i ].face, 68 wDeck[ i ].suit, 69 ( i + 1 ) % 2 ? '\t' : '\n' ); 70 } Eight Eight Seven Ace Deuce Seven Jack King Three Three Ten Ten Six Six Nine Jack King Nine Six Queen Ace King King Queen Four Four of of of of of of of of of of of of of of of of of of of of of of of of of of Diamonds Clubs Hearts Clubs Spades Spades Clubs Hearts Hearts Clubs Hearts Clubs Clubs Hearts Diamonds Spades Diamonds Spades Spades Diamonds Spades Clubs Spades Hearts Spades Clubs Ace Five Deuce Ten Six Deuce Ten Jack Three Nine Deuce Seven Queen Three Ace Five Seven Four Eight Five Nine Five Four Eight Jack Queen of of of of of of of of of of of of of of of of of of of of of of of of of of Hearts Spades Diamonds Diamonds Diamonds Clubs Spades Diamonds Diamonds Clubs Hearts Diamonds Spades Spades Diamonds Clubs Clubs Hearts Spades Diamonds Hearts Hearts Diamonds Hearts Hearts Clubs Costanti di enumerazione – Insieme di costanti intere rappresentate da identificatori – Costanti simboliche il cui valore e’ impostato automaticamente • I valori cominciano da 0 e sono incrementati di 1 • In alternativa, possono essere definiti esplicitamente usando = • I nomi delle costanti devono essere univoci – Le variabili si dichiarano come per gli altri tipi • Le variabili di enumerazione possono assumere soltanto il loro valore costante di enumerazione (non la loro rappresentazione intera!) Costanti di enumerazione • Esempio: enum Months { JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC}; – Comincia da 1, incrementa di 1 1 /* Fig. 10.18: fig10_18.c 2 Using an enumeration type */ 3 #include <stdio.h> 4 5 enum months { JAN = 1, FEB, MAR, APR, MAY, JUN, 6 JUL, AUG, SEP, OCT, NOV, DEC }; 7 8 int main() 9 { 10 enum months month; 11 const char *monthName[] = { "", "January", "February", 12 "March", "April", "May", 13 "June", "July", "August", 14 "September", "October", 15 "November", "December" }; 16 17 18 for ( month = JAN; month <= DEC; month++ ) printf( "%2d%11s\n", month, monthName[ month ] ); 19 20 21 } return 0; 1 2 3 4 5 6 7 8 9 10 11 12 January February March April May June July August September October November December