Código mostrando as horas minutos e segundos errados[RESOLVIDO]

1. Código mostrando as horas minutos e segundos errados[RESOLVIDO]

César
dark777

(usa Debian)

Enviado em 17/09/2023 - 01:56h

Olá galera beleza?

Meu notebook foi pro beleléu estou escrevendo meus códigos usando o celular usando um editor Android que dá suporte para todas as linguagens de programação e traz os compiladores junto com ele o editor se chama "Editor de códigos".

Estou escrevendo o código para calcular o tempo de sobrevida e ao executar o código ele executa porém supondo que a pessoa nasceu no dia 20/02/1990 as 22:05

Quando eu entro com este input no programa na função displayAgeAndSurvivor ele mostra como saída: 22 horas quando a hora corrente é 19:00:00 qual é o erro do código? Pelo que eu percebi ele está mostrando as mesmas horas digitadas quando a pessoa nasceu por que?

O código é este abaixo:


#include <ctime>
#include <iostream>

//Calculando idade atraves do nunero de sapato.
//https://m.youtube.com/watch?v=yT8b0bLlYac

//https://educacao.uol.com.br/disciplinas/geografia/ano-bissexto-por-que-a-cada-4-anos-fevereiro-tem-29-dias.htm

using namespace std;

// Estruturas para representar datas, horas e durações
struct Date {
int year;
int month;
int day;
};

struct Time {
int hours;
int minutes;
int seconds;
};

struct Duration {
long days;
long months;
long minutes;
long hours;
long seconds;
};

// Função para calcular a diferença entre duas datas em dias
int getDaysDifference(const Date& date1, const Date& date2) {

tm timeinfo1 = {0};
timeinfo1.tm_year = date1.year - 1900;
timeinfo1.tm_mon = date1.month - 1;
timeinfo1.tm_mday = date1.day;

std::tm timeinfo2 = {0};
timeinfo2.tm_year = date2.year - 1900;
timeinfo2.tm_mon = date2.month - 1;
timeinfo2.tm_mday = date2.day;

time_t time1 = mktime(&timeinfo1);
time_t time2 = mktime(&timeinfo2);

int daysDiff = ((time2 - time1) / (60 * 60 * 24));

return daysDiff;
}

// Função para obter a data atual
Date getCurrentDate() {
time_t currentTime;
time(¤tTime);
tm* timeinfo = localtime(¤tTime);

Date currentDate;
currentDate.year = timeinfo->tm_year + 1900;
currentDate.month = timeinfo->tm_mon + 1;
currentDate.day = timeinfo->tm_mday;

return currentDate;
}

// Função para obter o horário atual
Time getCurrentTime() {
time_t currentTime;
time(¤tTime);
tm* timeinfo = localtime(¤tTime);

Time currentTimeStruct;
currentTimeStruct.hours = timeinfo->tm_hour;
currentTimeStruct.minutes = timeinfo->tm_min;
currentTimeStruct.seconds = timeinfo->tm_sec;

return currentTimeStruct;
}

// Função para calcular a duração entre duas datas e horas
Duration calculateDuration(const Date& birthDate, const Time& birthTime, const Date& currentDate, const Time& currentTime) {
tm t1 = {0};
t1.tm_year = birthDate.year - 1900;
t1.tm_mon = birthDate.month - 1;
t1.tm_mday = birthDate.day;
t1.tm_hour = birthTime.hours;
t1.tm_min = birthTime.minutes;
t1.tm_sec = birthTime.seconds;

tm t2 = {0};
t2.tm_year = currentDate.year - 1900;
t2.tm_mon = currentDate.month - 1;
t2.tm_mday = currentDate.day;
t2.tm_hour = currentTime.hours;
t2.tm_min = currentTime.minutes;
t2.tm_sec = currentTime.seconds;

time_t time1 = mktime(&t1);
time_t time2 = mktime(&t2);

double seconds = difftime(time2, time1);
double minutes = seconds / 60;
double hours = minutes / 60;
double days = hours / 24;
double months = days / 30.436875; // Média de dias em um mês (365,25 / 12)

Duration duration;
duration.seconds = static_cast<long>(seconds);
duration.minutes = static_cast<long>(minutes);
duration.hours = static_cast<long>(hours);
duration.days = static_cast<long>(days);
duration.months = static_cast<long>(months);

return duration;
}

