06/11/06 20:59
netarrow
Evvetivamente c'era un pò di casino nel metodo di controllo.
nel ciclo ora conto le righe lette e se una non è valida scrivo nel file risultato "La data alla riga xy non è valida".
Ah, per il continue, ho visto che non serve(serve per far saltare il ciclo all'iterazione sucessiva in qualunque punto... ma nel nostro caso il ciclo già finisce dopo l'if di controllo)
Cmq così a me funziona alla grande ;-)
ciao
nel ciclo ora conto le righe lette e se una non è valida scrivo nel file risultato "La data alla riga xy non è valida".
Ah, per il continue, ho visto che non serve(serve per far saltare il ciclo all'iterazione sucessiva in qualunque punto... ma nel nostro caso il ciclo già finisce dopo l'if di controllo)
Cmq così a me funziona alla grande ;-)
class Data { public: Data(long=0,long=0,long=0); void friend differenza_data(Data,Data); long getday(); bool checkGG(); private: long anno; long mese; long giorno; }; #include<iostream> #include<string> #include<sstream> #include<fstream> using namespace std; Data::Data(long g,long m, long a) { giorno=g; mese=m; anno=a; } bool Data::checkGG() { 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 gg dei 12 mesi dell'anno if(mese==2 && giorno==29 && (anno%400==0 || (anno%4==0 && anno%100!=0 ))) { return true; } if(giorno>0 && giorno <= GGMese[mese]) { return true; } else return false; } long Data::getday() { 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; } int conversioneInt(string x) { int num; istringstream mystream(x); mystream>>num; return num; } void differenza_data(Data d1 ,Data d2) { signed long differenza; float b,a; ifstream in("file.txt"); ofstream out("file2.txt"); string s; int riga = 0; while (getline(in,s)) { riga++; string g1(s,10,2); string m1(s,13,2); 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.mese=conversioneInt(m1); d1.anno=conversioneInt(a1); d2.giorno=conversioneInt(g2); 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()))) { differenza = (long) (d1.getday() - d2.getday()); out<<"\n\resame del "<<conversioneInt(g2); switch(conversioneInt(m2)) { 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; b+=abs(differenza); //Facciamo controlli sul risultato per adattare il testo da stampare. out<<conversioneInt(a2)<<" tempo di prenotazione = "<<abs(differenza)<<" "<< (abs(differenza) == 1 ? "giorno":"giorni")<<"\n\r"; } 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; differenza_data(esame,richiesta); }
ciao
Ultima modifica effettuata da netarrow 04/12/06 16:59
aaa
06/11/06 22:02
ken
Ti ringrazio per il codice ti ho mandato una mail leggila presto! Sennò, se mi beccano il programma sul forum, è tutto lavoro sprecato.... Grazie ancora
p.s.:il programma che mi hai scritto l'ho già salvato...
p.s.:il programma che mi hai scritto l'ho già salvato...
Ultima modifica effettuata da ken 06/11/06 22:07
aaa
07/11/06 14:09
netarrow
ok, dopotutto hai partecipato attivamente
(solitamente sul forum c'è chi viene qui chiede il codice e punto).
Temporaneamente ofuscato il codice ;-)
(solitamente sul forum c'è chi viene qui chiede il codice e punto).
Temporaneamente ofuscato il codice ;-)
Ultima modifica effettuata da netarrow 07/11/06 14:10
aaa
07/11/06 15:08
ken
Non so come ringraziarti...sei stato davvero gentile. Il programma gira molto bene, ho aggiunto solo un altro controllo che valuta se la data 2 è posteriore alla data 1...mi impegno a postare il codice completo la settimana prossima dopo la consegna. Grazie ancora a presto
aaa
07/11/06 15:16
netarrow
ottimo, io mi sono salvato il vecchio sorgente e lo ripristino fra una settimana, tu posti il sorgente modificato e saranno tutti contenti, tu avrai un buon voto e chi cercherà informazioni le troverà, e visto che le troverà qui e ho contribuito sarò contento anch'io
Chi invece voleva solo compiare il sorgente cicce.
Chi invece voleva solo compiare il sorgente cicce.
aaa
13/11/06 15:15
ken
Come promesso ecco una delle soluzioni dell'esercizio proposto per gli amici del forum:
Ciao a presto
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 }
Ciao a presto
aaa