Problema com variáveis [RESOLVIDO]

1. Problema com variáveis [RESOLVIDO]

Djalma L. O. Junior
Djalma_Jr

(usa Debian)

Enviado em 11/11/2012 - 07:59h

E ai pessoal, tudo bem? Estou fazendo um programa aqui, e estou com um problema de leitura das variáveis nas funções, eu entro com os dados em uma função, e quando "chamo" eles em outra função, eles não estão carregando os dados que eu "inputei" nelas na função anterior, será que tem como alguém me ajudar? (Já fiz o teste de retirar as funções e fazer tudo em uma só, e quando eu faço isso da certo!)

O problema está nas variáveis "vv, entrada, prestacao e parcelas".
Valeu!
[]'s

Códio fonte:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 1000
#define ERRO pow(10,-5)

struct variaveis{
int cont;
float vv, vf, entrada, pm, p, k;
float x[MAX], f1x[MAX], f2x[MAX], g1x[MAX], g2x[MAX], h1x[MAX], h2x[MAX];
};

int controle(){
struct variaveis X;
X.cont = 0;
X.vv = 0;
X.vf = 0;
X.entrada = 0;
X.pm = 0;
X.p = 0;
X.k = 0;
}


int entrada(){
struct variaveis X;

printf ("Entre com o valor do produto 'à vista':");
scanf ("%f", &X.vv);
printf ("Entre com o valor da entrada: ");
scanf ("%f", &X.entrada);
printf ("Entre com o valor de cada prestacao: ");
scanf ("%f", &X.pm);
printf ("Entre com a quantidade de parcelas: ");
scanf ("%f", &X.p);

printf ("\n\n\n");
printf ("Controle_1\n");
printf ("vv = %0.1f\n", X.vv);
printf ("entrada = %0.1f\n", X.entrada);
printf ("prestacao = %0.1f\n", X.pm);
printf ("parcelas = %0.1f\n", X.p);
}

int calculos_1(){
struct variaveis X;
int i;
float teste;

printf ("\n\n\n");
printf ("Controle_2\n");
printf ("vv = %0.1f\n", X.vv);
printf ("entrada = %0.1f\n", X.entrada);
printf ("prestacao = %0.1f\n", X.pm);
printf ("parcelas = %0.1f\n\n\n\n", X.p);

X.x[0] = 0.9;
printf ("x[0] = %f\n", X.x[0]);
X.vf = (X.vv - X.entrada);
printf ("vf = %f\n", X.vf);
X.k = X.vf/X.pm;
printf ("k = %f\n", X.k);
X.g1x[0] = X.k*pow(X.x[0],(X.p+1));
printf ("g1x[0] = %f\n", X.g1x[0]);
X.g2x[0] = ((X.k+1)*(pow(X.x[0],X.p))) - 1;
printf ("g2x[0] = %f\n", X.g2x[0]);
/*f1x é a função original*/
X.f1x[0] = (X.g1x[0] - X.g2x[0]);
printf ("f1x[0] = %f\n", X.f1x[0]);
X.h1x[0] = (X.p+1)*(X.k*pow(X.x[0],X.p));
printf ("h1x[0] = %f\n", X.h1x[0]);
X.h2x[0] = X.p*((X.k+1)*pow(X.x[0], X.p-1));
printf ("h2x[0] = %f\n", X.h2x[0]);
/*f2x é a derivada da função*/
X.f2x[0] = X.h1x[0] - X.h2x[0];
printf ("f2x[0] = %f\n", X.f2x[0]);


for (i=1; i<=MAX; i++){
X.x[i] = X.x[i-1] - (X.f1x[i-1]/X.f2x[i-1]);
teste = abs ((X.x[i] - X.x[i-1])/X.x[i]);
if (teste <= ERRO){
break;
exit(0);
}
else if(teste >= ERRO){
X.g1x[i] = X.k*pow(X.x[i],(X.p+1));
X.g2x[i] = ((X.k+1)*(pow(X.x[i],X.p))) - 1;
/*f1x é a função original*/
X.f1x[i] = X.g1x[i] - X.g2x[i];
X.h1x[i] = (X.p+1)*(X.k*pow(X.x[i],X.p));
X.h2x[i] = X.p*((X.k+1)*pow(X.x[i], X.p-1));
/*f2x é a derivada da função*/
X.f2x[i] = X.h1x[i] - X.h2x[i];
}
X.cont = X.cont + 1;
}
}

int saida_1(){
struct variaveis X;
printf ("A funcao alcanca o 'zero' em: %f \n", X.x[X.cont]);
printf ("A resolucao foi alcancada depois de %d interacoes.\n\n", X.cont);
}

int main(){
controle();
entrada();
calculos_1();
saida_1();
system("pause");
return 0;
}




