Condividi:        

Tipi enumerativi in c++

Discussioni e opinioni costruttive sul mondo dell'informatica.
Per la soluzione di problemi specifici fare riferimento alle sezioni di assistenza!

Moderatori: aurelio37, Anthony47, axelrox

Tipi enumerativi in c++

Postdi Andrea87 » 11/04/03 13:30

Volevo creare un tipo enumerativo per i giorni della settimana

Codice: Seleziona tutto
enum settimana {lun, mar, mer, gio, ven, sab, dom};

Che poi mi sarebbe servito per fare una specie di calendario in c++. Solo che se io faccio una cosa del genere
Codice: Seleziona tutto
settimana a = lun;
cout<<a;

Mi da come output "0" ovvero la posizione di lun nella lista. Come faccio a fargli scrivere "lun"? e come faccio a passare all'elemento successivo? quello che in pascal si fa con la funzione succ() praticamente

[/code]
Andrea87
Utente Senior
 
Post: 857
Iscritto il: 03/09/01 01:00
Località: Venezia

Sponsor
 

Postdi eduardroccatello » 11/04/03 17:42

presupposto che io non conosco molto bene la struttura enum, dovrebbe essere un tipo di dati per rendere una successione numerica leggibile.
quindi la cosa che vuoi fare tu, secondo me non si può fare

forse la soluzione è utilizzare un array
Eduard Roccatello
Modding, overclock and hardware reviews @ http://www.pcimprover.it
RoLUG member @ http://rovigo.linux.it
eduardroccatello
Utente Senior
 
Post: 134
Iscritto il: 09/12/02 20:06
Località: Rovigo

Re: Tipi enumerativi in c++

Postdi rayden » 11/04/03 18:11

Andrea87 ha scritto:Volevo creare un tipo enumerativo per i giorni della settimana

Codice: Seleziona tutto
enum settimana {lun, mar, mer, gio, ven, sab, dom};

Che poi mi sarebbe servito per fare una specie di calendario in c++. Solo che se io faccio una cosa del genere
Codice: Seleziona tutto
settimana a = lun;
cout<<a;

Mi da come output "0" ovvero la posizione di lun nella lista. Come faccio a fargli scrivere "lun"? e come faccio a passare all'elemento successivo? quello che in pascal si fa con la funzione succ() praticamente

[/code]


è normale che ti scriva lo 0 in quanto lui dà una numerazione interna al tipo enumeratico, per farti scrivere lun in output ti puoi fare una conversion function tipo:

Codice: Seleziona tutto
char* ret_giorno(settimana settpass)
{
    char* giorno;
    switch (settpass)
    {
   
        case 0:
                giorno = "lun";
        break;
       
        case 1:
                giorno = "mar";
        break;
       
        case 2:
                giorno = "mer";
        break;
       
        case 3:
                giorno = "gio";
        break;
       
        case 4:
                giorno = "ven";
        break;
       
        case 5:
                giorno = "sab";
        break;
       
        case 6:
                giorno = "dom";
        break;
    }
   
    return (&giorno[0]);
   
}


per quel che riguarda la questione del succ non ricordo devo controllare il manuale... :D
Le uniche limitazioni che abbiamo sono quelle che ci poniamo da soli...
http://www.lightingandservices.com
http://www.lightingandservices.com/phoenix
rayden
Utente Senior
 
Post: 881
Iscritto il: 07/08/01 01:00

Postdi rayden » 11/04/03 18:20

Codice: Seleziona tutto
a = (settimana)( (int)a + 1 );


tho godi anche tu della potenza del C++

prima regola... nulla è impossibile... 8)
Le uniche limitazioni che abbiamo sono quelle che ci poniamo da soli...
http://www.lightingandservices.com
http://www.lightingandservices.com/phoenix
rayden
Utente Senior
 
Post: 881
Iscritto il: 07/08/01 01:00

Postdi Nemok » 11/04/03 20:05

Se non ricordo male Rayden puoi incrementare direttamente la variabile di tipo enum senza fare nessun cast.

a++ dovebbe bastare,ad ogni modo controllerò sul manuale....
Nel 1968 la potenza operativa di 2 C-64 hanno portato un razzo sulla luna. Oggi la potenza operativa di un Athlon 4000+ viene usata per far girare Windows XP....Qualcosa deve essere andato storto....
--Powered by Debian Sid/unstable on 2.6.10--
Nemok
Utente Senior
 
