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 3

Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 11:39
Sabato, 20/01/2018
Testo quotato

Postato originariamente da daniel007boss:

Testo quotato

Postato originariamente da Poggi Marco:

L funzione strncat() serve a concatenare due vettori di char.
Come già detto devi implementare un algoritmo di ordinamento (esempio https://it.wikipedia.org/wiki/Bubble_sort).
Ovviamente gli scambi di posizione, quando necessari, vanno fatti contemporaneamente sui due vettori, tra gli stessi indici.  

conta che sono in 3superiore, e sinceramente ho più dubbi che certezze, e sinceramente un algoritmo di ordinamento, bhe non saprei nemmeno da dove iniziare per farlo

Se ti è stato assegnato un esercizio di ordinamento, significa che gli strumenti teorici per risolverlo ti sono stati già dati.
Ti consiglio di fare più domande al tuo insegnante.

Ps.: Chi ti  ha consigliato il Dev-c++ ? :noway:
Esistono ambienti di sviluppo più aggiornati : microsoft visual studio o code::bloks

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 12:18
Sabato, 20/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...
   ( ... )



Lascia perdere le union ! La loro caratteristica è appunto quella di sovrapporrei i dati.
Esempio:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdint.h>
  5.  
  6. #define LMAX_NOME   31
  7. #define QDATI        5
  8.  
  9. typedef struct
  10. {
  11.     uint16_t anno;
  12.     uint8_t mese;
  13.     uint8_t giorno;
  14. }data_struct;
  15.  
  16. typedef union {
  17.     uint32_t data_long;
  18.     data_struct data;
  19. }data_union ;
  20.  
  21. typedef struct  {
  22.     char nome[LMAX_NOME+1];
  23.     data_union data;
  24. }dato_struct;
  25.  
  26. void compila_dato( dato_struct *dato, const char *nome, int a, int m, int g )
  27. {
  28.     // sarebbe bene controllare la validita' dei parametri...
  29.     strncpy( dato->nome, nome, LMAX_NOME );
  30.     dato->data.data.anno   = a;
  31.     dato->data.data.mese   = m;
  32.     dato->data.data.giorno = g;
  33. }
  34.  
  35. int main() {
  36.     dato_struct dati[QDATI];
  37.  
  38.     compila_dato( &dati[0], "Rossi Ernesto", 2001, 2, 27 );
  39.     compila_dato( &dati[1], "Bianchi Giovanna", 1998, 2, 28 );
  40.     compila_dato( &dati[2], "Beethoven Ludwig Van", 1770, 12, 16 );
  41.     compila_dato( &dati[3], "Clementi Muzio", 1752, 1, 23 );
  42.     compila_dato( &dati[4], "Carulli Ferdinando", 1770, 2, 9 );
  43.     uint32_t differenza;
  44.     differenza = dati[0].data.data_long - dati[1].data.data_long;
  45.     printf("Ernesto : %d Giovanna %d differenza: %d",
  46.             dati[0].data.data_long, dati[1].data.data_long, differenza);
  47.     return 0;
  48. }



Da programma, risulta che Giovanna è più giovane di Ernesto.

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 13:56
Sabato, 20/01/2018
Questo mi stupisce! E' come se il giorno venisse considerato prevalente sull'anno, ovvero come se nell'uint32_t di data_union i dati venissero "inglobali" non nell'ordine anno, mese, giorno ma in quello giorno, mese, anno! Infatti, se nella data_struct inverto l'ordine dei campi le cose vanno come mi sarei aspettato. Perché succede una cosa del genere?


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:37
Sabato, 20/01/2018
Testo quotato

Postato originariamente da AldoBaldo:

Questo mi stupisce!



A me non stupisce che ti stupisca, dato che ho sempre detto che scrivere codice senza avere studiato le basi non fa altro che portare a problemi.

Cerca

little-endian

e studia l'argomento. Da questo capirai.

Ultima modifica effettuata da nessuno il 20/01/2018 alle 14:38


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 15:05
Sabato, 20/01/2018
Avevo immaginato che avesse a che fare con la endianness (i "sintomi" erano quelli di uno scambio di posizione dei byte), però non essendo sicuro ho preferito esprimermi in forma dubitativa.

Quest'altra soluzione funziona... chissà se c'è anche qui qualche "errore occulto".

Codice sorgente - presumibilmente C++

  1. #include <cstdlib>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <stdint.h>
  5.  
  6. #define LMAX_NOME   31
  7. #define QDATI        5
  8.  
  9. struct DATA {
  10.     uint16_t anno;
  11.     uint8_t  mese;
  12.     uint8_t  giorno;
  13.  
  14.     uint32_t Come_uint32_t( void ) const {
  15.         return (((uint32_t)anno)<<16)|(((uint32_t)mese)<<8)|((uint32_t)giorno);
  16.     }
  17.  
  18.     bool operator == ( const DATA& altra_data ) const
  19.         { return Come_uint32_t() == altra_data.Come_uint32_t(); }
  20.  
  21.     bool operator != ( const DATA& altra_data ) const
  22.         { return Come_uint32_t() != altra_data.Come_uint32_t(); }
  23.  
  24.     bool operator  < ( const DATA& altra_data ) const
  25.         { return Come_uint32_t() < altra_data.Come_uint32_t(); }
  26.  
  27.     bool operator  > ( const DATA& altra_data ) const
  28.         { return Come_uint32_t() > altra_data.Come_uint32_t(); }
  29.  
  30.     const char *Come_stringa( void ) const;
  31. };
  32.  
  33. const char *DATA::Come_stringa( void ) const {
  34.     static char buff[16];
  35.     sprintf( buff, "%02d/%02d/%04d", giorno, mese, anno );
  36.     return buff;
  37. }
  38.  
  39. typedef struct {
  40.     char nome[LMAX_NOME+1];
  41.     DATA data;
  42. } dato_struct;
  43.  
  44. void mostra_dati( dato_struct *dato, uint32_t qDati ) {
  45.     for( uint32_t i=0; i<qDati; ++i )
  46.         printf( "%s %s\n", dato[i].data.Come_stringa(), dato[i].nome );
  47. }
  48.  
  49. int confronta_per_data( const void *p1, const void *p2 ) {
  50.     return ((dato_struct*)(p1))->data==((dato_struct*)(p2))->data ? 0 :
  51.            (((dato_struct*)(p1))->data<((dato_struct*)(p2))->data?-1:1);
  52. }
  53.  
  54. int main() {
  55.     dato_struct dati[QDATI] = {
  56.         { "Mozart Wolfgang Amadeus", 1756,  1, 27 },
  57.         { "Haydn Franz Joseph",      1732,  3, 31 },
  58.         { "Beethoven Ludwig van",    1770, 12, 16 },
  59.         { "Clementi Muzio",          1752,  1, 23 },
  60.         { "Carulli Ferdinando",      1770,  2,  9 }
  61.     };
  62.    
  63.     printf( "\n\nPrima dell'ordinamento:\n\n" );
  64.     mostra_dati( dati, QDATI );
  65.  
  66.     qsort( dati, QDATI, sizeof(*dati), confronta_per_data ); // ordinamento
  67.  
  68.     printf( "\n\nDopo l'ordinamento:\n\n" );
  69.     mostra_dati( dati, QDATI );
  70.  
  71.     return 0;
  72. }


Ultima modifica effettuata da AldoBaldo il 20/01/2018 alle 15:13


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 15:09
Sabato, 20/01/2018
Testo quotato

Postato originariamente da nessuno:

Testo quotato

Postato originariamente da AldoBaldo:

Questo mi stupisce!



A me non stupisce che ti stupisca, dato che ho sempre detto che scrivere codice senza avere studiato le basi non fa altro che portare a problemi.

Cerca

little-endian

e studia l'argomento. Da questo capirai.

Usare le union in modo inappropriato è sempre un pericolo. A seconda dei processori, la codifica può essere big-endian, little-endian o middle-endian. Quindi generare risultati diversi su macchine diverse.

La soluzione più semplice è usare la libreria time.h (http://www.cplusplus.com/reference/ctime/) già pronta.

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 15:15
Sabato, 20/01/2018
Però con time.h sei "confinato" entro i limiti imposti dalla data d'inizio del conteggio (se non ricordo male collocata nel 1970) e quelli imposti dalle dimensioni del tipo time_t (a 32 bit siamo prossimi alla "scadenza").

Marco: "Usare le union in modo inappropriato è sempre un pericolo. A seconda dei processori, la codifica può essere big-endian, little-endian o middle-endian. Quindi generare risultati diversi su macchine diverse."

Ho ben visto! Il che dimostra che partecipare alle discussioni nei forum è utile, perché può indurre a puntare lo sguardo su qualcosa che magari leggendo i libri era sfuggito (non siamo macchine). Da oggi starò più attento a quel tipo di errore. Prima o poi sicuramente prenderò coscienza di altri possibili errori, e così via "finché morte non ci separi". Tanto la perfezione non è di questo mondo.

Ultima modifica effettuata da AldoBaldo il 20/01/2018 alle 15:19


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 18:13
Sabato, 20/01/2018
Scusa.
Ho postato senza leggere la tua ultima correzione. Tra l'altro, devo ammettere, davvero elegante.

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