Problemi con struct e enum in C

miky7

Utente Attivo
4
0
Ciao a tutti purtroppo ho un paio di problemi con le struc e le enum...ovvero mi spiego meglio:
vorrei creare una struct data e in questa inserire dei valori presi da un enum in cui inserisco sia i giorni che i mesi..posto il codice che però non funziona ma amgari si capisce meglio:

#include <stdio.h>
#include <stdlib.h>


typedef struct data
{
int mese;
int giorno;
};

int main()
{

typedef enum {Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno, Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre} mese;
typedef enum {Lunedi, Martedi, Mercoledi, Giovedi, Venerdi, Sabato, Domenica} giorno;

struct data *oggi;
oggi=(struct data *) malloc (sizeof(struct data));
mese prova=1;
giorno prov=1;
oggi->mese=prova;
oggi->giorno=prov;
printf("%s %s\n",oggi->giorno, oggi->mese);
free(oggi);
return 0;
}

In realtà poi il mio scopo sarebbe quello di chiedere all'utente di inserire una data tramite printf("Inserisci una data") ecc e scanf("", )nella scanf gli verrebbero passati poi valori numerici..
qualche consiglio??
Grazie mille a tutti in anticipo
smile.gif
 

Mr Storm

Utente Attivo
77
19
CPU
Intel Core i5 750
Scheda Madre
Asus P7P55D Deluxe
HDD
500 GB
RAM
Corsair 8GB DDR3 1600 MHz
GPU
Sapphire HD5850
Monitor
Asus VK222H 22"
PSU
OCZ ModXstream Pro 700W
OS
Windows 7 Professional x64
Attenzione, dal codice che hai postato sembra che tu non abbia capito l'uso dei tipi enumerativi; essi, infatti, permettono di associare, nel sorgente del programma, un identificatore ad un valore intero, solo per migliorare la leggibilità del codice.

Con questa istruzione:
Codice:
typedef enum {Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno, Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre} mese;
associ all'identificatore Gennaio il valore numerico 0, a Febbraio 1, ..., a Dicembre 11, per poter scrivere istruzioni del tipo:
Codice:
oggi->mese = Gennaio;
invece di:
Codice:
oggi->mese = 0;

L'istruzione:
Codice:
printf("%s %s\n",oggi->giorno, oggi->mese);
è errata: infatti oggi->giorno e oggi->mese sono interi e non verrà stampato, al contrario di quello che suppongo tu volessi, gli identificatori associati al valore del giorno e del mese definiti nel tipo enumerativo; per ottenere tale risultato, puoi utilizzare dei vettori di stringhe d'appoggio:

Codice:
#include <stdio.h>
#include <stdlib.h>


struct data {
	int mese;
	int giorno;
};

int main() {
	
	typedef enum {Gennaio, Febbraio, Marzo, Aprile, Maggio, Giugno, Luglio, Agosto, Settembre, Ottobre, Novembre, Dicembre} mese;
	typedef enum {Lunedi, Martedi, Mercoledi, Giovedi, Venerdi, Sabato, Domenica} giorno;

	char* mesi[] = {"Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"};
	char* giorni[] = {"Lunedi", "Martedi", "Mercoledi", "Giovedi", "Venerdi", "Sabato", "Domenica"};

	struct data oggi;
	oggi.mese=Marzo;
	oggi.giorno=Martedi;
	printf("%s %s\n",mesi[oggi.mese], giorni[oggi.giorno]); // stampa Marzo Martedi

	return 0;
}

L'uso dei tipi enumerativi non è indispensabile per ottenere tale risultato; anche il seguente codice funziona senza problemi:

Codice:
#include <stdio.h>
#include <stdlib.h>


struct data {
	int mese;
	int giorno;
};

int main() {

	char* mesi[] = {"Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"};
	char* giorni[] = {"Lunedi", "Martedi", "Mercoledi", "Giovedi", "Venerdi", "Sabato", "Domenica"};

	struct data oggi;
	oggi.mese=2;
	oggi.giorno=1;
	printf("%s %s\n",mesi[oggi.mese], giorni[oggi.giorno]); // stampa Marzo Martedi

	return 0;
}
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

U
  • Chiuso
Risposte
6
Visualizzazioni
358
Programmazione
Utente cancellato 359755
U

Entra

oppure Accedi utilizzando

Hot: E3 2021, chi ti è piaciuto di più?

  • Ubisoft

    Voti: 26 20.3%
  • Gearbox

    Voti: 2 1.6%
  • Xbox & Bethesda

    Voti: 84 65.6%
  • Square Enix

    Voti: 9 7.0%
  • Capcom

    Voti: 6 4.7%
  • Nintendo

    Voti: 18 14.1%
  • Altro (Specificare)

    Voti: 11 8.6%

Discussioni Simili