1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[C] array que guarda valores se sao diferentes

Discussão em 'Programação' iniciada por Neo4, 15 de Dezembro de 2007. (Respostas: 6; Visualizações: 1398)

  1. Neo4

    Neo4 Banido

    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:

    Código:
    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!
     
  2. s00n

    s00n Power Member


    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.
     
  3. Neo4

    Neo4 Banido

    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
     
  4. Rob-Zombie

    Rob-Zombie Power Member

    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á.

    Código:
    	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
     
  5. Neo4

    Neo4 Banido

    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!
     
  6. Neo4

    Neo4 Banido

    ninguem da aqui uma ajudinha? estou um pouco à rasca!

    obrigado :)
     
  7. Demio

    Demio Power Member

    Código:
    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...
     

Partilhar esta Página