Ir para conteúdo
Fórum Script Brasil
  • 0

Algoritmo horário.


noobinc

Pergunta

Olá pessoal. Tenho um problema de faculdade que é assim:

/*Escreva um programa que leia um horário (hora, minuto e segundo)

e mostre o horário um segundo depois.

Por exemplo, se o horário lido for 12:34:25,

o horário mostrado deve ser 12:34:26; se o horário lido for 12:59:59,

o horário mostrado deve ser 13:00:00.*/

Só que tem alguns detalhes: não é permitido utilizar desvio if else, apenas entrada/saída e operações aritméticas.

Alguém poderia me dar uma ajuda? Desde já agradeço!

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Você pode dividir a horário em 3 perguntas, e depois no programa, incrementar o valor resultante da terceira pergunta em 1 e depois jogar na tela da seguinte forma:

cout << numHoras << ":" << numMinutos << ":" << numSegundos << endl;
Att., Pedro. Edit: Acho que você vai precisar de um if, para o caso dos segundos serem iguais à 60, pois nesse caso você vai precisar zerar a contagem e aumentar o minuto em 1. Edit2: Estava atoa em casa e resolvi fazer o código. Funciona perfeitamente, mas como te disse, alguns ifs são necessários.
#include <cstdlib>
#include <iostream>

using namespace std;
struct VariaveisGlobais // Aqui usei uma struct para segurar os valores das Horas, Minutos e Segundos, pois além de ser mais organizado, é mais prático.
{
       int Horas, Minutos, Segundos;
};  VariaveisGlobais HorariosObj;

void Pergunta();// Protótipo das funções.
void Horarios(int, int, int);// Protótipo das funções.
int Sair();// Protótipo das funções.
void Pergunta()
{
     do
     {
     cout << "Entre o valor das horas:" << endl;
     cin >> HorariosObj.Horas;
     cout << "\n";
     cin.sync();
     }
     while (HorariosObj.Horas > 24); // Coloquei esse while para o caso do usuário colocar um valor maior que 24 para o valor das horas.
     cout << "Entre o valor dos minutos:" << endl;
     cin >> HorariosObj.Minutos;
     cout << "\n";
     cin.sync();
     cout << "Entre o valor dos segundos" << endl;
     cin >> HorariosObj.Segundos;
     cout << "\n";
     cin.sync();
     Horarios(HorariosObj.Horas, HorariosObj.Minutos, HorariosObj.Segundos);// Aqui chamo a função que fará os cálculos necessários e mostrará os valores.
}

void Horarios (int Horas, int Minutos, int Segundos)
{
     char Opcao;

        if (HorariosObj.Minutos > 60)
        {
HorariosObj.Horas += HorariosObj.Minutos / 60; // No caso dos minutos serem maiores que 60, aumentaremos o valor das horas em: ValorMinutos/60.
HorariosObj.Minutos = HorariosObj.Minutos % 60;// No caso dos minutos serem maiores que 60,
                                               // o seu novo valor será o resto da divisão (%) do valor dos minutos por 60.
        if (HorariosObj.Horas > 24)
              {
                HorariosObj.Horas -= 24;// No caso de o resultado das horas ser maior que 24, seu novo valor será: ValorAntigo - 24.
              }
        }
        if (HorariosObj.Segundos > 60)
        {
HorariosObj.Minutos += HorariosObj.Segundos/60;// No caso dos segundos serem maiores que 60, aumentaremos o valor dos minutos em: ValorSegundos/60.
 if (HorariosObj.Minutos > 60)// Usei esse if no caso do usuário usar um valor igual ou maior que 3600 para os segundos, ou seja, 1 hora.
 {
    HorariosObj.Horas += HorariosObj.Minutos/60;
         if (HorariosObj.Horas > 24)
         {
           HorariosObj.Horas -= 24;
         }
    HorariosObj.Minutos = HorariosObj.Minutos % 60;
HorariosObj.Segundos = HorariosObj.Segundos % 60;// No caso dos segundos serem maiores que 60,
        }                                        //o seu novo valor será o resto da divisão (%) do valor dos segundos por 60.
        }
  cout << HorariosObj.Horas << ":" << HorariosObj.Minutos << ":" << HorariosObj.Segundos << endl;// Aqui eu jogo os valores obtidos na tela, usando os
        cout << "\n";                                                                           // dois pontos (:) para separá-los, como já é padrão.
        cout << "Quer continuar a usar o programa? (S/N)" << endl;
        cin >> Opcao;
        cout << "\n";
        cin.sync();
        switch (Opcao) // Aqui usei um switch bem simples para dar ao usuário a chance de rodar o programa novamente.
        {
               case 'S': { Pergunta(); break; }
               case 's':  { Pergunta(); break; }
               case 'N': { Sair(); break; }
               case 'n': { Sair(); break; }
                default: { Sair(); break;}
        }
}

int Sair()// Função usada para fechar o programa. Criei ela separadamente por questões de organização e praticidade para o switch.
{
   cout << "Adeus!" << endl;
   cin.get();
   return 0;
}


int main()
{
    Pergunta();//Aqui chamo a função que fará o programa começar seu loop, dentro de main.
    return 0;
}

Att.,

Pedro

Editado por PedroCunha
Link para o comentário
Compartilhar em outros sites

  • 0
Você pode dividir a horário em 3 perguntas, e depois no programa, incrementar o valor resultante da terceira pergunta em 1 e depois jogar na tela da seguinte forma:

cout << numHoras << ":" << numMinutos << ":" << numSegundos << endl;
Att., Pedro. Edit: Acho que você vai precisar de um if, para o caso dos segundos serem iguais à 60, pois nesse caso você vai precisar zerar a contagem e aumentar o minuto em 1. Edit2: Estava atoa em casa e resolvi fazer o código. Funciona perfeitamente, mas como te disse, alguns ifs são necessários.
#include <cstdlib>
#include <iostream>

using namespace std;
struct VariaveisGlobais // Aqui usei uma struct para segurar os valores das Horas, Minutos e Segundos, pois além de ser mais organizado, é mais prático.
{
       int Horas, Minutos, Segundos;
};  VariaveisGlobais HorariosObj;

void Pergunta();// Protótipo das funções.
void Horarios(int, int, int);// Protótipo das funções.
int Sair();// Protótipo das funções.
void Pergunta()
{
     do
     {
     cout << "Entre o valor das horas:" << endl;
     cin >> HorariosObj.Horas;
     cout << "\n";
     cin.sync();
     }
     while (HorariosObj.Horas > 24); // Coloquei esse while para o caso do usuário colocar um valor maior que 24 para o valor das horas.
     cout << "Entre o valor dos minutos:" << endl;
     cin >> HorariosObj.Minutos;
     cout << "\n";
     cin.sync();
     cout << "Entre o valor dos segundos" << endl;
     cin >> HorariosObj.Segundos;
     cout << "\n";
     cin.sync();
     Horarios(HorariosObj.Horas, HorariosObj.Minutos, HorariosObj.Segundos);// Aqui chamo a função que fará os cálculos necessários e mostrará os valores.
}

void Horarios (int Horas, int Minutos, int Segundos)
{
     char Opcao;

        if (HorariosObj.Minutos > 60)
        {
HorariosObj.Horas += HorariosObj.Minutos / 60; // No caso dos minutos serem maiores que 60, aumentaremos o valor das horas em: ValorMinutos/60.
HorariosObj.Minutos = HorariosObj.Minutos % 60;// No caso dos minutos serem maiores que 60,
                                               // o seu novo valor será o resto da divisão (%) do valor dos minutos por 60.
        if (HorariosObj.Horas > 24)
              {
                HorariosObj.Horas -= 24;// No caso de o resultado das horas ser maior que 24, seu novo valor será: ValorAntigo - 24.
              }
        }
        if (HorariosObj.Segundos > 60)
        {
HorariosObj.Minutos += HorariosObj.Segundos/60;// No caso dos segundos serem maiores que 60, aumentaremos o valor dos minutos em: ValorSegundos/60.
 if (HorariosObj.Minutos > 60)// Usei esse if no caso do usuário usar um valor igual ou maior que 3600 para os segundos, ou seja, 1 hora.
 {
    HorariosObj.Horas += HorariosObj.Minutos/60;
         if (HorariosObj.Horas > 24)
         {
           HorariosObj.Horas -= 24;
         }
    HorariosObj.Minutos = HorariosObj.Minutos % 60;
HorariosObj.Segundos = HorariosObj.Segundos % 60;// No caso dos segundos serem maiores que 60,
        }                                        //o seu novo valor será o resto da divisão (%) do valor dos segundos por 60.
        }
  cout << HorariosObj.Horas << ":" << HorariosObj.Minutos << ":" << HorariosObj.Segundos << endl;// Aqui eu jogo os valores obtidos na tela, usando os
        cout << "\n";                                                                           // dois pontos (:) para separá-los, como já é padrão.
        cout << "Quer continuar a usar o programa? (S/N)" << endl;
        cin >> Opcao;
        cout << "\n";
        cin.sync();
        switch (Opcao) // Aqui usei um switch bem simples para dar ao usuário a chance de rodar o programa novamente.
        {
               case 'S': { Pergunta(); break; }
               case 's':  { Pergunta(); break; }
               case 'N': { Sair(); break; }
               case 'n': { Sair(); break; }
                default: { Sair(); break;}
        }
}

