PDA

Visualizza la versione completa : [C++] Lavorare con le date


Squall1988
14-12-2004, 14:45
Volevo scrivere una funzione in C++ che, ricevuto un numero di giorni trascorsi, ad esempio, dal 1 gennaio 1900, mi permetta di risalire alla data esatta. C' un modo per farlo, possibilmente senza utilizzare funzioni standard del c ma utilizzando un algoritmo??? Grazie infinite in anticipo

MMarzia
14-12-2004, 14:48
la prossima volata ricorda di specificare il linguaggio anche nel titolo, come da regolamento (http://forum.html.it/forum/showthread.php?threadid=588640)

pprllo
14-12-2004, 15:14
con una cosa del genere puoi tirare fuori l'anno:



for (aa = 0; (gg>=365 && (aa+1)%4) || (gg>=366 && !(aa+1)%4); aa++)
{
if (aa%4) gg-=365;
else gg-=366;
}


Ora pensa a come fare il resto.

Squall1988
14-12-2004, 15:19
interessante !!! Grazie mille

pprllo
14-12-2004, 20:02
P.S. Scusa ma c' un errore nel codice (ero di corsa). Diciamo che un codice valido potrebbe essere:


for (aa = 0; (gg>=365 && (aa%4)) || (gg>=366 && !(aa%4)); aa++)
{
if (aa%4) gg-=365;
else gg-=366;
}

pprllo
14-12-2004, 20:18
Ho scritto un codice completo, ma leggilo solo se non riesci a cavartela in nessun modo da solo:























































for (aa = 0; (gg>=365 && (aa%4)) || (gg>=366 && !(aa%4)); aa++)
{
if (aa%4) gg-=365;
else gg-=366;
}

for (mm = 1; (mm==2 && ((gg>=28 && !(aa%4)) || (gg>=29 && !(aa%4))))
|| ((mm==4 || mm==6 || mm==10 || mm==11) && gg>=30) || gg>=31; mm++)
{
if (mm==2)
{
if (aa%4) gg-=29;
else gg-=28;
}
else if (mm==4 || mm==6 || mm==10 || mm==11) gg-=30;
else gg-=31;
}

Squall1988
19-12-2004, 16:21
ho provato a scrivere questa funzione, utilizzandoi frammenti che mi avete dato



void num2date (long ng, int *gg, int *mm, int *aa)
{
ng += 2;

for (*aa = 0; ((ng >= 365 && (!(isBisS(*aa))))||(ng >= 366 && isBisS(*aa))); (*aa)++)
if (isBisS(*aa))
ng -= 366;
else
ng -= 365;

for (*mm = 1;
(( *mm == 2 && (( ng > 29 && isBisS (*aa))||(ng> 28 && !isBisS (*aa))))
|| (( *mm == 4 || *mm == 6 || *mm == 9 || *mm == 11) && ng > 30)
|| ng > 31);
(*mm)++ )
{
if (*mm == 2)
if (isBisS(*aa))
ng -= 29;
else
ng -= 28;
else
if (*mm == 4 || *mm == 6 || *mm == 9 || *mm == 11)
ng -= 30;
else
ng -= 31;
}

*gg = ng;
return;
}


ng il numero di giorni trascorsi dal 1 gennaio 0. (se si mette esattamente 1 gennaio 0 si ottiene il valore 0 e cos via).

Ora, non capisco xk con alcune dati questo codice funzioni, mentre con altre, specialmente prima del 2000, venga spostata di vari giorni... questo problema mi sta facendo impazzire :dh:

pprllo
19-12-2004, 21:06
A me cos da valori esatti ...


void num2date (long ng, int *gg, int *mm, int *aa)
{
for (*aa = 0; ((ng >= 365 && (!(isBisS(*aa))))||(ng >= 366 && isBisS(*aa))); (*aa)++)
if (isBisS(*aa))
ng -= 366;
else
ng -= 365;

for (*mm = 1;
(( *mm == 2 && (( ng > 29 && isBisS (*aa))||(ng> 28 && !isBisS (*aa))))
|| (( *mm == 4 || *mm == 6 || *mm == 9 || *mm == 11) && ng > 30)
|| ng > 31);
(*mm)++ )
{
if (*mm == 2)
if (isBisS(*aa))
ng -= 29;
else
ng -= 28;
else
if (*mm == 4 || *mm == 6 || *mm == 9 || *mm == 11)
ng -= 30;
else
ng -= 31;
}

*gg = ng+1;
return;
}

Squall1988
19-12-2004, 22:45
a me x niente... forse sbaglio a calcolare il numero di giorni?

pprllo
19-12-2004, 22:54
Mi sa di s. Per esempio con questo sito ci si trova:
http://www.ottiolu.net/tempo/terzo_millennio.php
E anche calcolando ... Forse non conti i bisestili ?

Loading