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
Scarica

versione power point