View Full Version : [C] array que guarda valores se sao diferentes


Neo4
15-12-2007, 20:00
Boas, estou a fazer um trabalho em que o objectivo é encontrar as raizes imaginarias de um polinomio utilizando o metodo de newton.

para tal é necessario iterar o mesmo processo varias vezes para varios pontos para ver quantas raizes sao encontradas, isso vai retornar muitas raizes, o meu objectivo é guardar num array so as raizes diferentes e desenvolvi isto:


cplx P0; float x, y;
int i,b=1;
cplx roots[20];

for(y=-1, x=-1; x<1 ; x=x+0.01, y=y+0.01){
P0.real=x; P0.imaginario=y;
P0 = newton(P0); printf("\nraizes: %lf e %lfi\n", P0.real, P0.imaginario);
for(i=0;i<b;i++){
if((roots[i].real == P0.real) && (roots[i].imaginario== P0.imaginario)) {break;}
else if(i==b-1){roots[i] = P0;
b++;
printf("raizes guardadas: %lf e %lfi, posicao:%d\n", roots[i].real, roots[i].imaginario, i);break;}
}
}


cplx foi uma struct defenida por mim que tem 2 inteiros um real e um imaginario;
os printf's estao so mesmo para ver o que corre mal
e o que acontece é que ele guarda logo no array as primeiras 20 iteraçoes do ciclo mesmo elas sendo iguais as que ja la estao!

s00n
15-12-2007, 20:07
cplx foi uma struct defenida por mim que tem 2 inteiros um real e um imaginario;


Não estou a ver o que fizeste mas esta frase não faz sentido. Se os valores são raízes, não são obrigatoriamente valores naturais [..., -3, -2, -1, 0, 1, 2 ,3, ...], logo precisas de doubles ou floats nesses campos da estrutura.

Neo4
15-12-2007, 20:14
sim enganei-me tem 2 partes uma real e outra imaginaria e sao doubles.

de qualquer das maneiras nao altera em nada em minha questao

abço

Rob-Zombie
15-12-2007, 20:37
Tens isso mal , i é sempre igual a b-1 por isso é que ele te guarda sempre tudo.
Substitui o que está dentro do teu segundo for por isto e ve se dá.


if((roots[i].real != P0.real) && (roots[i].imaginario != P0.imaginario))
{
roots[i] = P0;
b++;
printf("raizes guardadas: %lf e %lfi, posicao:%d\n", roots[i].real, roots[i].imaginario, i)
break;
}
break;


Ps: eu nem se quer testei, li e respondi a isto um bocado na diagonal por isso é provavel q nao possa funcionar lol

Neo4
16-12-2007, 06:00
isso nao funciona vai guardar sempre uma nova raiz por cima da que ja estava gravada sempre que sao diferentes o array nao anda ate onde ainda nao foi preenchido!

Neo4
16-12-2007, 23:32
ninguem da aqui uma ajudinha? estou um pouco à rasca!

obrigado :)

Demio
17-12-2007, 03:30
for(y=-1, x=-1; x<1 ; x=x+0.01, y=y+0.01){
P0.real=x; P0.imaginario=y;
P0 = newton(P0);
printf("\nraizes: %lf e %lfi\n", P0.real, P0.imaginario);
for(i = 0; i < b && (roots[i].real != P0.real || roots[i].imaginario == P0.imaginario; i++)) {
if(i == (b-1)){
roots[i] = P0;
b++;
printf("raizes guardadas: %lf e %lfi, posicao:%d\n", roots[i].real, roots[i].imaginario, i);
}
}
}


Experimenta esse, vê lá é se aprendes a identar o código como deve ser...