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;

}