Devolver vector en Java

Iniciado por Seruk, 18 Octubre 2012, 16:56 PM

0 Miembros y 1 Visitante están viendo este tema.

Seruk

Buenas.
Necesito ayuda con respecto a un ejercicio de la facultad.
Debo devolver en un método, un vector de enteros (o array), de los elementos pasados por parámetro en la clase principal.
Ese es el método de la clase Polinomio:
//COEFICIENTES
public int[] coeficientes(){
for (int i = 0; i<grade+1; i++){
vector[i]=p[i];
}
return vector;
}

Vector ha sido declarado en la clase Polinomio, y este s un método de dicha clase.
La variable vector es:
int[] vector = new int [grade+1];


Las variables que parecen extrañas (como grade) han sido declaradas previamente y debidamente introducidas, luego no hay problema con ellas
Esto es lo que devuelve: [I@5e8fce95
Es curioso, pues los elementos que tiene p[] son los siguientes:
int[] p= {1,2,3,4};


Desconozco lo que debo hacer. Según tengo entendido, un vector NO puede devolverse tal cual. ¿Alguien puede ayudarme?
Gracias.

MonMa

Hola Seruk,

lo que estás viendo es la posición de memoria que ocupa vector. Seguro que lo que has hecho es un System.out.println(vector);. Para imprimir los elementos de un array debes iterar sobre el array.

Otra cosa. No tiene sentido declarar una función que devuelve un int[] (o cualquier otra cosa) y devolver una variable global de la clase. Simplemente no estás devolviendo nada a la práctica, si no que lo que haces es modificar el valor de la propia variable global de clase.

He hecho una clase de test que creo resuelve tu problema (fíjate que int[] vector... está declarado en la propia función).

public class DevolverVector {

int grade = 3;
int[] p= {1,2,3,4};

//COEFICIENTES
public int[] coeficientes(){
int[] vector = new int[grade+1];
for (int i = 0; i<grade+1; i++){
vector[i]=p[i];
}
return vector;
}


public static void main(String[] args) {
DevolverVector dv = new DevolverVector();

int[] test = dv.coeficientes();

System.out.println( "Posición de memoria en la VM:" );
System.out.println( test );

System.out.println();
System.out.println( "Elementos del array:" );
for (int i = 0 ; i < test.length ; i++ ) {
System.out.print(test[i]);
if ( i < test.length - 1 ) {
System.out.print(",");
}
}

}

}


El resultado es:
Posición de memoria en la VM:
[I@3487a5cc

Elementos del array:
1,2,3,4


Espero haberte ayudado.

Un saludo!

Seruk

Efectivamente, me has ayudado mucho.
Lo que no se, MonMa, es si puede aplicarse al enunciado. Es muy ambiguo, fíjate:
Cita de: PROFESORESUn método llamado coeficientes que devuelve un vector de enteros, de tamaño grado+1, que representa los coeficientes del Polinomio desde el de menor grado al de mayor grado. Modificar el vector devuelto no debe modificar el polinomio.

Es curioso. Tal vez haya interpretado mal y "devolver" lo haya confundido con imprimir.

Tu respuesta me agrada, sinceramente.
Una cosa más (pertenece al mismo código). Verás, estoy haciendo algunas  pruebas de resta y suma de polinomios. Parte del código de la clase UsaPolinomio es este:

public class UsaPolinomio {
public static void main(String[] args){
int[] p= {1,2,3,0,6,7};
int[] p2={5,0,0,5,6};
Polinomio polinomio = new Polinomio(p);
Polinomio polinomio2 = new Polinomio(p2);

System.out.println("El grado del polinomio actual es "+polinomio.grado());
System.out.println("El valor del polinomio, para x = 3, es: "+polinomio.valor(3));
System.out.println("La suma de su polinomio y el polinomio p2 es: "+polinomio.suma(polinomio2));
System.out.println("La resta de su polinomio y el polinomio p2 es: "+polinomio.resta(polinomio2));
}
}


La clase Polinomio, tiene la siguiente estructura para los métodos requeridos:
NOTA IMPORTANTE: Los grados de los polinomios equivalen a su índice.



public class Polinomio {
private int grade;
private int[] p={};

public Polinomio (){
grade = 0;
ind = 0;
}

public Polinomio (int[] p){
this.p = p;

// GRADO DEL POLINOMIO EN CUESTIÓN
for (int i = p.length-1; i > 0; i--){
if (p[i] != 0){
this.grade=i;
break;
}
}
}

// GRADO
public int grado (){
return grade;
}

// SUMA
public Polinomio suma (Polinomio p2){
int[] pres = new int [tamaño(p2)];
for (int i = 0; i<tamaño(p2); i++){
pres[i] = p[i] + p2.p[i];
if (tamaño(p2)==p.length && i == p2.p.length-1){
i++;
while (i<tamaño(p2)){
pres[i] = p[i];
i++;
}
} else if (tamaño(p2)==p2.p.length && i == p.length-1){
i++;
while (i<tamaño(p2)){
pres[i] = p2.p[i];
i++;
}
}
}
return new Polinomio (pres);
}


// RESTA
public Polinomio resta (Polinomio p2){
int[] pres = new int [tamaño(p2)];
for (int i = 0; i<tamaño(p2); i++){
pres[i] = p[i] - p2.p[i];
if (tamaño(p2)==p.length && i == p2.p.length-1){
i++;
while (i<tamaño(p2)){
pres[i] = p[i];
i++;
}
} else if (tamaño(p2)==p2.p.length && i == p.length-1){
i++;
while (i<tamaño(p2)){
pres[i] = p2.p[i];
i++;
}
}
}
return new Polinomio (pres);
}
}


Bien. He conseguido que haga unas perfectas sumas y restas. Al menos aparentemente. Por ejemplo, la consola devuelve:
(Recordad el orden de lo coeficientes.

(Hice un método toString qu eno puedo poner aquí para evitar copias DENTRO de la propia facultad.

Aparentemente está bien, pero desgraciadamente no es así para VPL....



Si por casualidad sabéis el por qué de la excepción... sería genial.
De todos modos intentaré solventarlo, aunque llevo días con esto.
Por cierto, empezamos con Java hace tan solo un mes....

MonMa

Hola Seruk,

no te haré el ejercicio, pero intentaré darte una pista por lo que he visto en el código...  ;D

Antes decir que la función tamaño(p2) no se que hace (no la veo declarada en ningún lado en el código que has pasado) aunque entiendo que es similar a grado() (y si es así no se porque no haces p2.grado()).

El error que te da es porque llamas a un índice del array que no existe (presumiblemente de pres). Te has planteado que pasaría si el tamaño del Polinomio que estás tratando fuese mayor que el de p2 a la hora de crear el array pres?

A ver si esto te ayuda :)

Un saludo!

Seruk

No, no. No quiero que me hagas el ejercicio, sería contaproducente para mi, por lo que te lo agradezco.

private final int tamaño (Polinomio p2){
int tam = 0;
if (p2.p.length>p.length){
tam = p2.p.length;
} else {
tam = p.length;
}
return tam;
}



Como puedes ver, he comprobado qué tamaño es mayor.
Siempre se suman los índices, por lo que nunca superará el tamaño inicial.
Creo que el error está en el constructor.
Voy a intentar solventarlo. Desde que lo solucione, os aviso.

Lo curioso es que el error lo muestra VPL, el calificador... pero compila...


MonMa

Hola Seruk,

perdona, pero qué es VPL?

Otra cosa, sin tener que ver con tu problema principal, más una cuestión de eficiencia. En lugar de llamar tantas veces a la función tamaño(Polinomio p) dentro de suma() y resta() yo la llamaría sólo una vez al inicio de la función y asignaría su valor a una variable del ámbito de la función (e.g. int tam = tamaño(p2);). En el caso que muestras el tiempo que gasta la función es cuasi despreciable, pero en otros casos con operaciones más complejas (que la función incluya bucles, por ejemplo) puedes llegar a ganar varios órdenes de magnitud en eficiencia del algoritmo.

Saludos!

Seruk

Acabo de modificarlo. Está tal como lo dijiste.
Tienes razón. No hay necesidad de llamar varias veces a la función. Gracias

VPL es Visual Programming Language. Es una aplicación (Entorno de Desarrollo) desarrollada por Microsoft, programada en java (Como la mayoría). La diferencia es que esta está soportada por el servidor de docencia de la universidad. Curiosamente se usa en el navegador, aunque yo no la consideraría "entorno de desarrollo"