Jump to content

Ciclos em C


Guest João Amorim

Recommended Posts

Guest João Amorim

Boa tarde a todos. Sou novo neste chamado "mundo da programação" , tal como neste site, e estou com uma dúvida que, com a ajuda de quem saiba, espero resolver :).

O problema é o seguinte:
Pretende-se desenvolver um programa para ler valores de tempo no formato “h(hora) m(minuto) s(segundo)”, devolvendo o número de segundos associado ao tempo introduzido.
No entanto, o utilizador deve poder omitir campos (e.g. introduzir só “h23”). Para terminar a leitura o utilizador pode introduzir um carácter diferente de ‘h’, ‘m’ ou ‘s’.
Pretende-se também que o programa valide os valores introduzidos, não deixando introduzir valores de minutos ou segundos superiores a 59, nem introduzir campos repetidos (só se pode introduzir 0 ou 1 campo de hora; 0 ou 1 campo de minuto; 0 ou 1 campo de segundo). Repare que:

• São necessárias variáveis para guardar cada componente do tempo;
• Só há leitura da parte numérica de uma componente do tempo se o carácter for válido;
• Dependendo do carácter lido, o valor numérico contribui para o valor final de tempo com um peso diferente;
• O ciclo de leitura de componentes do tempo não tem um número de componentes fixo, nem uma ordem fixa.

----------------------------

Ora, eu já fiz uma boa parte do código. Aqui vai ele:

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

int main(){

short int horas=0, minutos=0, segundos=0;
long int Total_Segundos;

printf("EXERCICIO FINAL - CONVERTER TEMPO EM SEGUNDOS\n\n");
printf("Introduza o tempo no formato h(hora) m(minuto) s(segundo): ");

scanf("h%hd m%hd s%hd", &horas, &minutos, &segundos);

if(minutos>59 && segundos>59){
    printf("ERRO! Numero de minutos e segundos invalidos!");
    exit(1);
}
else{
    if(minutos>59 || segundos>59){
        if(minutos>59){
            printf("ERRO! Numero de minutos invalidos!");
            exit(1);
        }
        else{
            printf("ERRO! Numero de segundos invalidos!");
            exit(1);
        }
    }
}

Total_Segundos=(horas*3600)+(minutos*60)+(segundos);
printf("h%hd m%hd s%hd = %ld", horas, minutos, segundos, Total_Segundos);

return 0;
}

No entanto, no que toca ao seguinte ponto: "...nem introduzir campos repetidos (só se pode introduzir 0 ou 1 campo de hora; 0 ou 1 campo de minuto; 0 ou 1 campo de segundo).". Não sei como resolver esta situação. Agradeço qualquer tipo de ajuda e, mesmo não indicando a resposta direta, aceito qualquer tipo de ajuda que me ajude a chegar ao resultado. Obrigado desde já pela atenção!

Link to post
Share on other sites

Não podes ler todos os campos duma só vez com a função 'scanf'; nota que o enunciado diz que os campos podem surgir, eventualmente, em qualquer ordem, o que a função não permite pois ao primeiro caracter inválido à luz do formato indicado a função termina. Assim introduzindo o texto 'h12 s10' a função apenas retornaria preenchida a variável correspondente às horas. E com o texto 's30 h10 m20' nenhumes valores seriam retornados nas variáveis dos campos.

Uma implementação possível passa por ler o texto para um vector de caracteres e depois usar a função 'sscanf' para procurar cada campo separadamente. Mete um valor garantidamente inválido nas variáveis antes de cada execução da função e limita o número de caracteres aceites para cada campo (2 caracteres máximo e um valor de 500 inicializado na variável).

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.