jueves, 14 de febrero de 2008

Lenguajes Scripts

Es un lenguaje de programación creado por Netscape con el objetivo de integrarse a HTML y facilitar la creación de paginas interactivas sin necesidad de utilizar scripts de CGI o Java.
El código de un programa de Java Script se integra directamente al código de un documento HTML y no necesita ser compilado, es el propio navegador el encargado de traducir dicho código. Es importante hacer referencia que Java Script no es el lenguaje de programación Java.
Para definir un código en Java Script se tienen las siguientes etiquetas :
Los códigos de Java Script se pueden colocar en la cabecera o en el cuerpo del documento, es importante tener presente que Java Script es un lenguaje de programación Case Sensitive, es decir distingue las letras mayúsculas de las minúsculas, por lo tanto las variables: Resultado. Resultado, RESULTADO serán vistas por Java Script como diferentes.

Las llaves { … } se emplean para definir fragmentos de código o bloques. El punto y coma es empleado para separar sentencias que se encuentran en una sola línea o también para indicar el final de una sentencia que ocupa varias líneas.

Los lenguajes de scripting tienen la característica que se ejecutan mediante un intérprete del lenguaje, en tiempo real. Esto quiere decir que tienes el código fuente, lo corres con el intérprete y te genera la salida. Los "otros" se diferencian en que deben ser compilados para que se cree un archivo binario que pueda ser entendido por la máquina (el binario contiene la información en lenguaje de máquina, que el computador entiende directamente). Además, debe ser compilado para cada arquitectura y sistema operativo; no existe un binario universal que corra en todos, como si ocurre en el lenguaje de scripting (tienes el interprete y corres el script en cada sistema operativo, mientras tengas el intérprete)Existe un término intermedio que es lo que usa java y .NET: un bytecode, que es código compilado intermedio, no para máquina que luego se carga en una máquina virtual. Por eso las clases de java pueden correr en cualquier computadora que tenga el intérprete de java, y además están "pseudo compilados"Sobre los paradigmas no hay diferencia ya que existen lenguajes de scripting orientados a objetos, como python, ruby, perl, etc. (si, python es lenguaje de scripting aunque tengo entendido que te permite generar un bytecode)XML no es un lenguaje de programación; es un standar para el traspaso de información entre diferentes actores participantes. Piensalo como un lenguaje universal de contenidos, cosa que diferentes lenguajes, sistemas operativos, etc., puedan interactuar.

leguajes Imperactivos

Lenguajes imperativos
En ciencias de la computación se llama lenguajes imperativos a aquellos en los cuales se le ordena a la computadora cómo realizar una tarea siguiendo una serie de pasos o instrucciones, p. ej.
Paso 1, solicitar número.
Paso 2, multiplicar número por dos.
Paso 3, imprimir resultado de la operación.
Paso 4, etc,

Algunos ejemplos de lenguajes imperativos son: BASIC, C, C++, Java, C# y Perl.
Los lenguajes convencionales basados en el modelo computacional de Von Newman se llaman imperativos, basados en instrucciones o, simplemente, lenguajes Von Newman; Basic, Pascal, Fortran y Lenguaje C fueron los lenguajes imperativos de mayor influencia cuando aparecieron.
Lenguajes imperativos

1. FORTRAN
COBOL
ALGOL 60 --------
-------------------------------------------------------------------------

BASIC ALGOL 68 Pascal PL/I SIMULA BCPL
------------------ ---------------------------------------
-----------------
CLU Modula Smalltalk 72 C
-----------------------------
Ada Smalltalk 80 -----------
Object Pascal ----------------
Eiffel Smalltalk V Objective C C++
------------------------------------------

OOPL/I OOCOBOL
IMPERATIVOS O PROCEDURALES, almacenan los datos en variables sobre los que realizan operaciones
Proceso compilaron: C++
Programación funcional
Los lenguajes funcionales se basan en el concepto de función, por tanto, el objeto básico y fundamental que manejamos son las funciones, que se pueden considerar las principales estructuras de control en este tipo de lenguajes.
La base fundamental para comprender este tipo de lenguajes consiste en ver los programas y aplicaciones expresados a través de funciones y aplicación entre funciones.
Las características fundamentales de estos lenguajes se exponen a continuación:
Utilización de funciones sobre elementos de primer orden.
Utilización de funciones polimórficas, es decir, aquéllas cuyo tipo devuelto depende del tipo de los argumentos.
Utilización de funciones de orden superior, es decir, aquellas funciones que aceptan en su lista de argumentos otras funciones.
Evaluación perezosa (o lazy), es decir, las expresiones no se evalúan hasta que no se necesitan los resultados. Es justamente, lo contrario de la evaluación eager(ansiosa), donde la evaluación de los argumentos se realiza antes de aplicar la función. La evaluación perezosa nos proporciona la ventaja de trabajar con listas potencialmente infinitas.
Existencia de un sistema de tipos fuerte
Uso del Patter Matching: comprobación de patrones.
Vistas las características fundamentales de los lenguajes funcionales, estos pueden clasificarse en dos tipos:
Puros: aquellos en los que sólo podemos aplicar funciones. Estas son las únicas estructuras de control. Posee evaluación perezosa.
Impuros: aquellos que poseen evaluación ansiosa.
2. LISP
---------------------------

LOOPS Plasma INTERLISP Scheme
FUNCIONALES, utilizan funciones para la descripción de los procedimientos.

Programación lógica
La Programación Lógica es un Paradigma de Programación basado en la Lógica.
Los programas construidos un lenguaje lógico están construidos únicamente por expresiones lógicas, es decir, que son ciertas o falsas, en oposición a un expresión interrogativa (una pregunta) o expresiones imperativas (una orden).
Un ejemplo de lenguaje lógico es Prolog (Programación lógica).
Programación orientada a objetos
La programación Orientada a Objetos (POO) es una metodología de diseño de software y un paradigma de programación que define los programas en términos de "clases de objetos", objetos que son entidades que combinan estado (es decir, datos) y comportamiento (esto es, procedimientos o métodos). La programación orientada a objetos expresa un programa como un conjunto de estos objetos, que se comunican entre ellos para realizar tareas. Esto difiere de los lenguajes procedurales tradicionales, en los que los datos y los procedimientos estan separados y sin relación. Estos métodos están pensados para hacer los programas y módulos más fáciles de escribir, mantener y reutilizar.
La programación orientada a objetos (OOP, por las siglas inglesas de Object-Oriented Programming) es una nueva forma de programar que proliferó a partir de los años ochenta y trata de encontrar solución a estos problemas utilizando los siguientes conceptos:
Objetos: entidades complejas provistas de datos (propiedades, atributos) y comportamiento (funcionalidad, programas, métodos).
Corresponden a los objetos reales del mundo que nos rodea.
Clases: conjuntos de objetos que comparten propiedades y comportamiento.
Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen.
Encapsulamiento: cada objeto está aislado del exterior, es un módulo natural, y la aplicación entera se reduce a un agregado o rompecabezas de objetos. El aislamiento protege a los datos asociados a un objeto contra su modificación por quien no tenga derecho a acceder a ellos, eliminando efectos secundarios e interacciones.
Polimorfismo: programas diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, aunque el significado del programa varíe según el objeto al que se aplica.
La programación orientada a objetos introduce nuevos conceptos, que a veces no son más que nombres nuevos aplicados a conceptos antiguos, ya conocidos. Entre ellos destacan los siguientes:
Método: es un programa asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena mediante un "mensaje".
Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros.
Propiedad, atributo o variable: datos asociados a un objeto o a una clase de objetos.
Los LENGUAJES ORIENTADOS A OBJETOS, encapsulan los datos junto a los procediéndoos que los procesan.

Lenguaje Orientado a objeto

Se le llama así a cualquier lenguaje de programación que implemente los conceptos definidos por la programación orientada a objetos.
Cabe notar que los conceptos definidos en la
programación orientada a objetos no son una condición sino que son para definir que un lenguaje es orientado a objetos. Existen conceptos que pueden estar ausentes en un lenguaje dado y sin embargo, no invalidar su definición como lenguaje orientado a objetos.
Quizás las condiciones mínimas necesarias las provee el
formalismo que modeliza mejor las propiedades de un sistema orientado a objetos: los tipos de datos abstractos.
Siguiendo esa idea, cualquier lenguaje que permita la definición de
tipos de datos , de operaciones nuevas sobre esos tipos de datos, y de instanciar el tipo de datos podría ser considerado orientado a objetos.
Esta definición concuerda incluso con ciertos ejemplos prácticos, que no son considerados dentro de la
programación orientada a objetos, pero que podrían serlo. Por ejemplo, la programación de interfaces gráficas de usuario para los sistemas X-Window utilizando infraestructuras de funciones y APIs como Motif, Xview y Xlib, son realizadas usualmente en lenguaje C, pero organizando el código en una manera que "parecen objetos" (los Widgets).
Ejemplo de Lenguaje orientado a objeto:

martes, 12 de febrero de 2008

Algoritmo Recursivo

Un algoritmo recursivo es un algoritmo que se define en términos de sí mismo. Son implementados en forma de subrutinas (funciones, procedimientos, subprogramas, etc) de tal forma que dentro de un subrutina recursiva hay una o más llamadas a sí misma.
Algunos ejemplos de recurrencia:
En un texto: Para saber qué es la recurrencia, primero hay que saber qué es la recurrencia.
En un acrónimo: ¿Qué es GNU? -> GNU No es Unix
¿Qué es PHP? -> PHP: Hipertext Preprocessor
En matemáticas: f(x) = x * f(x-1)
En un algoritmo: FUNCIÓN Factorial(n)
INICIO
SI (n<2) ENTONCES
Factorial = 1;
SINO
Factorial = n * Factorial(n-1);
FIN-SI
FIN
Generalmente, si la primera llamada al subprograma se plantea sobre un problema de tamaño u orden N, cada nueva ejecución recurrente del mismo se planteará sobre problemas, de igual naturaleza que el original, pero de un tamaño menor que N. De esta forma, al ir reduciendo progresivamente la complejidad del problema a resolver, llegará un momento en que su resolución sea más o menos trivial (o, al menos, suficientemente manejable como para resolverlo de forma no recursiva). En esa situación diremos que estamos ante un caso base de la recursividad.
Las claves para construir un subprograma recurrente son:
Cada llamada recurrente se debería definir sobre un problema de menor complejidad (algo más fácil de resolver).
Ha de existir al menos un caso base para evitar que la recurrencia sea infinita.
Es frecuente que los algoritmos recurrentes sean más ineficientes en tiempo que los iterativos aunque suelen ser mucho más breves en espacio.

Recursividad indirecta [editar]
Cuando en una subrutina hay llamadas a ella misma se habla de recursividad directa, en contraposición, cuando se tienen varias subrutinas y estas se llaman unas a otras formando ciclos se dice que la recursión es indirecta.Subrutina_A --> Subrutina_B --> Subrutina_A
Subrutina_A --> Subrutina_B --> Subrutina_C --> Subrutina_D --> Subrutina_A

Recursividad

RecursividadEl concepto de recursividad va ligado al de repetición. Son recursivos aquellos algoritmos que, estando encapsulados dentro de una función, son llamados desde ella misma una y otra vez, en contraposición a los algoritmos iterativos, que hacen uso de bucles while, do-while, for, etc.
Algo es recursivo si se define en términos de sí mismo (cuando para definirse hace mención a sí mismo). Para que una definición recursiva sea válida, la referencia a sí misma debe ser relativamente más sencilla que el caso considerado.
Ejemplo: definición de nº natural:
-> el N º 0 es natural-> El Nº n es natural si n-1 lo es.
En un algoritmo recursivo distinguimos como mínimo 2 partes:
a). Caso trivial, base o de fin de recursión:
Es un caso donde el problema puede resolverse sin tener que hacer uso de una nueva llamada a sí mismo. Evita la continuación indefinida de las partes recursivas.
b). Parte puramente recursiva:
Relaciona el resultado del algoritmo con resultados de casos más simples. Se hacen nuevas llamadas a la función, pero están más próximas al caso base.
EJEMPLO
ITERATIVO:
int Factorial( int n )
{
int i, res=1;
for(i=1; i<=n; i++ )
res = res*i;
return(res);
}
RECURSIVO:
int Factorial( int n )
{
if(n==0) return(1);
return(n*Factorial(n-1));
}
TIPOS DE RECURSIÓN
Recursividad simple: Aquella en cuya definición sólo aparece una llamada recursiva. Se puede transformar con facilidad en algoritmos iterativos.
Recursividad múltiple: Se da cuando hay más de una llamada a sí misma dentro del cuerpo de la función, resultando más dificil de hacer de forma iterativa.
int Fib( int n ) /* ej: Fibonacci */
{
if(n<=1) return(1);
return(Fib(n-1) + Fib(n-2));
}
Recursividad anidada: En algunos de los arg. de la llamada recursiva hay una nueva llamada a sí misma.
int Ack( int n, int m ) /* ej: Ackerman */
{
if(n==0 ) return(m+1);
else if(m==0) return(Ack(n-1,1));
return(Ack(n-1, Ack(n,m-1)));
}
Recursividad cruzada o indirecta: Son algoritmos donde una función provoca una llamada a sí misma de forma indirecta, a través de otras funciones.
Ej: Par o Impar:
int par( int nump )
{
if(nump==0) return(1);
return( impar(nump-1));
}
int impar( int numi )
{
if(numi==0) return(0);
return( par(numi-1));
}
LA PILA DE RECURSIÓNLa memoria del ordenador se divide (de manera lógica, no física) en varios segmentos (4):
Segmento de código: Parte de la memoria donde se guardan las instrucciones del programa en cod. Máquina.Segmento de datos: Parte de la memoria destinada a almacenar las variables estáticas.Montículo: Parte de la memoria destinada a las variables dinámicas.Pila del programa: Parte destinada a las variables locales y parámetros de la función que está siendo ejecutada.
Llamada a una función:
Se reserva espacio en la pila para los parámetros de la función y sus variables locales.
Se guarda en la pila la dirección de la línea de código desde donde se ha llamado a la función.
Se almacenan los parámetros de la función y sus valores en la pila.
Al terminar la función, se libera la memoria asignada en la pila y se vuelve a la instruc. Actual. Llamada a una función recursiva:
En el caso recursivo, cada llamada genera un nuevo ejemplar de la función con sus correspondientes objetos locales:
La función se ejecutará normalmente hasta la llamada a sí misma. En ese momento se crean en la pila nuevos parámetros y variables locales.
El nuevo ejemplar de función comieza a ejecutarse.
Se crean más copias hasta llegar a los casos bases, donde se resuelve directamente el valor, y se va saliendo liberando memoria hasta llegar a la primera llamada (última en cerrarse)
EJERCICIOSa). Torres de Hanoi: Problema de solución recursiva, consiste en mover todos los discos (de diferentes tamaños) de una aguja a otra, usando una aguja auxiliar, y sabiendo que un disco no puede estar sobre otro menor que éste.
__
[___]
[_____]
[ ]
-------------------------------------
A B C
/* Solucion:
1- Mover n-1 discos de A a B
2- Mover 1 disco de A a C
3- Mover n-1 discos de B a C
*/
void Hanoi( n, inicial, aux, final )
{
if( n>0 )
{
Hanoi(n-1, inicial, final, aux );
printf("Mover %d de %c a %c", n, inicial, final );
Hanoi(n-1, aux, inicial, final );
}
}
b). Calcular x elevado a n de forma recursiva:
float xelevn( float base, int exp )
{
if(exp == 0 ) return(1);
return( base*xelevn(base,exp-1));
}
c). Multiplicar 2 nºs con sumas sucesivas recurs:
int multi( int a, int b )
{
if(b == 0 ) return(0);
return( a + multi(a, b-1));
}
d). ¿Qué hace este programa?:
void cosa( char *cad, int i)
{
if( cad[i] != '\0' )
{
cosa(cad,i+1);
printf("%c", cad[i] );
}
}

