Modificação da classe Date. Modifique a classe Date na Figura 18.10 para que ela tenha as seguintes capacidades:
a) Saída da data em formatos múltiplos, como DDD AAAA DD/MM/AA 14 de junho de 1992
b) Use construtores sobrecarregados para criar objetos Date inicializados com datas nos formatos da parte (a) desse exercício.
c) Crie um construtor de Date que leia a data do sistema usando as funções da biblioteca-padrão do cabeçalho e defina os membros Date. (Veja a documentação de referência de seu compilador ou para obter informações sobre as funções no cabeçalho .)
No Capítulo 19, poderemos criar operadores para testar a igualdade de duas datas e para comparar datas e determinar se uma data vem antes ou depois de outra.
Passo 1
Fala Galera!!! Tudo certo? Espero que sim!! Bora para mais um exercício.
Vamos criar um programa que define uma classe Date que será responsável por representar datas em diferentes formatos.
Iniciando definindo nossa classe Date, com seus membros e a funções:
//cabeçalhos
#include
#include
#include
using std::cout;
#include
using namespace std;
//definição da classe
class Date {
public:
//definindo parametros
Date();
Date( int, int );
Date( int, int, int );
Date( char *, int, int );
//definindo funçõesmembro
void setMonth( int );
void setDay( int );
void setYear( int );
void printDateSlash( void ) const;
void printDateMonth( void ) const;
void printDateDay( void ) const;
const char *monthName( void ) const;
bool leapYear( void ) const;
int daysOfMonth( void ) const;
void convert1( int );
int convert2( void ) const;
void convert3( const char * const );
const char *monthList( int ) const;
int days( int ) const;
//definindo varaivesi
private:
int day;
int month;
int year;
};
Passo 2
Agora precisamos definir as funções para representar as datas em diferentes formatos:
// Date constructor
Date::Date()
{
long int totalTime;
double totalYear;
long double divisor;
// tempo em segundos desde 1970
totalTime = time( NULL );
divisor = ( 60.0 * 60.0 * 24.0 * 365.25 ); //número de segundos em um ano
totalYear = totalTime / divisor + 1970;
year = ( int ) totalYear;
totalYear -= year;
day = ( int ) ( 365 * totalYear );
month = 1;
while ( day - days( month + 1 ) > 0 )
day -= days( month++ );
}
// converte para mês e dia
Date::Date( int ddd, int yyyy )
{
setYear( yyyy );
convert1( ddd );
}
// Construtor de data que usa mês, dia e ano
Date::Date( int mm, int dd, int yy )
{
setYear( yy + 1900 );
setMonth( mm );
setDay( dd );
}
// Construtor de data que usa o nome do mês, dia e ano
Date::Date( char *mPtr, int dd, int yyyy )
{
setYear( yyyy );
convert3( mPtr );
setDay( dd );
}
// define o dia
void Date::setDay( int d )
{ day = d >= 1 && d
// define o mes
void Date::setMonth( int m ) { month = m >= 1 && m
// define o ano
void Date::setYear( int y ) { year = y >= 1900 && y
// Imprime a data no formato: mm/dd/aaaa
void Date::printDateSlash( void ) const
{ cout
// Imprime a data no formato: monthname dd, yyyy
void Date::printDateMonth( void ) const
{ cout
// Imprime a data no formato: ddd aaaa
void Date::printDateDay( void ) const
{ cout
// Retorna o nome do mês
const char *Date::monthName( void ) const { return monthList( month - 1 ); }
// Retorna o número de dias do mês
int Date::daysOfMonth( void ) const
{ return leapYear() && month == 2 ? 29 : days( month ); }
// Test for a leap year
bool Date::leapYear( void ) const
{
if ( year % 400 == 0 || ( year % 4 == 0 && year % 100 != 0 ) )
return true;
else
return false;
}
// Convert ddd to mm and dd
void Date::convert1( int ddd ) // convert to mm / dd / yyyy
{
int dayTotal = 0;
if ( ddd 366 ) // check for invalid day
ddd = 1;
setMonth( 1 );
int m = 1;
for ( ; m
dayTotal += daysOfMonth();
setMonth( m + 1 );
}
setDay( ddd - dayTotal );
setMonth( m );
}
// Convert mm and dd to ddd
int Date::convert2( void ) const // convert to a ddd yyyy format
{
int ddd = 0;
for ( int m = 1; m
ddd += days( m );
ddd += day;
return ddd;
}
// Convert from month name to month number
void Date::convert3( const char * const mPtr ) // convert to mm / dd / yyyy
{
bool flag = false;
for ( int subscript = 0; subscript
if ( !strcmp( mPtr, monthList( subscript ) ) ) {
setMonth( subscript + 1 );
flag = true; // set flag
break; // stop checking for month
}
if ( !flag )
setMonth( 1 ); // invalid month default is january
}
// Return the name of the month
const char *Date::monthList( int mm ) const
{
char *months[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October","November", "December" };
return months[ mm ];
}
// Return the days in the month
int Date::days( int m ) const
{
const int monthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
return monthDays[ m - 1 ];
}
Passo 3
Agora precisamos criar os objetos da classe e fazer a chamada das funções para exibir os resultados:
int main()
{
Date d1( 7, 4, 98 ), d2( 86, 1998 ),
d3, d4( "September", 1, 1998 );
d1.printDateSlash(); // format m / dd / yy
d2.printDateSlash();
d3.printDateSlash();
d4.printDateSlash();
cout
d1.printDateDay(); // format ddd yyyy
d2.printDateDay();
d3.printDateDay();
d4.printDateDay();
cout
d1.printDateMonth(); // format "month" d, yyyy
d2.printDateMonth();
d3.printDateMonth();
d4.printDateMonth();
cout
return 0;
}
Passo 4
A saída do nosso programa será:

Portanto, nosso programa está funcionando perfeitamente, exibindo as datas em diferentes formatos.
E por hoje é só galera!!! Até o próximo exercicio
Resposta
Código:
//cabeçalhos
#include
#include
#include
using std::cout;
#include
using namespace std;
//definição da classe
class Date {
public:
//definindo parametros
Date();
Date( int, int );
Date( int, int, int );
Date( char *, int, int );
//definindo funçõesmembro
void setMonth( int );
void setDay( int );
void setYear( int );
void printDateSlash( void ) const;
void printDateMonth( void ) const;
void printDateDay( void ) const;
const char *monthName( void ) const;
bool leapYear( void ) const;
int daysOfMonth( void ) const;
void convert1( int );
int convert2( void ) const;
void convert3( const char * const );
const char *monthList( int ) const;
int days( int ) const;
//definindo varaivesi
private:
int day;
int month;
int year;
};
// Date constructor
Date::Date()
{
long int totalTime;
double totalYear;
long double divisor;
// tempo em segundos desde 1970
totalTime = time( NULL );
divisor = ( 60.0 * 60.0 * 24.0 * 365.25 ); //número de segundos em um ano
totalYear = totalTime / divisor + 1970;
year = ( int ) totalYear;
totalYear -= year;
day = ( int ) ( 365 * totalYear );
month = 1;
while ( day - days( month + 1 ) > 0 )
day -= days( month++ );
}
// converte para mês e dia
Date::Date( int ddd, int yyyy )
{
setYear( yyyy );
convert1( ddd );
}
// Construtor de data que usa mês, dia e ano
Date::Date( int mm, int dd, int yy )
{
setYear( yy + 1900 );
setMonth( mm );
setDay( dd );
}
// Construtor de data que usa o nome do mês, dia e ano
Date::Date( char *mPtr, int dd, int yyyy )
{
setYear( yyyy );
convert3( mPtr );
setDay( dd );
}
// define o dia
void Date::setDay( int d )
{ day = d >= 1 && d
// define o mes
void Date::setMonth( int m ) { month = m >= 1 && m
// define o ano
void Date::setYear( int y ) { year = y >= 1900 && y
// Imprime a data no formato: mm/dd/aaaa
void Date::printDateSlash( void ) const
{ cout
// Imprime a data no formato: monthname dd, yyyy
void Date::printDateMonth( void ) const
{ cout
// Imprime a data no formato: ddd aaaa
void Date::printDateDay( void ) const
{ cout
// Retorna o nome do mês
const char *Date::monthName( void ) const { return monthList( month - 1 ); }
// Retorna o número de dias do mês
int Date::daysOfMonth( void ) const
{ return leapYear() && month == 2 ? 29 : days( month ); }
// Test for a leap year
bool Date::leapYear( void ) const
{
if ( year % 400 == 0 || ( year % 4 == 0 && year % 100 != 0 ) )
return true;
else
return false;
}
// Convert ddd to mm and dd
void Date::convert1( int ddd ) // convert to mm / dd / yyyy
{
int dayTotal = 0;
if ( ddd 366 ) // check for invalid day
ddd = 1;
setMonth( 1 );
int m = 1;
for ( ; m
dayTotal += daysOfMonth();
setMonth( m + 1 );
}
setDay( ddd - dayTotal );
setMonth( m );
}
// Convert mm and dd to ddd
int Date::convert2( void ) const // convert to a ddd yyyy format
{
int ddd = 0;
for ( int m = 1; m
ddd += days( m );
ddd += day;
return ddd;
}
// Convert from month name to month number
void Date::convert3( const char * const mPtr ) // convert to mm / dd / yyyy
{
bool flag = false;
for ( int subscript = 0; subscript
if ( !strcmp( mPtr, monthList( subscript ) ) ) {
setMonth( subscript + 1 );
flag = true; // set flag
break; // stop checking for month
}
if ( !flag )
setMonth( 1 ); // invalid month default is january
}
// Return the name of the month
const char *Date::monthList( int mm ) const
{
char *months[] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October","November", "December" };
return months[ mm ];
}
// Return the days in the month
int Date::days( int m ) const
{
const int monthDays[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
return monthDays[ m - 1 ];
}
int main()
{
Date d1( 7, 4, 98 ), d2( 86, 1998 ),
d3, d4( "September", 1, 1998 );
d1.printDateSlash(); // format m / dd / yy
d2.printDateSlash();
d3.printDateSlash();
d4.printDateSlash();
cout
d1.printDateDay(); // format ddd yyyy
d2.printDateDay();
d3.printDateDay();
d4.printDateDay();
cout
d1.printDateMonth(); // format "month" d, yyyy
d2.printDateMonth();
d3.printDateMonth();
d4.printDateMonth();
cout
return 0;
}