PDA

Visualizza la versione completa : Calcolo giorni tra due dati in c++


vicsynth
02-04-2014, 18:21
Vorrei creare un programma con dei vettori che mi calcoli i giorni che sono trascorsi tra due date...
Per˛ mi da dei risultati sbagliati
Il codice Ŕ questo



#include <cstdlib>
#include <iostream>
using namespace std;


int main (){
int mese[]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int minizio;
int mscad;
int ginizio;
int gscad;
int giorni;
int nfatture;
int i;
i=0;
giorni=0;


cout<<"Numero fatture"<<endl;
cin>>nfatture;


while (i<nfatture){
cout<<"inserire giorno inzio "<<endl;
cin>>ginizio;
cout<<"inserire mese inzio"<<endl;
cin>>minizio;
cout<<"inserire giorno scadanza "<<endl;
cin>>gscad;
cout<<"inserire mesescadenza"<<endl;
cin>>mscad;


for(int i = 0; i <= mscad; i++) {
giorni += mese [i];


}
cout<<"Giorni Trascorsi"<<giorni<<endl;
i++;
}
system ("PAUSE");
return 0;


}



Abbiate pazienza Ŕ da poco che sto imparando questo linguaggio

oregon
02-04-2014, 20:27
Prima di tutto vedo che la variabile i la usi sia per il ciclo while che per il ciclo for.

E poi hai considerato che, per i = 0, il valore di mese[i] vale 0 ?

vicsynth
02-04-2014, 20:36
Quindi per il for dovrei darle un altro nome?

oregon
02-04-2014, 21:59
Magari non risolvi nel tuo caso specifico ma, in generale, non puoi usare la stessa variabile in due cicli inseriti uno nell'altro. Poi bisogna vedere se, oltre a questo, devi anche modificare altro ... come ti ho giÓ scritto (ad esempio, non vedo l'azzeramento della variabile in cui metti il totale).

Vincenzo1968
03-04-2014, 13:51
Conviene convertire le date in Julian Day:



#include <cstdlib>
#include <iostream>
using namespace std;

double JulianDay(int year, int month, int day)
{
double retValue;
double Y, M, D;
double A, B;

D = day;

if ( month <= 2 )
{
Y = year - 1;
M = month + 12;
}
else
{
Y = year;
M = month;
}

A = (int)(Y/100);
B = 2 - A + (int)(A/4);

retValue = (int)(365.25 * (Y + 4716)) + (int)(30.6001 * (M + 1)) + D + B - 1524.5;

return retValue;

}

int main ()
{
int d1, m1, y1;
int d2, m2, y2;

double jd1, jd2;
int diff;

d1 = 5;
m1 = 2;
y1 = 1995;

d2 = 31;
m2 = 8;
y2 = 2014;

jd1 = JulianDay(y1, m1, d1);
jd2 = JulianDay(y2, m2, d2);

diff = (int)(jd2 - jd1);

cout << endl;

cout << "Data 1: " << d1 << "/" << m1 << "/" << y1 << endl;
cout << "Data 2: " << d2 << "/" << m2 << "/" << y2 << endl;

cout << "Differenza in giorni: " << diff << endl << endl;

return 0;
}



Output:


[vincenzo]$ g++ -Wall -W -pedantic -O2 jd.cpp -o jd
[vincenzo]$ ./jd

Data 1: 5/2/1995
Data 2: 31/8/2014
Differenza in giorni: 7147



L'algoritmo Ŕ preso da Astronomical Algorithms di Jean Meeus.

Vincenzo1968
03-04-2014, 17:00
I Giulian Day Number sono utili anche per ottenere una data aggiungendo un certo numero di giorni a una data di partenza:



#include <cstdlib>
#include <iostream>
#include <cstring>
#include <iomanip>

using namespace std;

double JulianDay(int year, int month, int day)
{
double retValue;
double Y, M, D;
double A, B;

D = day;

if ( month <= 2 )
{
Y = year - 1;
M = month + 12;
}
else
{
Y = year;
M = month;
}

A = (int)(Y/100);
B = 2 - A + (int)(A/4);

retValue = (int)(365.25 * (Y + 4716)) + (int)(30.6001 * (M + 1)) + D + B - 1524.5;

return retValue;

}

void CalendarDate(double jd, int *year, int *month, int *day)
{
double num = jd + 0.5;
int Z = (int)num;
double F = num - Z;
double A, B, C, D, E;
int alpha;

if ( Z < 2299161 )
{
A = Z;
}
else
{
alpha = (int)( (Z - 1867216.25) / 36524.25 );
A = Z + 1 + alpha - (int)(alpha / 4);
}

B = A + 1524;
C = (int)( (B - 122.1) / 365.25 );
D = (int)( 365.25 * C );
E = (int)( (B - D) / 30.6001 );

*day = B - D - (int)(30.6001 * E) + F;

if ( E < 14 )
{
*month = E - 1;
}
else if ( E == 14 || E == 15 )
{
*month = E - 13;
}

if ( *month > 2 )
{
*year = C - 4716;
}
else if ( *month == 1 || *month == 2 )
{
*year = C - 4715;
}
}

int DayOfTheWeek(double jd, char *strDay)
{
int num = (int)(jd + 1.5);
int retValue = num % 7;

switch ( retValue )
{
case 0:
strcpy(strDay, "Domenica");
break;
case 1:
strcpy(strDay, "Lunedý");
break;
case 2:
strcpy(strDay, "Martedý");
break;
case 3:
strcpy(strDay, "Mercoledý");
break;
case 4:
strcpy(strDay, "Giovedý");
break;
case 5:
strcpy(strDay, "Venerdi");
break;
case 6:
strcpy(strDay, "Sabato");
break;
}

return retValue;
}

int IsLeapYear(int year)
{
if ( year % 4 != 0 )
{
return 0;
}
else
{
if ( year % 100 != 0 )
return 1;
else if ( year % 400 != 0 )
return 0;
else
return 1;
}
}

int DayOfTheYear(int year, int month, int day)
{
int N, K;

K = IsLeapYear(year) ? 1 : 2;

N = (int)( (275 * month)/9 ) - K * (int)( (month + 9)/12 ) + day - 30;

return N;
}

int main ()
{
int d1, m1, y1;
int d2, m2, y2;

int d3, m3, y3;
int d4, m4, y4;

double jd1, jd2, jd3, jd4;
int diff;
int addDays;
int DayOfYear;

char szDay[256];

d1 = 5;
m1 = 2;
y1 = 1995;

d2 = 31;
m2 = 8;
y2 = 2014;

jd1 = JulianDay(y1, m1, d1);
jd2 = JulianDay(y2, m2, d2);

diff = (int)(jd2 - jd1);

cout << endl;

cout << "Data 1: " << d1 << "/" << m1 << "/" << y1 << endl;
cout << "Data 2: " << d2 << "/" << m2 << "/" << y2 << endl;
cout << "Differenza in giorni: " << diff << endl << endl;

CalendarDate(jd1, &y3, &m3, &d3);
cout << std::setprecision(21) << "jd -> " << jd1 << " = " << d3 << "/" << m3 << "/" << y3 << endl << endl;


d3 = 30;
m3 = 6;
y3 = 1954;

jd3 = JulianDay(y3, m3, d3);
DayOfTheWeek(jd3, szDay);

cout << d3 << "/" << m3 << "/" << y3 << " -> " << szDay << endl << endl;


addDays = 89;
jd4 = jd3 + addDays;
CalendarDate(jd4, &y4, &m4, &d4);
DayOfTheWeek(jd4, szDay);
DayOfYear = DayOfTheYear(y4, m4, d4);

cout << d3 << "/" << m3 << "/" << y3 << " + " << addDays << " giorni = " << d4 << "/" << m4 << "/" << y4 << " " << szDay << "; " << DayOfYear << "░ giorno dell'anno." << endl << endl;

return 0;
}



Output


[vincenzo]$ g++ -Wall -W -pedantic -O2 jd.cpp -o jd
[vincenzo]$ ./jd

Data 1: 5/2/1995
Data 2: 31/8/2014
Differenza in giorni: 7147

jd -> 2449753.5 = 5/2/1995

30/6/1954 -> Mercoledý

30/6/1954 + 89 giorni = 27/9/1954 Lunedý; 270░ giorno dell'anno.

Loading