Página principal   Módulos   Lista de namespaces   Hierarquia de classes   Lista de componentes   Lista de ficheiros   Membros do namespace   Componentes membro   Ficheiros membro   Páginas relacionadas  

data.C

Ir para a documentação deste ficheiro.
00001 
00007 #include "Utilitarios/data.H"
00008 
00009 #include <ctime>
00010 
00011 using namespace std;
00012 
00013 
00014 string Utilitarios::nomes_dos_meses[numero_total_de_meses + 1] = {
00015     "", // lixo; o mês 0 não existe.
00016     "Janeiro",
00017     "Fevereiro",
00018     "Março",
00019     "Abril",
00020     "Maio",
00021     "Junho",
00022     "Julho",
00023     "Agosto",
00024     "Setembro",
00025     "Outubro",
00026     "Novembro",
00027     "Dezembro"
00028 };
00029 
00030 
00031 string Utilitarios::nomes_dos_dias_da_semana[numero_total_de_dias_da_semana] ={
00032     "Domingo",
00033     "segunda-feira",
00034     "terça-feira",
00035     "quarta-feira",
00036     "quinta-feira",
00037     "sexta-feira",
00038     "Sábado"
00039 };
00040 
00041 
00042 istream& Utilitarios::operator>>(istream& entrada, Mes& mes) 
00043 {
00044     string nome_do_mes;
00045     entrada >> nome_do_mes;
00046 
00047     for(int i = 0; i != numero_total_de_meses; ++i)
00048         if(nomes_dos_meses[i] == nome_do_mes) {
00049             mes = Mes(i);
00050 
00051             return entrada;
00052         }
00053 
00054     entrada.clear(ios_base::failbit);
00055 
00056     return entrada;
00057 }
00058 
00059 std::istream& Utilitarios::operator>>(std::istream& entrada, 
00060                                       DiaDaSemana& dia_da_semana)
00061 {
00062     string nome_do_dia;
00063     entrada >> nome_do_dia;
00064 
00065     for(int i = 0; i != numero_total_de_dias_da_semana; ++i)
00066         if(nomes_dos_dias_da_semana[i] == nome_do_dia) {
00067             dia_da_semana = DiaDaSemana(i);
00068             return entrada;
00069         }
00070 
00071     entrada.clear(ios_base::failbit);
00072 
00073     return entrada;
00074 }
00075 
00076 Utilitarios::Data Utilitarios::Data::actual() 
00077 {
00078     if(data_actual_obtida_do_sistema) {
00079         time_t aux = time(0);
00080         tm tempo_actual = *localtime(&aux); 
00081         
00082         return Data(1900 + tempo_actual.tm_year, 
00083                     Mes(tempo_actual.tm_mon + 1),
00084                     tempo_actual.tm_mday); 
00085     } else
00086         while(true) {
00087             cout << "Introduza a data actual (ano mes dia): ";
00088             Data data;
00089             cin >> data;
00090             if(cin.good())
00091                 return data;
00092 
00093             cin >> ill;
00094             cout << "Data errada." << endl;
00095         }
00096 }
00097       
00098 #ifdef _STLP_IOSTREAM
00099 // ws no STLPort tem um problema qualquer!
00100 namespace {
00101     istream& ws(istream& entrada)
00102     {
00103         char caractere;
00104         do
00105             entrada.get(caractere);
00106         while(entrada.good() and isspace(caractere));
00107 
00108         if(entrada.good())
00109             entrada.putback(caractere);
00110         
00111         return entrada;
00112     }
00113 }
00114 #endif
00115 
00116 std::istream& Utilitarios::operator>>(std::istream& entrada, Data& data) 
00117 {
00118     Ano ano;
00119     int mes;
00120     Dia dia;
00121 
00122     entrada >> ano >> ws;
00123 
00124     if(ano < Data::ano_minimo) {
00125         entrada.clear(ios_base::failbit);
00126 
00127         return entrada;
00128     }
00129 
00130     if(entrada.peek() == '/')
00131         entrada.get();
00132 
00133     entrada >> mes >> ws;
00134 
00135     if(mes < 1 or numero_total_de_meses < mes) {
00136         entrada.clear(ios_base::failbit);
00137 
00138         return entrada;
00139     }
00140 
00141     if(entrada.peek() == '/')
00142         entrada.get();
00143 
00144     entrada >> dia;
00145 
00146     if(dia < 0 or dia > numeroDeDiasEm(Mes(mes), ano)) {
00147         entrada.clear(ios_base::failbit);
00148 
00149         return entrada;
00150     }
00151 
00152     if(entrada)
00153         data = Data(ano, Mes(mes), dia);
00154 
00155     return entrada;
00156 }
00157 
00158 bool Utilitarios::Data::data_actual_obtida_do_sistema = true;
00159 
00160 
00161 #ifdef TESTE
00162 
00163 #include <fstream>
00164 
00165 using namespace Utilitarios;
00166 
00167 void testaMes() 
00168 {
00169     Mes mes = janeiro;
00170 
00171     assert(numero_total_de_meses == 12);
00172 
00173     mes += 13;
00174 
00175     assert(mes == fevereiro);
00176 
00177     --mes; 
00178 
00179     assert(mes == janeiro);
00180 
00181     mes--; 
00182 
00183     assert(mes == dezembro);
00184 
00185     ++mes; 
00186 
00187     Mes outro_mes = mes++;
00188 
00189     assert(mes == fevereiro);
00190     
00191     assert(outro_mes == janeiro);
00192 
00193     outro_mes -= 13;
00194 
00195     assert(outro_mes == dezembro);
00196 
00197     assert(outro_mes + 25 == janeiro);
00198 
00199     assert(outro_mes + -25 == novembro);
00200 
00201     assert(outro_mes - 25 == novembro);
00202 
00203     assert(mes - outro_mes == 2);
00204         
00205     ofstream saida("data.lixo");
00206     saida << mes << endl;
00207     saida.close();
00208 
00209     ifstream entrada("data.lixo");
00210     entrada >> outro_mes;
00211 
00212     assert(outro_mes == mes);
00213 
00214     assert(numeroDeDiasEm(dezembro, 2000) == 31);
00215 
00216     assert(numeroDeDiasEm(fevereiro, 2000) == 29);
00217 
00218     assert(numeroDeDiasEm(fevereiro, 1900) == 28);
00219 
00220     assert(numeroDeDiasEm(fevereiro, 1996) == 29);
00221 }
00222 
00223 void testaDiaDaSemana() 
00224 {
00225     DiaDaSemana dia = segunda_feira;
00226 
00227     assert(numero_total_de_dias_da_semana == 7);
00228 
00229     dia += 8;
00230 
00231     assert(dia == terca_feira);
00232 
00233     --dia; 
00234 
00235     assert(dia == segunda_feira);
00236 
00237     dia--; 
00238 
00239     assert(dia == domingo);
00240 
00241     ++dia; 
00242     DiaDaSemana outro_dia = dia++;
00243 
00244     assert(dia == terca_feira);
00245 
00246     assert(outro_dia == segunda_feira);
00247 
00248     outro_dia -= 8;
00249 
00250     assert(outro_dia == domingo);
00251 
00252     assert(outro_dia + 15 == segunda_feira);
00253 
00254     assert(outro_dia + -15 == sabado);
00255 
00256     assert(outro_dia - 15 == sabado);
00257 
00258     assert(dia - outro_dia == 2);
00259         
00260     ofstream saida("data.lixo");
00261     saida << dia << endl;
00262     saida.close();
00263 
00264     ifstream entrada("data.lixo");
00265     entrada >> outro_dia;
00266 
00267     assert(outro_dia == dia);
00268 }
00269 
00270 void testaData() 
00271 {
00272     Data data(1965, setembro, 14);
00273 
00274     assert(data.ano() == 1965);
00275 
00276     assert(data.mes() == setembro);
00277 
00278     assert(data.dia() == 14);
00279 
00280     assert(data == Data(1965, setembro, 14));
00281 
00282     assert(not (data != Data(1965, setembro, 14)));
00283 
00284     Data outra_data = data + 12983;
00285 
00286     assert(outra_data == Data(2001, abril, 1));
00287 
00288     ofstream saida;
00289 
00290     saida.open("data.lixo");
00291     saida << data << endl;
00292     saida.close();
00293 
00294     ifstream entrada;
00295 
00296     entrada.open("data.lixo");
00297     entrada >> outra_data;
00298     entrada.close();
00299 
00300     assert(outra_data == data);
00301 
00302     outra_data = data + 12983;
00303 
00304     saida.open("data.lixo");
00305     data.guardaEm(saida);
00306     outra_data.guardaEm(saida);
00307     saida.close();
00308 
00309     entrada.open("data.lixo");
00310     Data data_lida(entrada);
00311 
00312     assert(data_lida == data);
00313 
00314     data.carregaDe(entrada);
00315     entrada.close();
00316 
00317     assert(data == outra_data);
00318 
00319     Data data_de_transicao(1999, dezembro, 31);
00320 
00321     ++data_de_transicao;
00322 
00323     assert(data_de_transicao == Data(2000, janeiro, 1));
00324 
00325     --data_de_transicao;
00326 
00327     assert(data_de_transicao == Data(1999, dezembro, 31));
00328 
00329     Data anterior = data_de_transicao++;
00330 
00331     assert(data_de_transicao == Data(2000, janeiro, 1));
00332 
00333     assert(anterior == Data(1999, dezembro, 31));
00334 
00335     anterior = data_de_transicao--;
00336 
00337     assert(data_de_transicao == Data(1999, dezembro, 31));
00338 
00339     assert(anterior == Data(2000, janeiro, 1));
00340 
00341     assert(anterior.anoEBissexto());
00342 
00343     assert(not data_de_transicao.anoEBissexto());
00344         
00345     Data data_juliana(2452001);
00346 
00347     assert(data_juliana == Data(2001, abril, 1));
00348 
00349     assert(data_juliana.diaDaSemana() == domingo);
00350 
00351     --data_juliana;
00352 
00353     assert(data_juliana == Data(2001, marco, 31));
00354 
00355     assert(data_juliana.diaDaSemana() == sabado);
00356 
00357     Data para_juliana(2001, abril, 1);
00358 
00359     assert(para_juliana.diaJuliano() == 2452001);
00360 
00361     Data nao_bissexto(1900, fevereiro, 1);
00362 
00363     assert(not nao_bissexto.anoEBissexto());
00364 
00365     Data bissexto(1904, fevereiro, 1);
00366 
00367     assert(bissexto.anoEBissexto());
00368 
00369     assert(nao_bissexto.numeroDeDiasNoMes() == 28 or
00370            bissexto.numeroDeDiasNoMes() == 29);
00371 
00372     data = Data(1965, setembro, 14);
00373     outra_data = data;
00374     
00375     outra_data += 12983;
00376 
00377     assert(outra_data == Data(2001, abril, 1));
00378 
00379     outra_data -= 12983;
00380 
00381     assert(outra_data == Data(1965, setembro, 14));
00382 }
00383 
00384 int main()
00385 {
00386     testaMes();
00387     testaDiaDaSemana();
00388     testaData();
00389 }
00390 
00391 #endif

Gerado em Tue Dec 3 15:19:34 2002 para Pacotes por doxygen1.3-rc1