PDA

Visualizza la versione completa : [C++] Differenza in giorni tra due date.


meclix
03-06-2007, 15:03
Salve a tutti,
Premetto che ho iniziato a studiare il linguaggio C ++ da poco tempo.
Sono ancora ai principi, ultimo argomento, istruzioni condizionali branch, questo giusto per fare un quadro della situazione.
Ora mi è stato affidato un esercizio, devo calcolare la differenza in giorni tra due date, ma non riesco ad entrare nel ragionamento.
Qualcuno può gentilmente indirizzarmi nel regionamento giusto ?
Ho pensato di ridurre le date in giorni, tenendo presente gli anni bisestili, ma.. come faccio poi a sottrarre i giorni già trascorsi dalle date e poi calcolare quelli che mancono per arrivare alla seconda data ?
Le cose sono due, o la soluzione è così semplice e io sono così stupido da non vederla oppure sono stupido.. e basta..! :berto:
Grazie in anticipo per le risposte.

meclix
04-06-2007, 16:05
Non c'è nessuno disponibile ad aiutarmi ?

bigmickey
04-06-2007, 16:27
Fai una funzione che calcola i giorni passati dall' anno 0.
Ti calcoli i giorni trascorsi per le due date e poi li sottrai in valore assoulto.

La somma dei giorni va fatta piu o meno così:

giorni = (anni-1)* 365 + anni bisestili + giorni trascorsi nell' ultimo anno.

comincia a scivere un pò di codice e postalo ;)

bigmickey
04-06-2007, 16:47
Ho buttato giu 2 righe.....ora sta a te



#include <stdio.h>
#include <stdlib.h>

int calcola_giorni(void);

int main()
{
int numgiorni1, numgiorni2, differenza;

numgiorni1 = calcola_giorni();
numgiorni2 = calcola_giorni();

differenza=abs(numgiorni1-numgiorni2);

printf("\n\nDifferenza dei giorni= %d\n\n" , differenza);

system("PAUSE");
return 0;
}


int calcola_giorni(void)
{
int numgiorni=0;
int giorno, mese, anno;

printf("Inserisci giorno: ");
scanf("%d" , &giorno );
/*controllare la validità del giorno */
printf("Inserisci mese: ");
scanf("%d" , &mese );
/*controllare la validità del mese*/
printf("Inserisci anno: ");
scanf("%d" , &anno );
printf("\n\n");

/*controllare la validità dell anno*/

/*controllare validità della data*/

/*calcoolo num giorni*/

return numgiorni;
}

meclix
04-06-2007, 17:58
WOW... ti ringrazio per le risposte, proverò a studiarmi il codice che mi hai postato, purtroppo le funzioni sono un capitolo che ancora non ho affrontato, e quel poco che ho studiato sino ad ora è completamente diverso.. sfoglierò un pò il libro a questo punto, così intato cerco di capire che cosa hai fatto.
Ad esempio, credo proprio di non conoscere il significato di & prima delle variabili giorno, mese anni! Proverò in ogni caso, grazie per avermi risposto.
Anche le librerie che hai incluso sono diverse, sino ad ora ho solo usato:


#include <iostream>
#include <cassert>
#include <string>
#include <cstring>

Queste sono le uniche che mi sono state presentate, ho detto di assere agli inizi, ma non pensavo così tanto, mi manca tanto vero ?? hehehe

bigmickey
04-06-2007, 18:24
Beh si hai ragione... mi sa di aver toppato un pò,
nel senso che il linguaggio era C++ io ho scritto in C.

Ma sono piccole modifiche... sostituisci
printf e scanf con cout e cin (dalla iostream)

meclix
05-06-2007, 02:05
Ok... :confused: ci sono delle cose che però non mi sono chiare. Ad esempio, prendo una cosa più corta, calcolare i giorni trascorsi dal primo gennaio di questo anno sino ad ora, ma i mesi non sono tutti di 31 giorni, ad esempio se fossero stati tutti di 31 gg, credo, sarebbe bastato un ciclo for che addizionava 31 ad una variabile sino a raggiungere il mese in questione, un esempio:



#include <iostream>

int result; //giorni trascorsi
int curDay; //giorno corrente
int curMonth; //mese corrente


int main() {
curDay = 5; //ipotetico giorno
curMonth = 6 //ipotetico mese

for(int i = 0; i <= curMonth; i++) {
result += 31;
}

std::cout << "Sono trascorsi: " << result << '\n';
return (0);
}


Così sarebbe semplice! :D
Ora lasciamo stare gli anni bisestili e il resto, come faccio a far capire al programma che, ad esempio, gennaio ha 31 gg, febbraio ne ha 28(dimenticando i bisestili x un attimo) etc..
(Tra l'altro il "ciclo for" è un'argomento che non ho ancora studiato, lo conosco solo grazie a javascript e php)..
Anche se volessi, prendere un bel 365 e sottrargli i giorni trascorsi, ma sono proprio quei gg che non mi stanno simpatici.. :D
Anyway.. è proprio questo che non riesco a capire.

Spero di non aver scritto cose ridicole, altrmineti, ridiamo per non piangere.
Grazie ancora!

bigmickey
05-06-2007, 09:55
Il programma non lo può capire da solo.
Potresti dichiarare un array di dimenione 12 i cui elementi sono i giorni di ogni mese.
Quindi senza considerare gli anni bisestili..

