Programación, consulta sobre métodos.

Hola a todos y antes de nada gracias por leer este mensaje. Os cuento, estoy estudiando Java y quería saber para el que sepa de programación, si me puede responder a una pregunta creo que sencilla.

Estoy haciendo un programa básico que pide dos números y devuelve el mayor de ellos. Bien, está tirado si lo hago todo desde el método principal o si hago dos métodos (el principal que pide los numeros y otro método que los compara y devuelve el mayor de ellos a la función principal).

Pero en mi caso, quería hacerlo en tres métodos (cosa que a lo mejor es una tontería hacerlo), pero como lo desconozco lo planteo por aquí.
El primer método principal llama a los otros métodos, el segundo método pide los dos números al usuario y el tercer método los compara y los devuelve a la función principal.

Pongo el código que está mal, porque me dice que return no puede devolver dos valores en el método de pedirNumero. La verdad que no tengo ni idea de como se plantean este tipo de ejercicios para que quede el código limpio :(

import java.util.*;

public class MayorDeDosNumeros
{

   public static void main(String[] args)
   {
   pedirNumero();
   Comparacion();      
   }

   
   public int pedirNumero();
   {
   int numeroPrimero;
   int numeroSegundo;
   
   Scanner entrada = new Scanner(System.in);
   System.out.println("Escriba el primer número: ");
   numeroPrimero = entrada.nextInt();
        System.out.println("Escriba el segundo número: ");
   numeroSegundo = entrada.nextInt();
   return numeroPrimero,numeroSegundo;
   }


   public int Comparacion(int x, int y)
   {
   if (numeroPrimero > numeroSegundo)
   return numeroPrimero;
   else
   return numeroSegundo;
   }   


}


Muchas gracias por anticipado.
Hola,
Sin saber Java, el error es que estás definiendo el método PedirNúmero para que devuelva un único int y luego, dentro del método, haces que intente devolver 2. Para solucionar este caso podrías hacer dos cosas:

1.- Definir la función para que devuelva un array con dos int
2.- Llamar al método 2 veces, uno para que te pida el primer número y otra vez para que te pida el segundo

Para el tema del código límpio, personalmente te diría que va a gustos y mi gusto es llamar al método 2 veces.

PD: Recordando que no sé Java, ¿el método comparación te compila correctamente?

¡Saludos!
Buenas...

A ver, lo primero unos consejillos:
-Los nombres de los métodos deben empezar siempre por minúscula.
-Acostumbrate a usar siempre { llaves } con if, for, etc INCLUSO SI NO ES NECESARIO.
-No se si ha sido al postearlo, pero la indentación está mal. Si usas Eclipse, haz Ctrl-A (seleccionar todo) seguido de Ctrl-I (indentar) para que te ponga bien los espacios, tabulaciones, etc.

Dicho esto, vamos al meollo.

Java no permite que un método devuelva mas de un objeto. Como argumentos de entrada puedes poner todos los que quieras, pero de salida solo puede haber un objeto. En tu caso como bien dice elgromer, la solución sería devolver un array de enteros.

Luego, tienes otros 4 errores (que yo haya visto):
-El primero es que llamas al método pedirNumero pero no haces nada con los datos de salida.
-El 2º es que llamas a "comparación" sin pasarle argumentos de entrada.
-Te sobra un ; en el método pedirNumero.
-En comparacion llamas a los argumentos 'x' e 'y' pero luego intentas usar 'numeroPrimero' y 'numeroSegundo'

Lo correcto sería:

    import java.util.*;

    public class MayorDeDosNumeros
    {

       public static void main(String[] args)
       {
         int[] numeros = pedirNumero();
         int resultado = comparacion(numeros[0], numeros[1]);
         //Tb puedes cambiar el comparacion para que tome como dato de entrada un array
         System.out.println("El resultado es: " + resultado);
       }

       
       public int[] pedirNumero()
       {
       int[] numeros = new int[2];
       
       Scanner entrada = new Scanner(System.in);
       System.out.println("Escriba el primer número: ");
       numeros[0] = entrada.nextInt();
       System.out.println("Escriba el segundo número: ");
       numeros[1] = entrada.nextInt();

       return numeros;
       }


       public int comparacion(int numeroPrimero , int numeroSegundo)
       {
         if (numeroPrimero > numeroSegundo) {
           return numeroPrimero;
         } else {
           return numeroSegundo;
         }
       }   


    }


Por cierto que tus fallos me dicen que no estás usando ningún IDE. ¿Estas programando a pelo en el bloc de notas o qué? Yo personalmente te recomiendo que uses Eclipse. Hay otros IDE, pero para Java el más usado (por buenos motivos) es Eclipse. Si vas al página de downloads http://www.eclipse.org/downloads/ veras que hay un montón de "paquetes" que incluyen diversas funcionalidades. El "normal" que se baja tol mundo es el "Eclipse IDE for Java EE Developers" que tiene lo básico de Java más otras cuentas cosas.
Gracias por vuestras respuestas, sois muy amables.

La verdad que esto de los métodos se me hace bastante lioso, nunca se como hacerlo. Todo lo demás lo llevo... pero esto que es parte fundamental, no es lo mío. Tendré que practicar a base de ejercicios para tontos (aunque este ya de por sí lo es).

redscare, te agradezco que te hayas tomado la molestia de darme esos sabios consejos y de corregir mi código. De todas formas, tú código también me da errores.
Si esto es un lío no me quiero imaginar cuando un programa tenga 200 líneas XD

elgromer, mi método de comparación también daba error, según he podido comprobar ;)
Flanders escribió:redscare, te agradezco que te hayas tomado la molestia de darme esos sabios consejos y de corregir mi código. De todas formas, tú código también me da errores.
Si esto es un lío no me quiero imaginar cuando un programa tenga 200 líneas XD


