Ir ao conteúdo
  • Cadastre-se
Kaio Ribeiro Sanchez

C Colocar tempo em horas, minutos e segundos

Recommended Posts

Galera, tenho que colocar um código pra transformar horas, minutos e segundos em uma quantidade total de segundos, exemplos entrada:

5 12 1

Saída

O TEMPO EM SEGUNDOS E = 18721

Porém, quero fazer isso com função e sou iniciante com funções, sabem me dizer o que está dando errado com esse código ?

 

#include <stdio.h>
#include <math.h>
void converteTempo(int h, int m, int s){
    int tempo=h*3600;
    tempo+=m*60;
    tempo+=s;
    printf("O TEMPO EM SEGUNDOS E = %d\n", tempo);
}
int main()
{
    int h, m, s;
    void converteTempo(void);
    scanf("%d %d %d", &h, &m, &s);
    converteTempo();
    return 0;
}


 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem que passar os argumentos na chamada da função que no caso está em main.

 

Retire void converteTempo(void);. Use o que está abaixo de scanf.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
#include <stdio.h>
#include <math.h>

void converteTempo(void); //Definição do protótipo da função tem que ficar fora da MAIN e de outras funções, de preferência no começo do código

void converteTempo(int h, int m, int s)
{
    int tempo=h*3600;
    tempo+=m*60;
    tempo+=s;
    printf("O TEMPO EM SEGUNDOS E = %d\n", tempo);
}

