Ir ao conteúdo
  • Cadastre-se
Batata Defumada

C RESOLVIDO Problema ao utilizar função modf em C

Recommended Posts

Estou fazendo um programinha no qual criei duas funções, não passo parâmetros e nem retorno nenhum valor, bem simples. Ontem eu li sobre o modf então pensei em testar essa função, então, basicamente na funçao "funcao_decompoe_numero" eu quero decompor um número com casas decimais passando seu valor inteiro pra uma variável e seu valor decimal pra outra variável. Quando eu já atribuo um valor à variável "valor", por exemplo, 1.8, o programa funciona normalmente, mas quando eu quero que o usuário possa inserir o valor que ele quiser não dá certo. Quando eu uso double pra variável valor e durante a execução do programa eu insiro qualquer número com casas decimais o programa buga e entra em um loop infinito. Se eu uso um vetor de caracteres pra armazenar esse número, nem executa. Ah e se eu usar float não dá certo também, parece que o modf só aceita double.

 

#include <stdio.h>
#include <locale.h>
#include <math.h>

void funcao_decompoe_numero();
void funcao_cosseno();

int main () {
		setlocale(LC_ALL,"");		
		int op;
		printf("\n\t\t\tOlá usuário, por favor, escolha uma das opções a seguir:\t");
		do {
		
		printf("\n\n(1) Decompor um número");
		printf("\n(2) Determinar cosseno");
		printf("\n(3) Sair do programa");
		scanf("%d", &op);
		
		if (op == 1)
			funcao_decompoe_numero();
			
		if (op == 2)
			funcao_cosseno();
			
		if (op == 3)
			printf("Finalizando programa...");
	
		}while (op != 3);
		
}
		
void funcao_decompoe_numero() {
	
	double valor, i, j;
	
	printf("Insira o valor que deseja decompor: \t");
	scanf("%f", &valor);
	
	i = modf(valor, &j);
	
	printf("\nParte inteira = %f/ Parte fracionária = %f", j, i);
	
	if (i >= 0.6)
		printf("\n%.2f", ceil(i));
	
	else
		printf("\n%.2f", floor(i));
}
	
	
	void funcao_cosseno() {
	
	float valorpi = 3.1415;
	int valoremgraus;
	float cosseno;
	
	printf("Uusário, insira um valor em graus para que seja determinado seu cosseno: \t");
	scanf("%d", &valoremgraus);
	
	cosseno = cos ((valoremgraus * valorpi) / 180);
	printf("%.4f", cosseno);
	
}
	

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tinha alguns erros lógicos, todos detectáveis pelo compilador, porém o erro mais importante é não use ponto (.) e sim vírgula  para separar os decimais ou cairá em loop-infinito. Com algumas correções seu código fica + ou - assim:

#include  <stdio.h>  /**< inclui as funções padrões de entrada e saída. */ 
#include <stdlib.h>  /**< inlcui as funções manipuladoras de memória.   */
#include <string.h>  /**< inclui as funções manipuladoras de strings.   */
#include <locale.h>  /**< inclui as funções padrões de localidade.      */
#include   <math.h>  /**< inclui as funções padrões da matemática.      */


void funcao_decompoe_numero();
void funcao_cosseno();

int main(int argc, char **argv){
    int op;
    setlocale(LC_ALL,"");		
    printf ("\n\t\t\t");
    printf ("Olá usuário, por favor, escolha uma das opções a seguir:\t");
    
    do {
          op =  0;
          printf ("\n");
          printf("(1) Decompor um número\n");
          printf("(2) Determinar cosseno\n");
          printf("(3) Sair do programa\n");
          printf ("( )\b\b");
          scanf("%d", &op);
    
          if (op  ==  1)
                funcao_decompoe_numero();
        
          if (op  ==  2)
                funcao_cosseno();
        
          if (op  ==  3)
                printf("Finalizando programa...");
          
          } while (op  !=  3);
		
    return  0; }
		

void funcao_decompoe_numero() {
    double valor;
    printf ("Insira o valor que deseja decompor:\t0,0000\b\b\b\b\b\b");
    scanf ("%lf", &valor);
	
    double i, f;
    f =  modf (valor, &i);
	
    printf ("\n");
    printf("Parte inteira = %lf/ Parte fracionária = %lf\n", i, f);
	
    if (i  >=  0.6)
          printf ("Arrendondar para cima: %.2f\n", ceil(f));
	
    else
          printf ("Arredondar para baixo: %.2f\n", floor(f));
    
    return  ; }
	
	
void funcao_cosseno() {
    float valorpi = 3.1415;
	
    printf("Usuário, insira um valor em graus para que seja determinado seu");
    printf("cosseno: \t");
	
    int valoremgraus;
    scanf("%d", &valoremgraus);
	
    float cosseno;
    cosseno =  cos ((valoremgraus * valorpi) / 180);
    printf("%.4f", cosseno);
	
    return  ; }

Mais alguma pergunta?

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema está nos especificadores de tipo usados nas funções scanf() e printf() no seu programa, pois você usou %f que é o especificador para o tipo float, mas o especificador para double é %lf, logo está tentando guardar o tipo errado de dado na variável.

 

E sim, a função modf() trabalha com double apenas. Para float deve usar a função modff(), e para long double usa-se a função modfl().

 

https://en.cppreference.com/w/c/numeric/math/modf

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC  Muito obrigado. A IDE que eu tô utilizando bugou e não mostra os erros do código quando não compila, acho que vou ter que reinstalar.

 

@isrnick  Eu não sabia que tinha um especificador diferente pra double e nem sobre essas "variações" da modf, no livro que eu li só tinha "modf" mesmo e nem especificou o tipo de dados que eu poderia usar nessa função. Obrigado pela ajuda também.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
4 minutos atrás, Batata Defumada disse:

Muito obrigado. A IDE que eu tô utilizando bugou e não mostra os erros do código quando não compila, acho que vou ter que reinstalar.

Tudo bem. Experimento o código corrigido por mim, verificando se haverá erro. Caso haja erros me conte quais foram.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC  Deu tudo certo, exceto o quando tinha que arredondar pra baixo, mas só precisava trocar a variável que tava no if, ainda tava o "i", que era a parte inteira, troquei pelo "f" e deu certinho.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×