Ir ao conteúdo

Posts recomendados

Postado

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?

Postado
1 hora atrás, Thiago Colombiano disse:

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

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

  • Curtir 2
Postado

@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
Postado

@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");
)
}

 

 

 

Postado

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

Postado

@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

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

@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?

Postado
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?

 

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

 

 

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