int main()
{
    int h, m, s;

    scanf("%d %d %d", &h, &m, &s);
    converteTempo(h, m, s); // A função estava sem argumentos
    return 0;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@CiroboyBR Olá. Apenas um ponto que seria importante frisar: O protótipo de função poderia se assim:

void converteTempo(int, int, int); // protótipo da função, ela recebe três parâmetros

Desculpa ter que falar assim, mas creio que é preciso para um melhor aprendizado do autor do tópico :thumbsup:

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

Vou tentar complementar. Vamos lá:

 

 

 

1#

Sobre:

Em 25/09/2018 às 22:42, CiroboyBR disse:

void converteTempo(void);

 

Aqui no Dev-Cpp 5.11 TDM-GCC 4.9.2 com esse protótipo não funcionou. Mas com esse sim.

 

16 horas atrás, giu_d disse:

void converteTempo(int, int, int);

 

 

 

2#
Independente das formas dos protótipos que funcionam nos compiladores, se a função está em cima, não precisa do protótipo, já que o compilador já conhecerá a função. Poderia ficar com algo assim:

#include <stdio.h>
#include <math.h>
void converteTempo(int h, int m, int s) //aqui o programa já terá aprendido essa função
{
    int tempo=h*3600;
    tempo+=m*60;
    tempo+=s;
    printf("O TEMPO EM SEGUNDOS E = %d\n", tempo);
}

int main()
{
    int h, m, s;

    scanf("%d %d %d", &h, &m, &s);
    converteTempo(h, m, s); //vai utilizar a função que já aprendeu lá em cima
}
   

 

 

 

3#

O protótipo se faria necessário se a função estivesse abaixo da função que está lhe invocando, pois o compilador aprende de cima para baixo. Logo, se fazendo necessário algo para indicar que a função existe, ex.:

#include <stdio.h>
#include <math.h>

int main()
{
    int h, m, s;

    scanf("%d %d %d", &h, &m, &s);
    void converteTempo(int h, int m, int s); //o protótipo deve fica em qualquer lugar ANTES de ser invocado
    converteTempo(h, m, s); //o protótipo acima fará a função ser reconhecida
}

void converteTempo(int h, int m, int s) //como está em baixo, a função acima não "enxerga" essa função, daí
                                        //necessita do protópito 
{
    int tempo=h*3600;
    tempo+=m*60;
    tempo+=s;
    printf("O TEMPO EM SEGUNDOS E = %d\n", tempo);
}

ou poderia ficar assim:

    void converteTempo(int, int, int);
    converteTempo(h, s, m); // A função estava sem argumentos

Ou seja, a questão central aqui é que o protótipo só seria necessário se a função, que precisa da função correspondente, ainda não conheça ela.

 

 

Caso existam mais funções, que estão acima da função que precisa, seria necessário declarar o protótipo em cada uma delas!!! (lembrando que se  a função que precisa estiver abaixo, não precisará do protótipo).

 

OU

 

Declararia o protótipo FORA das funções, mas em algum lugar que está acima das funções que vão precisar.

 

RESUMINDO:

Uma função só poderá utilizar se:

  • a função estiver de algum modo antes da função que vai usar;
  • se um protótipo for declarado antes. Sendo que o protótipo poderá ser declara dentro da própria função que vai invocar a outra função (escopo local) E/OU ser declarado fora de funções (solto no código) antes da função que for usar (escopo global).

 

 

4#

Creio que a nomenclatura dessa função converteTempo() não está muito adequada, pois a principal utilidade dela não está na conversão, mas sim em exibir o tempo em segundos. Nesse sentido, uma nomenclatura mais justa seria exibeTempo(), ou seja, converter o tempo em segundos está só como uma etapa para exibir o tempo... não como o foco da função.

 

 

 

5#

Um exemplo que o "termo" converter me pareceria mais coerente, seria assim:

#include <stdio.h>
#include <math.h>

int main()
{
    int h, m, s;

    scanf("%d %d %d", &h, &m, &s);
    int converteTempo(int, int, int);
    printf("O TEMPO EM SEGUNDOS E = %d\n",converteTempo(h,m,s));
}

int converteTempo(int h, int m, int s)
{
    int tempo=h*3600;
    tempo+=m*60;
    tempo+=s;
    return tempo;
}

Ou seja, nesse caso, de fato a funcionalidade principal da função é converter o tempo. Esse tempo convertido e retornado pela própria função. E a exibição sendo feita em outro local.

 

 

***

 

O que acham em relação a cada item?

 

No aguardo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

É, fiz o comentário acima e apenas foquei na parte do protótipo da função sem considerar a lógica do código

Gostei da ideia dada pelo @Simon Viegas de definir a função com o tipo de retorno como int

Sobre protótipo de funções, o que eu poderia frisar é que bons programadores sempre declaram os protótipos das funções

Dessa forma, caso mais programadores trabalhem no mesmo código, já vão ter todas as características da função, como tipo de retorno, nome, quantidade de parâmetros e tipo de cada parâmetro

Seguindo a lógica apresentada acima, daria para deixar o código dessa forma:

#include <stdio.h>

int converte_tempo(int, int, int);

int main()
{
    int hora, min, seg, total_seg;

    printf("Digite um horario no formato HH:MM:SS -> ");
    scanf("%d%*c%d%*c%d", &hora, &min, &seg);

    total_seg = converte_tempo(hora, min, seg);

    printf("O TEMPO EM SEGUNDOS E = %d\n", total_seg);
}

int converte_tempo(int hora, int minuto, int segundo)
{
    int tempo = hora * 3600;
    tempo += minuto * 60;
    tempo += segundo;

    return tempo;
}

Obs: do modo como está o código, um horário deve ser digitado como é solicitado. Ex: 02:35:40

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sobre:

1 hora atrás, giu_d disse:

    printf("Digite um horario no formato HH:MM:SS -> ");
    scanf("%d%*c%d%*c%d", &hora, &min, &seg);

 

Poderia explicar como isso funciona? suponho que o c é para de alguma forma "tirar os ':'". Esse "*" é para não precisar de uma variável?

 

Pelo que testei aqui, uma forma menos elegante seria algo assim:

    printf("Digite um horario no formato HH:MM:SS -> ");
    scanf("%d%c%d%c%d", &hora,&str,&min,&str,&seg);

Correto?

 

 

 

Sobre:

1 hora atrás, giu_d disse:

Ex: 02:35:40

Não precisa desse 0 antes. E pelo que eu vi, poderá escreve qualquer coisa seja "número+caractere+número+caractere+número". Inclusive com espaços espaços ou ENTER. Ex.:
 

Digite um horario no formato HH:MM:SS -> 1
1
1
O TEMPO EM SEGUNDOS E = 3661

ou

Digite um horario no formato HH:MM:SS -> 1 1 1
O TEMPO EM SEGUNDOS E = 3661

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Simon Viegas

7 horas atrás, Simon Viegas disse:

Poderia explicar como isso funciona? suponho que o c é para de alguma forma "tirar os ':'". Esse "*" é para não precisar de uma variável?

Olá. Seria algo assim mesmo 

Quando eu faço %c é para ler um caractere e armazenar em uma variável, mas quando faço %*c é para ler um caractere (no caso os dois pontos ':' ou qualquer outro caractere digitado) e descartar 

Simplesmente lê um caractere e descarta o mesmo :thumbsup:

Um uso muito bom desse recurso em C é para limpar a sujeira no buffer (stdin) que o Sr. chama de "bug do scanf",  com uma função como essa:

void limpa_linha() {
    scanf("%*[^\n]");
    scanf("%*c");
}

No caso dessa função, a primeira diretiva %*[^\n] lê quaisquer valor ordinário (sujeira no buffer) e descarta esses valores, exceto o '\n' (quebra de linha)

No segundo scanf tem a diretiva %*c, que é para ler o caractere '\n' (quebra de linha) e descarta o mesmo também, limpando de maneira adequada o stdin e evitando que as seguintes leituras do teclado de um código sejam afetadas com qualquer sujeira no buffer

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×