enum e struct in C

toni1705

Nuovo Utente
98
9
ho un piccolo esercizio da svolegere
esso richiede di creare un'appuntamento avendo nome cognome e giorno dell'appuntamento
ho creato una function per inserire un'appuntamento, una per eliminarlo.
ora dovrei crearne una per poter visualizzare ,dato il giorno, le persone da incontrare
il problema è che non saprei come accedere a quel dato.
visto che enum è una categoria e non posso accedervi dalla struct;
C:
enum Generi {
    lunedi,
    martedi,
    mercoledi,
    giovedi,
    venerdi
    };

typedef struct
{
    char nome[MAX];
    char cognome[MAX];
    enum Generi genere;
    float prezzo;
    int cancellato;

}appuntamento;
appuntamento app[MAX]={
    {"claudio","lollino",lunedi,7.5,0},
    {"adelaide","pecora",lunedi,9.5,0},
    {"tony","tammaro",martedi,9.5,0},
    {"augusto","caro",mercoledi,10.5,0},
    {"gianna"," nannini",giovedi,8.5,0},
    {"MARIA","NAZIONALE",venerdi,9.5,0},
    };

main()
{
    // al
}[

  int i;
    char GIORNI[10];
     for(i=0;i<MAXSTR;i++)
    {
        if(strcmp(GIORNI,LUNEDI)==0 )
        {
        //come faccio a stampare ? potrebbero esserci altre persone   ad essere state aggiunte  tramite function
        }
       else break;
    }
}
 
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Scusa ma non ho capito bene quello che vuoi fare...
Devi stampare tutte le persone che hanno un appuntamento il tal giorno, o non sai come stamparle mostrandole tipo "calendario" (prima lunedì, poi martedì etc)?

Innanzitutto non puoi fare una strcmp su una enum in quel modo. Oltretutto la strcmp non è sicura e dovresti usare strncmp.
A parte ciò, quello che devi fare è dare un valore ai membri della tua ENUM (numerandoli da 0 a 4) e creare un array con i giorni della settimana.
Per essere chiaro:

C:
enum Generi {
    lunedi=0,
    martedi=1,
    mercoledi=2,
    giovedi=3,
    venerdi=4
};

const char *days[5] = {"Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì"};

Poi accederai in questo modo: days[app[i].genere] per ottenere la stringa che rappresenta il nome del giorno della settimana.
La i in questo caso è l'indice del for che andrà da 0 al numero di appuntamenti (che a quanto pare nel tuo caso non è dinamico, quindi non ho capito come fai a dire che possono venire aggiunti più appuntamenti, visto che nel codice che mostri, non si vede).

Prima di darti altri hint attendo maggiori info (anche tutte le "define" che usi non hanno molto senso viste così)...
 
  • Mi piace
Reazioni: toni1705

Andretti60

Utente Èlite
6,440
5,091
Con quei dati definisci solo un giorno, quindi il calendario vale solo per una settimana. Che magari è anche giusto, dipende da cosa vuoi fare.
È un compito scolastico? Quello che hai pubblicato è parte di un codice (immagino sia una parte perché manca la definizione di MAX) che fa parte dell’esercizio, a cui deve aggiungere altro codice?
Un’altra nota, perché mai chiamare Generi l’enumerazione dei giorni della settimana?
Ad ogni modo il tuo codice è sbagliato.
Prima di tutto usi MAX sia per definire la lunghezza delle stringhe che la dimensione di un vettore, devono essere due definizioni diverse, sono due cose diverse.
Devi prima chiedere da terminale che giorno della settimana cercare, dopodiché eseguire un ciclo sugli elementi del vettore app[], e stampare tutti i nomi delle persone il cui appuntamento cade in quel giorno.
 
  • Mi piace
Reazioni: toni1705

toni1705

Nuovo Utente
98
9
Scusa ma non ho capito bene quello che vuoi fare...
Devi stampare tutte le persone che hanno un appuntamento il tal giorno, o non sai come stamparle mostrandole tipo "calendario" (prima lunedì, poi martedì etc)?

Innanzitutto non puoi fare una strcmp su una enum in quel modo. Oltretutto la strcmp non è sicura e dovresti usare strncmp.
A parte ciò, quello che devi fare è dare un valore ai membri della tua ENUM (numerandoli da 0 a 4) e creare un array con i giorni della settimana.
Per essere chiaro:

C:
enum Generi {
    lunedi=0,
    martedi=1,
    mercoledi=2,
    giovedi=3,
    venerdi=4
};

const char *days[5] = {"Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì"};

Poi accederai in questo modo: days[app[i].genere] per ottenere la stringa che rappresenta il nome del giorno della settimana.
La i in questo caso è l'indice del for che andrà da 0 al numero di appuntamenti (che a quanto pare nel tuo caso non è dinamico, quindi non ho capito come fai a dire che possono venire aggiunti più appuntamenti, visto che nel codice che mostri, non si vede).

Prima di darti altri hint attendo maggiori info (anche tutte le "define" che usi non hanno molto senso viste così)...

Con quei dati definisci solo un giorno, quindi il calendario vale solo per una settimana. Che magari è anche giusto, dipende da cosa vuoi fare.
È un compito scolastico? Quello che hai pubblicato è parte di un codice (immagino sia una parte perché manca la definizione di MAX) che fa parte dell’esercizio, a cui deve aggiungere altro codice?
Un’altra nota, perché mai chiamare Generi l’enumerazione dei giorni della settimana?
Ad ogni modo il tuo codice è sbagliato.
Prima di tutto usi MAX sia per definire la lunghezza delle stringhe che la dimensione di un vettore, devono essere due definizioni diverse, sono due cose diverse.
Devi prima chiedere da terminale che giorno della settimana cercare, dopodiché eseguire un ciclo sugli elementi del vettore app[], e stampare tutti i nomi delle persone il cui appuntamento cade in quel giorno.
allora esatto manca tutto una serie di codice.
essendo un 'esercizio preso online.
ho cercato di eludere la parte del codice già svolto modificandolo per far capire + o - il senso,
ovviamente come dite ci sono degli elementi che non vanno bene perchè ho cercato di generalizzare.
non mi andava di lasciare un codice di 40 righe XD.per questo ho definito solo 1 variabile generale chiamate MAX. Dispatch ha capito il problema. avevo bisogno di stampare tutte le persone che hanno un appuntamento il tal giorno.
grazie per l'aiuto riesco effettivamente a stampare correttamente tutte le info necessarie ora.
grazie :)
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
No problem, se hai domande siamo qui. Ricorda di riportare tutte le info in caso. ?
 

Andretti60

Utente Èlite
6,440
5,091
@DispatchCode in realtà non è necessario assegnare i valori di una enumerazione, il compilatore lo fa automaticamente assegnando il valore zero al primo elemento, aumentando poi di uno per ogni valore successivo. Li si assegnano quando si vuole “forzare” valori ben precisi, ma in quel caso perde un po’ il suo scopo. Vedi Qui il manuale.

Un comune errore è di salvare il valore di una enumeratore (su file o database), poi cambiare i valori del enumeratore (per esempio aggiungendo un valore nel mezzo) e ricompilare il programma, a quel punto i valori salvati non sono più compatibili. Il enumeratore è conveniente, ma occorre saperlo usare.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
@DispatchCode in realtà non è necessario assegnare i valori di una enumerazione, il compilatore lo fa automaticamente assegnando il valore zero al primo elemento, aumentando poi di uno per ogni valore successivo. Li si assegnano quando si vuole “forzare” valori ben precisi, ma in quel caso perde un po’ il suo scopo. Vedi Qui il manuale.

Un comune errore è di salvare il valore di una enumeratore (su file o database), poi cambiare i valori del enumeratore (per esempio aggiungendo un valore nel mezzo) e ricompilare il programma, a quel punto i valori salvati non sono più compatibili. Il enumeratore è conveniente, ma occorre saperlo usare.

Ah va bene, grazie per avermelo fatto notare. Temevo che potessero esserci problemi con compilatori differenti, non ricordavo se fosse uno standard.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!