Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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?

Editado por AnsiC
Correção
  • 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






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

×