[Hilo Oficial II] Java

Gente he aprobado el examen final de java en 1º de ASI (administración de sistemas informáticos) con un 8!! Oeoeoeoeoeooeoeoeooeoeoe xD
Me gustaría probar hacer algo para móviles por ejemplo. Se que tengo que instalar el Java ME (mobile edition) pero nada más, alguien me orienta??? Muchas gracias.
Muy buenas, soy nuevo en esto del java y tengo un problemilla que a ver si me podéis ayudar a resolverlo.
Resulta que tengo una clase principal desde la cual llamo a una función de otra clase, en esa función declaro una variable a la que le doy un valor. Ahora lo que quiero es llevarme ese valor a la clase principal (la que use para llamar a la función), seguro que es una tontería y lo mas básico de todo pero yo no encuentro la manera de hacerlo :S
Alguien me puede echar un cable?
Puedes poner un metodo q te devuelva el valor de la variable y llamarlo desde la clase principal

Salu2
McCaan escribió:Puedes poner un metodo q te devuelva el valor de la variable y llamarlo desde la clase principal

Salu2


Gracias, ya consegui hacerlo como me decias =)
nemonihil escribió:Muy buenas, soy nuevo en esto del java y tengo un problemilla que a ver si me podéis ayudar a resolverlo.
Resulta que tengo una clase principal desde la cual llamo a una función de otra clase, en esa función declaro una variable a la que le doy un valor. Ahora lo que quiero es llevarme ese valor a la clase principal (la que use para llamar a la función), seguro que es una tontería y lo mas básico de todo pero yo no encuentro la manera de hacerlo :S
Alguien me puede echar un cable?

Lo que ha dicho McCaan, lo explico un poquito más:

Imagina que lo que quiero, es, simplemente, declarar una variable String, convertirla en mayusculas y que salte en un mensaje.

Puedo hacerlo de dos maneras: Una, haciendo un método que reciba el String como parámetro, lo convierta en mayusculas y lo muestre en un mensaje. Otra, hacer un método que reciba el String, lo convierta a mayusculas, y DEVUELVA otro String.

Así:

// Este método recibe un String, opera con él y lo muestra en pantalla (con el método lanzarMensaje)
public void Mayusculas (String s){
String aMayusculas = s.toUpperCase();
lanzarMensaje(aMayusculas);
}

//Este método recibe un String, opera y devuelve otro String.
public String Mayusculas (String s){
String aMayusculas = s.toUpperCase();
return aMayusculas;
}

//Al llamar a este último método, la cosa será así:

String cadena = Mayusculas("Holaquetal");

//Ahora cadena tiene un valor "HOLAQUETAL"

lanzarMensaje(cadena);
Buenas, es la primera vez que entro aqui es que estoy desesperao con un trabajillo del insti:
se supone que tenemos que hacer con java una aplicacion de poliedros en la que, cuando yo le diga que poliedro usar y la longitud de su arista, me muestre una imagen de ese tipo especifico de poliedro y su correspondiente area.
el tema es que se supone que ya he acabado pero me da bastantes errores; el area siempre me da 0, y el boton de calcular aparece sin ninguna imagen a pesar de que le diga que se muestre con la imagen de "calcular.gif". no creo que podais solucionarlo por que no se entendera nada, pero por probar que no falte xD:

ventana
package paqueteJava;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;


import javax.swing.*;

import javax.swing.border.Border;
import javax.swing.border.TitledBorder;

public class VentanaPoliedros {
JFrame miVentana = new JFrame ();
JPanel marPrincipal = new JPanel ();
JPanel marSuperior = new JPanel ();
Font fuente1 = new Font("Arial", 0, 14);
Border linea1 = BorderFactory.createLineBorder(Color.GRAY);
TitledBorder titDatos = BorderFactory.createTitledBorder(linea1,
"Datos", TitledBorder.LEFT, TitledBorder.TOP, fuente1, Color.BLUE);
JPanel marPoliedros = new JPanel ();
JPanel marCalcular = new JPanel ();
JButton botCalcular = new JButton();
JPanel marDatos = new JPanel ();
JPanel marResultado = new JPanel ();
Font fuente2 = new Font("Arial", 0, 14);
Border linea2 = BorderFactory.createLineBorder(Color.GRAY);
TitledBorder titResultado = BorderFactory.createTitledBorder(linea2,
"Datos", TitledBorder.LEFT, TitledBorder.TOP, fuente2, Color.RED);

JLabel etiPoliedro = new JLabel();

String[] lista = {"Tetraedro", "Cubo o hexaedro","Octaedro","Dodecaedro","Icosaedro"};
JComboBox cmbPoliedro = new JComboBox(lista);

JLabel etiArista = new JLabel();
JTextField txtArista = new JTextField (10);

JLabel etiArea = new JLabel();
JLabel etiResultado = new JLabel();


JLabel imgPoliedro = new JLabel();

public VentanaPoliedros (){
miVentana.setSize(900,400);
miVentana.setLocationRelativeTo(null);
miVentana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
miVentana.setLayout(new BorderLayout());
miVentana.add(marPrincipal);
miVentana.setVisible(true);

marPrincipal.add(marSuperior);
marPrincipal.add(marResultado);

marSuperior.add(marPoliedros);
marSuperior.add( marDatos);
marSuperior.add( marCalcular);

marResultado.add( etiArea);
marResultado.add(etiResultado);

marDatos.add( etiPoliedro);
marDatos.add( cmbPoliedro);
marDatos.add(etiArista);
marDatos.add( txtArista);

marCalcular.add( botCalcular);

marPoliedros.add( imgPoliedro);


etiPoliedro.setText("Tipo de poliedro");
etiPoliedro.setFont(new Font("Arial", 1, 10));
etiPoliedro.setHorizontalAlignment(JLabel.CENTER);
etiPoliedro.setPreferredSize( new Dimension(100, 30));

etiArista.setText("Arista(cm)");
etiArista.setFont(new Font("Arial", 1, 10));
etiArista.setHorizontalAlignment(JLabel.CENTER);
etiArista.setPreferredSize( new Dimension(100, 30));

etiArea.setText("Resultado");
etiArea.setFont(new Font("Arial", 1, 10));
etiArea.setHorizontalAlignment(JLabel.CENTER);
etiArea.setPreferredSize( new Dimension(100, 30));

etiResultado.setText("");
etiResultado.setFont(new Font("Arial", 1, 14));
etiResultado.setForeground(Color.BLUE);
etiResultado.setBackground(Color.ORANGE);
etiResultado.setHorizontalAlignment(JLabel.CENTER);
etiResultado.setPreferredSize( new Dimension(100, 30));
etiResultado.setOpaque(true);

botCalcular.addActionListener(new Calcular(cmbPoliedro, txtArista, etiResultado));
botCalcular.setIcon(new ImageIcon(getClass().getResource("Calcular.gif")));
botCalcular.setPreferredSize(new Dimension(80,40));

cmbPoliedro.setFont(new Font("Arial", 1, 10));
cmbPoliedro.setBackground(Color.YELLOW);
cmbPoliedro.setForeground(Color.BLUE);
cmbPoliedro.addActionListener(new Seleccionar(cmbPoliedro, imgPoliedro));


}
public static void main(String[] args) {
new VentanaPoliedros();


}}


clase calcular
package paqueteJava;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;

import javax.swing.JComboBox;

import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class Calcular implements ActionListener {
JTextField objArista = new JTextField();
JTextField txtArista = new JTextField();
JComboBox objComboBox = new JComboBox();
JLabel objResultado = new JLabel();
JLabel etiResultado = new JLabel();
double valor;
double area;
double arista;

public Calcular(JComboBox cmbPoliedro,JTextField txtArista,JLabel etiResultado){
objArista = txtArista;
objResultado = etiResultado;

}@Override
public void actionPerformed(ActionEvent arg0) {
if (objArista.getText().equals("")){
JOptionPane.showMessageDialog(null,"Introduce valor en la arista");
return;
}
if (arista < 0){
JOptionPane.showMessageDialog(null, "escribe un valor positivo");
return;
}
try{
arista = Double.parseDouble(objArista.getText().replace(",","."));

switch (objComboBox.getSelectedIndex() +1){
case 1:
area = (Math.pow(arista, 2) * Math.sqrt(3));
break;
case 2:
area = (6 * Math.pow(arista, 2));
break;
case 3:
area = (2 * Math.pow(arista, 2) * Math.sqrt(3));
break;
case 4:
area = (5 * Math.pow(arista, 2) * Math.sqrt(3));
break;
case 5:
area = (3 * Math.pow(arista, 2) * Math.sqrt(25 + 10 * Math.sqrt(5)));
break;
}
DecimalFormat miFormato = new DecimalFormat("#,##0.00");
objResultado.setText(miFormato.format((area)));

}
catch(Exception e1){
JOptionPane.showMessageDialog(null, "Introduce una arista válida");
}


}}


clase seleccionar
package paqueteJava;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class Seleccionar implements ActionListener {
JLabel objImagen = new JLabel();
JLabel imgPoliedro = new JLabel();
JComboBox cmbPoliedro = new JComboBox();
JComboBox objComboBox = new JComboBox();

public Seleccionar (JComboBox cmbPoliedro,JLabel imgPoliedro) {
objImagen = imgPoliedro;
objComboBox = cmbPoliedro;

}



@Override
public void actionPerformed(ActionEvent arg0) {
String seleccion = objComboBox.getSelectedItem() + ".gif";
objImagen.setIcon(new ImageIcon(getClass().getResource(seleccion)));
// TODO Auto-generated method stub

}

}


edito: al final un amigo me exo un cable asi que problema resuelto :)
Buenas,

necesito hacer una aplicación con interfície gràfica ya que hemos empezado a tratar este tema en la teoría.

Se tienen que mostrar las 27 letras del abecedario solamente esto. Hasta ahora tengo declarado 27 JButton en plan "chapuza" y seguramente se puede hacer de la siguiente forma:

JButton[]=new JButton[27]
for(i=0;i<26;i++)
{
  boto=new JButton("/*trozo de codigo a resolver*/");
}


a ver si me echan una mano, thanks!
jomola escribió:Buenas,

necesito hacer una aplicación con interfície gràfica ya que hemos empezado a tratar este tema en la teoría.

Se tienen que mostrar las 27 letras del abecedario solamente esto. Hasta ahora tengo declarado 27 JButton en plan "chapuza" y seguramente se puede hacer de la siguiente forma:

JButton[]=new JButton[27]
for(i=0;i<26;i++)
{
boto=new JButton("/*trozo de codigo a resolver*/");
}


a ver si me echan una mano, thanks!

Hecho así vas a tener que pasarle letra uno a uno (otra cosa es que no se porque usas botones si solo quieres mostrar letras, pero bueno), o hacer otra pasada más al bucle, por lo que es añadir código innecesario.

Como estás aprendiendo te voy a ayudar de forma descriptiva, no voy a darte código.

Yo lo que haría es:
1-crear un string con las letras del abecedario
2-recorrer la longitud del string con un for
2.1-utilizar el índice en uso de ese for para crear nueva instancia y asignarle el char de la posición actual del string
2.2-añadirlo al form actual (esto es una de las cosas importantes que te faltaban)
2.3-incrementar la x actual y asignársela al último objeto creado como posición
vale ya lo tengo :), gracias rintin me ha servido de ayuda. si es k lo tengo que hacer con botones para una practica superior.

tu saves como hacer tres filas de 9 columnas para el abecedario i que esten al sud de la interfaç. (deber ser fácil)

o sea a ver si me explico:

A B C D E F G H J
K L ...
...


tengo esto declarado:

container.add(panellBotons, BorderLayout.SOUTH);
jomola escribió:vale ya lo tengo :), gracias rintin me ha servido de ayuda. si es k lo tengo que hacer con botones para una practica superior.

tu saves como hacer tres filas de 9 columnas para el abecedario i que esten al sud de la interfaç. (deber ser fácil)

o sea a ver si me explico:

A B C D E F G H J
K L ...
...


tengo esto declarado:

container.add(panellBotons, BorderLayout.SOUTH);

Si lo que quieres son 3 filas, si he entendido lo que quieres hacer te bastaría con poner un if. Compruebas si estás en una posición de fin de linea (pista para hacerlo bonito: ten en cuenta longitud_del_abecedario/numero_filas), y si es así incrementas y asignas la Y de la misma forma que haces con la X.

Un saludo.
Hola de nuevo, tengo una preguntilla...
Estoy haciendo una ventana con netbeans y... hay alguna forma de que cada vez que añado algun componente no te los recoloque como le de la gana? Es que me estoy volviendo loco, añado un boton y me descoloca todo y lo cambia de tamaño.

Un Saludo y gracias!
Mi problema es el siguiente, quiero guardar con el NetBeans un archivo ".csv" con datos en dos columnas, cuando voy ha abrir el archivo con el excel me lo abre en una columna, no en dos, no me reconoce que son dos columnas. Pongo el método a ver si me podeis decir donde fallo, gracias.

public static void main(String[] args) throws IOException {
Scanner scn = new Scanner(System.in);


System.out.println("Introduce la amplitud");
double A = scn.nextDouble();
System.out.println("Introduce la frecuencia:");
double f = scn.nextDouble();//introducimos los valores por consola
System.out.println("Introduce la fase:");
double fas = scn.nextDouble();
System.out.println("Introduce el desplazamiento:");
double y0 = scn.nextDouble();

int t = 0;


for (t = 0; t < 10001; ++t) {
}
int n = t;

double[] y = new double[n];//creamos vector de la funcion y

double[] tt = new double[n];

y = fich(y, tt, A, f, fas, y0, t);





}

static double[] fich(double[] y, double[] tt, double A, double f, double fas, double y0, int t) throws IOException {


Scanner scn = new Scanner(System.in);
System.out.println("Introduce nombre del fichero para guardar:");
String b = scn.next();
FileWriter fb = new FileWriter(b + ".csv");//creamos fichero
PrintWriter pb = new PrintWriter(fb);//escribimos en fichero

pb.println(10000);
pb.println(2);

for (t = 0; t < 10001; ++t) {//creamos un bucle

tt[t] = t;

y[t] = y0 + A * Math.sin((2 * Math.PI * f * t) + fas);

pb.println(tt[t] + "\t" + y[t]);


}
pb.close();//cerramos escrpitura

System.out.println("El archivo se ha guardado correctamente");
System.out.println();
return y;

}
Aprovecho este hilo para preguntaros sobre una cosilla más relacionadas con netbeans que con java en si [+risas]

Hace unas semanas me encontré este IDE, multiplataforma que podría ahorrarme bastante esfuerzo en el desarrollo de mis programas en C,dado que las alternativas en linux son... bastante tristonas, geany, kdevelop, codeblocks, eclipse... nunca me terminaron de gustar para un entorno que desde un primer momento me hubiese gustado que fuese igual de simplón que el de visual studio, agradeciendo especialmente un depurador integrado.

Netbeans cumple a la perfección, gdb corriendo en unos clicks, memory leaks en una pestaña aparte (jamás pensé que no tuviera que recurrir a valgrind) pero me encontré con la desagradable experiencia cuando borre unos elementos de mi proyecto, desaparecieron de mi ordenador!!! ¿existe alguna manera de que tan solo se elimine el enlace? No se si me explico, que el archivo quede intacto aunque ya no pertenezca al proyecto. ¿Alguna configuración que haya que cambiar? Mencionar que uso la versión 6.8
kek_500 escribió:Aprovecho este hilo para preguntaros sobre una cosilla más relacionadas con netbeans que con java en si [+risas]

Hace unas semanas me encontré este IDE, multiplataforma que podría ahorrarme bastante esfuerzo en el desarrollo de mis programas en C,dado que las alternativas en linux son... bastante tristonas, geany, kdevelop, codeblocks, eclipse... nunca me terminaron de gustar para un entorno que desde un primer momento me hubiese gustado que fuese igual de simplón que el de visual studio, agradeciendo especialmente un depurador integrado.

Netbeans cumple a la perfección, gdb corriendo en unos clicks, memory leaks en una pestaña aparte (jamás pensé que no tuviera que recurrir a valgrind) pero me encontré con la desagradable experiencia cuando borre unos elementos de mi proyecto, desaparecieron de mi ordenador!!! ¿existe alguna manera de que tan solo se elimine el enlace? No se si me explico, que el archivo quede intacto aunque ya no pertenezca al proyecto. ¿Alguna configuración que haya que cambiar? Mencionar que uso la versión 6.8


Yo uso Netbeans para Java, supongo que será lo mismo.
Creo que todo aquello que está dentro de la carpeta del proyecto se borra si lo borras desde Netbeans.
Sin embargo, si esta fuera creo que suele abrir una nueva ventana con un toggle para indicar si quieres o no borrar el archivo físico del ordenador.
Sino siempre te queda la manera cutre, que es copiar el archivo a otra ubicación antes de borrarlo desde netbeans, más bale curarse en salud.

Un saludo,
mrm_arrasate escribió:
kek_500 escribió:...


Yo uso Netbeans para Java, supongo que será lo mismo.
Creo que todo aquello que está dentro de la carpeta del proyecto se borra si lo borras desde Netbeans.
Sin embargo, si esta fuera creo que suele abrir una nueva ventana con un toggle para indicar si quieres o no borrar el archivo físico del ordenador.
Sino siempre te queda la manera cutre, que es copiar el archivo a otra ubicación antes de borrarlo desde netbeans, más bale curarse en salud.

Un saludo,


De hecho no es más que un complemento que sea compatible con C/C++ por lo que la estructura y todo es lo mismo. Ya sabiéndolo intentaré que no vuelva a ocurrir, tendré más ojo la próxima vez que intente borrar algo. Un saludo! [bye]
Buenas, por fin encuentro un hilo oficial de java (lo andaba buscando por eol y no lo encontraba xD).

Bueno mi problema es el siguiente, estoy programando un reproductor de musica en java con neatbeans, usando BasicPlayer, una API para reproducir musica en java.
Todo va perfecto, abre las canciones, las muestra en una JList, puedo cambiar el volumen, la barra de progreso funciona y muchas cosas interesantes mas xD.
Pero el problema viene cuando intento hacer que, al acabar una cancion, se reproduzca la siguiente, y lo hace peeeeeeeero se oye fatal, como si hubiera interferencias o algo y no da ninguna excepcion por tanto el programa funciona bien.
Aqui os pongo el codigo que tengo para q cambie:
public void progress(int bytesread, long l, byte[] bytes, Map map) {
        float progressUpdate = (float) (bytesread * 1.0f / bytesLength * 1.0f);
        int progressNow = (int) (bytesLength * progressUpdate);
        sliderProgreso.setMaximum((int) bytesLength);
        sliderProgreso.setValue(progressNow);
        System.out.println(bytesread);
        System.out.println(bytesLength);
        if(bytesread%bytesLength == 0){
           System.out.println("PASO");
            try {
                int siguiente = listaReproduccion.getSelectedIndex() + 1;
                File cancion = (File)cancionesEnReproduccion.get(siguiente);
               
                reproductor.open(cancion);
                reproductor.startPlayback();

            } catch (BasicPlayerException ex) {
            Logger.getLogger(VentanaPrincipal.class.getName()).log(Level.SEVERE, null, ex);
            } catch(IndexOutOfBoundsException indexout){
            System.err.println("No hay mas canciones");
            }
        }
    }


Se supone que la clase BasicPlayer llama a este metodo varias veces por segundo en la reproduccion (logico porq es el q mueve la barra de progreso).
No os copio todo el codigo de la clase BasicPlayer porq es enorme

http://www.javazoom.net/jlgui/api.html este es el enlace de BasicPlayer

Soy bastante novatillo, a ver si algun alma caritativa puede ayudarme.
Gracias.

P.D: si necesitais mas datos (que seria logico) me lo decis y lo pongo


EDIT: Ya esta corregido al fin :) , ahora me e propuesto utilizar Substance para darle otro aspecto, alguien sabe como se hace? porq ya e buscado por google pero ninguna opcion me sirve, todas me dan excepciones ¬¬
buenas estoy empezando con esto de java (bueno llevo tiempo pero ahora es en serio jajaja) y tenia una duda, 1º yo estoy haciendo un applet el caso que abro ventana me meto en la dirección del applet (en local) carga, mete usuario y contraseña (porque así va el programa) la valida y tendría que pasar a una segunda pantalla que no se pasar.... es decir tengo una pantalla donde introduces user y pass y si son correctos debería pasar a una segunda pero no se como hacer que se vea esa segunda (se hacerlo con ventanas pero el profesor no nos deja hacer eso) no se si es una pregunta muy tonta pero bueno....

salu2
Que IDE? Netbeans 6.9 o Eclipse Helios?
Tengo una duda dudosa xDD

Tengo que crear un método que se le de como argumento una matriz y una coordenada de esa matriz.

