Mirando se Aprende.......... (Ejemplos Java)

Iniciado por alvk4r, 29 Junio 2007, 15:42 PM

0 Miembros y 2 Visitantes están viendo este tema.

alvk4r

Bueno... amigos... creanme, yo he aprendido un monton compilando codigos de aqui y alla, y luego observando el comportamiento del programa o pasandolo el depurador.......

Debido a que me he enfrascado en un proyecto serio con Java (buscando la forma de implementar este lenguaje en las escuelas de nivel medio y superior relacionadas a la informatica)... he ido elaborando algunos ejercicios y ejemplos....

Por ahora solo les traigo un ejemplo....

Comprobar si un numero dado es primo.


Código (java) [Seleccionar]
//Descripcion: Programa  que permite comprobar si un numero dado es primo.           
//Autor: alvk4r                                                                                                                   
//Uso: java PrimeCheck [numero]
import java.lang.*;

public class PrimeCheck {
  public static void main(String[] args) {
    int N = Integer.parseInt(args[0]);
    int mod, i = 0;
    int[] primes = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,
      73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,
      173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,
      271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,
      383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,
      491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,
      613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,
      733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,
      857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,
      983,991,997,1009,1013,1019,1021,1031,1033,1039,1049,1051,1061,1063,1069,
      1087,1091,1093,1097,1103,1109,1117,1123,1129,1151,1153,1163,1171,1181,
      1187,1193,1201,1213,1217,1223,1229,1231,1237,1249,1259,1277,1279,1283,
      1289,1291,1297,1301,1303,1307,1319,1321,1327,1361,1367,1373,1381,1399,
      1409,1423,1427,1429,1433,1439,1447,1451,1453,1459,1471,1481,1483,1487,
      1489,1493,1499,1511,1523,1531,1543,1549,1553,1559,1567,1571,1579,1583,
      1597,1601,1607,1609,1613,1619,1621,1627,1637,1657,1663,1667,1669,1693,
      1697,1699,1709,1721,1723,1733,1741,1747,1753,1759,1777,1783,1787,1789,
      1801,1811,1823,1831,1847,1861,1867,1871,1873,1877,1879,1889,1901,1907,
      1913,1931,1933,1949,1951,1973,1979,1987,1993,1997,1999};
    boolean ver = true;
   
    while ((i <= 303) && (primes[i] < N)) {
      mod = N % primes[i];
      if (mod == 0) {
        ver = false;
        break;
      }
      i++;
    }
   
    if (ver == false){
    System.out.println("El numero " + N + " es divisible por " + primes[i]);
    System.out.println("El numero " + N + " no es primo.");
    }
    else
      System.out.println("El numero " + N + " probablemente sea primo.");
  }
}



Mas adelante le implementare el metodo Rabin-Miller, para poder estar mucho mas seguros si el numero es primo o no. Pero bueno, este metodo no me parece mal para empezar, puesto que cerca del 98,5% de los numeros no primos son divisibles por algun numero primo menor que 2000. Aunque da errores con algunos numeros, aun no se por que razon, estos son los menos.

Por si alguien tiene dudas de su funcionamiento este es un ejemplo de como ejecutarlo:

java PrimeCheck 23543
El poder corrompe, el poder absoluto corrompe absolutamente.

alvk4r

#1
Estoy elaborando un programa (para mostrar a los alumnos un fin practico de la programacion, aplicado a su entorno) que permita graficar funciones...

Anoche antes de acostarme elabore lo que crei mas necesario hacer primero:
El papel donde debujare los sistemas:

Código (java) [Seleccionar]

//Descripcion: Dibuja una ventana cuadriculada, que pienso usar mas adelante para desarrollar un Sistema de Coordenadas.
//Autor: alvk4r

import javax.swing.*;
import java.awt.*;

public class SquaredPaper extends JFrame {
  public void paint(Graphics g) {
    Dimension d = getSize();
    int x = d.width;
    int y = d.height;
   
    g.setColor(Color.yellow);
    g.fillRect(0,0,x,y);
   
    g.setColor(Color.green);
    for (int i = 0; i < y; i+=25) g.drawLine(0,i,x,i);
    for (int i = 0; i < x; i+=25) g.drawLine(i,0,i,y);
   
    g.setColor(Color.red);
    g.drawLine(x/2,0,x/2,y);
    g.drawLine(0,y/2,x,y/2);
  }

