Jump to content

Programa para converter horas em minutos


claudiaferreira
 Share

Go to solution Solved by Rui Carlos,

Recommended Posts

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

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 

  • Thanks 1

Feito é melhor que perfeito

Link to comment
Share on other sites

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

  • Solution

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 scanfscanf("%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.

  • Vote 2
Link to comment
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
 Share

×
×
  • 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.