Post: 1420
Iscritto il: 04/09/01 01:00
Località: Roma

Postdi rayden » 11/04/03 22:30

Nemok ha scritto:Se non ricordo male Rayden puoi incrementare direttamente la variabile di tipo enum senza fare nessun cast.

a++ dovebbe bastare,ad ogni modo controllerò sul manuale....


non se può... controlla controlla... cmq il metodo mio và bene... :D
Le uniche limitazioni che abbiamo sono quelle che ci poniamo da soli...
http://www.lightingandservices.com
http://www.lightingandservices.com/phoenix
rayden
Utente Senior
 
Post: 881
Iscritto il: 07/08/01 01:00

Postdi Nemok » 12/04/03 00:55

Controllato sul 'Lippman'.....non si può..... :D
Nel 1968 la potenza operativa di 2 C-64 hanno portato un razzo sulla luna. Oggi la potenza operativa di un Athlon 4000+ viene usata per far girare Windows XP....Qualcosa deve essere andato storto....
--Powered by Debian Sid/unstable on 2.6.10--
Nemok
Utente Senior
 
Post: 1420
Iscritto il: 04/09/01 01:00
Località: Roma

Postdi rayden » 12/04/03 11:38

Nemok ha scritto:Controllato sul 'Lippman'.....non si può..... :D


il metodo tuo và bene se consideri il doppio casting...
prima trasformi in int, poi incrementi, poi ritrasformi in enum... :D
troppo lungo fatto passo passo, la mia usa il casting, è compatta è funzionale :D
Le uniche limitazioni che abbiamo sono quelle che ci poniamo da soli...
http://www.lightingandservices.com
http://www.lightingandservices.com/phoenix
rayden
Utente Senior
 
Post: 881
Iscritto il: 07/08/01 01:00

Postdi pjfry » 12/04/03 11:49

se incrementando così arrivi a 7 che succede? ricomincia da solo o serve un %7 alla fine?
Avatar utente
pjfry
Moderatore
 
Post: 8240
Iscritto il: 19/11/02 17:52
Località: terni

Postdi rayden » 12/04/03 12:08

pjfry ha scritto:se incrementando così arrivi a 7 che succede? ricomincia da solo o serve un %7 alla fine?


succede che riparte da capo...
cmq faccio un test e ti dico, può darsi che confondo con qualche altro linguaggio dammi tempo... :D
Le uniche limitazioni che abbiamo sono quelle che ci poniamo da soli...
http://www.lightingandservices.com
http://www.lightingandservices.com/phoenix
rayden
Utente Senior
 
Post: 881
Iscritto il: 07/08/01 01:00

Postdi rayden » 12/04/03 12:18

appunto quello era il pascal, per il C++ non funziona, se si va al di fuori del 7 non viene visualizzato nulla ovviamente perchè non corrisponde a nulla si deve fare una funzioncina di controllo...
Le uniche limitazioni che abbiamo sono quelle che ci poniamo da soli...
http://www.lightingandservices.com
http://www.lightingandservices.com/phoenix
rayden
Utente Senior
 
Post: 881
Iscritto il: 07/08/01 01:00

Postdi pjfry » 12/04/03 12:29

Codice: Seleziona tutto
a = (settimana)( ((int)a + 1 )%7);

allora forse potrebbe andare così... sono anch'io un pò incasinato tra i vari linguaggi ma il '%' dovrebbe essere ok per tornare da capo quando serve
Avatar utente
pjfry
Moderatore
 
Post: 8240
Iscritto il: 19/11/02 17:52
Località: terni

Postdi Andrea87 » 12/04/03 12:36

Codice: Seleziona tutto
a = (settimana)( (int)a + 1 )%7);

questo da quel che ho capito incrementa a (considerato come intero) di uno e poi lo trasforma in variabile "settimana", se arriva a 7 ricomincia da 1.
Non capisco però cosa vuol dire questo
Codice: Seleziona tutto
char* ret_giorno(settimana settpass)
{
    char* giorno;
    switch (settpass)
    {
   
        case 0:
                giorno = "lun";
        break;
       
        case 1:
                giorno = "mar";
        break;
       
        case 2:
                giorno = "mer";
        break;
       
        case 3:
                giorno = "gio";
        break;
       
        case 4:
                giorno = "ven";
        break;
       
        case 5:
                giorno = "sab";
        break;
       
        case 6:
                giorno = "dom";
        break;
    }
   
    return (&giorno[0]);
   
}


sono agli inizi :oops:
Andrea87
Utente Senior
 
Post: 857
Iscritto il: 03/09/01 01:00
Località: Venezia

Postdi pjfry » 12/04/03 12:42

Andrea87 ha scritto:
Codice: Seleziona tutto
a = (settimana)( (int)a + 1 )%7);

questo da quel che ho capito incrementa a (considerato come intero) di uno e poi lo trasforma in variabile "settimana", se arriva a 7 ricomincia da 1.
perfetto, solo che ricomincia da 0 ;)

lo switch dopo serve a restituire una stringa con il nome del giorno corrispondente al parametro 'settpass'
Codice: Seleziona tutto
return (&giorno[0]);
forse qui bastava
Codice: Seleziona tutto
return giorno;
che dovrebbe restituire comunque un puntatore al primo byte... tanti modi per fare la stessa cosa :)
Avatar utente
pjfry
Moderatore
 
Post: 8240
Iscritto il: 19/11/02 17:52
Località: terni

Postdi rayden » 12/04/03 13:21

Andrea87 ha scritto:
Codice: Seleziona tutto
a = (settimana)( (int)a + 1 )%7);

questo da quel che ho capito incrementa a (considerato come intero) di uno e poi lo trasforma in variabile "settimana", se arriva a 7 ricomincia da 1.
Non capisco però cosa vuol dire questo
Codice: Seleziona tutto
char* ret_giorno(settimana settpass)
{
    char* giorno;
    switch (settpass)
    {
   
        case 0:
                giorno = "lun";
        break;
       
        case 1:
                giorno = "mar";
        break;
       
        case 2:
                giorno = "mer";
        break;
       
        case 3:
                giorno = "gio";
        break;
       
        case 4:
                giorno = "ven";
        break;
       
        case 5:
                giorno = "sab";
        break;
       
        case 6:
                giorno = "dom";
        break;
    }
   
    return (&giorno[0]);
   
}


sono agli inizi :oops:


la funzione che ti ho dato serve a stampare in uscita invece che il numero la stringa corrispondente...


questo è per darti una visione di complesso...
Codice: Seleziona tutto
#include <iostream>
#include <stdlib.h>

enum settimana {lun, mar, mer, gio, ven, sab, dom};

char* ret_giorno(settimana settpass)
{
    char* giorno;
    switch (settpass)
    {
   
        case 0:
                giorno = "lun";
        break;
       
        case 1:
                giorno = "mar";
        break;
       
        case 2:
                giorno = "mer";
        break;
       
        case 3:
                giorno = "gio";
        break;
       
        case 4:
                giorno = "ven";
        break;
       
        case 5:
                giorno = "sab";
        break;
       
        case 6:
                giorno = "dom";
        break;
    }
   
    return (&giorno[0]);
   
}

int main(int argc, char *argv[])
{
  settimana a = lun;
  cout<<a<<endl<<endl
  <<ret_giorno(a)<<endl;
 
  a = (settimana)( ((int)a + 1)%7 );

 
  cout<<a<<endl<<endl
  <<ret_giorno(a)<<endl;

  system("PAUSE");   
  return 0;
}
Le uniche limitazioni che abbiamo sono quelle che ci poniamo da soli...
http://www.lightingandservices.com
http://www.lightingandservices.com/phoenix
rayden
Utente Senior
 
Post: 881
Iscritto il: 07/08/01 01:00

Postdi Andrea87 » 12/04/03 13:22

Codice: Seleziona tutto
char* ret_giorno(settimana settpass)
{
return (&giorno[0]);
}



allora qua inizia la funzione che ha come input settpass (variabile "settimana" che corrisponde ad un numero intero) e come output un array di char rappresentato da giorno.
Non capisco perchè usi i puntatori.

[code]
char* giorno;
switch (settpass)
{

case 0:
giorno = "lun";
break;

case 1:
giorno = "mar";
break;

case 2:
giorno = "mer";
break;

case 3:
giorno = "gio";
break;

case 4:
giorno = "ven";
break;

case 5:
giorno = "sab";
break;

case 6:
giorno = "dom";
break;
}

