Jump to content
Fórum Script Brasil
  • 0

Não consigo identificar o erro


fernandadmf
 Share

Question

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.

Edited by fernandadmf
Link to comment
Share on other sites

4 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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;
Edited by fernandadmf
Link to comment
Share on other 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 to comment
Share on other 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

Edited by vangodp
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.6k
×
×
  • Create New...