claudiaferreira Posted July 28, 2022 at 07:40 PM Report Share #626608 Posted July 28, 2022 at 07:40 PM 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, 2022 at 09:33 PM Report Share #626609 Posted July 28, 2022 at 09:33 PM 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, 2022 at 08:12 PM Author Report Share #626622 Posted July 30, 2022 at 08:12 PM 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, 2022 at 12:21 PM Solution Report Share #626623 Posted July 31, 2022 at 12:21 PM 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