Domanda Enumerazione.

Stato
Discussione chiusa ad ulteriori risposte.

Daniele1100000

Utente Gold
13 Agosto 2009
640
106
54
318
Salve ragazzi,oggi ho iniziato a studiare le enumerazioni,e vorrei capire in che contesto sarebbe più opportuno utilizzarle,e se la sintassi riportata in questo modo sia corretta,

[HASHTAG]#include[/HASHTAG] <stdio.h>
enum mirko{basso,
medio,
alto}daniele;
int main(){
enum mirko_basso;
enum daniele_alto;
P.S potrei invertire daniele_alto in daniele_basso?(anche nel caso di Mirko.
Da come ho capito io posso scegliere Daniele_basso
Daniele_medio
Daniele_alto
Giusto?.
 
No, hai scritto un codice senza alcun senso (oltre che senza formattazione, indentazione e senza tag CODE).
I casi di utilizzo sono potenzialmente infiniti. Ma quello che devi capire è cos'è un enumeratore e come si usa, dato che non l'hai chiaramente capito.
Un enumeratore definisce un insieme di costanti con un certo valore, e definisce anche un tipo di dato nuovo. Qualsiasi variabile abbia questo tipo di dato è in realtà un intero (non c'è differenza, in C, tra interi e tipi enum).
Pensa se devi sviluppare il gioco della battaglia navale con navi di 1 sola casella: avrai una griglia per ogni giocatore. Decidi di implementare la griglia come matrice bidimensionale di interi (chiamata gametable), dove il valore dell'intero rappresenta lo stato di quella cella (0 = acqua; 1 = nave; 2 = mancato; 3 = colpito). Ora se tu nel codice dovresti in qualche momento ad esempio controllare se in una certa cella (di coordinate x,y) c'è una nave o meno, e se c'è se è affondata o meno, dovresti scrivere qualcosa tipo:
C:
int gametable[rows][cols];
/* ... */
if (gametable[x][y] == 1) {
        /* nave */
} else if (gametable[x][y] == 3) {
        /* nave affondata */
} else {
        /* niente nave */
}
Il codice è ben poco chiaro: si capisce se ci sono i commenti, ma altrimenti non si capirebbe cos'è 1, cos'è 3, ecc.
Allora puoi usare un enumeratore, e implementare quindi la griglia come matrice bidimensionale del tipo dell'enumeratore:
C:
enum gamecell {
        CELL_WATER,
        CELL_SHIP,
        CELL_MISS,
        CELL_SUNK
};
Ora puoi fare così:
C:
enum gamecell gametable[rows][cols];
/* ... */
if (gametable[x][y] == CELL_SHIP) {
        /* nave */
} else if (gametable[x][y] == CELL_SUNK) {
        /* nave affondata */
} else {
        /* niente nave */
}
Il codice è molto più chiaro.
Quelle costanti (CELL_SHIP, CELL_WATER, ecc.) in realtà non sono altro che costanti intere. Volendo, puoi esplicitare i valori:
C:
enum gamecell {
        CELL_WATER = 0,
        CELL_SHIP = 1,
        CELL_MISS = 2,
        CELL_SUNK = 3
};

Quando il compilatore passa sul codice, prende tutte le costanti che trova e le sostituisce con i valori corrispondendi prima di compilare. E ovunque trova una variabile definita col tipo enum, lo sostituisce con il tipo int. Alla fine, il risultato è identico a quello del primo codice che ho scritto, però è molto più leggibile. Principalmente, gli enumeratori si usano per migliorare la leggibilità del codice.
 
  • Mi piace
Reazioni: Max Fridman
Ciao,in poche parole la funzione dell'enumeratore consiste nel far capire meglio il codice attraverso i nomi delle celle. Ma a livello pratico é uguale all'int classico.
Ma i valori dell'enumeratore se non dichiarato andrá incrementando sempre di 1?,e nel caso io dichiarassi ad esempio CELL_MISS=3
CELL_SUNK senza dichiarazioni sarebbe di 4 giusto?.
Grazie mille ora ho capito(siccome all'universitá potrebbe uscire un esame sulle enumerazioni,e la prof non c'è la spiegato minimamente.)
 
Sì esatto: se non specifichi il valore delle costanti il compilatore assume che la prima valga zero, la seconda uno e così via. Se invece specifichi il valore di una costante tutte le successive vengono incrementare di uno. Puoi anche specificare alcune costanti e non altre: nell'esempio di prima potresti forzare CELL_WATER a 5 e CELL_MISS a 10; il risultato è che CELL_SHIP assume 6 e CELL_SUNK assume 11.
 
Stato
Discussione chiusa ad ulteriori risposte.