// Função para calcular a diferença entre dois horários em horas
int getHoursDifference(const Time& currentTime, const Time& birthTime) {

int secondsDiff = (currentTime.hours - birthTime.hours) * 3600 +
(currentTime.minutes - birthTime.minutes) * 60 +
(currentTime.seconds - birthTime.seconds);

if (secondsDiff < 0) {
secondsDiff += 24 * 3600; // Adicionar um dia em segundos
}

int hoursDiff = (secondsDiff / 3600);

return hoursDiff;
}

// Função para exibir a idade e a sobrevida
void displayAgeAndSurvival(const Date& birthDate, const Time& birthTime) {

Date currentDate = getCurrentDate();

Time currentTime = getCurrentTime();

int days = getDaysDifference(birthDate, currentDate);

int hours = getHoursDifference(birthTime, currentTime);

int years = (days / 365);
int months = ((days % 365) / 30);
days = ((days % 365) % 30);

int minutes = (hours * 60);
int seconds = (minutes * 3600) % 60;

cout << "Idade: " << years << " anos" << endl;
cout << "Dias: " << days << endl;
cout << "Meses: " << months << endl;
cout << "Horas: " << hours << endl;
cout << "Minutos: " << minutes << endl;
cout << "Segundos: " << seconds << endl;
}

int main() {
int idade;
Date birthDate, currentDate;
Time birthTime, currentTime;

cout << "Informe a data de nascimento (dia mes ano): ";
cin >> birthDate.day >> birthDate.month >> birthDate.year;

currentDate = getCurrentDate();

currentTime = getCurrentTime();

idade = (currentDate.year - birthDate.year);

cout << "\nInforme a hora de nascimento (horas minutos segundos): ";
cin >> birthTime.hours >> birthTime.minutes >> birthTime.seconds;

Duration duration = calculateDuration(birthDate, birthTime, currentDate, currentTime);

std::cout << "Tempo de sobrevida: " << std::endl;

std::cout << "Você tem: " << idade << " anos" << std::endl;

std::cout << "Dias: " << duration.days << std::endl;
std::cout << "Meses: " << duration.months << std::endl;

std::cout << "Horas: " << duration.hours << std::endl;
std::cout << "Minutos: " << duration.minutes << std::endl;

std::cout << "Segundos: " << duration.seconds << " de vida desde o dia em que nasceu.."<< std::endl;

displayAgeAndSurvival(birthDate, birthTime);

return 0;
}


wiki.anon


  


2. Re: Código mostrando as horas minutos e segundos errados[RESOLVIDO]

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 17/09/2023 - 01:56h

Oi wiki.anon, que situação complicada, não é mesmo? Fazer o código rodar direito no celular pode ser um pouco desafiador.

Eu revisei seu código e parece que ele está correto. A forma como você pede os inputs da data de nascimento e da hora de nascimento estão corretos, ou seja, o programa deve pausar e pedir essas informações para o usuário.

Porém, pode ter algo a ver com o ambientes do "Editor de códigos". Ele realmente funciona corretamente com outros códigos que você já tentou, especialmente códigos em C++ que requerem entrada de usuário? Caso não tenha feito isso, sugeriria testar um código bem simples que requer entrada de usuário para verificar isso.

Outra coisa, se o seu editor suporta depuração passo a passo, sugiro que tente executar o código dessa forma. Isso pode te ajudar a identificar em que momento exatamente o problema está ocorrendo.

Também pode ser interessante conferir as configurações do seu editor no celular, pode haver alguma opção específica ativada que esteja interferindo na execução de seu código.

