Oppure

Loading
06/11/06 20:27
ken
Ciao ti ho mandato il file così è più chiaro. Il continue ho provato di nuovo a inserirlo ma mi dà sempre errore. Mi sa che lo uso male anche perchè non l'abbiamo mai fatto a lezione. Anzi se devo essere sincero abbiamo fatto tutto il programma di c++ di 2 anni in 2 mesi proiettando qualche slide in power point...pensa un po'...
Nel programma che sto cercando di fare non riesco proprio a capire perchè mi dà errore sui controlli, forse ho sbagliato la funzione ma non vedo dov'è l'errore o come potrei farla diversamente. Ho provato a richiamare la funzione checkDate dopo d.conversione.... ma non riesce a fare il controllo...Ciao e grazie
Ultima modifica effettuata da ken 06/11/06 20:29
aaa
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 ;-)

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! :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 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 ;-)
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 :k:
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 :D

Chi invece voleva solo compiare il sorgente cicce. :k:
aaa
13/11/06 15:15
ken
Come promesso ecco una delle soluzioni dell'esercizio proposto per gli amici del forum:

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 :k:
aaa