  public static void main(String args[]) {
    SquaredPaper DrawWindow = new SquaredPaper();
   
    DrawWindow.setSize(500,500);
    DrawWindow.setResizable(false);
    DrawWindow.setLocation(200, 50);
    DrawWindow.setTitle("Sistema de Coordenadas Cartesianas.");
    DrawWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    DrawWindow.setVisible(true);
   
  }
}


Normalmente me gusta hacer las aplicaciones graficas ejecutables  (tipo *.exe) y por ello las empaqueto en jar... por si alguien duda como hacerlo, aca le dejo el procedimiento.

Procedimiento para crear el JAR.

> jar cvfe SquaredPaper.jar SquaredPaper SquaredPaper.class


Por supuesto, primero debemos compilar el fichero.
La opcion e permite definir el Main-Class para el manifest, y asi logramos que nuestra aplicacion sea "clickeable". En este caso el Main-Class es SquaredPaper, que com ven lo paso en la segunda orden, antes de decir que empaquete el *.class.

Espero que a alguien le sirva de algo...
El poder corrompe, el poder absoluto corrompe absolutamente.

alvk4r

#2
Código (java) [Seleccionar]
import javax.swing.*;
//Descripcion: Dibuja graficos en una ventana.
//Autor: alvk4r
import java.awt.*;

public class GraphicsDrawWindow extends JComponent {
  public void paint(Graphics g){
    g.setColor(Color.red);
    g.drawString("Esto es una linea:",10,20);
    g.drawLine(10,30,200,30);
    g.drawString("Esto es un rectangulo:",10,60);
    g.drawRect(10,70,190,100);
    g.drawString("Esto es una curva",10,200);
    g.drawArc(10,210,190,100,0,180);
  }
  public static void main(String args[]) {
    JFrame DrawWindow = new JFrame("Sample Window");
    DrawWindow.getContentPane().add(new GraphicsDrawWindow());
    DrawWindow.setSize(220,310);
    DrawWindow.setLocation(100, 150);
    DrawWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    DrawWindow.setVisible(true);
   
  }
}

Otro ejemplito mas... lamento si no comento el codigo.... normalmente no tengo tiempo y soy bastante holgazan en este sentido, excepto cuando desarrollo alguna aplicacion para la empresa, aplicacion que comunmente debo entragar a otros uysuarios y/o desarrolladores.
Puedo aconsejarles compilar los ejemplos, ejecutarlos y tener el apidoc a mano para dudas y consultas........
Como pueden ver tambien estoy dibujando en una ventana, aunque el metodo es difrenta a la aplicacion del papel cuadriculado (SquaredPaper).
El poder corrompe, el poder absoluto corrompe absolutamente.

alvk4r

jejjeje, recien acabo de ver un post sacado del cajon por egyware (imaginen que es del a~o 2004, que hablaba de un tio que se bajo un codigo de una web, y no sabia que hacer con el...)

Bueno, eso me decidio a poner otro ejemplo, que si bien no es nada del otro mundo, le ense~ara a los novatos como implementar Java en sus Webs.

Sin extenderme mucho, solo digo que la tecnologia Java que se usa para esto es los Applet, tambien estan los Servlets, que pueden ser servidos con el Tomcat y otros servidores de aplicaciones Java, pero bueno, como el caso que me ocupa son los applets.... alla voy. El ejemplo es una adaptacion hecha del programa GraphicsDrawWindow, que ya expuse antes. Solo que en ves de dibujar en una ventana, dibujaremos en el navegador....

Código (java) [Seleccionar]

import java.applet.Applet;
import java.awt.Graphics;

public class GraphicsDrawApplet extends Applet{
  public void paint(Graphics g){
    g.drawString("Esto es una linea:",10,20);
    g.drawLine(10,30,200,30);
    g.drawString("Esto es un rectangulo:",10,60);
    g.drawRect(10,70,190,100);
    g.drawString("Esto es una curva",10,200);
    g.drawArc(10,210,190,100,0,180);
  }
}


Compilamos la aplicacion y luego hacemos una pagina web que la cargue, sin tantos rodeos, sencillamente, este puede ser el codigo de la pagina:
Código (html4strict) [Seleccionar]

<applet code="GraphicsDrawApplet.class" width="400" height="400" />


