Guest João Amorim Posted October 13, 2019 at 03:06 PM Report Share #616352 Posted October 13, 2019 at 03:06 PM 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 comment Share on other sites More sharing options...
bsccara Posted October 16, 2019 at 09:52 PM Report Share #616364 Posted October 16, 2019 at 09:52 PM 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 comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now