<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-17253682</id><updated>2012-01-26T10:02:50.075-03:00</updated><category term='mainframe mvs'/><category term='registro'/><category term='cli'/><category term='parametros'/><category term='apt-get'/><category term='ejemplos javas'/><category term='EJEMPLOS'/><category term='new'/><category term='regexp'/><category term='strcat'/><category term='apareo'/><category term='infobae'/><category term='mainframe'/><category term='ordenamiento'/><category term='compilador'/><category term='factorial'/><category term='funciones inline'/><category term='recursividad'/><category term='file status'/><category term='consultas sql'/><category term='redirect'/><category term='predecremento'/><category term='autenticacion'/><category term='herencia'/><category term='comprimir'/><category term='jquery each'/><category term='c++'/><category term='variables'/><category term='strtok'/><category term='sort'/><category term='subcadenas'/><category term='while'/><category term='cstring'/><category term='checkbox'/><category term='sam'/><category term='java'/><category term='continue'/><category term='dinámica'/><category term='gnu/linux'/><category term='apt'/><category term='argumentos'/><category term='trim'/><category term='streams'/><category term='algoritmo de busqueda'/><category term='clases'/><category term='java.lang.Math'/><category term='strncpy'/><category term='construsctores'/><category term='javascript for'/><category term='ordena burbuja mejorado'/><category term='arreglos de caracteres'/><category term='c'/><category term='sony vaio'/><category term='aleatorios'/><category term='working copy'/><category term='substring'/><category term='dns'/><category term='exponente'/><category term='funciones'/><category term='inicializadores de miembro'/><category term='algoritmo de ordenacion'/><category term='case of'/><category term='seleccion multiple'/><category term='ubuntu'/><category term='cr'/><category term='svn'/><category term='subversion'/><category term='this'/><category term='mail'/><category term='poo'/><category term='ciclo exacto'/><category term='conversiones'/><category term='while do'/><category term='status'/><category term='javascript split'/><category term='amigas de clase'/><category term='funcion mayor'/><category term='raiz cuadrada'/><category term='indexOf'/><category term='inicialización'/><category term='punteros'/><category term='potencia'/><category term='if'/><category term='hardware'/><category term='teoria'/><category term='operadores'/><category term='memoria dinamica'/><category term='flisol'/><category term='listas'/><category term='login'/><category term='mvs'/><category term='archivos'/><category term='estructuras de datos'/><category term='header'/><category term='busqueda binaria'/><category term='ssh'/><category term='lenguajes de programación'/><category term='tip'/><category term='vsam'/><category term='replace'/><category term='strncmp'/><category term='jquery'/><category term='número aleatorio'/><category term='task'/><category term='parámetros'/><category term='miembros static'/><category term='finales resueltos'/><category term='symfony'/><category term='objetos'/><category term='remember'/><category term='expresiones regulares'/><category term='strncat'/><category term='tareas'/><category term='finales'/><category term='javascript replace'/><category term='parseInt'/><category term='SQL'/><category term='software libre'/><category term='inicializacion'/><category term='caracteres'/><category term='cobol'/><category term='my wall street journal'/><category term='pointers'/><category term='constructores por defecto'/><category term='java case'/><category term='composicion'/><category term='arreglos'/><category term='posicionamiento'/><category term='ECB'/><category term='chuleta'/><category term='cadenas C'/><category term='link'/><category term='strings'/><category term='referencia'/><category term='tipos de datos primitivos'/><category term='clearTimeout'/><category term='suma enteros'/><category term='ejemplos javascript'/><category term='sobrecarga'/><category term='javascript substring'/><category term='posdecremento'/><category term='if else'/><category term='busqueda lineal'/><category term='mysql'/><category term='foreach'/><category term='arrays'/><category term='descomprimir'/><category term='referencia this'/><category term='explode'/><category term='burbujeo'/><category term='insertion sort'/><category term='openssl'/><category term='strcpy'/><category term='bash'/><category term='numeros aleatorios'/><category term='apuntadores'/><category term='gui'/><category term='ejemplos java'/><category term='case'/><category term='colas'/><category term='destructores'/><category term='split'/><category term='permisos'/><category term='tramp'/><category term='valor'/><category term='substr'/><category term='ejemplos jquery'/><category term='base'/><category term='compilar'/><category term='encriptación'/><category term='posincremento'/><category term='referencias'/><category term='archivos de texto'/><category term='autentificacion'/><category term='hola mundo'/><category term='enteros'/><category term='implode'/><category term='cr131/e'/><category term='ciclos'/><category term='case java'/><category term='javascript'/><category term='optimizado'/><category term='inline'/><category term='entorno de desarrollo'/><category term='sdl'/><category term='dnsmasq'/><category term='pilas'/><category term='ordena burbuja'/><category term='cadenas estilo c'/><category term='operador de alcance'/><category term='switch'/><category term='funciones miembro'/><category term='cadenas'/><category term='for'/><category term='delete'/><category term='strcmp'/><category term='amazon'/><category term='debian'/><category term='caracter nul'/><category term='division entera'/><category term='opencobol'/><category term='flujos'/><category term='strend'/><category term='const'/><category term='linux'/><category term='setTimeout'/><category term='ocultamiento'/><category term='polaca inversa'/><category term='emacs'/><category term='constructores'/><category term='do while'/><category term='cafelug'/><category term='quicksort'/><category term='superprimos'/><category term='php'/><category term='preincremento'/><category term='static'/><category term='tutorial'/><category term='random'/><category term='editores'/><category term='flymake'/><category term='break'/><category term='lisp'/><category term='servidor'/><category term='time'/><category term='pascal'/><category term='algoritmo'/><category term='funciones friend'/><category term='usuarios'/><category term='blogger'/><category term='acceso a miembros'/><category term='calculadora'/><category term='algoritmos'/><category term='command line'/><category term='g++'/><category term='gnus'/><category term='boolean'/><category term='password'/><category term='do'/><title type='text'>Código Fuente</title><subtitle type='html'>Apuntes de programación. Ejemplos de código en PHP, C, Javascript, jQuery, Pascal, Java y C++.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default?start-index=101&amp;max-results=100'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>151</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-17253682.post-7534832141759664737</id><published>2011-11-02T07:56:00.001-03:00</published><updated>2011-11-02T07:56:23.720-03:00</updated><title type='text'>Como saber la versión de ubuntu por línea de comandos</title><content type='html'>&lt;p&gt;  Para saber que versión de Ubuntu estamos utilizando sólo valiéndonos de la línea de comandos podemos revisar el contenido de &lt;code&gt;/etc/lsb-release&lt;/code&gt;. Por ejemplo:&lt;br /&gt;
&lt;/p&gt;&lt;pre&gt;user@host-name:/var/www/$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=10.04
DISTRIB_CODENAME=lucid
DISTRIB_DESCRIPTION="Ubuntu 10.04.3 LTS"
&lt;/pre&gt;&lt;br /&gt;
&lt;p&gt;Muestra la salida de un Ubuntu LTS (el 10.04.3)&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-7534832141759664737?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/7534832141759664737/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=7534832141759664737' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/7534832141759664737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/7534832141759664737'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/11/como-saber-la-version-de-ubuntu-por.html' title='Como saber la versión de ubuntu por línea de comandos'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-8932148481663725089</id><published>2011-06-08T18:43:00.002-03:00</published><updated>2011-06-08T18:44:26.922-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='tipos de datos primitivos'/><category scheme='http://www.blogger.com/atom/ns#' term='boolean'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos java'/><title type='text'>El tipo boolean y el objeto Boolean en Java</title><content type='html'>&lt;p&gt;En &lt;strong&gt;Java&lt;/strong&gt; tenemos dos maneras de representar el concepto de booleano, una forma es con el tipo primitivo &lt;code&gt;boolean&lt;/code&gt; y la otra es utilizando el objeto de la clase &lt;code&gt;Boolean&lt;/code&gt;. En el siguiente ejemplo se ve como crearlos y como pasar de uno a otro y como se comportan en las comparaciones:&lt;/p&gt;

&lt;pre class="ejemplo"&gt;
class EjemploBoolean  {
    public static void log(String s) {
        System.out.println(s);
    }
    public static void main(String args[]) {
        Boolean objetoTrue = new Boolean("true");
        Boolean objetoFalse = new Boolean("false");
        boolean valorPrimitivoTrue = objetoTrue.booleanValue(); // pasando del objeto al valor primitivo.
        log("valorPrimitivoTrue: " + valorPrimitivoTrue);
        log("objetoTrue: " + objetoTrue);
        log("objetoFalse: " + objetoFalse);
        if(objetoTrue) {
            log("Rama de true");
        }
        if(objetoFalse) {
            log("Rama de true no debería pasar.");
        }
        log("Comparando objetoTrue == valorPrimitivoTrue: " + (objetoTrue == valorPrimitivoTrue) );
    }
}
  
&lt;/pre&gt;


&lt;p&gt;La salida del anterio programa es la siguiente:&lt;/p&gt;

&lt;pre class="ejemplo"&gt;
#javac EjemploBoolean.java &amp;&amp; java EjemploBoolean
valorPrimitivoTrue: true
objetoTrue: true
objetoFalse: false
Rama de true
Comparando objetoTrue == valorPrimitivoTrue: true
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-8932148481663725089?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/8932148481663725089/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=8932148481663725089' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8932148481663725089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8932148481663725089'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/el-tipo-boolean-y-el-objeto-boolean-en.html' title='El tipo boolean y el objeto Boolean en Java'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-8107794876739237125</id><published>2011-06-07T23:05:00.002-03:00</published><updated>2011-06-07T23:07:24.949-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='foreach'/><category scheme='http://www.blogger.com/atom/ns#' term='for'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos java'/><title type='text'>Ejemplo de foreach en Java</title><content type='html'>&lt;p&gt;Quienes vengan del mundo de PHP conocerán que la forma más sencilla de iterar un array en ese lenguaje es utilizar la estructura de control &lt;code&gt;foreach&lt;/code&gt;. Java no posee esa palabra reservada, pero si puede lograrse una forma de iteración equivalente mediante el uso de &lt;code&gt;for&lt;/code&gt; y una sintáxis como la que se aprecia en el siguiente ejemplo:&lt;/p&gt;
&lt;pre class="ejemplo"&gt;
class ForeachEjemplo  {
    public static void main(String args[]) {
        String [] arrStr = {"1", "2", "3", "4", "5"};
        for(String elemento : arrStr) {
            System.out.println(elemento);
        }
    }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-8107794876739237125?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/8107794876739237125/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=8107794876739237125' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8107794876739237125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8107794876739237125'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/ejemplo-de-foreach-en-java.html' title='Ejemplo de foreach en Java'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-5452157658087695590</id><published>2011-06-07T22:53:00.002-03:00</published><updated>2011-06-07T23:00:34.000-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='enteros'/><category scheme='http://www.blogger.com/atom/ns#' term='conversiones'/><category scheme='http://www.blogger.com/atom/ns#' term='parseInt'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos java'/><title type='text'>Como pasar de int a un String en Java</title><content type='html'>&lt;p&gt;A continuación un ejemplo de como pasar desde un String a un valor int en Java utilizando el método estático de la clase &lt;code&gt;String&lt;/code&gt;.&lt;code&gt;parseInt&lt;/code&gt; &lt;/p&gt;

&lt;pre class="ejemplo"&gt;
class StringAInt  {
    public static void main(String args[]) {
        String valorStr1 = "1";
        String valorStr2 = "1";
        String valorStr3 = "     1 ";
        int valorInt1 = Integer.parseInt(valorStr1);
        int valorInt2 = Integer.parseInt(valorStr2);
        int valorInt3 = Integer.parseInt(valorStr3.trim());
        System.out.println(valorInt1 + valorInt2 + valorInt3);
    }
}
&lt;/pre&gt;

&lt;p&gt;Los primeros dos valores se parsearon directamente porque venían en un formato adecuado. En cambio el valor contenido en la variable &lt;code&gt;valorStr3&lt;/code&gt; fue primero &lt;em&gt;trim&lt;/em&gt;eado porque contenía espacios.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-5452157658087695590?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/5452157658087695590/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=5452157658087695590' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5452157658087695590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5452157658087695590'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/como-pasar-de-int-un-string-en-java.html' title='Como pasar de int a un String en Java'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-429748630435789702</id><published>2011-06-07T22:16:00.002-03:00</published><updated>2011-06-07T22:18:04.027-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='archivos'/><category scheme='http://www.blogger.com/atom/ns#' term='archivos de texto'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos java'/><title type='text'>Como leer un archivo de texto en Java</title><content type='html'>&lt;p&gt;En el siguiente ejemplo se muestra como leer un archivo de texto utilizando Java. El archivo se lee línea por línea, y a medida que avanza la lectura se imprimen la líneas por pantalla.&lt;/p&gt;
&lt;pre class="ejemplo"&gt;
import java.io.*;
class LeerArchivo  {
    public static void main(String args[]) {
        try{
            // Abrimos el archivo
            FileInputStream fstream = new FileInputStream("LeerArchivo.java");
            // Creamos el objeto de entrada
            DataInputStream entrada = new DataInputStream(fstream);
            // Creamos el Buffer de Lectura
            BufferedReader buffer = new BufferedReader(new InputStreamReader(entrada));
            String strLinea;
            // Leer el archivo linea por linea
            while ((strLinea = buffer.readLine()) != null)   {
                // Imprimimos la línea por pantalla
                System.out.println (strLinea);
            }
            // Cerramos el archivo
            entrada.close();
        }catch (Exception e){ //Catch de excepciones
            System.err.println("Ocurrio un error: " + e.getMessage());
        }
    }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-429748630435789702?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/429748630435789702/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=429748630435789702' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/429748630435789702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/429748630435789702'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/como-leer-un-archivo-de-texto-en-java.html' title='Como leer un archivo de texto en Java'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-3136518407692593211</id><published>2011-06-07T22:02:00.003-03:00</published><updated>2011-06-07T22:07:24.372-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cadenas'/><category scheme='http://www.blogger.com/atom/ns#' term='strings'/><category scheme='http://www.blogger.com/atom/ns#' term='indexOf'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos java'/><title type='text'>Ejemplo de String indexOf de Java</title><content type='html'>&lt;p&gt;El método &lt;strong&gt;indexOf&lt;/strong&gt; de la clase &lt;strong&gt;String&lt;/strong&gt; de Java, nos permite obtener el índice de comienzo de una subcadena dentro de otra.&lt;/p&gt;
&lt;pre class="ejemplo"&gt;
public class indexOfEjemplo {
  public static void main(String[] args) throws Exception{
    String cadena = "Codigo Fuente en Java";
    int index = cadena.indexOf("Java"); 
    System.out.println(index);
  }
}
&lt;/pre&gt;

&lt;p&gt;Cuando queremos conocer sucesivas apariciones de una subcadena, podemos llamar la función repetidamente, pero con un segundo parametro que incluíra el índice de la última posición encontrada más 1. Por ejemplo: &lt;/p&gt;
&lt;pre class="ejemplo"&gt;
public class indexOfEjemplo01 {
  public static void main(String[] args) throws Exception{
    String cadena = "Codigo Fuente en Java y aca aparece otra vez Java";
    int index = cadena.indexOf("Java"); 
    System.out.println(index);
    index = cadena.indexOf("Java",index+1); 
    System.out.println(index); // imprime segunda aparicion de Java
  }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-3136518407692593211?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/3136518407692593211/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=3136518407692593211' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/3136518407692593211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/3136518407692593211'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/ejemplo-de-string-indexof-de-java.html' title='Ejemplo de String indexOf de Java'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-5612786835213217412</id><published>2011-06-07T21:41:00.003-03:00</published><updated>2011-06-07T21:53:33.236-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='split'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cadenas'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos java'/><title type='text'>El método SPLIT en Java</title><content type='html'>&lt;p&gt;Veamos un ejemplo sencillo de como utilizar el método &lt;strong&gt;split&lt;/strong&gt; en Java. En este ejemplo convertiremos una cadena a un array de cadenas.&lt;/p&gt;

&lt;pre class="ejemplo"&gt;

public class EjemploSplit {
    public static void  main (String args[]) {
        String numeros = "1,2,3,4,5,6";
        String[] numerosComoArray = numeros.split(",");
        for (int i = 0; i &amp;lt; numerosComoArray.length; i++) {
            System.out.println(numerosComoArray[i]);
        }
    }
}

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-5612786835213217412?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/5612786835213217412/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=5612786835213217412' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5612786835213217412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5612786835213217412'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/el-metodo-split-en-java.html' title='El método SPLIT en Java'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-2384961812478947769</id><published>2011-06-07T21:36:00.003-03:00</published><updated>2011-06-07T21:39:08.580-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='herencia'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos javas'/><title type='text'>Ejemplo de Herencia en Java</title><content type='html'>&lt;p&gt;Acá tenemos el ejemplo básico de herencia en Java. En este caso la clase &lt;strong&gt;Ciudadano&lt;/strong&gt; hereda desde la clase &lt;strong&gt;Persona&lt;/strong&gt;, para tomar funcionalidad y extenderla.&lt;/p&gt;

&lt;pre class="ejemplo"&gt;
class Humano {
    protected String nombre;
    protected String apellido;
    public Humano(String nombre,String apellido) {
        this.nombre = nombre;
        this.apellido = apellido;
    }
    public String nombreCompleto() {
        return this.apellido + ", " + this.nombre;
    }
    public String identificacion() {
        return this.nombreCompleto();
    }
    
}

class Ciudadano extends Humano {
    protected String documento;

    public Ciudadano(String nombre,String apellido, String documento) {
        super(nombre,apellido);
        this.documento = documento;
    }

    public String identificacion() {
        return super.identificacion() + ", documento: " + this.documento;
    }
}


public class Herencia {
    public static void  main (String args[]) {
        Humano a = new Humano("Emilio","Rosso");
        Ciudadano b = new Ciudadano("Emilio","Rosso","3052454545");
        Humano [] arregloDeHumanos;
        arregloDeHumanos.push(a);
        arregloDeHumanos.push(b);
        identificarPolimorfico(arregloDeHumanos);
    }

    public static void identificarPolimorfico(Humano [] arregloDeHumanos) {
        for(int i = 0; i &amp;lt; arregloDeHumanos.length ; i++) {
            System.out.println("Identificando: " + arregloDeHumanos[i].identificacion());
        }
    }

}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-2384961812478947769?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/2384961812478947769/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=2384961812478947769' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2384961812478947769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2384961812478947769'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/ejemplo-de-herencia-en-java.html' title='Ejemplo de Herencia en Java'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-5331168612263594937</id><published>2011-06-04T17:52:00.004-03:00</published><updated>2011-06-04T17:56:59.913-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='checkbox'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><title type='text'>Todo sobre jQuery y los checkbox</title><content type='html'>&lt;p&gt;Aquí una serie de ejemplos para aprender a utilizar jQuery y los
checkbox de formulario.&lt;/p&gt;
&lt;h3&gt;Saber si un checkbox está checkeado o no&lt;/h3&gt;

&lt;div class="exampleform"&gt;
  &lt;input class="ejemploCheckbox1"  type="checkbox" name="checkbox1" value="Valor checkbox1"  checked="checked" /&gt; Checkbox 1
  &lt;input class="ejemploCheckbox1"  type="checkbox" name="checkbox2" value="Valor checkbox2" /&gt; Checkbox 2
&lt;/div&gt;
&lt;p&gt;Estos checkbox abmos tienen la clase &lt;code&gt;checkbox1&lt;/code&gt;, veamos
como ejecutar un código que nos diga en que estado está cada uno (para
ejecutar algo con cada uno utilizaremos el
método &lt;a href="http://codigomaldito.blogspot.com/2011/05/jquery-each-ejemplos.html"&gt;each
de jQuery&lt;/a&gt;.) &lt;/p&gt;


&lt;pre class="ejemplo examplejavascript"&gt;
  $('.ejemploCheckbox1').each(function(){
     var checkbox = $(this);
     log('El checkbox ' + checkbox.attr('name') + ' está checkeado? ' + checkbox.is(':checked')  );
  });
&lt;/pre&gt;

&lt;p&gt;Como ven la cuestión se reduce a utilizar el método &lt;code&gt;is&lt;/code&gt;
con el prédicado &lt;code&gt;checked&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Setear el valor de un checkbox:&lt;/h3&gt; 

&lt;div class="exampleform"&gt;
  &lt;input class="ejemploCheckbox2"  type="checkbox" name="checkbox1" value="Valor checkbox1"  checked="checked" /&gt; Checkbox 1
  &lt;input class="ejemploCheckbox2"  type="checkbox" name="checkbox2" value="Valor checkbox2" /&gt; Checkbox 2
&lt;/div&gt;

&lt;p&gt;Los anteriores checkbox tienen la
clase &lt;code&gt;ejemploCheckbox2&lt;/code&gt;, setear el valor de cada uno de
ellos con jQuery es muy fácil utilizando el
método &lt;code&gt;attr&lt;/code&gt;:&lt;/p&gt;

&lt;pre class="ejemplo examplejavascript"&gt;
  $('[name="checkbox1"].ejemploCheckbox2').attr('checked',false);
  $('[name="checkbox2"].ejemploCheckbox2').attr('checked',true);
&lt;/pre&gt;
&lt;p&gt;En el código anterior utilizamos un selector por el atributo name,
y luego al elemento matcheado le seteamos la propiedad checked,
utilizando un valor &lt;code&gt;true&lt;/code&gt; o &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Ejecutar código cuando se checkea un checkbox:&lt;/h3&gt;
&lt;p&gt;Como último ejemplo veamos como realizar una acción cuando se
checkea o se descheckea un checkbox. Para eso utilizaremos el evento
click del checkbox, y el predicado &lt;code&gt;:checked&lt;/code&gt; como vimos en el primer ejemplo.&lt;/p&gt;

&lt;div class="exampleform"&gt;
  &lt;input class="ejemploCheckbox3"  type="checkbox" name="checkbox1" value="Valor checkbox1"  checked="checked" /&gt; Checkbox 1
&lt;/div&gt;

&lt;pre class="ejemplo examplejavascript"&gt;
  $('[name="checkbox1"].ejemploCheckbox3').click(function() {
    if($(this).is(':checked')) {
      log('Se hizo check en el checkbox.');
    } else {
      log('Se destildo el checkbox');
    }
  });
&lt;/pre&gt;
&lt;p&gt;Si hacen click en ejecutar en el código anterior. Pueden probar lo que sucede cada vez que se tilda o se destilda el checkbox del ejemplo.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-5331168612263594937?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/5331168612263594937/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=5331168612263594937' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5331168612263594937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5331168612263594937'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/todo-sobre-jquery-y-los-checkbox.html' title='Todo sobre jQuery y los checkbox'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-405331234656146856</id><published>2011-06-04T17:27:00.003-03:00</published><updated>2011-06-04T17:32:18.892-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='indexOf'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos javascript'/><title type='text'>El método indexOf de javascript</title><content type='html'>&lt;p&gt;El método o función &lt;code&gt;indexOf&lt;/code&gt; de los arrays de
javascript, sirve para obtener el índice o posición de un elemento dado en un array.&lt;/p&gt;

&lt;p&gt;Algunos navegadores como &lt;strong&gt;Internet Explorer 8&lt;/strong&gt; no
cuentan con la definición de la función nativamente por lo que antes
de utilizarla la debemos definir. Tomaremos la definición que se
encuentra en la documentación de Javascript de la fundación Mozilla y
luego veremos algunos ejemplos de su uso:&lt;/p&gt;

&lt;pre class="ejemplo examplejavascript"&gt;
  if (!Array.prototype.indexOf)
  {
    Array.prototype.indexOf = function(searchElement /*, fromIndex */)
    {
      "use strict";
      if (this === void 0 || this === null)
        throw new TypeError();
      var t = Object(this);
      var len = t.length &gt;&gt;&gt; 0;
      if (len === 0)
        return -1;
      var n = 0;
      if (arguments.length &gt; 0)
      {
        n = Number(arguments[1]);
        if (n !== n) 
          n = 0;
        else if (n !== 0 &amp;&amp; n !== (1 / 0) &amp;&amp; n !== -(1 / 0))
          n = (n &gt; 0 || -1) * Math.floor(Math.abs(n));
      }
      if (n &gt;= len)
        return -1;
      var k = n &gt;= 0
            ? n
            : Math.max(len - Math.abs(n), 0);
      for (; k &lt; len; k++)
      {
        if (k in t &amp;&amp; t[k] === searchElement)
          return k;
      }
      return -1;
    };
  }
  
  var array = [1,2,3,4];
  log('En array el elemento 2 se encuentra en la posición: ' +  array.indexOf(2));
  log('En array el elemento 4 se encuentra en la posición: ' +  array.indexOf(4));
  log('En array el elemento 1 se encuentra en la posición: ' +  array.indexOf(1));
  log('En array el elemento 0 no se encuentra, indexOf devuelve: ' +  array.indexOf(0)); // -1
&lt;/pre&gt;
&lt;p&gt;Hay que tener en cuenta que como se ve en la definición
de &lt;code&gt;indexOf&lt;/code&gt; anterior, el operador que se utiliza para
saber si un elemento está incluído o no es: &lt;code&gt;===&lt;/code&gt; y
no &lt;code&gt;==&lt;/code&gt;, por lo que la comparación de tipos también se
realiza y por ejemplo la búsqueda de &lt;code&gt;false&lt;/code&gt; como elemento
no dará como resultado el índice de un &lt;code&gt;0&lt;/code&gt; o un string
vacío, algo que si ocurriría si se utilizara &lt;code&gt;==&lt;/code&gt; como
operador de comparación de igualdad.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-405331234656146856?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/405331234656146856/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=405331234656146856' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/405331234656146856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/405331234656146856'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/el-metodo-indexof-de-javascript.html' title='El método indexOf de javascript'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-5063140239060229163</id><published>2011-06-04T17:17:00.002-03:00</published><updated>2011-06-04T17:18:15.039-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='trim'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos javascript'/><title type='text'>Función trim en javascript y en jQuery</title><content type='html'>&lt;p&gt;Javascript no cuenta con ningún método nativo para
hacer &lt;code&gt;trim&lt;/code&gt; de un string. Por lo que debemos escribir
nuestra propia función &lt;code&gt;trim&lt;/code&gt;. Hay varias maneras de
hacerlo, una de las más sencillas utiliza expresiones regulares:
&lt;h3&gt;Ejemplo de &lt;code&gt;trim&lt;/code&gt;&lt;/h3&gt;
&lt;pre class="ejemplo examplejavascript"&gt;
    function trim(str) {
      return str.replace(/^\s+|\s+$/g,"");
    }
    log(trim("      soy un ejemplo "));
&lt;/pre&gt;

&lt;h3&gt;Utilizando trim de jQuery&lt;/h3&gt;
&lt;p&gt;Si nuestra página se encuentra utilizando &lt;strong&gt;jQuery&lt;/strong&gt;
podemos utilizar la función que trae jQuery llamada de igual manera
pero que es un método del objeto jQuery.&lt;/p&gt;
&lt;pre class="ejemplo examplejavascript"&gt;
    log(jQuery.trim("      soy un ejemplo "));
    log($.trim("      soy un segundo ejemplo   "));
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-5063140239060229163?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/5063140239060229163/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=5063140239060229163' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5063140239060229163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5063140239060229163'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/funcion-trim-en-javascript-y-en-jquery.html' title='Función trim en javascript y en jQuery'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-491963420065488162</id><published>2011-06-04T17:06:00.001-03:00</published><updated>2011-06-04T17:07:52.871-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='case'/><category scheme='http://www.blogger.com/atom/ns#' term='switch'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos javascript'/><title type='text'>Explicación de SWITCH y CASE en javascript</title><content type='html'>&lt;p&gt;La estructura &lt;strong&gt;switch/case&lt;/strong&gt; de Javascript nos
permite evaluar el valor de una expresión para tomar una decisión en
el flujo del ejecución. Es muy parecida a la estructura de
control &lt;strong&gt;if/else&lt;/strong&gt; pero con &lt;strong&gt;switch/case&lt;/strong&gt;
podemos evaluar más de dos casos.&lt;/p&gt;

&lt;h3&gt;Ejemplo de switch/case evaluando una variable cadena&lt;/h3&gt;

&lt;pre class="ejemplo examplejavascript"&gt;
  var variableAevaluar = "tres";
  switch (variableAevaluar) { 
    case "uno":
      log("Viene 1");
      break;
    case "dos":
      log("Viene 2");
      break;
    case "tres":
      log("Viene 3");
      break;
  }
&lt;/pre&gt;
&lt;p&gt;En el ejemplo, como &lt;code&gt;variableAevaluar&lt;/code&gt; tenía asignado el
valor &lt;code&gt;tres&lt;/code&gt;, el flujo de ejecución siguió por
el &lt;code&gt;case "tres":&lt;/code&gt;. Hay que tener especial atención en el
uso de la sentencia &lt;code&gt;break&lt;/code&gt;. Cuando esta se omite, la
ejecución continuará por el resto de los &lt;code&gt;case&lt;/code&gt; que tenga
por debajo, hasta que alguno finalice con &lt;code&gt;break&lt;/code&gt;, en
general este no suele ser el comportamiento deseado.&lt;/p&gt;

&lt;h3&gt;Ejemplo de switch/case utilizando el label &lt;strong&gt;&lt;code&gt;default&lt;/code&gt;&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Análogamente a &lt;code&gt;else&lt;/code&gt;, la sentencia &lt;code&gt;switch&lt;/code&gt;
puede utilizarse en conjunto con &lt;code&gt;default:&lt;/code&gt;, etiqueta a la
cual se entrará si la expresión evaluada no coincide con los case
anteriores (o para ser más rigurosos, se entrará siempre a menos que
un &lt;code&gt;case&lt;/code&gt; haya hecho terminar prematuramente la ejecución
del &lt;code&gt;switch&lt;/code&gt; utilizando &lt;code&gt;break;&lt;/code&gt;)&lt;/p&gt;


&lt;pre class="ejemplo examplejavascript"&gt;
  var variableAevaluar = "NINGUNO";
  switch (variableAevaluar) { 
    case "uno":
      log("Viene 1");
      break;
    case "dos":
      log("Viene 2");
      break;
    case "tres":
      log("Viene 3");
      break;
    default: 
      error("El valor de variable es desconocido.");
      break;
  }
&lt;/pre&gt;

&lt;p&gt;En la etiqueta &lt;code&gt;default:&lt;/code&gt; suele ponerse código para el
manejo de errores (valores insesperados del usuarios por
ejemplo). El &lt;code&gt;break&lt;/code&gt; en el último &lt;code&gt;case&lt;/code&gt;
o &lt;code&gt;default&lt;/code&gt; (como en este caso), es opcional ya que no hay
etiquetas que puedan seguir la ejecución, pero es buena práctica utilizarlo para
dar uniformidad al código.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-491963420065488162?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/491963420065488162/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=491963420065488162' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/491963420065488162'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/491963420065488162'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/explicacion-de-switch-y-case-en.html' title='Explicación de SWITCH y CASE en javascript'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-1662367190715072744</id><published>2011-06-03T18:03:00.003-03:00</published><updated>2011-06-03T19:01:19.893-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='redirect'/><title type='text'>Hacer un redirect con Javascript</title><content type='html'>&lt;p&gt;Para realizar un redirect mediante &lt;strong&gt;javascript&lt;/strong&gt;
podemos utilizar la propiedad &lt;strong&gt;window.location&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;Redirect normal utilizando Javascript&lt;/h3&gt;
&lt;pre class="ejemplo examplejavascript"&gt;
  window.location.href = "http://codigomaldito.blogspot.com/2011/06/hacer-un-redirect-con-javascript.html";
&lt;/pre&gt;

&lt;p&gt;Si estuviesemos adentro de un iframe y queremos hacer un redirect
en la ventana principal podemos hacer un redirect refiriendonos a la
propiedad &lt;code&gt;top&lt;/code&gt; del objeto &lt;code&gt;window&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;Redirect al top desde adentro de un iframe&lt;/h3&gt;
&lt;pre class="ejemplo examplejavascript"&gt;
  window.top.location.href = "http://codigomaldito.blogspot.com/2011/06/hacer-un-redirect-con-javascript.html";
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-1662367190715072744?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/1662367190715072744/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=1662367190715072744' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/1662367190715072744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/1662367190715072744'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/hacer-un-redirect-con-javascript.html' title='Hacer un redirect con Javascript'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-4352366841244458938</id><published>2011-06-03T17:17:00.003-03:00</published><updated>2011-06-03T17:20:44.896-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='clearTimeout'/><category scheme='http://www.blogger.com/atom/ns#' term='setTimeout'/><title type='text'>Ejemplos de setTimeout en Javascript</title><content type='html'>&lt;p&gt;
 La función &lt;strong&gt;setTimeout&lt;/strong&gt; permite registrar un callback
 o códgo para que se ejecute dentro de un período de tiempo
 determinado (o sugerido) por el segundo parametro &lt;code&gt;delay&lt;/code&gt; (en
 milisegundos)
&lt;/p&gt;
&lt;pre class="ejemplo"&gt;
var timeoutID = setTimeout(func, delay, [param1, param2, ...]);
var timeoutID = setTimeout(code, delay);
&lt;/pre&gt;

&lt;p&gt;
  Veamos algunos ejemplos:
&lt;/p&gt;

&lt;h4&gt;Ejecutando un callback luego de 2 segundos&lt;/h4&gt;
&lt;pre class="ejemplo examplejavascript"&gt;
  var timeoutId = setTimeout(function(){
    log('Pasaron 2 segundos desde el click');
  },2000);
&lt;/pre&gt;

&lt;h4&gt;Ejecutando código luego de 2 segundos&lt;/h4&gt;
&lt;pre class="ejemplo examplejavascript"&gt;
  var timeoutId = setTimeout("alert('Pasaron 2 segundos desde el click');",2000);
&lt;/pre&gt;

&lt;h4&gt;Ejecutando un callback con parametros luego de 2 segundos&lt;/h4&gt;
&lt;p&gt;En este caso pasaremos parametros a la función anónima que estamos registrando:&lt;/p&gt;
&lt;pre class="ejemplo examplejavascript"&gt;
  var timeoutId = setTimeout(function(msg){
    log(msg);
  },2000,'Pasaron 2 segundos desde el click');
&lt;/pre&gt;

&lt;h4&gt;Cancelando el timeout con clearTimeout&lt;/h4&gt;
&lt;p&gt;En este ejemplo registraremos un callback pero no dejaremos que se
ejecute. Esto se puede lograr con el uso de la
función &lt;strong&gt;&lt;code&gt;clearTimeout&lt;/code&gt;&lt;/strong&gt;, a la cual podemos
pasarle el &lt;code&gt;id&lt;/code&gt; devuelto por &lt;code&gt;setTimeout&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="ejemplo examplejavascript"&gt;
  var timeoutId = setTimeout(function(msg){
    log(msg);
  },2000,'Pasaron 2 segundos desde el click');
  clearTimeout(timeoutId); // "de-registramos" el callback
  // nada debería ejecutarse.
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-4352366841244458938?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/4352366841244458938/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=4352366841244458938' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4352366841244458938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4352366841244458938'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/ejemplos-de-settimeout-en-javascript.html' title='Ejemplos de setTimeout en Javascript'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-2410686166586361307</id><published>2011-06-01T21:46:00.004-03:00</published><updated>2011-06-03T15:22:26.635-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='case java'/><category scheme='http://www.blogger.com/atom/ns#' term='java case'/><title type='text'>case en java</title><content type='html'>&lt;h3&gt;ejemplos de for en javascript&lt;/h3&gt;

    &lt;p&gt;La estructura de control &lt;code&gt;for&lt;/code&gt; en javascript sirve
    para iterar por un &lt;em&gt;array&lt;/em&gt; o un &lt;em&gt;objeto&lt;/em&gt;.&lt;/p&gt;

    &lt;h4&gt;Usando for para iterar un array:&lt;/h4&gt;
    &lt;p&gt;Este es uno de los usos clásicos de &lt;code&gt;for&lt;/code&gt; conocido
    muchas veces como una expresión idiomática común en lenguajes como
    C o C++.&lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      var arr = [1,2,3,4,5,6];
      var arrLen = arr.length;
      for(var i = 0; i &amp;lt; arrLen; i++) {
        log('El valor de arr['+i+'] = ' + arr[i]);
      }
    &lt;/pre&gt;

    &lt;p&gt;El cuerpo de la sentencia for que está entre llaves se
    ejecutará mientras sea la condición &lt;code&gt;i &amp;lt; arrLen&lt;/code&gt; sea
    verdadera. La primera expresión que inicializa &lt;code&gt;var i =
    0&lt;/code&gt; se ejecuta una sola vez, y la última
    expresión &lt;code&gt;i++&lt;/code&gt; es ejecutada por cada iteración.&lt;/p&gt;
    
    &lt;p&gt;&lt;strong&gt;ATENCIÓN NO SE RECOMIENDA USAR ESTA FORMA.&lt;/strong&gt;
    Otra forma problemática que puede tomar la
    expresión &lt;code&gt;for&lt;/code&gt; para iterar un array es:&lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      var arr = [1,2,3,4,5,6];
      for(var i in arr) {
        log('El valor de arr['+i+'] = ' + arr[i]);
      }
    &lt;/pre&gt;
    &lt;p&gt;El operador &lt;code&gt;in&lt;/code&gt; hace que la variable &lt;code&gt;i&lt;/code&gt;
    tome el valor de los índices del array, pero esto no siempre
    sucedera como esperamos. Veamos algunos ejemplos en los que los
    resultados con el uso de &lt;code&gt;for in&lt;/code&gt; y sin &lt;code&gt;in&lt;/code&gt;
    varían.&lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      var arr = []; // declaramos un array vacío.
      arr[5] = 'Valor del indice 5'; // asignamos en el elemento 5 un valor.
      log('El length del array es: ' + arr.length);
      for(var i ; i &amp;lt; arr.legnth ; i++) { // se ejecutan 5 iteraciones
        log('[POR for normal] El valor de arr['+i+'] = ' + arr[i]);
      }      
      for(var i in arr) { // sólo ejecuta una iteración
        log('[POR for in] El valor de arr['+i+'] = ' + arr[i]);
      }
    &lt;/pre&gt;

    &lt;p&gt;Otro problema que puede surgir por el uso de &lt;code&gt;for
    in&lt;/code&gt; es que itere sobre propiedades inesperadas. Esto sucede
    porque los prototipos de arrays en Javascript pueden ser
    modificados (pueden agregarse propiedades). Este problema se
    ilustra en el siguiente ejemplo:
    &lt;/p&gt;

    &lt;pre class="ejemplo examplejavascript"&gt;
  // se modifica el prototipo de array
  // para que incluya un métodos llamado `ultimo`
  Array.prototype.ultimo = function () { 
    return this[this.length-1]; 
  };
  
  for (var i in []) { // en un array vacio
    // nos va a listar la propiedad `ultimo`
    // en nuestro array vacio
    log(i);
  }
  
  // Una forma de evitar este problema es utilizar
  // el método hasOwnProperty que verifica si una 
  // propiedad es propia del objeto y no heredada
  // por su prototipo.
  var arr = [];
  for (var i in arr) {
    if (arr.hasOwnProperty(i)) {
      log(i); // en este caso no se ejecuta.
    }
  }
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-2410686166586361307?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/2410686166586361307/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=2410686166586361307' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2410686166586361307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2410686166586361307'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/case-en-java.html' title='case en java'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-2320133647493221043</id><published>2011-06-01T13:12:00.002-03:00</published><updated>2011-06-03T15:20:10.301-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript for'/><category scheme='http://www.blogger.com/atom/ns#' term='for'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='arrays'/><title type='text'>for en javascript y for in</title><content type='html'>&lt;h3&gt;ejemplos de for en javascript&lt;/h3&gt;

    &lt;p&gt;La estructura de control &lt;code&gt;for&lt;/code&gt; en javascript sirve
    para iterar por un &lt;em&gt;array&lt;/em&gt; o un &lt;em&gt;objeto&lt;/em&gt;.&lt;/p&gt;

    &lt;h4&gt;Usando for para iterar un array:&lt;/h4&gt;
    &lt;p&gt;Este es uno de los usos clásicos de &lt;code&gt;for&lt;/code&gt; conocido
    muchas veces como una expresión idiomática común en lenguajes como
    C o C++.&lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      var arr = [1,2,3,4,5,6];
      var arrLen = arr.length;
      for(var i = 0; i &amp;lt; arrLen; i++) {
        log('El valor de arr['+i+'] = ' + arr[i]);
      }
    &lt;/pre&gt;

    &lt;p&gt;El cuerpo de la sentencia for que está entre llaves se
    ejecutará mientras sea la condición &lt;code&gt;i &amp;lt; arrLen&lt;/code&gt; sea
    verdadera. La primera expresión que inicializa &lt;code&gt;var i =
    0&lt;/code&gt; se ejecuta una sola vez, y la última
    expresión &lt;code&gt;i++&lt;/code&gt; es ejecutada por cada iteración.&lt;/p&gt;
    
    &lt;p&gt;&lt;strong&gt;ATENCIÓN NO SE RECOMIENDA USAR ESTA FORMA.&lt;/strong&gt;
    Otra forma problemática que puede tomar la
    expresión &lt;code&gt;for&lt;/code&gt; para iterar un array es:&lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      var arr = [1,2,3,4,5,6];
      for(var i in arr) {
        log('El valor de arr['+i+'] = ' + arr[i]);
      }
    &lt;/pre&gt;
    &lt;p&gt;El operador &lt;code&gt;in&lt;/code&gt; hace que la variable &lt;code&gt;i&lt;/code&gt;
    tome el valor de los índices del array, pero esto no siempre
    sucedera como esperamos. Veamos algunos ejemplos en los que los
    resultados con el uso de &lt;code&gt;for in&lt;/code&gt; y sin &lt;code&gt;in&lt;/code&gt;
    varían.&lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      var arr = []; // declaramos un array vacío.
      arr[5] = 'Valor del indice 5'; // asignamos en el elemento 5 un valor.
      log('El length del array es: ' + arr.length);
      for(var i ; i &amp;lt; arr.legnth ; i++) { // se ejecutan 5 iteraciones
        log([POR for normal] 'El valor de arr['+i+'] = ' + arr[i]);
      }      
      for(var i in arr) { // sólo ejecuta una iteración
        log('[POR for in] El valor de arr['+i+'] = ' + arr[i]);
      }
    &lt;/pre&gt;

    &lt;p&gt;Otro problema que puede surgir por el uso de &lt;code&gt;for
    in&lt;/code&gt; es que itere sobre propiedades inesperadas. Esto sucede
    porque los prototipos de arrays en Javascript pueden ser
    modificados (pueden agregarse propiedades). Este problema se
    ilustra en el siguiente ejemplo:
    &lt;/p&gt;

    &lt;pre class="ejemplo examplejavascript"&gt;
  // se modifica el prototipo de array
  // para que incluya un métodos llamado `ultimo`
  Array.prototype.ultimo = function () { 
    return this[this.length-1]; 
  };
  
  for (var i in []) { // en un array vacio
    // nos va a listar la propiedad `ultimo`
    // en nuestro array vacio
    log(i);
  }
  
  // Una forma de evitar este problema es utilizar
  // el método hasOwnProperty que verifica si una 
  // propiedad es propia del objeto y no heredada
  // por su prototipo.
  var arr = [];
  for (var i in arr) {
    if (arr.hasOwnProperty(i)) {
      log(i); // en este caso no se ejecuta.
    }
  }
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-2320133647493221043?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/2320133647493221043/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=2320133647493221043' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2320133647493221043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2320133647493221043'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/06/for-en-javascript-y-for-in.html' title='for en javascript y for in'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-8185914044334507474</id><published>2011-05-31T21:42:00.005-03:00</published><updated>2011-06-03T20:26:42.172-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery each'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='jquery'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos javascript'/><title type='text'>jquery each ejemplos</title><content type='html'>&lt;h3&gt;La función each de jQuery&lt;/h3&gt;

    &lt;p&gt;La función &lt;code&gt;each&lt;/code&gt; de jQuery nos sirve para iterar
    uno por uno los elementos de una colección, usualmente estos son
    el resultado de un selector jQuery, pero también pueden ser otras
    colecciones de Javascript como un &lt;em&gt;array&lt;/em&gt; o un &lt;em&gt;objeto&lt;/em&gt;.&lt;/p&gt;

    &lt;p&gt;La forma de la función es:&lt;/p&gt;
    &lt;pre class="ejemplo "&gt;
      jQuery.each( coleccion, callback(indiceEnElArray, valorDelElemento) )
    &lt;/pre&gt;

    &lt;p&gt;Para entender su funcionamiento lo mejor es ver algunos ejemplos de su uso.&lt;/p&gt;
    &lt;h4&gt;Utilizando jQuery.each con un array&lt;/h4&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      $.each([1,2,3],function(indice,valor) {
        log('Indice es ' + indice + ' y valor es: ' + valor);
      });
    &lt;/pre&gt;
    &lt;p&gt;La función pasada como argumento se ejecutará tantas veces como
    elementos tenga el array, además en cada ejecución recibirá como
    argumentos el índice del elemento sobre el cual está ejecutando
    y el elemento mismo (en nuestro código llamado &lt;code&gt;valor&lt;/code&gt;).&lt;/p&gt;

    
    &lt;h4&gt;Utilizando jQuery.each con un objeto&lt;/h4&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      var objeto = {'ojos': 'rojos', 'pelo': 'castaño', 'mirada': 'enigmatica' };
      $.each(objeto,function(clave,valor) {
        log('Clave es ' + clave + ' y valor es: ' + valor);
      });
    &lt;/pre&gt;
    
    &lt;p&gt;En este caso hicimos algo parecido, pero al tratarse de un
    objeto tiene más sentido llamar a &lt;code&gt;indice&lt;/code&gt;
    como &lt;code&gt;clave&lt;/code&gt; en el nombre de parametro de la función
    que se pasa como argumento.&lt;/p&gt;

    &lt;h4&gt;Utilizando jQuery.each con una colección del DOM&lt;/h4&gt;
    &lt;p&gt;Este es quizá el uso más común
    de &lt;strong&gt;&lt;code&gt;each&lt;/code&gt;&lt;/strong&gt;, y es cuando lo utilizamos
    con una colección de elementos de jQuery. En este caso podemos
    utilizar una sintáxis más cómoda omitiendo el primer argumento de
    each, ya que ejecutaremos each como método de la colección:&lt;/p&gt;
    &lt;ul&gt;
       &lt;li class="example"&gt;un li&lt;/li&gt;
       &lt;li class="example"&gt;otro li&lt;/li&gt;
    &lt;/ul&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      $('li.example').each(function(indice,valor) {
         log(indice,valor);
         $(valor).html('Soy el li número: ' + indice + ' del DOM.');
      });  
    &lt;/pre&gt;
    
    &lt;p&gt;Esta vez operamos sobre todos los &lt;code&gt;li&lt;/code&gt; del documento
    html, y reemplazamos el contenido por un texto específico en cada
    caso.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-8185914044334507474?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/8185914044334507474/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=8185914044334507474' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8185914044334507474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8185914044334507474'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/05/jquery-each-ejemplos.html' title='jquery each ejemplos'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-5826688476663322088</id><published>2011-05-31T20:51:00.004-03:00</published><updated>2011-06-03T15:47:04.017-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='split'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript split'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos javascript'/><title type='text'>javascript split</title><content type='html'>&lt;h3&gt;La función split de Javascript&lt;/h3&gt;
    &lt;p&gt;La función &lt;strong&gt;split&lt;/strong&gt; de javascript es un método de las cadenas utilizado para obtener array cuyos valores son componentes de la cadena.&lt;/p&gt;
    &lt;p&gt;El prototipo de la función es:&lt;/p&gt;
    &lt;pre class="ejemplo"&gt;
      string.split([separador][, limite])
    &lt;/pre&gt;
    &lt;p&gt;Separador puede ser o bien una cadena o bien una expresión
    regular, y es el patrón por el cual se va a cortar la cadena en
    los componentes que serán del array. La función siempre devuelve
    un array. Cuando se llama sin argumentos, se devolverá un array vacío.&lt;/p&gt;
    &lt;h3&gt;Ejemplos de split&lt;/h3&gt;
    &lt;p&gt;Podemos utilizar &lt;code&gt;split&lt;/code&gt; con una expresión regular
    como muestra el siguiente ejemplo:&lt;/p&gt;
    &lt;pre  class="ejemplo examplejavascript"&gt;
      var t = "Programando en Javascript".split(/ /); // devuelve el array ["Programando", "en", "Javascript"];
      log(t);
    &lt;/pre&gt;

    &lt;p&gt;En vez de usar una expresión regular podríamos utilizar una cadena y en el ejemplo anterior obtendríamos el mismo resultado:&lt;/p&gt;
    &lt;pre  class="ejemplo examplejavascript"&gt;
      var t = "Programando en Javascript".split(" "); // devuelve el array ["Programando", "en", "Javascript"];
      log(t);
    &lt;/pre&gt;
    
    &lt;p&gt;Utilizando &lt;code&gt;limit&lt;/code&gt; como segundo arguemento, podemos delimitar la cantidad de componentes máximos que tendremos en el array resultante:&lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      var t = "Programando en Javascript".split(" ",2); // devuelve el array ["Programando", "en"];
      log(t);
    &lt;/pre&gt;
    
    &lt;p&gt;El uso clásico del método &lt;code&gt;split&lt;/code&gt; es &lt;strong&gt;separar una lista de cadenas serpados por coma&lt;/strong&gt; por ejemplo:&lt;/p&gt;
    &lt;pre  class="ejemplo examplejavascript"&gt;
      var t = "1,2,3,4,5,6,7,8,9,10".split(','); // devuelve el array: ["1","2","3","4","5","6","7","8","9","10"];
      log(t);
    &lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-5826688476663322088?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/5826688476663322088/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=5826688476663322088' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5826688476663322088'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5826688476663322088'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/05/javascript-split.html' title='javascript split'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-104001618952965151</id><published>2011-05-31T20:29:00.005-03:00</published><updated>2011-06-03T15:48:42.887-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript replace'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='replace'/><title type='text'>Javascript replace</title><content type='html'>&lt;h3&gt;La función replace de Javascript&lt;/h3&gt;
    &lt;p&gt;La función &lt;strong&gt;replace&lt;/strong&gt; de javascript es un método de las cadenas utilizado para obtener una nueva cadena copia de la original con una porción reemplazada.&lt;/p&gt;
    &lt;p&gt;El prototipo de la función es:&lt;/p&gt;
    &lt;pre  class="ejemplo"&gt;
      string.replace(regexp|substr, newSubStr|function[, Non-standard flags]);
    &lt;/pre&gt;

    &lt;h3&gt;Ejemplos de replace&lt;/h3&gt;
    &lt;p&gt;Podemos utilizar &lt;code&gt;replace&lt;/code&gt; con una expresión regular
    como muestra el siguiente ejemplo:&lt;/p&gt;
    &lt;pre  class="ejemplo examplejavascript"&gt;
      var t = "Programando en Javascript".replace(/Programando/,"Hablando"); // devuelve "Hablando en Javascript";
      log(t);
    &lt;/pre&gt;

    &lt;p&gt;En vez de usar una expresión regular podríamos utilizar una cadena para el caso anterior:&lt;/p&gt;
    &lt;pre  class="ejemplo examplejavascript"&gt;
      var t = "Programando en Javascript".replace("Programando","Hablando"); // devuelve "Hablando en Javascript";
      log(t);
    &lt;/pre&gt;
    
    &lt;p&gt;Las expresiones regulares podrían utilizarse para reemplazar patrones más complejos o específicos, por ejemplo:&lt;/p&gt;
    &lt;pre  class="ejemplo examplejavascript"&gt;
      // en este ejemplo matecheamos un dígito mediante una expresión regular.
      var t = "Tengo 5 libros de Javascript".replace(/\d/,10); // devuelve "Tengo 10 libros de Javasript";
      log(t);
    &lt;/pre&gt;
    
    &lt;p&gt;Podría darse el caso que con el resultado del matcheo
    quisieramos tomar algún tipo de decisión para realizar el
    reemplazo. Por ejemplo el siguiente ejemplo sirve para incrementar
    el patrón capturado:&lt;/p&gt;
    &lt;pre  class="ejemplo examplejavascript"&gt; 
      function reemplazador(coincidencia1) {
        return parseInt(coincidencia1) + 1;
      } 
      var t = "Tengo 5 libros de Javascript".replace(/\d/,reemplazador); // devuelve "Tengo 6 libros de Javasript" ;
      log(t);
      var s = "Tengo 6 libros de Javascript".replace(/\d/,reemplazador); // devuelve "Tengo 7 libros de Javasript" ;
      log(s);
      var r = "Tengo 7 libros de Javascript".replace(/\d/,reemplazador); // devuelve "Tengo 8 libros de Javasript" ;
      log(r);
    &lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-104001618952965151?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/104001618952965151/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=104001618952965151' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/104001618952965151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/104001618952965151'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/05/javascript-repalce.html' title='Javascript replace'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-3312530945738249549</id><published>2011-05-31T20:19:00.005-03:00</published><updated>2011-06-03T15:42:56.571-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='javascript substring'/><category scheme='http://www.blogger.com/atom/ns#' term='substring'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos javascript'/><title type='text'>Javascript substring</title><content type='html'>&lt;h3&gt;La función substring&lt;/h3&gt;
    &lt;p&gt;La función &lt;strong&gt;substring&lt;/strong&gt; de javascript es un método que pertenece a las cadenas, y sirve para obtener una porción de la cadena&lt;/p&gt;
    &lt;p&gt;El prototipo de la función es:&lt;/p&gt;
    &lt;pre  class="ejemplo"&gt;
      string.substring(indice1[, indice2])
    &lt;/pre&gt;
    &lt;p&gt;Dónde &lt;code&gt;string&lt;/code&gt; es una cadena, &lt;code&gt;indice1&lt;/code&gt; un entero e &lt;code&gt;indice2&lt;/code&gt; otro entero opcional.&lt;/p&gt;
    &lt;h3&gt;Ejemplos de substring&lt;/h3&gt;
    &lt;p&gt;Sí &lt;code&gt;indice1&lt;/code&gt; e &lt;code&gt;indice2&lt;/code&gt; son iguales, substring devuelve una cadena vacía.&lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      "Programando en Javascript".substring(5,5); // devuelve ""
    &lt;/pre&gt;
    &lt;p&gt;Sí &lt;code&gt;indice2&lt;/code&gt; se omite, se devuelve una cadena desde la posición &lt;code&gt;indice1&lt;/code&gt; hasta el final de la cadena..&lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      "Programando en Javascript".substring(12); // devuelve "en Javascript"
    &lt;/pre&gt;
    
    &lt;p&gt;Si queremos quedarnos con una porción bien definida de la cadena podemos utilizar los dos índices de la siguiente manera: &lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      "Programando en Javascript".substring(0,11); // devuelve "Programando" 
    &lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-3312530945738249549?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/3312530945738249549/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=3312530945738249549' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/3312530945738249549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/3312530945738249549'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/05/javascript-substring.html' title='Javascript substring'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-4479607209676708980</id><published>2011-05-28T20:31:00.006-03:00</published><updated>2011-06-03T15:51:05.843-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ejemplos javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='arrays'/><category scheme='http://www.blogger.com/atom/ns#' term='arreglos'/><title type='text'>Arrays en javascript, ejemplos</title><content type='html'>&lt;h3&gt;Declaración de un array&lt;/h3&gt;

    &lt;p&gt;Un array o arreglo en Javascript tiene varias maneras de declararse algunos ejemplos:&lt;/p&gt;

    &lt;p&gt;Utilizando el constructor de array y el operador new: &lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      var arr1 = new Array(); // declarando un array vacio
      var arr2 = new Array(5); // declarando un array de 5 elementos (su propiedad length está en 5)
      var arr3 = new Array(3,3); // declarando un array de 2 elementos [3,3]
    &lt;/pre&gt;

    &lt;p&gt;La manera anterior no está recomendada porque da lugar a
    ambiguedades (lo cual puede notarse en las dos últimas declaraciones).&lt;/p&gt;
    &lt;p&gt;Una mejor manera de declarar arrays en Javascrip es utilizando la notación literal de Array, va el ejemplo:&lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      var arr4 = [];  // declarando un array vacío
      var arr5 = [0,0,0,0,0];  // declarando un array de 5 elementos cuyos valores son 0
      var arr6 = [3,3];  // declarando un array de 2 elementos cuyos valores son 3 y 3
    &lt;/pre&gt;

    &lt;h3&gt;Conocer el tamaño de un array&lt;/h3&gt;
    &lt;p&gt;Todos los arrays tienen una propiedad llamada &lt;code&gt;length&lt;/code&gt; que permite saber su tamaño.&lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      var arr7 = [1,2,3,4,5,6,7];
      log(arr7.length); // imprime 7 porque el array tiene 7 elementos.
    &lt;/pre&gt;
    &lt;p&gt;Hay que tener en cuenta que el &lt;code&gt;length&lt;/code&gt; no es el
    índice de la última posición del array. Como las posiciones
    comienzan a indexarse desde &lt;code&gt;0&lt;/code&gt; el índice de la última
    posición del array siempre puede calcularse utilizando &lt;code&gt;length - 1&lt;/code&gt; &lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      var arr8 = ["a","b","c"];
      log(arr8[arr8.length - 1]); // imprime "c", el último elemento del array
    &lt;/pre&gt;
    
    &lt;h3&gt;Accediendo a los objetos de un array&lt;/h3&gt;
    &lt;p&gt;Veamos como podemos acceder a los diferentes elementos del array:&lt;/p&gt;
    &lt;pre class="ejemplo examplejavascript"&gt;
      var arr = [1,2,3,4];
      log(arr[0]); // accediendo al primer elemento del array
      var  i;
      for(i = 0; i &lt; arr.length ; i++) { // listando los elementos del array
        log('En la posición: ' + i + ' esta el elemento: ' +  arr[i]);
      }
    &lt;/pre&gt;
    &lt;p&gt;Los índices de los arrays comienzan en 0&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-4479607209676708980?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/4479607209676708980/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=4479607209676708980' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4479607209676708980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4479607209676708980'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/05/arrays-en-javascript-ejemplos.html' title='Arrays en javascript, ejemplos'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-524108708467358480</id><published>2011-05-21T14:31:00.004-03:00</published><updated>2011-05-31T20:58:29.501-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='algoritmo de ordenacion'/><category scheme='http://www.blogger.com/atom/ns#' term='sort'/><category scheme='http://www.blogger.com/atom/ns#' term='insertion sort'/><title type='text'>Algoritmo de ordenación en C [INSERTION SORT]</title><content type='html'>&lt;pre class="ejemplo"&gt;&lt;span class="preprocessor"&gt;#&lt;/span&gt;&lt;span class="preprocessor"&gt;include&lt;/span&gt;&lt;span class="string"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;

&lt;span class="type"&gt;v&lt;/span&gt;&lt;span class="type"&gt;oi&lt;/span&gt;&lt;span class="type"&gt;d&lt;/span&gt; &lt;span class="function-name"&gt;swap&lt;/span&gt;(&lt;span class="type"&gt;int&lt;/span&gt; *&lt;span class="variable-name"&gt;e1&lt;/span&gt;,&lt;span class="type"&gt;int&lt;/span&gt; *&lt;span class="variable-name"&gt;e2&lt;/span&gt;) 
{
  &lt;span class="type"&gt;in&lt;/span&gt;&lt;span class="type"&gt;t&lt;/span&gt; &lt;span class="variable-name"&gt;tmp&lt;/span&gt; = *e1;
  *e1 = *e2;
  *e2 = tmp;
}

&lt;span class="type"&gt;voi&lt;/span&gt;&lt;span class="type"&gt;d&lt;/span&gt; &lt;span class="function-name"&gt;insertion_sort&lt;/span&gt;(&lt;span class="type"&gt;int&lt;/span&gt; &lt;span class="variable-name"&gt;s&lt;/span&gt;[], &lt;span class="type"&gt;int&lt;/span&gt; &lt;span class="variable-name"&gt;n&lt;/span&gt;)
{
  &lt;span class="type"&gt;in&lt;/span&gt;&lt;span class="type"&gt;t&lt;/span&gt; &lt;span class="variable-name"&gt;i&lt;/span&gt;,&lt;span class="variable-name"&gt;j&lt;/span&gt;;
  &lt;span class="keyword"&gt;f&lt;/span&gt;&lt;span class="keyword"&gt;or&lt;/span&gt; (i=1; i&amp;lt;n; i++) {
    j=i;
    &lt;span class="keyword"&gt;while&lt;/span&gt; ((j&amp;gt;0) &amp;amp;&amp;amp; (s[j] &amp;lt; s[j-1])) {
      swap(&amp;amp;s[j],&amp;amp;s[j-1]);
      j = j-1;
    }
  }
}

&lt;span class="type"&gt;voi&lt;/span&gt;&lt;span class="type"&gt;d&lt;/span&gt; &lt;span class="function-name"&gt;print_array&lt;/span&gt;(&lt;span class="type"&gt;int&lt;/span&gt; &lt;span class="variable-name"&gt;vect&lt;/span&gt;[], &lt;span class="type"&gt;int&lt;/span&gt; &lt;span class="variable-name"&gt;len&lt;/span&gt;) 
{
  &lt;span class="type"&gt;in&lt;/span&gt;&lt;span class="type"&gt;t&lt;/span&gt; &lt;span class="variable-name"&gt;i&lt;/span&gt;;
  printf(&lt;span class="string"&gt;&amp;quot;Imprimiendo array de: %d\n&amp;quot;&lt;/span&gt;, len);
  &lt;span class="keyword"&gt;for&lt;/span&gt;(i = 0; i &amp;lt; len ; i++) {
    printf(&lt;span class="string"&gt;&amp;quot;idx: %d = %d \n&amp;quot;&lt;/span&gt;, i,vect[i]);
  }
}

&lt;span class="type"&gt;in&lt;/span&gt;&lt;span class="type"&gt;t&lt;/span&gt; &lt;span class="function-name"&gt;main&lt;/span&gt;() 
{
  &lt;span class="type"&gt;in&lt;/span&gt;&lt;span class="type"&gt;t&lt;/span&gt; &lt;span class="variable-name"&gt;vect&lt;/span&gt;[10] = {9,5,7,8,4,3,2,5,6,1};
  print_array(vect,10);
  insertion_sort(vect,10);
  print_array(vect,10);
  &lt;span class="keyword"&gt;return&lt;/span&gt; 0;
}
&lt;/pre&gt;

&lt;p&gt;Para compilar utilizar:&lt;/p&gt;
&lt;pre&gt;
gcc -Wall insertion-sort.c -o insertion-sort.out
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-524108708467358480?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/524108708467358480/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=524108708467358480' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/524108708467358480'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/524108708467358480'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2011/05/algoritmo-de-ordenacion-en-c-insertion.html' title='Algoritmo de ordenación en C [INSERTION SORT]'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-5550641191363014316</id><published>2010-12-13T21:49:00.001-03:00</published><updated>2010-12-13T21:50:20.961-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='editores'/><category scheme='http://www.blogger.com/atom/ns#' term='tramp'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Conectarse remotamente utilizando GNU/Emacs, SSH y Tramp</title><content type='html'>&lt;h3&gt;Descripción&lt;/h3&gt;

    &lt;p&gt;Como conectarse a un servidor remoto utilizando mediante SSH utilizando GNU/Emacs y tramp.&lt;/p&gt;

    &lt;h3&gt;Por puerto default&lt;/h3&gt;

&lt;pre&gt;
C-x C-f /ssh:usuario@hostRemoto:/
&lt;/pre&gt;
    
    &lt;h3&gt;Por puerto 60&lt;/h3&gt;

&lt;pre&gt;
C-x C-f /ssh:usuario@hostRemoto#60:/
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-5550641191363014316?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/5550641191363014316/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=5550641191363014316' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5550641191363014316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5550641191363014316'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/12/conectarse-remotamente-utilizando.html' title='Conectarse remotamente utilizando GNU/Emacs, SSH y Tramp'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-4247757433327950358</id><published>2010-12-13T21:48:00.000-03:00</published><updated>2010-12-13T21:49:12.716-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='symfony'/><category scheme='http://www.blogger.com/atom/ns#' term='cli'/><category scheme='http://www.blogger.com/atom/ns#' term='command line'/><category scheme='http://www.blogger.com/atom/ns#' term='tareas'/><category scheme='http://www.blogger.com/atom/ns#' term='task'/><title type='text'>Tareas por línea de comando en Symfony</title><content type='html'>&lt;h3&gt;Borrar caché&lt;/h3&gt;
&lt;pre&gt;
php symfony cc
&lt;/pre&gt;
    &lt;h3&gt;Nuevo proyecto&lt;/h3&gt;
&lt;pre&gt;
php symfony generate:project &lt;PROJECT_NAME&gt;
&lt;/pre&gt;
    &lt;h3&gt;Nueva aplicación&lt;/h3&gt;
&lt;pre&gt;
php symfony generate:app &lt;APPLICATION_NAME&gt;
&lt;/pre&gt;
    &lt;h3&gt;Nuevo módulo&lt;/h3&gt;
&lt;pre&gt;
php symfony generate:module &lt;APPLICATION_NAME&gt; &lt;MODULE_NAME&gt;
&lt;/pre&gt;
    &lt;h3&gt;Nuevo programa BATCH/TASK&lt;/h3&gt;
&lt;pre&gt;
php symfony generate:task
&lt;/pre&gt;
    &lt;h3&gt;Genera las clases del modelo a partir del SCHEMA&lt;/h3&gt;
&lt;pre&gt;
php symfony doctrine-build-model
&lt;/pre&gt;
    &lt;h3&gt;Crear todo a partir del SCHEMA&lt;/h3&gt;
&lt;pre&gt;
php symfony doctrine-build-all-reload
&lt;/pre&gt;
    &lt;p&gt;Borra la base&lt;/p&gt;
    &lt;h3&gt;Ejecutar DQL&lt;/h3&gt;
&lt;pre&gt;
php symfony doctrine-dql frontend "FROM BlogPost p, p.Tags t"
&lt;/pre&gt;
    &lt;h3&gt;Ver todas las tareas disponibles para Doctrine&lt;/h3&gt;
&lt;pre&gt;
php symfony list doctrine
&lt;/pre&gt;
    &lt;h3&gt;Generar el SCHEMA a partir de la base de datos&lt;/h3&gt;
&lt;pre&gt;
php symfony doctrine:build-schema
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-4247757433327950358?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/4247757433327950358/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=4247757433327950358' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4247757433327950358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4247757433327950358'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/12/tareas-por-linea-de-comando-en-symfony.html' title='Tareas por línea de comando en Symfony'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-2208320075302861343</id><published>2010-12-13T21:47:00.001-03:00</published><updated>2010-12-13T21:47:50.043-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='working copy'/><category scheme='http://www.blogger.com/atom/ns#' term='status'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>Descripción de los status para los archivos versionados con Subversion</title><content type='html'>&lt;h3&gt;Descripción&lt;/h3&gt;
    &lt;p&gt;El significado de los diferentes status que se presentan en subversion al ejecutar el comando:&lt;/p&gt;
    &lt;script type="syntaxhighlighter" class="brush: bash"&gt;&lt;![CDATA[
svn status
    ]]&gt;&lt;/script&gt;
    &lt;table&gt;
      &lt;tr&gt;
        &lt;th&gt;Estado&lt;/th&gt;
        &lt;th&gt;Descripción&lt;/th&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;code&gt;U&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Fichero actualizado&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;code&gt;&amp;#160;&amp;#160;L&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Fichero bloqueado&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;code&gt;M&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Modificado localmente&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;code&gt;&amp;#160;&amp;#160;M&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Modificado localmente en sus propiedades, no en su contenido&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;code&gt;?&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Fichero ignorado (nuevo, hay que hacer un add)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;code&gt;!&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Fichero borrado por el usuario u otro programa (hay que hacer un del)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;code&gt;~&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Versionado como fichero pero es un directorio (o viceversa)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;code&gt;A +&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Añadido con historial de procedencia&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;code&gt;M +&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Añadido con historial y tiene modificaciones locales&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;code&gt;D&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Preparado para borrado&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;code&gt;A&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Preparado para añadir&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;code&gt;C&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Conflictos con un update&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;code&gt;&amp;#160;&amp;#160;S&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Directorio cambiado a rama&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;&lt;code&gt;G&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Modificado localmente e incorporados cambios remotos&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
    &lt;p&gt;Nota: La posición de la letra que identifica al estado del archivo es relevante para la descripción del mismo. Por ejemplo &lt;code&gt;M&lt;/code&gt; no significa el mismo estado que  &lt;code&gt;&amp;#160;&amp;#160;M&lt;/code&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-2208320075302861343?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/2208320075302861343/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=2208320075302861343' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2208320075302861343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2208320075302861343'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/12/descripcion-de-los-status-para-los.html' title='Descripción de los status para los archivos versionados con Subversion'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-4400069271444013444</id><published>2010-12-13T21:45:00.000-03:00</published><updated>2010-12-13T21:46:57.831-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='servidor'/><category scheme='http://www.blogger.com/atom/ns#' term='dns'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='dnsmasq'/><title type='text'>Mantener un servidor DNS local en Ubuntu</title><content type='html'>&lt;h3&gt;Descripción&lt;/h3&gt;
    &lt;p&gt;Acelera sensiblemente la navegación, ahorrando tiempo en la
    resolución de nombres, ya que tenemos un caché local con los
    nombres de dominio resueltos a su correspondiente Ip.&lt;/p&gt;
    &lt;h3&gt;Instalación&lt;/h3&gt;
&lt;pre&gt;
sudo aptitude install dnsmasq
&lt;/pre&gt;
    &lt;h3&gt;Copiando servidores DNS actuales para que use DNSMasq &lt;/h3&gt;
&lt;pre&gt;
sudo cp /etc/resolv.conf /etc/resolv.dnsmaq.conf
&lt;/pre&gt;
    &lt;h3&gt;Editamos archivo &lt;code&gt;/etc/resolv.conf&lt;/code&gt; y agregamos como primera línea:&lt;/h3&gt;
&lt;pre&gt;
nameserver 127.0.0.1
&lt;/pre&gt;
    &lt;h3&gt;Probamos velocidad de las queries ejecutando varias veces:&lt;/h3&gt;
&lt;pre&gt;
dig www.google.com.ar | grep Query
&lt;/pre&gt;
    &lt;h3&gt;Aumentamos el tamaño de la cache del servicio:&lt;/h3&gt;
&lt;pre&gt;
# Editar: vim /etc/dnsmasq.conf
# Set the cachesize here.
cache-size=5500
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-4400069271444013444?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/4400069271444013444/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=4400069271444013444' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4400069271444013444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4400069271444013444'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/12/mantener-un-servidor-dns-local-en.html' title='Mantener un servidor DNS local en Ubuntu'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-794678435029600974</id><published>2010-12-13T21:43:00.001-03:00</published><updated>2010-12-13T21:44:38.641-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='apt'/><category scheme='http://www.blogger.com/atom/ns#' term='apt-get'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ver los archivos de un paquete en Ubuntu</title><content type='html'>&lt;p&gt;Con &lt;code&gt;apt-file&lt;/code&gt; podemos ver los archivos de un paquete especifico.&lt;/p&gt;
&lt;pre&gt;
sudo apt-file install apt-file
sudo apt-file update
apt-file list package-name
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-794678435029600974?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/794678435029600974/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=794678435029600974' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/794678435029600974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/794678435029600974'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/12/ver-los-archivos-de-un-paquete-en.html' title='Ver los archivos de un paquete en Ubuntu'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-8545070274225531732</id><published>2010-12-13T21:42:00.000-03:00</published><updated>2010-12-13T21:43:03.894-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='password'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh'/><category scheme='http://www.blogger.com/atom/ns#' term='openssl'/><category scheme='http://www.blogger.com/atom/ns#' term='encriptación'/><title type='text'>Login por SSH sin password</title><content type='html'>&lt;h3&gt;Descripción&lt;/h3&gt;
    &lt;p&gt;Permite acceder de manera segura a un servidor mediante SSH sin tener que autenticarse con password.&lt;/p&gt;
    &lt;h3&gt;Generación de las claves en el HOST&lt;/h3&gt;
    &lt;p&gt;Lo primero que debemos hacer es generar claves con nuestro
    usuario en el HOST desde el cual queremos acceder al servidor para
      esto ejecutamos:&lt;/p&gt;
&lt;pre&gt;
ssh-keygen -t rsa
&lt;/pre&gt;
    &lt;p&gt;Este comando genera la clave pública y privada.&lt;/p&gt;
    &lt;h3&gt;Subiendo la clave pública al SERVIDOR:&lt;/h3&gt;
    &lt;p&gt;La clave pública debe ser subida al SERVIDOR al cual queremos
    conectarnos para esto utilizamos la copia
    segura &lt;code&gt;scp&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;
scp ~/.ssh/id_rsa.pub usuarioServidor@ip_servidor:/home/usuarioServidor/temporal
&lt;/pre&gt;
    &lt;p&gt;Ahora nos conectamos al servidor y agregamos la clave pública
      subida recientemente al archivo de claves autorizadas
      conocidos &lt;code&gt;.ssh/authorized_keys&lt;/code&gt;, para esto ejecutamos el siguiente comando en el servidor:&lt;/p&gt;
&lt;pre&gt;
cat temporal &amp;gt;&amp;gt; .ssh/authorized_keys
rm temporal # borramos la clave pública.
&lt;/pre&gt;
    &lt;p&gt;Esto debiera bastar para poder hacer login sin que se nos
    solicite contraseña.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-8545070274225531732?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/8545070274225531732/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=8545070274225531732' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8545070274225531732'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8545070274225531732'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/12/login-por-ssh-sin-password.html' title='Login por SSH sin password'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-8994816005786987075</id><published>2010-12-13T21:40:00.000-03:00</published><updated>2010-12-13T21:41:36.873-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='regexp'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='expresiones regulares'/><title type='text'>Expresiones regulares en GNU/Emacs</title><content type='html'>&lt;h3&gt;Descripción&lt;/h3&gt;

    &lt;p&gt;Notas sobre el uso y abuso de expresiones regulares en el
    editor GNU/Emacs. Basado en el manual de GNU/Emacs y su Wiki.&lt;/p&gt;

    &lt;h3&gt;Expresiones regulares&lt;/h3&gt;

    &lt;p&gt;Las expresiones regulares, son un patron que determinan un
    conjunto de cadenas (que puede ser incluso infinito).&lt;/p&gt;

    &lt;p&gt;Cuando una cadena pertenece a dicho conjunto, decimos que la
    expresión regular produce coincidencias sobre el conjunto.&lt;/p&gt;

    &lt;h4&gt;Caracteres ordinarios&lt;/h4&gt;

    &lt;p&gt;La expresión regular &lt;code&gt;a&lt;/code&gt;, es un caracter ordinario
    que produce coincidencias únicamente sobre la cadena
    &lt;code&gt;a&lt;/code&gt;. La concatenación de dos expresiones regulares
    produce otra expresión regular, así la expresión regular
    &lt;code&gt;aa&lt;/code&gt; produce coincidencias únicamente sobre la cadena
    &lt;code&gt;aa&lt;/code&gt;.&lt;/p&gt;

    &lt;p&gt;Por ejemplo que tengamos el siguiente texto en un buffer de
    Emacs. Para ejecutar una búsqueda hacia adelante de las cadenas
    sobre las cuales una expresión regular produce coíncidencias,
    hacemos uso de la función &lt;code&gt;search-forward-regexp&lt;/code&gt; cuyo
    key-binding por defecto es &lt;code&gt;C-M s&lt;/code&gt;. Así probamos
    ejecutar &lt;code&gt;C-M s a&lt;/code&gt; estando posicionados con el
    cursor al principio del buffer.&lt;/p&gt;

&lt;pre&gt;
bbab
AaA
&lt;/pre&gt;

    &lt;p&gt;Lo primero que vemos es que la función
    &lt;code&gt;search-forward-regexp&lt;/code&gt; iluminará varios trozos del
    buffer. En la primera línea iluminará la única &lt;code&gt;a&lt;/code&gt; que
    produce coíncidencias. En la segunda línea, las tres
    &lt;code&gt;a&lt;/code&gt;s aparecen iluminadas. Esto no significa que la
    expresión regular &lt;code&gt;a&lt;/code&gt; produzca coíncidencias con la
    cadena &lt;code&gt;AaA&lt;/code&gt; sino que produce coíncidencias sobre cada
    una de las &lt;code&gt;a&lt;/code&gt;s por separado. La segunda cuestión
    importante a destacar es que por defecto la mayoría de las
    funciones que utilizan expresiones regulares en Emacs producen
    coíncidencias tanto con minúsculas y con mayúsculas cuando los
    caracteres ordinarios de la expresión regular están en minúsculas,
    para activar (o desactivar) la distinción podemos ejecutar el
    key-binding &lt;code&gt;M-c&lt;/code&gt; cuando estemos dentro de la búsqueda
    (en el minibuffer). La distinción también se activará
    automáticamente si alguno de los caracteres ordinarios es
    introducido en mayúsculas. La subsecuente ejecución del
    key-binding &lt;code&gt;M-c&lt;/code&gt; marcará la coíncidencia actual que
    produce la función en otro color, esto nos permitirá movernos por
    las cadenas exactas que producen coíncidencias con la expresión
    regular búscada.
    &lt;/p&gt;

    &lt;h3&gt;Sintáxis&lt;/h3&gt;

    &lt;p&gt;La sintáxis de las expresiones regulares incluye caracteres
    ordinarios y construcciones especiales. Un caracter ordinario es
    una expresión regular simple, que produce coincidencias con el
    mismo caracter y con nada más. los caracteres especiales son
    &lt;code&gt;$&lt;/code&gt;, &lt;code&gt;^&lt;/code&gt;, &lt;code&gt;.&lt;/code&gt;, &lt;code&gt;*&lt;/code&gt;,
    &lt;code&gt;+&lt;/code&gt;, &lt;code&gt;?&lt;/code&gt;, &lt;code&gt;[&lt;/code&gt;, y &lt;code&gt;\&lt;/code&gt;.
    el caracter &lt;code&gt;]&lt;/code&gt; es especial si este termina un caracter
    de apertura de alternativa &lt;code&gt;[&lt;/code&gt;. el caracter
    &lt;code&gt;-&lt;/code&gt; es especial adentro del caracter de
    alternativa. cualquier otro caracter que aparezca es una expresión
    regular es ordinario, a menos que &lt;code&gt;\&lt;/code&gt; lo
    preceda. (cuando usas expresiones regulares en un programa lisp,
    cada &lt;code&gt;\&lt;/code&gt; debe ser duplicado.)&lt;/p&gt;

    &lt;p&gt;Por ejemplo, &lt;code&gt;f&lt;/code&gt; no es un caracter especial, es
    ordinario, y por lo tanto &lt;code&gt;f&lt;/code&gt; es una expresión regular
    simple que produce la coincidencia con la cadena &lt;code&gt;f&lt;/code&gt; y
    con ninguna otra cadena. (no produce coincidencias con la cdena
    &lt;code&gt;ff&lt;/code&gt;.) de la misma manera que &lt;code&gt;o&lt;/code&gt; es una
    expresión regular que produce la coincidencia sólo con la cadena
    &lt;code&gt;o&lt;/code&gt;. (Cuando las diferencias entre mayúsculas y
    minúsculas son ignoradas, estas expresiones regulares también
    producen coincidencias con las cadenas &lt;code&gt;F&lt;/code&gt; y
    &lt;code&gt;O&lt;/code&gt;, pero consideramos esta una generalización de "la
    misma cadena", en vez de una excepción.)&lt;/p&gt;

    &lt;p&gt;Cualesquiera dos expresiones regulares A y B pueden estar
    concatenadas. El resultado es una expresión regular que produce
    coincidencias con una cadena si A produce coincidencias sobre una
    parte del comienzo de la cadena y B produce coincidencias sobre el
    resto de la cadena.&lt;/p&gt;

    &lt;p&gt;Como un ejemplo simple, podemos concatenar las expresiones
    regulares &lt;code&gt;f&lt;/code&gt; y &lt;code&gt;o&lt;/code&gt; para obtener la
    expresión regular &lt;code&gt;fo&lt;/code&gt;, la cual produce coincidencias
    sólo con la cadena &lt;code&gt;fo&lt;/code&gt;. Aún trivial. Para hacer algo
    no trivial, se necesita usar alguno de los caracteres
    especiales. A continuación una lista detallada de estos:&lt;/p&gt;

    &lt;h4&gt;Definiciones de los caracteres especiales&lt;/h4&gt;

    &lt;dl&gt;
      &lt;dt&gt;&lt;code&gt;.&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;
        &lt;p&gt;Es una caracter especial que produce coincidencias sobre
        cualquier caracter excepto sobre el caracter de nueva
        línea. Usando la concatenación, podemos realizar expresiones
        regulares como &lt;code&gt;a.b&lt;/code&gt;, la cual produce coincidencias
        sobre cualquier cadena de tres caracteres que comience con
        &lt;code&gt;a&lt;/code&gt; y termine en &lt;code&gt;b&lt;/code&gt;.&lt;/p&gt;
      &lt;/dd&gt;

      &lt;dt&gt;&lt;code&gt;*&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;
        &lt;p&gt;No es una construcción en si misma; es un operador posfijo
        que significa que la expresión regular precedente a la que se
        aplica producirá coincidencias repetidamente cuantas veces sea
        posible. Por lo cual, &lt;code&gt;o*&lt;/code&gt; produce coincidencias
        cualquier número de &lt;code&gt;o&lt;/code&gt; (incluso la ausencia de
        &lt;code&gt;o&lt;/code&gt;). &lt;code&gt;*&lt;/code&gt; siempre aplica a la menor
        expresión precedente posible. Por lo que, &lt;code&gt;fo*&lt;/code&gt;
        produce repeticiones de &lt;code&gt;o&lt;/code&gt; no de la cadena
        &lt;code&gt;fo&lt;/code&gt;. Coincide con &lt;code&gt;f&lt;/code&gt;, &lt;code&gt;fo&lt;/code&gt;,
        &lt;code&gt;foo&lt;/code&gt;, etc.&lt;/p&gt;
      &lt;/dd&gt;

      &lt;dt&gt;&lt;code&gt;+&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;
        &lt;p&gt;Es un operador posfijo, similar a &lt;code&gt;*&lt;/code&gt; excepto
        que para producir coincidencias la expresión a la que aplica
        debe producir coincidencias al menos una vez. Así, por
        ejemplo, &lt;code&gt;ca+r&lt;/code&gt; coincide con la cadena
        &lt;code&gt;car&lt;/code&gt; y &lt;code&gt;caaaar&lt;/code&gt; pero no con la cadena
        &lt;code&gt;cr&lt;/code&gt;, en cambio la expresión regular
        &lt;code&gt;ca*r&lt;/code&gt; produce coincidencias sobre las tres
        cadenas.&lt;/p&gt;
      &lt;/dd&gt;

      &lt;dt&gt;&lt;code&gt;?&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;
        &lt;p&gt;Es un operador posfijo, similar a &lt;code&gt;*&lt;/code&gt; excepto
        que puede producir coincidencias con la expresión regular que
        le precede una vez o ninguna vez. Por ejemplo,
        &lt;code&gt;ca?r&lt;/code&gt; coincide con &lt;code&gt;car&lt;/code&gt; o con
        &lt;code&gt;cr&lt;/code&gt; y con nada más.&lt;/p&gt;
      &lt;/dd&gt;

      &lt;dt&gt;&lt;code&gt;*?&lt;/code&gt;, &lt;code&gt;+?&lt;/code&gt;, &lt;code&gt;?&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;
        &lt;p&gt;Son las versiones no-glotonas de los operadores
        anteriores. Los operadores &lt;code&gt;*&lt;/code&gt;, &lt;code&gt;+&lt;/code&gt;,
        &lt;code&gt;?&lt;/code&gt; normales son "glotones" en el sentido que
        producen coincidencias tanto como pueden. Seguidos de un
        &lt;code&gt;?&lt;/code&gt;, se convierten en operadores no glotones:
        producen coincidencias con lo mínimo posible.&lt;/p&gt;

        &lt;p&gt;Por lo tanto, &lt;code&gt;ab*&lt;/code&gt; y &lt;code&gt;ab*?&lt;/code&gt; pueden
        coincidir con la cadena &lt;code&gt;a&lt;/code&gt; y con la cadena
        &lt;code&gt;abbbb&lt;/code&gt;; pero si se intentara producir
        coincidencias contra la cadena &lt;code&gt;abbb&lt;/code&gt;, la expresión
        regular &lt;code&gt;ab*&lt;/code&gt; capturará la coincidencia
        &lt;code&gt;abbb&lt;/code&gt; (toda la cadena), en cambio
        &lt;code&gt;ab*?&lt;/code&gt; producirá la coincidencia sólo con
        &lt;code&gt;a&lt;/code&gt; (la mínima coincidencia válida).&lt;/p&gt;
      &lt;/dd&gt;

      &lt;dt&gt;&lt;code&gt;\{N\}&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;p&gt;Es un operador posfijo que específica la repetición N
      veces, esto es, la expresión regular precedente debe producir
      coincidencias exactamente N veces en una fila. Por ejemplo,
      &lt;code&gt;x\{4\}&lt;/code&gt; coincide con la cadena `xxxx` y con ninguna
      más.&lt;/p&gt;&lt;/dd&gt;

      &lt;dt&gt;&lt;code&gt;\{N,M\}&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;
        &lt;p&gt;Es un operador posfijo que especifica repetición entre N y
        M veces, esto es, la expresión regular precedente debe
        coincidir al menos N veces, pero no más que M veces. Sí M es
        omitido, entonces no hay límite superior, pero la expresión
        regular precedente debe coincidir al menos N veces. Por
        ejemplo: &lt;code&gt;\{0,1\}&lt;/code&gt; es equivalente a
        &lt;code&gt;?&lt;/code&gt;. `\{0,\} es equivalente a
        &lt;code&gt;*&lt;/code&gt;. &lt;code&gt;\{1,\}&lt;/code&gt; es equivalente a
        &lt;code&gt;+&lt;/code&gt;.&lt;/p&gt;
      &lt;/dd&gt;

      &lt;dt&gt;&lt;code&gt;[ ... ]&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;
        &lt;p&gt;Es un conjunto de caracteres, que comienza con &lt;code&gt;[&lt;/code&gt; y que
        es terminado por &lt;code&gt;]&lt;/code&gt;. En el caso más simple, los caracteres
        entre los parentesis son con los que este conjunto puede
        producir coincidencias.&lt;/p&gt;
        &lt;p&gt;Así &lt;code&gt;[ad]&lt;/code&gt; coincide con &lt;code&gt;a&lt;/code&gt; o con una
        &lt;code&gt;d&lt;/code&gt;, y &lt;code&gt;[ad]*&lt;/code&gt; coincide con cualquier
        cadena compuesta sólo de &lt;code&gt;a&lt;/code&gt; y de &lt;code&gt;d&lt;/code&gt;
        (incluyendo la cadena vacía), de lo cual se concluye que
        &lt;code&gt;[c[ad]*&lt;/code&gt; coincide con &lt;code&gt;cr&lt;/code&gt;,
        &lt;code&gt;car&lt;/code&gt;, &lt;code&gt;cdr&lt;/code&gt;, &lt;code&gt;caddaar&lt;/code&gt;,
        etc. &lt;/p&gt;

        &lt;p&gt;Se puede también, incluir rangos de caracteres en el
        conjunto, escribiendo el caracter de comienzo y el caracter de
        finalización con un &lt;code&gt;-&lt;/code&gt; entre ellos. Así,
        &lt;code&gt;[a-z]&lt;/code&gt; coincide con cualquier letra en minuscula
        ASCII. Los rangos pueden ser intercalados libremente con
        caracteres individuales, como en `[a-z$%.], el cual produce
        coincidencias con cualquier letra minúscula ASCII o
        &lt;code&gt;$&lt;/code&gt;, &lt;code&gt;%&lt;/code&gt; o el punto &lt;code&gt;.&lt;/code&gt;. &lt;/p&gt;

        &lt;p&gt;Notar que los caracteres especiales no tienen un
        significado especial dentro del conjunto de caracteres. Un
        conjunto completamente diferente de caracteres especiales
        existe dentro de los conjuntos de caracteres: &lt;code&gt;]&lt;/code&gt;,
        &lt;code&gt;-&lt;/code&gt; y &lt;code&gt;^&lt;/code&gt;. &lt;/p&gt;


        &lt;p&gt;Para incluír &lt;code&gt;]&lt;/code&gt; en un conjunto, se debe poner
        como primer caracter. Por ejemplo, &lt;code&gt;[]a]&lt;/code&gt; coincide
        con &lt;code&gt;]&lt;/code&gt; y con &lt;code&gt;a&lt;/code&gt;. Para incluír
        &lt;code&gt;-&lt;/code&gt;, se debe escribir &lt;code&gt;-&lt;/code&gt;como el primer
        o último caracter del conjunto, o poniendolo fuera de un
        rango. Así, &lt;code&gt;[]-]&lt;/code&gt; produce coincidencias con
        &lt;code&gt;]&lt;/code&gt; y con &lt;code&gt;-&lt;/code&gt;.&lt;/p&gt;

        &lt;p&gt;Para incluír &lt;code&gt;^&lt;/code&gt; en un conjunto, se lo pone en
        cualquier lugar distinto del principio del conjunto. (En el
        comienzo, significa el complemento del conjunto, ver más
        adelante.)&lt;/p&gt;
        
        &lt;p&gt;Cuando se utiliza un rango en una búsqueda no sensitiva a
        minúsculas y mayúsculas, se deben escribir ambos extremos del
        rango en mayúsculas, o en minúsculas, o ambos deben ser
        distintos de letras. El comportamiento de un rango que mezcla
        mayúsculas y minúsculas como &lt;code&gt;A-z&lt;/code&gt; es algo no
        definido, y puede cambiar en futuras versiones de
        GNU/Emacs.&lt;/p&gt;
      &lt;/dd&gt;

      &lt;dt&gt;&lt;code&gt;[^ ... ]&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;
        &lt;p&gt;&lt;code&gt;[^&lt;/code&gt; comienza un "conjunto de carcateres
        complementario", que produce coincidencias con cualquier
        caracter excepto con los que se especifiquen en dicho
        conjunto. Así, &lt;code&gt;[^a-z0-9A-Z]&lt;/code&gt; produce coincidencias
        con todos los caracteres &lt;strong&gt;excepto&lt;/strong&gt; con los
        dígitos y las letras ASCII.&lt;/p&gt;
        &lt;p&gt;&lt;code&gt;^&lt;/code&gt; no es un caracter especial a menos que sea
        el primer caracter. El caracter siguiente a &lt;code&gt;^&lt;/code&gt; es
        tratado como si fuese el primero (en otras palabras,
        &lt;code&gt;-&lt;/code&gt; y &lt;code&gt;]&lt;/code&gt; no son especiales allí).&lt;/p&gt;
        &lt;p&gt;Un conjunto de caracteres complementarios pueden producir
        coincidencias con una nueva línea, a menos que la nueva línea
        sea mencionada como uno de los caracteres con los cuales no se
        debe producir coincidencias. Este comportamiento contrasta al
        manejo de expresiones regulares hecho en programas como
        &lt;code&gt;grep&lt;/code&gt;.&lt;/p&gt;
      &lt;/dd&gt;

      &lt;dt&gt;&lt;code&gt;^&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;
        &lt;p&gt;Es un caracter especial que produce coincidencias con la
        cadena vacía, pero solo al comienzo de la línea del texto. En
        otro caso, la expresión no produce coincidencias con
        nada. Así, &lt;code&gt;^foo&lt;/code&gt; produce coincidencias con un
        &lt;code&gt;foo&lt;/code&gt; que este al comienzo de una línea.&lt;/p&gt;
        &lt;p&gt;Por razones de compatibilidad histórica, &lt;code&gt;^&lt;/code&gt; puede ser
        usado con este significado solamente al comienzo de una
        expresión regular, o luego de &lt;code&gt;(&lt;/code&gt; o &lt;code&gt;\|&lt;/code&gt;.&lt;/p&gt;
      &lt;/dd&gt;

      &lt;dt&gt;&lt;code&gt;$&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;
        &lt;p&gt;Es similar a &lt;code&gt;^&lt;/code&gt; pero produce coincidencias sólo
        al final de una línea. Así, &lt;code&gt;x+$&lt;/code&gt; produce
        coincidencias con una cadena de una &lt;code&gt;x&lt;/code&gt; o más al
        final de una línea.&lt;/p&gt;
        &lt;p&gt;Por razones de compatibilidad histórica, &lt;code&gt;$&lt;/code&gt; puede ser
        usado con este significado solo al final de una expresión
        regular, o antes de &lt;code&gt;\)&lt;/code&gt; o &lt;code&gt;\|&lt;/code&gt;.&lt;/p&gt;
      &lt;/dd&gt;


      &lt;dt&gt;&lt;code&gt;\&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;
        &lt;p&gt;Tiene dos funciones: Es un caracter para escapar los
        caracteres especiales (incluyendo &lt;code&gt;\&lt;/code&gt;), e introduce
        construcciones especiales adicionales.&lt;/p&gt;
        &lt;p&gt;Debido a que &lt;code&gt;\&lt;/code&gt; escapa los caracteres
        especiales, &lt;code&gt;\$&lt;/code&gt; es una expresión regular que
        produce coincidencias sólo con &lt;code&gt;$&lt;/code&gt;, y
        &lt;code&gt;\[&lt;/code&gt; es una expresión regular que produce
        coincidencias con solo con &lt;code&gt;[&lt;/code&gt;.&lt;/p&gt;
      &lt;/dd&gt;
    &lt;/dl&gt;

    &lt;p&gt;Nota: por razones de compatibilidad histórica, los caracteres
    especiales son tratados como ordinarios si aparecen en contextos
    dónde su significado especial no tiene sentido. Por ejemplo
    &lt;code&gt;*foo&lt;/code&gt; trata a &lt;code&gt;*&lt;/code&gt; como un caracter
    ordinario debido a que no precede una expresión sobre la cual
    &lt;code&gt;*&lt;/code&gt; pueda actuar. Es una mala práctica depender de este
    comportamiento; es mejor escapar los caracteres especiales en
    cualquier caso, sin importar dónde aparezcan.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-8994816005786987075?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/8994816005786987075/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=8994816005786987075' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8994816005786987075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8994816005786987075'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/12/expresiones-regulares-en-gnuemacs.html' title='Expresiones regulares en GNU/Emacs'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-2224021404184193268</id><published>2010-12-13T21:37:00.001-03:00</published><updated>2010-12-13T21:40:06.814-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='comprimir'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='descomprimir'/><title type='text'>Comprimir y descomprimir carpetas en GNU/Linux</title><content type='html'>&lt;h3&gt;Descripción&lt;/h3&gt;
    &lt;p&gt;Comprimir y descomprimir una carpeta en un entorno GNU/Linux o GNU/Ubuntu.&lt;/p&gt;
    &lt;h3&gt;Comprimir carpeta&lt;/h3&gt;
&lt;pre&gt;
tar -zcvf archivo-comprimido.tar.gz /tmp/carpeta-a-comprimir/
&lt;/pre&gt;
    &lt;h3&gt;Descomprimir carpeta &lt;/h3&gt;
&lt;pre&gt;
 tar -zxvf archivo-comprimido.tar.gz
&lt;/pre&gt;

    &lt;h3&gt;Desempaquetar un archivo tar&lt;/h3&gt;
&lt;pre&gt;
tar -cvf archivo.tar
&lt;/pre&gt;

    &lt;h3&gt;Desempaquetar un archivo tar&lt;/h3&gt;
&lt;pre&gt;
tar -xvf archivo.tar
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-2224021404184193268?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/2224021404184193268/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=2224021404184193268' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2224021404184193268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2224021404184193268'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/12/comprimir-y-descomprimir-carpetas-en.html' title='Comprimir y descomprimir carpetas en GNU/Linux'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-5883913827046990769</id><published>2010-12-13T21:32:00.003-03:00</published><updated>2010-12-13T21:37:37.746-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>Como borrar los directorios .svn de un directorio.</title><content type='html'>&lt;h3&gt;Descripción&lt;/h3&gt;
    &lt;p&gt;Como borrar los directorios &lt;code&gt;.svn&lt;/code&gt; de un directorio.&lt;/p&gt;
    &lt;h3&gt;Ejecutar&lt;/h3&gt;
&lt;pre&gt;
find . -name '.svn' -print0 | xargs -0 rm -rf
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-5883913827046990769?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/5883913827046990769/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=5883913827046990769' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5883913827046990769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5883913827046990769'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/12/como-borrar-los-directorios-svn-de-un.html' title='Como borrar los directorios .svn de un directorio.'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-1546998212531999595</id><published>2010-03-28T20:20:00.001-03:00</published><updated>2010-03-28T20:20:51.033-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subcadenas'/><category scheme='http://www.blogger.com/atom/ns#' term='strings'/><category scheme='http://www.blogger.com/atom/ns#' term='substr'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>substr: Como obtener subcadenas en PHP</title><content type='html'>&lt;p&gt;substr permite obtener una subcadena de una cadena, especificando
un comienzo de la subcadena y la longitud que se quiere obtener.&lt;/p&gt;

&lt;p&gt;La firma de la función es la siguiente:&lt;/p&gt;

&lt;pre&gt;
 cadena substr  (  cadena $string  ,  int $comienzo  [,  int $longitud  ] )
&lt;/pre&gt;

&lt;p&gt;Algunos ejemplos de uso son:&lt;/p&gt;

&lt;pre&gt;
$cadena = "Como obtener una subcadena.";
echo substr($cadena,4) . "\n"; // ` obtener una subcadena.`
echo substr($cadena,0,4) . "\n"; // `Como`
echo substr($cadena,-10) . "\n"; // `subacdena`
&lt;/pre&gt;

&lt;p&gt;En la última llamada a &lt;code&gt;substr&lt;/code&gt; utilizamos un número
negativo para el parametro &lt;code&gt;$comienzo&lt;/code&gt;, esto hace que el
comienzo a utilizar se cuente desde el final de la cadena hacia
adelante, así un &lt;code&gt;$comienzo&lt;/code&gt; de &lt;code&gt;-10&lt;/code&gt; como en el
ejemplo nos ubica al comienzo de la palabra &lt;b&gt;subcadena&lt;/b&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-1546998212531999595?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/1546998212531999595/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=1546998212531999595' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/1546998212531999595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/1546998212531999595'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/03/substr-como-obtener-subcadenas-en-php.html' title='substr: Como obtener subcadenas en PHP'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-6049471496738831243</id><published>2010-03-28T18:56:00.000-03:00</published><updated>2010-03-28T18:57:20.216-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='implode'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='arrays'/><title type='text'>PHP uso de la función implode</title><content type='html'>&lt;p&gt;La función implode sirve para obtener una cadena a apartir de un
array.  A la función se le pasa como argumento una cadena que sirve
para unir los pedazos del array y el array mismo que se debe
unir. &lt;/p&gt;

&lt;p&gt;La firma de la función es la siguiente:&lt;/p&gt;

&lt;pre&gt;
 cadena implode  (  string $union  ,  array $arr  )
&lt;/pre&gt;

&lt;p&gt;Entonces la podemos como en el ejemplo que sigue:&lt;/p&gt;

&lt;pre&gt;
&amp;lt?php
$arr = array( 'email1@example.com', 'email2@example.com', 'email3@example.com' );
$cc = implode($arr,','); 
echo $cc; 
// imprime:
// email1@example.com,email2@example.com,email3@example.com
?&amp;gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-6049471496738831243?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/6049471496738831243/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=6049471496738831243' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/6049471496738831243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/6049471496738831243'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/03/php-uso-de-la-funcion-implode.html' title='PHP uso de la función implode'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-6141381759835349656</id><published>2010-03-28T18:50:00.000-03:00</published><updated>2010-03-28T18:51:05.506-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='explode'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='arrays'/><title type='text'>La funcion explode de PHP</title><content type='html'>&lt;p&gt;La función explode sirve para dividir una cadena (string) en una
serie de valores que se guardan en un array. La cadena se divide por
el delimitador que se le indique&lt;/p&gt;

&lt;p&gt;La firma de explode es la siguiente:&lt;/p&gt;

&lt;pre&gt;
 array explode  (  cadena $delimitador  ,  cadena $cadena  [,  int $limite  ] ) 
&lt;/pre&gt;

&lt;p&gt;Algunos ejemplos:&lt;/p&gt;

&lt;pre&gt;
$cadena = "rojo negro azul violeta";
$arr = explode(" ", $cadena);

foreach($arr as $val) {
  echo  $val . "\n";
}

// imprime
// rojo
// negro
// azul
// violeta
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-6141381759835349656?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/6141381759835349656/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=6141381759835349656' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/6141381759835349656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/6141381759835349656'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/03/la-funcion-explode-de-php.html' title='La funcion explode de PHP'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-3090916600063107558</id><published>2010-03-28T18:40:00.002-03:00</published><updated>2010-03-28T18:43:20.789-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='header'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='redirect'/><title type='text'>Como realizar un redirect en PHP, funcion header</title><content type='html'>&lt;p&gt;La forma más sencilla de realizar un redirect en PHP es indicarle
al navegador en las cabeceras de respuesta que debe llevar al usuario
a otra página&lt;/p&gt;

&lt;p&gt;Utilizando PHP podemos enviar esta información con el uso de la 
función &lt;code&gt;header&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;Por ejemplo:&lt;/p&gt;

&lt;pre&gt;
header('Location: http://codigomaldito.blogspot.com/'); 
&lt;/pre&gt;

&lt;p&gt;Lo importante a tener en cuenta es que la
función &lt;code&gt;header&lt;/code&gt; se debe utilizar antes de que se imprima
cualquier otra información de la página. Es decir no debe haber
ni &lt;code&gt;echo&lt;/code&gt;s ni &lt;code&gt;print&lt;/code&gt;s ni ningúna salida como
bloques de html, sino la redirección no funcionará correctamente.&lt;/p&gt;

&lt;p&gt;Otro ejemplo:&lt;/code&gt;

&lt;pre&gt;
&amp;lt;?php
session_start();
if(!isset($_SESSION['login'])) {
  header('Location: login.php'); 
  exit();
}
?&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;p&amp;gt;
      Bienvenido al sitio.
    &amp;lt;/p&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;

&lt;p&gt;En este ejemplo si el usuario no está logueado (recuerden que sólo
es un ejemplo), lo redireccionamos a la página
de &lt;code&gt;login.php&lt;/code&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-3090916600063107558?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/3090916600063107558/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=3090916600063107558' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/3090916600063107558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/3090916600063107558'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/03/como-realizar-un-redirect-en-php.html' title='Como realizar un redirect en PHP, funcion header'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-5171996875699380798</id><published>2010-03-28T18:10:00.002-03:00</published><updated>2010-03-28T18:11:21.410-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='for'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Bucles: for en PHP</title><content type='html'>La sentencia &lt;code&gt;for&lt;/code&gt; en PHP tiene la misma estructura que 
la sentencia &lt;code&gt;for&lt;/code&gt; de C/C++ y derivados.

Su estrucutura es la siguiente:
&lt;pre&gt;
for (expr1; expr2; expr3)
    sentencia
&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;expr1&lt;/code&gt; se ejecutará una única vez,
de &lt;code&gt;expr2&lt;/code&gt; se evaluará su valor booleano, y se
ejecutará &lt;code&gt;sentencia&lt;/code&gt; y &lt;code&gt;expr3&lt;/code&gt; mientras que
de verdadero.&lt;/p&gt;

&lt;p&gt;Su uso más común es una expresión idiomática muy conocida heredada
desde C, y sirve para recorrer arrays.&lt;/code&gt;

&lt;pre&gt;
$arr  = array(1,2,3,4,5); 
for($i = 0; $i &amp;lt count($arr); $i++ ) {
   echo "En el indice: $i se encuentra el valor " . $arr[$i] . "\n";
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-5171996875699380798?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/5171996875699380798/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=5171996875699380798' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5171996875699380798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5171996875699380798'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/03/bucles-for-en-php.html' title='Bucles: for en PHP'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-872916751530801292</id><published>2010-03-28T18:02:00.001-03:00</published><updated>2010-03-28T18:02:25.634-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='foreach'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>foreach en php</title><content type='html'>&lt;p&gt;PHP tiene una estructura de control llamada &lt;code&gt;foreach&lt;/code&gt;
que nos permite recorrer un array de manera muy fácil.&lt;/p&gt;

&lt;p&gt;Su estructura es la siguiente:&lt;/p&gt;

&lt;pre&gt;
foreach (ARRAY as $valor)
    sentencia
&lt;/pre&gt;

&lt;p&gt;En este caso &lt;code&gt;ARRAY&lt;/code&gt; es un array o bien una expresión
que devuelve un array. Por cada posición del array se
ejecutará &lt;code&gt;sentencia&lt;/code&gt; y en cada una de estas ejecuciones la
varialbe &lt;code&gt;$valor&lt;/code&gt; tendrá como contenido el valor de la
posición actual del array.&lt;/p&gt;

&lt;p&gt;Otra forma que puede tomar &lt;code&gt;foreach&lt;/code&gt; es la siguiente:&lt;/p&gt;
&lt;pre&gt;
foreach (ARRAY as $clave =&amp;gt; $valor)
    sentencia
&lt;/pre&gt;

&lt;p&gt;En este caso lo que cambia es que no sólo tendremos acceso a los
valores de las posiciones del array sino también a los índices (o
claves en un array asociativo) que indexan al array.&lt;/p&gt;

&lt;p&gt;Veamos algunos ejemplos de los dos casos:&lt;/p&gt;

&lt;pre&gt;
$arr = array(1, 2, 3, 4);
foreach ($arr as $val) {
   echo $val . "\n"; 
}
// imprime:
// 1
// 2
// 3
// 4
&lt;/pre&gt;

&lt;p&gt;Y ahora usando la versión ampliada con indices:&lt;/p&gt;

&lt;pre&gt;
$arr = array(1, 2, 3, 4);
foreach ($arr as $key =&amp;gt; $val) {
   echo $key . ": " . $val . "\n"; 
}
// imprime:
// 0: 1
// 1: 2
// 2: 3
// 3: 4
&lt;/pre&gt;

&lt;p&gt;Recordar que los índices de los arrays comienzan en 0.&lt;/p&gt;

&lt;p&gt;Un último ejemplo lo mostraremos con arrays asociativos (sus
índices son strings)&lt;/p&gt;

&lt;pre&gt;
$arr = array('rojo' =&amp;gt; 1, 'verde' =&amp;gt; 2, 'azul' =&amp;gt; 3, 'marron' =&amp;gt; 4);
foreach ($arr as $key =&amp;gt; $val) {
   echo $key . ": " . $val . "\n"; 
}
// imprime:
// rojo: 1
// verde: 2
// azul: 3
// marron: 4
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-872916751530801292?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/872916751530801292/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=872916751530801292' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/872916751530801292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/872916751530801292'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/03/foreach-en-php.html' title='foreach en php'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-3856180134043672291</id><published>2010-03-28T17:48:00.000-03:00</published><updated>2010-03-28T17:49:03.993-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='switch'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Switch en PHP</title><content type='html'>&lt;p&gt;La sentencia &lt;code&gt;switch&lt;/code&gt; es similar a una serie de
sentencias &lt;code&gt;IF&lt;/code&gt; en la misma expresión. En muchas
ocasaiones, querremos comprar la misma variable o expresión, con
varios valores diferentes, y ejecutar una pieza de código según el
resultado de esta comparación.&lt;/p&gt;

&lt;p&gt;Aquí el ejemplo:&lt;/p&gt;

&lt;pre&gt;
if ($variable == 0) {
    echo "Variable es 0";
} elseif ($variable == 1) {
    echo "Variable es 1";
} elseif ($variable == 2) {
    echo "Variable es 2";
}


switch ($variable) {
    case 0:
        echo "Variable es 0 0";
        break;
    case 1:
        echo "Variable es 1";
        break;
    case 2:
        echo "Variable es 2";
        break;
    default:
        echo "Variable tiene otro valor distinto.";
        break;
}
&lt;/pre&gt;

&lt;p&gt;En este ejemplo se muestran códigos equivalentes con el uso
de &lt;code&gt;if&lt;/code&gt;s anidados y con &lt;code&gt;switch&lt;/code&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-3856180134043672291?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/3856180134043672291/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=3856180134043672291' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/3856180134043672291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/3856180134043672291'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/03/switch-en-php.html' title='Switch en PHP'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-2339132605992599388</id><published>2010-03-28T17:41:00.000-03:00</published><updated>2010-03-28T17:42:22.452-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='if else'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='if'/><title type='text'>if else, si no, decisiones en php</title><content type='html'>&lt;p&gt;&lt;code&gt;if&lt;/code&gt; y &lt;code&gt;else&lt;/code&gt; son palabras reservadas del
lenguaje PHP y su misión es modificar el flujo de ejecución del
programa. Es decir tomar decisiones dentro del programa.&lt;/p&gt;

&lt;p&gt;Veamos la estructura de &lt;code&gt;if&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;
if (CONDICION) {
  // CONDICION es verdadera 
}
&lt;/pre&gt;

&lt;p&gt;En el código anterior se evaluará &lt;code&gt;CONDICION&lt;/code&gt; y según su
valor booleano (verdadero o falseo) se ejecutará el código encerrado
entre llaves (en el caso verdadero). Si &lt;code&gt;CONDICION&lt;/code&gt; es
falso el código entre llaves se ignorará. Y se continuará con el
programa.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CONDICION&lt;/code&gt; puede ser cualquier expresión válida de PHP algunos ejemplos podrían ser:&lt;/p&gt;

&lt;pre&gt;
if ($resultadoExamen == 10) {
  echo 'Felicitaciones';
}
&lt;/pre&gt; 

&lt;pre&gt;
if ($resultadoExamen &amp;lt; 4) {
  echo 'Desaprobado';
} else {
  echo 'Aprobado';
}
&lt;/pre&gt; 

&lt;p&gt;En el último ejemplo escribimos una palabra reservada
más: &lt;code&gt;else&lt;/code&gt; esta palabra indica el código que se debe
ejecutar si la condición expresada en el &lt;code&gt;if&lt;/code&gt; resultó
falsa. Pero este código nunca se ejecutará si la condición es
verdadera.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-2339132605992599388?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/2339132605992599388/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=2339132605992599388' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2339132605992599388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2339132605992599388'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/03/if-else-si-no-decisiones-en-php.html' title='if else, si no, decisiones en php'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-8553808445998858240</id><published>2010-02-21T14:42:00.004-03:00</published><updated>2010-02-21T14:48:32.633-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='login'/><category scheme='http://www.blogger.com/atom/ns#' term='autenticacion'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='autentificacion'/><category scheme='http://www.blogger.com/atom/ns#' term='usuarios'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='registro'/><title type='text'>Como realizar un sistema de Login en PHP y MySQL</title><content type='html'>&lt;p&gt;En el siguiente artículo mostraremos como realizar un sistema
    de Login o Autenticación de usuarios con la ayuda de PHP y
    Mysql.&lt;/p&gt;

    &lt;h2&gt;Introducción a la autenticación&lt;/h2&gt;
    &lt;p&gt;La autenticación nos permite identificar a un usuario, cuando
    este presente su nombre de usuario y contraseña. En general estos
    datos son guardados por el servidor en una base de datos como
    MySQL y se utilizan para validar los datos ingresados en el
    momento del Login.&lt;/p&gt;
    &lt;p&gt;Una vez realizado el Login exitoso, se registra el login en la
    sesión. Esto nos permite asegurar páginas simplemente pidiendo que
    exista la sesión del usuario logueado.&lt;/p&gt;
    &lt;p&gt;La acción de Logout (o Cerrar sesión), se refiere a destruir
    esta información de la sesión, así el usuario dejará de ser un
    usuario autenticado.&lt;/p&gt;
    &lt;p&gt;La siguiente imagen muestra un diagrama dónde se representa el
    flujo antes explicado&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UxEcAeFyAZo/S4FxiK-tItI/AAAAAAAAABY/59P_z0px9zI/s1600-h/autenticacion_diagrama1.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 186px;" src="http://1.bp.blogspot.com/_UxEcAeFyAZo/S4FxiK-tItI/AAAAAAAAABY/59P_z0px9zI/s320/autenticacion_diagrama1.jpg" border="0" alt="Diagrama de flujo para lograr autenticación" id="BLOGGER_PHOTO_ID_5440754656717120210" /&gt;&lt;/a&gt;



    &lt;h2&gt;Base de datos&lt;/h2&gt;
    &lt;p&gt;Empecemos por crear la tabla necesaria para lograr la
    autenticación, requerimos minimamente almacenar un nombre de
    usuario y una contraseña, por lo que nuestra tabla de
    &lt;code&gt;usuarios&lt;/code&gt; llevará las columnas: &lt;code&gt;username&lt;/code&gt; y
    &lt;code&gt;password&lt;/code&gt;.&lt;/p&gt;
    &lt;p&gt;Nos conectamos a mysql o a phpmyadmin y creamos nuestra tabla de usuarios:&lt;/p&gt;


&lt;pre style="color: #FFF; background-color: #000;"&gt;
test@test-laptop:~/$ mysql -uroot -p
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 45
Server version: 5.1.37-1ubuntu5.1-log (Ubuntu)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql&gt; create database ejemplo;
Query OK, 1 row affected (0.00 sec)

mysql&gt; use ejemplo;
Database changed
mysql&gt; create table usuarios (id int not null auto_increment primary key, username varchar(100), password varchar(40)) type=innodb;
Query OK, 0 rows affected, 1 warning (0.14 sec)

mysql&gt; alter table usuarios add unique (username);
Query OK, 0 rows affected (0.27 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql&gt; describe usuarios;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(11)      | NO   | PRI | NULL    | auto_increment | 
| username | varchar(100) | YES  | UNI | NULL    |                | 
| password | varchar(40)  | YES  |     | NULL    |                | 
+----------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

&lt;/pre&gt;

&lt;p&gt;En la línea 13, es dónde creamos la tabla. Incorporamos una primary
key `id`, y en la línea 16 también agregamos un índice `unique` para
asegurarnos que los usuarios no tengan el `username` duplicado.&lt;/p&gt; 
&lt;p&gt;Por cuestiones de seguridad no guardaremos los passwords en texto
plano, por eso elegimos para la columna password un tamaño de 40
caracteres, ya que este es el ancho de cualquier cadena hasheada por
la función SHA1.&lt;/p&gt;

    &lt;h2&gt;Clase UserAutentication&lt;/h2&gt;
    &lt;p&gt;Pasemos ahora a escribir la clase de autenticación de usuario
    que se encargará de la mayoría del trabajo de nuestro sistema de
    Login. Las responsabilidades de esta clase serán: &lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Responder si el usuario actual está en sesión y autenticado.&lt;/li&gt;
      &lt;li&gt;Autenticar a un usuario contra la base de datos y guardar la
      autenticación en sesión con un username y password.&lt;/li&gt;
      &lt;li&gt;Desautenticar (logout) a un usuario que se encuentra en sesión.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;Definidas estas responsabilidades podemos ahora dar tres métodos públicos para cada una de estas:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;&lt;code&gt;bool isAuthenticated()&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code&gt;bool doLogin($username,$password)&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code&gt;doLogout()&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
    &lt;p&gt;La clase usará un objeto PDO proporcionado en el constructor
    por el cliente del objeto, o bien intentará crear uno con las
    constantes de clases predefinidas.&lt;/p&gt;
    &lt;p&gt;Definido esto pasamos a la implementación propiamente dicha de la clase:&lt;/p&gt;
    &lt;pre style="color: #FFF; background-color: #000;"&gt;
&lt;span style="color: #b0c4de;"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span style="color: #ff7f24;"&gt;/*&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;
 * UserAuthentication:
 *
 &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;*/&lt;/span&gt;


&lt;span style="color: #00ffff;"&gt;class&lt;/span&gt; &lt;span style="color: #98fb98;"&gt;UserAuthentication&lt;/span&gt;
{

  &lt;span style="color: #00ffff;"&gt;private&lt;/span&gt; $&lt;span style="color: #eedd82;"&gt;_session_namespace&lt;/span&gt; = &lt;span style="color: #ffa07a;"&gt;"sistema_usuario"&lt;/span&gt;; &lt;span style="color: #ff7f24;"&gt;/* &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;Nombre de
                                                      espacio para no
                                                      ensuciar en
                                                      cualquier lugar
                                                      el super arreglo
                                                      de $_SESSION &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;*/&lt;/span&gt;

  &lt;span style="color: #00ffff;"&gt;private&lt;/span&gt; $&lt;span style="color: #eedd82;"&gt;_user_table&lt;/span&gt; = &lt;span style="color: #ffa07a;"&gt;"usuarios"&lt;/span&gt;; &lt;span style="color: #ff7f24;"&gt;/* &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;Nombre de la tabla de usuarios &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;*/&lt;/span&gt;

  &lt;span style="color: #00ffff;"&gt;private&lt;/span&gt; $&lt;span style="color: #eedd82;"&gt;_db&lt;/span&gt;;

  &lt;span style="color: #ff7f24;"&gt;/* &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;Constantes de clase para crear una conexi&amp;#243;n por defecto &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;*/&lt;/span&gt;
  &lt;span style="color: #00ffff;"&gt;const&lt;/span&gt; &lt;span style="color: #ffc0cb; font-weight: bold;"&gt;default_db_user&lt;/span&gt; = &lt;span style="color: #ffa07a;"&gt;'root'&lt;/span&gt;;
  &lt;span style="color: #00ffff;"&gt;const&lt;/span&gt; &lt;span style="color: #ffc0cb; font-weight: bold;"&gt;default_db_pass&lt;/span&gt; = &lt;span style="color: #ffa07a;"&gt;'root'&lt;/span&gt;;
  &lt;span style="color: #00ffff;"&gt;const&lt;/span&gt; &lt;span style="color: #ffc0cb; font-weight: bold;"&gt;default_db_name&lt;/span&gt; = &lt;span style="color: #ffa07a;"&gt;'ejemplo'&lt;/span&gt;;
  &lt;span style="color: #00ffff;"&gt;const&lt;/span&gt; &lt;span style="color: #ffc0cb; font-weight: bold;"&gt;default_db_host&lt;/span&gt; = &lt;span style="color: #ffa07a;"&gt;'localhost'&lt;/span&gt;;

  &lt;span style="color: #ff7f24;"&gt;/*&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;
   * Debe recibir una conexi&amp;#243;n PDO v&amp;#225;lida o intentar&amp;#225; crear una.
   &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;*/&lt;/span&gt;
  &lt;span style="color: #00ffff;"&gt;public&lt;/span&gt; &lt;span style="color: #00ffff;"&gt;function&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;__construct&lt;/span&gt;($&lt;span style="color: #eedd82;"&gt;pdoConnection&lt;/span&gt; = &lt;span style="color: #7fffd4;"&gt;NULL&lt;/span&gt;)
  {
    &lt;span style="color: #00ffff;"&gt;if&lt;/span&gt;(!$&lt;span style="color: #eedd82;"&gt;pdoConnection&lt;/span&gt;)
      $&lt;span style="color: #eedd82;"&gt;pdoConnection&lt;/span&gt; = $&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #FFF; background-color: #000;"&gt;getConnection&lt;/span&gt;();
    $&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #eedd82;"&gt;_db&lt;/span&gt; = $&lt;span style="color: #eedd82;"&gt;pdoConnection&lt;/span&gt;;
  }

  &lt;span style="color: #ff7f24;"&gt;/*&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;
   * Crea una conexi&amp;#243;n PDO con los datos por default definidos como
   * constantes de clase.
   &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;*/&lt;/span&gt;
  &lt;span style="color: #00ffff;"&gt;private&lt;/span&gt; &lt;span style="color: #00ffff;"&gt;function&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;getConnection&lt;/span&gt;()
  {
    $&lt;span style="color: #eedd82;"&gt;dsn&lt;/span&gt; = &lt;span style="color: #ffa07a;"&gt;'mysql:dbname='&lt;/span&gt;.&lt;span style="color: #7fffd4;"&gt;self&lt;/span&gt;::&lt;span style="color: #FFF; background-color: #000;"&gt;default_db_name.&lt;/span&gt;&lt;span style="color: #ffa07a;"&gt;';host='&lt;/span&gt;.&lt;span style="color: #7fffd4;"&gt;self&lt;/span&gt;::&lt;span style="color: #FFF; background-color: #000;"&gt;default_db_host;&lt;/span&gt;
    &lt;span style="color: #00ffff;"&gt;try&lt;/span&gt; {
      $&lt;span style="color: #eedd82;"&gt;dbh&lt;/span&gt; = &lt;span style="color: #00ffff;"&gt;new&lt;/span&gt; &lt;span style="color: #98fb98;"&gt;PDO&lt;/span&gt;($&lt;span style="color: #eedd82;"&gt;dsn&lt;/span&gt;, &lt;span style="color: #7fffd4;"&gt;self&lt;/span&gt;::&lt;span style="color: #FFF; background-color: #000;"&gt;default_db_user,&lt;/span&gt; &lt;span style="color: #7fffd4;"&gt;self&lt;/span&gt;::&lt;span style="color: #FFF; background-color: #000;"&gt;default_db_pass)&lt;/span&gt;;
    } &lt;span style="color: #00ffff;"&gt;catch&lt;/span&gt; (&lt;span style="color: #98fb98;"&gt;PDOException&lt;/span&gt; $&lt;span style="color: #eedd82;"&gt;e&lt;/span&gt;) {
      &lt;span style="color: #FFF; background-color: #000;"&gt;die(&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;'Connection failed: '&lt;/span&gt; . $&lt;span style="color: #eedd82;"&gt;e&lt;/span&gt;-&amp;gt;&lt;span style="color: #FFF; background-color: #000;"&gt;getMessage&lt;/span&gt;() );
    }
    &lt;span style="color: #00ffff;"&gt;return&lt;/span&gt; $&lt;span style="color: #eedd82;"&gt;dbh&lt;/span&gt;;
  }
  
  &lt;span style="color: #ff7f24;"&gt;/*&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;
   * Responde si el usuario activo est&amp;#225; autenticado en sesi&amp;#243;n.
   &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;*/&lt;/span&gt;
  &lt;span style="color: #00ffff;"&gt;public&lt;/span&gt; &lt;span style="color: #00ffff;"&gt;function&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;isAuthenticated&lt;/span&gt;()
  {
    &lt;span style="color: #00ffff;"&gt;return&lt;/span&gt; $&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #FFF; background-color: #000;"&gt;getSession&lt;/span&gt;(&lt;span style="color: #ffa07a;"&gt;'user_authenticated'&lt;/span&gt;) === &lt;span style="color: #7fffd4;"&gt;true&lt;/span&gt;;
  }
  &lt;span style="color: #ff7f24;"&gt;/*&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;
   * Realiza un Login y guarda los datos en sesi&amp;#243;n.
   &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;*/&lt;/span&gt;
  &lt;span style="color: #00ffff;"&gt;public&lt;/span&gt; &lt;span style="color: #00ffff;"&gt;function&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;doLogin&lt;/span&gt;($&lt;span style="color: #eedd82;"&gt;username&lt;/span&gt;,$&lt;span style="color: #eedd82;"&gt;password&lt;/span&gt;)
  {
    $&lt;span style="color: #eedd82;"&gt;result&lt;/span&gt; = $&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #FFF; background-color: #000;"&gt;checkLoginInDB&lt;/span&gt;($&lt;span style="color: #eedd82;"&gt;username&lt;/span&gt;,$&lt;span style="color: #eedd82;"&gt;password&lt;/span&gt;);
    &lt;span style="color: #00ffff;"&gt;if&lt;/span&gt;(!$&lt;span style="color: #eedd82;"&gt;result&lt;/span&gt;) {
      $&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #FFF; background-color: #000;"&gt;doLogout&lt;/span&gt;();
      &lt;span style="color: #00ffff;"&gt;return&lt;/span&gt; &lt;span style="color: #7fffd4;"&gt;false&lt;/span&gt;;
    }

    $&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #FFF; background-color: #000;"&gt;setSession&lt;/span&gt;(&lt;span style="color: #ffa07a;"&gt;'user_authenticated'&lt;/span&gt;,&lt;span style="color: #7fffd4;"&gt;true&lt;/span&gt;);
    $&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #FFF; background-color: #000;"&gt;setSession&lt;/span&gt;(&lt;span style="color: #ffa07a;"&gt;'username'&lt;/span&gt;,$&lt;span style="color: #eedd82;"&gt;result&lt;/span&gt;[&lt;span style="color: #ffa07a;"&gt;'username'&lt;/span&gt;]);
    $&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #FFF; background-color: #000;"&gt;setSession&lt;/span&gt;(&lt;span style="color: #ffa07a;"&gt;'id'&lt;/span&gt;,$&lt;span style="color: #eedd82;"&gt;result&lt;/span&gt;[&lt;span style="color: #ffa07a;"&gt;'id'&lt;/span&gt;]);

    &lt;span style="color: #00ffff;"&gt;return&lt;/span&gt; &lt;span style="color: #7fffd4;"&gt;true&lt;/span&gt;;
  }

  &lt;span style="color: #ff7f24;"&gt;/*&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;
   * Quita al usuario de sesi&amp;#243;n.
   &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;*/&lt;/span&gt;
  &lt;span style="color: #00ffff;"&gt;public&lt;/span&gt; &lt;span style="color: #00ffff;"&gt;function&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;doLogout&lt;/span&gt;()
  {
    $&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #FFF; background-color: #000;"&gt;destroySession&lt;/span&gt;();
  }

  &lt;span style="color: #ff7f24;"&gt;/*&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;
   * Verifica si el usuario est&amp;#225; en la base de datos.
   &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;*/&lt;/span&gt;
  &lt;span style="color: #00ffff;"&gt;private&lt;/span&gt; &lt;span style="color: #00ffff;"&gt;function&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;checkLoginInDB&lt;/span&gt;($&lt;span style="color: #eedd82;"&gt;username&lt;/span&gt;,$&lt;span style="color: #eedd82;"&gt;password&lt;/span&gt;)
  {
    &lt;span style="color: #00ffff;"&gt;try&lt;/span&gt; {
      $&lt;span style="color: #eedd82;"&gt;query&lt;/span&gt; = &lt;span style="color: #ffa07a;"&gt;'SELECT id, username FROM '&lt;/span&gt;. $&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #eedd82;"&gt;_user_table&lt;/span&gt; . &lt;span style="color: #ffa07a;"&gt;' WHERE '&lt;/span&gt;;
      $&lt;span style="color: #eedd82;"&gt;query&lt;/span&gt; .= &lt;span style="color: #ffa07a;"&gt;' username = ? AND password = ? '&lt;/span&gt;;
      $&lt;span style="color: #eedd82;"&gt;sth&lt;/span&gt; = $&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #eedd82;"&gt;_db&lt;/span&gt;-&amp;gt;&lt;span style="color: #FFF; background-color: #000;"&gt;prepare&lt;/span&gt;($&lt;span style="color: #eedd82;"&gt;query&lt;/span&gt;);
      $&lt;span style="color: #eedd82;"&gt;sth&lt;/span&gt;-&amp;gt;&lt;span style="color: #FFF; background-color: #000;"&gt;execute&lt;/span&gt;(&lt;span style="color: #FFF; background-color: #000;"&gt;array(&lt;/span&gt;$&lt;span style="color: #eedd82;"&gt;username&lt;/span&gt;,$&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #FFF; background-color: #000;"&gt;encryptPassword&lt;/span&gt;($&lt;span style="color: #eedd82;"&gt;password&lt;/span&gt;)));
      &lt;span style="color: #00ffff;"&gt;return&lt;/span&gt; $&lt;span style="color: #eedd82;"&gt;sth&lt;/span&gt;-&amp;gt;&lt;span style="color: #FFF; background-color: #000;"&gt;fetch&lt;/span&gt;(&lt;span style="color: #98fb98;"&gt;PDO&lt;/span&gt;::&lt;span style="color: #FFF; background-color: #000;"&gt;FETCH_ASSOC)&lt;/span&gt;;
    } &lt;span style="color: #00ffff;"&gt;catch&lt;/span&gt; (&lt;span style="color: #98fb98;"&gt;PDOException&lt;/span&gt; $&lt;span style="color: #eedd82;"&gt;e&lt;/span&gt;) {
      &lt;span style="color: #FFF; background-color: #000;"&gt;die(&lt;/span&gt; &lt;span style="color: #ffa07a;"&gt;'Query failed: '&lt;/span&gt; . $&lt;span style="color: #eedd82;"&gt;e&lt;/span&gt;-&amp;gt;&lt;span style="color: #FFF; background-color: #000;"&gt;getMessage&lt;/span&gt;() );
    }
  }

  &lt;span style="color: #ff7f24;"&gt;/*&lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;
   * Encripta un password en texto plano.
   &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;*/&lt;/span&gt;
  &lt;span style="color: #00ffff;"&gt;private&lt;/span&gt; &lt;span style="color: #00ffff;"&gt;function&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;encryptPassword&lt;/span&gt;($&lt;span style="color: #eedd82;"&gt;password&lt;/span&gt;)
  {
    &lt;span style="color: #00ffff;"&gt;return&lt;/span&gt; &lt;span style="color: #FFF; background-color: #000;"&gt;sha1(&lt;/span&gt;$&lt;span style="color: #eedd82;"&gt;password&lt;/span&gt;);
  }
  
  &lt;span style="color: #00ffff;"&gt;private&lt;/span&gt; &lt;span style="color: #00ffff;"&gt;function&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;getSession&lt;/span&gt;($&lt;span style="color: #eedd82;"&gt;key&lt;/span&gt;)
  {
    $&lt;span style="color: #eedd82;"&gt;session&lt;/span&gt; = $&lt;span style="color: #7fffd4;"&gt;_SESSION&lt;/span&gt;[$&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #eedd82;"&gt;_session_namespace&lt;/span&gt;];
    &lt;span style="color: #00ffff;"&gt;if&lt;/span&gt;(&lt;span style="color: #FFF; background-color: #000;"&gt;isset(&lt;/span&gt;$&lt;span style="color: #eedd82;"&gt;session&lt;/span&gt;[$&lt;span style="color: #eedd82;"&gt;key&lt;/span&gt;]))
      &lt;span style="color: #00ffff;"&gt;return&lt;/span&gt; $&lt;span style="color: #eedd82;"&gt;session&lt;/span&gt;[$&lt;span style="color: #eedd82;"&gt;key&lt;/span&gt;];
    &lt;span style="color: #00ffff;"&gt;return&lt;/span&gt; &lt;span style="color: #7fffd4;"&gt;null&lt;/span&gt;;
  }
  &lt;span style="color: #00ffff;"&gt;private&lt;/span&gt; &lt;span style="color: #00ffff;"&gt;function&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;setSession&lt;/span&gt;($&lt;span style="color: #eedd82;"&gt;key&lt;/span&gt;,$&lt;span style="color: #eedd82;"&gt;val&lt;/span&gt;)
  {
    &lt;span style="color: #00ffff;"&gt;return&lt;/span&gt; $&lt;span style="color: #7fffd4;"&gt;_SESSION&lt;/span&gt;[$&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #eedd82;"&gt;_session_namespace&lt;/span&gt;][$&lt;span style="color: #eedd82;"&gt;key&lt;/span&gt;] = $&lt;span style="color: #eedd82;"&gt;val&lt;/span&gt;;
  }
  &lt;span style="color: #00ffff;"&gt;private&lt;/span&gt; &lt;span style="color: #00ffff;"&gt;function&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;destroySession&lt;/span&gt;()
  {
    $&lt;span style="color: #7fffd4;"&gt;_SESSION&lt;/span&gt;[$&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #eedd82;"&gt;_session_namespace&lt;/span&gt;] = &lt;span style="color: #7fffd4;"&gt;null&lt;/span&gt;;
    &lt;span style="color: #FFF; background-color: #000;"&gt;unset(&lt;/span&gt;$&lt;span style="color: #7fffd4;"&gt;_SESSION&lt;/span&gt;[$&lt;span style="color: #7fffd4;"&gt;this&lt;/span&gt;-&amp;gt;&lt;span style="color: #eedd82;"&gt;_session_namespace&lt;/span&gt;]);
  }

}
&lt;/pre&gt;

&lt;h2&gt;Asegurando páginas&lt;/h2&gt;
&lt;p&gt;Ahora sólo nos queda asegurar páginas valiendonos de la clase
&lt;code&gt;UserAuthentication&lt;/code&gt;. Para esto vamos a guiarnos por el
diagrama de flujo antes mostrado.&lt;/p&gt;
&lt;p&gt;Entonces suponiendo que queremos asegurar una página
&lt;code&gt;galeria.php&lt;/code&gt; usamos el siguiente código:&lt;/p&gt;
    &lt;pre style="color: #FFF; background-color: #000;"&gt;
&lt;span style="color: #b0c4de; font-weight: bold; font-style: italic; "&gt;&amp;lt;?php
require_once('UserAuthentication.class.php');  
// utilizamos conexion por defecto.
$userAuthentication = new UserAuthentication();

if(!$userAuthentication-&amp;gt;isAuthenticated()) {
  // el usuario no est&amp;#225; autenticado requiere login.
  header( "Location: /login/login.php?uri=". base64_encode($_SERVER["REQUEST_URI"]));
}
// contenido seguro
?&amp;gt;&lt;/span&gt;
&amp;lt;html&lt;span style="color: #ffc0cb; font-weight: bold;"&gt;&amp;gt;&lt;/span&gt;
  &amp;lt;head&amp;gt;
  &amp;lt;title&amp;gt;Pagina segura&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;Contenido seguro
  &amp;lt;a href="http://localhost/login/logout.php"&amp;gt;Cerrar sesion&amp;lt;/a&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;


&lt;p&gt;El archivo &lt;code&gt;login.php&lt;/code&gt; es el formulario que se encargará
de autenticar, también valiéndose de la clase
&lt;code&gt;UserAuthentication&lt;/code&gt;:&lt;/p&gt;

    &lt;pre style="color: #FFF; background-color: #000;"&gt;
&lt;span style="color: #b0c4de; font-weight: bold; font-style: italic; "&gt;&amp;lt;?php
require_once('UserAuthentication.class.php');  
if(isset($_POST['username']) &amp;amp;&amp;amp; $_POST['password']) {
  $username = $_POST['username'];
  $password = $_POST['password'];
  $uri = isset($_POST['uri']) &amp;amp;&amp;amp; !empty($_POST['uri']) ? base64_decode($_POST['uri']) : '/';
  $userAuthentication = new UserAuthentication();
  if($userAuthentication-&amp;gt;doLogin($username,$password)) {
    header("Location: ". $uri);
  } else {
    $msg_error = 'Usuario o password invalidos';
  }
}
?&amp;gt;&lt;/span&gt;&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
  &amp;lt;title&amp;gt;Login&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &lt;span style="color: #b0c4de; font-weight: bold; font-style: italic; text-decoration: underline;"&gt;&amp;lt;?php if(isset($msg_error)): ?&amp;gt;&lt;/span&gt;
       &amp;lt;p &lt;span style="color: #b0c4de; font-weight: bold; font-style: italic; text-decoration: underline;"&gt;style="color: red;"&lt;/span&gt;&amp;gt;&lt;span style="color: #b0c4de; font-weight: bold; font-style: italic; text-decoration: underline;"&gt;&amp;lt;?php echo $msg_error ?&amp;gt;&lt;/span&gt;&amp;lt;/p&amp;gt;
    &lt;span style="color: #b0c4de; font-weight: bold; font-style: italic; text-decoration: underline;"&gt;&amp;lt;?php endif; ?&amp;gt;&lt;/span&gt;
    &amp;lt;form method="post" action="login.php"&amp;gt;
      Usuario: &amp;lt;input type="text" name="username" /&amp;gt;&amp;lt;br /&amp;gt;
      Password: &amp;lt;input type="password" name="password" /&amp;gt;
      &amp;lt;input name="uri" type="hidden" value="&lt;span style="color: #b0c4de; font-weight: bold; font-style: italic; "&gt;&amp;lt;?php echo isset($_GET['uri']) ? $_GET['uri'] : ''  ?&amp;gt;&lt;/span&gt;" /&amp;gt;&amp;lt;br /&amp;gt;
      &amp;lt;input type="submit" /&amp;gt;
    &amp;lt;/form&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;

&lt;p&gt;Por último el script &lt;code&gt;logout.php&lt;/code&gt; se encargará de de
destruir la sessión.&lt;/p&gt;

    &lt;pre style="color: #FFF; background-color: #000;"&gt;
&lt;span style="color: #b0c4de; font-weight: bold; font-style: italic; "&gt;&amp;lt;?php
require_once('UserAuthentication.class.php');  
$userAuthentication = new UserAuthentication();
$userAuthentication-&amp;gt;doLogout();
?&amp;gt;&lt;/span&gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Logout&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
      Sesion cerrada
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-8553808445998858240?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/8553808445998858240/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=8553808445998858240' title='17 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8553808445998858240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8553808445998858240'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2010/02/como-realizar-un-sistema-de-login-en.html' title='Como realizar un sistema de Login en PHP y MySQL'/><author><name>Author</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_UxEcAeFyAZo/S4FxiK-tItI/AAAAAAAAABY/59P_z0px9zI/s72-c/autenticacion_diagrama1.jpg' height='72' width='72'/><thr:total>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-8486089455899345346</id><published>2009-02-10T21:36:00.001-02:00</published><updated>2009-02-10T22:08:08.087-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='link'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Review de Emacs</title><content type='html'>En el sitio argentino Taringa publican una buena &lt;a href="http://www.taringa.net/posts/linux/2138611/GNU_Emacs-especial-para-nerds.html"&gt;review de Emacs&lt;/a&gt; desde la perspectiva de un programador.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-8486089455899345346?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.taringa.net/posts/linux/2138611/GNU_Emacs-especial-para-nerds.html' title='Review de Emacs'/><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/8486089455899345346/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=8486089455899345346' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8486089455899345346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8486089455899345346'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2009/02/review-de-emacs.html' title='Review de Emacs'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-156815511351875954</id><published>2008-06-26T13:14:00.002-03:00</published><updated>2008-06-26T14:12:07.025-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='tipos de datos primitivos'/><title type='text'>Valores por defecto en java</title><content type='html'>&lt;p&gt;Cuando se crea un objeto de una clase que posee miembros sin inicializar Java utilizará un valor por defecto para los miembros. El siguiente ejemplo ilustra la situación al crear una objeto de la clase Valores, e imprimir uno a uno sus miembros:&lt;/p&gt;
  &lt;pre style="color: #FFFFFF; background-color: #000000;"&gt;

&lt;span style="color: #E41C19;"&gt;class&lt;/span&gt; &lt;span style="color: #98fb98;"&gt;Valores&lt;/span&gt; {
  &lt;span style="color: #98fb98;"&gt;boolean&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;b&lt;/span&gt;;
  &lt;span style="color: #98fb98;"&gt;char&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;c&lt;/span&gt;;
  &lt;span style="color: #98fb98;"&gt;byte&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;by&lt;/span&gt;;
  &lt;span style="color: #98fb98;"&gt;short&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;s&lt;/span&gt;;
  &lt;span style="color: #98fb98;"&gt;int&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;i&lt;/span&gt;;
  &lt;span style="color: #98fb98;"&gt;long&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;l&lt;/span&gt;;
  &lt;span style="color: #98fb98;"&gt;float&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;f&lt;/span&gt;;
  &lt;span style="color: #98fb98;"&gt;double&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;d&lt;/span&gt;;
}


&lt;span style="color: #E41C19;"&gt;class&lt;/span&gt; &lt;span style="color: #98fb98;"&gt;defecto&lt;/span&gt; {
  &lt;span style="color: #E41C19;"&gt;private&lt;/span&gt; &lt;span style="color: #E41C19;"&gt;static&lt;/span&gt; &lt;span style="color: #98fb98;"&gt;void&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;log&lt;/span&gt;(&lt;span style="color: #98fb98;"&gt;String&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;s&lt;/span&gt;)
  {
    System.out.println(s);
  }
  &lt;span style="color: #E41C19;"&gt;public&lt;/span&gt; &lt;span style="color: #E41C19;"&gt;static&lt;/span&gt; &lt;span style="color: #98fb98;"&gt;void&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;main&lt;/span&gt;(&lt;span style="color: #98fb98;"&gt;String&lt;/span&gt; [] &lt;span style="color: #eedd82;"&gt;args&lt;/span&gt;)
  {
    &lt;span style="color: #98fb98;"&gt;Valores&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;objeto&lt;/span&gt; = &lt;span style="color: #E41C19;"&gt;new&lt;/span&gt; &lt;span style="color: #98fb98;"&gt;Valores&lt;/span&gt;();
    log(&lt;span style="color: #FFBF00;"&gt;" Valor por defecto de boolean = "&lt;/span&gt; + objeto.b   );
    log(&lt;span style="color: #FFBF00;"&gt;" Valor por defecto de char    = "&lt;/span&gt; + objeto.c   );
    log(&lt;span style="color: #FFBF00;"&gt;" Valor por defecto de byte    = "&lt;/span&gt; + objeto.by  );
    log(&lt;span style="color: #FFBF00;"&gt;" Valor por defecto de short   = "&lt;/span&gt; + objeto.s   );
    log(&lt;span style="color: #FFBF00;"&gt;" Valor por defecto de int     = "&lt;/span&gt; + objeto.i   );
    log(&lt;span style="color: #FFBF00;"&gt;" Valor por defecto de long    = "&lt;/span&gt; + objeto.l   );
    log(&lt;span style="color: #FFBF00;"&gt;" Valor por defecto de float   = "&lt;/span&gt; + objeto.f   );
    log(&lt;span style="color: #FFBF00;"&gt;" Valor por defecto de double  = "&lt;/span&gt; + objeto.d   );
  } 
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-156815511351875954?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/156815511351875954/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=156815511351875954' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/156815511351875954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/156815511351875954'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/06/valores-por-defecto-en-java.html' title='Valores por defecto en java'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-1750266042200801557</id><published>2008-06-26T13:09:00.003-03:00</published><updated>2008-06-26T13:13:52.569-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='java.lang.Math'/><category scheme='http://www.blogger.com/atom/ns#' term='raiz cuadrada'/><title type='text'>Cálculo de raíces cuadradas en java</title><content type='html'>El siguiente ejemplo muestra como hacer uso de &lt;a href="http://codigomaldito.blogspot.com/search/label/java.lang.Math"&gt;java.lang.Math&lt;/a&gt; para el cálculo de raíces cuadradas.

  &lt;pre style="color: #FFFFFF; background-color: #000000;"&gt;
&lt;span style="color: #E41C19;"&gt;class&lt;/span&gt; &lt;span style="color: #98fb98;"&gt;raices&lt;/span&gt; {
  &lt;span style="color: #E41C19;"&gt;private&lt;/span&gt; &lt;span style="color: #E41C19;"&gt;static&lt;/span&gt; &lt;span style="color: #98fb98;"&gt;void&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;log&lt;/span&gt;(&lt;span style="color: #98fb98;"&gt;String&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;s&lt;/span&gt;)
  {
    System.out.println(s);
  }
  &lt;span style="color: #E41C19;"&gt;public&lt;/span&gt; &lt;span style="color: #E41C19;"&gt;static&lt;/span&gt; &lt;span style="color: #98fb98;"&gt;void&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;main&lt;/span&gt; (&lt;span style="color: #98fb98;"&gt;String&lt;/span&gt; [] &lt;span style="color: #eedd82;"&gt;args&lt;/span&gt;)  
  {
    &lt;span style="color: #ff7f24;"&gt;// &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;sqrt(x) devuelve la ra&amp;#237;z cuadrada.
&lt;/span&gt;    &lt;span style="color: #E41C19;"&gt;for&lt;/span&gt; (&lt;span style="color: #98fb98;"&gt;int&lt;/span&gt; &lt;span style="color: #eedd82;"&gt;i&lt;/span&gt;=0; i &amp;lt; 10; i++) {
      log(&lt;span style="color: #FFBF00;"&gt;"La ra&amp;#237;z cuadrada de "&lt;/span&gt; + i + &lt;span style="color: #FFBF00;"&gt;" es "&lt;/span&gt; + Math.sqrt(i));
   }
  }
}
&lt;/pre&gt;

La salida generada es:
&lt;pre&gt;
La raíz cuadrada de 0 es 0.0
La raíz cuadrada de 1 es 1.0
La raíz cuadrada de 2 es 1.4142135623730951
La raíz cuadrada de 3 es 1.7320508075688772
La raíz cuadrada de 4 es 2.0
La raíz cuadrada de 5 es 2.23606797749979
La raíz cuadrada de 6 es 2.449489742783178
La raíz cuadrada de 7 es 2.6457513110645907
La raíz cuadrada de 8 es 2.8284271247461903
La raíz cuadrada de 9 es 3.0
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-1750266042200801557?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/1750266042200801557/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=1750266042200801557' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/1750266042200801557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/1750266042200801557'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/06/clculo-de-races-cuadradas-en-java.html' title='Cálculo de raíces cuadradas en java'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-2828850063993097087</id><published>2008-06-26T11:46:00.002-03:00</published><updated>2011-06-01T20:13:24.266-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='strend'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><category scheme='http://www.blogger.com/atom/ns#' term='cadenas estilo c'/><title type='text'>Implementación de strend en C</title><content type='html'>&lt;pre style="background:#000; color:#fff;"&gt;
&lt;span style="color: #ff7f24;"&gt;/* &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;strend1(s,t) devuelve 1 si la cadena t 
se presenta al final de la cadena s 
y 0 en caso contrario &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;*/&lt;/span&gt; 
&lt;span style="color: #b0c4de;"&gt;#include&lt;/span&gt; &lt;span style="color: #FFBF00;"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;
&lt;span style="color: #98fb98;"&gt;int&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;strend1&lt;/span&gt;(&lt;span style="color: #E41C19;"&gt;const&lt;/span&gt; &lt;span style="color: #98fb98;"&gt;char&lt;/span&gt; *&lt;span style="color: #eedd82;"&gt;s&lt;/span&gt; , &lt;span style="color: #E41C19;"&gt;const&lt;/span&gt; &lt;span style="color: #98fb98;"&gt;char&lt;/span&gt; *&lt;span style="color: #eedd82;"&gt;t&lt;/span&gt;){
  &lt;span style="color: #E41C19;"&gt;const&lt;/span&gt; &lt;span style="color: #98fb98;"&gt;char&lt;/span&gt; *&lt;span style="color: #eedd82;"&gt;ini&lt;/span&gt;; 
  ini = t;
  &lt;span style="color: #E41C19;"&gt;while&lt;/span&gt;(*s)
    ++s;
  &lt;span style="color: #E41C19;"&gt;while&lt;/span&gt;(*t)
    ++t;
  &lt;span style="color: #E41C19;"&gt;while&lt;/span&gt;(*s-- == *t--)
    &lt;span style="color: #E41C19;"&gt;if&lt;/span&gt; (t+1 == ini)
      &lt;span style="color: #E41C19;"&gt;return&lt;/span&gt; 0;
  &lt;span style="color: #E41C19;"&gt;return&lt;/span&gt; 1;
}


&lt;span style="color: #ff7f24;"&gt;/* &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;Probamos la funci&amp;#243;n &lt;/span&gt;&lt;span style="color: #ff7f24;"&gt;*/&lt;/span&gt; 
&lt;span style="color: #98fb98;"&gt;int&lt;/span&gt; &lt;span style="color: #87cefa;"&gt;main&lt;/span&gt;(){
  &lt;span style="color: #98fb98;"&gt;char&lt;/span&gt;  &lt;span style="color: #eedd82;"&gt;cadena1&lt;/span&gt;[100] = &lt;span style="color: #FFBF00;"&gt;"hola que tal  estas? como estas?"&lt;/span&gt;;
  &lt;span style="color: #98fb98;"&gt;char&lt;/span&gt;  &lt;span style="color: #eedd82;"&gt;cadena2&lt;/span&gt;[50] = &lt;span style="color: #FFBF00;"&gt;"estas?"&lt;/span&gt;;
  &lt;span style="color: #E41C19;"&gt;if&lt;/span&gt; (strend1(cadena1,cadena2))
    printf(&lt;span style="color: #FFBF00;"&gt;"Cadena1 no contiene a cadena2\n"&lt;/span&gt;);
  &lt;span style="color: #E41C19;"&gt;else&lt;/span&gt;
    printf(&lt;span style="color: #FFBF00;"&gt;"CADENA1 CONTIENE A CADENA2\n"&lt;/span&gt;);
  &lt;span style="color: #E41C19;"&gt;return&lt;/span&gt; 0;
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-2828850063993097087?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/2828850063993097087/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=2828850063993097087' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2828850063993097087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2828850063993097087'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/06/implementacin-de-strend.html' title='Implementación de strend en C'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-6947999067982219321</id><published>2008-05-27T11:03:00.000-03:00</published><updated>2008-05-27T11:08:30.977-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='remember'/><category scheme='http://www.blogger.com/atom/ns#' term='link'/><title type='text'>link - Some emacs tricks</title><content type='html'>&lt;a href="http://www.shellarchive.co.uk/content/emacs_tips.html"&gt;Some emacs tricks&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-6947999067982219321?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/6947999067982219321/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=6947999067982219321' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/6947999067982219321'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/6947999067982219321'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/05/link-some-emacs-tricks.html' title='link - Some emacs tricks'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-5067213136132999523</id><published>2008-04-23T22:54:00.002-03:00</published><updated>2008-04-23T22:57:39.175-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flisol'/><category scheme='http://www.blogger.com/atom/ns#' term='cafelug'/><category scheme='http://www.blogger.com/atom/ns#' term='software libre'/><title type='text'>Flisol en facultad de Palermo</title><content type='html'>Este sábado 26 de abril se realiza la Flisol (Festival Latinoaméricano de Instalación de Software Libre) en la facultad de palermo. Desde CaFeLUG se está organizando el evento. Hay registración obligatoria por lo que antes de ir hagan una visita al sitio.

&lt;a href="http://www.cafelug.org.ar/modules/news/article.php?storyid=175"&gt;Enlace&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-5067213136132999523?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/5067213136132999523/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=5067213136132999523' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5067213136132999523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5067213136132999523'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/04/flisol-en-facultad-de-palermo.html' title='Flisol en facultad de Palermo'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-3151515976445361081</id><published>2008-04-14T17:46:00.002-03:00</published><updated>2008-04-14T17:50:01.167-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='my wall street journal'/><title type='text'>My Wall Street Journal</title><content type='html'>Así se llama la nueva publicación estado unidense que pretende ser una sátira del prestigioso y tradicional. Se puede ver la tapa y comprar un ejemplar en &lt;a href="http://www.amazon.com/Wall-Street-Journal-Tony-Hendra/dp/0615193323"&gt;Amazon&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-3151515976445361081?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/3151515976445361081/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=3151515976445361081' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/3151515976445361081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/3151515976445361081'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/04/my-wall-street-journal.html' title='My Wall Street Journal'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-1558290094992653906</id><published>2008-04-14T12:20:00.000-03:00</published><updated>2008-04-14T12:21:20.424-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='polaca inversa'/><category scheme='http://www.blogger.com/atom/ns#' term='calculadora'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>Calculadora con notación polaca inversa en C</title><content type='html'>&lt;p&gt;El siguiente programa es la implementación en C de una
  calculadora que funciona con notación polaca inversa. El programa es
  harto conocido porque figura en el libro de facto de C de Kernighan
    y Ritchie.&lt;/p&gt;
  
    &lt;pre&gt;
&lt;span style="color: #da70d6;"&gt;#include&lt;/span&gt; &lt;span style="color: #bc8f8f;"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;
&lt;span style="color: #da70d6;"&gt;#include&lt;/span&gt; &lt;span style="color: #bc8f8f;"&gt;&amp;lt;math.h&amp;gt;&lt;/span&gt;
&lt;span style="color: #da70d6;"&gt;#include&lt;/span&gt; &lt;span style="color: #bc8f8f;"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;

&lt;span style="color: #da70d6;"&gt;#define&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;MAXOP&lt;/span&gt; 100
&lt;span style="color: #da70d6;"&gt;#define&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;NUMBER&lt;/span&gt; &lt;span style="color: #bc8f8f;"&gt;'0'&lt;/span&gt; &lt;span style="color: #b22222;"&gt;/* &lt;/span&gt;&lt;span style="color: #b22222;"&gt;se&amp;#241;al se encontr&amp;#243; un n&amp;#250;mero &lt;/span&gt;&lt;span style="color: #b22222;"&gt;*/&lt;/span&gt;

&lt;span style="color: #228b22;"&gt;int&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;getop&lt;/span&gt;(&lt;span style="color: #228b22;"&gt;char&lt;/span&gt; []);
&lt;span style="color: #228b22;"&gt;void&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;push&lt;/span&gt;(&lt;span style="color: #228b22;"&gt;double&lt;/span&gt;);
&lt;span style="color: #228b22;"&gt;double&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;pop&lt;/span&gt;(&lt;span style="color: #228b22;"&gt;void&lt;/span&gt;);

&lt;span style="color: #228b22;"&gt;int&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;main&lt;/span&gt;()
{
  &lt;span style="color: #228b22;"&gt;int&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;type&lt;/span&gt;;
  &lt;span style="color: #228b22;"&gt;double&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;op2&lt;/span&gt;;
  &lt;span style="color: #228b22;"&gt;char&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;s&lt;/span&gt;[MAXOP];
  &lt;span style="color: #a020f0;"&gt;while&lt;/span&gt;((type = getop(s)) != EOF) {
    &lt;span style="color: #a020f0;"&gt;switch&lt;/span&gt;(type) {
    &lt;span style="color: #a020f0;"&gt;case&lt;/span&gt; NUMBER:
      printf(&lt;span style="color: #bc8f8f;"&gt;"NUMBER: %s\n"&lt;/span&gt;,s);
      push(atof(s));
      &lt;span style="color: #a020f0;"&gt;break&lt;/span&gt;;
    &lt;span style="color: #a020f0;"&gt;case&lt;/span&gt; &lt;span style="color: #bc8f8f;"&gt;'+'&lt;/span&gt;:
      push(pop() + pop());
      &lt;span style="color: #a020f0;"&gt;break&lt;/span&gt;;
    &lt;span style="color: #a020f0;"&gt;case&lt;/span&gt; &lt;span style="color: #bc8f8f;"&gt;'*'&lt;/span&gt;:
      push(pop() * pop());
      &lt;span style="color: #a020f0;"&gt;break&lt;/span&gt;;
    &lt;span style="color: #a020f0;"&gt;case&lt;/span&gt; &lt;span style="color: #bc8f8f;"&gt;'-'&lt;/span&gt;:
      op2 = pop();
      push(pop() - op2);
      &lt;span style="color: #a020f0;"&gt;break&lt;/span&gt;;
    &lt;span style="color: #a020f0;"&gt;case&lt;/span&gt; &lt;span style="color: #bc8f8f;"&gt;'/'&lt;/span&gt;:
      op2 = pop();
      &lt;span style="color: #a020f0;"&gt;if&lt;/span&gt; (op2 != 0.0)
        push(pop() / pop());
      &lt;span style="color: #a020f0;"&gt;else&lt;/span&gt;
        printf(&lt;span style="color: #bc8f8f;"&gt;"error: divisor 0\n"&lt;/span&gt;);
      &lt;span style="color: #a020f0;"&gt;break&lt;/span&gt;;
    &lt;span style="color: #a020f0;"&gt;case&lt;/span&gt; &lt;span style="color: #bc8f8f;"&gt;'\n'&lt;/span&gt;:
      printf(&lt;span style="color: #bc8f8f;"&gt;"\t%.8g\n"&lt;/span&gt;,pop());
      &lt;span style="color: #a020f0;"&gt;break&lt;/span&gt;;
    &lt;span style="color: #a020f0;"&gt;default&lt;/span&gt;:
      &lt;span style="color: #a020f0;"&gt;break&lt;/span&gt;;
        
    }
  }
  &lt;span style="color: #a020f0;"&gt;return&lt;/span&gt; 0;
}


&lt;span style="color: #da70d6;"&gt;#define&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;MAXVAL&lt;/span&gt; 100
&lt;span style="color: #228b22;"&gt;int&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;sp&lt;/span&gt; = 0;
&lt;span style="color: #228b22;"&gt;double&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;val&lt;/span&gt;[MAXVAL];

&lt;span style="color: #228b22;"&gt;void&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;push&lt;/span&gt;(&lt;span style="color: #228b22;"&gt;double&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;f&lt;/span&gt;)
{
  printf(&lt;span style="color: #bc8f8f;"&gt;"push numero: %f en indice: %d\n"&lt;/span&gt;,f,sp);
  &lt;span style="color: #a020f0;"&gt;if&lt;/span&gt; (sp &amp;lt; MAXVAL)
    val[sp++] = f;
  &lt;span style="color: #a020f0;"&gt;else&lt;/span&gt; 
    printf(&lt;span style="color: #bc8f8f;"&gt;"error: pila llena\n"&lt;/span&gt;);
}

&lt;span style="color: #228b22;"&gt;double&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;pop&lt;/span&gt;(&lt;span style="color: #228b22;"&gt;void&lt;/span&gt;) 
{
  &lt;span style="color: #a020f0;"&gt;if&lt;/span&gt; (sp &amp;gt; 0) {
    printf(&lt;span style="color: #bc8f8f;"&gt;"pop %f en indice: %d\n"&lt;/span&gt;,val[sp],sp);
    &lt;span style="color: #a020f0;"&gt;return&lt;/span&gt; val[--sp];
  }
  &lt;span style="color: #a020f0;"&gt;else&lt;/span&gt; {
    printf(&lt;span style="color: #bc8f8f;"&gt;"error: pila vacia\n"&lt;/span&gt;);
    &lt;span style="color: #a020f0;"&gt;return&lt;/span&gt; 0.0;
  }
}

&lt;span style="color: #da70d6;"&gt;#include&lt;/span&gt; &lt;span style="color: #bc8f8f;"&gt;&amp;lt;ctype.h&amp;gt;&lt;/span&gt;
&lt;span style="color: #228b22;"&gt;int&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;getch&lt;/span&gt;(&lt;span style="color: #228b22;"&gt;void&lt;/span&gt;);
&lt;span style="color: #228b22;"&gt;void&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;ungetch&lt;/span&gt;(&lt;span style="color: #228b22;"&gt;int&lt;/span&gt;);

&lt;span style="color: #228b22;"&gt;int&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;getop&lt;/span&gt;(&lt;span style="color: #228b22;"&gt;char&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;s&lt;/span&gt;[]) 
{
  &lt;span style="color: #228b22;"&gt;int&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;i&lt;/span&gt;,&lt;span style="color: #b8860b;"&gt;c&lt;/span&gt;;
  &lt;span style="color: #a020f0;"&gt;while&lt;/span&gt; ((s[0] = c = getch()) == &lt;span style="color: #bc8f8f;"&gt;' '&lt;/span&gt; || c == &lt;span style="color: #bc8f8f;"&gt;'\t'&lt;/span&gt;)
    ;
  s[1] = &lt;span style="color: #bc8f8f;"&gt;'\0'&lt;/span&gt;;

  &lt;span style="color: #a020f0;"&gt;if&lt;/span&gt; (!isdigit(s[0]) &amp;amp;&amp;amp; c != &lt;span style="color: #bc8f8f;"&gt;'.'&lt;/span&gt;)
    &lt;span style="color: #a020f0;"&gt;return&lt;/span&gt; c;

  i = 0;
  &lt;span style="color: #a020f0;"&gt;if&lt;/span&gt; (isdigit(c))
    &lt;span style="color: #a020f0;"&gt;while&lt;/span&gt; (isdigit(s[++i] = c = getch()))
      ;
  &lt;span style="color: #a020f0;"&gt;if&lt;/span&gt; (c == &lt;span style="color: #bc8f8f;"&gt;'.'&lt;/span&gt;)
    &lt;span style="color: #a020f0;"&gt;while&lt;/span&gt;(isdigit(s[++i] = c = getch()))
      ;
  s[i] = &lt;span style="color: #bc8f8f;"&gt;'\0'&lt;/span&gt;;
  &lt;span style="color: #a020f0;"&gt;if&lt;/span&gt; (c != EOF)
    ungetch(c);
  &lt;span style="color: #a020f0;"&gt;return&lt;/span&gt; NUMBER;
}


&lt;span style="color: #da70d6;"&gt;#define&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;BUFSIZE&lt;/span&gt; 100
&lt;span style="color: #228b22;"&gt;char&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;buf&lt;/span&gt;[BUFSIZE];
&lt;span style="color: #228b22;"&gt;int&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;bufp&lt;/span&gt; = 0;

&lt;span style="color: #228b22;"&gt;int&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;getch&lt;/span&gt;(&lt;span style="color: #228b22;"&gt;void&lt;/span&gt;)
{
  &lt;span style="color: #a020f0;"&gt;return&lt;/span&gt; (bufp &amp;gt; 0) ? buf[--bufp] : getchar();
}

&lt;span style="color: #228b22;"&gt;void&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;ungetch&lt;/span&gt;(&lt;span style="color: #228b22;"&gt;int&lt;/span&gt; &lt;span style="color: #b8860b;"&gt;c&lt;/span&gt;)
{
  &lt;span style="color: #a020f0;"&gt;if&lt;/span&gt; (bufp &amp;gt;= BUFSIZE)
    printf(&lt;span style="color: #bc8f8f;"&gt;"ungetch: demasiados caracteres\n"&lt;/span&gt;);
  &lt;span style="color: #a020f0;"&gt;else&lt;/span&gt;
    buf[bufp++] = c;
}


&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-1558290094992653906?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/1558290094992653906/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=1558290094992653906' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/1558290094992653906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/1558290094992653906'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/04/calculadora-con-notacin-polaca-inversa.html' title='Calculadora con notación polaca inversa en C'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-2895859850284945573</id><published>2008-04-07T12:59:00.002-03:00</published><updated>2008-04-07T13:06:31.566-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='infobae'/><category scheme='http://www.blogger.com/atom/ns#' term='posicionamiento'/><title type='text'>Infobae y técnicas de posicionamiento</title><content type='html'>&lt;p&gt;En mi nuevo trabajo estamos trabajando con los feeds (RSS) de diarios argentinos. Y desde hace aproximádamente un mes, estamos viendo que &lt;a href="http://www.infobae.com"&gt;Infobae&lt;/a&gt; envia feeds con diferentes títulos para la misma nota. Hay veces que llega a enviar hasta 7 títulos para la misma nota a lo largo del día. Si no me equivoco el objetivo es que los agregadores automáticos envien más links con diferentes palabras a las páginas de Infobae. Pero el que la paga es el usuario que ve su lector de feeds infladísimo con entradas que en realidad son duplicadas.&lt;/p&gt;
&lt;p&gt;Google debería penalizar esta técnica porque en definitiva baja la calidad del buscador y hay un perjuicio para los usuarios.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-2895859850284945573?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/2895859850284945573/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=2895859850284945573' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2895859850284945573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2895859850284945573'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/04/infobae-y-tcnicas-de-posicionamiento.html' title='Infobae y técnicas de posicionamiento'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-499516652598751502</id><published>2008-03-16T21:34:00.002-03:00</published><updated>2008-03-16T21:42:36.767-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='gnu/linux'/><category scheme='http://www.blogger.com/atom/ns#' term='permisos'/><title type='text'>Permisos en GNU/Linux</title><content type='html'>&lt;p&gt;Un archivo cualquiera de Linux/Unix genera con sus permisos una partición
      sobre los usuarios, está partición consta de: un usuario dueño del
      archivo, los usuarios pertenecientes al grupo del archivo y todos los
      demás usuarios. Esta clasificación se conoce a veces como UGO, por
      User, Group, Others. &lt;/p&gt;
    &lt;p&gt;Cuando un archivo se crea, el archivo tiene como dueño
      al usuario que lo creó y como grupo, el grupo principal al cual
      pertenece el usuario.&lt;/p&gt;
    &lt;pre&gt;
      $whoami
      santi
      $touch f1
      $ls -l f1
      -rw-r--r-- 1 santi staff 0 2008-03-16 19:48 f1
    &lt;/pre&gt;
    &lt;p&gt;El dueño del archivo &lt;code&gt;f1&lt;/code&gt;, es &lt;code&gt;santi&lt;/code&gt;, y
      el archivo pertenece al grupo &lt;code&gt;staff&lt;/code&gt;. A cada uno de
      los tres grupos podemos darle o quitarle permisos de: lectura (r),
      escritura (w) o ejecución (x). Estos permisos se asignan de manera
      discreta por lo que necesitamos 9 bits para asignarlos (3 clases
      de usuarios User, Group, Others, y 3 tipos de permisos Read,
      Write, eXecution).&lt;/p&gt;

    &lt;pre&gt;
      rwx         rwx         rwx
      ---         ---         ---
      Usuario     Grupo       Otros
    &lt;/pre&gt;

    &lt;p&gt;El sistema octal de bits permite representar los 8 estados que
      pueden tomar cada una de las clases. Esto se ve en la tabla
      siguiente:&lt;/p&gt;
    &lt;pre&gt;
      Bin  Oct          Permisos
      000  0       ---   Ningún permiso
      001  1       --x   Sólo ejecución
      010  2       -w-   Sólo escritura
      011  3       -wx   Escritura y ejecución
      100  4       r--   Sólo lectura
      101  5       r-x   Lectura y ejecución
      110  6       rw-   Lectura y escritura
      111  7       rwx   Los tres permisos
    &lt;/pre&gt;

    &lt;p&gt;Por este motivo es común que los permisos se suelan
      representar como una secuencia de tres números octales que
      designen los permisos para Usuario, Grupo y Otros.&lt;/p&gt;

    &lt;p&gt;Algunos ejemplos serían:&lt;/p&gt;
    &lt;pre&gt;
      000 Ningún permiso
      444 Lectura para todos.
      400 Lectura sólo para el dueño.
      644 Lectura y escritura para el dueño y sólo lectura a los
          demás.
      777 Todos los permisos a todo el mundo.
    &lt;/pre&gt;
    
    &lt;p&gt;Muchas veces la gente no recuerda esa tabla, por lo que se
    asignan permisos directamente utilizando las clases de usuarios y
    las letras de los permisos. El comando para la asignación de
      permisos es &lt;code&gt;chmod&lt;/code&gt;:&lt;/p&gt;

    &lt;pre&gt;
      $chmod 644 f1
      # Es equivalente a:
      $chmod ugo+r  f1  # lectura para todos
      $chmod go-wx  f1  # quitamos escritura y ejecución
      $chmod u+wr   f1  # escritura y ejecución a dueño
      $ls -l f1
      -rw-r--r-- 1 santi staff 0 2008-03-16 20:19 f1
    &lt;/pre&gt;
    &lt;p&gt; 
      El comando &lt;code&gt;ls -l&lt;/code&gt; que nos mostró los
      permisos tiene un menos adelante para indicar que es un archivo
      y no un directorio. En el caso de un directorio tendríamos
      una &lt;code&gt;d&lt;/code&gt; en lugar de un menos:
    &lt;/p&gt;

    &lt;pre&gt;
      $mkdir borrar
      $ls -l | grep borrar
      drwxr-xr-x 2 santi staff 4096 2008-03-16 20:27 borrar
    &lt;/pre&gt;

    &lt;h2&gt;Sticky bit (pegajoso)&lt;/h2&gt;
    &lt;p&gt;Los unix tienen un permiso especial llamado Sticky bit que
    tenía el propósito de alertar al kernel para que deje el archivo
    en memoria luego de terminar el programa. Esto era conveniente
    para archivos utilizados muy frecuentemente, hoy día en casi todos
    los kernels modernos este permiso ya no hace falta debido a los
    nuevos sistemas de paginación de memoria que se implementan por lo
    que el uso del permiso sticky con este fin está obsoleto.&lt;/p&gt;

    &lt;h2&gt;SUID y SGID&lt;/h2&gt;
    &lt;p&gt;SUID y SGID son acrónimos de Set User Id y Set Group Id. Cuando
    un usuario ejecuta un archivo sin estos permisos, el programa
    corre con los permisos de ejecución del usuario que lo ejecuta. Es
    decir que si el usuario no tiene permisos de escribir el
    directorio &lt;code&gt;/bk/&lt;/code&gt; los programas que ejecute tampoco lo
    tendrán, a menos que alguno de estos programas tengan permisos
    SUID o SGID con lo cual el programa corre con los permisos del
    dueño del archivo o del grupo del archivo.
    &lt;/p&gt;
    &lt;p&gt;Programas como &lt;code&gt;ping&lt;/code&gt; que requieren permisos de root
      para ejecutarse por lo que suelen tener este permiso
      asignado.&lt;/p&gt;
    &lt;pre&gt;
      $ls -l /bin/ping
       -rwsr-xr-x 1 root root 30856 2007-07-06 04:40 /bin/ping
    &lt;/pre&gt;
    &lt;p&gt;Es conveniente verificar nuestro sistema en busca de programas
    con este tipo de permisos, ya que pueden ser utilizados con fines
    maliciosos. Es común que un atacante que ganó en algún momento
    privilegios de root, deje para su uso posterior una copia de un
      shell como bash con permisos SUID.&lt;/p&gt;
    &lt;h2&gt;Directorios&lt;/h2&gt;
    &lt;p&gt;Para entender el significado de los permisos asignados a los
    directorios, hay que entender que un directorio es una lista de
    los archivos que contiene. Es decir que si nosotros tenemos
    permiso de lectura en ese directorio podremos leer la lista por lo
    que podremos listar los archivos del directorio. Pero si no
    tenemos permisos de lectura aún podremos modificar archivos del
    directorio suponiendo que conozcamos su nombre y tengamos los
      permisos sobre el archivo para hacerlo.&lt;/p&gt;
    &lt;p&gt;La misma lógica se sigue con el resto de los permisos, si
    queremos borrar un archivo de un directorio deberíamos tener
    permisos para modificar la lista, es decir permisos de escritura
      en el directorio&lt;/p&gt;
    &lt;pre&gt; 
      $mkdir borrar/
      $touch borrar/archivo
      $chmod u-rw borrar/
      $ls borrar/
      ls: borrar/: Permission denied
      $echo "saludos" &gt; borrar/archivo
      $cat borrar/archivo
      saludos
      $rm borrar/archivo
      rm: cannot remove `borrar/archivo': Permission denied
    &lt;/pre&gt;
    &lt;p&gt;Pero todavía queda un permiso que no sabemos como actua y es el
    de ejecución, y si este permiso se quita se prohiben todas las
    acciones dentro del directorio, sus archivos y subdirectorios. Es
    decir si quitamos los permisos de ejecución para alguna de las
    clases, no se podrá hacer a nada dentro del directorio ni siquiera
    cambiar a él con &lt;code&gt;cd&lt;/code&gt;.
    &lt;/p&gt;
    &lt;pre&gt;
      $cd borrar/
      $pwd
      /home/santi/tmp/unix/borrar
      $cd ..
      $chmod u-x borrar/
      $cd borrar
      bash: cd: borrar/: Permission denied
    &lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-499516652598751502?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/499516652598751502/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=499516652598751502' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/499516652598751502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/499516652598751502'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/03/permisos-en-gnulinux.html' title='Permisos en GNU/Linux'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-7451311985969579506</id><published>2008-03-13T21:05:00.004-02:00</published><updated>2008-03-13T21:39:57.049-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cr'/><category scheme='http://www.blogger.com/atom/ns#' term='sony vaio'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='cr131/e'/><title type='text'>Sony Vaio CR131/E</title><content type='html'>&lt;p&gt;Bueno es mi primera notebook y por el momento no me decepcionó. Sistema operativo por defecto el Vista. Nunca lo había usado es lindo, pero después de probar todo el hardware voló. Le puse Ubuntu Gusty, la instalación fue bastante bien, tuve que tocar un par de cosas para hacer funcionar el sonido y no hubo problemas. El Wifi funciona aunque tendría que probar la famosa norma N que mi router no soporta.&lt;/p&gt;

&lt;p&gt;Por el momento lo único que no pude hacer arrancar es la cámara, aunque vi que hay un módulo para el kernel que debería funcionar con la mayoría de las cámaras que traen las vaio.&lt;/p&gt;

&lt;p&gt;La máquina es hermosa esteticamente, el teclado me encanta, es distinto al de otras notebooks que había probado.&lt;/p&gt;

&lt;p&gt;Me tiene un poco preocupado que cuando la utilizo enchufada da unas pequeñas descargas de estática en una parte de la carcaza de metal. Voy a ver si instalo en algún lugar acá un enchufe con descarga a tierra porque tengo miedo de que se dañe algún componente.&lt;/p&gt;

&lt;p&gt;Conexiones tiene un montón, salida de de super-video, memmory stick, SD (sí, ahora las vaio traen SD), tres entradas USB y salida para monitor.&lt;/p&gt;

&lt;p&gt;En fin, el equipo me encanta. Ya les contaré como se desenvuelve en el tiempo.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-7451311985969579506?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/7451311985969579506/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=7451311985969579506' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/7451311985969579506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/7451311985969579506'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/03/sony-vaio-cr131e.html' title='Sony Vaio CR131/E'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-5186352778481133810</id><published>2008-03-03T17:12:00.001-02:00</published><updated>2008-03-03T17:14:38.862-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='sdl'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='c'/><title type='text'>Tutorial SDL</title><content type='html'>&lt;a href="http://softwarelibre.uca.es/wikijuegos/"&gt;Tutorial de la librería SDL para la programación de juegos&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-5186352778481133810?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/5186352778481133810/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=5186352778481133810' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5186352778481133810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5186352778481133810'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/03/tutorial-sdl.html' title='Tutorial SDL'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-7597462597168228881</id><published>2008-02-24T18:23:00.001-02:00</published><updated>2008-02-24T18:27:43.198-02:00</updated><title type='text'>Las ideas, las patentes, las personas y bla!</title><content type='html'>Vale la pena que &lt;a href="http://gallir.wordpress.com/2008/02/24/la-realidad-virtual-de-rosa-maria-garcia/"&gt;lo lean&lt;/a&gt; no el ataque personalizado que hace al monigote de Microsoft sino  el porque la supuesta apertura de protocolos de Microsoft no significa m&amp;#225;s&lt;br&gt;que una jugada publicitaria con poca incidencia en la industria. Gall&amp;#237; lo explica bien, pero para mi las personas son circunstanciales, ac&amp;#225; lo que hay que discutir son las ideas.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-7597462597168228881?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/7597462597168228881/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=7597462597168228881' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/7597462597168228881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/7597462597168228881'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/02/las-ideas-las-patentes-las-personas-y.html' title='Las ideas, las patentes, las personas y bla!'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-6260456925597403610</id><published>2008-02-24T07:25:00.006-02:00</published><updated>2008-02-28T11:04:46.099-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><category scheme='http://www.blogger.com/atom/ns#' term='mail'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Desde emacs II</title><content type='html'>&lt;p&gt;Hace poco comenté como postear desde GNU/Emacs con g-client, pero
últimamente estoy bastante desde GNUS así que acá va una función para
invocar rápidamente un nuevo correo a la dirección secreta de Blogger,
con el header Content-type en html.

&lt;pre&gt;
(defun entrada-codigomaldito ()
  "Inserta una entrada en código maldito"
  (interactive)
   (compose-mail "codigomaldito &lt;tuusuario.supersecreto@blogger.com&gt;"
                "Sujeto"
                '(("Content-Type" . "text/html;"))
                nil
                )
   (message-sort-headers)
   )
&lt;/pre&gt;

&lt;p&gt;&lt;acronym title="C-x C-c"&gt;Chau!&lt;/acronym&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-6260456925597403610?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/6260456925597403610/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=6260456925597403610' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/6260456925597403610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/6260456925597403610'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/02/sujeto.html' title='Desde emacs II'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-6803649521098930529</id><published>2008-02-21T22:21:00.002-02:00</published><updated>2011-05-20T19:50:01.537-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='lenguajes de programación'/><title type='text'>Las raíces de Lisp</title><content type='html'>&lt;h3&gt;Traducción&lt;/h3&gt;
    &lt;p&gt;
      El siguiente documento es una traducción bastante libre del
      documento publicado
      por &lt;a href="http://es.wikipedia.org/wiki/Paul_Graham"&gt;Paul
      Graham&lt;/a&gt; en su sitio web
      [&lt;a href="http://www.paulgraham.com/rootsoflisp.html"&gt;The Roots
      Of Lisp&lt;/a&gt;], es
      un ensayo sobre los fundamentos del lenguaje de programación
      Lisp.&lt;/p&gt;


    &lt;h3&gt;Autor: Paul Graham, borrador Enero 18, 2002&lt;/h3&gt;
    
    &lt;p&gt;
      En
      1960, &lt;a href="http://es.wikipedia.org/wiki/John_McCarthy"&gt;John
      McCarthy&lt;/a&gt; publicó un notable paper en el cuál, hizo por la
      programación algo parecido a lo que Euclides hizo por la
      geometría &lt;sup&gt;[&lt;a name="cit1" id="cit1"
      href="#def1"&gt;1&lt;/a&gt;]&lt;/sup&gt;. Mostró de que manera con un puñado de
      operadores simples y una notación para funciones, se puede
      construir un lenguaje de programación. Llamó a este lenguaje
      Lisp, por "List Processing", debido a que una de sus principales
      ideas era usar una estructura de datos simple
      llamada &lt;em&gt;list&lt;/em&gt;, para el código y los datos.
    &lt;/p&gt;
    
    &lt;p&gt;
      Vale la pena comprender lo que McCarthy descubrió, no sólo como
      un hito en la historia de las computadores, sino como un modelo
      de lo que la programación está tendiendo a convertirse en
      nuestro propio tiempo. Parece que se han producido dos claros
      modelos consistentes de programación hasta la fecha: el modelo
      de C y el modelo de Lisp. Una receta popular para los nuevos lenguajes de
      programación en los pasados 20 años fue tomar el modelo de C y
      agregarle, pequeñas partes tomadas del modelo de Lisp, tales
      como tipado en tiempo de ejecución y recolección de basura.
    &lt;/p&gt;

    &lt;p&gt;
      En este artículo se intentará explicar en los términos más
      simples posibles lo que McCarthy descubrió. El punto no es sólo
      aprender acerca de un interesante resultado teórico que alguien
      averiguó hace cuarenta años, sino mostrar de dónde los lenguajes
      partieron. La característica inusual de Lisp -en realidad, la
      definición de la calidad de Lisp- es que puede escribirse a si
      mismo. Para entender lo que McCarthy quiere decir con esto,
      vamos a recorrer sus pasos, con su notación matemática traducida
      en código &lt;a href="http://es.wikipedia.org/wiki/Common_Lisp"&gt;Common
      Lisp&lt;/a&gt; ejecutable.
    &lt;/p&gt;

    &lt;h2&gt;1. Siete operadores primitivos&lt;/h2&gt;
    &lt;p&gt;
      Para empezar, se define una &lt;em&gt;expresión&lt;/em&gt;. Una
      expresión es a la vez un &lt;em&gt;átomo&lt;/em&gt;, el cual es una
      secuencia de letras (e.g. &lt;code&gt;foo&lt;/code&gt;), o
      una &lt;em&gt;lista&lt;/em&gt; de cero o más expresiones, separadas por
      espacios en blanco y encerradas por paréntesis. Algunas
      expresiones:
    &lt;/p&gt;
    
    &lt;pre&gt;
      foo
      ()
      (foo)
      (foo bar)
      (a b (c) d)
    &lt;/pre&gt;
    
    &lt;p&gt;
      La última expresión es una lista de cuatro elementos, el tercero
      de ellos es a su vez una lista de un elemento.
    &lt;/p&gt;
    
    &lt;p&gt;
      En aritmética la expresión 1 + 1 tiene el valor 2. Las
      expresiones válidas en Lisp también tienen valores. Si de una
      expresión &lt;code&gt;e&lt;/code&gt; se obtiene el valor &lt;code&gt;v&lt;/code&gt;, se
      dice que &lt;code&gt;e&lt;/code&gt; &lt;em&gt;devuelve&lt;/em&gt; &lt;code&gt;v&lt;/code&gt;. El
      próximo paso es definir que tipo de expresiones puden existir, y
      que valor devuelve cada tipo.
    &lt;/p&gt;
    
    &lt;p&gt;
      Si una expresión es una lista, se llama al primer elemento
      el &lt;em&gt;operador&lt;/em&gt; y a los elementos restantes
      los &lt;em&gt;argumentos&lt;/em&gt;. Se van a definir siete operadores
      primitivos (en el sentido de
      axiomas): &lt;code&gt;quote&lt;/code&gt;, &lt;code&gt;atom&lt;/code&gt;, &lt;code&gt;eq&lt;/code&gt;, &lt;code&gt;car&lt;/code&gt;,
      &lt;code&gt;cdr&lt;/code&gt;, &lt;code&gt;cons&lt;/code&gt;, y
      &lt;code&gt;cond&lt;/code&gt;.
    &lt;/p&gt;

    &lt;h3&gt;1. (quote x)&lt;/h3&gt;
    &lt;p&gt;
      &lt;code&gt;(quote x)&lt;/code&gt; devuelve &lt;code&gt;x&lt;/code&gt;. Por legibilidad
      abreviamos &lt;code&gt;(quote x)&lt;/code&gt; como &lt;code&gt;'x&lt;/code&gt;.
    &lt;/p&gt;
    &lt;pre&gt;
      &amp;gt; (quote a)
      a
      &amp;gt; 'a
      a
      &amp;gt; (quote (a b c))
      (a b c)
    &lt;/pre&gt;

    &lt;p style="font-size: small"&gt;&lt;b&gt;Nota traducción:&lt;/b&gt; la mayoría de las veces traduciremos
      &lt;em&gt;quoted&lt;/em&gt;, como &lt;em&gt;escapar&lt;/em&gt;&lt;/p&gt;

    
    &lt;h3&gt;2. (atom x)&lt;/h3&gt;
    &lt;p&gt;
      &lt;code&gt;(atom x)&lt;/code&gt; devuelve el átomo &lt;code&gt;t&lt;/code&gt; si el
      valor de &lt;code&gt;x&lt;/code&gt; es un átomo o la lista vacía. En Lisp
      se acostumbra a usar el átomo &lt;code&gt;t&lt;/code&gt; para representar
      verdadero, y la lista vacia para representar falso.
    &lt;/p&gt;
    &lt;pre&gt;
      &amp;gt; (atom 'a)
      t
      &amp;gt; (atom '(a b c))
      ()
      &amp;gt; (atom '())
      t
    &lt;/pre&gt;
    
    &lt;p&gt;
      Ahora que se tiene un operador cuyo argumento es evaluado se
      puede mostrar para que sirve &lt;code&gt;quote&lt;/code&gt;. Escapando una
      lista con &lt;code&gt;quote&lt;/code&gt; evitamos su evaluación. Una lista
      no escapada dada como argumento a un operador
      como &lt;code&gt;atom&lt;/code&gt; es tratada como código:
    &lt;/p&gt;
    
    &lt;pre&gt;
      &amp;gt; (atom (atom 'a))
      t
    &lt;/pre&gt;

    &lt;p&gt;
      en cualquier lugar en dónde aparezca una lista escapada se
      trata como una mera lista, en este caso una lista de dos
      elementos:
    &lt;/p&gt;

    &lt;pre&gt;
      &amp;gt; (atom '(atom 'a))
      ()
    &lt;/pre&gt;
    
    &lt;p&gt;
      Esto es similar a la manera en que se usan las comillas en
      inglés. Cambridge es una ciudad en Massachusetts que tiene cerca
      de 90.000 personas. "Cambridge" es una palabra que contiene
      nueve letras.
    &lt;/p&gt;
    
    &lt;p&gt;
      Escapar puede parecer un concepto algo lejano, porque muy
      pocos lenguajes tienen algo como esto. Está muy
      relacionado a una de las más distintivas características de
      Lisp: código y datos están hechos de las mismas estructuras de
      datos, y el operador &lt;code&gt;quote&lt;/code&gt; es la manera en que se
      distingue entre ellos.  
    &lt;/p&gt;

    &lt;h3&gt;3. (eq x y)&lt;/h3&gt;

    &lt;p&gt;
      &lt;code&gt;(eq x y)&lt;/code&gt; devuelve &lt;code&gt;t&lt;/code&gt; si los valores de
      &lt;code&gt;x&lt;/code&gt; e &lt;code&gt;y&lt;/code&gt; son el mismo átomo, o los dos la
      lista vacía, y &lt;code&gt;()&lt;/code&gt; en cualquier otro caso.
    &lt;/p&gt;

    &lt;pre&gt;
      &amp;gt; (eq 'a 'a)
      t
      &amp;gt; (eq 'a 'b)
      ()
      &amp;gt; (eq '() '())
      t
    &lt;/pre&gt;

    &lt;h3&gt;4. (car x)&lt;/h3&gt;
    
    &lt;p&gt;
      &lt;code&gt;(car x)&lt;/code&gt; espera que el valor de &lt;code&gt;x&lt;/code&gt; sea
      una lista, y devuelve su primer elemento.
    &lt;/p&gt;
    
    &lt;pre&gt;
      &amp;gt; (car '(a b c))
      a
    &lt;/pre&gt;

    &lt;h3&gt;5. (cdr x)&lt;/h3&gt;
    
    &lt;p&gt;
      &lt;code&gt;(cdr x)&lt;/code&gt; espera que el valor de &lt;code&gt;x&lt;/code&gt; sea
      una lista, y devuelve todo lo posterior al primer elemento.
    &lt;/p&gt;
    
    &lt;pre&gt;
      &amp;gt; (cdr '(a b c))
      (b c)
    &lt;/pre&gt;

    &lt;h3&gt;6. (cons x y)&lt;/h3&gt;
    
    &lt;p&gt;
      &lt;code&gt;(cons x y)&lt;/code&gt; espera que el valor de &lt;code&gt;y&lt;/code&gt; sea
      una lista, y devuelve el valor de &lt;code&gt;x&lt;/code&gt; seguido por los
      elementos del valor de &lt;code&gt;y&lt;/code&gt;.
    &lt;/p&gt;
    
    &lt;pre&gt;
      &amp;gt; (cons 'a '(b c))
      (a b c)
      &amp;gt; (cons 'a (cons 'b (cons 'c '())))
      (a b c)
      &amp;gt; (car (cons 'a '(b c)))
      a
      &amp;gt; (cdr (cons 'a '(b c)))
      (b c)
    &lt;/pre&gt;

    &lt;h3&gt;7. (cond (p&lt;sub&gt;1&lt;/sub&gt; e&lt;sub&gt;1&lt;/sub&gt;)...(p&lt;sub&gt;n&lt;/sub&gt; e&lt;sub&gt;n&lt;/sub&gt;))&lt;/h3&gt;
    
    &lt;p&gt;
      &lt;code&gt;(cond (p&lt;sub&gt;1&lt;/sub&gt; e&lt;sub&gt;1&lt;/sub&gt;)...(p&lt;sub&gt;n&lt;/sub&gt;
      e&lt;sub&gt;n&lt;/sub&gt;))&lt;/code&gt; es evaluado de la siguiente manera. La
      expresiones &lt;code&gt;p&lt;/code&gt; son evaluadas en orden hasta que una
      devuelva &lt;code&gt;t&lt;/code&gt;. Cuando una es encontrada, el
      valor de la expresión &lt;code&gt;e&lt;/code&gt; correspondiente es devuelto
      como el valor de toda la expresión &lt;code&gt;cond&lt;/code&gt;.
    &lt;/p&gt;

    &lt;pre&gt;
      &amp;gt; (cond ((eq 'a 'b) 'first)
                 ((atom 'a) 'second))
      second
    &lt;/pre&gt;

    &lt;p&gt;
      En cinco de los siete operadores primitivos, los argumentos son
      siempre evaluados cuando una expresión que comienza con ese
      operador es evaluada.&lt;sup&gt;[&lt;a name="cit2" id="cit2"
      href="#def2"&gt;2&lt;/a&gt;]&lt;/sup&gt; Se llama a un operador de ese tipo
      una &lt;code&gt;función&lt;/code&gt;.
    &lt;/p&gt;

    &lt;h2&gt;2. Denotar funciones&lt;/h2&gt;    
    &lt;p&gt;
      A continuación se define una notación para describir
      funciones. Una función se expresa como &lt;code&gt;(lambda
      (p&lt;sub&gt;1&lt;/sub&gt;...p&lt;sub&gt;n&lt;/sub&gt;) e)&lt;/code&gt;,
      dónde &lt;code&gt;p&lt;sub&gt;1&lt;/sub&gt;...p&lt;sub&gt;n&lt;/sub&gt;&lt;/code&gt; son átomos
      (llamados &lt;code&gt;parámetros&lt;/code&gt;) y &lt;code&gt;e&lt;/code&gt; es una
      expresión. Una expresión cuyo primer elemento es una
      expresión
    &lt;/p&gt;
    &lt;pre&gt;
      ((lambda (p&lt;sub&gt;1&lt;/sub&gt;...p&lt;sub&gt;n&lt;/sub&gt;) e) a&lt;sub&gt;1&lt;/sub&gt;...a&lt;sub&gt;n&lt;/sub&gt;)
    &lt;/pre&gt;
    &lt;p&gt;
      es conocida como una &lt;code&gt;llamada de función&lt;/code&gt; y su valor
      es cálculado de la siguiente manera. Cada
      expresión &lt;code&gt;a&lt;sub&gt;i&lt;/sub&gt;&lt;/code&gt; es
      evaluada. Luego &lt;code&gt;e&lt;/code&gt; es evaluada. Durante la
      evaluación de &lt;code&gt;e&lt;/code&gt;, el valor de cualquier ocurrencia
      de uno de los &lt;code&gt;p&lt;sub&gt;i&lt;/sub&gt;&lt;/code&gt; , es el valor del
      correspondiente &lt;code&gt;a&lt;sub&gt;i&lt;/sub&gt;&lt;/code&gt; en la llamada de
      función más reciente.
    &lt;/p&gt;
    
    &lt;pre&gt;
      &amp;gt; ((lambda (x) (cons x '(b))) 'a)
      (a b)
      &amp;gt; ((lambda (x y) (cons x (cdr y)))
            'z
            '(a b c))
      (z b c)
    &lt;/pre&gt;
    &lt;p&gt;
      Si una expresión tiene como primer elemento un
      átomo &lt;code&gt;f&lt;/code&gt; que no es uno de los operadores primitivos
    &lt;/p&gt;
    &lt;pre&gt;
      (f a&lt;sub&gt;1&lt;/sub&gt;...a&lt;sub&gt;n&lt;/sub&gt;)
    &lt;/pre&gt;
    &lt;p&gt;
      y el valor de &lt;code&gt;f&lt;/code&gt; es una función &lt;code&gt;(lambda
      (p&lt;sub&gt;1&lt;/sub&gt;...p&lt;sub&gt;n&lt;/sub&gt;) e)&lt;/code&gt; luego el valor de la
      expresión es el valor de
    &lt;/p&gt;
    &lt;pre&gt;
      ((lambda (p&lt;sub&gt;1&lt;/sub&gt;...p&lt;sub&gt;n&lt;/sub&gt;) e) a&lt;sub&gt;1&lt;/sub&gt;...a&lt;sub&gt;n&lt;/sub&gt;)
    &lt;/pre&gt;
    &lt;p&gt;
      En otras palabras, los parámetros pueden ser usados tanto como
      operadores o como argumentos en expresiones:
    &lt;/p&gt;
    &lt;pre&gt;
      &amp;gt; ((lambda (f) (f '(b c))) 
            '(lambda (x) (cons 'a x)))
      (a b c)
    &lt;/pre&gt;
    &lt;p&gt;
      Hay otra notación para funciones que permite a la función
      referirse a sí misma, así se brinda una manera conveniente de
      definir funciones recursivas.&lt;sup&gt;[&lt;a name="cit3" id="cit3"
      href="#def3"&gt;3&lt;/a&gt;]&lt;/sup&gt; La notación
    &lt;/p&gt;
    &lt;pre&gt;
      (label f (lambda (p&lt;sub&gt;1&lt;/sub&gt;...p&lt;sub&gt;n&lt;/sub&gt; e))
    &lt;/pre&gt;
    &lt;p&gt;
      denota una función que se comporta como &lt;code&gt;(lambda
      (p&lt;sub&gt;1&lt;/sub&gt;...p&lt;sub&gt;n&lt;/sub&gt;) e)&lt;/code&gt;, con la propiedad
      adicional de que una ocurrencia de &lt;code&gt;f&lt;/code&gt;
      en &lt;code&gt;e&lt;/code&gt; evalua a la expresión &lt;code&gt;label&lt;/code&gt;, como
      si &lt;code&gt;f&lt;/code&gt; fuese un parametro de la función.
    &lt;/p&gt;
    &lt;p&gt;
      Suponiendo que se quisiera definir una función &lt;code&gt;(subst x y
      z)&lt;/code&gt;, la cual toma una expresión &lt;code&gt;x&lt;/code&gt;, un
      átomo &lt;code&gt;y&lt;/code&gt;, y una lista &lt;code&gt;z&lt;/code&gt;, y devuelve una
      lista como &lt;code&gt;z&lt;/code&gt; pero con cada instancia
      de &lt;code&gt;y&lt;/code&gt; (a cualquier profundidad de anidamiento)
      en &lt;code&gt;z&lt;/code&gt; reemplazada por &lt;code&gt;x&lt;/code&gt;.
    &lt;/p&gt;

    &lt;pre&gt;
      &amp;gt; (subst 'm 'b '(a b (a b c) d))
      (a m (a m c) d)
    &lt;/pre&gt;
    
    &lt;p&gt;
      Se puede denotar esta función como
    &lt;/p&gt;
    &lt;pre&gt;
      (label subst (lambda (x y z)
                     (cond ((atom z)
                            (cond ((eq z y) x)
                                  ('t z)))
                           ('t (cons (subst x y (car z))
                                     (subst x y (cdr z)))))))
    &lt;/pre&gt;
    &lt;p&gt;
      Se abreviará &lt;code&gt;f = (label f (lambda
    (p&lt;sub&gt;1&lt;/sub&gt;...p&lt;sub&gt;n&lt;/sub&gt;) e))&lt;/code&gt; como
    &lt;/p&gt;
    &lt;pre&gt;
      (defun f (p&lt;sub&gt;1&lt;/sub&gt;...p&lt;sub&gt;n&lt;/sub&gt;) e)
    &lt;/pre&gt;
    &lt;p&gt;
      así
    &lt;/p&gt;
    &lt;pre&gt;
      (defun subst (x y z)
        (cond ((atom z)
               (cond ((eq z y) x)
                     ('t z)))
              ('t (cons (subst x y (car z))
                        (subst x y (cdr z))))))
    &lt;/pre&gt;
    &lt;p&gt;
      A proposito, aquí se ve como conseguir una cláusula por omisión
      en una expresión &lt;code&gt;cond&lt;/code&gt;. Una cláusula cuyo primer
      elemento es &lt;code&gt;'t&lt;/code&gt; será siempre éxitosa. Así
    &lt;/p&gt;
    &lt;pre&gt;
      (cond (x y) ('t z))
    &lt;/pre&gt;
    &lt;p&gt;
      es equivalente a lo que tal vez se escribiría en un lenguaje con
      síntaxis como:
    &lt;/p&gt;
    &lt;pre&gt;
      if x then y else z
    &lt;/pre&gt;

    &lt;h2&gt;3. Algunas funciones&lt;/h2&gt;    
    &lt;p&gt;
      Ahora que se tiene una manera de expresar funciones, se definen
      algunas nuevas en términos de los siete operadores
      primitivos. Primero es conveniente introducir algunas
      abreviaciones de patrones comunes. Se usará el &lt;code&gt;cxr&lt;/code&gt;,
      dónde &lt;code&gt;x&lt;/code&gt; es una secuencia de &lt;em&gt;a&lt;/em&gt;s
      o &lt;em&gt;d&lt;/em&gt;s, como una abreviación para la composición
      correspondiente de &lt;code&gt;car&lt;/code&gt; y &lt;code&gt;cdr&lt;/code&gt;. Así, por
      ejemplo &lt;code&gt;(cadr e)&lt;/code&gt; es una abreviación de &lt;code&gt;(car
      (cdr e))&lt;/code&gt;, la cual devuelve el segundo elemento
      de &lt;code&gt;e&lt;/code&gt;.
    &lt;/p&gt;
    &lt;pre&gt;
      &amp;gt; (cadr '((a b) (c d) e))
      (c d)
      &amp;gt; (caddr '((a b) (c d) e))
      e
      &amp;gt; (cdar '((a b) (c d) e))
      (b)
    &lt;/pre&gt;
    &lt;p&gt;
      También, se usará &lt;code&gt;(list
      e&lt;sub&gt;1&lt;/sub&gt;...e&lt;sub&gt;n&lt;/sub&gt;&lt;/code&gt; para &lt;code&gt;(cons
      e&lt;sub&gt;1&lt;/sub&gt; ... (cons e&lt;sub&gt;n&lt;/sub&gt; '()) ... )&lt;/code&gt;.
    &lt;/p&gt;
    &lt;pre&gt;
      &amp;gt; (cons 'a (cons 'b (cons 'c '())))
      (a b c)
      &amp;gt; (list 'a 'b 'c)
      (a b c)
    &lt;/pre&gt;
    &lt;p&gt;
      Ahora se definen algunas funciones nuevas. Se cambiaron los
      nombres de estas funciones agregando un punto al final. Esto
      distingue a las funciones primitivas de las definidas en términos
      de estas, y además evita colisiones con funciones existentes en
      Common Lisp.
    &lt;/p&gt;

    &lt;h3&gt;1. (null. x)&lt;/h3&gt;
    &lt;p&gt;
      &lt;code&gt;(null. x)&lt;/code&gt; prueba si su arguemento es la lista
      vacia.
    &lt;/p&gt;
    &lt;pre&gt;
      (defun null. (x)
        (eq x '()))
      &amp;gt; (null. 'a)
      ()
      &amp;gt; (null. '())
      t
    &lt;/pre&gt;

    &lt;h3&gt;2. (and. x y)&lt;/h3&gt;
    &lt;p&gt;
      &lt;code&gt;(and. x y)&lt;/code&gt; devuelve &lt;code&gt;t&lt;/code&gt; si ambos
      argumentos lo hacen, y &lt;code&gt;()&lt;/code&gt; en cualquier otro caso.
    &lt;/p&gt;
    &lt;pre&gt;
      (defun and. (x y)
        (cond (x (cond (y 't) ('t '())))
              ('t '())))
      &amp;gt; (and. (atom 'a) (eq 'a 'a))
      t
      &amp;gt; (and. (atom 'a) (eq 'a 'b))
      ()
    &lt;/pre&gt;

    &lt;h3&gt;3. (not. x)&lt;/h3&gt;
    &lt;p&gt;
      &lt;code&gt;(not. x)&lt;/code&gt; devuelve &lt;code&gt;t&lt;/code&gt; si su argumento
      devuelve &lt;code&gt;()&lt;/code&gt;, y &lt;code&gt;()&lt;/code&gt; si su argumento
      devuelve &lt;code&gt;t&lt;/code&gt;.
    &lt;/p&gt;
    &lt;pre&gt;
      (defun not. (x)
        (cond (x '())
              ('t 't)))
      &amp;gt; (not. (eq 'a 'a))
      ()
      &amp;gt; (not. (eq 'a 'b))
      t
    &lt;/pre&gt;
    
    &lt;h3&gt;4. (append. x y)&lt;/h3&gt;
    &lt;p&gt;
      &lt;code&gt;(append. x y)&lt;/code&gt; toma dos listas y devuelve la
      concatenación de estas.
    &lt;/p&gt;
    &lt;pre&gt;
      (defun append. (x y)
        (cond ((null. x) y)
              ('t (cons (car x) (append. (cdr x) y)))))
      &amp;gt; (append. '(a b) '(c d))
      (a b c d)
      &amp;gt; (append. '() '(c d))
      (c d)
    &lt;/pre&gt;

    &lt;h3&gt;5. (pair. x y)&lt;/h3&gt;
    &lt;p&gt;
      &lt;code&gt;(pair. x y)&lt;/code&gt; toma dos listas de igual longitud y
      devuelve una lista de listas de dos elementos conteniendo pares
      sucesivos de un elemento de cada una.
    &lt;/p&gt;
    &lt;pre&gt;
      (defun pair. (x y)
        (cond ((and. (null. x) (null. y)) '())
              ((and. (not. (atom x)) (not. (atom y)))
               (cons (list (car x) (car y))
                     (pair. (cdr x) (cdr y))))))
      &amp;gt; (pair. '(x y z) '(a b c))
      ((x a) (y b) (z c))
    &lt;/pre&gt;

    &lt;h3&gt;6. (assoc. x y)&lt;/h3&gt;
    &lt;p&gt;
      &lt;code&gt;(assoc. x y)&lt;/code&gt; toma un átomo &lt;code&gt;x&lt;/code&gt; y una
      lista &lt;code&gt;y&lt;/code&gt; de la forma creada por &lt;code&gt;pair.&lt;/code&gt;,
      y devuelve el segundo elemento de la primera lista
      en &lt;code&gt;y&lt;/code&gt; cuyo primer elemento es &lt;code&gt;x&lt;/code&gt;.
    &lt;/p&gt;
    &lt;pre&gt;
      (defun assoc. (x y)
        (cond ((eq (caar y) x) (cadar y))
              ('t (assoc. x (cdr y)))))
      &amp;gt; (assoc. 'x '((x a) (y b)))
      a
      &amp;gt; (assoc. 'x '((x new) (x a) (y b)))
      new
    &lt;/pre&gt;

    &lt;h2&gt;4. La sorpresa&lt;/h2&gt;    
    &lt;p&gt;
      Así, se pudo definir funciones que concatenan listas, sustituyen
      una expresión por otra, etc. Una notación elegante, tal vez,
      pero. ¿Ahora qué? Ahora viene la sorpresa. Se puede también, es
      resultado de, escribir una función que actue como un interprete
      para nuestro lengauje: una función que tome como un argumento
      cualquier expresión Lisp, y devuelva su valor. Aquí está:
    &lt;/p&gt;
    
    &lt;pre&gt;
      (defun eval. (e a)
        (cond 
          ((atom e) (assoc. e a))
          ((atom (car e))
           (cond 
             ((eq (car e) 'quote) (cadr e))
             ((eq (car e) 'atom)  (atom (eval. (cadr  e) a)))
             ((eq (car e) 'eq)    (eq   (eval. (cadr  e) a)
            (eval. (cadr  e) a)))
             ((eq (car e) 'car)   (car  (eval. (cadr  e) a)))
             ((eq (car e) 'cdr)   (cdr  (eval. (cadr  e) a)))
             ((eq (car e) 'cons)  (cons (eval. (cadr  e) a)
            (eval. (caddr e) a)))
             ((eq (car e) 'cond) (evcon. (cdr e) a))
             ('t (eval. (cons (assoc. (car e) a)
         (cdr e))
          a))))
          ((eq (caar e) 'label)
           (eval. (cons (caddar e) (cdr e))
           (cons (list (cadar e) (car e)) a)))
          ((eq (caar e) 'lambda)
           (eval. (caddar e)
           (append. (pair. (cadar e) (evlis. (cdr e) a))
             a)))))
      
      (defun evcon. (c a)
        (cond ((eval. (caar c) a)
        (eval. (cadar c) a))
       ('t (evcon. (cdr c) a))))
      
      (defun evlis. (m a)
        (cond ((null. m) '())
       ('t (cons (eval. (car m) a)
          (evlis. (cdr m) a)))))
    &lt;/pre&gt;
    &lt;p&gt;
      La definición de &lt;code&gt;eval.&lt;/code&gt; es más larga que cualquiera
      de las otras vistas anteriormente. Vamos a considerar como
      trabaja cada parte. 
    &lt;/p&gt;
    &lt;p&gt;
      La función toma dos argumentos: &lt;code&gt;e&lt;/code&gt;, la expresión a
      ser evaluada, y &lt;code&gt;a&lt;/code&gt;, una lista que representa los
      valores que los átomos fueron tomanado al aparecer como
      parámetros en las llamadas de función. Esta lista es
      llamada &lt;code&gt;entorno&lt;/code&gt;, y es de la forma creada
      por &lt;code&gt;pair.&lt;/code&gt;. &lt;del&gt;Su fin es construir y buscar en las
      listas que se escribieron para &lt;code&gt;pair.&lt;/code&gt;
      y &lt;code&gt;assoc.&lt;/code&gt;&lt;/del&gt;&lt;ins&gt;It was in order to build and
      search these lists that we wrote &lt;code&gt;pair.&lt;/code&gt;
      and &lt;code&gt;assoc&lt;/code&gt;&lt;/ins&gt;.
    &lt;/p&gt;
    &lt;p&gt;
      La columna de &lt;code&gt;eval.&lt;/code&gt; es una
      expresión &lt;code&gt;cond&lt;/code&gt; con cuatro cláusulas. Como se evalua
      una expresión depende del tipo que sea. La primer cláusula
      evalua átomos. Si &lt;code&gt;e&lt;/code&gt; es un átomo, se busca su valor
      en el entorno:
    &lt;/p&gt;
    &lt;pre&gt;
      &amp;gt; (eval. 'x '((x a) (y b)))
      a
    &lt;/pre&gt;
    
    &lt;p&gt;
      La segunda cláusula de &lt;code&gt;eval.&lt;/code&gt; es
      otra &lt;code&gt;cond&lt;/code&gt; para el manejo de expresiones de la
      forma &lt;code&gt;(a ...)&lt;/code&gt;, dónde &lt;code&gt;a&lt;/code&gt; es un
      átomo. Esto incluye todos los usos de los operadores primitivos,
      y existe una cláusula para cada uno.
    &lt;/p&gt;

    &lt;pre&gt;
      &amp;gt; (eval. '(eq 'a 'a) '())
      t
      &amp;gt; (eval. '(cons x '(b c))
                  '((x a) (y b)))
      (a b c)
    &lt;/pre&gt;
    
    &lt;p&gt;
      Todos ellos (excepto &lt;code&gt;quote&lt;/code&gt;) llaman
      a &lt;code&gt;eval.&lt;/code&gt; para encontrar el valor de sus argumentos.
    &lt;/p&gt;
    &lt;p&gt;
      Las dos últimas cláusulas son más complicadas. Para evaluar
      una expresión &lt;code&gt;cond&lt;/code&gt; llamamos a una función auxiliar
      llamada &lt;code&gt;evcond.&lt;/code&gt;, la cual trabaja a su manera a
      través de las cláusulas recursivamente, buscando una en la cual
      el primer elemento devuelva &lt;code&gt;t&lt;/code&gt;. Cuando encuentra
      dicha cláusula devuelve el valor del segundo elemento.
    &lt;/p&gt;

    &lt;pre&gt;
      &amp;gt; (eval. '(cond ((atom x) 'atom)
                         ('t 'list))
                  '((x '(a b))))
      list
    &lt;/pre&gt;

    
    &lt;p&gt;
      La parte final de la segunda cláusula
      de &lt;code&gt;eval.&lt;/code&gt;. Maneja llamadas a funciones que han sido
      pasadas como parametros. Trabaja reemplazando el átomo con su
      valor (que debería ser una expresión &lt;code&gt;lambda&lt;/code&gt;
      o &lt;code&gt;label&lt;/code&gt;) y evaluando la expresión resultante. Así
    &lt;/p&gt;

    &lt;pre&gt;
       (eval. '(f '(b c))
              '((f (lambda (x) (cons 'a x)))))
    &lt;/pre&gt;
    &lt;p&gt;se convierte en&lt;/p&gt;
    &lt;pre&gt;
      (eval. '((lambda (x) (cons 'a x)) '(b c))
             '((f (lambda (x) (cons 'a x)))))
    &lt;/pre&gt;
    &lt;p&gt;
      que devuelve &lt;code&gt;(a b c)&lt;/code&gt;.
    &lt;/p&gt;

    &lt;p&gt;
      Las dos últimas cláusulas en &lt;code&gt;eval.&lt;/code&gt; manejan llamadas
      a funciones en las cuales el primer argumento es una
      expresión &lt;code&gt;lambda&lt;/code&gt; o &lt;code&gt;label&lt;/code&gt;. Una
      expresión &lt;code&gt;label&lt;/code&gt; es evaluada empujando la lista del
      nombre de la función y la función en si misma dentro del
      entorno, y luego llamando a &lt;code&gt;eval.&lt;/code&gt; en una expresión
      con el &lt;code&gt;lambda&lt;/code&gt; interior sustituido por la
      expresión &lt;code&gt;label&lt;/code&gt;. Esto es,
    &lt;/p&gt;

    &lt;pre&gt;
      (eval. '((label firstatom (lambda (x)
                                  (cond ((atom x) x)
                                        ('t (firstatom (car x))))))
               y)
             '((y ((a b) (c d)))))
    &lt;/pre&gt;
    
    &lt;p&gt;
      que se convierte en
    &lt;/p&gt;

    &lt;pre&gt;
      (eval. '((lambda (x) 
           (cond ((atom x) x)
                 ('t (firstatom (car x)))))
         y)
       '((firstatom 
          (label firstatom (lambda (x)
                             (cond ((atom x) x)
                                   ('t (firstatom (car x)))))))
         (y ((a b) (c d)))))
    &lt;/pre&gt;
    
    &lt;p&gt;
      la cual termina por devolver &lt;code&gt;a&lt;/code&gt;.
    &lt;/p&gt;

    
    &lt;p&gt;
      Finalmente una expresión de la forma &lt;code&gt;((lambda
      (p&lt;sub&gt;1&lt;/sub&gt;...p&lt;sub&gt;n&lt;/sub&gt;) e)
        a&lt;sub&gt;1&lt;/sub&gt;...a&lt;sub&gt;n&lt;/sub&gt;)&lt;/code&gt; es evaluada llamando primero
      a &lt;code&gt;evlist.&lt;/code&gt; para obtener una lista de
      valores &lt;code&gt;(v&lt;sub&gt;1&lt;/sub&gt; ... v&lt;sub&gt;n&lt;/sub&gt;)&lt;/code&gt; de los
      argumentos &lt;code&gt;a&lt;sub&gt;1&lt;/sub&gt; ... a&lt;sub&gt;n&lt;/sub&gt;&lt;/code&gt;, y luego
      evaluando &lt;code&gt;e&lt;/code&gt; con &lt;code&gt;(p&lt;sub&gt;1&lt;/sub&gt; v&lt;sub&gt;1&lt;/sub&gt;)
      ... (p&lt;sub&gt;n&lt;/sub&gt; v&lt;sub&gt;n&lt;/sub&gt;)&lt;/code&gt; agregado al frente del
      entorno. Así
    &lt;/p&gt;

    &lt;pre&gt;
      (eval. '((lambda (x y) (cons x (cdr y)))
               'a
               '(b c d))
             '())
    &lt;/pre&gt;
    &lt;p&gt;
      se convierte en
    &lt;/p&gt;
    &lt;pre&gt;
      (eval. '(cons x (cdr y))
             '((x a) (y (b c d))))
    &lt;/pre&gt;
    &lt;p&gt;
      que termina devolviendo &lt;code&gt;(a c d)&lt;/code&gt;. 
    &lt;/p&gt;

    &lt;h2&gt;5. Consecuencias&lt;/h2&gt;
    &lt;p&gt;
      Ahora que se entiende como &lt;code&gt;eval&lt;/code&gt; trabaja, volvamos
      un paso atras y consideremos lo que significa. Lo que se tiene
      aquí es un extraordinariamente elegante modelo de
      computación. Usando
      sólo &lt;code&gt;quote&lt;/code&gt;, &lt;code&gt;atom&lt;/code&gt;, &lt;code&gt;eq&lt;/code&gt;, 
      &lt;code&gt;car&lt;/code&gt;, &lt;code&gt;cdr&lt;/code&gt;, &lt;code&gt;cons&lt;/code&gt;,
      y &lt;code&gt;cons&lt;/code&gt;, se pudo definir una
      función, &lt;code&gt;eval.&lt;/code&gt;, que en realidad implementa nuestro
      propio lenguaje, y luego usándo se puede definir cualquier función
      adicional que se quiera.
    &lt;/p&gt;

    &lt;p&gt;
      Por supuesto que ya existen modelos de computación-el más
      notable es la máquina de Turing. Pero los programas de la
      máquina de Turing no son
      demasiado &lt;del&gt;fáciles&lt;/del&gt; &lt;ins&gt;edifying&lt;/ins&gt; de leer. Si se
      quiere un lenguaje para describir algoritmos, se debe desear algo
      más abstracto, y ese fue uno de los objetivos de McCarthy al
      definir Lisp.
    &lt;/p&gt;

    &lt;p&gt;
      Al lenguaje que él definió en 1960 le faltaba un monton. No
      tenía &lt;del&gt;efectos laterales&lt;/del&gt; &lt;ins&gt;side-effects&lt;/ins&gt;,
      ejecución secuencial (la cual sólo es útil con efectos
      laterales), no tenía números prácticos&lt;sup&gt;[&lt;a name="cit4" id="cit4"
      href="#def4"&gt;4&lt;/a&gt;]&lt;/sup&gt; y alcance dinámico. Pero estas
      limitaciones pueden ser remediadas, sorprendentemente con
      muy código adicional. Steele y Sussman muestran como hacerlo en
      un famoso paper llamado "The Art of the Interpreter"&lt;sup&gt;[&lt;a name="cit5" id="cit5"
      href="#def5"&gt;5&lt;/a&gt;]&lt;/sup&gt;.
    &lt;/p&gt;

    &lt;p&gt;
      Si se entiende la función &lt;code&gt;eval&lt;/code&gt; de McCarthy, se
      entiende más que sólo un estadío en la historia de los
      lenguajes. Estas ideas están aún presentes en el núcleo
      semántico de Lisp en la actualidad. Así que estudiando el paper
      original de McCarthy nos muestra, en un sentido, lo que Lisp
      realmente es. No es tanto algo que McCarthy diseño sino algo que
      descubrió. No es intrínsicamente un lenguaje para AI o para
      realizar prototipos rápidos, o cualquier otra tarea de ese
      nivel. Es lo que obtienes (o una de las cosas que obtienes)
      cuando intentas &lt;del&gt;axiomatizar la
        computación&lt;/del&gt; &lt;ins&gt;axiomatize computation&lt;/ins&gt;.
    &lt;/p&gt;

    &lt;p&gt;
      En el tiempo, el lenguaje medio, queriendo decir el lenguaje
      utilizado por el programador medio, ha ido acercándose
      considerablemente a Lisp. Así que entiendiendo &lt;code&gt;eval&lt;/code&gt;
      estarás entendiendo lo que probablemente sea el principal modelo
      computacional en el futuro.   
    &lt;/p&gt;
    
    &lt;hr /&gt;
    &lt;p style="font-size: small" id="def1" name="def1"&gt;&lt;strong&gt;1&lt;/strong&gt;
      Recursive functions of
      symbolic expressions and their computation by machine (Part I)
      Communications of the ACM in April
      1960. (&lt;a href="http://www-formal.stanford.edu/jmc/recursive.html"&gt;El
      paper original&lt;/a&gt;)
      &lt;a href="#cit1"&gt;Volver&lt;/a&gt;
    &lt;/p&gt;
    &lt;p style="font-size: small" id="def2" name="def2"&gt;&lt;strong&gt;2&lt;/strong&gt; Las expresiones que
      comienzan con los otros dos operadores, &lt;code&gt;quote&lt;/code&gt;
      and &lt;code&gt;cond&lt;/code&gt;, son evaluadas de manera diferente. Cuando
      una expresión es escapada su argumento no es evaluado, es
      simplemente devuelto como el valor de toda la expresión
      escapada. Y en una expresión &lt;code&gt;cond&lt;/code&gt; válida, sólo un
      camino con forma de L de subexpresiones será evaluado.
      &lt;a href="#cit2"&gt;Volver&lt;/a&gt;
    &lt;/p&gt;    
    &lt;p style="font-size: small" id="def3"
    name="def3"&gt;&lt;strong&gt;3&lt;/strong&gt; Lógicamente no se necesita definir
    una nueva notación para esto. Se puede definir funciones
    recursivamente con la notación que se tiene hasta el momento
    usando una función en funciones llamada Y combinator. Puede que
    McCarthy no supiese acerca del Y combinator cuando escribió su
    paper, en cualquier caso la notación con etiqueta (labe) es más
    leíble.
      &lt;a href="#cit3"&gt;Volver&lt;/a&gt;
    &lt;/p&gt;    
    &lt;p style="font-size: small" id="def4"
       name="def4"&gt;&lt;strong&gt;4&lt;/strong&gt;
      Es posible realizar aritmética en el Lisp de McCarthy de 1960
       utilizando una lista de &lt;code&gt;n&lt;/code&gt; átomos para representar
       el número &lt;code&gt;n&lt;/code&gt;.
      &lt;a href="#cit4"&gt;Volver&lt;/a&gt;
    &lt;/p&gt;    
    &lt;p style="font-size: small" id="def5"
    name="def5"&gt;&lt;strong&gt;5&lt;/strong&gt;
      Guy Lewis Steele, Jr. y Gerald Jay Sussman, "The Art of the
    interpreter, or the  Modularity Complex (Part Zero, One, and
    Two)," MIT AI Lab Memo 453, Mayo de 1978. 
      &lt;a href="#cit5"&gt;Volver&lt;/a&gt;
    &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-6803649521098930529?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/6803649521098930529/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=6803649521098930529' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/6803649521098930529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/6803649521098930529'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/02/las-rases-de-lisp.html' title='Las raíces de Lisp'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-4702036718134525397</id><published>2008-02-21T17:06:00.005-02:00</published><updated>2008-02-21T17:13:30.327-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chuleta'/><category scheme='http://www.blogger.com/atom/ns#' term='gnus'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='ECB'/><title type='text'>pequeña nota mental</title><content type='html'>Acordarse para mañanaa de memorizar esto:

&lt;pre&gt;
##################################################              ##################################################              
#              ECB keystrokes.                   #              #              GNUS keystrokes.                  #              
##################################################              ################################################## 
C-c . ,         ecb-cycle-maximized-ecb-buffers                 C-d             gnus-summary-enter-digest-group                 
C-c . .         ecb-cycle-through-compilation-buffers           C-k             gnus-summary-kill-same-subject                  
C-c . /         ecb-toggle-compile-window-height                C-l             gnus-recenter                                   
C-c . \         ecb-toggle-compile-window                       RET             gnus-summary-scroll-up                          
C-c . a         ecb-toggle-auto-expand-tag-tree                 C-o             gnus-summary-save-article-mail                  
C-c . e         eshell                                          C-t             gnus-summary-toggle-truncation                  
C-c . f         Prefix Command                                  C-w             gnus-summary-mark-region-as-read                
C-c . g         Prefix Command                                  C-x             Prefix Command                                  
C-c . h         ecb-show-help                                   ESC             Prefix Command                                  
C-c . l         Prefix Command                                  SPC             gnus-summary-next-page                          
C-c . m         Prefix Command                                  !               gnus-summary-tick-article-forward               
C-c . n         ecb-nav-goto-next                               #               gnus-summary-mark-as-processable                
C-c . o         ecb-toggle-scroll-other-window-scrolls-compile  &amp;               gnus-summary-execute-command                    
C-c . p         ecb-nav-goto-previous                           *               gnus-cache-enter-article                        
C-c . r         ecb-rebuild-methods-buffer                      ,               gnus-summary-best-unread-article                
C-c . s         ecb-window-sync                                 -               negative-argument                               
C-c . x         ecb-expand-methods-nodes                        .               gnus-summary-first-unread-article               
                                                                /               gnus-summary-limit-map                          
C-c . m a       ecb-maximize-window-analyse                     0 .. 9          digit-argument                                  
C-c . m b       ecb-maximize-window-speedbar                    &lt;               gnus-summary-beginning-of-article               
C-c . m d       ecb-maximize-window-directories                 =               gnus-summary-expand-window                      
C-c . m h       ecb-maximize-window-history                     &gt;               gnus-summary-end-of-article                     
C-c . m m       ecb-maximize-window-methods                     ?               gnus-summary-mark-as-dormant                    
C-c . m s       ecb-maximize-window-sources                     A               gnus-summary-article-map                        
                                                                B               gnus-summary-backend-map                        
C-c . g 1       ecb-goto-window-edit1                           C               gnus-summary-cancel-article                     
C-c . g 2       ecb-goto-window-edit2                           D               gnus-summary-mark-as-read-backward              
C-c . g a       ecb-goto-window-analyse                         E               gnus-summary-mark-as-expirable                  
C-c . g b       ecb-goto-window-speedbar                        F               gnus-summary-followup-with-original             
C-c . g c       ecb-goto-window-compilation                     G               gnus-summary-goto-map                           
C-c . g d       ecb-goto-window-directories                     H               gnus-summary-help-map                           
C-c . g h       ecb-goto-window-history                         I               gnus-summary-increase-score                     
C-c . g l       ecb-goto-window-edit-last                       K               gnus-summary-mime-map                           
C-c . g m       ecb-goto-window-methods                         L               gnus-summary-lower-score                        
C-c . g s       ecb-goto-window-sources                         M               gnus-summary-mark-map                           
                                                                N               gnus-summary-next-article                       
C-c . l c       ecb-change-layout                               O               gnus-summary-save-map                           
C-c . l r       ecb-redraw-layout                               P               gnus-summary-prev-article                       
C-c . l t       ecb-toggle-layout                               Q               gnus-summary-exit-no-update                     
C-c . l w       ecb-toggle-ecb-windows                          R               gnus-summary-reply-with-original                
                                                                S               gnus-summary-send-map                           
C-c . f c       ecb-methods-filter-current-type                 T               gnus-summary-thread-map                         
C-c . f f       ecb-methods-filter-function                     U               gnus-summary-tick-article-backward              
C-c . f h       ecb-history-filter                              V               gnus-summary-score-map             
C-c . f l       ecb-methods-filter-delete-last                  W               gnus-summary-wash-map              
C-c . f m       ecb-methods-filter                              X               gnus-uu-extract-map                
C-c . f n       ecb-methods-filter-nofilter                     Y               gnus-summary-buffer-map            
C-c . f p       ecb-methods-filter-protection                   Z               gnus-summary-exit-map              
C-c . f r       ecb-methods-filter-regexp                       ^               gnus-summary-refer-parent-article  
C-c . f s       ecb-sources-filter                              a               gnus-summary-post-news             
C-c . f t       ecb-methods-filter-tagclass                     b               gnus-article-view-part


##################################################              ##################################################
#              GNUS keystrokes.                  #              #              GNUS keystrokes.                  #
##################################################              ##################################################
c               gnus-summary-catchup-and-exit                   T u             gnus-summary-up-thread                           
d               gnus-summary-mark-as-read-forward                                                                                
e               gnus-summary-edit-article                       V C             gnus-score-customize                             
f               gnus-summary-followup                           V F             gnus-score-flush-cache                           
g               gnus-summary-show-article                       V R             gnus-summary-rescore                             
h               gnus-summary-select-article-buffer              V S             gnus-summary-current-score                       
i               gnus-summary-news-other-window                  V c             gnus-score-change-score-file                     
j               gnus-summary-goto-article                       V e             gnus-score-edit-current-scores                   
k               gnus-summary-kill-same-subject-and-select       V f             gnus-score-edit-file                             
l               gnus-summary-goto-last-article                  V m             gnus-score-set-mark-below                        
m               gnus-summary-mail-other-window                  V s             gnus-summary-set-score                           
n               gnus-summary-next-unread-article                V t             gnus-score-find-trace                            
o               gnus-summary-save-article                       V w             gnus-score-find-favourite-words                  
p               gnus-summary-prev-unread-article                V x             gnus-score-set-expunge-below                     
q               gnus-summary-exit                                                                                                
r               gnus-summary-reply                              W 6             gnus-article-de-base64-unreadable                
s               gnus-summary-isearch-article                    W B             gnus-article-add-buttons-to-head                 
t               gnus-summary-toggle-header                      W C             gnus-article-capitalize-sentences                
u               gnus-summary-tick-article-forward               W D             gnus-summary-wash-display-map                    
w               gnus-summary-stop-page-breaking                 W E             gnus-summary-wash-empty-map                      
x               gnus-summary-limit-to-unread                    W G             gnus-summary-wash-header-map                     
|               gnus-summary-pipe-output                        W H             gnus-summary-wash-highlight-map                  
DEL             gnus-summary-prev-page                          W M             gnus-summary-wash-mime-map                       
                                                                W Q             gnus-article-fill-long-lines                     
&lt;M-down&gt;        gnus-summary-next-thread                        W T             gnus-summary-wash-time-map                       
&lt;M-up&gt;          gnus-summary-prev-thread                        W W             gnus-summary-wash-hide-map                       
&lt;backspace&gt;     gnus-summary-prev-page                          W Y             gnus-summary-wash-deuglify-map                   
&lt;delete&gt;        gnus-summary-prev-page                          W Z             gnus-article-decode-HZ                           
&lt;follow-link&gt;   mouse-face                                      W a             gnus-article-strip-headers-in-body               
&lt;mouse-2&gt;       gnus-mouse-pick-article                         W b             gnus-article-add-buttons                         
&lt;remap&gt;         Prefix Command                                  W c             gnus-article-remove-cr                           
                                                                W d             gnus-article-treat-dumbquotes                    
C-c C-b         gnus-bug                                        W e             gnus-article-emphasize                           
C-c C-d         gnus-summary-describe-group                     W f             gnus-article-display-x-face                      
C-c C-f         gnus-summary-mail-forward                       W g             gnus-treat-smiley                                
C-c TAB         gnus-info-find-node                             W h             gnus-article-wash-html                           
C-c C-r         gnus-summary-caesar-message                     W l             gnus-summary-stop-page-breaking                  
C-c C-s         Prefix Command                                  W m             gnus-summary-morse-message                       
C-c C-v         Prefix Command                                  W o             gnus-article-treat-overstrike                    
C-c ESC         Prefix Command                                  W p             gnus-article-verify-x-pgp-sig                    
                                                                W q             gnus-article-de-quoted-unreadable                
C-x C-s         gnus-summary-reselect-current-group             W r             gnus-summary-caesar-message                      
                                                                W s             gnus-summary-force-verify-and-decrypt            
C-M-a           gnus-summary-customize-parameters               W t             gnus-summary-toggle-header                       
C-M-b           gnus-summary-prev-thread                        W u             gnus-article-unsplit-urls                        
C-M-d           gnus-summary-read-document                      W v             gnus-summary-verbose-headers                     
C-M-e           gnus-summary-edit-parameters                    W w             gnus-article-fill-cited-article                  
C-M-f           gnus-summary-next-thread                                                                                         
C-M-h           gnus-summary-hide-thread                        X B             gnus-uu-decode-binhex                            
C-M-k           gnus-summary-kill-thread                        X O             gnus-uu-decode-save                              
C-M-l           gnus-summary-lower-thread                       X P             gnus-uu-decode-postscript-and-save               
M-RET           gnus-summary-scroll-down                        X S             gnus-uu-decode-unshar-and-save                   
C-M-n           gnus-summary-next-same-subject                  X U             gnus-uu-decode-uu-and-save                       
C-M-p           gnus-summary-prev-same-subject                  X b             gnus-uu-decode-binhex                            
C-M-s           gnus-summary-show-thread                        X m             gnus-summary-save-parts                          
C-M-t           gnus-summary-toggle-threads                     X o             gnus-uu-decode-save                              
C-M-u           gnus-summary-up-thread                          X p             gnus-uu-decode-postscript                        
M-#             gnus-summary-unmark-as-processable              X s             gnus-uu-decode-unshar                            
M-&amp;             gnus-summary-universal-argument                 X u             gnus-uu-decode-uu                                
M-*             gnus-cache-remove-article                       X v             gnus-uu-extract-view-map                         
M-K             gnus-summary-edit-global-kill                                                                                    
M-U             gnus-summary-clear-mark-backward                Y c             gnus-summary-insert-cached-articles              
M-^             gnus-summary-refer-article                      Y d             gnus-summary-insert-dormant-articles             
M-g             gnus-summary-rescan-group                       Y g             gnus-summary-prepare                             
M-i             gnus-symbolic-argument                                                                                           
M-k             gnus-summary-edit-local-kill                    Z C             gnus-summary-catchup-all-and-exit                
M-n             gnus-summary-next-unread-subject                Z E             gnus-summary-exit-no-update                      
M-p             gnus-summary-prev-unread-subject                Z G             gnus-summary-rescan-group                        
M-r             gnus-summary-search-article-backward            Z N             gnus-summary-next-group                          
M-s             gnus-summary-search-article-forward             Z P             gnus-summary-prev-group                          
M-t             gnus-summary-toggle-display-buttonized          Z Q             gnus-summary-exit                                
M-u             gnus-summary-clear-mark-forward                 Z R             gnus-summary-reselect-current-group              
                                                                Z Z             gnus-summary-exit                                
/ *             gnus-summary-limit-include-cached               Z c             gnus-summary-catchup-and-exit                    
/ .             gnus-summary-limit-to-unseen                    Z n             gnus-summary-catchup-and-goto-next-group         
/ /             gnus-summary-limit-to-subject                   Z s             gnus-summary-save-newsrc                         
/ C             gnus-summary-limit-mark-excluded-as-read                                                                         
/ D             gnus-summary-limit-include-dormant              C-c C-v C-v     gnus-uu-decode-uu-view                           
/ E             gnus-summary-limit-include-expunged                                                                              
/ M             gnus-summary-limit-exclude-marks                C-c C-s C-a     gnus-summary-sort-by-author                      
/ N             gnus-summary-insert-new-articles                C-c C-s C-c     gnus-summary-sort-by-chars                       
/ T             gnus-summary-limit-include-thread               C-c C-s C-d     gnus-summary-sort-by-date                        
/ a             gnus-summary-limit-to-author                    C-c C-s TAB     gnus-summary-sort-by-score                       
/ c             gnus-summary-limit-exclude-childless-dormant    C-c C-s C-l     gnus-summary-sort-by-lines                       
/ d             gnus-summary-limit-exclude-dormant              C-c C-s C-n     gnus-summary-sort-by-number                      
/ m             gnus-summary-limit-to-marks                     C-c C-s C-o     gnus-summary-sort-by-original                    
/ n             gnus-summary-limit-to-articles                  C-c C-s C-r     gnus-summary-sort-by-random                      
/ o             gnus-summary-insert-old-articles                C-c C-s C-s     gnus-summary-sort-by-subject                     
/ p             gnus-summary-limit-to-display-predicate                                                                          
/ s             gnus-summary-limit-to-subject                   C-c C-M-s       gnus-summary-limit-include-expunged              
/ t             gnus-summary-limit-to-age                                                                                        
/ u             gnus-summary-limit-to-unread                    A M-RET         gnus-summary-scroll-down                         
/ v             gnus-summary-limit-to-score                                                                                      
/ w             gnus-summary-pop-limit                          B C-M-e         gnus-summary-expire-articles-now                 
/ x             gnus-summary-limit-to-extra                                                                                      
                                                                G M-n           gnus-summary-next-unread-subject                 
A RET           gnus-summary-scroll-up                          G M-p           gnus-summary-prev-unread-subject                 
A ESC           Prefix Command                                                                                                   
A SPC           gnus-summary-next-page                          M M !           Prefix Command                                   
A &lt;             gnus-summary-beginning-of-article               M M ?           Prefix Command                                   
A &gt;             gnus-summary-end-of-article                     M M d           Prefix Command                                   
A D             gnus-summary-enter-digest-group                 M M e           Prefix Command                                   
A M             gnus-mailing-list-insinuate                     M M u           Prefix Command                                   
A P             gnus-summary-print-article                                                                                       
A R             gnus-summary-refer-references                   M V c           gnus-summary-clear-above                         
A T             gnus-summary-refer-thread                       M V k           gnus-summary-kill-below                          
A ^             gnus-summary-refer-parent-article               M V m           gnus-summary-mark-above                          
A b             gnus-summary-beginning-of-article               M V u           gnus-summary-tick-above                          
A e             gnus-summary-end-of-article                                                                                      
A g             gnus-summary-show-article                       M P G           gnus-uu-unmark-by-regexp                         
A n             gnus-summary-next-page                          M P R           gnus-uu-mark-by-regexp                           
A p             gnus-summary-prev-page                          M P S           gnus-uu-mark-sparse                              
A r             gnus-summary-refer-parent-article               M P T           gnus-uu-unmark-thread                            
A s             gnus-summary-isearch-article                    M P U           gnus-summary-unmark-all-processable              
A t             gnus-article-babel                              M P a           gnus-uu-mark-all                                 
A DEL           gnus-summary-prev-page                          M P b           gnus-uu-mark-buffer                              
A &lt;delete&gt;      gnus-summary-prev-page                          M P g           gnus-uu-unmark-region                            
                                                                M P i           gnus-uu-invert-processable                       
B ESC           Prefix Command                                  M P k           gnus-summary-kill-process-mark                   
B B             gnus-summary-crosspost-article                  M P p           gnus-summary-mark-as-processable                 
B I             gnus-summary-create-article                     M P r           gnus-uu-mark-region                              
B c             gnus-summary-copy-article                       M P s           gnus-uu-mark-series                              
B e             gnus-summary-expire-articles                    M P t           gnus-uu-mark-thread                              
B i             gnus-summary-import-article                     M P u           gnus-summary-unmark-as-processable               
B m             gnus-summary-move-article                       M P v           gnus-uu-mark-over                                
B p             gnus-summary-article-posted-p                   M P w           gnus-summary-save-process-mark                   
B q             gnus-summary-respool-query                      M P y           gnus-summary-yank-process-mark                   
B r             gnus-summary-respool-article                                                                                     
B t             gnus-summary-respool-trace                      M M-#           gnus-summary-unmark-as-processable               
B w             gnus-summary-edit-article                                                                                        
B DEL           gnus-summary-delete-article                     S D b           gnus-summary-resend-bounced-mail                 
B &lt;backspace&gt;   gnus-summary-delete-article                     S D e           gnus-summary-resend-message-edit                 
B &lt;delete&gt;      gnus-summary-delete-article                     S D r           gnus-summary-resend-message                      
                                                                                                                                 
G C-n           gnus-summary-next-same-subject                  S O m           gnus-uu-digest-mail-forward                      
G C-p           gnus-summary-prev-same-subject                  S O p           gnus-uu-digest-post-forward                      
G ESC           Prefix Command                                                                                                   
G N             gnus-summary-next-article                       S o m           gnus-summary-mail-forward                        
G P             gnus-summary-prev-article                       S o p           gnus-summary-post-forward                        
G b             gnus-summary-best-unread-article                                                                                 
G f             gnus-summary-first-unread-article               S B R           gnus-summary-reply-broken-reply-to-with-original 
G g             gnus-summary-goto-subject                       S B r           gnus-summary-reply-broken-reply-to               
G j             gnus-summary-goto-article                                                                                        
G l             gnus-summary-goto-last-article                  S M-c           gnus-summary-mail-crosspost-complaint            
G n             gnus-summary-next-unread-article                                                                                 
G o             gnus-summary-pop-article                        T M-#           gnus-uu-unmark-thread                            
G p             gnus-summary-prev-unread-article                                                                                 
                                                                W E A           gnus-article-strip-all-blank-lines                      
H C             gnus-group-fetch-control                        W E a           gnus-article-strip-blank-lines                   
H c             gnus-group-fetch-charter                        W E e           gnus-article-strip-trailing-space                
H d             gnus-summary-describe-group                     W E l           gnus-article-strip-leading-blank-lines           
H f             gnus-summary-fetch-faq                          W E m           gnus-article-strip-multiple-blank-lines          
H h             gnus-summary-describe-briefly                   W E s           gnus-article-strip-leading-space                 
H i             gnus-info-find-node                             W E t           gnus-article-remove-trailing-blank-lines         
H v             gnus-version                                    W E w           gnus-article-remove-leading-whitespace           
                                                                                                                                 
K C             gnus-article-view-part-as-charset               W T e           gnus-article-date-lapsed                         
K E             gnus-article-encrypt-body                       W T i           gnus-article-date-iso8601                        
K b             gnus-summary-display-buttonized                 W T l           gnus-article-date-local                          
K c             gnus-article-copy-part                          W T o           gnus-article-date-original                       
K e             gnus-article-view-part-externally               W T p           gnus-article-date-english                        
K i             gnus-article-inline-part                        W T s           gnus-article-date-user                           
K m             gnus-summary-repair-multipart                   W T u           gnus-article-date-ut                             
K o             gnus-article-save-part                          W T z           gnus-article-date-ut                             
K v             gnus-article-view-part                                                                                           
K |             gnus-article-pipe-part                          W M b           gnus-article-view-part                           
                                                                W M c           gnus-article-decode-charset                      
M C-c           gnus-summary-catchup-all                        W M v           gnus-mime-view-all-parts                         
M ESC           Prefix Command                                  W M w           gnus-article-decode-mime-words                   
M SPC           gnus-summary-clear-mark-forward                                                                                  
M !             gnus-summary-tick-article-forward               W D D           gnus-article-remove-images                       
M #             gnus-summary-mark-as-processable                W D d           gnus-article-display-face                        
M ?             gnus-summary-mark-as-dormant                    W D f           gnus-treat-from-picon                            
M B             gnus-summary-remove-bookmark                    W D m           gnus-treat-mail-picon                            
M C             gnus-summary-catchup                            W D n           gnus-treat-newsgroups-picon                      
M H             gnus-summary-catchup-to-here                    W D s           gnus-treat-smiley                                
M K             gnus-summary-kill-same-subject                  W D x           gnus-article-display-x-face                      
M M             Prefix Command                                                                                                   
M P             gnus-uu-mark-map                                W G f           gnus-article-treat-fold-headers                  
M S             gnus-summary-limit-include-expunged             W G n           gnus-article-treat-fold-newsgroups               
M V             gnus-summary-mscore-map                         W G u           gnus-article-treat-unfold-headers                
M b             gnus-summary-set-bookmark                                                                                        
M c             gnus-summary-clear-mark-forward                 W H a           gnus-article-highlight                           
M d             gnus-summary-mark-as-read-forward               W H c           gnus-article-highlight-citation                  
M e             gnus-summary-mark-as-expirable                  W H h           gnus-article-highlight-headers                   
M h             gnus-summary-catchup-from-here                  W H s           gnus-article-highlight-signature                 
M k             gnus-summary-kill-same-subject-and-select                                                                        
M r             gnus-summary-mark-as-read-forward               W W C-c         gnus-article-hide-citation-maybe                 
M t             gnus-summary-tick-article-forward               W W B           gnus-article-strip-banner                        
M x             gnus-summary-mark-as-expirable                  W W C           gnus-article-hide-citation-in-followups          
                                                                W W P           gnus-article-hide-pem                            
O B             gnus-summary-write-article-body-file            W W a           gnus-article-hide                                
O F             gnus-summary-write-article-file                 W W b           gnus-article-hide-boring-headers                 
O P             gnus-summary-muttprint                          W W c           gnus-article-hide-citation                       
O b             gnus-summary-save-article-body-file             W W h           gnus-article-hide-headers                        
O f             gnus-summary-save-article-file                  W W l           gnus-article-hide-list-identifiers               
O h             gnus-summary-save-article-folder                W W s           gnus-article-hide-signature                      
O m             gnus-summary-save-article-mail                                                                                   
O o             gnus-summary-save-article                       W Y a           gnus-article-outlook-repair-attribution          
O p             gnus-summary-pipe-output                        W Y c           gnus-article-outlook-rearrange-citation          
O r             gnus-summary-save-article-rmail                 W Y f           gnus-article-outlook-deuglify-article            
O s             gnus-soup-add-article                           W Y u           gnus-article-outlook-unwrap-lines                
O v             gnus-summary-save-article-vm                                                                                     
                                                                X v B           gnus-uu-decode-binhex-view                       
S ESC           Prefix Command                                  X v O           gnus-uu-decode-save-view                         
S B             Prefix Command                                  X v P           gnus-uu-decode-postscript-and-save-view          
S D             gnus-send-bounce-map                            X v S           gnus-uu-decode-unshar-and-save-view              
S F             gnus-summary-followup-with-original             X v U           gnus-uu-decode-uu-and-save-view                  
S N             gnus-summary-followup-to-mail-with-original     X v b           gnus-uu-decode-binhex-view                       
S O             Prefix Command                                  X v o           gnus-uu-decode-save-view                         
S R             gnus-summary-reply-with-original                X v p           gnus-uu-decode-postscript-view                   
S V             gnus-summary-very-wide-reply-with-original      X v s           gnus-uu-decode-unshar-view                       
S W             gnus-summary-wide-reply-with-original           X v u           gnus-uu-decode-uu-view                           
S c             gnus-summary-cancel-article                                                                                      
S f             gnus-summary-followup                           M M e N         gnus-summary-put-mark-as-expirable-next-unread   
S i             gnus-summary-news-other-window                  M M e P         gnus-summary-put-mark-as-expirable-prev-unread   
S m             gnus-summary-mail-other-window                  M M e e         gnus-summary-put-mark-as-expirable               
S n             gnus-summary-followup-to-mail                   M M e n         gnus-summary-put-mark-as-expirable-next          
S o             Prefix Command                                  M M e p         gnus-summary-put-mark-as-expirable-prev          
S p             gnus-summary-post-news                                                                                           
S r             gnus-summary-reply                              M M ? ?         gnus-summary-put-mark-as-dormant                 
S s             gnus-summary-supersede-article                  M M ? N         gnus-summary-put-mark-as-dormant-next-unread     
S u             gnus-uu-post-news                               M M ? P         gnus-summary-put-mark-as-dormant-prev-unread     
S v             gnus-summary-very-wide-reply                    M M ? n         gnus-summary-put-mark-as-dormant-next            
S w             gnus-summary-wide-reply                         M M ? p         gnus-summary-put-mark-as-dormant-prev            
S y             gnus-summary-yank-message                                                                                        
                                                                M M ! !         gnus-summary-put-mark-as-ticked                  
T ESC           Prefix Command                                  M M ! N         gnus-summary-put-mark-as-ticked-next-unread      
T #             gnus-uu-mark-thread                             M M ! P         gnus-summary-put-mark-as-ticked-prev-unread      
T H             gnus-summary-hide-all-threads                   M M ! n         gnus-summary-put-mark-as-ticked-next             
T S             gnus-summary-show-all-threads                   M M ! p         gnus-summary-put-mark-as-ticked-prev             
T T             gnus-summary-toggle-threads                                                                                      
T ^             gnus-summary-reparent-thread                    M M u N         gnus-summary-put-mark-as-unread-next-unread      
T d             gnus-summary-down-thread                        M M u P         gnus-summary-put-mark-as-unread-prev-unread      
T h             gnus-summary-hide-thread                        M M u n         gnus-summary-put-mark-as-unread-next             
T i             gnus-summary-raise-thread                       M M u p         gnus-summary-put-mark-as-unread-prev             
T k             gnus-summary-kill-thread                        M M u u         gnus-summary-put-mark-as-unread                  
T l             gnus-summary-lower-thread                                                                                        
T n             gnus-summary-next-thread                        M M d N         gnus-summary-put-mark-as-read-next-unread        
T o             gnus-summary-top-thread                         M M d P         gnus-summary-put-mark-as-read-prev-unread        
T p             gnus-summary-prev-thread                        M M d d         gnus-summary-put-mark-as-read                    
T s             gnus-summary-show-thread                        M M d n         gnus-summary-put-mark-as-read-next               
T t             gnus-summary-rethread-current                   M M d p         gnus-summary-put-mark-as-read-prev               
&lt;/pre&gt;


Sí, y ustedes se creían duros memorizando decimales de pi. Y esto son sólo dos aplicaciones de GNU/Emacs: &lt;a href="http://ecb.sourceforge.net"&gt;ECB&lt;/a&gt; y &lt;a href="http://gnus.org/"&gt;Gnus&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-4702036718134525397?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/4702036718134525397/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=4702036718134525397' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4702036718134525397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4702036718134525397'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/02/pequea-nota-mental.html' title='pequeña nota mental'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-4266927524385261832</id><published>2008-02-16T19:38:00.002-02:00</published><updated>2008-02-16T19:39:10.067-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flymake'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Flymake en php</title><content type='html'>Agenden esta &lt;a href="http://www.openweblog.com/users/hexmode/496282.html"&gt;extensión para flymake&lt;/a&gt;, que te cambia la vida.

:)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-4266927524385261832?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/4266927524385261832/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=4266927524385261832' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4266927524385261832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4266927524385261832'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/02/flymake-en-php.html' title='Flymake en php'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-1857426108899261420</id><published>2008-02-12T16:01:00.000-02:00</published><updated>2008-02-12T16:02:30.839-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='gnu/linux'/><title type='text'>Filtrar procesos con psgrep para bash</title><content type='html'>&lt;p&gt;Una alias/función fundamental para cualquier usuario de BASH en
  GNU/Linux. Agregarle a tu &lt;code&gt;.bashrc&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;
psgrep()
{
 ps aux | grep $1 | grep -v grep
}
&lt;/pre&gt;
&lt;p&gt;Luego lo usas así:&lt;/p&gt;
&lt;pre&gt;
  psgrep xmms
&lt;/pre&gt;

&lt;p&gt;Útil. ¿No? Muchísimos trucos más pueden encontrarle al bash si
  instalan su documentación:&lt;/p&gt;
&lt;pre&gt;
  sudo aptitude install bash-doc
&lt;/pre&gt;
&lt;p&gt;Luego &lt;acronym title="C-x C-f"&gt;navegan&lt;/acronym&gt; el
  directorio &lt;code&gt;/usr/share/doc/bash-doc/examples&lt;/code&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-1857426108899261420?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/1857426108899261420/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=1857426108899261420' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/1857426108899261420'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/1857426108899261420'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/02/filtrar-procesos-con-psgrep-para-bash.html' title='Filtrar procesos con psgrep para bash'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-2853644755818288733</id><published>2008-02-10T22:08:00.001-02:00</published><updated>2008-02-10T22:08:26.524-02:00</updated><title type='text'>Probando g-client en emacs 22</title><content type='html'>
    &lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;
      &lt;p&gt;Estamos probando hacer un post directamente desde Emacs,
      utilizando el
      &lt;a href='http://emacspeak.blogspot.com/2007/03/emacs-client-for-google-services.html'&gt;cliente
	para servicios de google&lt;/a&gt;. Veremos si anda bien.&lt;/p&gt;
      &lt;p&gt;Si lo quieren probar, los pasos son más o menos los
      siguientes:&lt;/p&gt;
      &lt;pre&gt;
	# sudo aptitude install curl w3m
	# svn -co http://emacspeak.googlecode.com/svn/trunk/lisp/g-client/
	# make
      &lt;/pre&gt;
      &lt;p&gt;Ahora editas tu &lt;code&gt;~/.emacs&lt;/code&gt;&lt;/p&gt;
      &lt;pre&gt;
	(push "~/g-client" load-path)
	(load-library "g")
	(setq g-user-email "example@gmail.com")
	(setq g-html-handler 'browse-url-of-buffer)
	(setq browse-url-browser-function 'w3m-browse-url)
      &lt;/pre&gt;
      &lt;p&gt;Haces un &lt;code&gt;M-x eval-buffer&lt;/code&gt;, luego
      un &lt;code&gt;gblogger-blog&lt;/code&gt; y listo!&lt;/p&gt;
    &lt;/div&gt;
  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-2853644755818288733?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/2853644755818288733/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=2853644755818288733' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2853644755818288733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2853644755818288733'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2008/02/probando-g-client-en-emacs-22.html' title='Probando g-client en emacs 22'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-8944594261461326796</id><published>2007-12-19T14:09:00.001-03:00</published><updated>2011-06-01T20:14:41.968-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='finales'/><category scheme='http://www.blogger.com/atom/ns#' term='algoritmo'/><category scheme='http://www.blogger.com/atom/ns#' term='pascal'/><category scheme='http://www.blogger.com/atom/ns#' term='finales resueltos'/><title type='text'>Final de algoritmos resuelto en pascal UTN</title><content type='html'>Un final de algoritmos resuelto en código de la UTN FRBA, va con enunciado
&lt;pre style="color: #000"&gt;
Una empresa de encomiendas internacionales desea procesar su
informaci&amp;#243;n. Para ello cuenta con dos archivos con las siguientes
caracter&amp;#237;sticas:

Archivo de precios, desordenado que registra el precio por Kg. enviado
desde una ofcina a otra (no aparecen en el archivo 2 registros que
relacionan las mismas oficinas), con la siguiente estructura:
- c&amp;#243;digo de oficina1 (1..250)
- c&amp;#243;digo de oficina2 (1..250)
- precio por kg (single)

Archivo de oficinas, ordenado en forma creciente por Pa&amp;#237;s y Ciudad,
con la siguiente estructura:
- c&amp;#243;digo de oficina (1..250)
- ciudad (25 caracteres)
- pa&amp;#237;s (20 caracteres)

Se desea desarrollar una estrategia y un algoritmo para el
procesamiento interactivo diario de encomiendas considerando que:

Se ingresa por teclado un c&amp;#243;digo de Oficina Origen y un c&amp;#243;digo de
Oficina Destino:

- Si ambos son distintos de 0 (cero) se trata de un env&amp;#237;o, por lo que
debe solicitarse el ingreso por telcado del peso, en Kg (single), y se
debe generar el ticket correspondiente detallando:
- Oficina de origen:
- Oficina de destino:
- Peso:
- Importe:

- Si s&amp;#243;lo el Origen es 0 se debe listar (por pantalla) la cantidad de
encomiendas enviadas a la oficina Destino indicada, detallada por
origen.

- Si s&amp;#243;lo el Destino es 0, se debe listar (por pantalla) la cantidad
de encomiendas enviadas desde esa Oficina Origen, detallada por
Destino.

- Si ambos son 0, se trata del fin del d&amp;#237;a y se debe generar un
listado (por impresora), del tr&amp;#225;fico del d&amp;#237;a, en orden creciente por
Pa&amp;#237;s y Ciudad con el siguiente formato:
 Pa&amp;#237;s:
  Ciudad:
    Oficina:     Enviados:   Recibidos:

   Ciudad:
    Oficina:     Enviados:   Recibidos:


RESTRICCIONES: 
Est&amp;#225;tica: 
 246.5 Kb
Din&amp;#225;mica:
 10b x nodo utilizado.
&lt;/pre&gt;

  &lt;div  style="background-color:#000000; color:#fff8dc;"&gt;
    &lt;pre style="color: #FFF"&gt;

&lt;font color="#ffd700"&gt;&lt;b&gt;program&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa500"&gt;&lt;b&gt;otro&lt;/b&gt;&lt;/font&gt;;

&lt;font color="#ffd700"&gt;&lt;b&gt;type&lt;/b&gt;&lt;/font&gt;
   string25       = string[25];
   string20       = string[20];
   tregPrecios    = &lt;font color="#ffd700"&gt;&lt;b&gt;record&lt;/b&gt;&lt;/font&gt;
                       ofi1   : byte;
                       ofi2   : byte;
                       precio : single;
                    &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;      
   tarPrecios     = &lt;font color="#ffd700"&gt;&lt;b&gt;file&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffd700"&gt;&lt;b&gt;of&lt;/b&gt;&lt;/font&gt; tregPrecios;
   tregOficinas   = &lt;font color="#ffd700"&gt;&lt;b&gt;record&lt;/b&gt;&lt;/font&gt;

                       ofi    : byte;
                       ciudad : string25;
                       pais   : string20;
                    &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;      
   tarOficinas    = &lt;font color="#ffd700"&gt;&lt;b&gt;file&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffd700"&gt;&lt;b&gt;of&lt;/b&gt;&lt;/font&gt; tregOficinas;
   tenviados      = ^tnodoenviados;
   tnodoenviados  = &lt;font color="#ffd700"&gt;&lt;b&gt;record&lt;/b&gt;&lt;/font&gt;
                       oficina : byte;
                       destino : byte;
                       ste     : tenviados;
                    &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;       
   trecibidos     = ^tnodorecibidos;
   tnodorecibidos = &lt;font color="#ffd700"&gt;&lt;b&gt;record&lt;/b&gt;&lt;/font&gt;

                       oficina : byte;
                       origen  : byte;
                       ste     : trecibidos;
                    &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;       
   tmatprecios    = &lt;font color="#ffd700"&gt;&lt;b&gt;Array&lt;/b&gt;&lt;/font&gt;[1..250 , 1..250] &lt;font color="#ffd700"&gt;&lt;b&gt;of&lt;/b&gt;&lt;/font&gt; single;

&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt;           
   arprecios      : tarprecios;
   aroficinas     : taroficinas;
   enviados       : tenviados;
   recibidos      : trecibidos;
   precios        : tmatprecios;
   origen,destino : byte;
   peso,precio    : single;


&lt;font color="#ffd700"&gt;&lt;b&gt;procedure&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa500"&gt;&lt;b&gt;listarResumen&lt;/b&gt;&lt;/font&gt;(enviados : tenviados;recibidos:trecibidos;&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; oficinas:taroficinas);

&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt;
   reg,ant : tregoficinas;
   auxE    : tenviados;
   auxR    : trecibidos;
   cant    : byte;
&lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
   ant.pais := &lt;font color="#ffa500"&gt;&lt;i&gt;''&lt;/i&gt;&lt;/font&gt;;
   ant.ciudad := &lt;font color="#ffa500"&gt;&lt;i&gt;''&lt;/i&gt;&lt;/font&gt;;   
   writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Resumen diario:'&lt;/i&gt;&lt;/font&gt;);
   &lt;font color="#ffd700"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffd700"&gt;&lt;b&gt;not&lt;/b&gt;&lt;/font&gt; eof(oficinas) &lt;font color="#ffd700"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;

   &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
      read(oficinas,reg);
      &lt;font color="#ffd700"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; ant.pais &amp;lt;&amp;gt; reg.pais &lt;font color="#ffd700"&gt;&lt;b&gt;then&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
         ant.pais := reg.pais;
         writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Pais: '&lt;/i&gt;&lt;/font&gt;, reg.pais);
      &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
      &lt;font color="#ffd700"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; ant.ciudad &amp;lt;&amp;gt; reg.ciudad &lt;font color="#ffd700"&gt;&lt;b&gt;then&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;

         ant.ciudad := reg.ciudad;
         writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Ciudad: '&lt;/i&gt;&lt;/font&gt;, reg.ciudad);
      &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
      writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Oficina: '&lt;/i&gt;&lt;/font&gt;,reg.ofi);
      auxE := enviados;
      cant := 0;
      &lt;font color="#ffd700"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt; (auxE &amp;lt;&amp;gt; nil) &lt;font color="#ffd700"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;
      &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;

         &lt;font color="#ffd700"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; auxE^.oficina = reg.ofi &lt;font color="#ffd700"&gt;&lt;b&gt;then&lt;/b&gt;&lt;/font&gt;
            inc(cant);
         auxE := auxE^.ste;
      &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
      writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Enviados por la oficina: '&lt;/i&gt;&lt;/font&gt;,cant);
      auxR := recibidos;
      cant := 0;
      &lt;font color="#ffd700"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt; (auxR &amp;lt;&amp;gt; nil) &lt;font color="#ffd700"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;

      &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
         &lt;font color="#ffd700"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; auxR^.oficina = reg.ofi &lt;font color="#ffd700"&gt;&lt;b&gt;then&lt;/b&gt;&lt;/font&gt;
            inc(cant);
         auxR := auxR^.ste;
      &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
      writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Recibidos por la oficina: '&lt;/i&gt;&lt;/font&gt;,cant);
            
   &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;

&lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;; 

&lt;font color="#ffd700"&gt;&lt;b&gt;procedure&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa500"&gt;&lt;b&gt;liberarmemoria&lt;/b&gt;&lt;/font&gt;(&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; enviados: tenviados; &lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; recibidos:trecibidos);
&lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
   writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Liberando memoria...'&lt;/i&gt;&lt;/font&gt;);
   &lt;font color="#ffd700"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt;(enviados &amp;lt;&amp;gt; nil) &lt;font color="#ffd700"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;

   &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
      dispose(enviados);
      enviados:= enviados^.ste;
   &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
   &lt;font color="#ffd700"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt;(recibidos &amp;lt;&amp;gt; nil) &lt;font color="#ffd700"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;
   &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
      dispose(recibidos);
      recibidos:= recibidos^.ste;
   &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;

&lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
&lt;font color="#ffd700"&gt;&lt;b&gt;procedure&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa500"&gt;&lt;b&gt;factura&lt;/b&gt;&lt;/font&gt;(origen,destino : byte; peso,precio:single);
&lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
   writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Origen: '&lt;/i&gt;&lt;/font&gt;,origen,&lt;font color="#ffa500"&gt;&lt;i&gt;' Destino: '&lt;/i&gt;&lt;/font&gt;,destino);
   writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Peso: '&lt;/i&gt;&lt;/font&gt;,peso:2,&lt;font color="#ffa500"&gt;&lt;i&gt;' Precio: '&lt;/i&gt;&lt;/font&gt;,precio:2);

&lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;; &lt;font color="#ff0000"&gt;&lt;i&gt;{ &lt;/i&gt;&lt;/font&gt;&lt;font color="#ff0000"&gt;&lt;i&gt;factura &lt;/i&gt;&lt;/font&gt;&lt;font color="#ff0000"&gt;&lt;i&gt;}&lt;/i&gt;&lt;/font&gt;
&lt;font color="#ffd700"&gt;&lt;b&gt;procedure&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa500"&gt;&lt;b&gt;ResumenOrigenes&lt;/b&gt;&lt;/font&gt;(&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; origen : byte;recibidos:trecibidos);
&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; cant : byte;
&lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;

   cant := 0;
   &lt;font color="#ffd700"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt;(recibidos &amp;lt;&amp;gt; nil) &lt;font color="#ffd700"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;
   &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
      &lt;font color="#ffd700"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(recibidos^.origen = origen) &lt;font color="#ffd700"&gt;&lt;b&gt;then&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;

         writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Destino: '&lt;/i&gt;&lt;/font&gt;, enviados^.oficina);
         inc(cant);
      &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
      recibidos := recibidos^.ste;
   &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
   writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Cantidad de recibidos al origen ( '&lt;/i&gt;&lt;/font&gt;,origen,&lt;font color="#ffa500"&gt;&lt;i&gt;' ): '&lt;/i&gt;&lt;/font&gt;, cant);
&lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
&lt;font color="#ffd700"&gt;&lt;b&gt;procedure&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa500"&gt;&lt;b&gt;ResumenDestinos&lt;/b&gt;&lt;/font&gt;(&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; destino : byte;enviados:tenviados);

&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; cant : byte;
&lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
   cant := 0;
   &lt;font color="#ffd700"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt;(enviados &amp;lt;&amp;gt; nil) &lt;font color="#ffd700"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;
   &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
      &lt;font color="#ffd700"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(enviados^.destino = destino) &lt;font color="#ffd700"&gt;&lt;b&gt;then&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;

         writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Origen: '&lt;/i&gt;&lt;/font&gt;, enviados^.oficina);
         inc(cant);
      &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
      enviados := enviados^.ste;
   &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
   writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Cantidad de enviados al destino ( '&lt;/i&gt;&lt;/font&gt;,destino,&lt;font color="#ffa500"&gt;&lt;i&gt;' ): '&lt;/i&gt;&lt;/font&gt;, cant);
&lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
&lt;font color="#ffd700"&gt;&lt;b&gt;procedure&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa500"&gt;&lt;b&gt;iEnviados&lt;/b&gt;&lt;/font&gt;(oficina,destino: byte;&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; enviados : tenviados);

&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; nodo : tenviados;
&lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;;
   new(nodo);
   nodo^.oficina := oficina;
   nodo^.destino := destino;
   nodo^.ste := enviados;
   enviados := nodo;
&lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
&lt;font color="#ffd700"&gt;&lt;b&gt;procedure&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa500"&gt;&lt;b&gt;iRecibidos&lt;/b&gt;&lt;/font&gt;(oficina,origen:byte;&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; recibidos : trecibidos);
&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; nodo : trecibidos;

&lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;;
   new(nodo);
   nodo^.oficina := oficina;
   nodo^.origen := origen;
   nodo^.ste := recibidos;
   recibidos := nodo;   
&lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
&lt;font color="#ffd700"&gt;&lt;b&gt;procedure&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa500"&gt;&lt;b&gt;menu&lt;/b&gt;&lt;/font&gt;(&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; origen : byte;&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; destino:byte;&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; peso:single);

&lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;;
   writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Origen: '&lt;/i&gt;&lt;/font&gt;);
   readln(origen);
   writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Destino: '&lt;/i&gt;&lt;/font&gt;);
   readln(destino);
   &lt;font color="#ffd700"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (destino &amp;lt;&amp;gt; 0) &lt;font color="#ffd700"&gt;&lt;b&gt;AND&lt;/b&gt;&lt;/font&gt; (origen &amp;lt;&amp;gt; 0) &lt;font color="#ffd700"&gt;&lt;b&gt;then&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;

      writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Kg: '&lt;/i&gt;&lt;/font&gt;);
      readln(peso);
   &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
&lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;

&lt;font color="#ffd700"&gt;&lt;b&gt;procedure&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa500"&gt;&lt;b&gt;iniPrecios&lt;/b&gt;&lt;/font&gt;(&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; precios : tmatprecios;&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; ar : tarprecios);

&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt;
   reg : tregPrecios;
   i,j : byte;
&lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
   &lt;font color="#ffd700"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; i:= 1 &lt;font color="#ffd700"&gt;&lt;b&gt;to&lt;/b&gt;&lt;/font&gt; 250 &lt;font color="#ffd700"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;
      &lt;font color="#ffd700"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt; j:=1 &lt;font color="#ffd700"&gt;&lt;b&gt;to&lt;/b&gt;&lt;/font&gt; 250 &lt;font color="#ffd700"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;

         precios[i,j]:=0;
   
   &lt;font color="#ffd700"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt;(&lt;font color="#ffd700"&gt;&lt;b&gt;not&lt;/b&gt;&lt;/font&gt; eof(ar)) &lt;font color="#ffd700"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;
   &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
      read(ar,reg);
      precios[reg.ofi1,reg.ofi2] := reg.precio;
      precios[reg.ofi2,reg.ofi1] := reg.precio;
      writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Cargando precio: precios['&lt;/i&gt;&lt;/font&gt;,reg.ofi1,&lt;font color="#ffa500"&gt;&lt;i&gt;','&lt;/i&gt;&lt;/font&gt;,reg.ofi2,&lt;font color="#ffa500"&gt;&lt;i&gt;'] := '&lt;/i&gt;&lt;/font&gt;,precios[reg.ofi1,reg.ofi2]);
   &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;


&lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
&lt;font color="#ffd700"&gt;&lt;b&gt;procedure&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa500"&gt;&lt;b&gt;iniListas&lt;/b&gt;&lt;/font&gt;(&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; enviados : tenviados; &lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; recibidos : trecibidos);
&lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
   enviados:=nil;
   recibidos:=nil;
&lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;

&lt;font color="#ffd700"&gt;&lt;b&gt;procedure&lt;/b&gt;&lt;/font&gt; &lt;font color="#ffa500"&gt;&lt;b&gt;iniArchivos&lt;/b&gt;&lt;/font&gt;(&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; precios: tarprecios;&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt; oficinas : taroficinas);
&lt;font color="#ffd700"&gt;&lt;b&gt;var&lt;/b&gt;&lt;/font&gt;
   regp      : tregPrecios;
   rego      : tregOficinas;
&lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
   assign(precios,&lt;font color="#ffa500"&gt;&lt;i&gt;'precios.dat'&lt;/i&gt;&lt;/font&gt;);
   assign(oficinas,&lt;font color="#ffa500"&gt;&lt;i&gt;'oficinas.dat'&lt;/i&gt;&lt;/font&gt;);
   rewrite(precios);
   rewrite(oficinas);
   regp.ofi1:=1; regp.ofi2:=2; regp.precio:=13;write(precios,regp);
   regp.ofi1:=3; regp.ofi2:=4; regp.precio:=14;write(precios,regp);
   regp.ofi1:=5; regp.ofi2:=6; regp.precio:=15;write(precios,regp);
   regp.ofi1:=7; regp.ofi2:=8; regp.precio:=16;write(precios,regp);
   regp.ofi1:=9; regp.ofi2:=10;regp.precio:=17;write(precios,regp);
   regp.ofi1:=12;regp.ofi2:=11;regp.precio:=18;write(precios,regp);

   rego.ofi:=1;rego.ciudad:= &lt;font color="#ffa500"&gt;&lt;i&gt;'Buenos Aires'&lt;/i&gt;&lt;/font&gt;;rego.pais:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Argentina'&lt;/i&gt;&lt;/font&gt;;write(oficinas,rego);
   rego.ofi:=2;rego.ciudad:= &lt;font color="#ffa500"&gt;&lt;i&gt;'Mar del Plat'&lt;/i&gt;&lt;/font&gt;;rego.pais:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Argentina'&lt;/i&gt;&lt;/font&gt;;write(oficinas,rego);
   rego.ofi:=3;rego.ciudad:= &lt;font color="#ffa500"&gt;&lt;i&gt;'San Juan    '&lt;/i&gt;&lt;/font&gt;;rego.pais:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Argentina'&lt;/i&gt;&lt;/font&gt;;write(oficinas,rego);
   rego.ofi:=4;rego.ciudad:= &lt;font color="#ffa500"&gt;&lt;i&gt;'Rosario     '&lt;/i&gt;&lt;/font&gt;;rego.pais:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Argentina'&lt;/i&gt;&lt;/font&gt;;write(oficinas,rego);
   rego.ofi:=5;rego.ciudad:= &lt;font color="#ffa500"&gt;&lt;i&gt;'Lujan       '&lt;/i&gt;&lt;/font&gt;;rego.pais:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Argentina'&lt;/i&gt;&lt;/font&gt;;write(oficinas,rego);
   rego.ofi:=6;rego.ciudad:= &lt;font color="#ffa500"&gt;&lt;i&gt;'Mercedes    '&lt;/i&gt;&lt;/font&gt;;rego.pais:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Argentina'&lt;/i&gt;&lt;/font&gt;;write(oficinas,rego);
   rego.ofi:=7;rego.ciudad:= &lt;font color="#ffa500"&gt;&lt;i&gt;'Milan       '&lt;/i&gt;&lt;/font&gt;;rego.pais:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Italia   '&lt;/i&gt;&lt;/font&gt;;write(oficinas,rego);
   rego.ofi:=8;rego.ciudad:= &lt;font color="#ffa500"&gt;&lt;i&gt;'Mayorca     '&lt;/i&gt;&lt;/font&gt;;rego.pais:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Espa&amp;#241;a   '&lt;/i&gt;&lt;/font&gt;;write(oficinas,rego);
   rego.ofi:=9;rego.ciudad:= &lt;font color="#ffa500"&gt;&lt;i&gt;'Valencia    '&lt;/i&gt;&lt;/font&gt;;rego.pais:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Espa&amp;#241;a   '&lt;/i&gt;&lt;/font&gt;;write(oficinas,rego);
   rego.ofi:=10;rego.ciudad:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Madrid      '&lt;/i&gt;&lt;/font&gt;;rego.pais:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Espa&amp;#241;a   '&lt;/i&gt;&lt;/font&gt;;write(oficinas,rego);
   rego.ofi:=11;rego.ciudad:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Napoles     '&lt;/i&gt;&lt;/font&gt;;rego.pais:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Italia   '&lt;/i&gt;&lt;/font&gt;;write(oficinas,rego);
   rego.ofi:=12;rego.ciudad:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Jael        '&lt;/i&gt;&lt;/font&gt;;rego.pais:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Espa&amp;#241;a   '&lt;/i&gt;&lt;/font&gt;;write(oficinas,rego);
   rego.ofi:=13;rego.ciudad:=&lt;font color="#ffa500"&gt;&lt;i&gt;'San fernando'&lt;/i&gt;&lt;/font&gt;;rego.pais:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Espa&amp;#241;a   '&lt;/i&gt;&lt;/font&gt;;write(oficinas,rego);
   rego.ofi:=14;rego.ciudad:=&lt;font color="#ffa500"&gt;&lt;i&gt;'Bombay      '&lt;/i&gt;&lt;/font&gt;;rego.pais:=&lt;font color="#ffa500"&gt;&lt;i&gt;'India    '&lt;/i&gt;&lt;/font&gt;;write(oficinas,rego);
   reset(precios);
   reset(oficinas);
   

&lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
   
&lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt; 
   iniArchivos(arprecios,aroficinas);
   iniListas(enviados,recibidos);
   iniPrecios(precios,arprecios);
   &lt;font color="#ffd700"&gt;&lt;b&gt;repeat&lt;/b&gt;&lt;/font&gt;
      menu(origen,destino,peso);
      &lt;font color="#ffd700"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (origen = 0) &lt;font color="#ffd700"&gt;&lt;b&gt;and&lt;/b&gt;&lt;/font&gt; (destino &amp;lt;&amp;gt; 0) &lt;font color="#ffd700"&gt;&lt;b&gt;then&lt;/b&gt;&lt;/font&gt;

      &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
         ResumenDestinos(destino,enviados);
      &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
      &lt;font color="#ffd700"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (origen &amp;lt;&amp;gt; 0) &lt;font color="#ffd700"&gt;&lt;b&gt;and&lt;/b&gt;&lt;/font&gt; (destino = 0) &lt;font color="#ffd700"&gt;&lt;b&gt;then&lt;/b&gt;&lt;/font&gt;

      &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
         ResumenOrigenes(origen,recibidos);
      &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
      &lt;font color="#ffd700"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt; (origen &amp;lt;&amp;gt; 0) &lt;font color="#ffd700"&gt;&lt;b&gt;and&lt;/b&gt;&lt;/font&gt; (destino &amp;lt;&amp;gt; 0) &lt;font color="#ffd700"&gt;&lt;b&gt;then&lt;/b&gt;&lt;/font&gt;

      &lt;font color="#ffd700"&gt;&lt;b&gt;begin&lt;/b&gt;&lt;/font&gt;
         precio := peso * (precios[origen,destino]);
         writeln(&lt;font color="#ffa500"&gt;&lt;i&gt;'Por kg precios['&lt;/i&gt;&lt;/font&gt;,origen,&lt;font color="#ffa500"&gt;&lt;i&gt;','&lt;/i&gt;&lt;/font&gt;,destino,&lt;font color="#ffa500"&gt;&lt;i&gt;']: '&lt;/i&gt;&lt;/font&gt;, precios[origen,destino]);
         iEnviados(origen,destino,enviados);
         iRecibidos(destino,origen,recibidos);
         factura(origen,destino,peso,precio);
      &lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;;
   &lt;font color="#ffd700"&gt;&lt;b&gt;until&lt;/b&gt;&lt;/font&gt; (origen = 0) &lt;font color="#ffd700"&gt;&lt;b&gt;AND&lt;/b&gt;&lt;/font&gt; (destino = 0);
   listarResumen(enviados,recibidos,aroficinas);
   liberarMemoria(enviados,recibidos);

&lt;font color="#ffd700"&gt;&lt;b&gt;end&lt;/b&gt;&lt;/font&gt;.&lt;/pre&gt;
&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-8944594261461326796?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/8944594261461326796/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=8944594261461326796' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8944594261461326796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8944594261461326796'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/12/final-de-algoritmos-resuelto.html' title='Final de algoritmos resuelto en pascal UTN'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-2053396211095830388</id><published>2007-11-17T11:31:00.000-03:00</published><updated>2007-11-17T11:32:37.426-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ordena burbuja mejorado'/><category scheme='http://www.blogger.com/atom/ns#' term='ordena burbuja'/><category scheme='http://www.blogger.com/atom/ns#' term='algoritmo de ordenacion'/><title type='text'>Ordena Burbuja en Java</title><content type='html'>&lt;p&gt;Dos versiones del algoritmo de ordenación burbuja en
  Java. Descomentar la llamada del método para probar una u otra.&lt;/p&gt;

&lt;pre width="80"&gt;&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="OrdenaAlgoritmo"&gt;&lt;/a&gt;class OrdenaAlgoritmo &lt;/font&gt;&lt;/strong&gt;{
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void ordenar( int [] arreglo)&lt;/font&gt;&lt;/strong&gt; {
 int pasadas = 0;
 int comparaciones = 0;
 &lt;font color="#4169E1"&gt;for&lt;/font&gt; (int i = 0; i &amp;lt; arreglo.length; i++) {
     ++pasadas;
     &lt;font color="#4169E1"&gt;for&lt;/font&gt; (int j = 0; j &amp;lt; arreglo.length - 1; j++) {
  ++comparaciones;
  &lt;font color="#4169E1"&gt;if&lt;/font&gt; (arreglo[j] &amp;gt; arreglo[j + 1]) {
      intercambiar(arreglo, j, j+1);
  }
     }
 }
 estadisticas(pasadas, comparaciones);
    }

&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void ordenarMejorado( int [] arreglo)&lt;/font&gt;&lt;/strong&gt; {
 int pasadas = 0;
 int comparaciones = 0;
 boolean hayCambios = true;
 &lt;font color="#4169E1"&gt;for&lt;/font&gt; (int i = 0; hayCambios ; i++) {
     ++pasadas;
     hayCambios = false;
     &lt;font color="#4169E1"&gt;for&lt;/font&gt; (int j = 0; j &amp;lt; arreglo.length - 1; j++) {
  ++comparaciones;
  &lt;font color="#4169E1"&gt;if&lt;/font&gt; (arreglo[j] &amp;gt; arreglo[j + 1]) {
      intercambiar(arreglo, j, j+1);
      hayCambios = true;
  }
     }
 }
 estadisticas(pasadas, comparaciones);
    }

&lt;strong&gt;&lt;font color="#4169E1"&gt;    private static void intercambiar(int [] arreglo, int a, int b)&lt;/font&gt;&lt;/strong&gt; {
 int tmp = arreglo[a];
 arreglo[a] = arreglo[b];
 arreglo[b] = tmp;
    }

&lt;strong&gt;&lt;font color="#4169E1"&gt;    private static void estadisticas( int pasadas, int comparaciones)&lt;/font&gt;&lt;/strong&gt; {
 System.out.println( &lt;font color="#666666"&gt;"Pasadas: "&lt;/font&gt; + pasadas );
 System.out.println( &lt;font color="#666666"&gt;"Comparaciones: "&lt;/font&gt; + comparaciones );
    }
}


&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="OrdenaBurbuja"&gt;&lt;/a&gt;public class OrdenaBurbuja &lt;/font&gt;&lt;/strong&gt;{
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void  main (String args[])&lt;/font&gt;&lt;/strong&gt; {

 int [] valores = {15,35,01,05,04,03,19,45,13,02,55,8,
    78,997,451,546,12,16,24,103,99,784,
    4541,15};

 &lt;font color="#B22222"&gt;//OrdenaAlgoritmo.ordenar(valores);&lt;/font&gt;
 OrdenaAlgoritmo.ordenarMejorado(valores);
 &lt;font color="#B22222"&gt;// Mostrar arreglo.&lt;/font&gt;
 &lt;font color="#4169E1"&gt;for&lt;/font&gt; (int i = 0; i &amp;lt; valores.length ; i++)
     System.out.println ( &lt;font color="#666666"&gt;"valores["&lt;/font&gt;+i+&lt;font color="#666666"&gt;"]: "&lt;/font&gt;+  valores[i]);
 
    }
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-2053396211095830388?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/2053396211095830388/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=2053396211095830388' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2053396211095830388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/2053396211095830388'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/11/ordena-burbuja-en-java.html' title='Ordena Burbuja en Java'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-4845243142162059365</id><published>2007-11-17T09:27:00.000-03:00</published><updated>2007-11-17T09:28:27.066-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='busqueda binaria'/><category scheme='http://www.blogger.com/atom/ns#' term='algoritmo de busqueda'/><title type='text'>Búsqueda binaria en java</title><content type='html'>&lt;p&gt;Implementación del algoritmo de búsqueda binaria de manera no
  recursiva en Java.&lt;/p&gt;
&lt;p&gt;Se utiliza una función estática de la clase BusquedaAlgoritmo.&lt;/p&gt; 
&lt;p&gt;Recordar que para que funcione correctamente los valores del arreglo deben estar ordenados.&lt;/p&gt;
&lt;pre width="80"&gt;&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="BusquedaAlgoritmo"&gt;&lt;/a&gt;class BusquedaAlgoritmo &lt;/font&gt;&lt;/strong&gt;{
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static int buscar( int [] arreglo, int dato)&lt;/font&gt;&lt;/strong&gt; {
 int inicio = 0;
 int fin = arreglo.length - 1;
 int pos;
 &lt;font color="#4169E1"&gt;while&lt;/font&gt; (inicio &amp;lt;= fin) {
     pos = (inicio+fin) / 2;
     &lt;font color="#4169E1"&gt;if&lt;/font&gt; ( arreglo[pos] == dato )
       &lt;font color="#4169E1"&gt;return&lt;/font&gt; pos;
     &lt;font color="#4169E1"&gt;else&lt;/font&gt; &lt;font color="#4169E1"&gt;if&lt;/font&gt; ( arreglo[pos] &amp;lt; dato ) {
  inicio = pos+1;
     } &lt;font color="#4169E1"&gt;else&lt;/font&gt; {
  fin = pos-1;
     }
 }
 &lt;font color="#4169E1"&gt;return&lt;/font&gt; -1;
    }
}

&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="BusquedaBinaria"&gt;&lt;/a&gt;public class BusquedaBinaria &lt;/font&gt;&lt;/strong&gt;{
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void  main (String args[])&lt;/font&gt;&lt;/strong&gt; {
 &lt;font color="red"&gt;// Llenar arreglo&lt;/font&gt;
 int [] edades = new int [35];
 &lt;font color="#4169E1"&gt;for&lt;/font&gt; (int i = 0; i &amp;lt; edades.length ; i++)
     edades[i] = i*i ;

 &lt;font color="red"&gt;// Mostrar arreglo.&lt;/font&gt;
 &lt;font color="#4169E1"&gt;for&lt;/font&gt; (int i = 0; i &amp;lt; edades.length ; i++)
     System.out.println ( &lt;font color="#666666"&gt;"edades["&lt;/font&gt;+i+&lt;font color="#666666"&gt;"]: "&lt;/font&gt;+  edades[i]);

 int resultado = BusquedaAlgoritmo.buscar(edades, 9);

 &lt;font color="#4169E1"&gt;if&lt;/font&gt; (resultado != -1) {
     System.out.println ( &lt;font color="#666666"&gt;"Encontrado en: "&lt;/font&gt;+  resultado);
 } &lt;font color="#4169E1"&gt;else&lt;/font&gt; {
     System.out.println ( &lt;font color="#666666"&gt;"El dato no se encuentra en el arreglo, o el arreglo no est&amp;Atilde;¡ ordenado."&lt;/font&gt;  );
 }
 
    }
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-4845243142162059365?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/4845243142162059365/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=4845243142162059365' title='12 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4845243142162059365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4845243142162059365'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/11/bsqueda-binaria-en-java.html' title='Búsqueda binaria en java'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-6176855465727626128</id><published>2007-11-04T14:26:00.000-03:00</published><updated>2007-11-04T14:45:10.808-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='poo'/><category scheme='http://www.blogger.com/atom/ns#' term='inicialización'/><category scheme='http://www.blogger.com/atom/ns#' term='arrays'/><category scheme='http://www.blogger.com/atom/ns#' term='arreglos'/><title type='text'>Arrays en Java</title><content type='html'>&lt;p&gt;Para obtener un arreglo en Java lo primero que debemos hacer es
  definir la referencia a este, por ejemplo:&lt;/p&gt;
&lt;pre&gt;
int [] arregloEntero;
&lt;/pre&gt; 
&lt;p&gt;Definimos una referencia a un arreglo entero, pero aún no hemos
  creado el arreglo. Una sintaxis similar es la siguiente:&lt;/p&gt;
&lt;pre&gt;
int arregloEntero[];
&lt;/pre&gt;
&lt;p&gt;Sin embargo se considera más elegante la primera porque queda más
  claro que &lt;code&gt;int []&lt;/code&gt; es un tipo referencia a array
  entero.&lt;/p&gt;
&lt;p&gt;Para inicializar la referencia podemos asignar una lista objetos (o
  tipos primitivos) según el tipo de la referencia por ejemplo:&lt;/p&gt;
&lt;pre&gt;
  // Dos elementos, de tipo primitivo.
  int [] arregloTiposPrimitivos = {1, 2}

  // Arreglo de objetos de dos elementos.
  TipoDeObjeto [] arregloObjetos = {new TipoDeObjeto(), new TipoDeObjeto()}
&lt;/pre&gt;
&lt;p&gt;Con el modo de inicialización anterior el tamaño del objeto se está
  conoce en tiempo de compilación.&lt;/p&gt;
&lt;p&gt;Una manera alternativa es determinar el tamaño
  mediante &lt;code&gt;new&lt;/code&gt;, si se trata de un array de datos
  primitivos estos se inicializaran con su valor por defecto (por
  ejemplo 0 para int), mientras que en un array de objetos obtendremos
  un array de referencias inicializadas en &lt;code&gt;null&lt;/code&gt;. Por
  ejemplo:&lt;/p&gt;
&lt;pre&gt;
  int [] arregloDatosPrimitivos = new int[tamaño];
  // Imprime 0.
  System.out.println(arregloDatosPrimitivos[tamaño-1]);

  Tipo [] arregloObjetos = new Tipo[tamaño];
  // Imprime null.
  System.out.println(arregloObjetos[tamaño-1]);
  arregloObjetos[tamaño-1] = new Tipo();
  //Imprime lo devuelto por getAlgunDato()
  System.out.println(arregloObjetos[tamaño-1].getAlgunDato());
&lt;/pre&gt;

&lt;p&gt;Veamos ahora un ejemplo que ilustre las situaciones anteriores:&lt;/p&gt;

&lt;pre width="80"&gt;&lt;font color="#B22222"&gt;// Archivo: ArreglosJava.java&lt;/font&gt;
&lt;font color="#B22222"&gt;// codigomaldito.blogspot.com&lt;/font&gt;
&lt;font color="#B22222"&gt;// Compilar con: javac ArreglosJava.java &lt;/font&gt;
&lt;font color="#B22222"&gt;// Ejecutar con: java ArreglosJava&lt;/font&gt;

&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="DatoA"&gt;&lt;/a&gt;class DatoA &lt;/font&gt;&lt;/strong&gt;{
    private int z;
    DatoA(int i) { z = i; }
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public int getDato()&lt;/font&gt;&lt;/strong&gt; { &lt;font color="#4169E1"&gt;return&lt;/font&gt; z; }
}


&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="ArreglosJava"&gt;&lt;/a&gt;public class ArreglosJava &lt;/font&gt;&lt;/strong&gt;{

    &lt;font color="#B22222"&gt;//Flujo principal de ejecuci&amp;Atilde;³n.&lt;/font&gt;
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void main(String [] args)&lt;/font&gt;&lt;/strong&gt; {
 &lt;font color="#B22222"&gt;// Array de tipo de primitivo. Dos notaciones. Estilo Java y estilo C.&lt;/font&gt;
 int [] arregloEntero =   {1,2,3,4,5};
 int arregloEntero2 [] =  {1,2,3,4,5};
 &lt;font color="#B22222"&gt;//5 elementos, los &amp;Atilde;­ndices van de 0...4&lt;/font&gt;
 &lt;font color="#4169E1"&gt;for&lt;/font&gt;(int i = 0 ; i &amp;lt; arregloEntero.length ; i++)
     System.out.println(&lt;font color="#666666"&gt;"arregloEntero["&lt;/font&gt;+i+&lt;font color="#666666"&gt;"] = "&lt;/font&gt;+ arregloEntero[i]);
 &lt;font color="#4169E1"&gt;for&lt;/font&gt;(int i = 0 ; i &amp;lt; arregloEntero2.length ; i++)
     System.out.println(&lt;font color="#666666"&gt;"arregloEntero2["&lt;/font&gt;+i+&lt;font color="#666666"&gt;"] = "&lt;/font&gt;+ arregloEntero2[i]);

 &lt;font color="#B22222"&gt;//Generamos un n&amp;Atilde;ºmero aleatorio entre 1 y 10.&lt;/font&gt;
 int EnteroAleatorio = (int)(10.0 * Math.random()) + 1;
 &lt;font color="#B22222"&gt;// Utilizamos EnteroAleatorio como tama&amp;Atilde;±o del arreglo&lt;/font&gt;
 &lt;font color="#B22222"&gt;// esto significa que el tama&amp;Atilde;±o puede definirse en tiempo de &lt;/font&gt;
 &lt;font color="#B22222"&gt;// ejecuci&amp;Atilde;³n.&lt;/font&gt;
 int [] arregloVariable = new int[EnteroAleatorio];
 System.out.println(&lt;font color="#666666"&gt;"Mostrando arreglo de "&lt;/font&gt;+EnteroAleatorio+&lt;font color="#666666"&gt;" elementos."&lt;/font&gt;);
 &lt;font color="#B22222"&gt;// Sin inicializar mostramos el arreglo, autom&amp;Atilde;¡ticamente &lt;/font&gt;
 &lt;font color="#B22222"&gt;// java lo inicializ&amp;Atilde;³ en 0.&lt;/font&gt;
 &lt;font color="#4169E1"&gt;for&lt;/font&gt;(int i = 0 ; i &amp;lt; arregloVariable.length ; i++)
     System.out.println(&lt;font color="#666666"&gt;"arregloVariable["&lt;/font&gt;+i+&lt;font color="#666666"&gt;"] = "&lt;/font&gt;+ arregloVariable[i]);

 
 DatoA [] arregloDeObjetos = new DatoA[10];
 &lt;font color="#B22222"&gt;// Valor en la posici&amp;Atilde;³n 2 igual a null. (es un array de referencias).&lt;/font&gt;
 System.out.println(&lt;font color="#666666"&gt;"arregloDeObjetos[2] = "&lt;/font&gt;+ arregloDeObjetos[2]);
 
 &lt;font color="#B22222"&gt;//Lo siguiente ser&amp;Atilde;­a un error en tiempo de ejecuci&amp;Atilde;³n. La posici&amp;Atilde;³n no apunta a nada a&amp;Atilde;ºn.&lt;/font&gt;
 &lt;font color="#B22222"&gt;//System.out.println("arregloDeObjetos[2].getDato() = "+ arregloDeObjetos[2].getDato());&lt;/font&gt;

 &lt;font color="#4169E1"&gt;for&lt;/font&gt;(int i = 0 ; i &amp;lt; arregloDeObjetos.length ; i++)
     arregloDeObjetos[i] = new DatoA(5);
 &lt;font color="#4169E1"&gt;for&lt;/font&gt;(int i = 0 ; i &amp;lt; arregloDeObjetos.length ; i++)
     System.out.println(&lt;font color="#666666"&gt;"arregloDeObjetos["&lt;/font&gt;+i+&lt;font color="#666666"&gt;"].getDato() = "&lt;/font&gt;+ arregloDeObjetos[i].getDato());

 &lt;font color="#B22222"&gt;//Otro m&amp;Atilde;©todo alternativo de inicializaci&amp;Atilde;³n&lt;/font&gt;
 &lt;font color="#B22222"&gt;// 2 objetos.&lt;/font&gt;
 DatoA [] arregloDeObjetos2 = {new DatoA(1), new DatoA(2) };
 &lt;font color="#4169E1"&gt;for&lt;/font&gt;(int i = 0 ; i &amp;lt; arregloDeObjetos2.length ; i++)
     System.out.println(&lt;font color="#666666"&gt;"arregloDeObjetos2["&lt;/font&gt;+i+&lt;font color="#666666"&gt;"].getDato() = "&lt;/font&gt;+ arregloDeObjetos2[i].getDato());
    }
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-6176855465727626128?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/6176855465727626128/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=6176855465727626128' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/6176855465727626128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/6176855465727626128'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/11/arrays-en-java.html' title='Arrays en Java'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-4013704186957751149</id><published>2007-11-04T13:44:00.001-03:00</published><updated>2011-06-04T21:46:34.105-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='objetos'/><category scheme='http://www.blogger.com/atom/ns#' term='poo'/><category scheme='http://www.blogger.com/atom/ns#' term='referencia this'/><title type='text'>Referencia this en Java</title><content type='html'>&lt;p&gt;Muchos métodos de un objeto necesitan acceder a los datos miembros
  de este, y a otras propiedades del objeto. Por este motivo es que
  el lenguaje Java junto a la ejecución de un método pasa como
  argumento la referencia del objeto que está ejecutando el
  miembro. Para referirnos explícitamente a esta referencia desde el
  método utilizamos la palabra reservada &lt;code&gt;this&lt;/code&gt;. Que no es
  otra cosa que una referencia al objeto que está ejecutando al
  método.&lt;/p&gt;
&lt;p&gt;Si bien en muchos casos se puede omitir su uso, otras veces nos
  ayuda a resolver ambiguedades o para devolver referencias del
  objeto que ejecutó el método. Por ejemplo:&lt;/p&gt;

&lt;pre width="80"&gt;&lt;font color="#B22222"&gt;// Referencia this.&lt;/font&gt;
&lt;font color="#B22222"&gt;// Compilar con: javac UsoThis.java&lt;/font&gt;
&lt;font color="#B22222"&gt;// Ejecutar con: java UsoThis&lt;/font&gt;
&lt;font color="#B22222"&gt;// http://codigomaldito.blogspot.com&lt;/font&gt;

&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="Ventana"&gt;&lt;/a&gt;class Ventana &lt;/font&gt;&lt;/strong&gt;{
    private int largo;
    private int ancho;
    Ventana(int largo, int ancho) {
 &lt;font color="#B22222"&gt;//this.DATOMIEMBRO elimina la ambiguedad.&lt;/font&gt;
 this.largo = largo;
 this.ancho = ancho;
    }
    Ventana(){
 &lt;font color="#B22222"&gt;// No es necesario usar this.&lt;/font&gt;
 largo = 0;
 ancho = 0;
    }

    &lt;font color="#B22222"&gt;// Devuelve una referencia al mismo objeto&lt;/font&gt;
    &lt;font color="#B22222"&gt;// esto permite una llamada del tipo &lt;/font&gt;
    &lt;font color="#B22222"&gt;// obj.incrementarLargo().incrementarLargo();&lt;/font&gt;
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public Ventana incrementarLargo()&lt;/font&gt;&lt;/strong&gt; {
 ++largo;
 &lt;font color="#4169E1"&gt;return&lt;/font&gt; this;
    }
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public Ventana incrementarAncho()&lt;/font&gt;&lt;/strong&gt; {
 ++ancho;
 &lt;font color="#4169E1"&gt;return&lt;/font&gt; this;
    }
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public int getAncho()&lt;/font&gt;&lt;/strong&gt; {
 &lt;font color="#4169E1"&gt;return&lt;/font&gt; ancho;
    }
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public int getLargo()&lt;/font&gt;&lt;/strong&gt; {
 &lt;font color="#B22222"&gt;//utilzamos la referencia.&lt;/font&gt;
 &lt;font color="#4169E1"&gt;return&lt;/font&gt; this.largo;
    }


&lt;strong&gt;&lt;font color="#4169E1"&gt;    public void mostrar()&lt;/font&gt;&lt;/strong&gt; {
 &lt;font color="#B22222"&gt;// Aqu&amp;Atilde;­ no hay ambiguedad, podemos utilizar&lt;/font&gt;
 &lt;font color="#B22222"&gt;// explicitamente a this, o bien&lt;/font&gt;
 &lt;font color="#B22222"&gt;// no especificarlo.&lt;/font&gt;
 System.out.println(&lt;font color="#666666"&gt;"Ancho: "&lt;/font&gt;+getAncho()+&lt;font color="#666666"&gt;" y Largo: "&lt;/font&gt;+ this.getLargo());
    }

}


&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="UsoThis"&gt;&lt;/a&gt;public class UsoThis &lt;/font&gt;&lt;/strong&gt;{

    
    &lt;font color="#B22222"&gt;// Flujo principal de ejecuci&amp;Atilde;³n&lt;/font&gt;
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void main (String [] args)&lt;/font&gt;&lt;/strong&gt; {
 &lt;font color="#B22222"&gt;//El constructor usa this para resolver la ambiguedad.&lt;/font&gt;
 System.out.println(&lt;font color="#666666"&gt;"Referencia A"&lt;/font&gt;);
 Ventana A = new Ventana(0,0);
 A.mostrar();
 &lt;font color="#B22222"&gt;//incrementarAncho() devuelve una referencia al objeto.&lt;/font&gt;
 System.out.println(&lt;font color="#666666"&gt;"Se incrementa dos veces el ancho del objeto al que apunta A"&lt;/font&gt;);
 A.incrementarAncho().incrementarAncho();
 A.mostrar();

 &lt;font color="#B22222"&gt;// Este modo de asignar resulta curioso&lt;/font&gt;
 &lt;font color="#B22222"&gt;// Creamos una referencia, pero no un objeto.&lt;/font&gt;
 Ventana B;
 &lt;font color="#B22222"&gt;// Asignamos la referencia de incrementarLargo();&lt;/font&gt;
 B = A.incrementarLargo();
 &lt;font color="#B22222"&gt;//Ahora las dos referencias apuntan al mismo objeto.&lt;/font&gt;
 System.out.println(&lt;font color="#666666"&gt;"Referencia A y referencia B apuntan al mismo objeto."&lt;/font&gt;);
 A.mostrar();
 B.mostrar();
    }
}&lt;/pre&gt;

&lt;p&gt;La salida del programa es: &lt;/p&gt;
&lt;pre&gt;
Referencia A
Ancho: 0 y Largo: 0
Se incrementa el ancho del objeto al que apunta A
Ancho: 2 y Largo: 0
Referencia A y referencia B apuntan al mismo objeto.
Ancho: 2 y Largo: 1
Ancho: 2 y Largo: 1
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-4013704186957751149?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/4013704186957751149/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=4013704186957751149' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4013704186957751149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/4013704186957751149'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/11/referencia-this-en-java.html' title='Referencia this en Java'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-8111677887554263917</id><published>2007-11-04T13:33:00.001-03:00</published><updated>2007-11-04T13:33:39.528-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='sobrecarga'/><category scheme='http://www.blogger.com/atom/ns#' term='constructores por defecto'/><category scheme='http://www.blogger.com/atom/ns#' term='constructores'/><title type='text'>Constructores y sobrecarga en Java</title><content type='html'>&lt;p&gt;Los constructores son métodos específicos de la clase que llevan el
  mismo nombre que esta. Siempre que se cree un nuevo objeto no
  primitivo se ejecutará un constructor incluso cuando no se
  defina ningun constructor por parte del programador, Java ejecutará
  constructor automáticamente.&lt;/p&gt;
&lt;p&gt;Como el resto de los métodos, los constructores pueden estar
  sobrecargados. Esto significa que podemos definir distintos
  constructores cambiando el orden, la cantidad y el tipo de
  parámetros que reciben. Luego dependiendo la manera en la que se
  cree el objeto con &lt;code&gt;new&lt;/code&gt; Java elegirá el constructor
  adecuado basándose en la lista de parámetros.&lt;/p&gt;
&lt;p&gt;En el ejemplo siguiente se ilustra la sobrecarga de constructores:&lt;/p&gt;


&lt;pre width="80"&gt;&lt;font color="#B22222"&gt;// Archivo: Constructores.java&lt;/font&gt;
&lt;font color="#B22222"&gt;// Uso de constructores&lt;/font&gt;
&lt;font color="#B22222"&gt;// Compilar con: javac Constructores.java&lt;/font&gt;
&lt;font color="#B22222"&gt;// Ejecutar con: java Constructores&lt;/font&gt;


&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="Luz"&gt;&lt;/a&gt;class Luz &lt;/font&gt;&lt;/strong&gt;{
    &lt;font color="#B22222"&gt;//Datos miembro privados de la clase.&lt;/font&gt;
    &lt;font color="#B22222"&gt;// Dato primitivo valor por defecto: 0.&lt;/font&gt;
    private int brillo;        
    &lt;font color="#B22222"&gt;// Dato primitivo valor por defecto: false.&lt;/font&gt;
    private boolean encendida; 

    &lt;font color="#B22222"&gt;//Constructor por defecto, sin argumentos.&lt;/font&gt;
    Luz() {
 salida(&lt;font color="#666666"&gt;"Constructor por defecto Luz()"&lt;/font&gt;);
 this.brillo = 0;
 this.encendida = true;
    }

    &lt;font color="#B22222"&gt;//Constructor que recibe un entero.&lt;/font&gt;
    Luz(int brillo) {
 salida(&lt;font color="#666666"&gt;"Constructor con un parametro entero Luz(int brillo)"&lt;/font&gt;);
 this.brillo = brillo;
    }

    &lt;font color="#B22222"&gt;//Constructor que recibe un boolean&lt;/font&gt;
    Luz(boolean encendida) {
 salida(&lt;font color="#666666"&gt;"Constructor con un parametro boolean Luz(boolean encendida)"&lt;/font&gt;);
 this.encendida = encendida;
    }

    &lt;font color="#B22222"&gt;//Constructor que recibe un boolean y un entero.&lt;/font&gt;
    Luz(boolean encendida, int brillo) {
 &lt;font color="#B22222"&gt;//Podemos invocar a otro constructor con this(), siempre&lt;/font&gt;
 &lt;font color="#B22222"&gt;// que sea lo primero en llamarse.&lt;/font&gt;
 this(brillo);
 salida(&lt;font color="#666666"&gt;"Constructor con dos parametros: Luz(boolean encendida, int brillo)"&lt;/font&gt;);
 this.encendida = encendida;
    }
    
    &lt;font color="#B22222"&gt;//Atajo para imprimir.&lt;/font&gt;
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public void salida(String s)&lt;/font&gt;&lt;/strong&gt; {
 System.out.println(s);
    }

}


&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="Constructores"&gt;&lt;/a&gt;public class Constructores &lt;/font&gt;&lt;/strong&gt;{
    &lt;font color="#B22222"&gt;// Flujo inicial de ejecuci&amp;Atilde;³n&lt;/font&gt;
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void main (String [] args)&lt;/font&gt;&lt;/strong&gt; {
 &lt;font color="#B22222"&gt;// Vamos a crear Lamparitas.&lt;/font&gt;
 System.out.println(&lt;font color="#666666"&gt;"Se crea lamparita A, con Luz()."&lt;/font&gt;);
 Luz lamparitaA = new Luz();
 System.out.println(&lt;font color="#666666"&gt;"Se crea lamparita B, con Luz(10)."&lt;/font&gt;);
 Luz lamparitaB = new Luz(10);
 System.out.println(&lt;font color="#666666"&gt;"Se crea lamparita C, con Luz(true)."&lt;/font&gt;);
 Luz lamparitaC = new Luz(true);
 System.out.println(&lt;font color="#666666"&gt;"Se crea lamparita D, con Luz(true,15)."&lt;/font&gt;);
 Luz lamparitaD = new Luz(true,15);
 
    }
}&lt;/pre&gt;

&lt;p&gt;La salida del programa anterior es la siguiente:&lt;/p&gt;
&lt;pre&gt;
Se crea lamparita A, con Luz().
Constructor por defecto Luz()
Se crea lamparita B, con Luz(10).
Constructor con un parametro entero Luz(int brillo)
Se crea lamparita C, con Luz(true).
Constructor con un parametro boolean Luz(boolean encendida)
Se crea lamparita D, con Luz(true,15).
Constructor con un parametro entero Luz(int brillo)
Constructor con dos parametros: Luz(boolean encendida, int brillo)
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-8111677887554263917?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/8111677887554263917/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=8111677887554263917' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8111677887554263917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8111677887554263917'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/11/constructores-y-sobrecarga-en-java.html' title='Constructores y sobrecarga en Java'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-7188159223447050876</id><published>2007-11-04T00:19:00.000-03:00</published><updated>2007-11-04T00:20:41.233-03:00</updated><title type='text'>Tipos de datos primitivos en Java</title><content type='html'>&lt;table style="border: 1px;"&gt;
      &lt;tr&gt;
 &lt;th&gt;Tipo primitivo&lt;/th&gt;
 &lt;th&gt;Tamaño&lt;/th&gt;
 &lt;th&gt;Mínimo&lt;/th&gt;
 &lt;th&gt;Máximo&lt;/th&gt;
 &lt;th&gt;Valor por defecto como dato miembro&lt;/th&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
 &lt;th&gt;boolean&lt;/th&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;td&gt;false&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
 &lt;th&gt;char&lt;/th&gt;
 &lt;td&gt;16 bits&lt;/td&gt;
 &lt;td&gt;Unicode 0&lt;/td&gt;
 &lt;td&gt;Unicode 2^16-1&lt;/td&gt;
 &lt;td&gt;'\u0000'(null)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
 &lt;th&gt;byte&lt;/th&gt;
 &lt;td&gt;8 bits&lt;/td&gt;
 &lt;td&gt;-1^28&lt;/td&gt;
 &lt;td&gt;+127&lt;/td&gt;
 &lt;td&gt;(byte)0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
 &lt;th&gt;shot&lt;/th&gt;
 &lt;td&gt;16 bits&lt;/td&gt;
 &lt;td&gt;-2^15&lt;/td&gt;
 &lt;td&gt;+2^15-1&lt;/td&gt;
 &lt;td&gt;(short)0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
 &lt;th&gt;int&lt;/th&gt;
 &lt;td&gt;32 bits&lt;/td&gt;
 &lt;td&gt;-2^15&lt;/td&gt;
 &lt;td&gt;+2^31-1&lt;/td&gt;
 &lt;td&gt;0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
 &lt;th&gt;float&lt;/th&gt;
 &lt;td&gt;32 bits&lt;/td&gt;
 &lt;td&gt;IEEE754&lt;/td&gt;
 &lt;td&gt;IEEE754&lt;/td&gt;
 &lt;td&gt;0.0f&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
 &lt;th&gt;double&lt;/th&gt;
 &lt;td&gt;64 bits&lt;/td&gt;
 &lt;td&gt;IEEE754&lt;/td&gt;
 &lt;td&gt;IEEE754&lt;/td&gt;
 &lt;td&gt;0.0d&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
 &lt;th&gt;void&lt;/th&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
 &lt;td&gt;-&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-7188159223447050876?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/7188159223447050876/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=7188159223447050876' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/7188159223447050876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/7188159223447050876'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/11/tipos-de-datos-primitivos-en-java.html' title='Tipos de datos primitivos en Java'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-5410114054366049772</id><published>2007-11-04T00:06:00.000-03:00</published><updated>2007-11-04T13:31:04.848-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='EJEMPLOS'/><category scheme='http://www.blogger.com/atom/ns#' term='número aleatorio'/><title type='text'>Números aleatorios en Java</title><content type='html'>&lt;pre width="80"&gt;&lt;font color="#B22222"&gt;/*
 * N&amp;utilde;meros aleatorios en Java. 
 * 
 *
 */&lt;/font&gt;
&lt;font color="#228B22"&gt;import java.util.*;&lt;/font&gt;
&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="NumeroAleatorio"&gt;&lt;/a&gt;class NumeroAleatorio &lt;/font&gt;&lt;/strong&gt;{
    private double x1;
    private int x2;
    private Random aleatorio = new Random();
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public NumeroAleatorio()&lt;/font&gt;&lt;/strong&gt; {
 generar();
    }
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public double dameDouble()&lt;/font&gt;&lt;/strong&gt; {
 generar();
 &lt;font color="#4169E1"&gt;return&lt;/font&gt; x1;
    }
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public int dameEntero()&lt;/font&gt;&lt;/strong&gt; {
 generar();
 &lt;font color="#4169E1"&gt;return&lt;/font&gt; x2;
    }
&lt;strong&gt;&lt;font color="#4169E1"&gt;    private void generar()&lt;/font&gt;&lt;/strong&gt; {
 x1 = aleatorio.nextDouble();
 x2 = aleatorio.nextInt();
    }
}

&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="Ejercicio04"&gt;&lt;/a&gt;public class Ejercicio04 &lt;/font&gt;&lt;/strong&gt;{
    &lt;font color="#B22222"&gt;//Comienzo del flujo principal del programa.&lt;/font&gt;
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void main(String [] argumentos)&lt;/font&gt;&lt;/strong&gt; {
 NumeroAleatorio z = new NumeroAleatorio();
 int x = 10;
 &lt;font color="#4169E1"&gt;while&lt;/font&gt;(x &amp;gt; 0) {
     x--;
     salida(&lt;font color="#666666"&gt;"Entero aleatorio: "&lt;/font&gt; + z.dameEntero());
     salida(&lt;font color="#666666"&gt;"Double aleatorio: "&lt;/font&gt; + z.dameDouble());
 }
 System.exit(0);
    }

&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void salida ( String cadena )&lt;/font&gt;&lt;/strong&gt; {
 System.out.println(cadena);
    }

}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-5410114054366049772?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/5410114054366049772/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=5410114054366049772' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5410114054366049772'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5410114054366049772'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/11/nmeros-aleatorios-en-java.html' title='Números aleatorios en Java'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-1340955481264087549</id><published>2007-11-04T00:05:00.001-03:00</published><updated>2011-06-01T19:49:22.212-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='case'/><category scheme='http://www.blogger.com/atom/ns#' term='java case'/><category scheme='http://www.blogger.com/atom/ns#' term='switch'/><title type='text'>Ejemplo de switch en java</title><content type='html'>&lt;p&gt;El siguiente es un ejemplo del uso de la sentencia &lt;strong&gt;swtich&lt;/strong&gt; en Java&lt;/p&gt;

&lt;pre width="80"&gt;&lt;font color="#B22222"&gt;/*
 * Ejemplo de uso switch. 
 * 
 *
 */&lt;/font&gt;

&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="Ejercicio03"&gt;&lt;/a&gt;public class Ejercicio03 &lt;/font&gt;&lt;/strong&gt;{
    &lt;font color="#B22222"&gt;//Comienzo del flujo principal del programa.&lt;/font&gt;
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void main(String [] argumentos)&lt;/font&gt;&lt;/strong&gt; {
 int x = 1;
 int tope = 20;

 salida(&lt;font color="#666666"&gt;"valor x: "&lt;/font&gt; + x);
 salida(&lt;font color="#666666"&gt;"valor tope: "&lt;/font&gt; + tope);
 &lt;font color="#4169E1"&gt;while&lt;/font&gt;(x &amp;lt; tope) {
     evaluar(x++);
 }
 System.exit(0);
    }

&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void salida ( String cadena )&lt;/font&gt;&lt;/strong&gt; {
 System.out.println(cadena);
    }

&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void evaluar ( int numero )&lt;/font&gt;&lt;/strong&gt; {
 &lt;font color="#4169E1"&gt;switch&lt;/font&gt;(numero) {
 &lt;font color="#4169E1"&gt;case&lt;/font&gt; 1: 
     salida(&lt;font color="#666666"&gt;"Uno"&lt;/font&gt;);
     &lt;font color="#4169E1"&gt;break&lt;/font&gt;;
 &lt;font color="#4169E1"&gt;case&lt;/font&gt; 2: 
     salida(&lt;font color="#666666"&gt;"Dos"&lt;/font&gt;);
     &lt;font color="#4169E1"&gt;break&lt;/font&gt;;
 &lt;font color="#4169E1"&gt;case&lt;/font&gt; 3: 
     salida(&lt;font color="#666666"&gt;"Tres"&lt;/font&gt;);
     &lt;font color="#4169E1"&gt;break&lt;/font&gt;;
 &lt;font color="#4169E1"&gt;case&lt;/font&gt; 4: 
     salida(&lt;font color="#666666"&gt;"Cuatro"&lt;/font&gt;);
     &lt;font color="#4169E1"&gt;break&lt;/font&gt;;
 &lt;font color="#4169E1"&gt;case&lt;/font&gt; 5: 
 &lt;font color="#4169E1"&gt;case&lt;/font&gt; 6: 
     salida(&lt;font color="#666666"&gt;"Cinco o seis"&lt;/font&gt;);
     &lt;font color="#4169E1"&gt;break&lt;/font&gt;;
&lt;strong&gt;&lt;font color="#FF0000"&gt; default:&lt;/font&gt;&lt;/strong&gt; 
     salida(&lt;font color="#666666"&gt;"Otro n&amp;Atilde;ºmero"&lt;/font&gt;);
     &lt;font color="#4169E1"&gt;break&lt;/font&gt;;
 }

    }

}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-1340955481264087549?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/1340955481264087549/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=1340955481264087549' title='5 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/1340955481264087549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/1340955481264087549'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/11/ejemplo-de-switch-en-java.html' title='Ejemplo de switch en java'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-7035315563488035147</id><published>2007-11-04T00:02:00.000-03:00</published><updated>2007-11-04T00:04:57.101-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='while'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='ciclos'/><category scheme='http://www.blogger.com/atom/ns#' term='do while'/><category scheme='http://www.blogger.com/atom/ns#' term='for'/><category scheme='http://www.blogger.com/atom/ns#' term='do'/><title type='text'>Ciclos: for, while, do while en java</title><content type='html'>&lt;pre width="80"&gt;&lt;font color="#B22222"&gt;/*
 * Ejemplo de uso de diferentes iteradores. 
 * while, for, do while, etc
 *
 */&lt;/font&gt;

&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="Ejercicio02"&gt;&lt;/a&gt;public class Ejercicio02 &lt;/font&gt;&lt;/strong&gt;{
    &lt;font color="#B22222"&gt;//Comienzo del flujo principal del programa.&lt;/font&gt;
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void main(String [] argumentos)&lt;/font&gt;&lt;/strong&gt; {
 int x = 0;
 int y = 10;
 salida(&lt;font color="#666666"&gt;"Primer iterador"&lt;/font&gt;);
 &lt;font color="#4169E1"&gt;while&lt;/font&gt;(x &amp;lt; y) {
     salida(&lt;font color="#666666"&gt;"x es "&lt;/font&gt;+  x++);
 }
 salida(&lt;font color="#666666"&gt;"Segundo iterador"&lt;/font&gt;);
 &lt;font color="#4169E1"&gt;for&lt;/font&gt;(int i = 0; i &amp;lt; 10 ; ++i) {
     salida(&lt;font color="#666666"&gt;"i es "&lt;/font&gt;+ i);
 }
 salida(&lt;font color="#666666"&gt;"Tercer iterador"&lt;/font&gt;);
 &lt;font color="#4169E1"&gt;do&lt;/font&gt; {
     salida(&lt;font color="#666666"&gt;"x es "&lt;/font&gt; + x--);
 } &lt;font color="#4169E1"&gt;while&lt;/font&gt; ( x &amp;gt; 0 );

 System.exit(0);
    }

&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void salida ( String cadena )&lt;/font&gt;&lt;/strong&gt; {
 System.out.println(cadena);
    }

}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-7035315563488035147?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/7035315563488035147/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=7035315563488035147' title='13 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/7035315563488035147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/7035315563488035147'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/11/ciclos-for-while-do-while-en-java.html' title='Ciclos: for, while, do while en java'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-5882347242617538382</id><published>2007-11-04T00:01:00.000-03:00</published><updated>2007-11-04T00:02:00.908-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='if else'/><title type='text'>If else en java</title><content type='html'>&lt;pre width="80"&gt;&lt;strong&gt;&lt;font color="#4169E1"&gt;&lt;a name="Ejercicio1"&gt;&lt;/a&gt;public class Ejercicio1 &lt;/font&gt;&lt;/strong&gt;{
    &lt;font color="#B22222"&gt;//Comienzo del flujo principal del programa.&lt;/font&gt;
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void main(String [] argumentos)&lt;/font&gt;&lt;/strong&gt; {
 &lt;font color="#B22222"&gt;// Uso de if.&lt;/font&gt;
 int x = 5;
 int y = 7;
 comparar(x,y);
 comparar(7,5);
 comparar(5,5);
 System.exit(0);
    }
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void salida ( String cadena )&lt;/font&gt;&lt;/strong&gt; {
 System.out.println(cadena);
    }
&lt;strong&gt;&lt;font color="#4169E1"&gt;    public static void comparar(int entero1, int entero2)&lt;/font&gt;&lt;/strong&gt; {
 &lt;font color="#4169E1"&gt;if&lt;/font&gt; (entero1 &amp;gt; entero2)
     salida(&lt;font color="#666666"&gt;"El primer argumento es menor"&lt;/font&gt;);
 &lt;font color="#4169E1"&gt;else&lt;/font&gt;
     &lt;font color="#4169E1"&gt;if&lt;/font&gt;(entero1 &amp;lt; entero2)
  salida (&lt;font color="#666666"&gt;"El primer argumento es mayor."&lt;/font&gt;); 
 &lt;font color="#4169E1"&gt;else&lt;/font&gt;
     salida(&lt;font color="#666666"&gt;"Los dos argumentos son iguales"&lt;/font&gt;);
    }
}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-5882347242617538382?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/5882347242617538382/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=5882347242617538382' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5882347242617538382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5882347242617538382'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/11/if-else-en-java.html' title='If else en java'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-1327795726959738197</id><published>2007-09-02T23:09:00.001-03:00</published><updated>2011-06-01T20:15:33.736-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='consultas sql'/><category scheme='http://www.blogger.com/atom/ns#' term='EJEMPLOS'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>Introducción a SQL y mysql</title><content type='html'>&lt;p&gt;SQL significa Lenguaje de Consulta Estructurado, y se utiliza
      para manipular y extraer la información de las bases de datos relacionales.&lt;/p&gt;
    &lt;p&gt;El SQL actual debe su origen a un lenguaje desarrollado por IBM
    en los años 70, denominado Sequel. Actualmente SQL es el lenguaje
      estándar de las bases de datos relacionales.&lt;/p&gt;
    &lt;h2&gt;Tipos de datos:&lt;/h2&gt;
    &lt;ul&gt;
      &lt;li&gt;char(n): Cadena de caracteres de longitud
      fija. Dónde &lt;code&gt;n&lt;/code&gt; específica la cantidad de
 caracteres. Es una abreviación de character.&lt;/li&gt;
      &lt;li&gt;varchar(n): Una cadena de caracteres de longitud variable,
      pero con un máximo de caracteres específicado
 por &lt;code&gt;n&lt;/code&gt;. Es abreviación de character varying.&lt;/li&gt;
      &lt;li&gt;int: Un subconjunto de los enteros (el rango depende
 generalmente de las características del equipo). Abreviación
 de integer.&lt;/li&gt;
      &lt;li&gt;smallint: Subconjunto de los enteros más pequeño (o igual)
      que el subconjunto de int. Nuevamente depende de las
 características del equipo.&lt;/li&gt;
      &lt;li&gt;numeric(p,d): Número real de &lt;code&gt;p&lt;/code&gt; dígitos más el
 signo de los cuales &lt;code&gt;d&lt;/code&gt; son la parte decimal.&lt;/li&gt;
      &lt;li&gt;real, double precision: Número reales con precisión no
 especificada por el usuario, dependiente de la máquina y de la
 implementación.&lt;/li&gt;
      &lt;li&gt;float(n): Real con precisión de al menos &lt;code&gt;n&lt;/code&gt;
      dígitos.&lt;/li&gt;
    &lt;/ul&gt;
    &lt;h2&gt;Ejemplos de su manejo:&lt;/h2&gt;
    &lt;p&gt;La instrucción &lt;code&gt;CREATE TABLE&lt;/code&gt; permite crear una
      tabla, a continuación la creación de dos tablas relacionadas por
      el campo &lt;code&gt;ciudad_id&lt;/code&gt; de cliente y el
      campo &lt;code&gt;id&lt;/code&gt; de la tabla ciudad:&lt;/p&gt;
    &lt;pre&gt;
      CREATE TABLE cliente (
        id integer,
        nombre CHAR(100),
        apellido CHAR(100),
        ciudad_id INTEGER, primary key(id) );

      CREATE TABLE ciudad (
        id integer,
        nombre CHAR(100),
        pais_id integer, primary key(id));
    &lt;/pre&gt;
    &lt;p&gt;En ambas elegimos como clave primaria al campo id, un entero
      único que identificara a cada uno de nuestros registros.&lt;/p&gt;
    &lt;p&gt;Podemos verificar que tablas existen en la base de datos actual
      con el comando &lt;code&gt;SHOW TABLES&lt;/code&gt;, por ejemplo:&lt;/p&gt;
    &lt;pre&gt;
mysql&gt; show tables;
+-------------------+
| Tables_in_testing |
+-------------------+
| ciudad            |
| cliente           |
+-------------------+
2 rows in set (0.00 sec)
    &lt;/pre&gt;
    &lt;p&gt;En mysql tenemos la posibilidad de describir el esquema de una
    tabla con el comando &lt;code&gt;DESCRIBE&lt;/code&gt;:
&lt;pre&gt;
mysql&gt; describe ciudad;
+---------+-----------+------+-----+---------+-------+
| Field   | Type      | Null | Key | Default | Extra |
+---------+-----------+------+-----+---------+-------+
| id      | int(11)   | NO   | PRI | 0       |       |
| nombre  | char(100) | YES  |     | NULL    |       |
| pais_id | int(11)   | YES  |     | NULL    |       |
+---------+-----------+------+-----+---------+-------+
3 rows in set (0.01 sec)
&lt;/pre&gt;
    &lt;p&gt;Ahora que tenemos las tablas deberíamos insertar valores en
      ellas, para esto utilizamos &lt;code&gt;INSERT&lt;/code&gt; de la siguiente manera:&lt;/p&gt;
    &lt;pre&gt;
      -- En la tabla ciudad
      INSERT INTO ciudad VALUES (1,'Parana',1); 
      INSERT INTO ciudad VALUES (2,'Buenos Aires',1); 
      INSERT INTO ciudad VALUES (3,'Cordoba',1); 
      INSERT INTO ciudad VALUES (4,'Rosario',1); 
      -- En la tabla clientes
      INSERT INTO cliente VALUES (1,'Emilio','Cardozo',2);
      INSERT INTO cliente VALUES (2,'Juan','Decker',3);
      INSERT INTO cliente VALUES (3,'Facundo','Manzano',4);
      INSERT INTO cliente VALUES (4,'Romina','Casla',1);
    &lt;/pre&gt;
    &lt;p&gt;Para realizar consultas sobre la información que contiene la
    base de datos, utilizamos &lt;code&gt;SELECT&lt;/code&gt; seguido de los
    nombres de campos. Si utilizamos &lt;code&gt;*&lt;/code&gt; traeremos todos
      los campos:&lt;/p&gt;
&lt;pre&gt;
mysql&gt; select * from cliente;
+----+---------+----------+-----------+
| id | nombre  | apellido | ciudad_id |
+----+---------+----------+-----------+
|  1 | Emilio  | Cardozo  |         2 |
|  2 | Juan    | Decker   |         3 |
|  3 | Facundo | Manzano  |         4 |
|  4 | Romina  | Casla    |         1 |
+----+---------+----------+-----------+
4 rows in set (0.00 sec)
&lt;/pre&gt;
    &lt;p&gt;Especificando los campos podríamos utilizar:&lt;/p&gt;
    &lt;pre&gt;
      mysql&gt; select nombre, apellido from cliente;
+---------+----------+
| nombre  | apellido |
+---------+----------+
| Emilio  | Cardozo  |
| Juan    | Decker   |
| Facundo | Manzano  |
| Romina  | Casla    |
+---------+----------+
4 rows in set (0.00 sec)
    &lt;/pre&gt;
    &lt;p&gt;Opcionalmente podemos agregar condiciones para que no traiga
      todos los campos detras de la clausula &lt;code&gt;where&lt;/code&gt;:&lt;/p&gt;
    &lt;pre&gt;
 mysql&gt; SELECT nombre from cliente where ciudad_id = 2;
+--------+
| nombre |
+--------+
| Emilio |
+--------+
1 row in set (0.00 sec)
    &lt;/pre&gt;
    &lt;p&gt;La información también puede ser extraída desde diferentes
    tablas. Por ejemplo podemos traer el nombre de cada uno de los
    clientes y al lado el nombre de la ciudad a la que pertenecen (a
      partir del campo &lt;code&gt;ciudad_id&lt;/code&gt;;&lt;/p&gt;
    &lt;pre&gt;
mysql&gt; SELECT cliente.nombre, ciudad.nombre FROM cliente, ciudad 
       WHERE cliente.ciudad_id = ciudad.id;
+---------+--------------+
| nombre  | nombre       |
+---------+--------------+
| Romina  | Parana       |
| Emilio  | Buenos Aires |
| Juan    | Cordoba      |
| Facundo | Rosario      |
+---------+--------------+
4 rows in set (0.01 sec)
    &lt;/pre&gt;
    &lt;p&gt;Tambien podemos especificar el orden de los campos agregando al
    final de la instruccion las palabras &lt;code&gt;order by CAMPO [ASC || DESC]&lt;/code&gt;,
    dónde campo puede ser el nombre del campo o un entero que
    represente el número de campo por el cual queremos ordernar:&lt;/p&gt;
    &lt;pre&gt;
      SELECT cliente.nombre, ciudad.nombre FROM cliente, ciudad 
       WHERE cliente.ciudad_id = ciudad.id ORDER BY ciudad.nombre;
+---------+--------------+
| nombre  | nombre       |
+---------+--------------+
| Emilio  | Buenos Aires |
| Juan    | Cordoba      |
| Romina  | Parana       |
| Facundo | Rosario      |
+---------+--------------+
4 rows in set (0.00 sec)
    &lt;/pre&gt;
    &lt;p&gt;Supongamos que uno de nuestros clientes tiene un ciudad_id en
    0, valor que no se encuentra en la tabla ciudad. Para representar
      esta situación insertamos la tupla:&lt;/p&gt;
    &lt;pre&gt;
INSERT INTO cliente VALUES (5,'Roberto','Martino',0);
    &lt;/pre&gt;
    
    &lt;p&gt;Al hacer esto el select anterior que conectaba los clientes con
    cada una de sus ciudades sigue devolviendo lo mismo que antes (es
      decir sin el cliente Roberto recien insertado:&lt;/p&gt;
&lt;pre&gt;
mysql&gt; SELECT cliente.nombre, ciudad.nombre FROM cliente, ciudad
    -&gt;WHERE cliente.ciudad_id = ciudad.id ORDER BY ciudad.nombre;
+---------+--------------+
| nombre  | nombre       |
+---------+--------------+
| Emilio  | Buenos Aires |
| Juan    | Cordoba      |
| Romina  | Parana       |
| Facundo | Rosario      |
+---------+--------------+
4 rows in set (0.00 sec)
&lt;/pre&gt;
    &lt;p&gt;Esto se debe a que no Roberto no satisface la clausula del
    where porque no hace match con ninguna ciudad, para salvar esta
      situación debemos hacer un &lt;code&gt;LEFT JOIN&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;
mysql-&gt;  SELECT cliente.nombre, ciudad.nombre FROM cliente LEFT JOIN ciudad 
         ON cliente.ciudad_id = ciudad.id ORDER BY ciudad.nombre;
+---------+--------------+
| nombre  | nombre       |
+---------+--------------+
| Roberto | NULL         |
| Emilio  | Buenos Aires |
| Juan    | Cordoba      |
| Romina  | Parana       |
| Facundo | Rosario      |
+---------+--------------+
5 rows in set (0.00 sec)
&lt;/pre&gt;
    &lt;p&gt;De esta manera obtenemos todos los clientes y en el cliente sin
      ciudad obtenemos simplemente un &lt;code&gt;NULL&lt;/code&gt;.&lt;/p&gt;

    &lt;p&gt;Muchas veces es comodo y eficiente trasladar una consulta a
    una vista para poder ejecutarla más fácil y rápidamente, pra esto hacemos:&lt;/p&gt;    
&lt;pre&gt;
mysql&gt; CREATE VIEW ClienteCiudad AS 
          SELECT cliente.nombre AS CLIENTE, ciudad.nombre AS CIUDAD 
          FROM cliente LEFT JOIN ciudad
          ON cliente.ciudad_id = ciudad.id ORDER BY ciudad.nombre;
Query OK, 0 rows affected (0.00 sec)
&lt;/pre&gt;
&lt;p&gt;Luego podemos realizar la misma consulta ejectuando
  un &lt;code&gt;SELECT *&lt;/code&gt; sobre la vista:&lt;/p&gt;
&lt;pre&gt;
mysql&gt; SELECT * from  ClienteCiudad;
+---------+--------------+
| CLIENTE | CIUDAD       |
+---------+--------------+
| Roberto | NULL         |
| Emilio  | Buenos Aires |
| Juan    | Cordoba      |
| Romina  | Parana       |
| Facundo | Rosario      |
+---------+--------------+
5 rows in set (0.00 sec)
&lt;/pre&gt;

    &lt;p&gt;Para realizar actualizaciones nos valemos
    de &lt;code&gt;UPDATE&lt;/code&gt;, el cual acepta la
    claúsula &lt;code&gt;where&lt;/code&gt;, para especificar los registros que
    serán afectados durante la actualización. Por ejemplo
      actualizaremos la ciudad del cliente Roberto en la tabla cliente:&lt;/p&gt;
&lt;pre&gt;
UPDATE cliente SET ciudad_id=3 WHERE id = 5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
&lt;/pre&gt;
    &lt;p&gt;Ahora al ejecutar la consulta a la vista anterior no veremos más el NULL,
      sino la ciudad correspondiente al la clave &lt;code&gt;4&lt;/code&gt;:&lt;/p&gt;
    &lt;pre&gt;
      mysql&gt; SELECT * from  ClienteCiudad;
+---------+--------------+
| CLIENTE | CIUDAD       |
+---------+--------------+
| Emilio  | Buenos Aires |
| Juan    | Cordoba      |
| Roberto | Cordoba      |
| Romina  | Parana       |
| Facundo | Rosario      |
+---------+--------------+
5 rows in set (0.00 sec)
    &lt;/pre&gt;
    &lt;p&gt;Para el borrado de registros utilizamos &lt;code&gt;DELETE&lt;/code&gt; con
    la misma sintaxis que un &lt;code&gt;SELECT&lt;/code&gt; salvo que omitiremos
    la seleccion de campos, por ejemplo borraremos el registro de
      Roberto de la tabla cliente:&lt;/p&gt;
&lt;pre&gt;
mysql&gt; select * from cliente where nombre = 'Roberto';
+----+---------+----------+-----------+
| id | nombre  | apellido | ciudad_id |
+----+---------+----------+-----------+
|  5 | Roberto | Martino  |         3 |
+----+---------+----------+-----------+
1 row in set (0.00 sec)

mysql&gt; DELETE from cliente where nombre = 'Roberto';
Query OK, 1 row affected (0.00 sec)

mysql&gt; select * from cliente where nombre = 'Roberto';
Empty set (0.00 sec)
&lt;/pre&gt;
    &lt;p&gt;En las consultas con &lt;code&gt;SELECT&lt;/code&gt; podemos preguntar
    directamente por la cantidad de registros que traería una consulta
      aplicando &lt;code&gt;COUNT()&lt;/code&gt; a la selección de campos:&lt;/p&gt;
    &lt;pre&gt;
mysql&gt; SELECT COUNT(*) FROM cliente;
+----------+
| COUNT(*) |
+----------+
|        4 |
+----------+
1 row in set (0.00 sec)
    &lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-1327795726959738197?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/1327795726959738197/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=1327795726959738197' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/1327795726959738197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/1327795726959738197'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/09/sql.html' title='Introducción a SQL y mysql'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-678296846027981569</id><published>2007-07-25T22:41:00.001-03:00</published><updated>2007-07-25T22:43:12.504-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pilas'/><category scheme='http://www.blogger.com/atom/ns#' term='dinámica'/><category scheme='http://www.blogger.com/atom/ns#' term='colas'/><category scheme='http://www.blogger.com/atom/ns#' term='listas'/><category scheme='http://www.blogger.com/atom/ns#' term='pascal'/><category scheme='http://www.blogger.com/atom/ns#' term='estructuras de datos'/><category scheme='http://www.blogger.com/atom/ns#' term='memoria dinamica'/><title type='text'>Memoria Dinámica en Pascal</title><content type='html'>&lt;p&gt;La siguiente introducción a estructura dinámicas básicas está
  básada en los procedimientos estándar de la cátedra de mi facultad: Algoritmos y
    Estructuras de Datos de la Universidad Tecnológica Nacional de
  Buenos Aires, escritos por Sergio Fernando Abad.&lt;/p&gt;

  &lt;h2&gt;Memoria Dinámica en Pascal&lt;/h2&gt;
  &lt;p&gt;En teoría los programas PASCAL permiten utilizar 64KB de memoria
    estática.&lt;/p&gt;
  &lt;p&gt;Esto generalmente no es suficiente para aplicaciones reales, por
  eso pascal nos permite acceder a un sector de memoria que puede
  administrar el programador, tomando y liberando memoria
  arbitrariamente mientras las capacidades de la computadora en dónde
    ejecuta el programa lo permitan.&lt;/p&gt;
  
  &lt;p&gt;En memoria dinámica hay tres estructuras de datos principales que
    implementaremos en los ejemplos, a saber:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Listas&lt;/li&gt;
    &lt;li&gt;Pilas&lt;/li&gt;
    &lt;li&gt;Colas&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h2&gt;Punteros&lt;/h2&gt;
  &lt;p&gt;Hay un tipo de variable que nos permitirá construir las
  estructuras dinámicas. A esta variable se la conoce como Puntero, y
  es una variable de tipo estática pero con la particularidad de que
  su dominio de valores son las direcciones de memoria disponibles
    para el programador.&lt;/p&gt;
  &lt;p&gt;Esto significa que la variable tendrá como contenido una
  dirección de memoria (que puede ser la dirección dónde se encuentra,
    alguna otra variable, incluso la dirección dónde se
  encuentra otro puntero).&lt;/p&gt;
  &lt;p&gt;En PASCAL, declaramos los punteros con el
  símbolo &lt;code class="prettyprint"&gt;^&lt;/code&gt; y una dirección de
    memoria a la cual lo hacemos apuntar. El tamaño que ocupa un
  puntero está dado por el tamaño necesario para almacenar una
  dirección de memoria, en muchas PCs hogareñas este valor suele ser
  4 bytes.&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
    VAR PUNTERO:^INTEGER;
  &lt;/pre&gt;
  &lt;p&gt;En el código anterior hemos declarado un puntero
  llamado &lt;code class="prettyprint"&gt;PUNTERO&lt;/code&gt; que está apuntando
  a un tipo de dato entero, es decir que en él podemos almacenar
    valores de direcciones de memoria dónde se encuentren enteros.&lt;/p&gt;
  &lt;p&gt;Si bien el puntero está listo para guardar una dirección aún no
  lo hemos inicializado con ninguna dirección, el siguiente paso es
  reservar la memoria de un entero en el área de HEAP (dónde se aloca
  la memoria solicitada dinámicamente) y guardar la dirección de ese
    lugar en el puntero.&lt;/p&gt;
  &lt;p&gt;Para realizar esto utilizamos la
  instrucción &lt;code class="prettyprint"&gt;NEW()&lt;/code&gt;, en caso de que
  la máquina no obtenga memoria para alocar el pedido, al puntero se le
    asignara la dirección &lt;code class="prettyprint"&gt;NIL&lt;/code&gt;, cuyo
  significado es la "nada", es decir el puntero no apunta a ningún
    sector de la memoria.&lt;/p&gt;
  &lt;p&gt;Al terminar de utilizar la memoria a la cual accedíamos con el
  puntero, lo recomendable es siempre liberarla, para que quede
    disponible para otras aplicaciones que soliciten memoria.&lt;/p&gt;
  &lt;p&gt;Ahora bien, tiene sentido que uno quiera acceder al valor de lo
    que uno hasta el momento sólo conoce la dirección que almacena el
    puntero. Pascal nos permite referirnos al valor que se encuentra
    en la dirección de memoria de un puntero simplemente utilizando
    el nombre del puntero seguido inmediatamente por el
    símbolo &lt;code class="prettyprint"&gt;^&lt;/code&gt;.&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
    PUNTERO^ := 25;
    WRITELN( PUNTERO^ );
  &lt;/pre&gt;
  &lt;p&gt;En las dos instrucciones anteriores hemos asignado al entero al
    cual apunta &lt;code class="prettyprint"&gt;PUNTERO&lt;/code&gt; con 25, y
    luego hemos mostrado tal valor por pantalla.&lt;/p&gt;
  &lt;p&gt;Otro ejemplo, que muestra la diferencia entre el valor de un
  puntero y el valor que se haya en la dirección de memoria que guarda
    el puntero&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
    PROGRAM PUNTEROS_01;
    VAR
      PUNTERO:^INTEGER;
      AUXILIAR:^INTEGER;
    BEGIN
      NEW(PUNTERO);
      PUNTERO^:= 154;
      AUXILIAR:= PUNTERO;
      WRITELN( PUNTERO^ );
      WRITELN( AUXILIAR^ );
      DISPOSE(PUNTERO);
    END.
  &lt;/pre&gt;
  &lt;p&gt;En el ejemplo anterior se ve el uso de las dos funcionalidades
  del puntero, cuando asignamos la dirección de memoria que contiene
    &lt;code class="prettyprint"&gt;PUNTERO&lt;/code&gt; como valor, no utilizamos
    el símbolo &lt;code class="prettyprint"&gt;^&lt;/code&gt;, debido a que
    justamente estamos guardando la dirección en otro puntero llamado
    &lt;code class="prettyprint"&gt;AUXILIAR&lt;/code&gt;. En cambio cuando
    queremos imprimir los valores de los enteros a los cuales apuntan
    (en este caso ambos apuntan a lo mismo) debemos utilizar el
    el símbolo &lt;code class="prettyprint"&gt;^&lt;/code&gt;.&lt;/p&gt;
  &lt;h3&gt;NODOS&lt;/h3&gt;
  &lt;p&gt;Un nodo es una pequeña estructura especialmente creada por el
    programador, para poder crear otras estructuras tales cómo Listas o
    Colas en memoria dinámica.&lt;/p&gt; 
  &lt;p&gt;Los nodos guardan en una parte de la estructura la información
  que justamente requiere guardar nuestra aplicación o programa, en la
    otra parte tenemos un puntero que guarda la dirección de otro
  nodo.&lt;/p&gt;
  &lt;p&gt;Debido a que un nodo posee un puntero que permite almacenar una
  dirección de otro nodo, podemos valernos de él para enlazar
    múltiples nodos entre sí y hacer nuestras estructuras más
  complejas y alocarlas en memoria dinámica.&lt;/p&gt;
  &lt;p&gt;Ejemplo de definición:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
    TYPE
      TipoLista =^ TipoNodo;
      TipoNodo = Record
        Info:TipoInfo;
        Siguiente:TipoLista
      END;
  &lt;/pre&gt;
  &lt;p&gt;En la definición anterior en la primer instrucción declaramos un
    tipo de puntero llamado &lt;code class="prettyprint"&gt;TipoLista&lt;/code&gt;
    que apunta a un registro &lt;code class="prettyprint"&gt;TipoNodo&lt;/code&gt;, el cual aún no
    está definido hasta la siguiente línea, de hecho al momento de
    definir el tipo &lt;code class="prettyprint"&gt;TipoNodo&lt;/code&gt;
    indicamos que la
    variable &lt;code class="prettyprint"&gt;Siguiente&lt;/code&gt; es un puntero
    a un tipo de dato &lt;code class="prettyprint"&gt;TipoLista&lt;/code&gt;. Esta
    forma de definición recursiva es totalmente legal y nos permite
    construir los nodos.&lt;/p&gt;
  &lt;h3&gt;Listas&lt;/h3&gt;
  &lt;p&gt;Llamamos Lista a una variable de tipo puntero que apunta a un
  nodo.&lt;/p&gt;
  &lt;p&gt;Ese nodo puede apuntar a otro nodo y este último a un próximo,
  por lo tanto podemos hablar de ciertas operaciones posibles en una
  Lista, como por ejemplo: insertar nodo al final, insertar al principio,
  insertar en el medio, buscar nodo, sacar del final, sacar del
    principio, etc.&lt;/p&gt;
  &lt;h4&gt;Crear Lista&lt;/h4&gt;
  &lt;p&gt;Ejemplo de procedimiento que crea una Lista:&lt;/p&gt;
  &lt;code class="prettyprint"&gt;
    PROCEDURE CrearLista (VAR Lista:TipoLista);
    BEGIN
      Lista := NIL
    END;
  &lt;/code&gt;
  &lt;p&gt;El código anterior recibe un puntero y lo inicializa en NIL.&lt;/p&gt;
  &lt;h4&gt;Insertar primer Nodo&lt;/h4&gt;
  &lt;p&gt;Ejemplo de procedimiento que inserta el primer nodo de una Lista:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
    PROCEDURE InsertaPrimero (VAR Lista:TipoLista; Valor:TipoInfo);
    VAR
      Ptr:TipoLista;
    BEGIN
     New(Ptr);
     Ptr^.Info := Valor;
     Ptr^.Siguiente := NIL;
     Lista := Ptr;
    END;
  &lt;/pre&gt;
  &lt;p&gt;El código anterior recibe la Lista en la cual vamos a insertar un
  primer nodo, y el valor de la información que contendrá este
  nodo. Dentro del procedimiento tenemos una variable local a él, que
    la reservamos con la
  instrucción &lt;code class="prettyprint"&gt;New(Ptr)&lt;/code&gt;, luego le
  asignamos el valor recibido como parámetro e indicamos que este
  primer nodo apunta a NIL, por último debemos apuntar la lista a
  este nodo recien creado.&lt;/p&gt;
  &lt;h4&gt;Insertar adelante&lt;/h4&gt;
  &lt;p&gt;Ejemplo de procedimiento inserta un nodo para que sea el primero
  de la lista:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
    PROCEDURE InsertaAdelante (VAR Lista:TipoLista; Valor:TipoInfo);
    VAR
      Ptr:TipoLista;
    BEGIN
      New(Ptr);
      Ptr^.Info := Valor;
      Ptr^.Siguiente := Lista;
      Lista := Ptr;
    END;
  &lt;/pre&gt;
  &lt;p&gt;Nuestro objetivo es insertar un nodo que sea el primero de la
  lista, para esto recibimos como parámetro la Lista en la cual
  queremos insertar el nodo y el valor que guardará como información
  el nodo. Creamos el nodo, guardamos la información recibida, y
  le decimos al nuevo nodo que apunte a dónde está apuntando
  actualmente la Lista, resguardada esta dirección podemos decirle a
  Lista que apunte al nuevo nodo, de esta manera el nodo queda
  insertado al principio de todo.&lt;/p&gt;
  &lt;h4&gt;Insertar con Orden&lt;/h4&gt;
  &lt;p&gt;Ejemplo de procedimiento que dada una Lista y un valor inserta un
  nodo dónde corresponda según el valor que se pase por paramétro:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
    PROCEDURE InsertaEnOrden (VAR Lista:TipoLista ; Valor:TipoInfo);
    VAR
      Ptr, PtrAux : TipoLista;
    BEGIN
      New(Ptr);
      Ptr^.Info := Valor;
      Ptr^.Siguiente := NIL;
      PtrAux := Lista;
      WHILE ( PtrAux^.Siguiente &amp;lt;&amp;gt; NIL )  AND ( Valor &gt; PtrAux^.Siguiente^.Info ) do
        PtrAux := PtrAux^.Siguiente;
      Ptr^.Siguiente := PtrAux^.Siguiente;
      PtrAux^.Siguiente := Ptr;
    END;
  &lt;/pre&gt;
  &lt;p&gt;Este código es algo más complejo. Para empezar como siempre que
  se trate de una inserción debemos recibir el valor y la lista en
  dónde insertar. Luego creamos dos variables
    locales, &lt;code class="prettyprint"&gt;Ptr&lt;/code&gt;
  y &lt;code class="prettyprint"&gt;PtrAux&lt;/code&gt;, la primera es el nuevo
  nodo a insertar y la segunda será un auxiliar para recorrer la lista
  y encontrar la posición adecuada al nodo. Debido a que esta última
  variable sólo nos vale para encontrar la posición no hace falta que
  le reservemos memoria ya que le asignaremos direcciones de memoria
    ya reservada, en cambio para &lt;code class="prettyprint"&gt;Ptr&lt;/code&gt;
  sí que debemos hacerlo porque justamente representa nuestro nuevo
  nodo. Por lo tanto guardamos el valor pasado por parámetro en este,
    y luego lo hacemos apuntar
  a &lt;code class="prettyprint"&gt;NIL&lt;/code&gt;.&lt;/p&gt;
  &lt;p&gt;Para la búsqueda del lugar adecuado, asignamos a nuestro auxiliar
  al principio de la lista, y luego lo hacemos avanzar evaluando
    siempre que no estamos parados en el último nodo y que
  el &lt;code class="prettyprint"&gt;Valor&lt;/code&gt; que queremos insertar es
    mayor que el &lt;code class="prettyprint"&gt;Info&lt;/code&gt; del nodo
    siguiente al cual estamos apuntando. La manera de avanzar es bien
    sencilla y es obligar a &lt;code class="prettyprint"&gt;PtrAux&lt;/code&gt; que apunte al nodo siguiente.&lt;/p&gt;
  &lt;p&gt;Al momento del salir del &lt;code class="prettyprint"&gt;While&lt;/code&gt;
    indefectiblemente &lt;code class="prettyprint"&gt;PrtAux&lt;/code&gt; estará apuntando
    al último nodo o bien a un nodo cuyo valor es el &lt;b&gt;mayor de todos
      los valores menores al
      nuevo &lt;code class="prettyprint"&gt;Valor&lt;/code&gt;&lt;/b&gt;. Es decir que
    estamos insertando al nuevo nodo ordenadamente de manera
    ascendente según el valor que trae y los valores de los nodos ya
    existentes en la lista.&lt;/p&gt;

  &lt;h4&gt;Insertar Nodo&lt;/h4&gt;
  &lt;p&gt;Recapitulando tenemos una serie de procedimientos que nos
  permiten insertar de diferente manera nodos en una Lista, ahora nos
  valeremos de todos ellos para crear un procedimiento Insertar Nodo
  genérico que según el valor dado inserte el nodo en la posición más conveniente:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
    PROCEDURE InsertaNodo (VAR Lista:TipoLista; Valor:TipoInfo);
    BEGIN
     IF Lista = NIL THEN
       InsertarPrimero(Lista,Valor);
     ELSE
       IF Valor &amp;lt; Lista^.Info THEN
         InsertarAdelante(Lista,Valor);
       ELSE
         InsertaEnOrden(Lista,Valor);
    END;
  &lt;/pre&gt;
  &lt;p&gt;El procedimiento &lt;code class="prettyprint"&gt;InsertaNodo&lt;/code&gt; no
  utiliza variables locales, simplemente evalua a que procedimiento
  llamar para insertar el nuevo valor en
    la &lt;code class="prettyprint"&gt;Lista&lt;/code&gt; pasada por parametro. Si
  la lista está vacía utiliza el procedimiento de insertar el primer
  nodo, si la lista ya contiene nodos entonces evalua sí el nodo debe
  ser ir adelante de todo o debemos meterlo por el medio. ¿Se te
    ocurre alguna manera de
  generalizar &lt;code class="prettyprint"&gt;InsertaEnOrden&lt;/code&gt; para que
  pueda tratar con todas las situaciones? Me gustaría ver tu
  solución en los comentarios.&lt;/p&gt;

  &lt;h4&gt;Suprimir Nodo&lt;/h4&gt;
  &lt;p&gt;Mostramos ahora un procedimiento que suprime nodos de una
  Lista:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
    PROCEDURE SuprimeNodo (VAR Lista:TipoLista ;  Valor:TipoInfo );
    VAR
      PtrAct , PtrAnt : TipoLista;
    BEGIN
      PtrAct := Lista;
      PtrAnt := NIL;
      WHILE ( PtrAct &amp;lt;&amp;gt; NIL ) AND ( Valor &amp;gt; PtrAct^.Info ) DO
      BEGIN
        PtrAnt := PtrAct;
        PtrAct := PtrAct^.Siguiente;
      END;
      IF ( PtrAct &amp;lt;&amp;gt; NIL ) AND ( Valor = PtrAct^.Info ) THEN
      BEGIN
 If PtrAnt &amp;lt;&amp;gt; NIL THEN
   PtrAnt^.Siguiente := PtrAct^.Siguiente
 ELSE
   Lista := PtrAct^.Siguiente;
 DISPOSE (PtrAct);
      END
    END;
  &lt;/pre&gt;
  &lt;p&gt;Al procedimiento &lt;code class="prettyprint"&gt;SuprimeNodo&lt;/code&gt; le
    pasamos la &lt;code class="prettyprint"&gt;Lista&lt;/code&gt; de la cual
    queremos quitar un nodo y
    el &lt;code class="prettyprint"&gt;Valor&lt;/code&gt; del nodo que queremos
    suprimir.&lt;/p&gt;
  &lt;p&gt;Como variables locales al procedimiento tenemos dos punteros
  auxiliares para realizar la operación de borrado. La idea es
  recorrer la lista con ellos, uno apuntando una posición más que el
    otro, cuando &lt;code class="prettyprint"&gt;PtrAct&lt;/code&gt; se apunte a
    un nodo cuyo valor es menor que el del
  parámetro &lt;code class="prettyprint"&gt;Valor&lt;/code&gt; detenemos la
  recorrida, si esto nunca sucede detendremos la recorrida al momento
    que &lt;code class="prettyprint"&gt;PtrAct&lt;/code&gt; alcance el fin de la
  lista.&lt;/p&gt;
  &lt;p&gt;Al finalizar el &lt;code class="prettyprint"&gt;WHILE&lt;/code&gt; debemos
    preguntarnos si el nodo al cual
    apunta &lt;code class="prettyprint"&gt;PtrAct&lt;/code&gt; es realmente el
    nodo con el valor buscado, si realmente es así todavía tenemos que
    evaluar si &lt;code class="prettyprint"&gt;PtrAnt&lt;/code&gt; se encuentra
    apuntando a &lt;code class="prettyprint"&gt;NIL&lt;/code&gt; (el nodo a
    eliminar es el primero), o está apuntando a un valor distinto de
    &lt;code class="prettyprint"&gt;NIL&lt;/code&gt; lo cual nos dice que éste
    nodo es el que debemos colgar de la dirección a la cual dejará
    de apuntar el nodo próximo a elminar
    (&lt;code class="prettyprint"&gt;PtrAct&lt;/code&gt;).&lt;/p&gt;
  &lt;p&gt;Por último, si bien hemos quitado el nodo de
  la &lt;code class="prettyprint"&gt;Lista&lt;/code&gt;, aún no hemos liberado la
  memoria que este ocupa, para esto utilizamos la instrucción antes
    mencionada, &lt;code class="prettyprint"&gt;Dispose&lt;/code&gt;.&lt;/p&gt;

  &lt;h3&gt;Pilas&lt;/h3&gt;
  &lt;p&gt;La Pila es una Lista a la que sólo se le permite insetar y quitar
    nodos por el principio.&lt;/p&gt;
  &lt;p&gt;Con tal concepto y con los procedimientos escritos para la Lista
  no es díficil tomar un subconjunto de estos y crear la Pila y
    procedimientos para manipularla.&lt;/p&gt;
  &lt;h4&gt;Crear Pila&lt;/h4&gt;
  &lt;pre class="prettyprint"&gt;  
    PROCEDURE CrearPila ( VAR Pila : TipoPila );
    BEGIN
      Pila := NIL;
    END
  &lt;/pre&gt;
  &lt;p&gt;Nuevamente recibimos por referencia el nombre de la pila y la
    inicializamos en nil&lt;/p&gt;
  &lt;h4&gt;Insertar PUSH&lt;/h4&gt;
  &lt;p&gt;Este procedimiento es común encontrarlo escrito en su traducción
    en inglés &lt;b&gt;Push&lt;/b&gt;:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
    PROCEDURE Insertar ( VAR Pila:TipoPila ; Valor:TipoInfo);
    VAR
      Ptr:TipoPila;
    BEGIN
      New(Ptr);
      Ptr^.Info := Valor;
      Ptr^.Siguiente := Pila;
      Pila := Ptr;
    END;
  &lt;/pre&gt;
  &lt;p&gt;En el código anterior, recibimos
    la &lt;code class="prettyprint"&gt;Pila&lt;/code&gt; y
    un &lt;code class="prettyprint"&gt;Valor&lt;/code&gt;, localmente con el
    puntero &lt;code class="prettyprint"&gt;Ptr&lt;/code&gt; alocamos la memoria
    dinámica y asignamos el valor al nuevo nodo, a este lo hacemos
    apuntar al primer nodo al que apunta la Pila, y por último a la
    Pila la hacemos apuntar al nuevo puntero. De esta manera acabamos
    de insertar el nuevo nodo al principio de la pila.&lt;/p&gt;
  &lt;h4&gt;Sacar POP&lt;/h4&gt;
  &lt;p&gt;Nuevamente a este procedimiento se lo suele llamar &lt;b&gt;Pop&lt;/b&gt; en
    muchos programas:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
    PROCEDURE Pop ( VAR Pila:TipoPila ; VAR Valor:TipoInfo);
    VAR
      Ptr:TipoPila;
    BEGIN
      Ptr := Pila;
      Pila := Ptr^.Siguiente;
      Valor := Ptr^.Info;
      DISPOSE(Ptr);
    END;
  &lt;/pre&gt;
  &lt;p&gt;Aquí agarramos con un puntero local al procedimiento al primer
  nodo de la pila y luego hacemos a apuntar a ésta última al siguiente
  nodo. Antes de liberar la memoria del nodo "sacado", asignamos su
    valor al parametro por
  referencia &lt;code class="prettyprint"&gt;Valor&lt;/code&gt;, luego sí estamos
    en condiciones de liberarlo
  con &lt;code class="prettyprint"&gt;DISPOSE&lt;/code&gt;.&lt;/p&gt;

  &lt;h3&gt;Colas&lt;/h3&gt;
  &lt;p&gt;Una Cola es otro tipo de lista que restringe las operaciones, la
  idea es insertar siempre al principio (tal como se inserta en una
    pila) y luego retirar del final.&lt;/p&gt;
  &lt;p&gt;Cuando retiramos un nodo de una Cola sabemos qué este es el nodo
  más antiguo (que entró hace más tiempo) de todos de los que están
    presente en la Cola al momento de retirar.&lt;/p&gt;
  &lt;p&gt;Para poder realizar estas operaciones debemos tener presente que
  hará falta tener dos punteros, uno apuntando al principio de la
    cola, y otro auxiliar apuntando al final de
  ésta.&lt;/p&gt;
  &lt;h4&gt;Crear Cola&lt;/h4&gt;
  &lt;p&gt;Aquí las cosas difieren un poco ya que aparecen los dos punteros
  de los que hablabamos para mantener la dirección del principio y del
    fin de la Cola.&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
    PROCEDURE CrearCola (VAR Cprin , Cfin : TipoCola );
    BEGIN
      Cprin := NIL;
      Cfin := NIL;
    END;
  &lt;/pre&gt;
  &lt;h4&gt;Insertar Nodo&lt;/h4&gt;
  &lt;p&gt;Recordemos que esta operación está restringida a insertar al
  principio:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
    PROCEDURE Insertar (VAR Cprin,Cfin:TipoCola; Valor:TipoInfo);
    VAR
      Ptr:TipoCola;
    BEGIN
      New(Ptr);
      Ptr^.Info := Valor;
      Ptr^.Siguiente := NIL;
      IF (Cprin = NIL) THEN
        Cprin := Ptr
      ELSE
        Cfin^.Siguiente := Ptr;
      Cfin := Ptr;
    END;
  &lt;/pre&gt;
  &lt;p&gt;Recibimos el principio y el final de la cola y el valor para
  insertar el nuevo nodo. Alocamos la memoria del nuevo nodo,
  asignamos su valor y lo hacemos apuntar a NIL (recordemos que va a
  entrar al principio). Ahora evaluamos si la Cola está vacia, si esto
    sucede le asignamos este nuevo nodo
  a &lt;code class="prettyprint"&gt;Cprin&lt;/code&gt;, en caso contrario lo
  el que debe apuntar a ese lugar es el nodo al cual actualmente
    apunta &lt;code class="prettyprint"&gt;Cfin&lt;/code&gt;, en cualquier caso
    &lt;code class="prettyprint"&gt;Cfin&lt;/code&gt; tiene que apuntar al nuevo
    nodo creado.&lt;/p&gt;
  &lt;h4&gt;Sacar Nodo&lt;/h4&gt;
  &lt;p&gt;Recordemos que ahora queremos sacar nodos desde el final:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
    PROCEDURE Suprimir (VAR Cprin, Cfin:TipoCola ; Var:TipoInfo);
    VAR
     Ptr:TipoCola;
    BEGIN
      Ptr:=Cprin;
      Valor := Cprin^.Info;
      Cprin := Cprin^.Siguiente;
      If (Cprin = NIL) THEN
        CFin := NIL;
      DISPOSE(Ptr)
    END;
  &lt;/pre&gt;
  &lt;p&gt;Antes de soltar al último nodo resguardamos su dirección en
    &lt;code class="prettyprint"&gt;Ptr&lt;/code&gt;, posteriomente avanzamos en
    uno a &lt;code class="prettyprint"&gt;Cprin&lt;/code&gt; y luego nos fijamos
    si la cola quedó vacia, en tal caso &lt;code class="prettyprint"&gt;Cfin&lt;/code&gt;
      debe tomar la
    dirección &lt;code class="prettyprint"&gt;NIL&lt;/code&gt;.&lt;/p&gt;
  &lt;p&gt;Cómo siempre liberamos la memoria que estaba ocupando el nodo
    quitado de la cola.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-678296846027981569?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/678296846027981569/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=678296846027981569' title='5 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/678296846027981569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/678296846027981569'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/07/memoria-dinmica-en-pascal.html' title='Memoria Dinámica en Pascal'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-7304978353320689931</id><published>2007-07-22T13:23:00.001-03:00</published><updated>2011-06-01T20:16:08.737-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mainframe mvs'/><category scheme='http://www.blogger.com/atom/ns#' term='cobol'/><title type='text'>Introducción a COBOL</title><content type='html'>&lt;p&gt;Algunas nociones de COBOL traducidas libremente desde el libro Programming Guide Enterprise COBOL for z/OS de IBM&lt;/p&gt;
  &lt;h2&gt;COBOL&lt;/h2&gt;
  &lt;p&gt;COBOL es un lenguaje de programación desarrollado en el año 1960
  por un consorcio de fabricantes de computadoras y el Departamento de
    Defensa de Estados Unidos.&lt;/p&gt;
  &lt;p&gt;El nombre es un acrónimo de &lt;b&gt;CO&lt;/b&gt;mmon &lt;b&gt;B&lt;/b&gt;usiness &lt;b&gt;O&lt;/b&gt;riented &lt;b&gt;L&lt;/b&gt;anguage.&lt;/p&gt;
  &lt;h2&gt;Divisiones&lt;/h2&gt;
  &lt;p&gt;Un programa COBOL cuenta con cuatro
    divisiones: &lt;code class="prettyprint"&gt;IDENTIFICATION DIVISION,
      ENVIRONMENT DIVSION&lt;/code&gt;, &lt;code class="prettyprint"&gt;DATA
      DIVSION&lt;/code&gt;, y la &lt;code class="prettyprint"&gt;PROCEDURE
    DIVISION&lt;/code&gt;. Cada una cumple una función lógica especial.&lt;/p&gt;
  &lt;p&gt;El programa mínimo, debe al menos contar con
  la &lt;code class="prettyprint"&gt;IDENTIFICATION DIVISION&lt;/code&gt;.&lt;/p&gt;

  &lt;h2&gt;IDENTIFICATION DIVSION&lt;/h2&gt;
  &lt;p&gt;La &lt;code class="prettyprint"&gt;IDENTIFICATION DIVISION&lt;/code&gt;
  permite nombrar al programa e informar otra información opcional
    como el autor, la fecha de escritura, etc.&lt;/p&gt;
  &lt;p&gt;Ejemplo:&lt;/p&gt;
&lt;pre class="prettyprint"&gt; 
IDENTIFICATION DIVISION.
PROGRAM-ID.    ProcesoA.
AUTHOR.        Emilio Astarita.
INSTALLATION.  Universidad Tecnologica Nacional.
DATE-WRITTEN.  07/12/2007.
DATE-COMPILED. 07/12/2007.
&lt;/pre&gt;
  &lt;p&gt;El párrafo &lt;code class="prettyprint"&gt;PROGRAM-ID&lt;/code&gt; da nombre
    al programa, y se utiliza para las siguientes funciones:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Es el nombre con el cual otros programas pueden hacer
    llamadas a tu programa.&lt;/li&gt;
    &lt;li&gt;Es el nombre que aparece en la cabecera del listado generado
      por el compilador&lt;/li&gt;
    &lt;li&gt;Si se utiliza la opción &lt;code class="prettyprint"&gt;NAME&lt;/code&gt;
    en el compilador, cuando se genere el objeto contendrá este
      nombre, de esta manera será más fácil identificar al
    objeto.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;Programas recursivos&lt;/h3&gt;
  &lt;p&gt;Si se agrega el
  atributo &lt;code class="prettyprint"&gt;RECURSIVE&lt;/code&gt; en la claúsula
    &lt;code class="prettyprint"&gt;PROGRAM-ID&lt;/code&gt; se específica que el
    programa puede ser ejecutado recursivamente mientras una
    invocación anterior está aún activa.&lt;/p&gt;
  &lt;p&gt;Los sub-programas no pueden utilizar este atributo.&lt;/p&gt;
  &lt;h3&gt;Estado inicial&lt;/h3&gt;
  &lt;p&gt;Se puede utilizar el
  atributo &lt;code class="prettyprint"&gt;INITIAL&lt;/code&gt; para especificar
  que cada vez que otro programa haga una llamada a este programa se
  inicializará a su estado inicial. Esto es debido a que por defecto
  los programas conservan el estado de las variables de la última
    ejecución producida por una llamada.&lt;/p&gt;
  &lt;p&gt;Con este atributo el programa inicializará todas las variables
  con el valor específicado por la claúsula VALUE (cuando exista) y
    los archivos son cerrados apropiadamente en caso de estar
  abiertos.&lt;/p&gt;
 
  &lt;h2&gt;ENVIRONMENT DIVISION&lt;/h2&gt;
  &lt;p&gt;En la &lt;code class="prettyprint"&gt;ENVIRONMENT DIVISION&lt;/code&gt; se
    específican los items:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;La plataforma en la que se compilará el programa,
    párrafo: &lt;code class="prettyprint"&gt;SOURCE-COMPUTER&lt;/code&gt;.&lt;/li&gt;
    &lt;li&gt;La plataforma que ejecutará el programa,
      párrafo: &lt;code class="prettyprint"&gt;OBJECT-COMPUTER&lt;/code&gt;.&lt;/li&gt;
    &lt;li&gt;Opciones especiales, cómo el trato del signo, el identificador
      del carácter decimal etc,
      párrafo: &lt;code class="prettyprint"&gt;SPECIAL-NAMES&lt;/code&gt;.&lt;/li&gt;
    &lt;li&gt;Aquí también definiremos una sección muy importante que
    describe las entradas y salidas del programa:
      sección &lt;code class="prettyprint"&gt;INPUT-OUTPUT SECTION&lt;/code&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;h3&gt;INPUT-OUTPUT SECTION&lt;/h3&gt;
  &lt;p&gt;Principalmente describe las carácteristicas de los archivos con
  los que tratará el programa. Los asocia a los archivos externos y
    describe sus atributos.&lt;/p&gt;
  &lt;p&gt;Ejemplo:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
SELECT ENTRADA
  ASSIGN TO "ENTRADA.TXT"
  ORGANIZATION IS SEQUENTIAL
  ACCESS IS LINE SECUENTIAL
  &lt;/pre&gt;
  &lt;p&gt;En el código anterior estamos relacionando en nombre
  lógico &lt;code class="prettyprint"&gt;ENTRADA&lt;/code&gt; al archivo de nombre
    físico &lt;code class="prettyprint"&gt;ENTRADA.TXT&lt;/code&gt;, en el resto
    del programa nos referiremos a él con su nombre lógico.&lt;/p&gt;
  &lt;p&gt;La clausula &lt;code class="prettyprint"&gt;ORGANIZATION&lt;/code&gt;
  específica el tipo de organización que tienen los datos de nuestro
    archivo y &lt;code class="prettyprint"&gt;ACCESS&lt;/code&gt; específica el
    modo en el que se leera.&lt;/p&gt;

  &lt;h2&gt;DATA DIVISION&lt;/h2&gt;
  &lt;p&gt;En esta tercer división definiremos los datos correctamente con
    nombres y tipos.&lt;/p&gt;
  &lt;p&gt;Particularmente en la &lt;code class="prettyprint"&gt;FILE
    SECTION&lt;/code&gt; se describen los datos que se utilizarán en las
    operaciones de entrada y salida. Y en esta división aún contamos
    con 3 secciones más de mucha importancia:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;code class="prettyprint"&gt;WORKING-STORAGE SECTION&lt;/code&gt;:
    dónde se definen las variables estáticas que se inicializan y
    ocupan memoria durante todo el tiempo que el programa este en
    ejecución (en el caso de un sub-programa estas variables
    mantendrán el estado en el que fueron dejadas por la última
    llamada del programa).&lt;/li&gt;
    &lt;li&gt;&lt;code class="prettyprint"&gt;LOCAL-STORAGE SECTION&lt;/code&gt;: a
      diferencia de la &lt;code class="prettyprint"&gt;WORKING-STORAGE&lt;/code&gt;
      estos datos se alocaran e inicializarán cada vez que el programa
      sea llamado.&lt;/li&gt;
    &lt;li&gt;&lt;code class="prettyprint"&gt;LINKAGE SECTION&lt;/code&gt;:
    Esta es un área compartida de comunicación entre programas y
    subprogramas.&lt;/li&gt;
  &lt;/ul&gt;
  
  &lt;h3&gt;FILE SECTION&lt;/h3&gt;
  &lt;p&gt;Ejemplo:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
       FILE SECTION.
          FD ENTRADA.
            01 REGISTRO-ENTRADA.
              02  CLAVE          PIC 9(10).
              02  DATOS.
                 03 NOMBRE        PIC X(15).
                 03 APELLIDO      PIC X(15).
&lt;/pre&gt;
  &lt;p&gt;En este ejemplo estamos describiendo la estructura de datos del
    archivo de nombre lógico &lt;code class="prettyprint"&gt;ENTRADA&lt;/code&gt;,
    de él decimos que tiene en las primeras diez posiciones un campo
    llamado &lt;code class="prettyprint"&gt;CLAVE&lt;/code&gt; y las restantes 30
    posiciones traen en el &lt;code class="prettyprint"&gt;NOMBRE&lt;/code&gt; y
    &lt;code class="prettyprint"&gt;APELLIDO&lt;/code&gt; de 15 posiciones cada
    uno.&lt;/p&gt;
  &lt;p&gt;Este registro (&lt;code class="prettyprint"&gt;REGISTRO-ENTRADA&lt;/code&gt;)
  queda asociado directamente al archivo, esto significa que sobre él
    haremos las operaciones de lectura
    (&lt;code class="prettyprint"&gt;READ&lt;/code&gt;) y escritura
    (&lt;code class="prettyprint"&gt;WRITE&lt;/code&gt;).&lt;/p&gt;

  &lt;h3&gt;WORKING-STORAGE SECTION&lt;/h3&gt;
  &lt;p&gt;Cómo dijimos aquí escribiremos las definiciones de las variables
    locales del programa, veamos el siguiente ejemplo:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
       WORKING-STORAGE SECTION.
          01 W000-AGRUPACION-NIVEL-1.
            03 W000-NIVEL-3.
               05 W000-NIVEL-5 PIC X(08).
               05 W000-OTRO-NIVEL-5 PIC X(08).
          01 W000-PAIS        PIC X(09) VALUE 'ARGENTINA'.
          01 A000-LEIDOS-E1   PIC 9(09) COMP-3.
          01 A000-LEIDOS-E2   PIC 9(09) VALUE ZEROES.
          01 A000-ESCRITOS    PIC 9(09) VALUE ZEROES.
&lt;/pre&gt;
  &lt;p&gt;En el código anterior, estuvimos definiendo variables sencillas,
    númericas y alfanúmericas.&lt;/p&gt;
  &lt;p&gt;En primer lugar tenemos el nivel del dato que estamos definiendo,
    los niveles &lt;code class="prettyprint"&gt;01&lt;/code&gt; son el nivel
    superior y a medida que aumentamos el número definimos campos
    agrupados.&lt;/p&gt;
  &lt;p&gt;Noten que podemos referirnos a las variables contiguas
    &lt;code class="prettyprint"&gt;W0000-NIVEL-5&lt;/code&gt;
    y &lt;code class="prettyprint"&gt;W000-OTRO-NIVEL-5&lt;/code&gt; cómo
    W000-NIVEL-3. Este modo de agrupamiento nos permite gran
    flexibilidad para referirnos a diferentes partes de un registro o
    hacer movimientos completos de varios niveles inferiores
    utilizando el nombre de dato que los agrupa.&lt;/p&gt;
  &lt;p&gt;Inmediatamente después del nombre que define a la variable
    observamos la plabra &lt;code class="prettyprint"&gt;PIC&lt;/code&gt; que es
    una abreviación de &lt;code class="prettyprint"&gt;PICTURE&lt;/code&gt; con
    ella damos aviso de que vamos a especificar el tipo de dato de un
    campo. &lt;code class="prettyprint"&gt;X&lt;/code&gt; en el caso de campos
    alfanúmericos y &lt;code class="prettyprint"&gt;9&lt;/code&gt; en el caso de
    los númericos.&lt;/p&gt;
  &lt;p&gt;En el caso de los númericos podemos especificar la manera en que
  debe almacenarse el dato en la variable, aunque ya veremos al
  detalle más definiciones ponemos en uso
    a &lt;code class="prettyprint"&gt;COMPUTATIONAL-3&lt;/code&gt;, que la
    utilizamos abreviadamente
  escribiendo &lt;code class="prettyprint"&gt;COMP-3&lt;/code&gt;.&lt;/p&gt; 
  &lt;p&gt;Por último tenemos la
  claúsula &lt;code class="prettyprint"&gt;VALUE&lt;/code&gt; con la que damos un
    valor inicializador a la variable.&lt;/p&gt;
  &lt;p&gt;A grandes rasgos hemos descripto algunas de las formas que puede
    adoptar la &lt;code class="prettyprint"&gt;WORKING-STORAGE SECTION&lt;/code&gt;.&lt;/p&gt;
  &lt;h2&gt;PROCEDURE DIVISION&lt;/h2&gt;
  &lt;p&gt;En la &lt;code class="prettyprint"&gt;PROCEDURE DIVISION&lt;/code&gt;
    escribiremos las intrucciones que definen el proceso de los
    datos. Aquí se escribiran todas las decisiones, movimientos. cálculos y
    llamadas a otros programas.&lt;/p&gt;
  &lt;h3&gt;PROCEDURE DIVISION USING...&lt;/h3&gt;
  &lt;p&gt;Nos podemos valer de la claúsula &lt;code class="prettyprint"&gt;USING
    DATO&lt;/code&gt; en el encabezado de
    la &lt;code class="prettyprint"&gt;PROCEDURE DIVISION&lt;/code&gt;,
    dónde &lt;code class="prettyprint"&gt;DATO&lt;/code&gt; es el nombre de un
    dato que traerá un valor externo, asignado por otro programa o por el
    ambiente en que se ejecute nuestro programa. Este dato debe estar
    declarado previamente en el área de comunicación
    (&lt;code class="prettyprint"&gt;LINKAGE-SECTION&lt;/code&gt;).&lt;/p&gt;
  &lt;h3&gt;SECCIONES, PÁRRAFOS, SENTENCIAS e INSTRUCCIONES&lt;/h3&gt;
  &lt;p&gt;La &lt;code class="prettyprint"&gt;PROCEDURE DIVISION&lt;/code&gt; puede
    dividirse en secciones y párrafos, que contengan sentencias,
    declaraciones y frases.&lt;/p&gt;
  &lt;h4&gt;SECTION&lt;/h4&gt;
  &lt;p&gt;Es una subdivisión lógica. Una sección tiene un encabezado y
    opcionalmente pueden seguirle uno o varios párrafos.&lt;/p&gt;
  &lt;h4&gt;PARAGRAPH&lt;/h4&gt;
  &lt;p&gt;Es una subdivisión de
    una &lt;code
    class="prettyprint"&gt;SECTION&lt;/code&gt;, &lt;code
       class="prettyprint"&gt;PROCEDURE&lt;/code&gt;,
    o programa.&lt;/p&gt;
  &lt;p&gt;Un párrafo es un nombre seguido por un punto y una o más
  sentencias.&lt;/p&gt;
  &lt;h4&gt;SENTENCE&lt;/h4&gt;
  &lt;p&gt;Una de serie de una o más declaraciones COBOL que terminan con un
  punto.&lt;/p&gt;
  &lt;h4&gt;STATEMENT&lt;/h4&gt;
  &lt;p&gt;Realiza un paso de procesamiento COBOL, como la suma de dos
  números.&lt;/p&gt;
  &lt;p&gt;Una instrucción es la combinación válida de palabras, y comienzan
  con un verbo COBOL. Las declaraciones son imperativas (indicando una
    acción incondicional), o una directiva del compilador.&lt;/p&gt;
  &lt;h4&gt;PHRASE&lt;/h4&gt;
  &lt;p&gt;Una subdivisión de un STATEMENT.&lt;/p&gt;
  &lt;h3&gt;Instrucciones&lt;/h3&gt;
  &lt;p&gt;Las instrucciones imperativas son verbos tales
    como &lt;code
    class="prettyprint"&gt;ADD&lt;/code&gt;, &lt;code
          class="prettyprint"&gt;MOVE&lt;/code&gt;,
    o &lt;code class="prettyprint"&gt;CLOSE&lt;/code&gt;.&lt;/p&gt;
  &lt;p&gt;También contamos con instrucciones condicionales tales como
    &lt;code
    class="prettyprint"&gt;IF&lt;/code&gt;, &lt;code
         class="prettyprint"&gt;EVALUATE&lt;/code&gt;,
    y &lt;code class="prettyprint"&gt;SEARCH&lt;/code&gt;).&lt;/p&gt;
  &lt;h3&gt;Directivas del compilador&lt;/h3&gt;
  &lt;p&gt;Como su nombre lo indica las directivas del compilador nos
  permiten darle ciertas órdenes como incluir otro archivo fuente al
    momento de compilar en un lugar dado.&lt;/p&gt;
  &lt;p&gt;Por ejemplo &lt;code class="prettyprint"&gt;COPY&lt;/code&gt; es parecido al
    &lt;code class="prettyprint"&gt;include&lt;/code&gt; de C, que inserta el
    contenido de otro archivo en el lugar en dónde se declara.&lt;/p&gt;
  &lt;h3&gt;Delimitadores de alcance&lt;/h3&gt;
  &lt;p&gt;Podemos utilizar el delimitador
  punto &lt;code class="prettyprint"&gt;.&lt;/code&gt; para determinar el final del
  alcance de una instrucción, este terminador es ímplicito. El
    explicito se forma con la palabra
    reservada &lt;code class="prettyprint"&gt;END&lt;/code&gt;, un
  guión &lt;code class="prettyprint"&gt;-&lt;/code&gt;, seguido por último por el
    nombre de la sentencia a la que se quiere delimitar su
  alcance.&lt;/p&gt;
  &lt;p&gt;En el siguiente ejemplo se muestran una serie de instrucciones
  equivalentes:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;

IF REGISTRO = HIGH-VALUES 
   DISPLAY 'SE TERMINÓ DE LEER TODO EL ARCHIVO'
.

IF REGISTO = HIGH-VALUES
   DISPLAY 'SE TERMINÓ DE LEER TODO EL ARCHIVO'
END-IF

  &lt;/pre&gt;
  &lt;p&gt;Siempre es preferible utilizar terminadores de alcance explícitos
  debido a que es más visible ver alcance.&lt;/p&gt;  

  &lt;p&gt;Otro ejemplo:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
READ REGISTRO-ENTRADA
AT END
  MOVE HIGH-VALUES TO R000-CLAVE
END-READ

READ REGISTRO-ENTRADA
AT END
  MOVE HIGH-VALUES TO R000-CLAVE.
  &lt;/pre&gt;

  &lt;h3&gt;Variables&lt;/h3&gt;
  &lt;p&gt;Una variable es un dato cuyo valor puede cambiar durante la
  duración del programa. El valor está restringido al tipo y al tamaño
    de dato que con el que se definió.&lt;/p&gt;
  &lt;p&gt;Por ejemplo:&lt;/p&gt;

  &lt;pre class="prettyprint"&gt;
WORKING-STORAGE SECTION.
01 CLIENTE PIC X(020).
01 CLIENTE-MOROSO PIC X(020).
....
PROCEDURE DIVISION.
 MOVE CLIENTE TO CLIENTE-MOROSO
  &lt;/pre&gt;
  &lt;p&gt;En este caso vemos la definición de dos datos de tipo y tamaño
  idéntico en la &lt;code class="prettyprint"&gt;DATA DIVISION&lt;/code&gt;. Luego
  en la &lt;code class="prettyprint"&gt;PROCEDURE DIVISION&lt;/code&gt; hacemos el
  movimiento del contenido de &lt;code class="prettyprint"&gt;CLIENTE&lt;/code&gt;
  al de &lt;code class="prettyprint"&gt;CLIENTE-MOROSO&lt;/code&gt;.&lt;/p&gt;
  &lt;h3&gt;Jerarquización de datos&lt;/h3&gt;
  &lt;p&gt;Los datos relacionados pueden ser parte de una estructura
  jerarquizada. Un campo de dato que tenga otros subordinados se
  llama campo elemental. Un campo que agrupe a otros de menor
    jerarquía es llamado un campo de agrupación.&lt;/p&gt;
  &lt;p&gt;Por ejemplo:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
WORKING-STORAGE SECTION.
01 CLIENTE.
  05 NOMBRE PIC X(25).
  05 APELLIDO PIC X(25).
01 CLIENTE-ANTERIOR PIC X(50).
  05 NOMBRE PIC X(25).
  05 APELLIDO PIC X(25).
PROCEDURE DIVISION.
  MOVE CLIENTE TO CLIENTE-ANTERIOR
  MOVE SPACES  TO NOMBRE OF CLIENTE
  MOVE SPACES  TO APELLIDO OF CLIENTE-ANTERIOR
  &lt;/pre&gt;
  &lt;p&gt;En este caso definimos dos campos de agrupación que contienen dos
  campos elementales cada uno. Cómo vemos podemos hacer un movimiento
  completo de estos dos, utilizando su nivel de agrupación mayor para
  referirnos a ambos. Notar también que se permite utilizar en los
  items subordinados variables del mismo nombre pero al momento de
    referirnos a ellas debemos mencionar la
  claúsula &lt;code class="prettyprint"&gt;OF&lt;/code&gt; seguida del nombre de
    campo de un nivel superior para que el compilador pueda superar la
  ambiguedad.&lt;/p&gt;
  &lt;h3&gt;Literales&lt;/h3&gt;
  &lt;p&gt;Un literal es una secuencia de carácteres encerrados entre
    comillas en el caso de los literales alfanúmericos y simplemente
    un número en el caso de los númericos.&lt;/p&gt;
  &lt;p&gt;Con el podemos asignar directamente el valor a variables de tipo
    &lt;code class="prettyprint"&gt;X&lt;/code&gt;.
  &lt;p&gt;Por ejemplo:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
MOVE "JORGE GRIPPO" TO NOMBRE OF CLIENTE
MOVE 14 TO EDAD OF CLIENTE
&lt;/pre&gt;
  &lt;p&gt;Los &lt;code class="prettyprint"&gt;MOVE&lt;/code&gt; anteriores son la
    asignación del literal de cadena &lt;code class="prettyprint"&gt;JORGE
      GRIPPO&lt;/code&gt; y del literal
    númerico &lt;code class="prettyprint"&gt;14&lt;/code&gt; a las
    variables &lt;code class="prettyprint"&gt;NOMBRE&lt;/code&gt;
    y &lt;code class="prettyprint"&gt;EDAD&lt;/code&gt; respectivamente.&lt;/p&gt;
  &lt;h3&gt;Constantes&lt;/h3&gt;
  &lt;p&gt;A diferencia de otros lenguajes COBOL, desgraciadamente no tiene
  una forma de definir constantes, esto es variables con un valor
  específicado al inicio del programa y que no puedan ser
    modificadas.&lt;/p&gt;
  &lt;p&gt;Sin embargo podemos valernos de la claúsula VALUE para setear un
  valor inicializador de una variable, aunque esto no impide manera
  alguna que por error en otra sección del programa se cambie el
    contenido de la variable.&lt;/p&gt;
  &lt;p&gt;Ejemplo:&lt;/p&gt;
  &lt;pre class="prettyprint"&gt;
  01 CLIENTE-DEFAULT PIC X(50) VALUE 'CLIENTE NO DEFINIDO - ERROR SISTEMA'.
  &lt;/pre&gt;
  &lt;h3&gt;Constantes figurativas&lt;/h3&gt;
  &lt;p&gt;Nos podemos referir a muchos literales mediante una palabra, a
  estas se las llama constantes figurativas, por
    ejemplo: &lt;code class="prettyprint"&gt;SPACES ZERO ZEROES HIGH-VALUE
      LOW-VALUES&lt;/code&gt; etc.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-7304978353320689931?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/7304978353320689931/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=7304978353320689931' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/7304978353320689931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/7304978353320689931'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/07/algunas-nociones-de-cobol.html' title='Introducción a COBOL'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-8375728894680130429</id><published>2007-07-16T19:51:00.001-03:00</published><updated>2008-11-12T23:41:34.303-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mvs'/><category scheme='http://www.blogger.com/atom/ns#' term='mainframe'/><category scheme='http://www.blogger.com/atom/ns#' term='cobol'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='apareo'/><category scheme='http://www.blogger.com/atom/ns#' term='opencobol'/><title type='text'>Apareo sencillo en COBOL</title><content type='html'>&lt;p&gt;Vamos a ver ahora un típico programa COBOL de apareo, muy común en
  bancos y otros negocios en dónde se necesitan procesar grandes
  lotes de datos.&lt;/p&gt;

&lt;p&gt;Casi todos los programas COBOL tienen un flujo de programa estándar
  como el que se visualiza en la figura de abajo&lt;/p&gt;


&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_xafZGrVrLV0/Rpv6LXSUwlI/AAAAAAAAABw/aytnjSG88mA/s1600-h/FLUJO-PROGRAMA.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_xafZGrVrLV0/Rpv6LXSUwlI/AAAAAAAAABw/aytnjSG88mA/s320/FLUJO-PROGRAMA.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5087935277181485650" /&gt;&lt;/a&gt;

&lt;p&gt;En 100-INICIO nos aseguramos de realizar la apertura de archivos,
  la primer lectura de los mismos, y la inicialización de las
  variables necesarias.&lt;/p&gt;
&lt;p&gt;En 200-PROCESO escribiremos la lógica que maneje el apareo.&lt;/p&gt;
&lt;p&gt;Por último en 300-FINAL, cerraremos los archivos y mostraremos el
  resumen del proceso.&lt;/p&gt;

&lt;p&gt;En la figura siguiente mostramos el flujo de proceso de
  100-INICIO&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_xafZGrVrLV0/Rpv6LXSUwmI/AAAAAAAAAB4/DKTjSVFOHmo/s1600-h/100-INICIO.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_xafZGrVrLV0/Rpv6LXSUwmI/AAAAAAAAAB4/DKTjSVFOHmo/s320/100-INICIO.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5087935277181485666" /&gt;&lt;/a&gt;

&lt;p&gt;La próxima figura muestra el flujo de 200-PROCESO. Que consiste en
  la evaluación de las claves de los archivos. Hacemos avanzar uno u
  otro según la comparación, y cuando las claves son iguales
  procesamos y grabamos la salida.&lt;/p&gt;
&lt;p&gt;Es importante notar que 200-PROCESO se ejecutará hasta que se de la
  condición planteada por el UNTIL, que es el fin de archivo de la ENTRADA1.&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_xafZGrVrLV0/Rpv6LnSUwnI/AAAAAAAAACA/CtpQjRxyFMw/s1600-h/200-PROCESO.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_xafZGrVrLV0/Rpv6LnSUwnI/AAAAAAAAACA/CtpQjRxyFMw/s320/200-PROCESO.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5087935281476452978" /&gt;&lt;/a&gt;


&lt;p&gt;Por último tenemos la figura de 300-FINAL, dónde simplemente
  cerramos los archivos.&lt;/p&gt;    


&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_xafZGrVrLV0/Rpv6LnSUwoI/AAAAAAAAACI/UeTzGu-9kqI/s1600-h/300-FINAL.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_xafZGrVrLV0/Rpv6LnSUwoI/AAAAAAAAACI/UeTzGu-9kqI/s320/300-FINAL.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5087935281476452994" /&gt;&lt;/a&gt;

&lt;p&gt;El código siguiente muestra el programa completo, en dónde se
  obtienen las edades (ENTRADA2) de una serie de personas (ENTRADA1),
  la información que apareó se escribe en el archivo de SALIDA.&lt;/p&gt;
&lt;p&gt;El programa fue compilado con el compilador OpenCobol y testeado en
  GNU/Ubuntu.&lt;/p&gt;

&lt;pre class="prettyprint"&gt;
      ************************************************
      *  DESCRIPCION: ESTE PROGRAMA OBTIENE LAS EDA- *
      *  DES DE LAS PERSONAS LEIDAS EN EL ARCHIVO 1  *
      *  A PARTIR DEL ARCHIVO 2 DE EDADES.           *
      *                                              *
      *  WEB:   HTTP://CODIGOMALDITO.BLOGSPOT.COM    *
      *                                              *
      ************************************************

       IDENTIFICATION DIVISION.
       PROGRAM-ID.  LECTURA.
       AUTHOR.  B MITRE.
       ENVIRONMENT DIVISION.
       INPUT-OUTPUT SECTION.
       FILE-CONTROL.

         SELECT ENTRADA1 ASSIGN TO "ENTRADA1.TXT"
           ORGANIZATION IS LINE SEQUENTIAL 
         FILE STATUS FS-ENTRADA1.

         SELECT ENTRADA2 ASSIGN TO "ENTRADA2.TXT"
            ORGANIZATION IS LINE SEQUENTIAL
         FILE STATUS FS-ENTRADA2.

         SELECT SALIDA ASSIGN TO "SALIDA.TXT"
            ORGANIZATION IS LINE SEQUENTIAL
         FILE STATUS FS-SALIDA.

                          
       DATA DIVISION.
                       
       FILE SECTION.

          FD ENTRADA1.
            01 REGISTRO-ENTRADA1.
              02  CLAVE1          PIC X(10).
              02  DATOS1.
                 03 NOMBRE        PIC X(15).
                 03 APELLIDO      PIC X(15).
                                                
          FD ENTRADA2.                            
            01 REGISTRO-ENTRADA2. 
              02  CLAVE2          PIC X(10).
              02  DATOS2.                    
                03 EDAD           PIC X(02).
                                                                        
          FD SALIDA.                    
          01 REGISTRO-SALIDA.              
            02  SAL-CLAVE         PIC X(10).
            02  ESPACIOS          PIC X(02) VALUE SPACES.
            02  SAL-NOMBRE        PIC X(15).
            02  SAL-APELLIDO      PIC X(15).
            02  SAL-EDAD          PIC X(02).
                                
                                                                                
                                                                       
       WORKING-STORAGE SECTION.
                                                              
                                                                    
      *           FILE STATUS                                             
          01 FS-ENTRADA1      PIC X(02) VALUE ZEROES.
          01 FS-ENTRADA2      PIC X(02) VALUE ZEROES.
          01 FS-SALIDA        PIC X(02) VALUE ZEROES.
                                                                           
                                                                        
      *           ACUMULADORES                                
          01 A000-LEIDOS-E1   PIC 9(09) VALUE ZEROES.              
          01 A000-LEIDOS-E2   PIC 9(09) VALUE ZEROES.               
          01 A000-ESCRITOS    PIC 9(09) VALUE ZEROES.            
                                                                
      *           SWITCHES
          01 S000-FIN-E1      PIC X(01) VALUE &amp;apos;N&amp;apos;.
           88 S000-FIN-E1-SI   VALUE &amp;apos;S&amp;apos;.
           88 S000-FIN-E1-NO   VALUE &amp;apos;N&amp;apos;.

          01 S000-FIN-E2      PIC X(01) VALUE &amp;apos;N&amp;apos;.
           88 S000-FIN-E2-SI   VALUE &amp;apos;S&amp;apos;.
           88 S000-FIN-E2-NO   VALUE &amp;apos;N&amp;apos;.
                                               
          01 W000-ABEND.
            02 W000-ABEND-OBJETO       PIC X(15).
            02 W000-ABEND-CODIGO       PIC X(05). 
            02 W000-ABEND-DESCRIPCION  PIC X(50).                              
                             
       PROCEDURE DIVISION.

      ****************************************** 
      * -------------------------------------- *
      * |              FLUJO                 | *
      * -------------------------------------- *
      ******************************************
          PERFORM 100-INICIO.                   

          PERFORM 200-PROCESO                   
            UNTIL S000-FIN-E1-SI.                

          PERFORM 300-FINAL.                   
 
      ****************************************
      * ------------------------------------ *      
      * |      DEFINICION DE PARRAFOS      | *
      * ------------------------------------ *
      ****************************************


      ****************************************
      *         100-INICIO                   *
      ****************************************
         100-INICIO.
            PERFORM 103-ABRIR-ARCHIVOS


            PERFORM 101-LEER-ENTRADA1
            IF FS-ENTRADA1 = &amp;apos;10&amp;apos;
              MOVE &amp;apos;ARCHIVO VACIO&amp;apos; TO W000-ABEND-DESCRIPCION
              MOVE FS-ENTRADA1 TO W000-ABEND-CODIGO
              MOVE &amp;apos;ENTRADA1&amp;apos;  TO W000-ABEND-OBJETO
              PERFORM 900-ABEND-PROCESO
            END-IF             


            PERFORM 102-LEER-ENTRADA2
            IF FS-ENTRADA2 = &amp;apos;10&amp;apos;
              MOVE &amp;apos;ARCHIVO VACIO&amp;apos; TO W000-ABEND-DESCRIPCION
              MOVE FS-ENTRADA2 TO W000-ABEND-CODIGO
              MOVE &amp;apos;ENTRADA2&amp;apos;  TO W000-ABEND-OBJETO
              PERFORM 900-ABEND-PROCESO
            END-IF             


          .

      ****************************************
      *         200-PROCESO                  *
      ****************************************
          200-PROCESO.                                         
          IF ( CLAVE1 &amp;gt; CLAVE2 ) 
                PERFORM 102-LEER-ENTRADA2
            ELSE 
              IF ( CLAVE1 &amp;lt;   CLAVE2)
                PERFORM 101-LEER-ENTRADA1
              ELSE
                INITIALIZE REGISTRO-SALIDA
                MOVE NOMBRE TO SAL-NOMBRE
                MOVE APELLIDO TO SAL-APELLIDO 
                MOVE EDAD   TO SAL-EDAD
 
                MOVE CLAVE1 TO SAL-CLAVE
                PERFORM 201-ESCRIBIR-SALIDA

                PERFORM 101-LEER-ENTRADA1
              END-IF
            END-IF
          .
      ****************************************
      *         300-FINAL                    *
      ****************************************
          300-FINAL.
           PERFORM 301-CERRAR-ARCHIVOS.
           PERFORM 302-MOSTRAR-RESUMEN.
           STOP RUN
         .
      ****************************************
      *         101-LEER-ENTRADA1            *
      ****************************************
          101-LEER-ENTRADA1.
            READ ENTRADA1
             AT END
               SET S000-FIN-E1-SI TO TRUE
               MOVE HIGH-VALUES TO CLAVE1
             NOT AT END
               ADD 1 TO A000-LEIDOS-E1
         .   



      ****************************************
      *         102-LEER-ENTRADA2            *
      ****************************************
          102-LEER-ENTRADA2.
            READ ENTRADA2
             AT END
               SET S000-FIN-E2-SI TO TRUE
               MOVE HIGH-VALUES TO CLAVE2
             NOT AT END
               ADD 1 TO A000-LEIDOS-E2
         .   

      ****************************************
      *         103-ABRIR-ARCHIVOS           *
      ****************************************
          103-ABRIR-ARCHIVOS.
            OPEN INPUT ENTRADA1
            IF FS-ENTRADA1 NOT = &amp;apos;00&amp;apos;
              MOVE &amp;apos;ERROR AL ABRIR ARCHIVO&amp;apos; TO W000-ABEND-DESCRIPCION
              MOVE FS-ENTRADA1 TO W000-ABEND-CODIGO
              MOVE &amp;apos;ENTRADA1&amp;apos;  TO W000-ABEND-OBJETO
              PERFORM 900-ABEND-PROCESO
            END-IF 
            OPEN INPUT ENTRADA2
            IF FS-ENTRADA2 NOT = &amp;apos;00&amp;apos;
              MOVE &amp;apos;ERROR AL ABRIR ARCHIVO&amp;apos; TO W000-ABEND-DESCRIPCION
              MOVE FS-ENTRADA2 TO W000-ABEND-CODIGO
              MOVE &amp;apos;ENTRADA2&amp;apos;  TO W000-ABEND-OBJETO
              PERFORM 900-ABEND-PROCESO
            END-IF 
            OPEN OUTPUT SALIDA
            IF FS-SALIDA NOT = &amp;apos;00&amp;apos;
              MOVE &amp;apos;ERROR AL ABRIR ARCHIVO&amp;apos; TO W000-ABEND-DESCRIPCION
              MOVE FS-SALIDA TO W000-ABEND-CODIGO
              MOVE &amp;apos;SALIDA&amp;apos;  TO W000-ABEND-OBJETO
              PERFORM 900-ABEND-PROCESO
            END-IF 

         .   
      ****************************************
      *         201-ESCRIBIR-SALIDA          *
      ****************************************
          201-ESCRIBIR-SALIDA.                              

            WRITE REGISTRO-SALIDA                         
                                                               
            IF FS-SALIDA NOT = &amp;apos;00&amp;apos;
              MOVE &amp;apos;ERROR AL ESCRIBIR ARCHIVO&amp;apos; TO W000-ABEND-DESCRIPCION
              MOVE FS-SALIDA TO W000-ABEND-CODIGO
              MOVE &amp;apos;SALIDA&amp;apos;  TO W000-ABEND-OBJETO
              PERFORM 900-ABEND-PROCESO 
            END-IF 

            ADD 1 TO A000-ESCRITOS
         .   

      ****************************************
      *         301-CERRAR-ARCHIVOS          *
      ****************************************
         301-CERRAR-ARCHIVOS.
           CLOSE ENTRADA1
            IF FS-ENTRADA1 NOT = &amp;apos;00&amp;apos;
              MOVE &amp;apos;ERROR AL CERRAR ARCHIVO&amp;apos; TO W000-ABEND-DESCRIPCION
              MOVE FS-ENTRADA1 TO W000-ABEND-CODIGO
              MOVE &amp;apos;ENTRADA1&amp;apos;  TO W000-ABEND-OBJETO
              PERFORM 900-ABEND-PROCESO
            END-IF 

           CLOSE ENTRADA2
            IF FS-ENTRADA2 NOT = &amp;apos;00&amp;apos;
              MOVE &amp;apos;ERROR AL CERRAR ARCHIVO&amp;apos; TO W000-ABEND-DESCRIPCION
              MOVE FS-ENTRADA2 TO W000-ABEND-CODIGO
              MOVE &amp;apos;ENTRADA2&amp;apos;  TO W000-ABEND-OBJETO
              PERFORM 900-ABEND-PROCESO
            END-IF 

           CLOSE SALIDA
            IF FS-SALIDA NOT = &amp;apos;00&amp;apos;
              MOVE &amp;apos;ERROR AL CERRAR ARCHIVO&amp;apos; TO W000-ABEND-DESCRIPCION
              MOVE FS-SALIDA TO W000-ABEND-CODIGO
              MOVE &amp;apos;SALIDA&amp;apos;  TO W000-ABEND-OBJETO
              PERFORM 900-ABEND-PROCESO
            END-IF 

         .

      ****************************************
      *         302-MOSTRAR-RESUMEN          *
      ****************************************
         302-MOSTRAR-RESUMEN.
           DISPLAY &amp;apos; &amp;apos;
           DISPLAY &amp;apos;  ---------------------------------&amp;apos;           
           DISPLAY &amp;apos;         RESUMEN DEL PROCESO  &amp;apos;
           DISPLAY &amp;apos;         -------------------  &amp;apos;
           DISPLAY &amp;apos; E1-&gt; LEIDOS DE NOMBRES:   &amp;apos; A000-LEIDOS-E1
           DISPLAY &amp;apos; E2-&gt; LEIDOS DE EDADES:    &amp;apos; A000-LEIDOS-E2
           DISPLAY &amp;apos; S1-&gt; ESCRITOS:            &amp;apos; A000-ESCRITOS
           DISPLAY &amp;apos;  ---------------------------------&amp;apos;           
         .




      ****************************************
      *         900-ABEND-PROCESO            *
      ****************************************
         900-ABEND-PROCESO.
           DISPLAY &amp;apos; &amp;apos;
           DISPLAY &amp;apos;***********************************&amp;apos;           
           DISPLAY &amp;apos;* ERROR EN EL SISTEMA              &amp;apos;
           DISPLAY &amp;apos;* OBJETO:            &amp;apos; W000-ABEND-OBJETO  
           DISPLAY &amp;apos;* CÓDIGO DE ERROR:   &amp;apos; W000-ABEND-CODIGO  
           DISPLAY &amp;apos;* DESCRIPCION:       &amp;apos; W000-ABEND-DESCRIPCION
           DISPLAY &amp;apos;***********************************&amp;apos;           
           STOP RUN.
         .

&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-8375728894680130429?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/8375728894680130429/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=8375728894680130429' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8375728894680130429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/8375728894680130429'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/07/apareo-sencillo-en-cobol.html' title='Apareo sencillo en COBOL'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_xafZGrVrLV0/Rpv6LXSUwlI/AAAAAAAAABw/aytnjSG88mA/s72-c/FLUJO-PROGRAMA.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-3428049506502856475</id><published>2007-06-17T20:00:00.000-03:00</published><updated>2007-07-17T20:01:43.484-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='file status'/><category scheme='http://www.blogger.com/atom/ns#' term='mainframe'/><category scheme='http://www.blogger.com/atom/ns#' term='cobol'/><category scheme='http://www.blogger.com/atom/ns#' term='sam'/><category scheme='http://www.blogger.com/atom/ns#' term='vsam'/><title type='text'>Errores de FILE STATUS</title><content type='html'>&lt;table&gt;
&lt;caption&gt;Códigos de error que se registran en el FILSE STATUS asociado
  a un archivo en COBOL MAINFRAME&lt;/caption&gt;

&lt;tr&gt;
  &lt;th&gt;Código&lt;/th&gt;
  &lt;th&gt;Descripción&lt;/th&gt;
&lt;/tr&gt;

&lt;tr&gt;
  &lt;td&gt;00&lt;/td&gt;
  &lt;td&gt;La operación fue exitosa.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;02&lt;/td&gt;
  &lt;td&gt;La sentencia de INPUT o OUTPUT fue ejecutada exitosamente, pero
  se detectó una clave duplicada. Este tipo de error aplica a archivos
  indexados.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
  &lt;td&gt;04&lt;/td&gt;
  &lt;td&gt;La sentencia de lectura fue ejecutada exitosamente, pero la
  longitud del registro leido no coincide con los atributos
  especificados para ese archivo.&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  &lt;td&gt;05&lt;/td&gt;
  &lt;td&gt;La sentencia de open fue ejecutada exitosamente, pero el
  archivo opcional referenciado no está presente en el momento en que
  el OPEN se ejecuta.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;10&lt;/td&gt;
  &lt;td&gt;Se alcanzó el fin de archivo EOF.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;14&lt;/td&gt;
  &lt;td&gt;Se intentó hacer una lectura secuencial sobre un archivo
  relativo, y el número de dígitos significativos en el número
  relativo de registros fue mayor al tamaño de la clave descripta para
  el archivo.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;21&lt;/td&gt;
  &lt;td&gt;Se detecta un error de secuencia para un archivo indexado.&lt;/td&gt;
&lt;/tr&gt;



&lt;tr&gt;
  &lt;td&gt;22&lt;/td&gt;
  &lt;td&gt;Se intenta escribir un registro que crea una clave duplicada en
  un archivo relativo. Agregar la claúsula DUPLICATES en el archivo indexado.&lt;/td&gt;
&lt;/tr&gt;



&lt;tr&gt;
  &lt;td&gt;23&lt;/td&gt;
  &lt;td&gt;En un archivo de acceso RANDOM se hace un START o un READ con
  una clave que no existe en el archivo.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;24&lt;/td&gt;
  &lt;td&gt;Error en WRITE en archivos INDEXADOS. Verificar que el tamaño
  de la clave sea suficiente para la cantidad de registros.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;30&lt;/td&gt;
  &lt;td&gt;Error permanente. Si te pasa esto llorá.&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  &lt;td&gt;34&lt;/td&gt;
  &lt;td&gt;Violación de los límites, error permanente. Se intento un WRITE
  más alla de los límites definidos externamente de un archivo secuencial.&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  &lt;td&gt;35&lt;/td&gt;
  &lt;td&gt;Se intento un OPEN sin especificar el tipo, es decir INPUT, I-O,
  EXTEND.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;37&lt;/td&gt;
  &lt;td&gt;Se intentó una sentencia de open en un archivo que no soporta
  abrirse en el modo específicado en la sentencia.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;38&lt;/td&gt;
  &lt;td&gt;Se intenta un OPEN sobre un archivo cerrado previamente con lock.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;41&lt;/td&gt;
  &lt;td&gt;Se intenta abrir un archivo ya abierto.&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
  &lt;td&gt;42&lt;/td&gt;
  &lt;td&gt;Se intento un CLOSE para un archivo no abierto.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;43&lt;/td&gt;
  &lt;td&gt;Para archivos secuenciales abiertos en el modo I-O, se ejecuta
  una sentencia de REWRITE posterior a una sentencia de  READ
  fallida.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;44&lt;/td&gt;
  &lt;td&gt;Existe una violación de límetes porque se intento hacer el
  REWRITE de un registro en un archivo y el registro no es del mismo
  tamaño que el registro a reemplazar. También puede ser un intento de
  escribir o reescribir un registro más largo o más pequeño que el
  permitido por la claúsula RECORD IS VARYING asociada al archivo.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;46&lt;/td&gt;
  &lt;td&gt;Se intentó un READ secuencial en un archivo abierto en modo
  INPUT o en modo I-O y no se encontró un registro siguiente
  válido. Se da porque el READ anterior fue un AT END o bien no causó
  la condición de AT END pero no fue exitoso.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;47&lt;/td&gt;
  &lt;td&gt;Se intenta leer un archivo que no se abrió en modo INPUT o I-O.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;48&lt;/td&gt;
  &lt;td&gt;La ejecución del WRITE se hizo sobre un archivo que no fue
  abierto en modo I-O, en modo OUTPUT o bien en modo extendido.&lt;/td&gt;
&lt;/tr&gt;



&lt;tr&gt;
  &lt;td&gt;49&lt;/td&gt;
  &lt;td&gt;Se intenta un DELETE o REWRITE en un archivo que no fue abierto
  en el modo correspondiente (I-O).&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;90&lt;/td&gt;
  &lt;td&gt;Sólo para aplicaciones multihilo (MULTITHREADING). Se realiza
  el close un VSAM o un QSAM en un hilo que no abrió el archivo.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;91&lt;/td&gt;
  &lt;td&gt;VSAM: Password error.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;92&lt;/td&gt;
  &lt;td&gt;Error lógico.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;93&lt;/td&gt;
  &lt;td&gt;Recurso no disponible.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;95&lt;/td&gt;
  &lt;td&gt;La información es invalida o incompleta.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;96&lt;/td&gt;
  &lt;td&gt;En VSAM: Se intentó un OPEN en modo OUTPUT, o un OPEN en I-O o
  EXTEND pero en la DD no se especifico lo mismo.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;97&lt;/td&gt;
  &lt;td&gt;El OPEN sobre el VSAM fue exitoso: Se verifica la integridad.&lt;/td&gt;
&lt;/tr&gt;


&lt;tr&gt;
  &lt;td&gt;98&lt;/td&gt;
  &lt;td&gt;El OPEN falla debido a un error en la claúsula SELECT...ASSIGN.&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-3428049506502856475?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/3428049506502856475/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=3428049506502856475' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/3428049506502856475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/3428049506502856475'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/06/errores-de-file-status.html' title='Errores de FILE STATUS'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-5561713873696846444</id><published>2007-05-13T14:34:00.000-03:00</published><updated>2008-11-12T23:41:34.460-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='gui'/><category scheme='http://www.blogger.com/atom/ns#' term='suma enteros'/><title type='text'>Suma de dos números en JAVA</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_xafZGrVrLV0/RkfS7O2yBRI/AAAAAAAAABo/Y91_lkDhatg/s1600-h/suma_numeros_java.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_xafZGrVrLV0/RkfS7O2yBRI/AAAAAAAAABo/Y91_lkDhatg/s320/suma_numeros_java.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5064248221043393810" /&gt;&lt;/a&gt;
&lt;pre class="prettyprint"&gt;
//----JAVA SUMA DE DOS VARIABLES.
import javax.swing.JOptionPane; 

public class SumarNumeros {

   public static void main( String args[] )
   {
      String strNumero1;
      String strNumero2;
      int intNumero1;   
      int intNumero2;   
      int suma;
      strNumero1 = JOptionPane.showInputDialog( "Ingrese el entero 1" );
      strNumero2 = JOptionPane.showInputDialog( "Ingrese el entero 2" );
      intNumero1 = Integer.parseInt( strNumero1 );
      intNumero2 = Integer.parseInt( strNumero2 );

      suma = intNumero1 + intNumero2;

      JOptionPane.showMessageDialog(
         null, "La suma es " + suma, "Resultado,",
         JOptionPane.PLAIN_MESSAGE );
     System.exit( 0 );  
  } 
} 
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-5561713873696846444?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/5561713873696846444/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=5561713873696846444' title='9 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5561713873696846444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/5561713873696846444'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2007/05/suma-de-dos-nmeros-en-java.html' title='Suma de dos números en JAVA'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_xafZGrVrLV0/RkfS7O2yBRI/AAAAAAAAABo/Y91_lkDhatg/s72-c/suma_numeros_java.jpg' height='72' width='72'/><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-115058669563907513</id><published>2006-06-17T20:24:00.000-03:00</published><updated>2007-05-07T21:16:18.675-03:00</updated><title type='text'>Indice del manual de C++</title><content type='html'>&lt;h2&gt;Temas tratados&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/hola-mundo-hola-nena.html"&gt;Hola mundo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/suma-de-dos-variables-enteras.html"&gt;Suma de dos variables&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/uso-del-if.html"&gt;IF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/ifelse.html"&gt;IF ELSE&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/ciclo-while.html"&gt;While Ciclo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/incremento-y-decremento.html"&gt;Incremento y decremento&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/ciclo-for.html"&gt;For ciclo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/seleccin-mltiple-switch.html"&gt;Switch seleccion multiple&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/como-compilar.html"&gt;Como compilar&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/ciclo-do-while.html"&gt;Do while ciclo&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/escapar-de-ciclo-con-break.html"&gt;Escapar de ciclo con break&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/escapar-de-ciclo-con-continue.html"&gt;Escapar de ciclo con continue&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/funcin-sencilla-suma-de-dos-enteros.html"&gt;Funcion suma de dos enteros&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/nmeros-aleatorios.html"&gt;Numeros aleatorios 1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/10/rand-srand-aleatorios-con-semilla.html"&gt;Numeros aleatorios 2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/el-mayor-de-3-numeros-enteros.html"&gt;Funcion mayor tres numeros&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/recursividad-factorial-de-un-nmero.html"&gt;Recursividad factorial de un numero&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/paso-por-referencia.html"&gt;Paso por referencia&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/sobrecarga-de-funciones.html"&gt;Sobrecarga de funciones&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/recursividad-potencia-de-base-y.html"&gt;Recursividad potencia&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/arreglos-o-arrays-en-c.html"&gt;Arreglos o arrays en C++&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/arreglo-de-caracteres.html"&gt;Arreglo de caracteres&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/pasaje-de-arreglos-funciones.html"&gt;Pasaje de arreglos a funciones&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/ordenamiento-burbuja.html"&gt;Ordenamiento burbuja&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/busqueda-lineal.html"&gt;Busqueda lineal&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/busqueda-binaria.html"&gt;Busqueda binaria&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/ordena-burbuja-mejorado.html"&gt;Ordena burbuja mejorado&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/apuntadores-o-punteros.html"&gt;Apuntadores o punteros&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/apuntadores-como-argumentos.html"&gt;Apuntadores como argumentos&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/apuntadores-y-const.html"&gt;Apuntadores y const&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/construya-su-propia-computadora.html"&gt;Construya su propia computadora&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/relacion-arreglos-y-punteros.html"&gt;Relacion arreglos y punteros&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/funciones-de-cstring-strcpy-y-strncpy.html"&gt;castring strcat y strncat&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/cstring-strcat-y-strncat.html"&gt;cstring strcat y strncat&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/comparacin-de-cadenas-strcmp-y-strncmp.html"&gt;Comparacion de cadenas strcmp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/dividir-en-tokens-o-palabras-con.html"&gt;Dividir en tokens o palabras&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/ocultamiento-y-resolucin-de-alcance.html"&gt;Ocultamiento y resolucion de alcance&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/clases-introduccin.html"&gt;Clases&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/como-compilar-ejemplo-con-clases.html"&gt;Compilar en archivos&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/funciones-miembro.html"&gt;Funciones miembro&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/11/inicializacin-con-constructores.html"&gt;Inicializacion de constructores&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/12/violar-el-acceso-miembros.html"&gt;Violar acceso a miembros&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/12/funciones-inline.html"&gt;Funciones inline&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/12/emacs-como-entorno-de-desarrollo.html"&gt;Emacs compilando&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/12/objetos-y-funciones-miembro-const.html"&gt;Objetos y funciones miembro const&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/12/inicializadores-de-miembro-datos-const.html"&gt;Inicializadores de miembro&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/12/composicin-objetos-miembro.html"&gt;Composición, objetos miembro&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/12/clases-y-funciones-friend.html"&gt;Clases y funciones friend&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2006/01/apuntador-this.html"&gt;Apuntador this&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2006/01/memoria-dinamica-new-y-delete.html"&gt;Memoria dinamica, new y delete&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2006/01/destructores-y-constructores.html"&gt;Destructores y constructores&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2006/01/miembros-de-tipo-static.html"&gt;Miembros de tipo static&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2006/06/algoritmo-superprimos-residuo-division.html"&gt;Algoritmo, superprimos, residuo y división entera&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/1991/08/potencia-de-base-y-exponente-entero.html"&gt;Algoritmo de potencia, para base y exp enteros&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2004/11/sobrecarga-de-operadores-en-c.html"&gt;Sobrecarga de operadores en C++&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2004/11/poo-herencia.html"&gt;Herencia en la programación orientada a objetos&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2004/11/algoritmo-de-ordenacin-quicksort-en-c.html"&gt;Quicksort, algoritmo de ordenación en C++&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2004/11/rellenar-un-arreglo-con-nmeros.html"&gt;Rellenar un arreglo o vector con numeros aleatorios&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/1998/11/algoritmo-de-euclides-c.html"&gt;Algoritmo de Euclides y Maximo Comun Divisor&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/1995/11/factorizar-fracciones-en-c.html"&gt;Algoritmo factorizar fracciones&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2004/12/entrevista-bjarne-stroustrup-creador.html"&gt;Entrevista a Bjarne Stroustrup creador de C++&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/12/tipos-de-datos-primitivos.html"&gt;Tabla de tipos de datos primitivos&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/12/parmetros-por-lnea-de-comandos-argc-y.html"&gt;Parametros por línea de comandos, argc, argv&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2004/05/archivos-manejo-de-flujos-primera-parte.html"&gt;Manejo de archivos (ficheros) en C++ primera parte&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2007/05/implementacin-de-strcat.html"&gt;Implementacion de strcat&lt;/a&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;Pascal&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2000/03/hola-mundo-en-pascal.html"&gt;Hola Mundo en Pascal&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2000/03/if-else-en-pascal.html"&gt;IF else&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2000/03/uso-de-case-of-en-pascal.html"&gt;CASE OF&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2000/03/while-do-mientras-hace.html"&gt;Ciclo while do&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2000/03/uso-de-for-ciclo-exacto.html"&gt;Ciclo exacto FOR&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Java&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://codigomaldito.blogspot.com/2005/05/hola-mundo-en-java.html"&gt;Hola Mundo en Java&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-115058669563907513?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/115058669563907513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/115058669563907513'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2006/06/indice-del-manual-de-c.html' title='Indice del manual de C++'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-114962447089728108</id><published>2006-06-06T16:30:00.000-03:00</published><updated>2007-03-28T22:32:06.958-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='superprimos'/><category scheme='http://www.blogger.com/atom/ns#' term='algoritmos'/><category scheme='http://www.blogger.com/atom/ns#' term='division entera'/><title type='text'>Algoritmo, superprimos, residuo, division entera</title><content type='html'>&lt;p&gt;Un algoritmo para pasar el rato. Sacado de la página de los
  &lt;a href="http://www.oma.org.ar/enunciados/cym05r2.htm"&gt;torneos de
  Computación y matemáticas&lt;/a&gt;. Cito:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Un numero es superimpar si todas sus cifras son impares.
  Cuáles son todos los múltiplos de 367 que tienen exactamente 5
  cifras y son superimpares.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En papel calculamos que los múltiplos de 5 cifras de 367 están
 acotados así:&lt;/p&gt;
&lt;pre&gt;
367*28 &lt;= ABCDE &lt;= 367*272
&lt;/pre&gt;
&lt;p&gt; Debido a que &lt;code&gt;367*27 = 9909&lt;/code&gt; y &lt;code&gt;272*27 =
    99824&lt;/code&gt;, que tienen 4 y 5 cifras respectivamente (no nos
    sirven).&lt;/p&gt;
&lt;p&gt;El algoritmo que implementaremos, se basará en la propiedad de los
números pares que al dividirlos por 2 devuelven un resto igual a
  0. Esto se logra fácilmente con el operador de
  residuo &lt;code class="prettyprint"&gt;%&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt; Por ejemplo:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
int a,b;
a = 4 % 2; //se asigna 0.
b = 5 % 2; //se asigna 1.
&lt;/pre&gt;
&lt;p&gt;Realizamos la operación sobre el número &lt;code&gt;ABCDE % 2&lt;/code&gt;, si obtenemos un 0
es porque el número es par, es decir su última cifra es par, por lo
  que ya podemos descartarlo. Si nos da distinto, seguimos
  adelante.&lt;/p&gt;
&lt;p&gt;Ahora nos valdremos de la división entera por 10, para correr la coma
un lugar hacia izquierda y quedarnos con la parte entera. Veamoslo
  así:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
int a,b;
a = 12345;
b = a / 10; //asgina 1234
&lt;/pre&gt;
&lt;p&gt;De esta manera ya podemos evaluar si es o no es par la segunda
cifra. Repitiendo el procedimiento tres veces más terminamos de
evaluar todas las cifras. Si todas nos dieron impares, mostramos el
  número.&lt;/p&gt;
&lt;p&gt;Veamos el código entonces:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
#include 
using std::cout;
using std::endl;
int main()
{
  int numero = 367;
  int evaluar;
  for (int i = 28 ; i &amp;lt; 272 ; i++) //Evaluamos todos los multiplos de 5 cifras.
    {
      evaluar = numero*i; //Construimos el multiplo.
      if (evaluar % 2 != 0) //estamos evaluando ABCDE
 if ( (evaluar /= 10) %2 != 0 ) // ABCD
   if ( (evaluar /= 10) %2 != 0 ) //  ABC
     if ( (evaluar /= 10) %2 != 0 ) //  AB
       if ( (evaluar /= 10) %2 != 0 ) //por fin A si todo salio bien mostramos
  cout &amp;lt;&amp;lt; numero*i &amp;lt;&amp;lt; " es igual a " 
                     &amp;lt;&amp;lt; i &amp;lt;&amp;lt; "*" &amp;lt;&amp;lt; numero 
                     &amp;lt;&amp;lt; endl;
    }
  return 0;
}
&lt;/pre&gt;
&lt;p&gt;Compilamos así:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
g++ superprimos.cpp -o superprimos.out
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;¿Les parece efectivo?&lt;/li&gt;
&lt;li&gt;¿Otras soluciones?&lt;/li&gt;
&lt;li&gt;Sí el enunciado nos pidiera que el mismo algoritmo se encargue de determinar los múltiplos de 5 cifras. ¿Como quedaría?&lt;/li&gt;
&lt;li&gt;¿Es utilizar un ciclo para no repetir condiciones &lt;code&gt;if&lt;/code&gt;? ¿Basta con una?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Que se diviertan si quieren dejen respuestas en los comentarios.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-114962447089728108?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/114962447089728108/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=114962447089728108' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/114962447089728108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/114962447089728108'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2006/06/algoritmo-superprimos-residuo-division.html' title='Algoritmo, superprimos, residuo, division entera'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-114661909330607694</id><published>2006-05-02T22:16:00.000-03:00</published><updated>2006-05-02T22:18:13.323-03:00</updated><title type='text'>MANUAL XHTML</title><content type='html'>Publico otro &lt;a href="http://manual-xhtml.blogspot.com"&gt;manual sobre el lenguaje XHTML&lt;/a&gt;. Espero que les guste.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-114661909330607694?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://manual-xhtml.blogspot.com/' title='MANUAL XHTML'/><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/114661909330607694/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=114661909330607694' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/114661909330607694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/114661909330607694'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2006/05/manual-xhtml.html' title='MANUAL XHTML'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-114175073450688070</id><published>2006-03-07T13:55:00.000-03:00</published><updated>2006-03-07T13:58:54.506-03:00</updated><title type='text'>Acutalización de template para Blogger</title><content type='html'>Perdonen la poca actualización que le estoy haciendo al sitio. Ya voy a escribir más temas. Ocurrió que estoy dando finales, y  por empezar la facultad nuevamente. Por lo que me cuesta mantener el ritmo de estudio del lenguaje. En cuanto pueda regresare. Por el momento he actualizado el template del sitio gracias al theme de &lt;a href="http://losbits.blogspot.com/2006/03/usa-esta-template-para-blogger.html"&gt;.:losBits.&lt;/a&gt;

Espero que les guste.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-114175073450688070?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://losbits.blogspot.com/2006/03/usa-esta-template-para-blogger.html' title='Acutalización de template para Blogger'/><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/114175073450688070/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=114175073450688070' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/114175073450688070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/114175073450688070'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2006/03/acutalizacin-de-template-para-blogger.html' title='Acutalización de template para Blogger'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-113857680316716710</id><published>2006-01-29T20:16:00.001-03:00</published><updated>2011-06-01T20:17:23.915-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='objetos'/><category scheme='http://www.blogger.com/atom/ns#' term='static'/><category scheme='http://www.blogger.com/atom/ns#' term='poo'/><category scheme='http://www.blogger.com/atom/ns#' term='miembros static'/><category scheme='http://www.blogger.com/atom/ns#' term='clases'/><title type='text'>Miembros de tipo static en C++</title><content type='html'>&lt;p&gt;Las clases que estuvimos escribiendo, contenían datos miembros
(variables), que servían para almacenar un valor que sería propio del
  objeto que luego creamos a partir de la clase. &lt;/p&gt;
&lt;p&gt;Por ejemplo, si tenemos
una clase &lt;code class="prettyprint"&gt;Punto&lt;/code&gt; con los datos
  miembros &lt;code class="prettyprint"&gt;x&lt;/code&gt; e &lt;code class="prettyprint"&gt;y&lt;/code&gt;, y creamos dos objetos:
&lt;code class="prettyprint"&gt;Q(-5,43.12)&lt;/code&gt; y &lt;code class="prettyprint"&gt;J(32,23)&lt;/code&gt;, vemos que los datos miembros, almacenan
valores que son propios de los objetos e independientes de la
clase.&lt;/p&gt;
&lt;p&gt; Pero a veces resulta útil tener datos miembros de
características inversas (independientes de los objetos y propios de
la clase) que sean compartidos por todos los objetos creados de una
  clase. &lt;/p&gt;
&lt;p&gt;Para esto se definen dentro de la clase datos miembro de tipo
  &lt;code class="prettyprint"&gt;static&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt; Podríamos definir un dato
  miembro &lt;code class="prettyprint"&gt;static&lt;/code&gt;, llamado &lt;code class="prettyprint"&gt;cantDeObj&lt;/code&gt;
(cantidad de objetos) inicializado en &lt;code class="prettyprint"&gt;0&lt;/code&gt;, que se incrementaría cada vez
que se ejecuta el constructor de la clase (es decir se crea un
objeto), y se decrementaría cada vez que se ejecuta el destructor de
  la clase (es decir se destruye un objeto). &lt;/p&gt;
&lt;p&gt;Si esto lo implementaramos,
por ejemplo, en la clase &lt;code class="prettyprint"&gt;Punto&lt;/code&gt;, podríamos saber en cualquier momento
  la cantidad de puntos (objetos de la clase &lt;code class="prettyprint"&gt;Punto&lt;/code&gt;), que están creados.&lt;/p&gt;
&lt;p&gt;En el próximo programa, utilizamos en la clase &lt;code class="prettyprint"&gt;Prueba&lt;/code&gt;, un dato miembro
&lt;code class="prettyprint"&gt;static&lt;/code&gt;, llamado &lt;code class="prettyprint"&gt;cantidad&lt;/code&gt;, que contendrá todo el tiempo la cantidad de
objetos creados. &lt;/p&gt;
&lt;p&gt;Como veremos al ser &lt;code class="prettyprint"&gt;static&lt;/code&gt;, existe aún cuando no haya
ningún objeto de la clase creado. Debemos tener en cuenta que &lt;code class="prettyprint"&gt;cantidad&lt;/code&gt;
estará bajo la etiqueta &lt;code class="prettyprint"&gt;private:&lt;/code&gt; por lo que no podremos acceder a la
variable directamente, sino que utilizaremos una función miembro
&lt;code class="prettyprint"&gt;static&lt;/code&gt;, llamada &lt;code class="prettyprint"&gt;obtenerCant()&lt;/code&gt;, que al igual que un dato miembro
&lt;code class="prettyprint"&gt;static&lt;/code&gt;, es independiente de todos los objetos y propia de la clase.&lt;/p&gt;
&lt;p&gt;Luego dentro de &lt;code class="prettyprint"&gt;main()&lt;/code&gt;, creamos algunos objetos, y vemos como la
  variable cantidad va variando de valor.&lt;/p&gt;
&lt;p&gt;  Aquí el programa:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
#include &amp;lt;iostream&amp;gt;
using std::cout;

using std::endl;
#include &amp;lt;new&amp;gt;
class Prueba
{

 public:
  Prueba (int valor = 0)
    {

      cout &amp;lt;&amp;lt; "Llamado del constructor" &amp;lt;&amp;lt; endl;
      x = valor;

      cantidad++;
    }
  ~Prueba()
    {

      cout &amp;lt;&amp;lt; "Llamado del destructor" &amp;lt;&amp;lt; endl;
      cantidad--;
    }

  static int obtenerCant(void)
  {
    return cantidad;

  }
 private:
  int x;
  static int cantidad;

};

int Prueba::cantidad = 0;//inicializacion del dato miembro.

int main()
{
  cout &amp;lt;&amp;lt; "No se creo ningun objeto cantidad es: " &amp;lt;&amp;lt; Prueba::obtenerCant() &amp;lt;&amp;lt; endl;

  Prueba objeto;
  cout &amp;lt;&amp;lt; "Luego de crear un obj, cantidad es: " &amp;lt;&amp;lt; Prueba::obtenerCant() &amp;lt;&amp;lt; endl;

  Prueba *arreglo;
  cout &amp;lt;&amp;lt; "CREO EL ARREGLO" &amp;lt;&amp;lt; endl;

  arreglo = new Prueba[5];
  cout &amp;lt;&amp;lt; "Luego del arreglo de objetos cantidad es: " &amp;lt;&amp;lt; Prueba::obtenerCant() &amp;lt;&amp;lt; endl;

  cout &amp;lt;&amp;lt; "BORRO EL ARREGLO" &amp;lt;&amp;lt; endl;
  delete [] arreglo;

  cout &amp;lt;&amp;lt; "Luego de borrar el arreglo cantidad es: " &amp;lt;&amp;lt; Prueba::obtenerCant() &amp;lt;&amp;lt; endl;

  Prueba objetoA;
  cout &amp;lt;&amp;lt; "Creo otro objeto cantidad es: " &amp;lt;&amp;lt; Prueba::obtenerCant() &amp;lt;&amp;lt; endl;

  cout &amp;lt;&amp;lt; "Luego de esto se ejecutaran los dos ultimos destructores: " &amp;lt;&amp;lt; endl;
  return 0;
}
&lt;/pre&gt;
&lt;p&gt;Para compilar:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
g++ miembroStatic.cpp -o miembroStatic.out
&lt;/pre&gt;
&lt;p&gt;Aquí abajo vemos como se ve la salida de este programa:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4325/375/1600/miembrosStatic.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4325/375/320/miembrosStatic.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-113857680316716710?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/113857680316716710/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=113857680316716710' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/113857680316716710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/113857680316716710'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2006/01/miembros-de-tipo-static.html' title='Miembros de tipo static en C++'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-113857431337890841</id><published>2006-01-29T19:35:00.001-03:00</published><updated>2011-06-01T20:17:32.132-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='objetos'/><category scheme='http://www.blogger.com/atom/ns#' term='clases'/><category scheme='http://www.blogger.com/atom/ns#' term='constructores'/><category scheme='http://www.blogger.com/atom/ns#' term='destructores'/><title type='text'>Destructores y constructores en C++</title><content type='html'>&lt;p&gt;Cuando vimos clases, hemos visto que toda clase tiene una función
especial llamada constructor que posee la particularidad de tener el
  mismo nombre que la clase. &lt;/p&gt;
&lt;p&gt;Esta función se ejecuta cada vez que se
crea un objeto de la clase. De parecidas carácteristicas existe una
función, llamada &lt;em&gt;destructor&lt;/em&gt; que se ejecuta cada vez que el objeto se
  destruye.&lt;/p&gt;
&lt;p&gt; Un objeto se destruye cuando se termina el programa, cuando
se sale de una función (o bloque) que había creado al objeto, o bien
cuando indicamos con la instrucción &lt;code class="prettyprint"&gt;delete&lt;/code&gt;, la liberación de la
  memoria que habíamos reservado dinámicamente para algún objeto.&lt;/p&gt;
&lt;p&gt; En todos estos casos se ejecuta el destructor del objeto. Este también
  lleva el nombre de la clase precedido por el
  símbolo &lt;code class="prettyprint"&gt;~&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt; Hasta el
momento no nos hizo falta definir nuestros propios destructores, pero
como veremos más adelante resulta muy útil y necesario cuando los
  programas administran memoria dinámica y no son clases tan triviales
  como las que vimos.&lt;/p&gt;
&lt;p&gt;  En el programa siguiente,
crearemos la clase &lt;code class="prettyprint"&gt;Prueba&lt;/code&gt; y le definiremos solamente un constructor y
  un destructor. &lt;/p&gt;
&lt;p&gt;También poseera un dato miembro, que lo utilizaremos
para diferenciar los diferentes objetos
  (objeto &lt;code class="prettyprint"&gt;0&lt;/code&gt;,
  objeto &lt;code class="prettyprint"&gt;1&lt;/code&gt;, etc). &lt;/p&gt;
&lt;p&gt;El
constructor y el destructor, sólo poseeran una instrucción &lt;code class="prettyprint"&gt;cout&lt;/code&gt;, que
mostrará cuando se ejecuta uno u otro y además dará el número de
  objeto para que podamos diferenciarlos.&lt;/p&gt;
&lt;p&gt;Presten especial atención en los dos objetos creados dentro del bloque
(el 1 y el 2). Se crea primero el objeto 1 y luego el objeto 2. Cuando
se sale del bloque, los destructores se ejecutan en el orden inverso
al que fueron creados, es decir primero el del objeto 2 y luego el del
  objeto 1.&lt;/p&gt;

&lt;p&gt;Aquí va a el código: &lt;/p&gt;
&lt;pre class="prettyprint"&gt;
#include &amp;lt;iostream&amp;gt;
using std::cout;

using std::endl;
#include &amp;lt;new&amp;gt;

class Prueba
{

 public:
  Prueba(int numero = 0); //constructor.

  ~Prueba(); //destructor
 private:
  int x;

};

//definiciones de las funciones miembro
Prueba::Prueba(int numero)//constructor.

{
  x = numero;
  cout &amp;lt;&amp;lt; "Se ejecuta el constructor del objeto nro: " &amp;lt;&amp;lt; (*this).x &amp;lt;&amp;lt; endl;

}
Prueba::~Prueba()
{
  cout &amp;lt;&amp;lt; "Se ejecuta el DESTRUCTOR del objeto nro: " &amp;lt;&amp;lt; (*this).x &amp;lt;&amp;lt; endl;

}

int main()
{
  cout &amp;lt;&amp;lt; "***Entramos a main" &amp;lt;&amp;lt; endl;

  Prueba objeto(0);
  {
    cout &amp;lt;&amp;lt; "***Entramos al bloque" &amp;lt;&amp;lt; endl;

    Prueba objetoA(1);
    Prueba objetoB(2);

    cout &amp;lt;&amp;lt; "***Salimos del bloque" &amp;lt;&amp;lt; endl;
  }

  Prueba *ptr; //creamos un puntero.

  ptr = new Prueba(3);//le asignamos un objeto dinamicamente, con argumento 3.
  Prueba *ptr2;

  ptr2 = new Prueba(4);//segundo puntero.
  //AHORA LIBERAMOS LA MEMORIA DINAMICA QUE HABIAMOS SOLICITADO, USANDO DELETE.

  cout &amp;lt;&amp;lt; "--Borramos ptr2" &amp;lt;&amp;lt; endl;
  delete ptr2;
  cout &amp;lt;&amp;lt; "--Borramos ptr" &amp;lt;&amp;lt; endl;

  delete ptr;
  cout &amp;lt;&amp;lt; "***Ahora estamos por salir de main(), al salir se ejecutara el destructor" &amp;lt;&amp;lt; endl &amp;lt;&amp;lt; "del objeto 0 creado al principio de main()" &amp;lt;&amp;lt; endl;

  return 0;
}
&lt;/pre&gt;
&lt;p&gt;Para compilar:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
g++ destructores.cpp -o destructores.out
&lt;/pre&gt;
&lt;p&gt;Aquí abajo vemos como se ve la salida de este programa:&lt;/p&gt;

&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/4325/375/1600/destructoresSalida.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/4325/375/320/destructoresSalida.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-113857431337890841?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/113857431337890841/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=113857431337890841' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/113857431337890841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/113857431337890841'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2006/01/destructores-y-constructores.html' title='Destructores y constructores en C++'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-113855345000744745</id><published>2006-01-29T13:42:00.001-03:00</published><updated>2011-06-01T20:17:38.548-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='delete'/><category scheme='http://www.blogger.com/atom/ns#' term='new'/><category scheme='http://www.blogger.com/atom/ns#' term='memoria dinamica'/><title type='text'>Memoria dinamica: new y delete en C++</title><content type='html'>&lt;p&gt;La memoria dinámica es un espacio de almacenamiento que se puede
solicitar en tiempo de ejecución. Además de solicitar espacios de
almacenamiento, también podemos liberarlos (en tiempo de ejecución)
  cuando dejemos de necesitarlos. &lt;/p&gt;
&lt;p&gt;Para realizar esta administración de
la memoria dinámica, C++ cuenta con dos
  operadores &lt;code class="prettyprint"&gt;new&lt;/code&gt; y &lt;code class="prettyprint"&gt;delete&lt;/code&gt;.
  Antes de utilizarlos, debemos incluir el encabezado &amp;lt;new&amp;gt;.&lt;/p&gt;
&lt;p&gt;  El operador &lt;code class="prettyprint"&gt;new&lt;/code&gt; reserva memoria
  dinámica de cualquier tipo, esto es:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;tipos primitivos (int, double, etc) &lt;/li&gt;
  &lt;li&gt;tipos definidos por el usuario (clases o estructuras).  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Veamos las siguientes líneas:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
int *ptrEntero;
ptrEntero = new int;
/*(al puntero ptrEntero le asignamos 
dinamicamente espacio para contener un valor int)*/


int *ptrEnteroA;
ptrEnteroA = new int(5);
/*(igual que al anterior 
pero de paso lo inicializamos en 5)*/
&lt;/pre&gt;
&lt;p&gt;También podríamos hacerlo con un arreglo, para esto:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
int *arreglo =  new int[45];
/*
(creamos un arreglo dinámico, ésta vez lo 
hacemos en la misma línea en la que 
declaramos el puntero)
*/
&lt;/pre&gt;
&lt;p&gt;Supongamos ahora que poseemos una
  clase &lt;code class="prettyprint"&gt;Punto&lt;/code&gt;, podríamos 
  crear objetos dinámicos a partir de esta clase.&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
Punto *ptrQ;
ptrQ = new Punto(4,5);
/*
(en la segunda línea le pasamos 
además dos parámetros separados por 
coma al constructor de Punto)
*/
&lt;/pre&gt;
&lt;p&gt;Hemos estado pidiendo memoria dinámica, una 
vez utilizada lo correcto sería liberarla antes de que finalice
  el programa para esto utilizaremos el
  operador &lt;code class="prettyprint"&gt;delete&lt;/code&gt;:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
delete ptrEntero;
delete ptrEnteroA;
delete ptrQ;
delete [] arreglo; 
//Si no usaramos [] no se liberaría el arreglo entero
&lt;/pre&gt;
&lt;p&gt;Aquí dejo un programa, con una sencilla
  clase &lt;code class="prettyprint"&gt;Punto&lt;/code&gt;, y la declaración de
  algunos objetos en la memoria dinámica.&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
#include &amp;lt;iostream&amp;gt;
using std::cout;

using std::endl;
#include &amp;lt;new&amp;gt; //para poder utilizar new y delete
class Punto

{
 public:
  Punto(int X=0,int Y=0)

    {
      establecer(X,Y);
    }
  void establecer(int x1,int y1)

  {
    x = x1;
    y = y1;

  }
  void imprimir(void)
  {
    cout &amp;lt;&amp;lt; "(" &amp;lt;&amp;lt; x &amp;lt;&amp;lt; "," &amp;lt;&amp;lt; y &amp;lt;&amp;lt; ")" &amp;lt;&amp;lt; endl;

  }
 private:
  int x;
  int y;

};

int main()
{
  //declaracion e inicializacion
  Punto J(45,-12);

  Punto *ptrQ;
  ptrQ = new Punto(5,7);

  Punto *arreglodePuntos;
  arreglodePuntos = new Punto[10];

  //imprimimos
  cout &amp;lt;&amp;lt; "J";
  J.imprimir();

  cout &amp;lt;&amp;lt; "ptrQ";
  ptrQ-&amp;gt;imprimir();
  for (int i = 0 ; i &amp;lt; 10 ; i++)

    {
      cout &amp;lt;&amp;lt; "arreglodePuntos[" &amp;lt;&amp;lt; i &amp;lt;&amp;lt;"]";
      arreglodePuntos[i].imprimir();

    }
  //liberamos
  delete ptrQ;
  delete [] arreglodePuntos;

  //fin
  return 0;
}
&lt;/pre&gt;
&lt;p&gt;Para compilar:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
g++ memDina.cpp -o memDina.out
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-113855345000744745?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/113855345000744745/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=113855345000744745' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/113855345000744745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/113855345000744745'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2006/01/memoria-dinamica-new-y-delete.html' title='Memoria dinamica: new y delete en C++'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-113815378338794896</id><published>2006-01-24T22:48:00.001-03:00</published><updated>2011-06-01T20:17:43.213-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='apuntadores'/><category scheme='http://www.blogger.com/atom/ns#' term='objetos'/><category scheme='http://www.blogger.com/atom/ns#' term='poo'/><category scheme='http://www.blogger.com/atom/ns#' term='clases'/><category scheme='http://www.blogger.com/atom/ns#' term='this'/><title type='text'>Apuntador this en C++</title><content type='html'>&lt;p&gt;Cuando hacemos una llamada a una función miembro de un objeto, el
compilador se encargará de pasar implícitamente como argumento: a un
  apuntador que contenga la dirección del objeto. &lt;/p&gt;
&lt;p&gt;A este apuntador se lo
llama, el apuntador &lt;code class="prettyprint"&gt;this&lt;/code&gt; (palabra reservada del lenguaje C++). Además
de este uso implícito por parte del compilador, se puede usar &lt;code class="prettyprint"&gt;this&lt;/code&gt;
  explícitamente para referirse al objeto.&lt;/p&gt;
&lt;p&gt;  Dependiendo del tipo de
  función en la cual se use &lt;code class="prettyprint"&gt;this&lt;/code&gt;,
  tendrá diferente tipo.&lt;/p&gt;
&lt;p&gt;En una función  miembro no constante:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
NomObjeto * const
//(apuntador constante a un objeto no constante)
&lt;/pre&gt;
&lt;p&gt;En una función miembro constante:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
const NomObjeto * const 
//(apuntador constante a un objeto constante) 
&lt;/pre&gt;
&lt;p&gt;A continuación veremos cómo utilizar el
  apuntador &lt;code class="prettyprint"&gt;this&lt;/code&gt;, 
  de manera implícita (como veníamos haciendolo) y de manera
  explícita. &lt;/p&gt;
&lt;p&gt;Cabe recalcar que cuando lo usemos de manera explícita,
  utilizaremos &lt;code class="prettyprint"&gt;-&amp;gt;&lt;/code&gt; (un menos y el mayor)
ya que se trata de un apuntador y no del objeto en sí dónde deberíamos
  usar simplemente el &lt;code class="prettyprint"&gt;.&lt;/code&gt; (punto).&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
#include &amp;lt;iostream&amp;gt;
using std::cout;

using std::endl;
class Prueba
{
 public:

  Prueba(int y = 0)
    {
      this-&amp;gt;x = y; //usamos apuntador this explicito.

    }
  int Obtener(void)
  {
    return x; //usamos apuntador this implicito

  }
 private:
  int x;
};

int main()

{
  Prueba objeto1(5);
  cout &amp;lt;&amp;lt; objeto1.Obtener() &amp;lt;&amp;lt; endl;

  return 0;
}

&lt;/pre&gt;
&lt;p&gt;Para compilar este programa utilizaremos:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
g++ apuntThis.cpp -o apuntThis.out
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-113815378338794896?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/113815378338794896/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=113815378338794896' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/113815378338794896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/113815378338794896'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2006/01/apuntador-this.html' title='Apuntador this en C++'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-113503885435782290</id><published>2005-12-19T21:33:00.001-03:00</published><updated>2011-06-01T20:17:47.270-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='poo'/><category scheme='http://www.blogger.com/atom/ns#' term='clases'/><category scheme='http://www.blogger.com/atom/ns#' term='funciones friend'/><category scheme='http://www.blogger.com/atom/ns#' term='amigas de clase'/><title type='text'>Clases y funciones Friend en C++</title><content type='html'>&lt;p&gt;Dentro de las clases podemos definir funciones (o clases) como &lt;em&gt;amigas
de la clase&lt;/em&gt;. Esto significa que le estamos dando acceso a una función
  (o clase) a que modifique los datos miembros de la clase.&lt;/p&gt;
&lt;p&gt; Esto es especialmente útil para la sobrecarga de operadores como veremos más
  adelante. &lt;/p&gt;
&lt;p&gt;Por el momento sólo diremos que una función (o clase) amiga
tiene acceso a los datos miembros de la clase que la declara como
  amiga.&lt;/p&gt;
&lt;p&gt; Para ilustrar ésto veremos el siguiente ejemplo.  Tenemos una
clase llamada &lt;code class="prettyprint"&gt;Numero&lt;/code&gt;, que consta de
  un dato miembro llamado &lt;code class="prettyprint"&gt;x&lt;/code&gt;. Tiene
una función pública &lt;code class="prettyprint"&gt;mostrar()&lt;/code&gt; que saca por pantalla el valor de
&lt;code class="prettyprint"&gt;x&lt;/code&gt;. Además declara una función amiga
llamada &lt;code class="prettyprint"&gt;establecer()&lt;/code&gt;, que recibe
el objeto a modificar y un número de punto flotante &lt;code class="prettyprint"&gt;double&lt;/code&gt; para
establecer el valor del objeto. &lt;/p&gt;
&lt;p&gt;Como vemos estamos utilizando la
función no a través del objeto sino pasandole el objeto pasado como
  parámetro.&lt;/p&gt;
&lt;p&gt;Ejemplo:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
#include &amp;lt;iostream&amp;gt;
using std::cout;
using std::endl;
class Numero
{
  friend void establecer(double ,Numero &amp;);//establecer es una funcion amiga.
 public:
  Numero(double);//constructor.
  void mostrar();
 private:
  double x;//dato miembro.
};

Numero::Numero(double b)
{
  x = b;
}
void Numero::mostrar()
{
  cout &amp;lt;&amp;lt; "El numero es: " &amp;lt;&amp;lt; x &amp;lt;&amp;lt; endl;
}
void establecer(double a, Numero &amp;objeto)
{
  objeto.x = a; //puede modificar el dato miembro porque es amiga.
}

int main()
{
  cout &amp;lt;&amp;lt; "Creamos el objeto Pi" &amp;lt;&amp;lt; endl;
  Numero Pi(7.8);
  Pi.mostrar();
  cout &amp;lt;&amp;lt; "Modificamos con la funcion amiga" &amp;lt;&amp;lt; endl;
  establecer(3.14,Pi);//utilizamos la funcion amiga.
  Pi.mostrar();
  return 0;
}
&lt;/pre&gt;
&lt;p&gt;Para compilar:&lt;/p&gt;
&lt;pre class="prettyprint"&gt;
g++ ejFriend.cpp -o ejFriend.out
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-113503885435782290?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/113503885435782290/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=113503885435782290' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/113503885435782290'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/113503885435782290'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2005/12/clases-y-funciones-friend.html' title='Clases y funciones Friend en C++'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-116579190274441173</id><published>2005-12-10T20:03:00.001-03:00</published><updated>2011-06-01T20:17:52.276-03:00</updated><title type='text'>Parámetros por línea de comandos argc y argv en C++</title><content type='html'>Para poder pasar par&amp;#225;metros a un programa a trav&amp;#233;s de la l&amp;#237;nea de comandos nos valemos de la siguiente declaraci&amp;#243;n de la funci&amp;#243;n main:
&lt;pre&gt;int main(int argc, char *argv[])&lt;/pre&gt;
El primer agumento entero argc, contiene el n&amp;#250;mero de argumentos recibidos por el programa, debemos considerar que siempre ser&amp;#225; el n&amp;#250;mero de argumentos pasados m&amp;#225;s 1, ya que el primer agumento se reserva para contener el nombre del programa.
El segundo es un apuntador a un array de chars que contiene los par&amp;#225;metros pasados en el mismo orden en que fueron escritors.
Supongamos que llamemos a un programa de la siguiente manera:
&lt;pre&gt;./mcd entero1 entero2&lt;/pre&gt;
&lt;em&gt;argc&lt;/em&gt; contendr&amp;#225; el valor 3, debido al nombre del programa, y los dos argumentos pasados.
&lt;em&gt;argv[0]&lt;/em&gt; contendr&amp;#225; el valor mcd
&lt;em&gt;arg[1]&lt;/em&gt; ser&amp;#225; entero1
&lt;em&gt;arg[2]&lt;/em&gt; ser&amp;#225; entero2
&lt;em&gt;arg[3]&lt;/em&gt; ser&amp;#225; un puntero NULL
Utilicemos el ejemplo del &lt;a href="http://codigomaldito.blogspot.com/1998/11/algoritmo-de-euclides-c.html"&gt;algoritmo de euclides&lt;/a&gt;, para calcular fracciones a su m&amp;#237;nima expresi&amp;#243;n pero esta vez recibiremos los par&amp;#225;metros por l&amp;#237;nea de comandos:
&lt;pre class="pre"&gt;
&lt;font color="0000ff"&gt;&lt;strong&gt;#include &lt;font color="#008000"&gt;&amp;lt;iostream&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;
&lt;font color="#444444"&gt;//#include &amp;lt;cstdlib&amp;gt;&lt;/font&gt;
&lt;strong&gt;using&lt;/strong&gt; &lt;strong&gt;namespace&lt;/strong&gt; &lt;font color="#2040a0"&gt;std&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;
&lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;mcd&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;x&lt;/font&gt;,&lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;y&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;
  &lt;strong&gt;return&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="#2040a0"&gt;y&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt; ? &lt;font color="#2040a0"&gt;x&lt;/font&gt; &lt;font color="4444FF"&gt;:&lt;/font&gt; &lt;font color="#2040a0"&gt;mcd&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;y&lt;/font&gt;,&lt;font color="#2040a0"&gt;x&lt;/font&gt;&lt;font color="4444FF"&gt;%&lt;/font&gt;&lt;font color="#2040a0"&gt;y&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;
&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;
&lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;main&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;argc&lt;/font&gt;, &lt;strong&gt;char&lt;/strong&gt; &lt;font color="4444FF"&gt;*&lt;/font&gt;&lt;font color="#2040a0"&gt;argv&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;
&lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;
  &lt;strong&gt;if&lt;/strong&gt; &lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;argc&lt;/font&gt; &lt;font color="4444FF"&gt;!&lt;/font&gt;&lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#FF0000"&gt;3&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;
    &lt;font color="#2040a0"&gt;cout&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#008000"&gt;&amp;quot;Uso: mcd entero1 entero2&lt;font color="#77dd77"&gt;\n&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;
  &lt;strong&gt;else&lt;/strong&gt;
    &lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;
      &lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;a&lt;/font&gt;,&lt;font color="#2040a0"&gt;b&lt;/font&gt;,&lt;font color="#2040a0"&gt;MCD&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;
      &lt;font color="#2040a0"&gt;a&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;atoi&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;argv&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="#FF0000"&gt;1&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;
      &lt;font color="#2040a0"&gt;b&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;atoi&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;argv&lt;/font&gt;&lt;font color="4444FF"&gt;[&lt;/font&gt;&lt;font color="#FF0000"&gt;2&lt;/font&gt;&lt;font color="4444FF"&gt;]&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;
      &lt;font color="#2040a0"&gt;MCD&lt;/font&gt; &lt;font color="4444FF"&gt;=&lt;/font&gt; &lt;font color="#2040a0"&gt;mcd&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="#2040a0"&gt;a&lt;/font&gt;,&lt;font color="#2040a0"&gt;b&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;
      &lt;font color="#2040a0"&gt;cout&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;a&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#008000"&gt;&amp;quot;/&amp;quot;&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;b&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#008000"&gt;&amp;quot; = &amp;quot;&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;a&lt;/font&gt;/&lt;font color="#2040a0"&gt;MCD&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#008000"&gt;&amp;quot;/&amp;quot;&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;b&lt;/font&gt;/&lt;font color="#2040a0"&gt;MCD&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;endl&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;
    &lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;
  &lt;strong&gt;return&lt;/strong&gt; &lt;font color="#FF0000"&gt;0&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;
&lt;font color="4444FF"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;
&lt;/pre&gt;
Para compilar hacemos:
&lt;pre class="pre"&gt;
g++ mcd.cpp -o mcd
&lt;/pre&gt;
Una salida del programa y su llamada:
&lt;pre class="pre"&gt;
/home/chulo/programacion $ ./mcd 45 55
45/55 = 9/11
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/17253682-116579190274441173?l=codigomaldito.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://codigomaldito.blogspot.com/feeds/116579190274441173/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=17253682&amp;postID=116579190274441173' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/116579190274441173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/17253682/posts/default/116579190274441173'/><link rel='alternate' type='text/html' href='http://codigomaldito.blogspot.com/2005/12/parmetros-por-lnea-de-comandos-argc-y.html' title='Parámetros por línea de comandos argc y argv en C++'/><author><name>santi</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-17253682.post-116569830478929695</id><published>2005-12-09T18:03:00.001-03:00</published><updated>2011-06-01T20:17:56.637-03:00</updated><title type='text'>Tipos de datos primitivos en C++</title><content type='html'>Los tipos de datos primitivos m&amp;#225;s comunes de C++&lt;table border="1"&gt;  &lt;tbody&gt;    &lt;tr&gt;      &lt;th&gt;Nombre&lt;/th&gt;      &lt;th&gt;Descripci&amp;#243;n&lt;/th&gt;      &lt;th&gt;Tama&amp;#241;o*&lt;/th&gt;      &lt;th&gt;Rango de valores*&lt;/th&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;tt&gt;char&lt;/tt&gt;&lt;/td&gt;      &lt;td&gt;Car&amp;#225;cter o entero peque&amp;#241;o.&lt;/td&gt;      &lt;td&gt;1byte&lt;/td&gt;      &lt;td&gt;con signo: -128 to 127&lt;br /&gt;sin signo: 0 a 255&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;tt&gt;short int&lt;/tt&gt;&lt;br /&gt;(&lt;tt&gt;short&lt;/tt&gt;)&lt;/td&gt;      &lt;td&gt;Entero corto.&lt;/td&gt;      &lt;td&gt;2bytes&lt;/td&gt;      &lt;td&gt;con signo: -32768 a 32767&lt;br /&gt;sin signo: 0 a 65535&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;tt&gt;int&lt;/tt&gt;&lt;/td&gt;      &lt;td&gt;Entero.&lt;/td&gt;      &lt;td&gt;4bytes&lt;/td&gt;      &lt;td&gt;con signo: -2147483648 a 2147483647&lt;br /&gt;sin signo: 0 a 4294967295&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;tt&gt;long int&lt;/tt&gt;&lt;br /&gt;(&lt;tt&gt;long&lt;/tt&gt;)&lt;/td&gt;      &lt;td&gt;Entero largo.&lt;/td&gt;      &lt;td&gt;4bytes&lt;/td&gt;      &lt;td&gt;con signo: -2147483648 a 2147483647&lt;br /&gt;sin signo: 0 a 4294967295&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;tt&gt;bool&lt;/tt&gt;&lt;/td&gt;      &lt;td&gt;Valor booleano. Puede tomar dos valores: verdadero ofalso.&lt;/td&gt;      &lt;td&gt;1byte&lt;/td&gt;      &lt;td&gt;true o false&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;tt&gt;float&lt;/tt&gt;&lt;/td&gt;      &lt;td&gt;N&amp;#250;mero de punto flotante.&lt;/td&gt;      &lt;td&gt;4bytes&lt;/td&gt;      &lt;td&gt;3.4e +/- 38 (7 digitos)&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;tt&gt;double&lt;/tt&gt;&lt;/td&gt;      &lt;td&gt;De punto flotante de doble precisi&amp;#243;n.&lt;/td&gt;      &lt;td&gt;8bytes&lt;/td&gt;      &lt;td&gt;1.7e +/- 308 (15 digitos)&lt;/td&gt;    &lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;&lt;tt&gt;long double&lt;/tt&gt;&lt;/td&gt;      &lt;td&gt;Long de punto flotante de doble precisi&amp;#243;n.&lt;/td&gt;      &lt;td&gt;8bytes&lt;/td&gt;      &lt;td&gt;1.7e +/- 308 (15 digitos)&lt;/td&gt;    &lt;/tr&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;* Los valores dependen de la arquitectura utilizada. Losmostrados son los que generalmente se encuentran en unam&amp;#225;quina t&amp;#237;pica de arquitectura 32 bits.&lt;/p&gt;
Si quieres conocer que tamaños ocupan los tipos de datos en un ordenador específico puedes compilar y ejecutar este programa en tu propia máquina que te dará resultados expresados en bytes. Nos valemos de la función sizeof ( tipoDedato ), para presentar una tabla con tales resultados.
&lt;pre class="pre"&gt;&lt;font color="0000ff"&gt;&lt;strong&gt;#include &lt;font color="#008000"&gt;&amp;lt;iostream&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;
&lt;strong&gt;using&lt;/strong&gt; &lt;font color="#2040a0"&gt;std&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="#2040a0"&gt;cout&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;
&lt;strong&gt;using&lt;/strong&gt; &lt;font color="#2040a0"&gt;std&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="#2040a0"&gt;endl&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;
&lt;font color="0000ff"&gt;&lt;strong&gt;#include &lt;font color="#008000"&gt;&amp;lt;iomanip&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;
&lt;strong&gt;using&lt;/strong&gt; &lt;font color="#2040a0"&gt;std&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="4444FF"&gt;:&lt;/font&gt;&lt;font color="#2040a0"&gt;setw&lt;/font&gt;&lt;font color="4444FF"&gt;;&lt;/font&gt;
&lt;strong&gt;int&lt;/strong&gt; &lt;font color="#2040a0"&gt;main&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt;&lt;font color="4444FF"&gt;)&lt;/font&gt;
&lt;font color="4444FF"&gt;&lt;strong&gt;{&lt;/strong&gt;&lt;/font&gt;

  &lt;font color="#2040a0"&gt;cout&lt;/font&gt;    &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#008000"&gt;&amp;quot;Tipo de dato&amp;quot;&lt;/font&gt;  &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;setw&lt;/font&gt;&lt;font color="4444FF"&gt;(&lt;/font&gt; &lt;font color="#FF0000"&gt;18&lt;/font&gt; &lt;font color="4444FF"&gt;)&lt;/font&gt; &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#008000"&gt;&amp;quot;Tamano&amp;quot;&lt;/font&gt;              &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#2040a0"&gt;endl&lt;/font&gt;  
   &lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt;&lt;font color="4444FF"&gt;&amp;lt;&lt;/font&gt; &lt;font color="#008000"&gt;&amp;quo
