Ir para conteúdo
Fórum Script Brasil
  • 0

Não consigo identificar o erro


fernandadmf

Pergunta

Olá!

Estou tentando fazer um código para um trabalho de cálculo numérico. O programa tem que receber o intervalo inicial (a, B) e o número de iterações (i) e mostrar as iterações pelo metódo da Bisseção para achar as raizes da equação: f(x)=(x-4)^1/2+x-9, cuja raiz está entre o intervalo 7 e 8.

O código que eu montei foi esse:

    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <iostream>

    main()
    {        int a,b,i,k,c;
             float x,fx,fa;
     c=0;
     while (c!=1) {
                 printf("Digite o primeiro numero do intervalo inicial:");
            scanf("%d",&a);
                    printf("\n");
            printf("Digite o último numero do intervalo inicial:");
            scanf("%d",&b);
                    printf("\n");
                 
            if (a>7||b<8){
            printf("Erro, a raiz não se encontra nesse intervalo. Favor digitar outro.");     
                               printf("\n");
            } else {
                c=1;
            }
        }

            printf("Digite o numero de iteracoes:");
            scanf("%d",&i);
                    printf("\n");
               
    for (k=1; k<=i; k++) {
    x=((a+b)/2);
    fx=(sqrt(x-4))+x-9;
    fa=(sqrt(a-4))+a-9;
      
    if(fx*fa<0){
    a=x;}
    else {
    b=x;}

    printf("x%f=%f",&k,&x );
                   printf("\n");

    }
    }
    

O que está acontecendo: Não importa o valor que eu coloque, o resultado sai sempre o mesmo e errado. Suspeito que algo esteja errado na sintaxe e os números digitados não estão sendo armazenados corretamente. Algo pode estar errado nas operações em si também.

o log de erro do compiler foi esse:

Compiler: TDM-GCC 4.7.1 64-bit
Executing  g++.exe...
g++.exe "C:\Users\Fernanda\Desktop\Untitled1.cpp" -o "nul"   -I"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include"  -L"C:\Program Files (x86)\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib" -static-libgcc
nul.exe: final close failed: File truncated
collect2.exe: error: ld returned 1 exit status

Execution terminated

Agradeço qualquer ajuda.

Editado por fernandadmf
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Acho que falha por tentar imprimir as direções das variáveis como flotante nessa linha: printf("x%f=%f",&k,&x );

com o operador '&' adiante de uma variável, estamos extraindo o local de memoria onde se encontra a variável e não o valor que guarda, essa direção é um numero decimal que se usa sim ou sim o modificador %d já que se trata de uma direção de memoria.

Por outro lado si o que queremos é imprimir o valor de k e x não ponha '&' adiante de k nem de x. Recorde... printf("x%d=%d",&k,&x ); imprimem o local(direção), no qual se encontram as variáveis k e x, más devemos usar sempre %d ou vai dar erro. Para imprimir o valor de k e x como flotantes printf("x%f=%f",k,x ); faça sem '&' e com isso já podemos ver o resultado na tela.

Esse erro nós entenderemos melhor quando chegar no tema de ponteiros.

Para scanf continuar pondo '&' adiante das variáveis para ler tipos de dados básicos, com isso queremos dizer que ao ler um char por exemplo, esse char se guarde no lugar(direção) onde se encontra a nossa variavel na memoria.

imagine que somos um carteiro, que entregamos pacotes :lol:, em uma rua muito comprida as casas esta numeradas. quando eu vejo '&' adiante de uma variavel isso se refere ao numero da casa que pertence o pacote, já o pacote não leva esse '&' vai sem, então imaginamos que scanf se chama entregar e não scanf, entregar("%c", &pacote) é como dizer, entregar pacote na casa numero X onde seja a residencia do pacote, esse x não devemos saber só devemos saber cuando nos referimos ao pacote 'pacote', ou a residencia do pacote '&pacote'. Isso é o que acontece no caso do scanf entregamos o pacote na casinha de memoria onde ele pertence, no caso do printf, podemos tanto querer saber onde esta o pacote printf("%c", &pacote), como podemos querer saber que tem dentro de esse pacote printf("%c", pacote) que é o que guarda.

E com isso más ou menos já da para aguentar um pouco melhor até aprender o tema dos ponteiros. Tenha simplesmente claro que nós estamos lidando com a memoria em todo momento, a memoria ela é física por isso trabalhamos com direçoes, porque dependendo de onde a enviamos as coisas vam parar num lugar ou outro, podemos cometer erros, estamos programando todo o tempo enviando e recebendo a memoria, e que podemos querer saber coisas como, onde esta o dado, ou saber seu valor, isso é o que temos que ter claro, si tomamos uma variável envio ela ao local onde tenho que armazenar(incluir '&'), si vou mostrar valor esse valor então não ponho '&', já que não é onde guarda o que eu quero saber, e sim o que guarda.

Prova fazer as reformas no seu código e comente aqui si o problema continua ;).

Link para o comentário
Compartilhar em outros sites

  • 0

Acho que falha por tentar imprimir as direções das variáveis como flotante nessa linha: printf("x%f=%f",&k,&x );

com o operador '&' adiante de uma variável, estamos extraindo o local de memoria onde se encontra a variável e não o valor que guarda, essa direção é um numero decimal que se usa sim ou sim o modificador %d já que se trata de uma direção de memoria.

Por outro lado si o que queremos é imprimir o valor de k e x não ponha '&' adiante de k nem de x. Recorde... printf("x%d=%d",&k,&x ); imprimem o local(direção), no qual se encontram as variáveis k e x, más devemos usar sempre %d ou vai dar erro. Para imprimir o valor de k e x como flotantes printf("x%f=%f",k,x ); faça sem '&' e com isso já podemos ver o resultado na tela.

Esse erro nós entenderemos melhor quando chegar no tema de ponteiros.

Para scanf continuar pondo '&' adiante das variáveis para ler tipos de dados básicos, com isso queremos dizer que ao ler um char por exemplo, esse char se guarde no lugar(direção) onde se encontra a nossa variavel na memoria.

imagine que somos um carteiro, que entregamos pacotes :lol:, em uma rua muito comprida as casas esta numeradas. quando eu vejo '&' adiante de uma variavel isso se refere ao numero da casa que pertence o pacote, já o pacote não leva esse '&' vai sem, então imaginamos que scanf se chama entregar e não scanf, entregar("%c", &pacote) é como dizer, entregar pacote na casa numero X onde seja a residencia do pacote, esse x não devemos saber só devemos saber cuando nos referimos ao pacote 'pacote', ou a residencia do pacote '&pacote'. Isso é o que acontece no caso do scanf entregamos o pacote na casinha de memoria onde ele pertence, no caso do printf, podemos tanto querer saber onde esta o pacote printf("%c", &pacote), como podemos querer saber que tem dentro de esse pacote printf("%c", pacote) que é o que guarda.

E com isso más ou menos já da para aguentar um pouco melhor até aprender o tema dos ponteiros. Tenha simplesmente claro que nós estamos lidando com a memoria em todo momento, a memoria ela é física por isso trabalhamos com direçoes, porque dependendo de onde a enviamos as coisas vam parar num lugar ou outro, podemos cometer erros, estamos programando todo o tempo enviando e recebendo a memoria, e que podemos querer saber coisas como, onde esta o dado, ou saber seu valor, isso é o que temos que ter claro, si tomamos uma variável envio ela ao local onde tenho que armazenar(incluir '&'), si vou mostrar valor esse valor então não ponho '&', já que não é onde guarda o que eu quero saber, e sim o que guarda.

Prova fazer as reformas no seu código e comente aqui si o problema continua ;).

Muito obrigada pela resposta!