Espero que isso te ajude a resolver seu problema, qualquer coisa é só perguntar. Boa sorte com seu código!

Não esqueça de continuar


3. Re: Código mostrando as horas minutos e segundos errados[RESOLVIDO]

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 17/09/2023 - 21:19h

Olá wiki.anon,

A função displayAgeAndSurvivor pode estar mostrando a mesma hora de nascimento porque você não atualizou a hora após pegar o input do usuário.

Pode ser que você esteja exibindo a mesma variável que foi inicializada com a hora de nascimento, mas não a atualizou após a entrada do usuário.

Verifique se depois de pegar a entrada do usuário, você está atualizando a variável correspondente.

Algo assim:


// Pega a entrada do usuário
std::cin >> userHourOfBirth;

// Atualiza a variável hourOfBirth
hourOfBirth = userHourOfBirth;


# analise seu código novamente e veja se é esse o caso. Manter uma organização clara e comentada do código é sempre um boa prática que ajuda a evitar cometer erros pequenos como esse.

Não se esqueça de me informar se você tiver algum progresso ou se tiver mais alguma pergunta.


4. Re: Código mostrando as horas minutos e segundos errados[RESOLVIDO]

aguamole
aguamole

(usa KUbuntu)

Enviado em 17/09/2023 - 22:06h

A alexabolad apesar de resolver as vezes ela é um modelo de linguagem natural.


5. Re: Código mostrando as horas minutos e segundos errados[RESOLVIDO]

César
dark777

(usa Debian)

Enviado em 19/09/2023 - 03:03h


alexabolada escreveu:

Olá wiki.anon,

A função displayAgeAndSurvivor pode estar mostrando a mesma hora de nascimento porque você não atualizou a hora após pegar o input do usuário.

Pode ser que você esteja exibindo a mesma variável que foi inicializada com a hora de nascimento, mas não a atualizou após a entrada do usuário.

Verifique se depois de pegar a entrada do usuário, você está atualizando a variável correspondente.

Algo assim:


// Pega a entrada do usuário
std::cin >> userHourOfBirth;

// Atualiza a variável hourOfBirth
hourOfBirth = userHourOfBirth;


# analise seu código novamente e veja se é esse o caso. Manter uma organização clara e comentada do código é sempre um boa prática que ajuda a evitar cometer erros pequenos como esse.

Não se esqueça de me informar se você tiver algum progresso ou se tiver mais alguma pergunta.


Ainda não deu certo parece que ele não está calculando corretamente a diferença entre a data e hora em que a pessoa nasceu e a data e hora corrente do SO.

wiki.anon


6. Re: Código mostrando as horas minutos e segundos errados[RESOLVIDO]

Alexa Bolada
alexabolada

(usa Debian)

Enviado em 19/09/2023 - 03:04h

Olá wiki.anon,

Entendo que está tendo dificuldades para calcular a diferença entre as datas e horas. Acredito que posso ajudar com isso.

Uma das formas de resolver o problema em questão é pegar a data e hora atual do sistema operacional e converter para o padrão Unix, ou seja, o número de segundos desde a Era Unix (1 de Janeiro de 1970).

A mesma operação deve ser feita com a data e a hora de nascimento. Com esses dois números em mãos, basta subtrair para encontrar a diferença em segundos.

Se você está trabalhando com a biblioteca chrono do C++, por exemplo, poderia fazer algo assim:


// Pega o tempo atual
std::chrono::time_point<std::chrono::system_clock> now;
now = std::chrono::system_clock::now();

// Converte para Unix timestamp
std::chrono::duration<int> unixTimestamp = std::chrono::duration_cast<std::chrono::seconds>(now.time_since_epoch());

// Faça o mesmo com a data e hora de nascimento

// Calcula a diferença
int difference = unixTimestamp.count() - birthUnixTimestamp.count();


Porque de acordo com seu fluxo, o # cálculo da diferença poderia estar sendo realizado incorretamente ou talvez não esteja aconte






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts