Ir ao conteúdo

Posts recomendados

Postado

Nos dias atuais, um app de alarme é encontrado em qualquer smartphone e serve para alertar o usuário de algum compromisso. A partir de um horário atual ou inicial, deve-se colocar o horário pretendido para acionar o alarme. O app calcula a diferença de tempo e mostra ao usuário como uma notificação.

Escreva um programa em linguagem C/C++ que simule o funcionamento de um app de alarme.

O programa deve ler um horário inicial, um horário de alarme, calcular o tempo para acionar o alarme e mostrar esse tempo calculado.

Os horários a serem lidos obedecem o padrão de 0h a 23h e 0min a 59min.

 

EXEMPLOS: 

 

Horário inicial: 5 15; Horário de alarme: 7 0;           A mensagem mostrada deve ser: 1 hora(s) e 45 minuto(s).

Horário inicial: 0 -1;                                                 A mensagem mostrada deve ser: Horario inicial invalido.

Horário inicial: 12 15; Horário de alarme: 24 0;      A mensagem mostrada deve ser: Horario de alarme invalido.

Horário inicial: 19 0; Horário de alarme: 6 30;        A mensagem mostrada deve ser: 11 hora(s) e 30 minuto(s).

Horário inicial: 0 1; Horário de alarme: 23 59;        A mensagem mostrada deve ser: 23 hora(s) e 58 minuto(s).

 

 

Tentei converter tudo pra segundo pra depois transformar na saída correta mas não consigo sair do lugar :(

Postado
45 minutos atrás, Rafael Guimarães disse:

Tentei converter tudo pra segundo pra depois transformar na saída correta mas não consigo sair do lugar

 

Já está no lugar certo. O alarme é como um cronômetro de 24H. Não precisa de segundos porque a resolução do alarme é de minutos e são 1440 possíveis alarmes. Só precisa ver qual desses 1440 corresponde ao slot em questão.

 

No caso do ultimo exemplo, o início é 00:01, o primeiro alarme possível. E o alarme para 23:59, o último alarme possível. Só que se mudar o dia precisa somar as parcelas. Um alarme disparado 23:59 para tocar em 00:01 deve somar os tempos dos dois dias, 1+1, 2 minutos.

Postado

@arfneto Obrigado pela resposta. 

 

No caso ali, a mensagem que deve ser mostrada é quanto tempo falta pro alarme despertar, ex: hora atual = 05h:15m. Hora do Alarme = 07:00.  Eu preciso fazer com que minha saída seja 1h45m que é o tempo entre a hora inicial e a hora final pro alarme despertar, porém esse processamento que estou com dificuldades, quando eu converto esses valores  do exemplo para segundos aparece no console 28800s que é 8h, sendo que na verdade eu precisaria chegar ao valor de 1h45m, não sei se ficou claro. Até então fiz assim:

#include<iostream>

using namespace std;



int main(){

int ha = 5, ma =15;

int hd = 7, md =00;

float result, h1,m2;



h1 = hd - ha;

m2 = md - ma;



result = (h1*3600/ m2*60);



cout<<result;



}

 

 

Não consigo sair dessa parte. (creio que todo meu processamento está errado)!

Postado
5 minutos atrás, Rafael Guimarães disse:

No caso ali, a mensagem que deve ser mostrada é quanto tempo falta pro alarme despertar, ex: hora atual = 05h:15m. Hora do Alarme = 07:00.  Eu preciso fazer com que minha saída seja 1h45m que é o tempo entre a hora inicial e a hora final pro alarme despertar, porém esse processamento que estou com dificuldades, quando eu converto esses valores  do exemplo para segundos aparece no console 28800s que é 8h, sendo que na verdade eu precisaria chegar ao valor de 1h45m, não sei se ficou claro

 

Foi o que eu expliquei.

 

Talvez não tenha prestado atenção ao que eu expliquei...

 

Não precisa de segundos: a resolução do alarme é de minutos. Não perca tempo com isso. São 1440 possíveis alarmes no dia. Só precisa calcular a diferença como eu disse. E é só uma subtração. Não é um problema de C++ a menos que precise de uma classe alarme que tenha uma função que retorne o tempo que falta no formato "HH:MM", mas o enunciado é bem vago.

 

Escreva uma planilha e conte: 

 

5:15 são 315 minutos

7:00 são 420 minutos

A diferença é o que falta para o alarme... 105 minutos, no popular 01:45

 

00:01 são ... 1 minuto. Esse foi fácil

23:59 são 1439 minutos

A diferença é de 1438 minutos, no popular 23:58

 

E se passar da meia noite? 

 

Aí a diferença fica negativa já que o seu alarme é só de um dia só. Então soma 1440, no popular 24H e o que acontece? O relógio dá a volta (ou daria se tivesse ponteiros).

 

19:00 são 1140 minutos

06:30 são 390 minutos

A diferença é de -750 minutos. 

Soma 1440 minutos, 24H e vai ter 690, no popular 11:30

 

Uma conversão, uma subtração, um soma se for negativo. 

 

 

 

 

Postado

A unidade mínima nesse problema é o minuto, então não há porque converter para segundos.

 

Use apenas números inteiros, assim para saber o número de horas redonas restantes basta fazer a divisão (/).

 

Basicamente os minutos restantes são o resto da divisão por 60 então use o operador de módulo (%).

 

Caso o horário do alarme seja menor que o horário atual, para calcular a diferença basta subtrair o horário atual de (24 * 60) e somar ao horário do alarme.

 

Supondo que você já tenha convertido tudo para minutos e calculado a deferença.

 

horas restantes = diferença / 60

minutos restantes = diferença % 60

Postado
Citação

Converte em minutos o tempo que falta para o alarme

 

Isso se traduz em, por exemplo

 

int     intervalo = hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes;
if ( intervalo < 0 ) intervalo += 1440;

 

4 horas atrás, Rafael Guimarães disse:

a mensagem que deve ser mostrada é quanto tempo falta pro alarme despertar

 

Que pode ser visto como

 

cout << intervalo / 60 << " hora(s) e " << intervalo % 60 << " minutos(s)\n";

 

Só essas 3 linhas.

 

Exemplo 1
 

Do jeito (chato) de C++ antes de C++20 e std::format, que ainda não tem em todos os compiladores, para mostrar isso
 

        inicio: 19:00   final:  06:30   restam: 11:30

 

Seria preciso algo assim, usando #include <iomanip>

 

cout << 
"\n\tinicio:\t" << setfill('0') << setw(2) << hora_antes << ":" << setw(2) << minuto_antes <<
"\tfinal:\t" << setfill('0') << setw(2) << hora_depois << ":" << setw(2) << minuto_depois  <<
 "\trestam:\t" << setfill('0') << setw(2) << intervalo / 60 << ":" << setw(2) << intervalo % 60 <<
 "\n\n";

 

O código
 

Spoiler

 




#include<iomanip>
#include<iostream>
using namespace std;


int main(void)
{

// le
int     hora_antes = 19; // hora antes
int     minuto_antes = 0;
int     hora_depois = 6; // hora depois
int     minuto_depois = 30;
// calcula
int     intervalo = hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes;
if ( intervalo < 0 ) intervalo += 1440;
// mostra mais arrumadinho
cout << 
"\n\tinicio:\t" << setfill('0') << setw(2) << hora_antes << ":" << setw(2) << minuto_antes <<
"\tfinal:\t" << setfill('0') << setw(2) << hora_depois << ":" << setw(2) << minuto_depois  <<
 "\trestam:\t" << setfill('0') << setw(2) << intervalo / 60 << ":" << setw(2) << intervalo % 60 <<
 "\n\n";
}


 


Exemplo 2

 

Se fosse uma aposta: é possível não usar nenhuma variável a mais e nem o if, escrevendo um cout folclórico
 

cout << 
    (
        ((hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes)<0) ?
            (( 24*60 + hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes)/60) :
            ((hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes)/60)
    ) << " hora(s) e " <<
        (
        ((hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes)<0) ?
            (( 24*60 + hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes)%60) :
            ((hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes)%60)
    ) << " minuto(s)\n";

 

O código
 

Spoiler




#include<iostream>
using namespace std;

int main(void)
{
// le
int     hora_antes = 19; // hora antes
int     minuto_antes = 0;
int     hora_depois = 6; // hora depois
int     minuto_depois = 30;
// mostra enquanto calcula
cout << 
    (
        ((hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes)<0) ?
            (( 24*60 + hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes)/60) :
            ((hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes)/60)
    ) << " hora(s) e " <<
        (
        ((hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes)<0) ?
            (( 24*60 + hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes)%60) :
            ((hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes)%60)
    ) << " minuto(s)\n";
 return 0;
}

 


Exemplo 3

 

O ortodoxo, calcula e mostra
 

11 hora(s) e 30 minuto(s)


 

// calcula
int     intervalo = hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes;
if ( intervalo < 0 ) intervalo += 1440;
// mostra como pedido...
cout << intervalo / 60 << " hora(s) e " << intervalo % 60 << " minutos(s)\n";
Spoiler




#include<iostream>
using namespace std;

int main(void)
{

// le
int     hora_antes = 19; // hora antes
int     minuto_antes = 0;
int     hora_depois = 6; // hora depois
int     minuto_depois = 30;
// calcula
int     intervalo = hora_depois*60 + minuto_depois - hora_antes*60 - minuto_antes;
if ( intervalo < 0 ) intervalo += 1440;
// mostra como pedido...
cout << intervalo / 60 << " hora(s) e " << intervalo % 60 << " minutos(s)\n";
 return 0;
}

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!