sería así el método?
public static int[][] asdf (int[][] matriz, int x, int y){


si lo estoy haciendo correcto... en el main cómo daría la matriz junto con las coordenadas???

asdf(??,x,y)
ivanchi69 escribió:buenas estoy empezando con esto de java (bueno llevo tiempo pero ahora es en serio jajaja) y tenia una duda, 1º yo estoy haciendo un applet el caso que abro ventana me meto en la dirección del applet (en local) carga, mete usuario y contraseña (porque así va el programa) la valida y tendría que pasar a una segunda pantalla que no se pasar.... es decir tengo una pantalla donde introduces user y pass y si son correctos debería pasar a una segunda pero no se como hacer que se vea esa segunda (se hacerlo con ventanas pero el profesor no nos deja hacer eso) no se si es una pregunta muy tonta pero bueno....

salu2

Supongo que te refieres a pasar pantalla dentro del applet. Tienes que repintar el applet con los nuevos elementos. Funciona igual que si fuera una aplicación AWT o Swing.

viejozorro escribió:Que IDE? Netbeans 6.9 o Eclipse Helios?

Eclipse Helios FTW. A no ser que vayas a trabajar con glassfish.

JJMD escribió:Tengo una duda dudosa xDD

Tengo que crear un método que se le de como argumento una matriz y una coordenada de esa matriz.

sería así el método?
public static int[][] asdf (int[][] matriz, int x, int y){


si lo estoy haciendo correcto... en el main cómo daría la matriz junto con las coordenadas???

asdf(??,x,y)


La signatura del método está bien salvo el retorno, presupongo que quieres devolver el elemento en las cordenadas x,y por lo que se quedaría
public static int asdf (int[][] matriz, int x, int y)

ya que vas a devolver un int (el de las coordenadas x,y) no otra matriz.

para llamarlo en el main sería algo así
int[][] unaMatriz = <inicializas aquí como te de la gana, etc> //argumento
int x = <de donde saques el dato> //argumento
int y = <de donde saques el dato> //argumento

int resultado = asdf(unaMatriz, x, y);
Bueno, pues mi turno de preguntar... (me estoy volviendo tarumba)

Alguien me podría ayudar a pasar esto:

public class Recursivo {

private int valores[] = {12, 13, 25, 34, 56, 75, 16, 78, 11, 65, 89};

public int cal (int a, int b)
{
int i = (a+b)/2;
if (a<=b) {
return (valores[i]%2) + cal(a, i-1) + cal(i+1, b);
}
else {
return 0;
}
}
}


a NO recursivo?

Gracias!
Podrías explicar más o menos que es lo que pretendes hacer exactamente?
pakopa escribió:Podrías explicar más o menos que es lo que pretendes hacer exactamente?


Lamentablemente lo único que pretendo hacer es lo que he puesto, es una práctica que tengo que hacer que consiste en pasar ese método recursivo a no recursivo [decaio] llevo 2 días dándole vueltas pero solo he conseguido resultados parciales [noop]

Gracias!
Nagaroth escribió:
pakopa escribió:Podrías explicar más o menos que es lo que pretendes hacer exactamente?


Lamentablemente lo único que pretendo hacer es lo que he puesto, es una práctica que tengo que hacer que consiste en pasar ese método recursivo a no recursivo [decaio] llevo 2 días dándole vueltas pero solo he conseguido resultados parciales [noop]

Gracias!


Vaya tela XD

Pero dinos al menos los valores iniciales de 'a' y 'b' porque si yo ahora mismo te pongo a = 300 y b = 1, lo único que vamos a obtener es una hermosa ArrayIndexOutOfBoundsException.
Si, vaya tela, le he echado un ojillo, pero ando algo pillado para ponerme a fondo.

si a > b devuelve 0, ok, pero si a < b devuelve el modulo de 2 del elemento en la posición (media aritmética de a y b):x + f(a, x-1) + f(x +1, b)...

Que rayada, no?
pakopa escribió:Si, vaya tela, le he echado un ojillo, pero ando algo pillado para ponerme a fondo.

si a > b devuelve 0, ok, pero si a < b devuelve el modulo de 2 del elemento en la posición (media aritmética de a y b):x + f(a, x-1) + f(x +1, b)...

Que rayada, no?


Una rayada que no veas, me he tirado 3 días pero por fin he visto la luz [sonrisa]

Resulta que todo ese lío es para devolver el nº de números impares almacenados en el array entre las dos posiciones pasadas por parámetro (es decir, cal(1, 5) devuelve 3 ya que 13, 25 y 75 son impares por lo que al hacer el módulo de 2 devuelven 1, mientras que los pares devuelven 0).

Al final la forma de hacerlo era tan tonta como
    public int cal2 (int a, int b)
    {
        int total = 0;

        if (a<=b){
            for (int i=a;i<=b;i++){
                total+= valores[i]%2;
            }
            return total;
        }
        else
            return 0;
    }


Muchas gracias por la ayuda, a veces solo con "hablarlo" con alguien acaba por salir la solución por sí sola [plas]

Edito: redscare no había visto tu mensaje, por no darme ni siquiera me dieron el array inicializado (vamos, que lo he rellenado con lo que me ha salido de los huevos, hablando en plata) ni los valores que se pasan como parámetro (como bien dices son ganas de buscarse una bonita excepción), de ahí que me estuviera volviendo tarumba. Gracias!
Buenas.

A ver queria hacer el juego de los barcos y habia pensado crear una matriz para el tablero y luego, para cada barco, crear un objeto. No tengo muy claro como situarlos en el tablero. Habia pensado en crear un 2o tablero (matriz, del mismo tamaño que el original) cada vez que creo un barco, y compararlo con el anterior. Por si el barco nuevo ocupa una de las casillas que ya ha ocupado algun otro barco. Si es correcto, la nueva matriz pasa a ser el tablero. Y si no lo es, vuelvo a situar el barco hasta que no ocupe el espacio de otro.

La cuestion es, declaro la variable tablero auxiliar como global? O como comparo asi las matrices?

Pd: Soy nuevo en java. Es facil que este haciendo y/o diciendo tonterias.
Duqe escribió:Buenas.

A ver queria hacer el juego de los barcos y habia pensado crear una matriz para el tablero y luego, para cada barco, crear un objeto. No tengo muy claro como situarlos en el tablero. Habia pensado en crear un 2o tablero (matriz, del mismo tamaño que el original) cada vez que creo un barco, y compararlo con el anterior. Por si el barco nuevo ocupa una de las casillas que ya ha ocupado algun otro barco. Si es correcto, la nueva matriz pasa a ser el tablero. Y si no lo es, vuelvo a situar el barco hasta que no ocupe el espacio de otro.

La cuestion es, declaro la variable tablero auxiliar como global? O como comparo asi las matrices?

Pd: Soy nuevo en java. Es facil que este haciendo y/o diciendo tonterias.


Sólo diré una cosa, borra lo de global de tu diccionario mental, aunque en Java como tal no existe lo global puesto que no puedes crear nada fuera de las clases.
Eso he leido en varios sitios ya. Lo global es tema tabu.

Editado:

Esto me da error:

import java.util.Random;

public class DotComObjects {

public int[][] setBarcos(int tablero[][]) {

boolean repetido; //Variable booleana para comprobar si una casilla ya esta ocupada por otro barco

do {

repetido = false; //Suponesmos que no esta ocupada ninguna de las casillas
Random aRandom = new Random();
boolean horizontal = aRandom.nextBoolean(); //Booleana al azar para la colocacion del barco. True = horizontal, false = vertical

if (horizontal == true) { //Si el barco va en horizontal

int ancho = aRandom.nextInt(tablero.length - 2); //Calculamos al azar la casilla
int alto = aRandom.nextInt(tablero[0].length); //central del barco (tendra 3)

if ((tablero[ancho - 1][alto] == 1) || (tablero[ancho][alto] == 1) || (tablero[ancho + 1][alto] == 1)) { //Si una de las casillas ya esta ocupada

repetido = true; //Variable booleana repetida en true

}

} else { //Si el barco va en vertical

int ancho = aRandom.nextInt(tablero.length); //Calculamos al azar la casilla
int alto = aRandom.nextInt(tablero[0].length - 2); //central del barco (tendra 3)

if ((tablero[ancho][alto - 1] == 1) || (tablero[ancho][alto] == 1) || (tablero[ancho][alto + 1] == 1)) { //Si una de las casillas ya esta ocupada

repetido = true; //Variable booleana repetida en true
}

}

} while (repetido == true); //Repetimos hasta que no haya una casilla ocupada (variable repetido = false)

if (horizontal == true) { //Si el barco va en horizontal

tablero[ancho - 1][alto] = 1;
tablero[ancho][alto] = 1; //Colocamos el barco en el tablero
tablero[ancho + 1][alto] = 1;


} else { //Si el barco va en vertical

tablero[ancho][alto - 1] = 1;
tablero[ancho][alto] = 1; //Colocamos el barco en el tablero
tablero[ancho][alto + 1] = 1;


}

return tablero; //Devolvemos el tablero con el barco colocado

}

}

El error es el mismo, ancho/alto/horizontal cannot be resolved to a variable. Esta marcado en negrita. El resto de clases estan bien.

Pd: No me apedreeis. Estoy empezando con java y el curso de programacion hace casi 1 año que lo hice (C y Delphi). Y desde entonces practicamente no he vuelto a hacer nada.
Bueno este hilo no lo habia visto y me vendrá de perlas

Duqe escribió:Eso he leido en varios sitios ya. Lo global es tema tabu.

Editado:

Esto me da error:

import java.util.Random;

public class DotComObjects {

public int[][] setBarcos(int tablero[][]) {

boolean repetido; //Variable booleana para comprobar si una casilla ya esta ocupada por otro barco

do {

repetido = false; //Suponesmos que no esta ocupada ninguna de las casillas
Random aRandom = new Random();
boolean horizontal = aRandom.nextBoolean(); //Booleana al azar para la colocacion del barco. True = horizontal, false = vertical

if (horizontal == true) { //Si el barco va en horizontal

int ancho = aRandom.nextInt(tablero.length - 2); //Calculamos al azar la casilla
int alto = aRandom.nextInt(tablero[0].length); //central del barco (tendra 3)

if ((tablero[ancho - 1][alto] == 1) || (tablero[ancho][alto] == 1) || (tablero[ancho + 1][alto] == 1)) { //Si una de las casillas ya esta ocupada

repetido = true; //Variable booleana repetida en true

}

} else { //Si el barco va en vertical

int ancho = aRandom.nextInt(tablero.length); //Calculamos al azar la casilla
int alto = aRandom.nextInt(tablero[0].length - 2); //central del barco (tendra 3)

if ((tablero[ancho][alto - 1] == 1) || (tablero[ancho][alto] == 1) || (tablero[ancho][alto + 1] == 1)) { //Si una de las casillas ya esta ocupada

repetido = true; //Variable booleana repetida en true
}

}

} while (repetido == true); //Repetimos hasta que no haya una casilla ocupada (variable repetido = false)

if (horizontal == true) { //Si el barco va en horizontal

tablero[ancho - 1][alto] = 1;
tablero[ancho][alto] = 1; //Colocamos el barco en el tablero
tablero[ancho + 1][alto] = 1;


} else { //Si el barco va en vertical

tablero[ancho][alto - 1] = 1;
tablero[ancho][alto] = 1; //Colocamos el barco en el tablero
tablero[ancho][alto + 1] = 1;


}

return tablero; //Devolvemos el tablero con el barco colocado

}

}

El error es el mismo, ancho/alto/horizontal cannot be resolved to a variable. Esta marcado en negrita. El resto de clases estan bien.

Pd: No me apedreeis. Estoy empezando con java y el curso de programacion hace casi 1 año que lo hice (C y Delphi). Y desde entonces practicamente no he vuelto a hacer nada.


import java.util.Random;

public class DotComObjects {

public int[][] setBarcos(int tablero[][]) {

boolean repetido; //Variable booleana para comprobar si una casilla ya esta ocupada por otro barco
boolean horizontal;
int ancho;
int alto;
do {

repetido = false; //Suponesmos que no esta ocupada ninguna de las casillas
Random aRandom = new Random();
horizontal = aRandom.nextBoolean(); //Booleana al azar para la colocacion del barco. True = horizontal, false = vertical

if (horizontal == true) { //Si el barco va en horizontal

ancho = aRandom.nextInt(tablero.length - 2); //Calculamos al azar la casilla
alto = aRandom.nextInt(tablero[0].length); //central del barco (tendra 3)

if ((tablero[ancho - 1][alto] == 1) || (tablero[ancho][alto] == 1) || (tablero[ancho + 1][alto] == 1)) { //Si una de las casillas ya esta ocupada

repetido = true; //Variable booleana repetida en true

}

} else { //Si el barco va en vertical

ancho = aRandom.nextInt(tablero.length); //Calculamos al azar la casilla
alto = aRandom.nextInt(tablero[0].length - 2); //central del barco (tendra 3)

if ((tablero[ancho][alto - 1] == 1) || (tablero[ancho][alto] == 1) || (tablero[ancho][alto + 1] == 1)) { //Si una de las casillas ya esta ocupada

repetido = true; //Variable booleana repetida en true
}

}

} while (repetido == true); //Repetimos hasta que no haya una casilla ocupada (variable repetido = false)

if (horizontal == true) { //Si el barco va en horizontal

tablero[ancho - 1][alto] = 1;
tablero[ancho][alto] = 1; //Colocamos el barco en el tablero
tablero[ancho + 1][alto] = 1;

}
else { //Si el barco va en vertical

tablero[ancho][alto - 1] = 1;
tablero[ancho][alto] = 1; //Colocamos el barco en el tablero
tablero[ancho][alto + 1] = 1;

}

return tablero; //Devolvemos el tablero con el barco colocado

}

}


Hay lo tienes arreglado he visto algunos fallos de estructura, te comento:

Las variables a ser posible créalas al comienzo no las crees dentro de bucles, porque se puede dar el caso de que no se cumpla la condición del bucle y no entre y por lo tanto no se cree por eso te daba error más abajo ya que esas variables no existían.

Luego dentro del bucle defines ancho y alto dos veces, cuando digo defines me refiero al tipo.

Bueno hay te he puesto el codigo, una cosa nose si ya se ha comentado pero veo preferentemente poner los codigos en paginas como http://pastebin.com/ ya que mantienen la estructura del codigo y no aparece todo alineado a la izquierda si lo ponemos como spoiler lo que ahorra un poco de trabajo a la hora de limpiarlo.

Por ejemplo: http://pastebin.com/nDE4sF7q

Espero servirte de ayuda, Saludos.

PD: Veo que estas haciendo el hundir barquitos?, yo tengo uno hecho con interfaz gráfico ademas por si te interesa dímelo y te lo paso.
Buenas estoy creando un programa en java y estoy atascado en una tontería muy muy básica pero como lleve meses sin tocarlo pues no me acuerdo y no puedo avanzar...

Pues desde en el main creo 2 boolean y llamo a un método el cual me calcula 2 valores booleanos y quiero que se asocien a las variables del main.
EL problema es que si los intento pasar por referencia java no me deja ya que pasa por valor y por ende hace una clonación del valor y no lo devuelve.

Si las hago Globales las variables el main me da errores y tonterías de que no se puede referenciar dese un contexto estático algo no estático @_@

Esto mismo también me pasa si el método que intento llamar no es "Static void", es decir si es "boolean" el método al que llamo se queja también, y el main tiene que ser "Static void" ya que si no lo es me dice que no hay main el netbeans.
klausus escribió:Buenas estoy creando un programa en java y estoy atascado en una tontería muy muy básica pero como lleve meses sin tocarlo pues no me acuerdo y no puedo avanzar...

Pues desde en el main creo 2 boolean y llamo a un método el cual me calcula 2 valores booleanos y quiero que se asocien a las variables del main.
EL problema es que si los intento pasar por referencia java no me deja ya que pasa por valor y por ende hace una clonación del valor y no lo devuelve.

Si las hago Globales las variables el main me da errores y tonterías de que no se puede referenciar dese un contexto estático algo no estático @_@

Esto mismo también me pasa si el método que intento llamar no es "Static void", es decir si es "boolean" el método al que llamo se queja también, y el main tiene que ser "Static void" ya que si no lo es me dice que no hay main el netbeans.


Una opción que tienes es que a la función le pases un array de booleans y de ahi cojas los 2 valores.

También puedes hacer que las variables globales sean estáticas en vez de intentar convertir el main en no static. Quedaría así:

public static boolean b1;
public static boolean b2;
Me temo que no creo que funcione lo de hacer los bolean static...

package robot;

/**********************
*                     *
*   @author Klausus   *
*                     *
**********************/

import java.awt.Color;
import java.awt.Robot;
import java.awt.Rectangle;
import java.awt.Toolkit;

public class Main
{
    boolean Barra   = false;
    boolean Netbook = false;

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

    public void DetectarBarra() throws Exception
    {
        Robot R= new Robot();
        Rectangle area = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
        int Height = area.height-600;
        int Width  = area.width-1024;
        boolean Barra   = false;
        boolean Netbook = false;
       
        // Red (Windows Logo)
        Color WinR = R.getPixelColor(17,580 + Height);
        // Green (Windows Logo)
        Color WinG = R.getPixelColor(25,580 + Height);
        // Blue (Windows Logo)
        Color WinB = R.getPixelColor(15,587 + Height);
        // Yellow (Windows Logo)
        Color WinY = R.getPixelColor(22,590 + Height);
        // Clock Color
        Color Clock = R.getPixelColor(1020 + Width ,580 + Height);

        if (area.width == 1024 && area.height == 600)
            Netbook = true;
        else
            Netbook = false;
       
        if ( (WinR.getRed()  == 255 && WinR.getGreen()  == 173 && WinR.getBlue()  ==  98) &&
             (WinG.getRed()  == 143 && WinG.getGreen()  == 218 && WinG.getBlue()  ==  11) &&
             (WinB.getRed()  == 170 && WinB.getGreen()  == 191 && WinB.getBlue()  == 255) &&
             (WinY.getRed()  == 251 && WinY.getGreen()  == 202 && WinY.getBlue()  ==  11)  )
            Barra = true;
        else
            Barra = false;

        System.out.println("Barra: " + Barra + "  Netbook: " + Netbook);
        this.Barra   = Barra;
        this.Netbook = Netbook;

    }
}



Ahora mismo ese trozo de código no tiene ningún error en netbeans, pero claro el main no llama a nadani hace referencia a nada asi que el programa NO HACE NADA.

si en el main trato de llamar al metodo DetectarBarra() me da error y no me deja porque este no es static, si lo hago static no puedo usar el this.variable = variable de manera que no puedo cambiar el valor de las globales... Y asi es el pez que se muerde la cola....
O bien no puedo llamar al metodo o si puedo pero este no puede devolver nada.

Y claro aqui hay algo que no me cuadra porque no me creo que no pueda llamar un metodo no statico desde el main. O bien que si el metodo es statico no pueda devolver valores o cambiar valore globales.

La verdad esque he decidio hacerlo en java porque supuestamente seria mas facil debido a la clase robot pero esque java se queja por todo }:/
Y por que no llamas a DetectarBarra() en el constructor y en el main lo unico que haces es un new de la clase?
public class Main{
  public Main(){
    DetectarBarra();
  }

  public static void main(String[] args){
    Main m = new Main();
  }
}
Jonri escribió:Y por que no llamas a DetectarBarra() en el constructor y en el main lo unico que haces es un new de la clase?
public class Main{
  public Main(){
    DetectarBarra();
  }

  public static void main(String[] args){
    Main m = new Main();
  }
}


Con perdón por si me he perdido o algo pero... ¿Que sentido tiene hacer esto?
Osea no le veo el sentido el crear un ¿objeto? m de tipo Main (Lo cual es un constructor no??)... el cual hace una llamada a "DetectarBarra()"... no le veo sentido y ademas da error...

Quien me mandaria a mi dejar apartado el java ahora la cago en las cosas mas elementales @_@
Creas un objeto para poder usar las funciones no estáticas.

Por que tantos problemas para crear un objeto?
Jonri escribió:Creas un objeto para poder usar las funciones no estáticas.

Por que tantos problemas para crear un objeto?


Lo he conseguido como tu me indicabas me habia comido un "trows exception" en el contructor Main pero.... aunque funcione me parece un pelin chapucero.
No es chapucero hacerlo así, el problema esta ne pensar que es una tonteria de codigo, pero imaginate un programa mas grande en el que tu crearás la clase aparte y luego en el main crearas un objeto de esa clase, pues lo mismo.

De todas formas hay dos metodos que son util crearlos que son los SET y GET es decir para obtener un valor de una variable de instancia y para modificarlo.

Si te funciona ahora mismo pues perfecto, sino intentare encontrar otra solución y ya te digo siguiendo el codigo que has puesto antes, solo que ahora mismo tengo que instalar el eclipse, me pillas recien formateado.
Yo eclipse no he tocado me metieron netbeans y ahora no puedo cambiar de ide, manías serán...
Y si nosotros usábamos un getMethod y setMethod de tipo static void dentro del cual había algo en plan this.Variable = Variable (para el set) y un return Variable (para el get).

Pero desconozco el porque pero no me iba ni para atrás... Siempre quejandose de lo de que no puedo referenciar no statico desde statico @_@
Yo he probado netbeans, jbuilder, algun que otro más y eclipse y me quedo con ecplise, es mas lo recomiendo altamente el netbeans es la caña eso es cierto pero es muy pesado y consume tela, el eclipse es mas liviano y ofrece interesantes ayudas.

En cuanto a los metodos nose porque lo tienes que hacer de tipo static lo unico para que te sirve usar el static es para acceder a algun metodo sin tener que crearte un objeto de esa clase simplemente lo haces con el nombre de la clase.

Estoy instalando eclipse y te lo miro.

EDIT:

Bueno, he estado mirando un poco el codigo y lo que te pasa tiene sentido:

Tu has creado una clase llamada Main con dos variables de instancia barra y netbook, luego creas el método Detectar Barra el cual lo pones publico y no lo haces método de clase por lo cual necesitas tener un objeto de la clase Main para acceder al método o con el propio nombre de la clase ya que si en el método main pones una llamada a DetectarBarra(); este no sabe donde está por lo que para ello en el main tendrías que hacer lo siguiente:

public static void main(String[] args) throws Exception
{
Main m = new Main();
m.DetectarBarra();
//Main.DetectarBarra();
}

Yo creo que te has liado un poco con el nombre de las clases ya que si haces una clase llamada Main puede dar confusión con el método en cuestión, una cosa que no me ha quedado clara es porque tienes que hacer DetectarBarra de tipo static cuando haciéndola como método de objeto te da el mismo uso.


Vale acabo de leer tu problema inicial y no se donde te puede fallar yo haciendolo como te he dicho me funciona perfectamente:

http://pastebin.com/NqV9T166

Si te fijas el metodo DetectarBarra no lo he puesto de clase, y he creado dos metodos Set, luego en el main me creo un objeto de la clase Main, con lo cual puedo acceder a traves de el a DetectarBarra y a los metodos Set a los cuales les paso un valor booleano puede ser mediante variables o directamente poniendole el valor eso da igual.

Me he fijado que en el metodo DetectarBarra tenias esto: System.out.println("Barra: " + Barra + " Netbook: " + Netbook);
Con lo cual te mostraba el valor de las dos variables de ese método que se llaman igual que las variables de instancia esto es un error ya que puedes confundirte fácilmente, bueno el método en si no se que haces realmente porque siempre da false en las dos variables así que revisalo.

Bueno y un detalle mas xD, sorry por el toston de post:

Los metodos de clase o static solo te serviran para cuando quieras acceder a ellos sin tener que crearte el objeto y solo con el nombre de la Clase, tienes algunos ejemplos en la clase Math, y las variables static son esas variables de clase que son comunes a todos los objetos, cuando digo comunes me refiero a que su valor es el mismo en todos los objetos, te conviene saber cuando usar variables o metodos de clase y cuando de objeto.

Bueno espero averte servido de ayuda nose si entendí bien tu problema pero yo lo he visto así.
frekency escribió:Bueno este hilo no lo habia visto y me vendrá de perlas

Duqe escribió:Eso he leido en varios sitios ya. Lo global es tema tabu.

Editado:

Esto me da error:

import java.util.Random;

public class DotComObjects {

public int[][] setBarcos(int tablero[][]) {

boolean repetido; //Variable booleana para comprobar si una casilla ya esta ocupada por otro barco

do {

repetido = false; //Suponesmos que no esta ocupada ninguna de las casillas
Random aRandom = new Random();
boolean horizontal = aRandom.nextBoolean(); //Booleana al azar para la colocacion del barco. True = horizontal, false = vertical

if (horizontal == true) { //Si el barco va en horizontal

int ancho = aRandom.nextInt(tablero.length - 2); //Calculamos al azar la casilla
int alto = aRandom.nextInt(tablero[0].length); //central del barco (tendra 3)

if ((tablero[ancho - 1][alto] == 1) || (tablero[ancho][alto] == 1) || (tablero[ancho + 1][alto] == 1)) { //Si una de las casillas ya esta ocupada

repetido = true; //Variable booleana repetida en true

}

} else { //Si el barco va en vertical

int ancho = aRandom.nextInt(tablero.length); //Calculamos al azar la casilla
int alto = aRandom.nextInt(tablero[0].length - 2); //central del barco (tendra 3)

if ((tablero[ancho][alto - 1] == 1) || (tablero[ancho][alto] == 1) || (tablero[ancho][alto + 1] == 1)) { //Si una de las casillas ya esta ocupada

repetido = true; //Variable booleana repetida en true
}

}

} while (repetido == true); //Repetimos hasta que no haya una casilla ocupada (variable repetido = false)

if (horizontal == true) { //Si el barco va en horizontal

tablero[ancho - 1][alto] = 1;
tablero[ancho][alto] = 1; //Colocamos el barco en el tablero
tablero[ancho + 1][alto] = 1;


} else { //Si el barco va en vertical

tablero[ancho][alto - 1] = 1;
tablero[ancho][alto] = 1; //Colocamos el barco en el tablero
tablero[ancho][alto + 1] = 1;


}

return tablero; //Devolvemos el tablero con el barco colocado

}

}

El error es el mismo, ancho/alto/horizontal cannot be resolved to a variable. Esta marcado en negrita. El resto de clases estan bien.

Pd: No me apedreeis. Estoy empezando con java y el curso de programacion hace casi 1 año que lo hice (C y Delphi). Y desde entonces practicamente no he vuelto a hacer nada.


import java.util.Random;

public class DotComObjects {

public int[][] setBarcos(int tablero[][]) {

boolean repetido; //Variable booleana para comprobar si una casilla ya esta ocupada por otro barco
boolean horizontal;
int ancho;
int alto;
do {

repetido = false; //Suponesmos que no esta ocupada ninguna de las casillas
Random aRandom = new Random();
horizontal = aRandom.nextBoolean(); //Booleana al azar para la colocacion del barco. True = horizontal, false = vertical

if (horizontal == true) { //Si el barco va en horizontal

ancho = aRandom.nextInt(tablero.length - 2); //Calculamos al azar la casilla
alto = aRandom.nextInt(tablero[0].length); //central del barco (tendra 3)

if ((tablero[ancho - 1][alto] == 1) || (tablero[ancho][alto] == 1) || (tablero[ancho + 1][alto] == 1)) { //Si una de las casillas ya esta ocupada

repetido = true; //Variable booleana repetida en true

}

} else { //Si el barco va en vertical

ancho = aRandom.nextInt(tablero.length); //Calculamos al azar la casilla
alto = aRandom.nextInt(tablero[0].length - 2); //central del barco (tendra 3)

if ((tablero[ancho][alto - 1] == 1) || (tablero[ancho][alto] == 1) || (tablero[ancho][alto + 1] == 1)) { //Si una de las casillas ya esta ocupada

repetido = true; //Variable booleana repetida en true
}

}

} while (repetido == true); //Repetimos hasta que no haya una casilla ocupada (variable repetido = false)

if (horizontal == true) { //Si el barco va en horizontal

tablero[ancho - 1][alto] = 1;
tablero[ancho][alto] = 1; //Colocamos el barco en el tablero
tablero[ancho + 1][alto] = 1;

}
else { //Si el barco va en vertical

tablero[ancho][alto - 1] = 1;
tablero[ancho][alto] = 1; //Colocamos el barco en el tablero
tablero[ancho][alto + 1] = 1;

}

return tablero; //Devolvemos el tablero con el barco colocado

}

}


Hay lo tienes arreglado he visto algunos fallos de estructura, te comento:

Las variables a ser posible créalas al comienzo no las crees dentro de bucles, porque se puede dar el caso de que no se cumpla la condición del bucle y no entre y por lo tanto no se cree por eso te daba error más abajo ya que esas variables no existían.

Luego dentro del bucle defines ancho y alto dos veces, cuando digo defines me refiero al tipo.

Bueno hay te he puesto el codigo, una cosa nose si ya se ha comentado pero veo preferentemente poner los codigos en paginas como http://pastebin.com/ ya que mantienen la estructura del codigo y no aparece todo alineado a la izquierda si lo ponemos como spoiler lo que ahorra un poco de trabajo a la hora de limpiarlo.

Por ejemplo: http://pastebin.com/nDE4sF7q

Espero servirte de ayuda, Saludos.

PD: Veo que estas haciendo el hundir barquitos?, yo tengo uno hecho con interfaz gráfico ademas por si te interesa dímelo y te lo paso.

Muchas gracias por la ayuda. No sabia que las variables una vez finalizaba el bucle, desaparecian. No recuerdo si en C era igual, pero no me suena que nos explicasen eso.

De momento ya he conseguido que me cree los barcos. De 3 casillas solo. Y siempre dependiendo del nº de casillas que tenga el tablero (un 10% del tablero, por ejemplo, si es de 7 x 7, me crea 4 barcos, si es de 5 x 4, 2). Tambien me lo imprime en pantalla.

Pd: Pasamelo si. Aunque no he visto nada de graficos en java. Pero bueno, me puede servir para guiarme con este.

Pd 2: Gracias por los links. No sabia que habian webs para quotear este tipo de codigos. Lo tendre en cuenta para otras veces.

Editado:

Por cierto, se me olvidaba. Tenia otro fallo el codigo. Aqui:

ancho = aRandom.nextInt(tablero.length - 2); //Calculamos al azar la casilla

Tenia que ser asi:

ancho = (aRandom.nextInt(tablero.length - 2) + 1);

Si no le sumaba el + 1 ese, una parte del barco se me podia quedar fuera del tablero.
No es que te finalicen las variables sino que java cuando tu vas escribiendo te va interpretando lo que pones y cuando llego al punto despues del bucle no supo de donde eran esas variables porque calculo la posibildad de no entrar al bucle.

Te lo paso por privado, esta hecho en modelo vista controlador, de hay coges el modelo que es la parte no grafica, si tienes alguna duda me preguntas.

Eso si el programa de los barquitos requiere muchas variables y calculos asi que yo como mucho lo tengo para un barco de dos casillas xD
frekency escribió:No es que te finalicen las variables sino que java cuando tu vas escribiendo te va interpretando lo que pones y cuando llego al punto despues del bucle no supo de donde eran esas variables porque calculo la posibildad de no entrar al bucle.


No. Si que te "finalizan" las variables :P Ya en serio las variables tienen lo que en inglés se llama 'scope', que en español podemos traducir como 'ámbito'.

Si tu declaras una variable en un método, su ámbito es ese método y la variable es referenciable solo en ese método. Si la declaras en una clase, pues puedes usarla en toda la clase. PERO si la declaras dentro de un bucle, solo es usable dentro del bucle.

Ejemplo:

for (int i=0; i<10; i++) {
  System.out.println(i); //Esto compila, la variable 'i' es accesible dentro del bucle.
}

i = i +5; //Esto no compila


Si necesitas por lo que sea usar la variable del bucle dentro del bucle, puedes hacer:
int i;
for (i=0; i<10; i++) {
  System.out.println(i); //Esto compila, la variable 'i' es accesible dentro del bucle.
}

i = i +5; //Esto ya si compila, porque el scope de la variable es ahora el método completo y no solo el bucle
Si eso, añadire la palabra ambito a mi vocabulario xDD
Muchas gracias a los 2 por la explicacion.

Editado:

Tengo un problema absurdo con Eclipse. No se que he tocado que ahora al escribir, no me desplaza lo que ya hay escrito. Si no que es como si escribiese encima. Ademas el cursor ha pasado de ser un guion, a ser un rectangulo. Seguro que es una gilipollez, pero no se como lo he hecho. Recuerdo que cuando hice el curso de programacion me paso lo mismo, pero no recuerdo como lo solucione.
xD Pulsa la tecla Insert, le habras dado sin querer y se te pone en modo sobreescribir.

PD: No te preocupes nos ha pasado a todos.
int numBarcos = (int) (((ancho * alto) / 10) + 0.5);

Por que no me redondea? Por ejemplo, si ancho es igual a 7 y alto a 7 tambien, numBarcos valdria 4 y no 5. Deberia crear una variable float para guardar primero ese valor y luego pasarlo a integer?

Editado:

Por cierto, gracias otra vez por lo del insert. No dije nada pq si respondia en el hilo y luego me salia otra duda, tenia que editar el mensaje. Con lo cual no si alguien se daria cuenta.
Con tu instrucción: int numBarcos = (int) (((ancho * alto) / 10) + 0.5);

ancho = 7 y alto = 7

7 * 7 = 49 (entero)
49/10 = 4, ¿por qué? son enteros y un entero elimina toda la parte real del numero. Si quieres que esto sea 4.9, deberias transformar todo a double o float, y de este modo estariamos trabajando con numeros reales y no enteros. Por ejemplo:

double multiplicacion = (double)(ancho * alto);
multiplicación = multiplicación / 10.0 (cuidado con dividir con 10 a secas, es un entero no un real, si quieres mantener el real siempre ponle la parte real (.0) aunque sea un .0. Ahora tendriamos multiplicacion que es un numero real, 10.0 tambien es real por lo que el resultado es real, seria 4.9.

volviendo al ejemplo anterior...

4 (resultado de antes) + 0.5 = 4.....seguimos trabajando con enteros por lo que seguimos eliminando la parte real.

pasando todo a double (o float)....la división nos daría 4.9, sumando 0.5 tendriamos 5.4 y luego pasando a integer, quitamos lo real y nos quedamos con un 5.


No se si me he explicado mas o menos bien....si tienes alguna duda pregunta ;)
No estoy seguro pero al final consegui que diera 5.0 haciendo esto

double division = (double)(7*7)/10; //4.9
System.out.println(division);
double numBarcos = (int)(division+0.5); //5.4 // Redondeado 5.0
System.out.println(numBarcos);

Y con esto le quitaba el .0
int finalBarcos=(int) (numBarcos/1); // 5

Reconozco que esto me ha pillado por sorpresa, se que esto me salio una vez y lo solucione puede que de alguna forma mas facil con algun metodo o algo.
769 respuestas
14, 5, 6, 7, 816