Java - error matrices

 
Vista:

error matrices

Publicado por Uoho! (7 intervenciones) el 18/12/2007 21:40:47
Estoy haciendo una práctica que consiste en dada una matriz de unos y ceros contar los grupos de unos seguidos que hay y el numero de unos de cada grupo y almacenarlo en una matriz de salida. Ejempo:

1 1 1 1 4
0 1 1 0 la solucion sería 2
1 0 1 1 1 2

La cosa es que de cada fila saca los valores correctos pero a la hora de imprimir la matriz completa me aparecen todo unos... Os dejo mi programa, estoy empezando en Java y esta bastante chapucero, perdon! a ver si alguien me puede ayudar que me he atascado ahi hace dias...Gracias

import java.io.*;
import java.util.*;
public class Matriz1 {
public static void main(String args[]) throws IOException {
int n;
int i,j;
InputStreamReader isr=new InputStreamReader (System.in);
BufferedReader br=new BufferedReader(isr);
String valor, cadaNum;

System.out.println("Introducer tamaño: ");
valor=br.readLine();
n=Integer.valueOf(valor).intValue();

int [][] m =new int[n][n];
int[][] solucion = new int[n][n];

//lectura de la matriz m
for (i=0;i<n;i++){
System.out.println("introduzca fila "+i);
valor=br.readLine();
StringTokenizer st=new StringTokenizer(valor);
for (j=0;j<n;j++) {
cadaNum=st.nextToken();
m[i][j]=Integer.parseInt(cadaNum);
}
}
System.out.println("matriz introducida: ");
//visualizar por pantalla la matriz
ver(m);
//contamos los grupos de unos en cada fila
porfilas(m);
System.out.println("solucion: ");
ver(solucion);


}
//mostrar por pantalla
public static void ver (int[][] a) {
int i,j;
int n=a.length;
for (i=0;i<n;i++) {
for(j=0;j<n;j++) {
System.out.print (" "+a[i][j]);

}
System.out.println();
}
}

//porfilas

public static void porfilas (int[][] a) {
int n=a.length;
int []fila = new int[n];
int i,j;
for (i=0;i<n;i++) {
System.out.print ("Fila: ");
for (j=0;j<n;j++) {
fila[j]=a[i][j];
}
ver2 (fila);
calcular(fila,i);
}

}
public static void ver2 (int[] a) {
int i,j;
int n=a.length;
for(j=0;j<n;j++) {
System.out.print (" "+a[j]);
}
System.out.println();

}

public static int [][] calcular (int [] a, int i) {

int n=a.length;
int [][]solucion = new int [n][n];
int indice = n-1;
int indice_sol = n/2+1;
System.out.println ("indice_sol " +indice_sol);
int s_grupo = 0;

while (indice>=0) {
if (a[indice]==1){

s_grupo = s_grupo + 1;
indice = indice-1;
System.out.println ("indice " +indice);

}
else{
if (s_grupo>0) {
System.out.println ("solucion " +s_grupo);
solucion[i][indice_sol-1] = s_grupo;
System.out.println ("[i][indice_sol] " +solucion[i][indice_sol-1]);

s_grupo=0;
indice_sol = indice_sol-1;
}
indice=indice-1;
}

}

if (s_grupo>0){
solucion[i][0]=s_grupo;
System.out.println ("[i][0] " +solucion[i][0]);
indice_sol = indice_sol -1;
}
return (solucion);

}

}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:error matrices

Publicado por putahostia (69 intervenciones) el 19/12/2007 08:12:35
Sí, socio, es bastante chapucero. Y sin perdón.

Vamos por partes.

Todo son métodos estáticos. Lo has hecho porque te casca si no lo pones estáticos ¿ a que si? Claso. Create un objeto de la clase Matriz1:
Matriz1 matriz = new Matriz1();
ahora llamas los métodos con:
matriz.ver() etc.
Quita el "static" menos en el main. Ya'ta.
¿Mejor? Claro.

Y a lo tuyo. Pasas las matrices como parámetros y este es el problema. En java (leete la documentación si quieres) las matrices se pasan por referencia, no por valor. Algo de legado del C y C++. No creo que esto se solucione, así que ...
Declara la matriz como variable global de la clase, la accedes desde cualquier método, la modificas y la pintas.
Así no vas a tener problemas.

Eso, a ver si te soluciona el tema.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:error matrices

Publicado por Uoho! (7 intervenciones) el 19/12/2007 23:12:42
Oye, muchas gracias, estoy dandole vueltas, aun no me furrula, pero no pierdo la esperanza...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:error matrices

Publicado por Uoho! (7 intervenciones) el 19/12/2007 23:55:18
Bueno, un poco la empiezo a perder.... he hecho esto, mal me imagino...
y me da el error "non-static variable solucion cannot be referenced from a static context" lo entiendo, pero no lo se arreglar..
Ayyyyy! putahostia..

import java.io.*;
import java.util.*;

public class Matriz_Solucion {
public int n;
public int [][] solucion = new int[n][n];

public static void main(String args[]) throws IOException {
int n,i,j;

Matriz_Solucion matriz = new Matriz_Solucion();

InputStreamReader isr=new InputStreamReader (System.in);
BufferedReader br=new BufferedReader(isr);
String valor, cadaNum;

System.out.println("Introduce tamaño: ");
valor=br.readLine();
n=Integer.valueOf(valor).intValue();

int [][] m =new int[n][n]; // matriz de entrada
// matriz solucion


//lectura de la matriz m
for (i=0;i<n;i++){
System.out.println("introduzca fila "+i);
valor=br.readLine();
StringTokenizer st=new StringTokenizer(valor);
for (j=0;j<n;j++) {
cadaNum=st.nextToken();
m[i][j]=Integer.parseInt(cadaNum);
}
}
System.out.println("matriz introducida: ");
matriz.ver(m) ;
matriz.porfilas(m);

matriz.ver(solucion);

}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:error matrices

Publicado por putahostia (69 intervenciones) el 20/12/2007 12:18:49
Que no cunda el pánico.
He modificado algo tu código, a ver si te gusta así:

import java.io.*;
import java.util.*;

public class Matriz1 {

// la matriz
private int[][] solucion;

// una fila
private int[] fila;

// aquí van los números que contamos
// puedes meterlos en tu matriz como lo habias hecho, pero así lo veo mas claro
private int[] indices;

public static void main(String args[]) throws IOException {

Matriz1 matriz = new Matriz1();

matriz.leer();

System.out.println("matriz introducida: ");
// visualizar por pantalla la matriz
matriz.ver();
// contamos los grupos de unos en cada fila
matriz.porfilas();
System.out.println("solucion: ");

// esto lo dejo aparte porque es igual que la primera matriz
//matriz.ver();

matriz.verResultado();

}

public void leer() throws IOException {

int n;
int i, j;
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String valor, cadaNum;

System.out.println("Introducer tamaño: ");
valor = br.readLine();
n = Integer.valueOf(valor).intValue();

solucion = new int[n][n];
indices = new int[n];

// lectura de la matriz m
for (i = 0; i < n; i++) {
System.out.println("introduzca fila " + i);
valor = br.readLine();
StringTokenizer st = new StringTokenizer(valor);
for (j = 0; j < n; j++) {
cadaNum = st.nextToken();
solucion[i][j] = Integer.parseInt(cadaNum);
}
}
}

// mostrar por pantalla
public void ver() {
int i, j;
int n = solucion.length;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
System.out.print(" " + solucion[i][j]);

}
System.out.println();
}
}

// porfilas

public void porfilas() {
for (int i = 0; i < solucion.length; i++) {
System.out.print("Fila: ");
fila = new int[solucion.length];
for (int j = 0; j < solucion.length; j++) {
fila[j] = solucion[i][j];
}
ver2();
calcular(i);
}

}

public void ver2() {
int n = solucion.length;
for (int j = 0; j < n; j++) {
System.out.print(" " + fila[j]);
}
System.out.println();

}

public void calcular(int i) {

// este es tu código, algo modificado pero funciona
// lo que no me gusta es que sobreescribes el primer elemento de la matriz
/*
int n = solucion.length;
int indice = n - 1;
int indice_sol = n / 2 + 1;
System.out.println("indice_sol " + indice_sol);
int s_grupo = 0;

while (indice >= 0) {
if (fila[indice] == 1) {

s_grupo = s_grupo + 1;
indice = indice - 1;
System.out.println("indice " + indice);

}
else {
if (s_grupo > 0) {
System.out.println("solucion " + s_grupo);
solucion[i][indice_sol - 1] = s_grupo;
System.out.println("[i][indice_sol] " + solucion[i][indice_sol - 1]);

s_grupo = 0;
indice_sol = indice_sol - 1;
}
indice = indice - 1;
}

}

if (s_grupo > 0) {
solucion[i][0] = s_grupo;
System.out.println("[i][0] " + solucion[i][0]);
indice_sol = indice_sol - 1;
}
*/

// yo lo hago así:
int contador = 0;
for (int j = 0; j < fila.length; j++) {
if (fila[j] == 1)
contador++;
}
indices[i] = contador;

}

public void verResultado() {
for (int i = 0; i < indices.length; i++) {
System.out.println("Fila " + i + " -> " + indices[i]);
}
}

}

Tu al menos has intentado hacer algo. Que seguro que has aprendido un huevo de cosas mientras te equivocabas. Ahora lo que te queda es intentar comprender porque las matrices no se pueden pasar como parámetros. (Que no es que no se puedan, es que el resultado no es el esperado). Cuando termines, haz una prueba en tu código cambiando int por Integer. Veras la diferencia.

Que te diviertas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:error matrices

Publicado por Uoho! (7 intervenciones) el 20/12/2007 22:33:47
Me han gustado mucho tus modificaciones..jeje!, lo he cambiado un poco porque para una fila 10 11 0 111 la solucion no es 6 sino 1 2 3, la suma por grupos. Bueno, que me salió, y que te estoy muy agradecida... esto de aprender por los libros es jodido.
Y ahora, a por un backtracking (me parto!).
Muchas gracias. Feliz navidad y bla bla bla.
Nos veremos...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar