Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - differenza tra date
Forum - C/C++ - differenza tra date - Pagina 3

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 21:59
Lunedì, 06/11/2006
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 ;-)

Codice sorgente - presumibilmente C++

  1. class Data
  2. {
  3. public:
  4. Data(long=0,long=0,long=0);
  5.  void friend differenza_data(Data,Data);
  6.   long getday();
  7.  bool checkGG();
  8.  
  9. private:
  10.  
  11.   long anno;
  12.   long mese;
  13.   long giorno;
  14.  
  15. };
  16.  
  17.  
  18.  
  19. #include<iostream>
  20. #include<string>
  21. #include<sstream>
  22. #include<fstream>
  23.  
  24. using namespace std;
  25.  
  26. Data::Data(long g,long m, long a)
  27. {
  28.         giorno=g;
  29.         mese=m;
  30.         anno=a;
  31. }
  32.  
  33.  
  34. bool Data::checkGG()
  35.  
  36. {
  37.         static const int GGMese[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  38.         //introduco un array i cui elementi sono i gg dei 12 mesi dell'anno
  39.  
  40.  
  41.         if(mese==2 && giorno==29 && (anno%400==0 || (anno%4==0 && anno%100!=0 )))
  42.         {
  43.         return true;
  44.         }
  45.  
  46.         if(giorno>0 && giorno <= GGMese[mese])
  47.         {
  48.         return true;
  49.         }
  50.  
  51.         else
  52.                 return false;
  53. }
  54.  
  55.  
  56. long Data::getday()
  57. {
  58.  
  59.  
  60.            long a, b, giorni_passati;
  61.  
  62. if(mese < 3)
  63. {
  64. anno -= 1;
  65. mese += 12;
  66. }
  67.  
  68. a = (long) (anno / 100);
  69. b = 2 - a + ( (long) (a / 4));
  70.  
  71. giorni_passati = (long)( (365.25*(anno + 4716)) + (30.6001*(mese + 1)) + giorno + b - 1524);
  72.  
  73. return giorni_passati;
  74.  
  75. }
  76.  
  77. int conversioneInt(string x)
  78.  
  79. {
  80.         int num;
  81.         istringstream mystream(x);
  82.         mystream>>num;
  83.  
  84.         return num;
  85.  
  86. }
  87.  
  88. void differenza_data(Data d1 ,Data d2)
  89. {
  90.  
  91.   signed long differenza;
  92.   float b,a;
  93.  
  94.     ifstream in("file.txt");
  95.         ofstream out("file2.txt");
  96.         string s;
  97.  
  98. int riga = 0;
  99. while (getline(in,s))
  100. {
  101.         riga++;
  102.        
  103.         string g1(s,10,2);     
  104.         string m1(s,13,2);
  105.         string a1(s,16,4);
  106.        
  107.         string g2(s,27,2);
  108.         string m2(s,30,2);
  109.         string a2(s,33,4);
  110.  
  111.  
  112.   d1.giorno=conversioneInt(g1);
  113.  
  114.   d1.mese=conversioneInt(m1);
  115.  
  116.   d1.anno=conversioneInt(a1);
  117.  
  118.  
  119.   d2.giorno=conversioneInt(g2);
  120.  
  121.   d2.mese=conversioneInt(m2);
  122.  
  123.   d2.anno=conversioneInt(a2);
  124.  
  125.     if (((d1.anno>=1999) && (d1.mese>0 && d1.mese<13) && (d1.checkGG())) &&
  126.     ((d2.anno>=1999) && (d2.mese>0 && d2.mese<13) && (d2.checkGG())))
  127.    {
  128.  
  129.  differenza = (long) (d1.getday() - d2.getday());
  130.  
  131.  
  132.  
  133. out<<"\n\resame del "<<conversioneInt(g2);
  134. switch(conversioneInt(m2))
  135. {
  136.    case 1:
  137.       out << " Gennaio ";    
  138.       break;
  139.    case 2:
  140.       out << " Febbraio ";    
  141.       break;
  142.    case 3:
  143.       out << " Marzo ";    
  144.       break;
  145.    case 4:
  146.       out << " Aprile ";    
  147.       break;
  148.    case 5:
  149.       out << " Maggio ";    
  150.       break;
  151.    case 6:
  152.       out << " Giugno ";    
  153.       break;
  154.    case 7:
  155.       out << " Luglio ";    
  156.       break;
  157.    case 8:
  158.       out << " Agosto ";    
  159.       break;
  160.    case 9:
  161.       out << " Settembre ";    
  162.       break;
  163.    case 10:
  164.       out << " Ottobre ";    
  165.       break;
  166.    case 11:
  167.       out << " Novembre ";    
  168.       break;
  169.    case 12:
  170.       out << " Dicembre ";    
  171.       break;                                    
  172. }
  173.  
  174. a+=1;
  175. b+=abs(differenza);
  176.  
  177. //Facciamo controlli sul risultato per adattare il testo da stampare.
  178. out<<conversioneInt(a2)<<"  tempo di prenotazione = "<<abs(differenza)<<" "<<
  179.   (abs(differenza) == 1 ? "giorno":"giorni")<<"\n\r";
  180. } else {
  181. out << "\n\rLa data alla riga " << riga << " non è valida\n\r";
  182. }
  183. }
  184. out<<"\n\rIl tempo di attesa medio per gli esami considerati e' di "<<b/a<<" giorni";
  185.  
  186. }
  187.  
  188. int main(int argc, char *argv[])
  189. {
  190.  
  191.   Data esame,richiesta;
  192.  
  193.   differenza_data(esame,richiesta);  
  194.  
  195. }



ciao

Ultima modifica effettuata da netarrow il 04/12/2006 alle 17:59
PM Quote
Avatar
ken (Normal User)
Newbie


Messaggi: 17
Iscritto: 24/10/2006

Segnala al moderatore
Postato alle 23:02
Lunedì, 06/11/2006
Ti ringrazio per il codice ti ho mandato una mail leggila presto! :k: 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...

Ultima modifica effettuata da ken il 06/11/2006 alle 23:07
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 15:09
Martedì, 07/11/2006
ok, dopotutto hai partecipato attivamente

(solitamente sul forum c'è chi viene qui chiede il codice e punto).

Temporaneamente ofuscato il codice ;-)

Ultima modifica effettuata da netarrow il 07/11/2006 alle 15:10
PM Quote
Avatar
ken (Normal User)
Newbie


Messaggi: 17
Iscritto: 24/10/2006

Segnala al moderatore
Postato alle 16:08
Martedì, 07/11/2006
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 :k:

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 16:16
Martedì, 07/11/2006
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 :D

Chi invece voleva solo compiare il sorgente cicce. :k:

PM Quote
Avatar
ken (Normal User)
Newbie


Messaggi: 17
Iscritto: 24/10/2006

Segnala al moderatore
Postato alle 16:15
Lunedì, 13/11/2006
Come promesso ecco una delle soluzioni dell'esercizio proposto per gli amici del forum:

Codice sorgente - presumibilmente C++

  1. class Data
  2. {
  3. public:
  4. Data(long=0,long=0,long=0); //costruttore di default della class data con inizializzazione
  5. void friend differenza_data(Data,Data);//dichiarazione della funzione friend differenza_data (friend perchè in questo modo può accedere ai dati privati della classe)
  6. //la funzione prende come argomenti 2 oggetti di tipo Data
  7.  
  8. long getday();//dichiarazione della funzione membro getday
  9. bool checkGG();//dichiarazione della funzione membro checkGG
  10.  
  11. private:
  12.  
  13. long anno; //dichiarazione delle variabili private della classe(alle quali hanno accesso solo le funzioni membro)
  14. long mese;
  15. long giorno;
  16.  
  17. };
  18.  
  19.  
  20. #include<iostream>
  21. #include<string>
  22. #include<sstream>
  23. #include<fstream>
  24. #include"Data.h"
  25. using namespace std;
  26.  
  27. Data::Data(long g,long m, long a)       //definizione del costruttore
  28. {
  29. giorno=g;
  30. mese=m;
  31. anno=a;
  32. }
  33.  
  34.  
  35. bool Data::checkGG()    //defizione della funzione membro checkGG
  36.                                                 //che ha il compito di controllare la validità dei giorni delle date immesse
  37.  
  38. {
  39. static const int GGMese[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
  40. //introduco un array i cui elementi sono i giorni dei 12 mesi dell'anno
  41.  
  42.  
  43. if(mese==2 && giorno==29 && (anno%400==0 || (anno%4==0 && anno%100!=0 )))
  44. {
  45. return true;    //verifica dell'esistenza del giorno 29 Febbraio con condizione di anno bisestile
  46. }
  47.  
  48. if(giorno>0 && giorno <= GGMese[mese])  //verifica che il giorno sia effettivamente compreso tra 0 e il num max di giorni del mese
  49.                                                                                 //definito nell'array GGMese[]
  50. {
  51. return true;
  52. }
  53.  
  54. else
  55. return false;   //in caso di date non valide ritorna falso (0)
  56. }
  57.  
  58.  
  59. long Data::getday()             //definizione funzione membro getday
  60.                                                 //che ha il compito di convertire le date in un numero di giorni
  61.                                                 //rispetto ad un anno di riferimento che nel nostro caso è il 4000 a.C.
  62. {
  63.  
  64.  
  65. long a, b, giorni_passati;
  66.  
  67. if(mese < 3)
  68. {
  69. anno -= 1;
  70. mese += 12;
  71. }
  72.  
  73. a = (long) (anno / 100);
  74. b = 2 - a + ( (long) (a / 4));
  75.  
  76. giorni_passati = (long)( (365.25*(anno + 4716)) + (30.6001*(mese + 1)) + giorno + b - 1524);
  77.  
  78. return giorni_passati;          //restituisce il numero di giorni passati dal 4000 a.C
  79.                                                         // alla data immessa
  80.  
  81. }
  82.  
  83. int conversioneInt(string x)// definizione della funzione esterna alla classe data
  84.                                                         // che ha il compito di convertire le stringhe in numeri interi
  85.  
  86. {
  87. int num;
  88. istringstream mystream(x);
  89. mystream>>num;
  90.  
  91. return num;
  92.  
  93. }
  94.  
  95. void differenza_data(Data d1 ,Data d2)          //definizione della funzione friend differenza_data
  96. {
  97.  
  98. signed long differenza;
  99. float b,a;
  100. ifstream in("C:\\file.txt");
  101. ofstream out("C:\\file2.txt");
  102.  
  103.                                                                                 //flussi di entrata e di uscita del file
  104. string s;                                                               //dichiarazione stringa s                              
  105.  
  106. int riga = 0;                                                   //dichiarazione e inizializzazione dell'intero riga
  107. while (getline(in,s))                                   //il ciclo while legge da file il testo e ne mette il
  108.                                                                                 //il contenuto nella stringa s
  109.                                                                                 //e ripete l'operazione per tutte le righe
  110. {
  111. riga++;
  112.  
  113. string g1(s,10,2);                                              //string sottostringa(nome stringa sorgente,dalla posizione x,per y caratteri)
  114. string m1(s,13,2);                                              //in modo da estrarre dalla stringa solo le date
  115. string a1(s,16,4);
  116.  
  117. string g2(s,27,2);
  118. string m2(s,30,2);
  119. string a2(s,33,4);
  120.  
  121.  
  122. d1.giorno=conversioneInt(g1);           //d1=(g1/m1/a1)
  123.  
  124. d1.mese=conversioneInt(m1);
  125.  
  126. d1.anno=conversioneInt(a1);
  127.  
  128.  
  129. d2.giorno=conversioneInt(g2);           //d2=(g2/m2/a2)
  130.  
  131. d2.mese=conversioneInt(m2);
  132.  
  133. d2.anno=conversioneInt(a2);
  134.  
  135. if (((d1.anno>=1999) && (d1.mese>0 && d1.mese<13) && (d1.checkGG())) &&
  136. ((d2.anno>=1999) && (d2.mese>0 && d2.mese<13) && (d2.checkGG())))
  137. //controllo della validità delle date utilizzando la funzione membro checkGG
  138.  
  139.  
  140. {
  141. differenza = (long) (d2.getday() - d1.getday());        //semplice sottrazione tra i num di giorni restituiti
  142.                                                                                                         //dalla funzione membro getday
  143.  
  144.  
  145.  
  146. out<<"\n\resame del "<<conversioneInt(g2);                      //istruzione della stampa sul file di uscita
  147. switch(conversioneInt(m2))                      // switch converte l'intero del mese con il nome del mese
  148. {
  149. case 1:
  150. out << " Gennaio ";
  151. break;
  152. case 2:
  153. out << " Febbraio ";
  154. break;
  155. case 3:
  156. out << " Marzo ";
  157. break;
  158. case 4:
  159. out << " Aprile ";
  160. break;
  161. case 5:
  162. out << " Maggio ";
  163. break;
  164. case 6:
  165. out << " Giugno ";
  166. break;
  167. case 7:
  168. out << " Luglio ";
  169. break;
  170. case 8:
  171. out << " Agosto ";
  172. break;
  173. case 9:
  174. out << " Settembre ";
  175. break;
  176. case 10:
  177. out << " Ottobre ";
  178. break;
  179. case 11:
  180. out << " Novembre ";
  181. break;
  182. case 12:
  183. out << " Dicembre ";
  184. break;
  185. }
  186.  
  187. a+=1;                           //a conta il numero di righe
  188. b+=abs(differenza);     //b per ogni riga somma le differenze tra date
  189.  
  190. //Facciamo controlli sul risultato per adattare il testo da stampare.
  191. out<<conversioneInt(a2)<<(differenza<0 ? " _errore:richiesta posteriore all'esame di ":" tempo di prenotazione = ")<<abs(differenza)<<" "<<
  192. (abs(differenza) == 1 ? "giorno":"giorni")<<"\n\r";             //operatore ternario
  193. }
  194. else
  195. {
  196. out << "\n\rLa data alla riga " << riga << " non è valida\n\r";
  197. }
  198. }
  199. out<<"\n\rIl tempo di attesa medio per gli esami considerati e' di "<<b/a<<" giorni";
  200.  
  201. }
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209.  
  210.  
  211. int main(int argc, char *argv[])
  212. {
  213.  
  214. Data esame,richiesta;           //definizione oggetti data esame e richiesta
  215.  
  216. differenza_data(esame,richiesta);       //richiamo della funzione friend differenza_data
  217.  
  218. }



Ciao a presto :k:

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo