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 1
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. 2
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 tipochar * (face esuit) 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. 3
. Dichiarazione Definizione 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; Operazioni valide Definizione 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 4
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 5
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 Usetypedef to create shorter type names. Esempio: typedef Card *CardPtr; Definisce un nuovo nome di tipocardptr come sinonimo per il tipocard * Attenzione! typedef non crea un nuovo tipo di dato: crea soltanto un alias! 6
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 12typedef struct card Card; 13 14void filldeck( Card * const, const char *[], const char *[] ); 16void shuffle( Card * const ); 17void deal( const Card * const ); 18 19int 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 38void 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 49void 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} 7
61 62void 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 of Diamonds Eight of Clubs Seven of Hearts Ace of Clubs Deuce of Spades Seven of Spades Jack of Clubs King of Hearts Three of Hearts Three of Clubs Ten of Hearts Ten of Clubs Six of Clubs Six of Hearts Nine of Diamonds Jack of Spades King of Diamonds Nine of Spades Six of Spades Queen of Diamonds Ace of Spades King of Clubs King of Spades Queen of Hearts Four of Spades Four of Clubs Ace of Hearts Five of Spades Deuce of Diamonds Ten of Diamonds Six of Diamonds Deuce of Clubs Ten of Spades Jack of Diamonds Three of Diamonds Nine of Clubs Deuce of Hearts Seven of Diamonds Queen of Spades Three of Spades Ace of Diamonds Five of Clubs Seven of Clubs Four of Hearts Eight of Spades Five of Diamonds Nine of Hearts Five of Hearts Four of Diamonds Eight of Hearts Jack of Hearts Queen of Clubs 8
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 di1 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 da1, incrementa di1 9
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 for ( month = JAN; month <= DEC; month++ ) 18 printf( "%2d%11s\n", month, monthname[ month ] ); 19 20 return 0; 21} 1 January 2 February 3 March 4 April 5 May 6 June 7 July 8 August 9 September 10 October 11 November 12 December 10