Quando fiz as alterações sugeridas, a variável k funcionou corretamente, porem a X continuou sendo mostrada como "0". Não sei se o erro está no scanf das variaveis "a" e "b" ou se na operação em si, porém não está funcionando. Talvez o problema seja nas variáveis tambem, está certo colocar x, fx, fa como float por não serem números inteiros? Poderia checar se a sintaxe dessa parte está correta, por favor:

x=((a+b)/2);
    fx=(sqrt(x-4))+x-9;
    fa=(sqrt(a-4))+a-9;
Editado por fernandadmf
Link para o comentário
Compartilhar em outros sites

  • 0

CONSERTEI! ALELUIA! kkkkkkkk

ficou assim:

    #include <stdlib.h>
    #include <stdio.h>
    #include <math.h>
    #include <iostream>

    main()
    {        int i,k,c;
             float p,x,fx,fa,a,b;
     
     c=0;
     while (c!=1) {
                 printf("Digite o primeiro numero do intervalo inicial:");
            scanf("%f",&a);
                    printf("\n");
            printf("Digite o último numero do intervalo inicial:");
            scanf("%f",&b);
                    printf("\n");
                    
            if (a>7||b<8){
            printf("Erro, a raiz não se encontra nesse intervalo. Favor digitar outro.");     
                                printf("\n");
            } else {
                c=1;
            }
        }
            printf("Digite o numero de iteracoes:");
            scanf("%d",&i);
                    printf("\n");
                

    for (k=1; k<=i; k++) {
    x=(a+b)/2;
    fx=(sqrt(x-4))+x-9;
    fa=(sqrt(a-4))+a-9;
    p=fx*fa;
           if(p<0){
           a = x;}
               else {
           b = x;}
           
    printf("x%d=%f",k,x );
                    printf("\n");
    }
    }
  
Link para o comentário
Compartilhar em outros sites

  • 0

claro Fernanda! Felicidades, eres bastante intuitiva. Esses símbolos '%d', '%f', '%c'... entre muitos outros, se denominam especificadores de formato de escritura(printf), e os do scanf especificadores de formato para leitura. O que fazem é dar forma a um string para que se leia ou se escreva de forma desejada, porem eles também tem certas regras.

Eu posso ter um flotante(real), más querer mostrar ele como inteiro(decimal). No caso da variável 'k' si você mostrar ela como %f, é como si estivesse fazendo um cast antes de mostrar, si não souber que é um cast, um cast é uma conversão entre tipos de dados, o problema esta em que não podemos fazer uma conversão de tipos de decimal a flotante para direções de memoria, porque pode existir uma direção 120006. O que nunca vai existir é uma direção 120006.32 já que, ou ela é 120006, ou ela é 120007, porem não existe meios termos quando se trata de direções de memoria, e por isso seu código falhava ao mostrar a direção como float(não permitido), mas não falhava ao mostrar a variável inteira como flotante, que nesse caso sim ta permitido, o compilador assume que é nossa responsabilidade tomar conta disso já que podemos que rer fazer isso já que como falei, esta permitido.

Sobre a memoria, tudo ficará mais claro quando chegar no tema de ponteiros.

Sobre os especificadores de formato de leitura ou escritura leia isso:

http://pt.wikibooks.org/wiki/Programar_em_C/Entrada_e_sa%C3%ADda_simples#Especifica.C3.A7.C3.B5es_de_formato

Tenha claro que não todos eles são compatíveis entre printf e scanf, alguns são só de scanf e outros só de printf, más eles não são só exclusivos de scanf e printf, algumas outras funções muito uteis também utilizam especificadores como fprintf() para imprimir em arquivos com formato, e sprintf() para formar strings desde varias variáveis. Logo estão suas versões de leitura fscanf e sscanf().

Leia o tema recomendado e pratique com especificadores e formato de strings, si tiver duvidas Aqui esta o foro para isso.

Sorte! :P

Editado por vangodp
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...