int Sair()// Função usada para fechar o programa. Criei ela separadamente por questões de organização e praticidade para o switch.
{
   cout << "Adeus!" << endl;
   cin.get();
   return 0;
}


int main()
{
    Pergunta();//Aqui chamo a função que fará o programa começar seu loop, dentro de main.
    return 0;
}

Att.,

Pedro

olha cara a melhor soluçao para seu problema e transformar as horas minutos e segundo em numeros inteiros exmplo se 1 hora equivale a 60 minutos e minutos equivale a 60s, então se você transformar tudo em segundo isso ficara mais facil e na hora de mostrar você dividi tudo para o formato de hora minuto e sugundo novamento depois de incrementar o segundo, mais e basicamente isso, normalmente onde eu trabalho a gente precisa compara datas dessa forma então colocamos tudo em um inteiro seria a mesma logica, exemplo 03/04/2012 seria 20120403 esse numero e maior que 20120402. Dessa forma não e preciso utilizar nem uma condição.

Link para o comentário
Compartilhar em outros sites

  • 0

Bom, mesmo que você transformasse em inteiros, eventualmente você precisaria usar alguma condicional. Quanto ao que você falou das datas, não entendi da forma que você escreveu.

Att.,

Pedro.

Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite a todos!

Realmente Pedro, não precisaria de condicional dessa forma. Se converter tudo para segundos, somar 1 e depois ir dividindo para voltar a hora, minuto e segundo não tem condicional.

Sobre o formato de data, vou explicar: essa forma de representar datas é utilizado quando você quer ordenar eventos, por exemplo. Escrevendo a data em ano, mês e dia ao invés do contrário cria-se um número crescente. Para fazer um teste, faca o seguinte:

Crie três arquivos em uma pasta qualquer no seu computador. Os nomes dos arquivos devem ser as seguintes datas: 20 de Janeiro de 2012, 14 de agosto de 2012 e 17 de maio de 2013. Primeiro use como nome as datas em dia, mês e ano: 20012012, 14082012 e 17052013. Agora ordene por nome e veja o que acontece: qualquer forma que ordene, crescente ou decrescente, a data de 2013 sempre vai ficar no meio. Você não consegue ordenar de forma que a data mais recente apareça primeiro, fica embaralhado.

Agora mude o nome para ano, mês e dia: 20120120, 20120814 e 20130517. Veja que agora, ao ordenar por nome, as datas ficam em ordem crescente ou decrescente, como você preferir... :)

Abraços,

Marcelo Utikawa da Fonseca

Link para o comentário
Compartilhar em outros sites

  • 0

Tente esse algoritmo, fiz rapido, por isso teste e faça as modificações que julgar necessarias:

#include <stdio.h>

typedef unsigned long long int uintm;

uintm char2int(const char* adr)
{
    return ((adr[0] - '0')*10)+(adr[1] - '0');
}

void int2char(uintm n, char* s)
{
    *s++ = '0' + ((n / 10)%10);
    *s++ = '0' + (n % 10);
    *s = 0;
}

void addsecs2hour(uintm secs, char* hh, char* mm, char* ss)
{
    uintm s, h, m;
    
    s  = char2int(ss) + secs;
    m  = char2int(mm);
    h  = char2int(hh);
    s += (m * 60) + (h * 3600);
    
    h = s / 3600;
    m = (s - (h * 3600)) / 60;
    s -= (h * 3600) + (m * 60);
    
    int2char(s, ss);
    int2char(m, mm);
    int2char(h, hh);
}

int main(int argc, char* argv[])
{
    char h[4], m[4], s[4];
    fprintf(stdout, "Insira o horario (hh:mm:ss): ");
    scanf("%2c%*c%2c%*c%2c%*c", h, m, s);
    addsecs2hour(1, h, m, s);
    fprintf(stdout, "Mais um segundo: %s:%s:%s\n", h, m, s);
    return 0;
}

Editado por Mateus GP
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...