Tela de saída:
Entre com o valor do produto 'à vista':21
Entre com o valor da entrada: 21
Entre com o valor de cada prestacao: 21
Entre com a quantidade de parcelas: 21



Controle_1
vv = 21.0
entrada = 21.0
prestacao = 21.0
parcelas = 21.0



Controle_2
vv = 0.0
entrada = 0.0
prestacao = 0.0
parcelas = 0.0



x[0] = 0.900000
vf = -0.000000
k = -0.007810
g1x[0] = -0.007029
g2x[0] = -0.007810
f1x[0] = 0.000781
h1x[0] = -0.007810
h2x[0] = 0.000000
f2x[0] = -0.007810



  


2. MELHOR RESPOSTA

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 11/11/2012 - 13:00h


...
int entrada(){
struct variaveis X;

printf ("Entre com o valor do produto 'à vista':");
scanf ("%f", &X.vv);
printf ("Entre com o valor da entrada: ");
scanf ("%f", &X.entrada);
printf ("Entre com o valor de cada prestacao: ");
scanf ("%f", &X.pm);
printf ("Entre com a quantidade de parcelas: ");
scanf ("%f", &X.p);

printf ("\n\n\n");
printf ("Controle_1\n");
printf ("vv = %0.1f\n", X.vv);
printf ("entrada = %0.1f\n", X.entrada);
printf ("prestacao = %0.1f\n", X.pm);
printf ("parcelas = %0.1f\n", X.p);
}
...
int calculos_1(){
struct variaveis X;
int i;
float teste;

printf ("\n\n\n");
printf ("Controle_2\n");
printf ("vv = %0.1f\n", X.vv);
printf ("entrada = %0.1f\n", X.entrada);
printf ("prestacao = %0.1f\n", X.pm);
printf ("parcelas = %0.1f\n\n\n\n", X.p);

int main(){
controle();
entrada();
calculos_1();
saida_1();
system("pause");
return 0;
}



Simples. você declarou variaveis X na função entrada() e variaveis X também na função calculos_1(). O que significa que são duas variáveis diferentes, onde cada uma só funciona em sua respectiva função.

Declare a variável como global ou declare-a na função main() e a passe como parâmetro, mas com ponteiro. Dessa forma será apenas uma variável e qualquer alteração nela em qualquer parte do programa será guardada.

3. Re: Problema com variáveis [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 11/11/2012 - 08:21h

Djalma_Jr escreveu:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 1000
#define ERRO pow(10,-5)

struct variaveis{
int cont;
float vv, vf, entrada, pm, p, k;
float x[MAX], f1x[MAX], f2x[MAX], g1x[MAX], g2x[MAX], h1x[MAX], h2x[MAX];
};

int controle(){
struct variaveis X;
X.cont = 0;
X.vv = 0;
X.vf = 0;
X.entrada = 0;
X.pm = 0;
X.p = 0;
X.k = 0;
}


int entrada(){
struct variaveis X;

printf ("Entre com o valor do produto 'à vista':");
scanf ("%f", &X.vv);
printf ("Entre com o valor da entrada: ");
scanf ("%f", &X.entrada);
printf ("Entre com o valor de cada prestacao: ");
scanf ("%f", &X.pm);
printf ("Entre com a quantidade de parcelas: ");
scanf ("%f", &X.p);

printf ("\n\n\n");
printf ("Controle_1\n");
printf ("vv = %0.1f\n", X.vv);
printf ("entrada = %0.1f\n", X.entrada);
printf ("prestacao = %0.1f\n", X.pm);
printf ("parcelas = %0.1f\n", X.p);
}

int calculos_1(){
struct variaveis X;
int i;
float teste;

printf ("\n\n\n");
printf ("Controle_2\n");
printf ("vv = %0.1f\n", X.vv);
printf ("entrada = %0.1f\n", X.entrada);
printf ("prestacao = %0.1f\n", X.pm);
printf ("parcelas = %0.1f\n\n\n\n", X.p);

X.x[0] = 0.9;
printf ("x[0] = %f\n", X.x[0]);
X.vf = (X.vv - X.entrada);
printf ("vf = %f\n", X.vf);
X.k = X.vf/X.pm;
printf ("k = %f\n", X.k);
X.g1x[0] = X.k*pow(X.x[0],(X.p+1));
printf ("g1x[0] = %f\n", X.g1x[0]);
X.g2x[0] = ((X.k+1)*(pow(X.x[0],X.p))) - 1;
printf ("g2x[0] = %f\n", X.g2x[0]);
/*f1x é a função original*/
X.f1x[0] = (X.g1x[0] - X.g2x[0]);
printf ("f1x[0] = %f\n", X.f1x[0]);
X.h1x[0] = (X.p+1)*(X.k*pow(X.x[0],X.p));
printf ("h1x[0] = %f\n", X.h1x[0]);
X.h2x[0] = X.p*((X.k+1)*pow(X.x[0], X.p-1));
printf ("h2x[0] = %f\n", X.h2x[0]);
/*f2x é a derivada da função*/
X.f2x[0] = X.h1x[0] - X.h2x[0];
printf ("f2x[0] = %f\n", X.f2x[0]);


for (i=1; i<=MAX; i++){
X.x[i] = X.x[i-1] - (X.f1x[i-1]/X.f2x[i-1]);
teste = abs ((X.x[i] - X.x[i-1])/X.x[i]);
if (teste <= ERRO){
break;
exit(0);
}
else if(teste >= ERRO){
X.g1x[i] = X.k*pow(X.x[i],(X.p+1));
X.g2x[i] = ((X.k+1)*(pow(X.x[i],X.p))) - 1;
/*f1x é a função original*/
X.f1x[i] = X.g1x[i] - X.g2x[i];
X.h1x[i] = (X.p+1)*(X.k*pow(X.x[i],X.p));
X.h2x[i] = X.p*((X.k+1)*pow(X.x[i], X.p-1));
/*f2x é a derivada da função*/
X.f2x[i] = X.h1x[i] - X.h2x[i];
}
X.cont = X.cont + 1;
}
}

int saida_1(){
struct variaveis X;
printf ("A funcao alcanca o 'zero' em: %f \n", X.x[X.cont]);
printf ("A resolucao foi alcancada depois de %d interacoes.\n\n", X.cont);
}

int main(){
controle();
entrada();
calculos_1();
saida_1();
system("pause");
return 0;
}




Tela de saída:
Entre com o valor do produto 'à vista':21
Entre com o valor da entrada: 21
Entre com o valor de cada prestacao: 21
Entre com a quantidade de parcelas: 21



Controle_1
vv = 21.0
entrada = 21.0
prestacao = 21.0
parcelas = 21.0



Controle_2
vv = 0.0
entrada = 0.0
prestacao = 0.0
parcelas = 0.0



x[0] = 0.900000
vf = -0.000000
k = -0.007810
g1x[0] = -0.007029
g2x[0] = -0.007810
f1x[0] = 0.000781
h1x[0] = -0.007810
h2x[0] = 0.000000
f2x[0] = -0.007810



Afinal qual é o problema mesmo? Em qual função ocorre o erro? Qual é esse erro?




4. Re: Problema com variáveis [RESOLVIDO]

Djalma L. O. Junior
Djalma_Jr

(usa Debian)

Enviado em 11/11/2012 - 08:25h

O problema ocorre na função "calculo_1", repara que eu coloquei dois "controles", cada um imprimindo os valores das variáveis em suas respectivas funções, o "controle_1" imprime o valor na função "entrada", e o "controle_2" imprime o valor na função "calculo_1", e os valores simplesmente somem! (Aproveitando o tópico, como você fez pra postar meu código fonte desse jeito aqui no VOL?)


5. Re: Problema com variáveis [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 11/11/2012 - 10:44h

para postar codigo usar a tag ( code )assim:
 "seu codigo aqui"  


ou utilize o ( http://codepad.org ) e enviar o link, pois pode ocorrer erro de exibição de codigo C pois o VOL tem foco em codigo ShellScript.


6. Re: Problema com variáveis [RESOLVIDO]

Djalma L. O. Junior
Djalma_Jr

(usa Debian)

Enviado em 11/11/2012 - 10:54h

Valeu cara! :)


7. Re: Problema com variáveis [RESOLVIDO]

Djalma L. O. Junior
Djalma_Jr

(usa Debian)

Enviado em 15/11/2012 - 13:32h

Acho que entendi o problema, mas isso acontece mesmo com eu usando struct? Tipo quando eu chamo a struct, e não armazena o que foi "inputado" na função anterior?


8. Re: Problema com variáveis [RESOLVIDO]

Luis R. C. Silva
luisrcs

(usa Linux Mint)

Enviado em 15/11/2012 - 19:19h

Djalma_Jr escreveu:

Acho que entendi o problema, mas isso acontece mesmo com eu usando struct? Tipo quando eu chamo a struct, e não armazena o que foi "inputado" na função anterior?


Sim, estruturas criam um novo tipo de dados, com int ou char, só que personalizado e com vários atributos.

Qualquer variável declarada dentro de uma função só vai funcionar dentro da função a qual foi declarada. Isso vale para qualquer tipo de dados, inclusive struct.

Se declarar outra variável com o mesmo nome, na verdade estará se referindo a uma nova variável em outra função, e não a mesma que tinha sido declarada antes.


9. Re: Problema com variáveis [RESOLVIDO]

Djalma L. O. Junior
Djalma_Jr

(usa Debian)

Enviado em 15/11/2012 - 19:21h

Aaaaaaah taaaaaah! Agora eu entendi!
Muito obrigado mesmo pela ajuda hein rei_astro!






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts