Ir ao conteúdo
  • Cadastre-se

C Como faço para pegar um único número e separar em hora, minutos e segundos?


Posts recomendados

Boa tarde , gente ! Tô tentando fazer um programa em C pra ler uma entrada de um único número inteiro e converter em hora, minuto e segundo de um relógio. Um dia foi dividido em 10 horas,  de 100 minutos cada  em 100s e 1m com 100s. Eu fiz dessa forma mas não sei como vou pegar a hora, o minuto e o segundo quando o usuário digitar.

 

 

 

int main(){
int hhmmss, hh, mm, ss, hh1, mm1, ss1;
int fh, fm, fs;
fh=0,42; // o equivalente de quanto vale uma hora em relação ao relógio imaginário 
fm=0,16;// o mesmo para minutos
ft=0,88;// o mesmo para segundos

     printf("digite a hora  no formato hhmmss");
     scanf("%d",hhmmss);
hh=()//pegar hh
mm=()//pegar mm
ss=()//pegar ss
    if(0=<hh=<23 && 0=<mm=<59 && 0=<ss=<59);
hh1=hh*fh;
mm1=mm*fm;
ss1=ss*fs;
printf("a hora convertida para o relogio do sistema decimal é:" "%d",hh1, ":" "%d",mm1, ":" "%d",ss1);
    else
    printf("você digitou uma hora inválida");
}

 

Como faço pra pegar e separar a hora dos minutos e segundos?

Link para o comentário
Compartilhar em outros sites

@Thiago Colombiano @Thiago Colombiano     você pode também usar o comando mod , que na linguagem c é o % para separar cada digito do numero , e seu código poderia ser assim  :

#define _CRT_SECURE_NO_WARNINGS  // para usar scanf e outras funções no visual studio
#include <stdio.h>

int main() 
{
    int hhmmss;
    int hh;
    int mm;
    int ss;
    printf("digite a hora  no formato hhmmss ");
    scanf("%d", & hhmmss);
    ss = hhmmss % 100;
    hhmmss /= 100;
    mm = hhmmss % 100;
    hh = hhmmss / 100;
    if ((hh <= 23 && mm <= 59 && ss <= 59) && (hh >= 0 && mm >= 0 && ss >= 0))
    {
        printf("\na hora convertida para o relogio do sistema decimal eh %2d : %2d : %2d\n\n\n", 
                                                                                   hh, mm, ss);
    }
    else
        printf("voce digitou uma hora invalida");
    return 0;
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

@devair1010  pra que serve #define_CRT.

 

Seu programa dividiu certinho o que a pessoa digitar. 

Mas eu me expressei errado. É uma conversão diferente.

Nesse relógio,  um exemplo, 14 h 31m e 51s( do nosso horário convencional) são 6h 5m 45s.

 

Então eu teria que achar a razão primeiro. Eu tentei fazer 6h esta pra 14h x pra 1h e deu 0,43. Fiz o mesmo com minutos e segundos. 5 m tão pra 31 m e deu 0,2m e 51s pra 45 e deu 0,9s.

 

Eu pensei em quando a pessoa digitar a hhmmss eu ler em char e ir separando mas tava dando zero na saída: 

#include <stdio.h>

int main(){
int hh, mm, ss, hh1, mm1, ss1;
char hhmmss[6];
int fh, fm, fs;
fh=0,42;
fm=0,16;
fs=0,88;

printf("digite a hora  no formato hhmmss");
scanf("%c", hhmmss);
hh=(hhmmss[1]&&hhmmss[2]); //pegar hh
mm=(hhmmss[3]&&hhmmss[4]); //pegar mm
ss=(hhmmss[5]&&hhmmss[6]); //pegar ss
    if(0<=hh<=23 && 0<=mm<=59 && 0<=ss<=59);
        hh1=hh*fh; //considerar o proximo inteiro
        mm1=mm*fm; //considerar o proximo inteiro
        ss1=ss*fs; //considerar o proximo inteiro
        printf("a hora convertida para o relogio do sistema decimal é" "%d",hh1 && mm1 && ss1);
        else(
   printf("você digitou uma hora inválida");
)
}

 

 

 

Link para o comentário
Compartilhar em outros sites

@Thiago Colombiano     o CRT serve para compilar na IDE Visual Studio da Microsoft , pois senão o scanf fica bugado ,     e   com char também dá certo sim ,   mas no caso você precisa é uma string , que pode ter mais de um caractere , pois o caractere %c que você pegou  é apenas um caractere , então teria que ser %s ,  e ai pega os dois primeiros , que estão na posição zero e um ,para hora e na posição dois e tres para os minutos e nas posições Quatro e cinco para os segundos , e depois adiciona o nulo ao final de cada uma e converte para inteiro co a função atoi .

Link para o comentário
Compartilhar em outros sites

@devair1010

11 minutos atrás, Thiago Colombiano disse:

@devair1010  pra que serve #define_CRT.

 

Seu programa dividiu certinho o que a pessoa digitar. 

Mas eu me expressei errado. É uma conversão diferente.

Nesse relógio,  um exemplo, 14 h 31m e 51s( do nosso horário convencional) são 6h 5m 45s.

 

Então eu teria que achar a razão primeiro. Eu tentei fazer 6h esta pra 14h x pra 1h e deu 0,43. Fiz o mesmo com minutos e segundos. 5 m tão pra 31 m e deu 0,2m e 51s pra 45 e deu 0,9s.

 

Eu pensei em quando a pessoa digitar a hhmmss eu ler em char e ir separando mas tava dando zero na saída: 



#include <stdio.h>

int main(){
int hh, mm, ss, hh1, mm1, ss1;
char hhmmss[6];
int fh, fm, fs;
fh=0,42;
fm=0,16;
fs=0,88;

printf("digite a hora  no formato hhmmss");
scanf("%c", hhmmss);
hh=(hhmmss[1]&&hhmmss[2]); //pegar hh
mm=(hhmmss[3]&&hhmmss[4]); //pegar mm
ss=(hhmmss[5]&&hhmmss[6]); //pegar ss
    if(0<=hh<=23 && 0<=mm<=59 && 0<=ss<=59);
        hh1=hh*fh; //considerar o proximo inteiro
        mm1=mm*fm; //considerar o proximo inteiro
        ss1=ss*fs; //considerar o proximo inteiro
        printf("a hora convertida para o relogio do sistema decimal é" "%d",hh1 && mm1 && ss1);
        else(
   printf("você digitou uma hora inválida");
)
}

 

 

 

 

20210421_174408.jpg

Link para o comentário
Compartilhar em outros sites

3 horas atrás, Thiago Colombiano disse:

Um dia foi dividido em 10 horas,  de 100 minutos cada  em 100s e 1m com 100s

 

Não encontrei isso no seu programa, mas está no enunciado.

 

scanf("%c", hhmmss);
hh=(hhmmss[1]&&hhmmss[2]); //pegar hh
mm=(hhmmss[3]&&hhmmss[4]); //pegar mm
ss=(hhmmss[5]&&hhmmss[6]); //pegar ss
    if(0<=hh<=23 && 0<=mm<=59 && 0<=ss<=59);

 

Isso eu encontrei no seu programa mas não vejo no enunciado

 

fh=0,42;
fm=0,16;
fs=0,88;

 

Que são esses valores?

 

Esse é o valor que importa: 

 

um exemplo, 14 h 31m e 51s( do nosso horário convencional) são 6h 5m 45s

 

É uma conversão simples (Devia talvez ter postado o enunciado já de início)

 

Sobre os números:

 

14:31:51 equivale a 52.311s 14*3600 + 31*60 + 51

 

O dia tem 24h = 24*3600 = 86400s

 

Então nesse caso se foram 5241/86400 do dia ou mais ou menos 0.60545 do dia.

 

E não é que esse é o resultado do relógio revolucionário? 06:54:05 já que o dia nesse caso tem 10 horas de 100 minutos de 100 segundos?

 

Apenas ajuste o formato.

O enunciado sugere que deve ler um único número, um inteiro sem sinal como 143151

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@arfneto

Isso eu encontrei no seu programa mas não vejo no enunciado

 

fh=0,42; fm=0,16; fs=0,88;

 

Que são esses valores?

 

Eu tinha convertido parte por parte do exemplo tentando achar a razão. Eu converti o valor da hora, minuto e segundo direto, mas já entendi que estava errado. 

 

Mas se eu fizer usando char vai tá errado? Porque fala que a entrada vai ser um único número,  se eu usar char e logo depois separar os valores vai tá errado?

Link para o comentário
Compartilhar em outros sites

53 minutos atrás, Thiago Colombiano disse:

Mas se eu fizer usando char vai tá errado? Porque fala que a entrada vai ser um único número,  se eu usar char e logo depois separar os valores vai tá errado

 

Acho que sim. A ideia é ler um int tipo 230000 para indicar 23h e converter para o dai de 10 horas á do relógio alternativo. Entendeu a conta que eu mostrei?

 

Link para o comentário
Compartilhar em outros sites

39 minutos atrás, Thiago Colombiano disse:

@arfneto Entendi. Mas esse relógio vai imorimir 0 a 10 ou 0 a 9? 23 horas iria imprimir o quê? 

 

??? 

Vai usar a conversão que você descreveu...

 

Se entrar 143151 vai imprimir o que? 06:05:45 seria bonitinho e é o que está no enunciado.

 

Quanto é meio dia? doze horas? Deve ser 05:00:00 já que o dia lá tem ... 10 horas.

 

E só isso.

 

Se o cara entrar com 23:59:59 deve dar quase 10....

 

Imagine um programa que fizesse a conversão:

  • você digita a hora antiga e ele mostra a hora nova, no relógio de 10 horas.
  • Um décimo de dia são 2.4 horas = 2:24 no relógio normal. No relógio novo seria uma hora certinho, já que o dia tem 10 horas
  • meio dia daria 5 horas
  • zero dá zero
  • 143151 deve dar 06:04:45 porque está no enunciado
  • você digita  só o nome do programa e ele mostra o resultado para o exemplo do enunciado :) pra economizar

 

Algo assim, se o programa se chamasse hms:
 

clube>  gcc -o hms -O3 -std=c17 -Wall hms.c
clube>  ./hms 0
        Numero considerado: 0
            Hora corrigida: 00:00:00
clube>  ./hms 120000
        Numero considerado: 120000
            Hora corrigida: 05:00:00
clube>  ./hms 22400
        Numero considerado: 22400
            Hora corrigida: 01:00:00
clube>  ./hms 235959
        Numero considerado: 235959
            Hora corrigida: 09:99:98
clube>  ./hms 240000
        Numero considerado: 240000
            Hora corrigida: 10:00:00
clube>  ./hms 14000
        Numero considerado: 14000
            Hora corrigida: 00:69:44
clube>  ./hms 
        Numero considerado: 143151
            Hora corrigida: 06:05:45
clube>  

 

 

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Em 21/04/2021 às 15:45, arfneto disse:

pode usar um loop. separe as horas ate ficar negativo, depois os minutos ate ficar negativo. O que restar serao os segundos

 

Em 21/04/2021 às 18:08, Thiago Colombiano disse:

Eu tinha convertido parte por parte do exemplo tentando achar a razão. Eu converti o valor da hora, minuto e segundo direto, mas já entendi que estava errado. 

 

Mas se eu fizer usando char vai tá errado? Porque fala que a entrada vai ser um único número,  se eu usar char e logo depois separar os valores vai tá errado?

 

A solução tradicional é usar divisão e módulo, no modo mostrado por @devair1010 no #3.

 

Algo assim num exemplo compacto e usando seu exemplo

 

Numero considerado (int): 143151
Valor convertido (em 3 int): '14:31:51'

 

como nesse programa C

 

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int valor =143151;
    printf("Numero considerado (int): %d\n", valor );

    int segundos = (valor%100) %60;
    valor /= 100;

    int minutos = (valor%100) %60;
    valor /= 100;
    
    int horas = (valor%100) %24;
    printf("Valor convertido (em 3 int): '%02d:%02d:%02d'\n", horas, minutos, segundos );

    return 0;
}

 

Como divisão e módulo são operações muito mais lentas e caras que somar e subtrair int em geral é MUITO mais rápido usar tabelas e somas e subtrações e escrever algo como
 

    // converte em segundos no relogio padrão
    int indice = 0; // indice para o relogio de 24H
    int fator[3] =   { 10000, 100, 1}; // tabelas
    int parcela[3] = { 3600,   60, 1 }; // tabelas
    printf("\tNumero considerado: %d\n", valor );
    int segundos = 0;
    do
    {
        valor = valor - fator[indice];
        if ( valor >= 0 )
            segundos += parcela[indice];
        else
            valor = valor + fator[indice++];
    }   while ( valor > 0 ); // while()

    // converte em segundos no relogio novo e mostra
    valor = 1000000 + segundos / (24.*60*60) * 100 * 1000; // 7 digitos

 

Isso colocaria em valor o número de segundos no relógio novo.

 

  • A última multiplicação é a conversão da hora em si, e deve ser feita em ponto flutuante.
  • A última divisão poderia ser feita com subtrações claro :) O total de segundos é dividido por 86400 e multiplicado por 100000, o total de segundos antes e depois. O resultado é formatado e mostrado.
  • mudando as tabelas fator e parcela e considerando os segundos por dia no relógio antigo e no novo um programa como o exemplo abaixo funcionaria para qualquer "relógio"

O exemplo completo em C, sem módulo ou div para calcular os segundos
 

Spoiler

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
    // leitura
    int valor = 0;

    const int numero_exemplo = 143151; // o teste
    if ( argc < 2) 
        valor = numero_exemplo;
    else
        valor = atoi(argv[1]);
    if ( valor > 240000 ) valor = 240000; // se o cara achar que ninguem pensou nisso
    if ( valor < 0 ) valor = 0; // se o cara vier com ideias negativas...
    // no fundo devia testar validade de horas minutos e segundos

    // converte em segundos no relogio padrão
    int indice = 0; // indice para o relogio de 24H
    const int fator[3] =   { 10000, 100, 1}; // tabelas
    const int parcela[3] = { 3600,   60, 1 }; // tabelas
    const int segundos_dia_antes = 24 * 3600; // 24h de 3.600s
    const int segundos_dia_depois = 10 * 10000; // 10h de 10.000s
    printf("\tNumero considerado: %d\n", valor );
    int segundos = 0;
    do
    {
        valor = valor - fator[indice];
        if ( valor >= 0 )
            segundos += parcela[indice];
        else
            valor = valor + fator[indice++];
    }   while ( valor > 0 ); // while()

    // converte em segundos no relogio novo e mostra
    valor = 1000000 + segundos / ((double)segundos_dia_antes / segundos_dia_depois); // 7 digitos
    char hora_corrigida[50];
    sprintf( hora_corrigida, "%07d", valor );
    printf( "\t    Hora corrigida: %c%c:%c%c:%c%c\n", 
         hora_corrigida[1], hora_corrigida[2],
         hora_corrigida[3], hora_corrigida[4],
         hora_corrigida[5], hora_corrigida[6]);
    return 0;
}

 

 

O programa é simples. Se o programa fosse hms.exe

  • se o usuário teclar só hms <ENTER> o programa assuma o valor do enunciado, 14:31:51.
  • para outros valores a entrada é um int da forma hhmmss. Na linha de comando porque é muito chato ficar esperando o programa perguntar o que você já sabe que ele quer saber :) 
  • exemplos simples seriam
    • 240000, 24 horas que devem gerar 10h no relógio novo
    • 10% de um dia seriam 2:24:00 e deve gerar uma hora no relógio novo
    • 0 gera 0 
  • valores inválidos de hora não são consistidos

Alguns exemplos

 

clube>  gcc -o hms -Wall -O3 -std=c17 hms.c
clube>  ./hms
        Numero considerado: 143151
            Hora corrigida: 06:05:45
clube>  ./hms 0
        Numero considerado: 0
            Hora corrigida: 00:00:00
clube>  ./hms 240000
        Numero considerado: 240000
            Hora corrigida: 10:00:00
clube>  ./hms 22400
        Numero considerado: 22400
            Hora corrigida: 01:00:00

 

 

Link para o comentário
Compartilhar em outros sites

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!