claudiaferreira Posted July 28 Report Share Posted July 28 Boa tarde, Preciso da vossa ajuda se faz favor com um exercício que estou a tentar fazer de um livro, mas infelizmente não tem solução completa e já tentei de diferentes formas e não consigo perceber como colocar o programa a funcionar. O enunciado é pedido o seguinte: Citação Faça um programa que receba uma hora formada por hora e minutos (um número real), calcule e mostre a hora digitada apenas em minutos. Lembre-se de que: ■ para quatro e meia, deve-se digitar 4.30; ■ os minutos vão de 0 a 59. Através disto fiz o seguinte código: #include<stdio.h> #include<stdlib.h> #include<locale.h> #include<string.h> #include<ctype.h> #include<math.h> int main(){ setlocale(LC_ALL, "Portuguese"); float hora,minutos; printf("Indique uma hora com minutos se parado por virgula: "); scanf("%f",&hora); minutos=(int)hora*60; printf("A hora indicada em minutos é %f.\n",minutos+(hora-(int)hora)); system("pause"); return 0; } No entanto, não estava a funcionar porque a parte fracionária não adicionava á parte inteira conforme pretendido e verifiquei a solução e indica o seguinte: Citação SOLUÇÃO: ALGORITMO DECLARE hora, h, m, conversao NUMÉRICO LEIA hora h pegar a parte inteira da variável hora m hora − h conversao (h * 60) + (m * 100) ESCREVA conversao FIM_ALGORITMO. Mas infelizmente não estou a conseguir perceber a razão da multiplicação dos minutos com 100 e tentei usar a função "modf", mas penso que não está a funcionar. #include<stdio.h> #include<stdlib.h> #include<locale.h> #include<string.h> #include<ctype.h> #include<math.h> int main(){ setlocale(LC_ALL, "Portuguese"); float hora,z, y; int minutos,conversao; printf("Indique uma hora com minutos se parado por virgula: "); scanf("%f",&hora); z=modf(hora,&y); minutos=hora-y; conversao=(y*60.0)+(minutos*100.0); printf("A hora indicada em minutos é %d.\n",conversao); system("pause"); return 0; } Será que me conseguem ajudar com este exercício? Obrigada. Link to comment Share on other sites More sharing options...
Ivo Vicente Posted July 28 Report Share Posted July 28 A multiplicação por 100 existe, porque ao obteres a parte decimal do número ficas com por exemplo 4,35 > 0,35*100=35min Depois no teu último exemplo estás a multiplicar minutos*100 quando o resultado do modf está a ser atribuído a variável z. Ou seja deves trocar o cálculo para a variável z*100 Espero ter sido útil 1 Report Feito é melhor que perfeito Link to comment Share on other sites More sharing options...
claudiaferreira Posted July 30 Author Report Share Posted July 30 Boa tarde Ivo Vicente, Desde já agradeço a sua resposta e a dica indicada. Assim já entendi o programa e ficou a funcionar corretamente com a exceção quando coloco 2,30 no campo hora e aparece como resultado 149minutos, quando deveria ser 150minutos. Nos outros testes que fiz, o resultado bate certo, exceto neste caso. Consegue ajudar-me com mais esta questão, se faz favor? #include<stdio.h> #include<stdlib.h> #include<locale.h> #include<string.h> #include<ctype.h> #include<math.h> int main(){ setlocale(LC_ALL, "Portuguese"); double hora,z, y; int conversao; printf("Indique uma hora com minutos se parado por virgula: "); scanf("%lf",&hora); z=modf(hora,&y); conversao=(y*60.0)+(z*100.0); printf("A hora indicada é %d minutos.\n",conversao); system("pause"); return 0; } Spoiler Indique uma hora com minutos se parado por virgula: 2,30 A hora indicada é 149 minutos. Press any key to continue . . . Muito Obrigada. Link to comment Share on other sites More sharing options...
Solution Rui Carlos Posted July 31 Solution Report Share Posted July 31 Usar floating point para implementar algoritmos sobre inteiros tem tudo para dar asneira... O problema está na conversão de double para int, quando fazes conversao=(y*60.0)+(z*100.0), que trunca a parte decimal, e que devido aos errors de aproximação típicos de floating points, faz com que por vezes obtenhas o valor anterior (e.g. 149 em vez de 150). Uma solução passa por usar a função lrint em vez de um simples casting implícito. Também podias ler directamente inteiros no scanf: scanf("%d.%d",&ihora, &imin). Isto evitava erros de arredondamento, e outras contas complexas. A única questão aqui é o que fazer com valores como 1.1. Na tua solução isto corresponde a 1.10, e com o scanf é equivalente a 1.01. Lendo %d.%1d%1d permitia controlar melhor valores inválidos. 2 Report Rui Carlos Gonçalves 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