miércoles, 6 de febrero de 2008

Vectores

En programación, un vector, array, arreglo o alineación es un conjunto o agrupación de variables del mismo tipo cuyo acceso se realiza por índices.
Los vectores o arreglos (array en inglés) de dos o más dimensiones se denominan con frecuencia matrices, y pueden tener tantas dimensiones como se desee; Aunque lo correcto es llamarlo arreglo (de memoria) ya que una variable de más de dos dimensiones, no cumple con las características matemáticas de una matriz numérica.
Desde el punto de vista del programa, un arreglo (matriz, array ó vector) es una zona de almacenamiento contiguo, que contiene una serie de elementos del mismo tipo, los elementos de la matriz. Desde el punto de vista lógico podemos considerarlas como un conjunto de elementos ordenados en fila. Así pues, en principio todas las matrices son de una dimensión, la dimensión principal, pero veremos que los elementos de esta fila pueden ser a su vez arreglos (un proceso que puede ser recursivo), lo que nos permite hablar de la existencia de arreglos multidimensionales, aunque las más fáciles de "ver" o imaginar son las de dos y tres dimensiones.
Puede afirmarse que las matrices son un recurso de programación simple y socorrido; en realidad pueden considerarse como las "estructuras" de datos más simples que cabe imaginar (todos los elementos del mismo tipo). Presentan la ventaja de que sus elementos son rápidamente accesibles, en especial si utiliza punteros en vez de subíndices, pero presentan una notable limitación: son de tamaño fijo; es preciso definir su tamaño desde el principio y no pueden ser fácilmente incrementadas o disminuidas sino mediante complejos procesos de copia.
Estas estructuras de datos son adecuadas para situaciones en las que el acceso a los datos se realice de forma aleatoria e impredecible. Por el contrario, si los elementos pueden estar ordenados y se va a utilizar acceso secuencial sería más adecuado utilizar una
lista.
Vectores dinámicos
Dependiendo del tipo de vector y del
lenguaje de programación que se utilice, este vector puede tener una cantidad fija o variable de datos. En el segundo caso, se los denomina vectores dinámicos. Los vectores dinámicos sacan su espacio del denominado heap del programa. Un uso incorrecto de los vectores dinámicos puede conducir a una fuga de memoria, por eso, se aconseja siempre en estos lenguajes liberar la memoria utilizada.
Lenguajes más modernos y de más alto nivel, cuentan con un mecanismo denominado
recolector de basura (como es el caso de Java) que permiten que el programa decida si debe liberar el espacio basándose en si se va a utilizar en el futuro o no un determinado objeto.
En el caso del lenguaje C, la forma de crear vectores estáticos es igual que en c++, pero para vectores dinámicos se utilizan la instrucciones malloc y realloc, acompañadas por free (para liberar la memoria utilizada).
En lenguajes compilados y en la mayoría de máquinas virtuales, la representación de arreglos suele ser en una dimensión, es decir: un conjunto consecutivo de celdas de memoria (como si fueran un gran vector). El compilador (o traductor a byte-code) realizará las conversiones pertinentes para transformar un acceso a una matriz en un acceso a un vector.