Ir ao conteúdo

C Problema ao utilizar função modf em C


Ir à solução Resolvido por Ansi C,

Posts recomendados

  • Moderador
Postado

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);
	
}
	

 

  • Solução
Postado

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
Postado

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
  • Moderador
Postado

@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
Postado
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

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 comunidades 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

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!