class Data
{
public:
Data(long=0,long=0,long=0); //costruttore di default della class data con inizializzazione
void friend differenza_data(Data,Data);//dichiarazione della funzione friend differenza_data (friend perchè in questo modo può accedere ai dati privati della classe)
//la funzione prende come argomenti 2 oggetti di tipo Data
long getday();//dichiarazione della funzione membro getday
bool checkGG();//dichiarazione della funzione membro checkGG
private:
long anno; //dichiarazione delle variabili private della classe(alle quali hanno accesso solo le funzioni membro)
long mese;
long giorno;
};
#include<iostream>
#include<string>
#include<sstream>
#include<fstream>
#include"Data.h"
using namespace std;
Data::Data(long g,long m, long a) //definizione del costruttore
{
giorno=g;
mese=m;
anno=a;
}
bool Data::checkGG() //defizione della funzione membro checkGG
//che ha il compito di controllare la validità dei giorni delle date immesse
{
static const int GGMese[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
//introduco un array i cui elementi sono i giorni dei 12 mesi dell'anno
if(mese==2 && giorno==29 && (anno%400==0 || (anno%4==0 && anno%100!=0 )))
{
return true; //verifica dell'esistenza del giorno 29 Febbraio con condizione di anno bisestile
}
if(giorno>0 && giorno <= GGMese[mese]) //verifica che il giorno sia effettivamente compreso tra 0 e il num max di giorni del mese
//definito nell'array GGMese[]
{
return true;
}
else
return false; //in caso di date non valide ritorna falso (0)
}
long Data::getday() //definizione funzione membro getday
//che ha il compito di convertire le date in un numero di giorni
//rispetto ad un anno di riferimento che nel nostro caso è il 4000 a.C.
{
long a, b, giorni_passati;
if(mese < 3)
{
anno -= 1;
mese += 12;
}
a = (long) (anno / 100);
b = 2 - a + ( (long) (a / 4));
giorni_passati = (long)( (365.25*(anno + 4716)) + (30.6001*(mese + 1)) + giorno + b - 1524);
return giorni_passati; //restituisce il numero di giorni passati dal 4000 a.C
// alla data immessa
}
int conversioneInt(string x)// definizione della funzione esterna alla classe data
// che ha il compito di convertire le stringhe in numeri interi
{
int num;
istringstream mystream(x);
mystream>>num;
return num;
}
void differenza_data(Data d1 ,Data d2) //definizione della funzione friend differenza_data
{
signed long differenza;
float b,a;
ifstream in("C:\\file.txt");
ofstream out("C:\\file2.txt");
//flussi di entrata e di uscita del file
string s; //dichiarazione stringa s
int riga = 0; //dichiarazione e inizializzazione dell'intero riga
while (getline(in,s)) //il ciclo while legge da file il testo e ne mette il
//il contenuto nella stringa s
//e ripete l'operazione per tutte le righe
{
riga++;
string g1(s,10,2); //string sottostringa(nome stringa sorgente,dalla posizione x,per y caratteri)
string m1(s,13,2); //in modo da estrarre dalla stringa solo le date
string a1(s,16,4);
string g2(s,27,2);
string m2(s,30,2);
string a2(s,33,4);
d1.giorno=conversioneInt(g1); //d1=(g1/m1/a1)
d1.mese=conversioneInt(m1);
d1.anno=conversioneInt(a1);
d2.giorno=conversioneInt(g2); //d2=(g2/m2/a2)
d2.mese=conversioneInt(m2);
d2.anno=conversioneInt(a2);
if (((d1.anno>=1999) && (d1.mese>0 && d1.mese<13) && (d1.checkGG())) &&
((d2.anno>=1999) && (d2.mese>0 && d2.mese<13) && (d2.checkGG())))
//controllo della validità delle date utilizzando la funzione membro checkGG
{
differenza = (long) (d2.getday() - d1.getday()); //semplice sottrazione tra i num di giorni restituiti
//dalla funzione membro getday
out<<"\n\resame del "<<conversioneInt(g2); //istruzione della stampa sul file di uscita
switch(conversioneInt(m2)) // switch converte l'intero del mese con il nome del mese
{
case 1:
out << " Gennaio ";
break;
case 2:
out << " Febbraio ";
break;
case 3:
out << " Marzo ";
break;
case 4:
out << " Aprile ";
break;
case 5:
out << " Maggio ";
break;
case 6:
out << " Giugno ";
break;
case 7:
out << " Luglio ";
break;
case 8:
out << " Agosto ";
break;
case 9:
out << " Settembre ";
break;
case 10:
out << " Ottobre ";
break;
case 11:
out << " Novembre ";
break;
case 12:
out << " Dicembre ";
break;
}
a+=1; //a conta il numero di righe
b+=abs(differenza); //b per ogni riga somma le differenze tra date
//Facciamo controlli sul risultato per adattare il testo da stampare.
out<<conversioneInt(a2)<<(differenza<0 ? " _errore:richiesta posteriore all'esame di ":" tempo di prenotazione = ")<<abs(differenza)<<" "<<
(abs(differenza) == 1 ? "giorno":"giorni")<<"\n\r"; //operatore ternario
}
else
{
out << "\n\rLa data alla riga " << riga << " non è valida\n\r";
}
}
out<<"\n\rIl tempo di attesa medio per gli esami considerati e' di "<<b/a<<" giorni";
}
int main(int argc, char *argv[])
{
Data esame,richiesta; //definizione oggetti data esame e richiesta
differenza_data(esame,richiesta); //richiamo della funzione friend differenza_data
}