Qui viene dichiarata una variabilie giorno che io avrei dichiarato così
char giorno[3];
anche qui nn capisco l'uso dei puntatori.
La variabile giorno assume valore "lun" se settpass=0, "mar" se setpass=1 etc...
NN capisco l'uso di tutti questi puntatori :-?
Andrea87
Utente Senior
 
Post: 857
Iscritto il: 03/09/01 01:00
Località: Venezia

Postdi rayden » 12/04/03 13:23

pjfry ha scritto:
Codice: Seleziona tutto
return (&giorno[0]);
forse qui bastava
Codice: Seleziona tutto
return giorno;
che dovrebbe restituire comunque un puntatore al primo byte... tanti modi per fare la stessa cosa :)


si lo so che è lo stesso ma è un cruccio mentale mio ed è anche una chiarezza di scrittura... mentalmente mi viene meglio scrivere così... appunto perchè è la stessa cosa... :D
Le uniche limitazioni che abbiamo sono quelle che ci poniamo da soli...
http://www.lightingandservices.com
http://www.lightingandservices.com/phoenix
rayden
Utente Senior
 
Post: 881
Iscritto il: 07/08/01 01:00

Postdi rayden » 12/04/03 13:29

Andrea87 ha scritto:Qui viene dichiarata una variabilie giorno che io avrei dichiarato così
Codice: Seleziona tutto
char giorno[3];

anche qui nn capisco l'uso dei puntatori.
La variabile giorno assume valore "lun" se settpass=0, "mar" se setpass=1 etc...
NN capisco l'uso di tutti questi puntatori :-?


bè la differenza è che tu definisci una dimenzione massima all'array io no, io creo solo un puntatore alla prima cella dell'array.

quello che ho scritto io

Codice: Seleziona tutto
char* giorno


tu invece faresti

Codice: Seleziona tutto
char giorno[3];


dal tuo posso tranquillamente estrarre il mio facendo così:

Codice: Seleziona tutto
char giorno[3];
char* prtgiorno = &giorno[0];


inoltre uso i puntatori nella funzione in quanto passo la variabile per riferimento... è praticamente lo stesso...
ti do un consiglio impara ad usare i puntatori che sono uno strumento potentissimo ed irrinunciabile nella programmazione...
Le uniche limitazioni che abbiamo sono quelle che ci poniamo da soli...
http://www.lightingandservices.com
http://www.lightingandservices.com/phoenix
rayden
Utente Senior
 
Post: 881
Iscritto il: 07/08/01 01:00

Postdi Nemok » 12/04/03 14:13

Capisci i puntatori e con C/C++ stai a cavallo....senza quelli ti spari......all'inizio è parecchio impiccioso,devi combatterci un po'.
Nel 1968 la potenza operativa di 2 C-64 hanno portato un razzo sulla luna. Oggi la potenza operativa di un Athlon 4000+ viene usata per far girare Windows XP....Qualcosa deve essere andato storto....
--Powered by Debian Sid/unstable on 2.6.10--
Nemok
Utente Senior
 
Post: 1420
Iscritto il: 04/09/01 01:00
Località: Roma

Postdi zello » 12/04/03 14:32

Una cosa così potrebbe andare?
Codice: Seleziona tutto
#include <iostream>

using namespace std;

enum Settimana{lun,mar,mer,gio,ven,sab,dom};

const char* giorno(Settimana sett)
{
        static const char* nomi[]={"lun","mar","mer","gio","ven","sab","dom"};
        return nomi[(int)sett];
}

int main()
{
        Settimana sett=dom;
        cout<<"Il giorno e' "<<giorno(sett)<<endl;
        return 0;
}


*Non* c'è error checking (ma è facile piazzarcelo).
Ciao
Il faut être toujours ivre. Tout est là : c'est l'unique question. Pour ne pas sentir l'horrible fardeau du Temps qui brise vos épaules et vous penche vers la terre,il faut vous enivrer sans trêve...
Avatar utente
zello
Moderatore
 
Post: 2351
Iscritto il: 06/05/02 13:44

Prossimo

Torna a Discussioni


Topic correlati a "Tipi enumerativi in c++":


Chi c’è in linea

Visitano il forum: Nessuno e 13 ospiti