Diario de un Aprendiz de Java

Wednesday, June 22, 2005

Convertir cadenas en enteros

A veces, necesitamos convertir una cadena que contenga cifras en un número. Por ejemplo, si pasamos un valor como parametro en tiempo de ejecución, y queremos operar con el, lo tendremos que transformar en entero. Para ello he escrito este código :

class Array {
  public static int stringToInt(String cadena) {
   int resultado = 0, x, longi = cadena.length();
   for(x = 0; x < longi; x++) {
    resultado += ( ((int) cadena.charAt(x)) - 48 ) * (Math.pow(10,longi - 1 - x));
   }
   return resultado;
  }

  public static void main(String[] args) {
   System.out.println(stringToInt(args[0]));
  }
}

Tuesday, June 21, 2005

Scaffolding

En el post anterior he publicado un código que implementa un método que duplica un array de enteros. Realmente he publicado una clase entera, que contiene el método citado, y el método main. Dentro del método main, he escrito un codigo que hace una prueba del método cloneArray, para comprobar que realmente funciona.

El código que escribes cuando estás desarrollando una aplicación, pero que realmente no tiene otra utilidad que la de asegurar al programador que su código hace lo que tiene que hacer, se llama código andamio (en inglés, scaffloding).

Por ejemplo, toda la clase main del código del otro post. O unas lineas de código que impriman el int que devuelve un método que acabas de hacer;

public static int sumarDosInts(int a, int b) {
  return a + b;
}

public static void main(String[] args) {
  //Código andamio
  System.out.println("El resultado tiene que ser siete : " + sumarDosInts(5,2));
}


El código andamio es una buena manera de asegurarse de hacer lo correcto, aunque algunas veces puede engañar. Seguro que muchos de vosotros lo usabais sin saber que se llamaba así, como yo :)

Jugando con arrays

Enunciado
As an exercise, qrite a method called cloneArray that takes an array of integers as parameter, creates a new array that is the same size, copies the elements from the first array into the new one, and then returns a reference to the new array.

Codigo
class Array {
  public static int[] cloneArray(int[] aCopiar) {
   int[] copiado = new int[aCopiar.length];
   for(int contador = aCopiar.length; contador > 0; contador --) {
    copiado[contador - 1] = aCopiar[contador - 1];
   }
   return copiado;
  }

  public static void main(String[] args) {
   int[] unArray = new int[4];
   unArray[0] = 12;
   unArray[1] = 24 / unArray[0];
   unArray[2] = unArray[1] * 3;
   unArray[3] = 5;
   int[] otroArrayIgual = cloneArray(unArray);
   System.out.println("Esto es igual a 5 ... " + otroArrayIgual[3]);
  }
}

Sunday, June 19, 2005

Glosario

Instancia : Un miembro de una clase. Todos los objetos son instancias.

Constructor : Un método especial que inicia las variables de instancia de un objeto recien creado.

Clase de arranque (startup class) : La clase que contiene el método main a partir del qual empieza el flujo de código.

Función : Un método cuyo resultado depende únicamente de sus parámetros, y no tien otro cometido que devolver un valor. Por ejemplo :
int suma(int a, int b) {
   return a + b;
}


Programación funcional : Estilo de programación en el que la mayoría de métodos son funciones.

Modificador : Método que cambia uno o más de los objetos que recibe como parámetros, y normalmente devuelve un void.

Método de relleno (fill-in method) : Un tipo de método que coge un objeto vacio como parámetro y "rellena" sus variables de instancia en lugar de generar un valor de retorno.

[*]Parte del glosario del tema 9 del líbro How to Think Like a Computer Scientist, Java Edition.

Thursday, June 16, 2005

Divine Law

Sigo leyendo el libro de Allen B. Downey, How to think like a Computer Scientist, y me encanta.
Se vé que el autor está muy rodado en el mundo de la enseñanza, y explica las cosas de forma muy clara y amena.
Me he reido a carcajada limpia con la clasificación que hace en el capítulo cuarto de tipos de convenciones usadas en los codigos fuente, que según él se clasifican en

· Ley divina (divine law). En este subgrupo se incluyen todos aquellos hechos que derivan de las matemáticas o la lógica, como que una comparación entre dos números iguales sea cierta (5 == 5). El ejemplo que el pone es que la suma es conmutativa. Todas las "leyes divinas" están presentes en todos los lenguajes de programación, no solo en Java.
· Normas de Java (rules of Java). Aquellas peculiaridades sintácticas y semánticas de Java frente a los otros lenguajes de programación, como que el símbolo '+' sirva para concatenar dos cadenas, además de para sumar dos números. O que la palabra reservada 'extends' sirva para indicar una herencia.
· Estilo y convención (style and convention). Todas esas "normas no escritas" que hacen el codigo entendible para el ojo humano. Por nombrar algunas, las convenciones a la hora de nombrar clases/variables/métodos, el uso del tabulador y/o espacios para hacer un código estructurado, etc ...

Personalmente creo que es una clasificación muy acertada. Además nos sirve para recordar, una vez más, que el codigo debe ser limpio y ordenado, en la medida de lo posible.

[OFFTOPIC] Nadie me ha comentado aún nada de las librerías 2D, y sigo más perdido que un pulpo en un garaje. En un foro me han hablado de AWT y SWING, pero si os digo la verdad, no me lo he mirado demasiado. ¿Alguna opinión?

Monday, June 13, 2005

Primero proyecto medianamente serio

Hola, mundo!
Después de dos semanas sin postear nada, ni dedicar el más mínimo resquicio de tiempo a aprender cosas nuevas de Java con la excusa de los examenes, vuelvo a las andadas, con más ganas que nunca (y con más tiempo, que también es un ingrediente esencial :D).

Para compensar todo el tiempo que he estado parado, me he propuesto hacer un pequeño programita con aspiración a ser considerado serio. Mi idea es buscar una libreria de gráficos 2D para Java, algo al estilo de OpenGL o SDL, para representar funciones.
Hasta aqui es bastante sencillo, se puede hacer sin aplicar nada de Programación Orientada a Objetos (de hecho tengo hecho algo muy parecido en C, usando la librería OpenGL). Pero ya que estoy, y ya que en definitiva lo hago para aprender, me gustaría añadir algunas funcionalidades que pudiera implementar usando clases, heréncia, y otras peculiaridades de la POO. Eso si, no haré un codigo complicado, intentaré factorizar lo máximo posible y hacer algo comentado, entendible, y ampliable.

Otro problema que se me presenta es como hacer que el usuario introduzca la función a representar. Siempre puedo usar alguno de los "lenguajes" matemáticos, tipo MathML, que se pueden parsear mediante varias librerías (como hizo un buen amigo mio, [SPAM]que con C++ se ha montado un buen programita, el KAlgebra, buscad información porque es muy interesante ;)[/SPAM]). Pero el problema es que el usuario debería conocer MathML, y eso no es lo que busco. Yo quiero hacer un programa que pueda usar cualquier persona con unos conocimientos matemáticos básicos (como que es una función :P).
Así que se aceptan sugerencias en cuanto a la entrada de la función por parte del usuario.
También pediría alguna recomendación en cuanto a librerías gráficas, que no tengo ni idea y me voy ahora mismo a ver si me informo un poco.

¡Saludos!