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++ - Scomporre una data in più stringhe
Forum - C/C++ - Scomporre una data in più stringhe

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
lorenzoscarrone (Normal User)
Pro


Messaggi: 92
Iscritto: 16/11/2011

Segnala al moderatore
Postato alle 14:07
Sabato, 06/06/2015
Ciao a tutti, non sono sicuro che il titolo sia azzeccato, sto facendo un programma in c per confrontare delle date scritte nel seguente formata  stringa[] = {gg/mm/aaaa};

per verificare se una data e più recente di un'altra volevo fare il seguente confronto

data = gg+mm*100+aaaa*10000 in modo che ad esempio la data 11/12/1995 sia 19951211

il problema sta nel scomporre gg/mm/aaaa in gg mm aaaa , non vorrei usare il token , esiste un altro modo?
grazie in anticipo

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 14:14
Sabato, 06/06/2015
Puoi sostituire "{" e "}" con "" e poi fare uno split delle stringhe su "/". Non so se vuesti algoritmi ci siano nella libreria standard. Se non ci sono avrai da divertirti per le prossime ore, o usi una libreria per la gestione delle stringhe più avanzata (avrai da divertirti anche in questo caso).

PM Quote
Avatar
lorenzoscarrone (Normal User)
Pro


Messaggi: 92
Iscritto: 16/11/2011

Segnala al moderatore
Postato alle 14:16
Sabato, 06/06/2015
ahah va be userò il classico token, ahah rimpiango il php per queste cose :d:_doubt:

PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 14:37
Sabato, 06/06/2015

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 15:46
Sabato, 06/06/2015
strtok è la funzione adatta per lo scopo.

Altrimenti puoi scrivere il codice da zero, ma non mi sembra una buona soluzione a meno che non sia per scopo didattico.


Il mio blog: https://piero.dev
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 17:03
Sabato, 06/06/2015
Per puro divertimento ho provato a mettere insieme un programmino d'esempio che fa quel che diceva Lorenzo. Non è che suscito le ire di qualcuno se lo inserisco qui, vero? Tempo fa, in un altro sito sulla programmazione in C, mi ruppero a dovere le scatole accusandomi di "spoon feeding". A me sembrò una cosa molto fuori luogo, perché non vedo cosa ci sia di male nello scambiarsi idee e/o informazioni. In definitiva, io ho imparato quel poco che so leggendo il codice altrui (oltre a una certa dose di manuali). Ai moderatori chiedo quindi: posso procedere con l'invio o mi tengo per me l'esercizio/giocherello (ampiamente commentato) che ho fatto?

PS: a parte stdlib.h, stdio.h e ctype.h non ho usato librerie.

PPSS: A dimostrazione di come sia utile scambiarsi idee, a me non sarebbe mai venuto in mente il metodo suggerito con "data = gg+mm*100+aaaa*10000 in modo che ad esempio la data 11/12/1995 sia 19951211".

Ultima modifica effettuata da AldoBaldo il 06/06/2015 alle 17:12


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
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 18:15
Sabato, 06/06/2015
Io sono il moderatore di altre sezioni e non ci vedo nulla di male a postare il sorgente in questo contesto.  

PM Quote
Avatar
Ultimo (Member)
Guru


Messaggi: 877
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 18:43
Sabato, 06/06/2015
Testo quotato

Postato originariamente da AldoBaldo:

Per puro divertimento ho provato a mettere insieme un programmino d'esempio che fa quel che diceva Lorenzo. Non è che suscito le ire di qualcuno se lo inserisco qui, vero? Tempo fa, in un altro sito sulla programmazione in C, mi ruppero a dovere le scatole accusandomi di "spoon feeding". A me sembrò una cosa molto fuori luogo, perché non vedo cosa ci sia di male nello scambiarsi idee e/o informazioni. In definitiva, io ho imparato quel poco che so leggendo il codice altrui (oltre a una certa dose di manuali). Ai moderatori chiedo quindi: posso procedere con l'invio o mi tengo per me l'esercizio/giocherello (ampiamente commentato) che ho fatto?

PS: a parte stdlib.h, stdio.h e ctype.h non ho usato librerie.

PPSS: A dimostrazione di come sia utile scambiarsi idee, a me non sarebbe mai venuto in mente il metodo suggerito con "data = gg+mm*100+aaaa*10000 in modo che ad esempio la data 11/12/1995 sia 19951211".



invia pure, non è pappa pronta :k:


If ok Then GOTO Avanza else GOTO Inizia

PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 19:29
Sabato, 06/06/2015
Ah! Allora è vero che al mondo esiste ancora gente sana di mente! :)

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4.  
  5.  
  6. #define MAX_DATE 32 /* il numero massimo di date gestibili dal programma */
  7.  
  8.  
  9. struct DATA { /* struttura usata per contenere una data scomponendola in g/m/a. */
  10.     char g;   /* giorno, gamma 0-127   */
  11.     char m;   /* mese,   gamma 0-127   */
  12.     short a;  /* anno,   gamma 0-32767 */
  13. };            /* 4 byte in tutto       */
  14.  
  15.  
  16. const char esDateStr[] =
  17.     "25/02/2015,12/05/1997,23/05/1997,18/03/2009,18/03/2009,12/03/2009";
  18. const char *esRelStr[] = { "piu' antica", "contemporanea", "piu' recente" };
  19.  
  20.  
  21. /* prototipi */
  22. const char *LeggiData( const char *s, struct DATA *d );
  23. int ConfrontaDate( struct DATA *d1, struct DATA *d2 );
  24.  
  25.  
  26. int main() {
  27.     struct DATA date[MAX_DATE]; /* un array di strutture destinato
  28.                                    a contenere le date rilevate */
  29.     const char *p = esDateStr;  /* un puntatore ausiliario */
  30.     int totDate = 0;            /* dopo l'analisi della stringa, conterra'
  31.                                    la quantita' delle date rilevate */
  32.     int i;                      /* usato come contatore */
  33.  
  34.     /* scorre la stringa rilevando una data alla volta */
  35.     for( totDate=0; *p != '\0' && totDate < MAX_DATE; ++totDate ) {
  36.         p = LeggiData( p, &date[totDate] );
  37.     }
  38.  
  39.     printf( "\n La stringa con le tue date d'esempio e':\n %s\n\n", esDateStr );
  40.  
  41.     /* fai quel che vuoi con le date rilevate, magari usando
  42.        ConfrontaDate() per rilevare quelle piu' o meno recenti */
  43.  
  44.     for( i=0; i<totDate-1; ++i ) {
  45.         printf( " %02d/%02d/%04d e' %s di %02d/%02d/%04d\n",
  46.                 date[i].g, date[i].m, date[i].a,
  47.                 esRelStr[ConfrontaDate(&date[i],&date[i+1])+1],
  48.                 date[i+1].g, date[i+1].m, date[i+1].a );
  49.     }
  50.  
  51.     return 0;
  52. }
  53.  
  54. /*
  55. Analizza la stringa C "s", che si suppone sia correttamente formattata con date
  56. nel formato giorno, mese, anno (tutti e tre esplicitati). I separatori tra le
  57. parti della data e tra una data e l'altra possono essere qualsiasi carattere ad
  58. esclusione dei caratteri numerici 0-9. Per verificare se i caratteri sono o non
  59. sono numerici impiega la funzione di libreria standard "isdigit()".
  60. */
  61.  
  62. const char *LeggiData( const char *s, struct DATA *d ) {
  63.     d->g = atoi( s );         /* legge il giorno */
  64.     while( isdigit(*s++) );   /* passa oltre al delimitatore
  65.                                  che separa le parti della data */
  66.     d->m = atoi( s );         /* legge il mese */
  67.     while( isdigit(*s++) );   /* passa oltre al delimitatore
  68.                                  che separa le parti della data */
  69.     d->a = atoi( s );         /* legge l'anno */
  70.     while( isdigit(*s) ) ++s; /* passa oltre gli ultimi caratteri numerici */
  71.     if( *s != '\0' ) ++s;     /* passa oltre all'eventuale delimitatore
  72.                                  usato per separare una data dall'altra */
  73.     return s;                 /* restituisce un puntatore alla data
  74.                                  successiva o alla fine della stringa */
  75. }
  76.  
  77. /*
  78. Confronta le due date passate in d1 e d2.
  79. Se d1 e' piu' "antica" di d1 restituisce 1.
  80. Se d1 e' piu' recente di d2 restituisce -1.
  81. Se d1 e' contemporanea a d2 restituisce 0.
  82. */
  83.  
  84. int ConfrontaDate( struct DATA *d1, struct DATA *d2 ) {
  85.     long data1 = d1->g + d1->m*100 + d1->a*10000;
  86.     long data2 = d2->g + d2->m*100 + d2->a*10000;
  87.     return data1>data2 ? 1 : (data1<data2?-1:0);
  88. }


Ultima modifica effettuata da AldoBaldo il 07/06/2015 alle 12:59


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
Pagine: [ 1 2 ] Precedente | Prossimo