Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ordinamento per data
Forum - C/C++ - Ordinamento per data - Pagina 5

Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo
Avatar
daniel007boss (Normal User)
Newbie


Messaggi: 9
Iscritto: 19/01/2018

Segnala al moderatore
Postato alle 19:22
Giovedì, 25/01/2018
Testo quotato

Postato originariamente da AldoBaldo:

Magari scrivo una cosa che didatticamente non ha senso, però non sarebbe più sensato usare delle struct? Se non le hai ancora studiate, cercale sul libro, non sono difficili da capire e in questo caso ti semplificherebbero parecchio la vita!

In pratica, una struct è un insieme di variabili raggrupate in un unico "blocco" che puoi trattare come un tutt'uno. Userei la metafora di uno scatolone: dentro ci metti quel che ti pare, quando lo chiudi è un unico scatolone e lo puoi maneggiare come un tutt'uno, ogni volta che ti serve puoi guardarci dentro e scoprire che quel che ci avevi messo è ancora lì, immutato.

Nel tuo caso, invece di creare due vettori da gestire in parallelo, potresti crearne uno solo che assicura "in automatico" la coerenza tra il nome e la data (a meno che ti sia stato esplicitamente detto di fare diversamente).

Per agevolare l'ordinamento delle date, invece, potresti usare le union (altro costrutto che non so se puoi o non puoi usare, né se lo conosci oppure no).

Una union è un po' come una struct, ma "impacchettata" in modo che i suoi elementi si sovrappongano, si fondano in un tutt'uno. Ad esempio, se organizzi la tua data in forma numerica (non come stringa!) con anno, mese e giorno, in una singola struct...

Codice sorgente - presumibilmente C++

  1. struct data_struct {
  2.     uint16_t anno;  // uint16_t e' un intero senza segno a 16 bit (in pratica un
  3.                     // unsigned short int); per usarlo devi includere <stdint.h>
  4.     uint8_t mese;   // uint8_t e' un intero senza segno a 8 bit (in pratica un
  5.     uint8_t giorno; // unsigned char); per usarlo devi includere <stdint.h>
  6. };



... e poi inserisci quella struct in una union che comprenda anche un uint32_t, finisci per avere una data che puoi leggere nei suoi singoli elementi, oppure come un tutt'uno trasformato in un valore intero senza segno che indica date più recenti col crescere del valore e più "antiche" col ridursi del valore. Molto comodo per riordinarle!

Codice sorgente - presumibilmente C/C++

  1. union data_union {
  2.     uint32_t data_long; // uint32_t e' un intero senza segno a 32 bit (in
  3.                         // pratica un unsigned long int); per usarlo devi
  4.                         // includere <stdint.h>
  5.     data_struct data;   // la struttura della data (quella vista prima) si
  6.                         // "sovrappone" al valore a 32 bit, diventando un
  7.                         // tutt'uno con esso; a quel punto puoi decidere di
  8.                         // leggere la data nella sua forma divisa in anno, mese
  9.                         // e giorno, oppure di leggerla come una "fusione" di
  10.                         // anno, mese e giorno
  11. };



Da lì ad usare la data in questa forma nel tuo problema, il passo è breve: fai una struttura che contenga la stringa del nome e la struttura della data (e' come mettere degli "scatoloni" uno dentro l'altro).

Codice sorgente - presumibilmente C/C++

  1. struct dato_struct {
  2.     char nome[LMAX_STR+1]; // lo spazio per la stringa del nome
  3.     data_union data;       // la data, leggibile come anno, mese, giorno
  4.                            // oppure come uint32_t, secondo convenienza
  5. };



A questo punto, puoi accedere ai dati in un modo come questo:

Codice sorgente - presumibilmente C++

  1. #include <string.h>
  2. #include <stdint.h>
  3.  
  4. #define LMAX_NOME   31
  5. #define QDATI        5
  6.  
  7. struct data_struct {
  8.     uint16_t anno;
  9.     uint8_t mese;
  10.     uint8_t giorno;
  11. };
  12.  
  13. union data_union {
  14.     uint32_t data_long;
  15.     data_struct data;
  16. };
  17.  
  18. struct dato_struct {
  19.     char nome[LMAX_NOME+1];
  20.     data_union data;
  21. };
  22.  
  23. void compila_dato( dato_struct *dato, const char *nome, int a, int m, int g ) {
  24.     // sarebbe bene controllare la validita' dei parametri...
  25.     strncpy( dato->nome, nome, LMAX_NOME );
  26.     dato->data.data.anno   = a;
  27.     dato->data.data.mese   = m;
  28.     dato->data.data.giorno = g;
  29. }
  30.  
  31. int main() {
  32.     dato_struct dati[QDATI];
  33.  
  34.     compila_dato( &dati[0], "Mozart Wolfgang Amadeus", 1756, 1, 27 );
  35.     compila_dato( &dati[1], "Haydn Franz Joseph", 1732, 3, 31 );
  36.     compila_dato( &dati[2], "Beethoven Ludwig Van", 1770, 12, 16 );
  37.     compila_dato( &dati[3], "Clementi Muzio", 1752, 1, 23 );
  38.     compila_dato( &dati[4], "Carulli Ferdinando", 1770, 2, 9 );
  39.  
  40.     return 0;
  41. }



Il bello è che dopo aver immesso i dati, la data di nascita di Mozart puoi leggerla sia come 1756, 1, 27, sia come 0x1B0106DC (453052124), quella di Haydn sia come 1732, 3, 31, sia come 0x1F0306C4 (520292036)! A questo punto, il confronto è immediato, perché 520292036 è chiaramente maggiore di 453052124 e rende evidente che Mozart è nato dopo Haydn. In più, avendo i dati "inscatolati" in una sola struttura, lo scambio da attuare nella funzione di ordinamento si può fare in un colpo solo, senza il rischio di "mischiare" malamente nomi e date, confondendo le corrispondenze. :heehee:






finalmente ho capito grazie molte per l'opzione..comunque non le ho mai fatte ma a quanto pare sono veramente semplici,grazie!

PM Quote
Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo