miércoles, 24 de septiembre de 2014

Que es java, JVM y compilador

¿Que es JAVA? 

Java es un lenguaje de programación de propósito general, concurrente, orientado a objetos y basado en clases que fue diseñado específicamente para tener tan pocas dependencias de implementación como fuera posible. 
Fue originalmente desarrollado por James Gosling de Sun Mycrosistems. Las aplicaciones de Java son generalmente compiladas en bytecode (clase java) que puede ejecutarse en cualquier maquina virtual java (JVM) sin importar la arquitectura de la computadora subyacente.
Se creo con cinco objetivos principales, que son: 
  1. Debería usar el paradigma de la programación orientada a objetos.
  2. Debería permitir la ejecución de un mismo programa en múltiples sistemas operativos.
  3. Debería incluir por defecto soporte para trabajo en red.
  4. Debería diseñarse para ejecutar código en sistemas remotos de forma segura.
  5. Debería ser fácil de usar y tomar lo mejor de otros lenguajes orientados a objetos. 

¿Que es Maquina Virtual Java (JVM) ?

Una maquina virtual java, es una maquina virtual de procesos nativo, es decir, ejecutable en una plataforma especifica, capaz de interpretar y ejecutar instrucciones expresadas en código binario especial. Es el entorno en el que se ejecutan los programas Java, su misión principal es la de garantizar la potabilidad de las aplicaciones.
Las tareas principales de la JVM son: 
  1. Reservar espacio en memoria para los objetos creados.
  2. Liberar la memoria no usada.
  3. Asignar variables a registros.
  4. Llamar al sistema huésped para ciertas funciones, como los accesos a los dispositivos.
  5. Vigilar el cumplimiento de las normas de seguridad de las aplicaciones Java.




¿Que es un compilador ?

Es un programa que recibe como datos de entrada el código fuente de un programa escrito por un programador, y genera como salida un conjunto de instrucciones escritas en el lenguaje binario de la computadora donde se va a trabajar. 





sábado, 30 de agosto de 2014

Estructuras de control

Estructuras de control

Una estructura de control determina la secuencia de ejecución de las sentencias de un programa. Estas estructuras se dividen en 3 categorias:
  1. Secuencial.
  2. Condicional o selectiva.
  3. Iterativa o repetitiva.

1. Estructura secuencial. 

Las secuencias se ejecutan en secuencia, una después de otra, en el orden en que aparecen escritas dentro del programa. Esta formada por una sucesión de instrucciones que se ejecutan en orden una a continuación de la otra. 
Cada instrucciones esa separa por el punto y coma ( ; ) y se suelen agrupar en bloques, el bloque de sentencias se define por el carácter llave de apertura ( { ) para marcar el inicio del mismo y el caracter de llave de cierre ( } ) para marcar el final. Ejemplo: 

{
     instrucción 1;
     instrucción 2;
     instrucción 3;
}  

2. Estructura condicional, alternativa o selectiva. 

Determina si se ejecutan unas instrucciones u otras según se cumpla o no determinada  condición. La estructura condicional se implementa mediante: 
  • Instrucciones if.
  • Instrucción switch.
  • Operador condicional ?.

2.1 Instrucción if 

Puede ser del tipo:
  • Condicional simple: if
  • Condicional doble: if.....else.....
  • Condicional múltiple: if...else if...
La condición debe ser una expresión booleana es decir debe dar como resultado un valor booleano (true ó false). 

Condicional simple: Se evalúa la condición y si ésta se cumple se ejecuta una determinada acción o grupo de acciones. En caso contrario se saltan dicho grupo de acciones. Ejemplo:

if(expresión booleana){
    instrucción 1
    instrucción 2
    .......
}

Condicional doble: Se evalúa la condición y si ésta se cumple se ejecuta una determinada instrucción o grupo de instrucciones. Si no se cumple se ejecuta otra instrucción o grupo de instrucciones.

if(expresión booleana){
    instrucciones 1
}
else{
        instrucciones 2
}

Condicional multiple: Se obtiene anidando sentencias if ... else. Permite construir estructuras de selección mas complejas.

if (expresion_boolena1) 
            instrucción1;
else if (expresion_booleana2)
            instrucción2;
       else
            instrucción3;

Cada else se corresponde con el if más próximo que no haya sido emparejado.
Una vez que se ejecuta un bloque de instrucciones, la ejecución continúa en la siguiente instrucción que aparezca después de las sentencias if .. else anidadas.

2.2 Instrucción switch. 

Se utiliza para seleccionar una de entre múltiples alternativas.
La forma general de la instrucción switch es la siguiente: 

switch (expresión){
case valor 1:
instrucciones;
break;
case valor 2:
instrucciones;
break;
· · ·
default:
instrucciones;
} 

Funcionamiento de la instrucción switch:
  1. Se evalúa la expresión y salta al case cuya constante coincida con el valor de la expresión.
  2. Se ejecutan las instrucciones que siguen al case selecciona hasta que se encuentra un break o hasta el final del switch. El break produce un saldo a la siguiente instrucción.
  3. Si ninguno de estos casos se cumple se ejecuta el bloque default (si existe).

2.3 Operador condicional ? : .

Se puede utilizar en sustitución de la sentencia de control if-else, se conformas por los caracteres ? y :. Se utiliza de la forma siguiente: expresión 1 ? expresión2 : expresión3.
Si expresión1 es cierta entonces se evalúa expresión2  y éste sera el valor de la expresión condicional. Si expresión1 es falsa, se evalúa expresión3  y éste será el valor de la expresión condicional.

3. Estructura iterativa o repetitiva.

Permiten que se ejecuten de forma repetida un bloque específico de instrucciones, estas instrucciones se repiten mientras o hasta que se cumpla cierta condición, esta condición se conoce como condición de salida, existen 3 tipos de estructuras repetitivas: 
  1. Ciclo while.
  2. Ciclo do-while.
  3. Ciclo for.

3.1 Ciclo while

Las instruciones se repiten mientras la condición sea cierta, esta condición se comprueba al principio del bucle por lo que estas acciones se pueden repetir 0 o mas veces.
La ejecución de un bucle while sigue los siguientes pasos:

1. Se evalúa la condición.
2. Si el resultado es false las instrucciones no se ejecutan y el programa sigue ejecutándose por la siguiente instrucción a continuación del while.
3. Si el resultado es true se ejecutan las instrucciones y se vuelve al paso 1.

3.2 Ciclo do-while

Las instrucciones se ejecutan mientras la condición sea cierta.La condición se comprueba al final del bucle por lo que el bloque de instrucciones se ejecutarán al menos una vez.La ejecución de un bucle do - while sigue los siguientes pasos:1.    Se ejecutan las instrucciones a partir de do{2.    Se evalúa la condición.3. Si el resultado es false el programa sigue ejecutándose por la siguiente instrucción a continuación del while.4.    Si el resultado es true se vuelve al paso 1.

3.3 Ciclo for 


Hace que una instrucción o bloque de instrucciones se repitan un número determinado de veces mientras se cumpla la condición.

La estructura general de una instrucción for en Java es la siguiente:
for(inicialización; condición; incremento/decremento){
instrucción 1;
...........
instrucción N;
}
A continuación de la palabra for y entre paréntesis debe haber siempre tres zonas
separadas por punto y coma:
-  Zona de inicialización.
-  Zona de condición
-  Zona de incremento ó decremento.
Si en alguna ocasión no es necesario escribir alguna de ellas se pueden dejar en blanco, pero los dos punto y coma deben aparecer.

Inicialización: Es la parte en la que la variable o variables de control del bucle toman su valor inicial.

Condición: Es una expresión booleana que hace que se ejecute la sentencia o bloque de sentencias mientras que dicha expresión sea cierta.

Incremento/decremento: Es una expresión que decrementa o incrementa la variable de control del bucle.
La ejecución de un bucle for sigue los siguientes pasos:
1. Se inicializa la variable o variables de control (inicialización)
2. Se evalúa la condición.
3. Si la condición es cierta se ejecutan las instrucciones. Si es falsa, finaliza la ejecución del bucle y continúa el programa en la siguiente instrucción después del for.
4. Se actualiza la variable o variables de control (incremento/decremento)
5. Se vuelve al punto 2.



Operadores lógicos y Aritméticos en JAVA

Operadores lógicos y Aritméticos en JAVA

Operadores Lógicos:

En Java disponemos de los operadores lógicos habituales en los lenguajes de programación como son "es igual", "es distinto" , menor, menor o igual, mayor, mayor o igual, and (&), or (o) y not (!). 


Los operadores && y || se llaman operadores en corto circuito porque si no se cumple la condición de un término no se evalúa el resto de la operación.
El operador ! se recomienda no utilizarlo hasta que se tenga cierta destreza en programación.

Orden de prioridad, prelación o precedencia.

Los operadores lógicos y matemáticos tienen un orden de prioridad o precedencia. Este es un esquema general en el orden en que deben de evaluarse en la mayoría de los lenguajes de programación.























Operadores Aritméticos

En Java disponemos de los operadores aritméticos habituales en lenguajes de programación como son suma, resta, multiplicación, división y operador que devuelve el resto de una división entre enteros. 



Destacamos que el operador % es de uso exclusivo entre enteros. Al valor obtenido lo denominamos módulo y a este operador se le denomina "operador módulo". 

Aunque en otros lenguajes existe un operador de exponenciación, en Java no es así. Para calcular una potencia podemos hacer varias cosas:
a) Recurrir a multiplicar n veces el término. Por ejemplo min3 lo podemos calcular como min*min*min. Obviamente esto no es práctico para potencias de exponentes grandes.
b) Usar un bucle que dé lugar a la repetición de la operación multiplicación n veces, o usar un método que ejecute la operación. Estas opciones las comentaremos más adelante.
c) Usar herramientas propias del lenguaje que permiten realizar esta operación. Esta opción la comentaremos más adelante.

Las operaciones con operadores siguen un orden de prelación o de precedencia que determinan el orden con el que se ejecutan. Si existen expresiones con varios operadores del mismo nivel, la operación se ejecuta de izquierda a derecha. Para evitar resultados no deseados, en casos donde pueda existir duda se recomienda el uso de paréntesis para dejar claro con qué orden deben ejecutarse las operaciones.



lunes, 25 de agosto de 2014

Diagramas de Flujo

Introducción 

Los Diagramas de flujo son una serie de pasos secuenciales que representan de una manera tradicional los detalles algorítmicos de los procesos; dichos diagramas tienen una nomenclatura simbólica con significados especiales. 

En las representaciones gráficas de procesos con símbolos, estos se interconectan para que en conjunto le den un sentido lógico al diagrama de flujo el cual da pie al desarrollo de un sistema de información.

Un diagrama de flujo se puede mostrar como un análisis estructurado de la transformación de datos de un sistema, mediante una descripción pictórica. 

Diagrama de flujo

Un diagrama de flujo es una representación pictórica de un algoritmo o de una parte del mismo, ayudan en la comprensión de la operación de las estructuras de control (Si, Mientras).Útil para determinar como funciona realmente el proceso para producir un resultado. Al examinar como los diferentes pasos en un proceso se relacionan entre sí, se puede descubrir con frecuencia las fuentes de problemas potenciales. 

Se basan en la utilización de diversos símbolos para representar operaciones específicas. Se les llama diagramas de flujo porque los símbolos utilizados se conectan por medio de flechas para indicar la secuencia de operación. La simbología utilizada para la elaboración de diagramas de flujo es variable y debe ajustarse a un patrón definido previamente.

Un diagrama de flujo (flowchart) es una de las técnicas de representación de algoritmos más antigua y a la vez más utilizada, aunque su empleo ha disminuido considerablemente, sobre todo desde la aparición de lenguajes de programación estructurados.
Los símbolos estándar normalizados por ANSI (abreviatura de American National Standard Institute ) son muy variados:







Clasificación por intercambio directo (Burbuja). 

El método de intercalación directo, conocido coloquialmente con el nombre de la burbuja, es el más utilizado entre los estudiantes de computación, por su fácil compresión y programación. Pero es preciso señalar que es probablemente el método más ineficiente. 

Puede trabajar de 2 maneras diferentes :


  • Llevando los elementos más pequeños hacia la parte izquierda del arreglo


  • llevando los elementos más grandes hacia la parte derecha del mismo.
La idea básica de este algoritmo consiste en comparar pares de elementos adyacentes e intercambiarlos entre sí hasta que todos se encuentran ordenados. Se realizan (n-1) pasadas, transportando en cada una de las mismas el menor o mayor elemento (según sea el caso) a su posición ideal. Al final de las (n-1) pasadas los elementos del arreglo estarán ordenados. 




Ventajas: 
  • Fácil implementación.
  • No requiere memoria adicional.

Desventajas:
  • Muy lento.
  • Realiza numerosas comparaciones.
  • Realiza numerosos intercambios.


Ejemplo del ordenamiento burbuja 



Búsqueda Secuencial:

A este método tan bien se le conoce como búsqueda lineal y consiste en empezar al inicio del conjunto de elementos, e ir a través de ellos hasta encontrar el elemento indicado ó hasta llegar al final de arreglo.

Mejoras en la eficiencia de la búsqueda secuencial:
  1. Muestreo de Acceso: Consiste en observar que tan frecuentemente se solicita cada registro y ordenarlos de acuerdo a las probabilidades de acceso detectadas. 
  2. Movimiento hacia el frente: Consiste en que la lista de registros se reorganicen dinámicamente. Con este método, cada vez que búsqueda de una llave sea exitosa, el registro correspondiente se mueve a la primera posición de la lista y se recorren una posición hacia abajo los que estaban antes que el.
  3. Transposición: consiste en que, cada vez que se lleve a cabo una búsqueda exitosa, el registro correspondiente se intercambia con el anterior. Con este procedimiento, entre mas accesos tenga el registro, mas rápidamente avanzara hacia la primera posición. 
  4. Ordenamiento: Una forma de reducir el numero de comparaciones esperadas cuando hay una significativa frecuencia de búsqueda sin éxito es la de ordenar los registros en base al valor de la llave. 
































Busqueda binaria o dicotómica 

La búsqueda binaria utiliza un método de “divide y vencerás” para localizar el valor deseado. Con este método se examina primero el elemento central de la lista; si este es el elemento buscado, entonces la búsqueda ha terminado. En caso contrario se determina si el elemento buscado está en la primera o segunda mitad de la lista y a continuación se repite este proceso, utilizando el elemento central de esa sudlista.
Este método consiste en lo siguiente: comparar el elemento buscado con el elemento situado en la mitad del arreglo, si tenemos suerte y los dos valores coinciden, en ese momento la búsqueda termina. Pero como existe un alto porcentaje de que esto no ocurra, repetiremos los pasos anteriores en la mitad inferior del arreglo si el elemento que buscamos resulto menor que el de la mitad del arreglo, o en la mitad superior si el elemento buscado fue mayor.
La búsqueda termina cuando encontramos el elemento o cuando el tamaño del arreglo a examinar sea cero.














domingo, 24 de agosto de 2014

Paradigmas de Progamación

Paradigmas de programación

Historia

El origen de la palabra paradigma entendida como un marco general en el que se desarrollan teorías científicas se encuentran en el trabajo de 1962 del filosofo e historiador de la ciencia Thomas S. Kuhn "La estructura de las revoluciones científicas. 
La palabra paradigma ha sido adoptada por el mundo de la computación para definir un conjunto de ideas y principios comunes de grandes grupos de lenguajes de programación.
1954- Primer lenguaje de programación cientifica,  el Fortran I, fue diseñado por John Backus en IBM, este tipo de programación se preocupa especialmente de la realización de cálculos complejos de forma muy rápida y precisa. 

Ejemplos de paradigmas de programación


Paradigmas Imperativos: Consiste en un gran almacenamiento de memoria donde la computadora almacena una representación codificada de un cálculo y ejecuta una secuencia de comandos que modifican el contenido de ese almacenamiento. Describe una programación como un flujo de instrucciones o comandos que van formando la estructura del software. Algoritmos + estructura de datos = Programa. Lenguajes: Basic, C, Fortran, Pascal, PHP, Java. 



Paradigmas procedimentales: Estos siguen una secuencia computacional realizada etapa a etapa para resolver un problema. Su mayor dificultad reside en determinar si el valor computado es una solución correcta del programa. Los paradigmas procedimentales definen la secuencia explicitamente, pero esta secuencia se puede procesar en serio o paralelo, en este segundo caso el procesamiento paralelo puedes ser asincronico (cooperación de procesos paralelos) o sincrónico (proceso simple aplicado simultáneamente a muchos objetos).  Lenguaje: C 






















Paradigmas Declarativos: Se construye señalando hechos, reglas, restricciones, ecuaciones, transformaciones y otras propiedades derivadas del conjunto de valores que configuran la solución. La solución es obtenida mediante mecanismos internos de control , sin especificar exactamente, cómo encontrarla. Lenguajes: Prolog, Maude, SQL, Haskell.













Paradigmas Demostrativos: El programador en lugar de especificar prodecimentalmente como lograr una solución, propone soluciones de problemas y permite al sistema generalice una solución procedimental a partir de tales demostraciones. En este modelo, una solución basada en la inferencia tratará de determinar por una parte los aspectos similares, un grupo de datos u objetos y a partir de estos generar similitudes. 


Paradigmas Funcionales: Modelo matemático de composición funcional donde el resultado de un cálculo es la entrada del siguiente, y así sucesivamente hasta que una composición produce el valor deseado. El objetivo es conseguir lenguajes expresivos y matemáticamente  elegantes, en los que no es necesario bajar al nivel de la máquina para describir el proceso llevado acabo por el programa. Algunos lenguajes son: Haskell, Miranda, Scala, Lisp.