int mesi[12]= { 31 , 28 , 31 , 30 ... e così via

oppure usare questa formula (http://www.itccarli.it/Matematica/carldata.php)

meclix
05-06-2007, 15:38
Ci sono riuscito, mille grazie per gli spunti che mi hanno aiutato a ragionare..
In effetti non ho seguito molto il tuo codice :D sono un tipo abbastanza testardo e se non è farina del mio sacco non mi quadra! :D , cmq il merito è tuo, mi hai indirizzato sul ragionamentoi giusto! GRAZIE!
Posto il codice, sarei veramente felice se qualcuno me lo criticasse, veramente! :zizi:


#include <iostream>
#include <cassert>

int firstDay; //Giorno della prima data
int firstMonth; //Mese della prima data
int firstYear; //Anno prima data
int secDay; //Giorno seconda data
int secMonth; //mese seconda data
int secYear; //anno seconda data

int month[] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; /* mesi dell'anno
* in giorni
*/
int passedDayF; //giorni trascorsi nella prima data
int passedDayS; //giorni trascorsi seconda data
int remainingF; //giorni rimanenti nella prima data
int remainingS; //giorni rimanenti seconda data
int totDays; //risultato differenza fra le due date
int passedYear; //anni trascorsi dalla prima alla seconda data
int bisYear(0); //quanti anni bisestili ?


int main(){
std::cout << "Inserisci primo giorno: ";
std::cin >> firstDay;

assert(firstDay > 0); /*<------------ NOTA */
assert(firstDay <= 31); /*<---------- NOTA */

std::cout << "Inserisci primo mese: ";
std::cin >> firstMonth;

assert(firstMonth > 0); /*<---------- NOTA */
assert(firstMonth <= 12); /*<-------- NOTA */

std::cout << "Inserisci primo anno: ";
std::cin >> firstYear;

assert(firstYear > 0); /*<----------- NOTA */

std::cout << "Inserisci secondo giorno: ";
std::cin >> secDay;

assert(secDay > 0); /*<-------------- NOTA */
assert(secDay <= 31); /*<------------ NOTA */

std::cout << "Inserisci secondo mese: ";
std::cin >> secMonth;

assert(secMonth > 0); /*<------------ NOTA */
assert(secMonth <= 12); /*<---------- NOTA */

std::cout << "Inserisci secondo anno: ";
std::cin >> secYear;

assert(secYear > 0); /*<------------ NOTA */

assert(firstYear <= secYear); /*<---- NOTA */

/*>>>>>> CONTROLLO ANNI BISESTILI <<<<<<<*/
std::cout << "Considerando che: \n";

for (int i=firstYear; i<=secYear; i++){
if (((i % 4) == 0 && (i % 100) != 0) || (i % 400) == 0) {
std::cout << "Il " << i << " e' un anno bisestile!\n";
bisYear += 1;
} else {
std::cout << "Il " << i << " non e' un anno bisestile!\n";
}
}


/*>>>>>> GG TRASCORSI NELLA PRIMA DATA <<<<<<<<*/
for (int i=0; i < firstMonth; i++){
passedDayF += month[i];
}

passedDayF += firstDay;

std::cout << "\nSono passati: " << passedDayF << " gg nella prima data\n";

/*>>>>>> GG TRASCORSI SECONDA DATA <<<<<<<*/
for (int i=0; i<secMonth; i++) {
passedDayS += month[i];
}

passedDayS += secDay;

std::cout << "Sono passati: " << passedDayS << " gg nella seconda data!\n\n";

/*>>>>>>> CALCOLO GIORNI RESTANTI X COMPLETARE L'ANNO <<<<<<<<*/
remainingF = 365 - passedDayF; //prima data
remainingS = 365 - passedDayS; //seconda data

std::cout << "Rimangono : " << remainingF << " gg per completare l'anno (prima data)\n";
std::cout << "Rimangono : " << remainingS << " gg per completare l'anno (seconda data)\n\n";

passedYear = secYear - firstYear;

std::cout << "Tra le due date sono passati: " << passedYear << " anni!\n\n";

/* ---> Secondo gli anni trascorsi adatto il risultato <---- */
if (passedYear == 0)
totDays = ((365 + bisYear) - passedDayF) - remainingS;

if (passedYear == 1)
totDays = ((730 + bisYear) - passedDayF) - remainingS;

if (passedYear >= 2)
totDays = ((((passedYear+1) * 365) + bisYear) - passedDayF) - remainingS;

std::cout << "La differenza in gg tra le date e' di: " << totDays << " gg\n\n";

return (0);

}


Grazie ancora siete mitici!

MItaly
05-06-2007, 15:49
La tua soluzione è ottima, anche se C e C++ mettono già a disposizione strumenti per lavorare con le date nell'header time.h (ctime in C++):


#include <iostream>
#include <ctime>
using namespace std;
void getdate(tm * timestruct);
int main()
{
tm data1={0}, data2={0};
time_t td1, td2;
int diff;
cout<<"Calcolo differenza date\n";
cout<<"Inserire la prima data:\n";
getdate(&data1);
if((td1 = mktime(&data1)) == -1)
{
cerr<<"Data non valida\n";
return 1;
}
cout<<"Inserire la seconda data:\n";
getdate(&data2);
if((td2 = mktime(&data2)) == -1)
{
cerr<<"Data non valida\n";
return 1;
}
diff = abs(td1 - td2)/86400;
cout<<"Differenza: "<<diff<<" giorni.\n";
return 0;
}
void getdate(tm * timestruct)
{
cout<<"Anno: ";
cin>>timestruct->tm_year;
timestruct->tm_year-=1900;
cout<<"Mese: ";
cin>>timestruct->tm_mon;
cout<<"Giorno: ";
cin>>timestruct->tm_mday;
timestruct->tm_isdst=-1;
}.

Loading