Que fuerte que te metas con mi código :P (es broma). Pa que no se diga, lo he metido en el eclipse y he corregido los DOS (que no 7) fallos que me quedaban. Lo siguiente es weno weno weno y si no compila avisa que voy a meterle dos yoyas a tu compilador [carcajad] (Si no te compila ponnos los mensajes de error, que yo lo he probado y va guay).

import java.util.Scanner;


public class MayorDeDosNumeros
{

   public static void main(String[] args)
   {
      int[] numeros = pedirNumero();
      int resultado = comparacion(numeros[0], numeros[1]);
      //Tb puedes cambiar el comparacion para que tome como dato de entrada un array
      System.out.println("El resultado es: " + resultado);
   }


   public static int[] pedirNumero(){
      int[] numeros = new int[2];

      Scanner entrada = new Scanner(System.in);
      System.out.println("Escriba el primer número: ");
      numeros[0] = entrada.nextInt();
      System.out.println("Escriba el segundo número: ");
      numeros[1] = entrada.nextInt();

      return numeros;
   }


   public static int comparacion(int numeroPrimero , int numeroSegundo)
   {
      if (numeroPrimero > numeroSegundo) {
         return numeroPrimero;
      } else {
         return numeroSegundo;
      }
   }   
}
Perdón puse 7, pero corregí rápidamente, que era un problema en que el nombre de la clase no coincidía con el nombre del archivo OOPPS XD

Tú código funciona y es genial, eres una maquina ;) aunque ahora si que me he perdido del todo :p
Tendré que ponerme a analizar tu código, sobre todo porque esto no lo he visto en mi vida:
int[] numeros = new int[2];

Declaras una matriz llamada numeros de tipo entero(sin definir el número de elementos que tendrá) y luego le das el valor de un array de dos elementos enteros? Buffff, esto es demasiado para mí [buuuaaaa]

Muchas gracias por tu ayuda y sapiencia ;)
Flanders escribió:
int[] numeros = new int[2];

Declaras una matriz llamada numeros de tipo entero(sin definir el número de elementos que tendrá) y luego le das el valor de un array de dos elementos enteros?

Correcto. Defines y creas.

Yo como IDE recomiendo utilizar Netbeans, me gusta más que Eclipse personalmente.
Yo como IDE recomiendo utilizar Netbeans, me gusta más que Eclipse personalmente.

A mi también me gusta más Netbeans, pero en los trabajos parece que se pide Eclipse casi siempre.

Por cierto, que mañana sale Eclipse Helio, aunque creo que ya está para descargar por algún sitio.
rintin escribió:
Flanders escribió:
int[] numeros = new int[2];

Declaras una matriz llamada numeros de tipo entero(sin definir el número de elementos que tendrá) y luego le das el valor de un array de dos elementos enteros?

Correcto. Defines y creas.

Yo como IDE recomiendo utilizar Netbeans, me gusta más que Eclipse personalmente.


Yo he usado los 2 y me quedo con el Eclipse... salvo que vayas a usar Glassfish de servidor (que se integra automáticamente en el Netbeans). El Netbeans es mucho más pesado y si no tienes un maquinón va como el culo. A mi me iba lento en un E8400 con 4GB de RAM (el equipo de mi firma), mientras que el Eclipse con un Pentium IV y 2GB de RAM va mu bien. Aunque también puede ser que yo estaba usando el Netbeans con un cojón y medio de movidas extra (por necesidad, no por gusto :P ).

Respecto a lo de
int[] numeros = new int[2];


En Java hay dos formas de declarar arrays (nadie los llama por el nombre castellano "matrices").

Una es la forma explícita, en la que indicas los valores que va a contener el array:
int[] numeros = new int[] { 1, 4, 5 };

Esto te crea un array unidimensional de tamaño 3, que contiene enteros con los valores 1, 4 y 5.

La otra forma es decir el tamaño que va a tener el array, para luego rellenarlo más adelante:
int[] numeros = new int[2];

Esto te crear un array unidimensional de tamaño dos, con los valores 'null' y 'null'.

Para leer/escribir en un array, le indicas la posición. Si quieres leer el valor haces:

int primerNumero = numeros[0];
int segundoNumero = numeros[1];

O bien, si quieres escribir en el array:

numeros[0] = 5;
numeros[1] = 7;

IMPORTANTE: La primera posición de un array (y de cualquier objeto contenedor en general) es siempre 0. Un arrray de tamaño DOS tendrá dos valores: El primero en la posición CERO, y el segundo en la posición UNO. Esto cuando eres novato lía un poco al principio si no te lo explican.


Luego efectivamente también hay matrices propiamente dichas, que son arrays con más de una dimensión.
Son en plan

int[][] numeros = { { 10, 11, 12, 13 }, { 20, 21, 22, 23 }, { 30, 31, 32, 33 } };
int[][] numeros = new int[3][4]; //No estoy seguro de si es [3][4] o [4][3];

Y para acceder a los valores individuales, pues es igual que con un array unidimensional:

int primerNumero = numeros[0][0];

En 5 años de experiencia laboral en java NUNCA JAMAS he tenido que usar un array multidimensional. La única vez que he tenido que usar uno ha sido en alguna práctica en la universidad que te obligaba a usar uno, así que no te comas la cabeza con eso.

Espero haberte ayudado y no haberte liado más todavía [+risas]
redscare pedazo de explicación XD, te explicas mejor que mi libro de Java :) Todo clarito.

Tengo que ponerme a practicar con los métodos y con los arrays. Lo que me sucede a veces es que no se cuando usar las cosas y lo hago más por prueba/ensayo/error que porque realmente sepa muy bien si lo que estoy haciendo va a servir de algo.
Voy a tener que ponerme en el cuaderno a realizar los pseudocódigos antes de introducir el código real.

Por ejemplo, ahora me he puesto a hacer un ejercicio que pensaba que era fácil, pero luego me he puesto a hacerlo y la idea que tenía mentalmente no me ha funcionado y entonces me deprimo y se me cae el pelo :(

Espero no volver por este Hilo, de momento no voy a volver a preguntar hasta que no tenga más remedio.

Gracias, miles de gracias.
Flanders escribió:Voy a tener que ponerme en el cuaderno a realizar los pseudocódigos antes de introducir el código real.

Por ejemplo, ahora me he puesto a hacer un ejercicio que pensaba que era fácil, pero luego me he puesto a hacerlo y la idea que tenía mentalmente no me ha funcionado y entonces me deprimo y se me cae el pelo :(


Aunque decías que igual no volvías por aquí en una temporada, te comento.

Yo personalmente NO recomiendo en absoluto programar en pseudo-código en un cuaderno. Me parece una pérdida de tiempo total y absoluta.

Lo que si que funciona (al menos a mi) es DIVIDIR EL PROBLEMA EN PEQUEÑOS SUBPROBLEMAS. Por ejemplo, supongamos que tienes que hacer un programa que a partir de un fichero tienes que realizar una serie de cálculos, invocar a otra aplicación externa y generar otro fichero. Todo eso junto es algo bastante complejo, y si intentas hacerlo todo de golpe es normal que como tu dices, te "deprimas" :P

Ahora bien. Si cojes y antes de hacer nada ANALIZAS Y DIVIDES el problema, verás que puedes dividir tu programa en una serie de módulos:
-El que lee el fichero de disco
-El que con el fichero ya convertido en Strings o similar, analiza la información del mismo
-El que hace los cálculos a partir de la información
-El que llama a la aplicación externa
-El que genera un nuevo fichero

Con el problema ya dividido es mucho más fácil programar y probar cada módulo por separado. Por ejemplo, para el módulo que hace unos cálculos puedes empezar haciendo un método que simplemente te devuelva un valor:

public double hacerCalculos() {
  return 123.45
}


Con esa simple chorrada ya puedes seguir haciendo cosas aunque los cálculos aún no sean los buenos. Con el módulo que lee el fichero puedes hacer lo mismo y que devuelva un String con el contenido que te interese. Así puedes ir haciendo tus programas de forma incremental.

Y ante la duda, no te cortes y haz una clase nueva. LeerFichero.java, Calculos.java, etc. Así si tienes que hacer cambios, dichos cambios están mucho más localizados y es más fácil trabajar.
Pues sí, tienes toda la razón en lo que dices. Lo del pseudocodigo yo tampoco lo solía utilizar, pero a veces lo veo más claro dibujando en el papel y poniendo en "practica" lo que piensas que haciendolo mentalmente.
Por ejemplo, imaginate que tienes cinco variables, yo al menos mentalmente no puedo controlarlas y saber su valor cuando pasen por cierto código del programa. Pero si en un papel me creo una especie de pseudocodigo churrero y al lado escribo el valor de las variables, pues lo veo algo mejor.
Cierto es que también puedo controlar el valor de las variables poniendo puntos de ruptura en el código.

Lo que tengo claro es que tú que se ve que llevas varios años programando, lees el enunciado y mentalmente ya ves la solución y lo ves clarísimo. Yo eso habilidad no la tengo y tenía un profesor que me decía que la programación o la ves o no la ves, y el que no la ve mejor que se dedique a otra cosa :(

De todas formas, me ha gustado eso de crearme varios ficheros con las clases divididas y poder comprobar mejor donde me equivoco.

Al final solucioné el ejercicio, era fácil. Desde luego me costará un tiempo coger nivel y seguro que tengo que preguntar algo más por aquí.

Gracias redscare.
Como regla general, si tu programa es un follón de variables que no te aclaras ni tu mismo, es que no lo has estructurado bien. Obviamente la experiencia es un grado, pero si te encuentras con cosas como bucles (for, while, do-while...) anidados, o un bucle con un montón if-else metidos dentro, o un montón de ifs anidados... todo eso son señales clarísimas de que el código está mal estructurado y que estás tratando de hacer demasiadas cosas a la vez en el mismo método. Y cuando digo un montón me refiero a "3 o más".

Cuando te encuentres con una estructura que te cuesta seguir, párate y piensa como separar lo que estés haciendo en partes más pequeñas (varios métodos/clases).

En general, hoy en día que la potencia de computación rara vez es un problema, el código debe ser legible y comprensible antes que eficiente. Sobre todo porque el 95% de las veces el código que tu hagas en un proyecto, va a llegar un tío dentro de x meses cuando tu igual ya ni estés que va a tener que modificar ese código porque se ha encontrado un bug, o hay que añadirle una funcionalidad nueva. Y ese tío se va a acordar de todo tu árbol genealógico como no hayas hecho un código claro y legible, con comentarios a punta pala.

De todas formas la habilidad de programar no es ver la solución clarísima en un instante (eso se lo dejamos a los gurús). La habilidad está en hacer un código limpio, elegante y bien estructurado. Que eso te cueste 20min de pensar o te cueste 2h no es importante. Lo importante es que el resultado sea bueno, la velocidad se va cogiendo con la experiencia.

Lo que si que es cierto es que hay gente con años de experiencia que sigue haciendo un código que dan ganas de arrancarte los ojos cuando lo ves porque no tienen la cabeza amueblada y estructurada para programar. Y eso si que es verdad que o lo tienes o no lo tienes. Esa es la gente que pasa rápidamente de "programador" a "analista de negocio", para alivio de todos los implicados xDDD

Ah, y otro consejo: Hasta tener la versión final, NUNCA BORRES NADA QUE HAYAS PROGRAMADO. Es muy típico decir "este método no funciona bien", borrarlo y rehacerlo entero para luego descubrir que el problema realmente era otro y que el método original (o al menos parte) era bueno y tener que reescribirlo otra vez. Ante la duda, comenta el método entero, o haz copy-paste de la clase entera a otra carpeta, de forma que siempre puedas volver atrás.
12 respuestas