Ahh, y atendiendo la solicitud de un mensaje privado... no voy a revelar la fuente... :D aclaro que considero innecesario escribir el nombre del fichero, ya que este es el mismo que la clase publica...
En este caso, si digo que la clase publica es GraphicsDrawApplet, es logico que el fichero se llama GraphicsDrawApplet.java

Salud y a seguir trabajando.
El poder corrompe, el poder absoluto corrompe absolutamente.

marioly

Estoy deacuerdo que viendo codigos es una muy buena forma de aprender :) , aunque .. se podrian depurar un poco mas :P , por ejemplo el de los numeros primos, existen formas de determinar si es primo de una manera.. digamos un poco mas "matematica" , partiendo de la idea de que un numero primo es divisible  per se y su unidad :)

egyware

#5
yo aprendi asi programando codigos o ejemplos y cambiando algunos numeros y supe para que servia, es la mejor forma de aprender creo yo
pero que hice yo ni me acuerdo!!! :(



PD: sinceramente que post levante que hice ???

alvk4r

#6
Vaya, vaya marioly, me estas molestando, ya vi que sucedio con CasiDiablo en un post del 17 de junio. Haces aportes ademas de criticas? Metodos Matematicos no??? No sabes matematicas? A mi me parece que no, si supieras, sabes que ya ando implementandole el metodo de Rabin-Miller.... RABIN-MILLER, sabes lo ques es?
Bueno, no obstante, el metodo que implemente, que a tu vista resalta como poco matematico, es en realidad un axioma, y bastante matematico por cierto. :P

El objetivo del ejemplo es  ense~ar a los usuarios las utilidades de un array, y como se le pueden pasar argumentos a un programa (no teoria de los numeros).... y encontrando numeros primos, funciona, por suspuesto, como eres tan amante de las matematicas, aca te voy a publicar el metodo Rabin-Miller para que lo veas:

Sea p el numero es decir, 2b es la mayor potencia de 2 que divide a (p - 1). Calculamos entonces m, tal-que
que queremos saber si es primo. Se calcula b, siendo b el numero de veces que 2 divide a (p-1):

p = 1 + 2b m.

1. Escoger un numero aleatorio a < p.

2. Sea j = 0 y z = am(mod p).

3. Si z = 1, o z = p - 1, entonces p pasa el test y puede ser primo.
4. Si j > 0 y z = 1, p no es primo.

5. Sea j = j + 1. Si j = b y z = p - 1, p no es primo.
6. Si j < b y z = p - 1, z = z2(mod p). Volver al paso (4).
7. Si j < b y z = p - 1, entonces p pasa el test y puede ser primo.
8. p no es primo.



La probabilidad de que un numero compuesto pase este algoritmo para un numero a es del
25%.

Existen otros metodos como el de Lehmann, pero el de Rabin-Miller es de los mas efectivos y faciles de implementar....

Ahh, como casidiablo, solo tengo Internet en el trabajo, y el tiempo que dedico a postear en el foro esta fuera de las cosas autorizadas.... y como en casa debo hacer otras cosas, pues ya ves... no he tenido tiempo de implementar el algoritmo al programa....

Que tal si lo haces tu marioly? Estoy seguro que te lo agradecerian....

Ahh, tambien soy amante de un codigo limpio, pero no tengo mucho tiempo a veces para simplificar mas de lo que lo hice a la hora que concebi el programa, si esta hecho y funciona, ya esta.... aunque bueno, en algo te doy la razon, pues un codigo supercargado tiende a crear confusiones en su lectura.... no obstante te lo vuelvo a aclarar, mi objetivo es que mis alumnos vean el uso de los arrays, las estructuras for e if y no que aprendan TEORIA DE LOS NUMEROS.

Podrias conservar el metodo que ya esta escrito, y a~adirle el test de Rabin-Miller, asi obtendrias una probabilidad de que el analisis del programa sea correcto, de mas de un 98%.

A los interesados en el tema, les recomiendo hechar un vistazo al libro  Criptografia y Seguridad en Computadores[/url] de Manuel J. Lucena Lopez.
Este es l enlace para descargarlo: http://www.themalia.es/admin/img/documentos/200506281022060.Criptografia.pdf
El poder corrompe, el poder absoluto corrompe absolutamente.

alvk4r

#7
En respuesta a un post de darkxxx (http://foro.elhacker.net/index.php/topic,170280.0.html):
Ejemplo de uso de arrays multidimensionales en Java. El programa suma las filas e imprime los resultados de una matriz de 3x3.

Código (java) [Seleccionar]

//Descripcion: Suma las filas de una matrix de 3x3, devolviendo el valor de cada fila.
//Autor: alvk4r
public class sumArray {
  public static void main(String[] args) {
    int[][] myMatrix = new int[][] {{5,4,2}, {3,4,8}, {3,7,3}};
    int fila1, fila2, fila3;
 
    fila1 = myMatrix [0][0] + myMatrix [0][1] + myMatrix [0][2];
    fila2 = myMatrix [1][0] + myMatrix [1][1] + myMatrix [1][2];
    fila3 = myMatrix [2][0] + myMatrix [2][1] + myMatrix [2][2];
 
    System.out.println("La fila 1 suma: " + fila1);
    System.out.println("La fila 2 suma: " + fila2);
    System.out.println("La fila 3 suma: " + fila3);
  }
}


Bueno, solo queria aclarar que Java no soporta arrays multidimensionales, pero se obtiene la misma funcionalidad haciendo un array de un array, que fue lo que hice...

Esta es  otra variante, usando un bucle, en cuanto tenga un chance hago uno al que podamos pasarle los valores del Array desde la consola. Estoy tratando de implementar un bucle para la suma de los valores........ por ahora solo para imprimirlos, y sustitui para ello las tres variables por un array....

Código (java) [Seleccionar]

public class SumRowArrayI {
  public static void main (String[] args) {
    int[][] myArray = {{2,4,5}, {2,3,4,}, {9,7,3}};
    int[] row = {
      myArray[0][0] + myArray[0][1] + myArray[0][2],
      myArray[1][0] + myArray[1][1] + myArray[1][2],
      myArray[2][0] + myArray[2][1] + myArray[2][2],
    };
    for (int i = 0; i < row.length; i++)
      System.out.println("El valor de la fila " + i + " es: " + row[i]);
  }
}
El poder corrompe, el poder absoluto corrompe absolutamente.

alvk4r

#8
Cielos!!! me siento un poco corrido, no acostumbro a hablarle asi a una dama, lo siento marioly, pero solo te pido que seas mas cuidadosa con tus criticas..........

Código (java) [Seleccionar]

public class Primes
  {
    public static void main(String[] args)
      { int N = Integer.parseInt(args[0]);
        boolean[] a = new boolean[N];
        for (int i = 2; i < N; i++) a[i] = true;
        for (int i = 2; i < N; i++)
          if (a[i] != false)
            for (int j = i; j*i < N; j++)
              a[i*j] = false;
        for (int i = 2; i < N; i++)
          if (i > N - 2000)
            if (a[i]) System.out.print(" " + i);
        System.out.println();
      }
  }


Claro, podemos unir este codigo con el de PrimeCheck, y guardar la salida en el Array, pero el hecho de tener que estar generando el array, cada vez que uso el programa, lo considero como innecesario, lo genero una vez y ya....
El poder corrompe, el poder absoluto corrompe absolutamente.

alvk4r

Supongamos que tenemos un array de datos int, y que queremos ordenarlos de forma ascendente, es decir de menor a mayor, por ejemplo.... como lo hacemos? En estos casos lo mejor es utilizar el algoritmo de ordenacion de burbuja... Este algoritmo realiza comparaciones entre los elementos del array y los ordena... Aca esta un ejemplo:

Código (java) [Seleccionar]

public class OrdBurbuja {

   public static void main (String [] args) {
      int i, b;
      int [] myArray = { 113, 23, 54, -10, -8, 72, 46 };

       for (b = 0; b <= myArray.length - 2; b++)
           for (i = 0; i <= myArray.length - b - 2; i++)
                if (myArray [i] >  myArray [i + 1]) {
                    int temp = myArray [i];
                    myArray [i] = x [i + 1];
                    myArray [i + 1] = temp;
                }
     
      for (i = 0; i <  myArray.length; i++)
           System.out.println (myArray [i]);
   }
}


Este ejemplo lo saque de un libro de C++ que lei hace uno o dos a~os, era de ediciones O'reilly, y lo reconstrui, segun mi memoria, era algo de Data Structures and Algorithms, y nada, que use ese ejemplo, para guiarme e hice este en Java.
El poder corrompe, el poder absoluto corrompe absolutamente.