martes, 23 de noviembre de 2010

Calculo Lambda

Materia: Lenguajes de Programacion.


Introduccion.

El cálculo lambda es un sistema formal diseñado para investigar la definición de función, la noción de aplicación de funciones y la recursión. Fue introducido por Alonzo Church y Stephen Kleene en la década de 1930; Church usó el cálculo lambda en 1936 para resolver el Entscheidungsproblem. Puede ser usado para definir de manera limpia y precisa qué es una "función computable". El interrogante de si dos expresiones del cálculo lambda son equivalentes no puede ser resuelto por un algoritmo general. Esta fue la primera pregunta, incluso antes que el problema de la parada, para el cual la indecidibilidad fue probada. El cálculo lambda tiene una gran influencia sobre los lenguajes funcionales, como Lisp, ML y Haskell.

Se puede considerar al cálculo lambda como el más pequeño lenguaje universal de programación. Consiste en una regla de transformación simple (sustitución de variables) y un esquema simple para definir funciones.

El cálculo lambda es universal porque cualquier función computable puede ser expresada y evaluada a través de él. Por lo tanto, es equivalente a las máquinas de Turing. Sin embargo, el cálculo lambda no hace énfasis en el uso de reglas de transformación y no considera las máquinas reales que pueden implementarlo. Se trata de una propuesta más cercana al software que al hardware.

Explicacion breve:

El cálculo lambda es un formalismo para representar funciones, cuyo poder expresivo es equivalente a la máquina de Turing universal.

El cálculo lambda trabaja con objetos llamados lambda-términos, que son cadenas de símbolos de una de las formas siguientes:

• v

• λv.E1

• (E1 E2)

donde v es un nombre de variable tomado de un conjunto infinito predefinido de nombres de variables, y E1 y E2 son lambda-términos. Los términos de la forma λv.E1 son llamadas abstracciones. La variable ν se llama el parámetro formal de la abstracción, y E1 es el cuerpo de la abstracción.

El término λv.E1 representa la función que, si es aplicada a un argumento, liga el parámetro formal v al argumento y entonces computa el valor resultante de E1--- esto es, retorna E1, con cada ocurrencia de ν sustituido por el argumento.

Los términos de la forma (E1 E2) son llamados aplicaciones. Las aplicaciones modelan la invocación o ejecución de una función: La función representada por E1 es invocada, con E2 como su argumento, y se computa el resultado. Si E1 (a veces llamado el aplicando) es una abstracción, el término puede ser reducido: E2, el argumento, se puede sustituir en el cuerpo de E1 en lugar del parámetro formal de E1, y el resultado es un nuevo término lambda que es equivalente al antiguo. Si un término lambda no contiene ningún subtérmino de la forma (λv.E1 E2) entonces no puede ser reducido, y se dice que está en forma normal.
Historia

Originalmente, Church había tratado de construir un sistema formal completo para modelizar la matemática; pero cuando este se volvió susceptible a la paradoja de Russell, separó del sistema al cálculo lambda y lo usó para estudiar la computabilidad, culminando en la respuesta negativa al problema de la parada.

Sintáxis

En el cálculo lambda, una expresión o término se define recursivamente a través de las siguientes reglas de formación:

1. Toda variable es un término: x, y, z, u, v, w, x1, x2, y9,...

2. Si t es un término y x es una variable, entonces (λx.t) es un término (llamado una abstracción lambda).

3. Si t y s son términos, entonces (ts) es un término (llamado una aplicación lambda).

4. Nada más es un término.

Según estas reglas de formación, las siguientes cadenas de caracteres son términos:

x

(xy)

(((xz)y)x)

(λx.x)

((λx.x)y)

(λz.(λx.y))

((x(λz.z))z)

Por convención se suelen omitir los paréntesis externos, ya que no cumplen ninguna función de desambiguación. Por ejemplo se escribe (λz.z)z en vez de ((λz.z)z), y se escribe x(y(zx)) en vez de (x(y(zx))). Además se suele adoptar la convención de que la aplicación de funciones es asociativa hacia la izquierda. Esto quiere decir, por ejemplo, que xyzz debe entenderse como (((xy)z)z), y que (λz.z)yzx debe entenderse como ((((λz.z)y)z)x).

Las primeras dos reglas generan funciones, mientras que la última describe la aplicación de una función a un argumento. Una abstracción lambda λx.t representa una función anónima que toma un único argumento, y se dice que el signo λ liga la variable x en el término t. En cambio, una aplicación lambda ts representa la aplicación de un argumento s a una función t. Por ejemplo, λx.x representa la función identidad x → x, y (λx.x)y representa la función identidad aplicada a y. Luego, λx.y representa la función constante x → y, que develve y sin importar qué argumento se le dé.

Las expresiones lambda no son muy interesantes por sí mismas. Lo que las hace interesantes son las muchas nociones de equivalencia y reducción que pueden ser definidas sobre ellas.

Variables libres y ligadas

Las apariciones (ocurrencias) de variables en una expresión son de tres tipos:

1. Ocurrencias de ligadura (binders)

2. Ocurrencias ligadas (bound occurrences)

3. Ocurrencias libres (free occurrences)

Las variables de ligadura son aquellas que están entre el λ y el punto. Por ejemplo, siendo E una expresión lambda:

(λ x y z. E) Los binders son x,y y z.

El binding de ocurrencias de una variable está definido recursivamente sobre la estructura de las expresiones lambda, de esta manera:

1. En expresiones de la forma V, donde V es una variable, V es una ocurrencia libre.

2. En expresiones de la forma λ V. E, las ocurrencias son libres en E salvo aquellas de V. En este caso las V en E se dicen ligadas por el λ antes V.

3. En expresiones de la forma (E E′), las ocurrencias libres son aquellas ocurrencias de E y E′.

Expresiones lambda tales como λ x. (x y) no definen funciones porque las ocurrencias de y están libres. Si la expresión no tiene variables libres, se dice que es cerrada.

Como se permite la repetición del identificador de variables, cada binding tiene una zona de alcance asociada (scope de ahora en adelante) Un ejemplo típico es: (λx.x(λx.x))x, donde el scope del binding más a la derecha afecta sólo a la x que tiene ahí, la situación del otro binding es análoga, pero no incluye el scope de la primera. Por último la x más a la derecha está libre. Por lo tanto, esa expresión puede reexpresarse así (λy.y(λz.z))x.

α-conversión

La regla de alfa-conversión fue pensada para expresar la idea siguiente: los nombres de las variables ligadas no son importantes. Por ejemplo λx.x y λy.y son la misma función. Sin embargo, esta regla no es tan simple como parece a primera vista. Hay algunas restricciones que hay que cumplir antes de cambiar el nombre de una variable por otra. Por ejemplo, si reemplazamos x por y en λx.λy.x, obtenemos λy.λy.y, que claramente, no es la misma función. Este fenómemo se conoce como captura de variables.

La regla de alfa-conversión establece que si V y W son variables, E es una expresión lambda, y

E[V := W]

representa la expresión E con todas las ocurrencias libres de V en E reemplazadas con W, entonces

λ V. E == λ W. E[V := W]

si W no está libre en E y W no está ligada a un λ donde se haya reemplazado a V. Esta regla nos dice, por ejemplo, que λ x. (λ x. x) x es equivalente a λ y. (λ x. x) y.

En un ejemplo de otro tipo, se ve que

for (int i = 0; i < max; i++) { proc (i); }

es equivalente a

for (int j = 0; j < max; j++) { proc (j); }

β-reducción

La regla de beta reducción expresa la idea de la aplicación funcional. Enuncia que

((λ V. E) E′) == E[V := E′]

si todas las ocurrencias de E′ están libres en E[V := E′].

Una expresión de la forma ((λ V. E) E′) es llamada un beta redex. Una lambda expresión que no admite ninguna beta reducción se dice que está en su forma normal. No toda expresión lambda tiene forma normal, pero si existe, es única. Más aún, existe un algoritmo para computar la formal normal: la reducción de orden normal. La ejecución de este algoritmo termina si y sólo si la expresión lambda tiene forma normal. El teorema de Church-Rosser nos dice que dos expresiones reducen a una misma si y sólo si son equivalentes (salvo por el nombre de sus variables ligadas)

η-conversión

Es la tercer regla, eta conversión, que podría ser añadida a las dos anteriores para formar una nueva relación de equivalencia. La eta conversión expresa la idea de extensionalidad, que en este contexto implica que dos funciones son la misma si y solo si dan el mismo resultado para cualquier argumento. La eta conversión convierte entre λ x. f x y f siempre que x no aparezca sola en f. Esto puede ser entendido como equivalente a la extensionalidad así:

Si f y g son extensionalmente equivalentes, es decir, si f a== g a para cualquier expresión lambda a entonces, en particular tomando a como una variable x que no aparece sola en f ni en g, tenemos que f x == g x y por tanto λ x. f x == λ x. g x, y así por eta conversión f == g. Entonces, si aceptamos la eta conversión como válida, resulta que la extensionalidad es válida.

Inversamente, si aceptamos la extensionalidad como válida entonces, dado que por beta reducción de todo y tenemos que (λ x. f x) y == f y, resulta que λ x. f x == f; es decir, descubrimos que la eta conversión es válida.

Bibliografias:

http://es.wikipedia.org/wiki/C%C3%A1lculo_lambda

http://enciclopedia.us.es/index.php/C%C3%A1lculo_lambda

Smalltalk

Materia: Lenguajes de Programacion.
Introduccion.



Smalltalk es un lenguaje de programacion que pernite realizar tareas de computacion mediante la interaccion con un entorno de objetos virtuales. Metaforicamente, se puede considerar que un smalltalk es un mundo virtual donde viven objetos que se comunican mediante el envio de mensajes.
Un sistema de Smalltalk esta compuesto por:

• Maquina virtual.

• Imagen virtual que contiene todos los objetos del sistema.

• Lenguaje de programacion ( tambien conocido como Smalltalk).

• Biblioteca de objetos reusables.

• Opcionalmente un entorno de desarrollo que funciona como un sistema en tiempo de ejecucion.

Historia del Smalltalk

Los origenes de Smalltalk se encuentran en las investigaciones realizadas por Alan Kay, Dan Ingalls, Ted Kaehler, Adele Goldberg y otros durante los años setenta en el Palo Alto Research Institute de Xerox (conocido como Xerox PARC), para la creacion de un sistema informatico orientado a la educacion. El objetivo era crear un sistema que permitiese expandir la creatividad de sus usuarios proporcionando un entorno para la experimentacion, creacion e investigacion.

Smalltalk es considerado el primero de los lenguajes orientados a objetos (OOP), aunque en realidad el primero en implementar programacion orientada a objetos fue Simula. En Smalltalk todo es un objeto, incluidos los numeros reales o el propio entorno de Smalltalk.

Terminología

Un programa Smalltalk consiste únicamente de objetos, un concepto que se utiliza universalmente dentro de todo sistema Smalltalk. Prácticamente todo, desde un número natural como el 4 hasta un servidor web es considerado un objeto. Los objetos Smalltalk presentan características comunes

• Tienen una memoria propia.

• Poseen capacidad para comunicarse con otros objetos.

• Poseen la capacidad de heredar características de objetos ancestros.

• Tienen capacidad de procesamiento.

Los objetos se comunican entre sí mediante el envío de mensajes.. Asimismo, un objeto puede proveer muchas operaciones (actualmente esto está determinado por cada implementación)

Las definiciones de estas operaciones en los objetos son llamadas métodos. Un método especifica la reacción de un objeto cuando recibe un mensaje que es dirigido a ese método. La resolución (en el sentido de ligado) de un mensaje a un método es dinámica. La colección entera de métodos de un objeto es llamada protocolo de mensajes o interfaz de mensajes del objeto. Los mensajes pueden ser parametrizados, estos parámetros serán objetos, y el resultado o respuesta del mismo también será un objeto.

Las características comunes de objetos está capturado bajo la noción de clase, de tal forma que los objetos agrupados bajo una clase son llamados instancias de ella. Las instancias son creadas durante la ejecución de un programa con algún propósito y son barridos automáticamente en el momento que no son necesitados más por el recolector de basura. Exceptuando algunos objetos especiales como los muy simples, llamados literales (números, cadenas, etc), cada objeto tiene su propio estado local y representa una instancia diferente de su clase.
Como lenguaje tiene las siguientes caracteristicas:

• Orientacion a objetos pura.

• Tipado dinamico.

• Interraccion entre objetos mediante el envio de mensajes.

• Herencia simple y con raiz comun.

• Reflexion computacional completa.

• Recolleccion de basura.

• Compilacion en tiempo de ejecucion o interpretado (Dependieno de la distribucion o de el proveedor).

• Multiplies implementaciones.

La sintaxis de Smalltalk-80 tinde a ser minimilista. Esto significa que existe un grupo chico de palabras reservadas y declaraciones en comparacion con la mayoria de los lenguajes populares.Smalltalk posee un grupo de 5 palabras reservadas: self, nil, super, true y false.

Parte de la funcionalidad básica:
Todas las estructuras de datos Smalltalk se representó, como objetos, y un rico repertorio de estos se encuentra disponible en su biblioteca de clases.




Object es la raíz de la herencia de la jerarquía de Smalltalk, proporcionando una funcionalidad básica a todos los objetos. Class Collection es una de las muchas subclases de objetos de clase, sino que pueden ser más especializada en una amplia gama de estructuras de datos. Establece son sólo uno de ellos, con diccionarios como una subclase. Los diccionarios se utilizan para almacenar las asociaciones entre pares de objetos. El código siguiente muestra el uso de estas estructuras de datos en un ejemplo sencillo. En primer lugar se define el diccionario, la asociación de algunos viejos amigos con una selección de las virtudes. Los mensajes se envían a este objeto, lista y la búsqueda de claves.




Smalltalk se adhiere a una interpretación muy estricta de la orientación a objetos, e incluso las estructuras de control se implementan como patrones de mensaje. Selección de los caminos alternativos de ejecución es por tanto el apoyo a través de ifTrue: ifFalse,:, y ifFalse: ifTrue: mensajes. Loops se puede especificar con whileTrue: whileFalse,:, timesRepeat:, no: a: hacer:, recoger: oa través de la recursividad. Smalltalk utiliza la noción de bloques de aplazar la evaluación. Los bloques pueden tener argumentos, puede tener variables temporales, y se utilizan para encapsular código que pueden ser evaluados más adelante. Entre otras cosas que son comúnmente usados como argumentos para controlar las estructuras. Puesto que son los propios objetos, los bloques pueden ser obligados a identificadores. El mensaje de valor de las fuerzas de la ejecución de un bloque.



 
Bibliografias:

http://es.wikipedia.org/wiki/Smalltalk

http://www.cosc.canterbury.ac.nz/wolfgang.kreutzer/cosc205/smalltalk1.html

Paradigmas de Programacion.

Materia: Lenguajes de Programacion.
Que significa paradigma?


Paradigma es un modelo o patrón en cualquier disciplina científica u otro contexto epistemológico. El concepto fue originalmente específico de la gramática; en 1900 el diccionario Merriam-Webster definía su uso solamente en tal contexto, o en retórica para referirse a una parábola o a una fábula. En lingüística, Ferdinand de Saussure ha usado paradigma para referirse a una clase de elementos con similitudes.

Introduccion.

Un paradigma de programación es una propuesta tecnológica que es adoptada por una comunidad de programadores cuyo nucleo central es incuestionable en cuanto a que unívocamente trata de resolver uno o varios problemas claramente delimitados. La resolución de estos problemas debe suponer consecuentemente un avance significativo en almenos un parámetro que afecte a la ingeniería de software. Tiene una estrecha relación con la formalización de determinados lenguajes en su momento de definición. Un paradigma de programación está delimitado en el tiempo en cuanto a aceptación y uso ya que nuevos paradigmas aportan nuevas o mejores soluciones que la sustituyen parcial o totalmente.

A paradigma de programación es un estilo fundamental de programación de la computadora. (Compare con una metodología, que es un estilo de solucionar específico tecnología de dotación lógica problemas).
Ejemplo:

Probablemente el paradigma de programación que actualmente es el más usado a todos los niveles es la orientación a objeto. El núcleo central de este paradigma es la unión de datos y procesamiento en una entidad llamada "objeto", relacionable a su vez con otras entidades "objeto".

Tradicionalmente datos y procesamiento se han separado en áreas diferente del diseño y la implementación de software. Esto provocó que grandes desarrollos tuvieran problemas de fiabilidad, mantenimiento, adaptación a los cambios y escalabilidad. Con la orientación a objetos y características como el encapsulado, polimorfismo o la herencia se permitió un avance significativo en el desarrollo de software a cualquier escala de producción.

La orientación a objeto parece estar ligado en sus origenes con lenguajes como Lisp y Simula aunque el que acuño el título de programación orientada a objetos fué Smaltalk.

Tipos de paradigmas de programación más comunes

• Imperativo o por procedimientos: es considerado el más común y está representado, por ejemplo, por C o BASIC.

• Funcional: está representado por Scheme o Haskell. Este es un caso del paradigma declarativo.

• Lógico: está representado por Prolog. Este es otro caso del paradigma declarativo.

• Declarativo: por ejemplo la programación funcional, la programación lógica, o la combinación lógico-funcional.

• Orientado a objetos: está representado por Smalltalk, un lenguaje completamente orientado a objetos.

Si bien puede seleccionarse la forma pura de estos paradigmas al momento de programar, en la práctica es habitual que se mezclen, dando lugar a la programación multiparadigma.

Actualmente el paradigma de programación más usado es el de la programación orientada a objetos.

Breve Explicacion:

Un lenguaje de programación puede apoyar paradigmas múltiples. Por ejemplo programas escritos adentro C++ o PASCAL del objeto puede estar puramente procesal, o puramente orientado al objeto, o contenga los elementos de ambos paradigmas. Los diseñadores y los programadores del software deciden cómo utilizar esos elementos del paradigma.

En programación orientada al objeto, los programadores pueden pensar en un programa como colección de objetos que obran recíprocamente, mientras que adentro programación funcional un programa se puede pensar en como secuencia de las evaluaciones apátridas de la función. Cuando computadoras o sistemas de programación con muchos procesadores, programación proceso-orientada permite que los programadores piensen de usos como sistemas de procesos concurrentes que actúan sobre compartido lógicamente estructuras de datos.

Apenas como diversos grupos adentro tecnología de dotación lógica abogado diferente metodologías, diferente lenguajes de programación abogado diferente paradigmas de programación. Algunas idiomas se diseñan para apoyar un paradigma particular (Palique apoya la programación orientada al objeto, Haskell apoya la programación funcional), mientras que otros lenguajes de programación apoyan paradigmas múltiples (por ejemplo PASCAL del objeto, C++, C#, Básico visual, Lisp común, Esquema, Python, Rubí y Onza).

Muchos paradigmas de programación están como bien conocidos para qué técnicas ellos prohibido en cuanto a lo que él permite. Por ejemplo, la programación funcional pura rechaza el uso de efectos secundarios; programación estructurada rechaza el uso del goto declaración. En parte por esta razón, los nuevos paradigmas son mirados a menudo como doctrinaire o excesivamente rígido por ésos acostumbrados a estilos anteriores.[citación necesitada] Evitar ciertas técnicas puede hacerlo más fácil probar teoremas sobre un programa corrección-o entender simplemente su comportamiento.

Ejemplos

• Programación de Annotative (como adentro Lengua de la llamarada)

• programación Aspecto-orientada (como adentro AspectJ)

• Programación Atribuir-Orientada (como adentro Java 5 anotaciones, preprocesado por la clase de XDoclet; Cualidades de C#)

• Programación Autómata-Basada

• Programación Bayesian

• programación Clase-basada, comparado a programación Prototipo-basada (dentro del contexto de la programación orientada al objeto)

• programación Componente-orientada (como adentro OLE)

• Programación de Concatenative

• Programación de constreñimiento, comparado a programación de la lógica

• programación Contexto-orientada (como adentro ContextJ/contextos/ContextL)

• Programación orientada de la cibernética

• Programación del flujo de datos (como adentro hojas de balance)

• Programación declarativa

• Programación conducida acontecimiento

• programación Fluir-basada

• programación del Función-nivel

• Programación funcional

• programación Meta-dirigida como adentro Snobol, algo similar a Programación de la lógica

• Programación imprescindible, comparado a programación declarativa

• Programación intencional

• Programación que sabe leer y escribir

• Programación de la lógica (como adentro Prólogo) y Programación de la lógica de Abductive

• Mensaje que pasa la programación, comparado a la programación imprescindible

• Programación no determinista

• Programación orientada al objeto (como adentro Palique)

• Programación de la tubería (como en Línea de comando del UNIX)

• programación Política-basada

• Programación procesal, comparado a programación funcional

• programación Proceso-orientada un modelo de la programación paralela.

• Programación reactiva

• Programación recurrente, comparado a programación iterativa

• Programación reflexiva

• Programación escalar, comparado a Programación del arsenal

• Programación estructurada, comparado a programación no estructurada

• programación Tema-orientada

• Programación del árbol

• programación del Valor-nivel, comparado a programación del función-nivel

• Metaprogramming

Bibliografias:

http://es.wikipedia.org/wiki/Paradigma_de_programaci%C3%B3n

http://www.worldlingo.com/ma/enwiki/es/Programming_paradigm

lunes, 22 de noviembre de 2010

R

Materia: Lenguajes de Programacion.

R es un lenguaje y entorno de programación para análisis estadístico y gráfico.
Se trata de un proyecto de software libre, resultado de la implementación GNU del premiado lenguaje S. R y S-Plus -versión comercial de S- son, probablemente, los dos lenguajes más utilizados en investigación por la comunidad estadística, siendo además muy populares en el campo de la investigación biomédica, la bioinformática y las matemáticas financieras. A esto contribuye la posibilidad de cargar diferentes bibliotecas o paquetes con finalidades específicas de cálculo o gráfico.
R se distribuye bajo la licencia GNU GPL y está disponible para los sistemas operativos Windows, Macintosh, Unix y GNU/Linux.

Historia
Fue desarrollado inicialmente por Robert Gentleman y Ross Ihaka del Departamento de Estadística de la Universidad de Auckland en 1993.[
] Su desarrollo actual es responsabilidad del R Development Core Team.

Caracteristicas
R proporciona un amplio abanico de herramientas estadísticas (modelos lineales y no lineales, tests estadísticos, análisis de series temporales, algoritmos de clasificación y agrupamiento, etc.) y gráficas.
Al igual que S, se trata de un lenguaje de programación, lo que permite que los usuarios lo extiendan definiendo sus propias funciones. De hecho, gran parte de las funciones de R están escritas en el mismo R, aunque para algoritmos computacionalmente exigentes es posible desarrollar bibliotecas en C, C++ o Fortran que se cargan dinámicamente. Los usuarios más avanzados pueden también manipular los objetos de R directamente desde código desarrollado en C. R también puede extenderse a través de paquetes desarrollados por su comunidad de usuarios.

R hereda de S su orientación a objetos. La tarea de extender R se ve facilitada por su permisiva política de lexical scoping. Además, R puede integrarse con distintas bases de datos y existen bibliotecas que facilitan su utilización desde lenguajes de programación interpretados como Perl y Python.
Otra de las características de R es su capacidad gráfica, que permite generar gráficos con alta calidad. R posee su propio formato para la documentación basado en LaTeX.
R también puede usarse como herramienta de cálculo numérico, campo en el que puede ser tan eficaz como otras herramientas específicas tales como GNU Octave y su versión comercial, MATLAB.[] Se ha desarrollado una interfaz, RWeka[] para interactuar con Weka que permite leer y escribir ficheros en el formato arff y enriquecer R con los algoritmos de minería de datos de dicha plataforma.

ejemplos:
Aqui hay un programa en r donde declaro unos numeros y de eso saco la media y la varianza.

Ademas de sacar una grafica que r te saca con una condicion. 

Programa en C "Matriz"

Aqui les dejo un programa que realiza una matriz:

Este es el codigo fuente:

#include



/*Obed David Guevara Ibarra 1447478 Hora:V5


Matriz N*M que suma la diagonal superior*/


main(){


int N, M;






do{


printf("Proporcina el numero de Filas: ");


scanf("%d", &N);


printf("Proporcina el numero de Columnas: ");


scanf("%d", &M);


}while(N!=M);






int A[N][M], i, j, s;


for(i=0;i<=N-1;i++){


for(j=0;j<=M-1;j++){


printf("A[%d][%d]= ", i+1, j+1);


scanf("%d", &A[i][j]);


}//Fin de for


}






s = 0;


for(i=0;i<=N-1;i++){


for(j=0;j<=M-1;j++){


if(i==j) s = s + A[i][j];


}


}


for(i=0;i<=N-1;i++){


for(j=0;j<=M-1;j++){


printf("%d ", A[i][j]);


}


printf("\n");


}


printf("La suma de la diagonal es: %d", s);


getch();


}

 Aqui les dejo el programa corriendo en Windows y Ubuntu
 
Windows:
 

Aqui esta el programa corriendo en Ubuntu:

Saludos.

Proma en C "Suma de Vectores"

Aqui les dejo el programa corriendo en Ubuntu y Windows:

Ubuntu
Codigo fuente:
Programa corriendo:


Windows:

Codigo fuente:

 Programa corriendo:


Saludos.

Programa en C

Aqui les dejo un progama en C que lee vectores:


Este programa corre en Ubuntu:

Aqui esta el codigo fuente del programa


 Pantala del programa corriendo


Estos son en Windows:

 Aqui les dejo el codigo fuente y el programa corriendo



Perl

Materia: Lenguajes de Programacion.

Lenguajes de programación

PERL

Perl es un lenguaje de programación diseñado por Larry Wall en 1987. Perl toma características del lenguaje C, del lenguaje interpretado shell (sh), AWK, sed, Lisp y, en un grado inferior, de muchos otros lenguajes de programación.

Estructuralmente, Perl está basado en un estilo de bloques como los del C o AWK, y fue ampliamente adoptado por su destreza en el procesado de texto y no tener ninguna de las limitaciones de los otros lenguajes de script.

HISTORIA

Larry Wall comenzó a trabajar en Perl en 1987 mientras trabajaba como programador en Unisys y anunció la versión 1.0 en el grupo de noticias comp.sources.misc el 18 de diciembre de 1987. El lenguaje se expandió rápidamente en los siguientes años. Perl 2, publicado en 1988, aportó un mejor motor de expresiones regulares. Perl 3, publicado en 1989, añadió soporte para datos binarios.

NOMBRE

El nombre es descrito ocasionalmente como "PERL" (por Practical Extraction and Report Language - Lenguaje Práctico para la Extracción e Informe). Aunque esta expansión ha prevalecido en muchos manuales actuales, incluyendo la página de manual de Perl, es un retroacrónimo y oficialmente el nombre no quiere decir nada. La ortografía de PERL en mayúsculas es por eso usada como jerga para detectar a individuos ajenos a la comunidad. Sin embargo, se han sugerido varios retroacrónimos, incluyendo el cómico Pathologically Eclectic Rubbish Lister (Contabilizador de Basura Patológicamente Ecléctico).

Estructura del lenguaje

Programa ejemplo

En Perl, el programa canónico "Hola mundo" es:

#!/usr/bin/perl

print "¡Hola mundo!\n";

La primera línea contiene el shebang (par de caracteres que identifica el texto que sigue), que le indica al sistema operativo dónde encontrar el intérprete de Perl. La segunda imprime el string ¡Hola mundo! y un carácter de nueva línea.

El shebang es la forma normal para invocar al intérprete en los sistemas Unix. Los sistemas Windows pueden seguir utilizándolo o pueden asociar la extensión de archivo .pl con el intérprete Perl. Algunos editores de texto también usan la línea shebang como una pista sobre el modo de trabajo en que deben operar. Si el programa es ejecutado por perl y no invocado por el shell, la línea que empieza por el shebang es parseada para interpretar las opciones. En otro caso, es ignorada.

Tipos de datos

Perl tiene tres tipos de datos: escalares, listas y hashes:

• Un escalar es un solo valor; puede ser un número, un string (cadena de caracteres) o una referencia

• Una lista es una colección ordenada de escalares (una variable que almacena una lista se llama array)

• Un hash, o memoria asociativa, es un mapeo de strings a escalares; los strings se llaman claves y los escalares valores.

Todas las variables están precedidas por un sigil, que identifica el tipo de dato que es accedido (no el tipo de dato de la misma variable). Se puede usar el mismo nombre para variables de diferentes tipos, sin que tengan conflictos.

Datos escalares

Los datos escalares son las variables simples y pueden contener enteros, reales, cadenas o referencias. Este tipo de variables van precedido siempre por $.

En Perl las variables no se tienen porque declarar, aunque se declaran con my.

Las cadenas se encierran entre comillas dobles (" "), aunque también se pueden cerrar entre comillas simples (' '). Hay caracteres especiales (retorno de carro, tabulador, etc.) que como en muchos otros lenguajes se presentan mediante la barra de escape:

• \n retorno de carro a una nueva línea

• \b retorno a la posición anterior

• \a pitido

• \t tabulación (8 espacios)

• \\ el caracter \

• \" las comillas dobles (aunque si la cadena está delimita por comillas simples, no hace falta)

• \' las comillas simples (aunque si la cadena está delimita por comillas dobles, no hace falta)

Los operadores de comparación, son similares a los de C, pero depende si estamos comparando cadenas o datos numéricos. Los operadores para números y para cadenas son:

Comparación Números Cadenas

igual == eq

no igual != ne

menor que < lt

mayor que > gt

menor o igual que <= le

mayor o igual que >= ge

En Perl también tenemos los operadores de autoincremento (++)y autodecremento (--). Y además tenemos el operador potencia **(que es muy parecido aunque muy diferente)

Estructuras de control de flujo

Perl mantiene todas las estructuras de control de flujo que pueda tener cualquier otro lenguaje, pero con la peculariedad de que un bloque siempre debe ir entre llaves ({ }), aun cuando el bloque contenga un única sentencia.

Un resumen general de las estrucuturas de control de flujo es:

• if (EXPR) BLOQUE

• if (EXPR) BLOQUE else BLOQUE

• if (EXPR) BLOQUE elsif (EXPR) BLOQUE else BLOQUE

• SENTENCIA if (EXPR);

• unless (EXPR) BLOQUE

• unless (EXPR) BLOQUE else BLOQUE

• unless (EXPR) BLOQUE elsif (EXPR) BLOQUE else BLOQUE

• SENTENCIA unless (EXPR);

• while (EXPR) BLOQUE

• SENTENCIA while (EXPR);

• until (EXPR) BLOQUE

• SENTENCIA until (EXPR);

• do BLOQUE while (EXPR);

• do BLOQUE until (EXPR);

• for (EXPR;EXPR;EXPR) BLOQUE

• foreach $var (Array) BLOQUE

Donde EXPR es una expresión, BLOQUE es una sentecia o conjunto de estas encerrado entre llaves y SENTENCIA es una sola sentencia

ejemplo:
Aqui les dejo un programa que saca los numeros de fibonacci









Bibliografias:

http://es.wikipedia.org/wiki/Perl

http://flanagan.ugr.es/perl/index2.htm

Compiladores e Interpretes

Materia: Lenguajes de programación


Un programa escrito en un lenguaje "compilado" se traduce a través de un programa anexo llamado compilador que, a su vez, crea un nuevo archivo independiente que no necesita ningún otro programa para ejecutarse a sí mismo. Este archivo se llama ejecutable.

Un programa escrito en un lenguaje compilado posee la ventaja de no necesitar un programa anexo para ser ejecutado una vez que ha sido compilado. Además, como sólo es necesaria una traducción, la ejecución se vuelve más rápida.

Sin embargo, no es tan flexible como un programa escrito en lenguaje interpretado, ya que cada modificación del archivo fuente (el archivo comprensible para los seres humanos: el archivo a compilar) requiere de la compilación del programa para aplicar los cambios.

Por otra parte, un programa compilado tiene la ventaja de garantizar la seguridad del código fuente. En efecto, el lenguaje interpretado, al ser directamente un lenguaje legible, hace que cualquier persona pueda conocer los secretos de fabricación de un programa y, de ese modo, copiar su código o incluso modificarlo. Por lo tanto, existe el riesgo de que los derechos de autor no sean respetados. Por otro lado, ciertas aplicaciones aseguradas necesitan confidencialidad de código para evitar las copias ilegales (transacciones bancarias, pagos en línea, comunicaciones seguras...).

La generación de código data desde la existencia de los primeros compiladores. Hasta la aparición de los primeros generadores de código comerciales u orientados a "usuarios finales"; la generación de código era exclusividad de programas compiladores especializados.

En tiempos más recientes la generación de código, gracias al avance de la ingeniería del software, se ha llevado a un nivel diferente; donde se encuentran programas generadores de pantallas, reportes y consultas, estas son herramientas de gran utilidad; pero se debe, en la mayoría de los casos, Pagar una gran cantidad de dinero por ellos.



Arquitectura de un Compilador

Un compilador, básicamente, es un programa que lee un archivo con código fuente; este código fuente lo traduce a un lenguaje llamado lenguaje objeto. En este proceso se le indica al usuario la existencia de errores de codificación.

El compilador recibe una entrada de caracteres, por lo general escrita por el programador; el compilador realiza los análisis: léxico, sintáctico y semántico, para generar seguidamente el código intermedio, el código intermedio se genera con principios de búsqueda de patrones y aplicación de reglas. Después se hace la optimización del código intermedio; seguidamente se realiza la generación de código objeto en lenguaje de máquina.

Análisis léxico. Es la parte inicial de leer y analizar el código fuente. El texto es leído y dividido en tokens, cada uno de los cuales corresponde a un símbolo en el lenguaje de programación, por ejemplo, el nombre de una variable, una palabra reservada o un número.

Análisis sintáctico. En esta fase se toma una lista de tokens producida por el análisis léxico y los acomoda en una estructura de árbol llamada árbol sintáctico que refleja la estructura del programa. Esta fase también se llama parsing.

Análisis semántico. es posterior al sintáctico y mucho más difícil de formalizar que éste. Se trata de determinar el tipo de los resultados intermedios, comprobar que los argumentos que tiene un operador pertenecen al conjunto de los operadores posibles, y si son compatibles entre sí, etc. En definitiva, comprobará que el significado de lo que se va leyendo es válido.

Interprete
Un lenguaje de programación es, por definición, diferente al lenguaje máquina. Por lo tanto, debe traducirse para que el procesador pueda comprenderlo. Un programa escrito en un lenguaje interpretado requiere de un programa auxiliar (el intérprete), que traduce los comandos de los programas según sea necesario.

Un intérprete traduce un código fuente en lenguaje máquina también. El intérprete difiere del compilador en que ejecuta cada orden una vez que se traduce. Este proceso puede hacer más lenta la ejecución del programa, así que los intérpretes se utilizan menos que los compiladores. Un intérprete es otra manera de implementar un lenguaje de programación. La interpretación comparte muchos aspectos con el compilador. Los análisis léxico, sintáctico y verificación de tipos son exactamente los mismos que en un compilador.
Pero en lugar de generar código del árbol sintáctico, el árbol sintáctico se procesa directamente para evaluar expresiones y ejecutar sentencias, y así hasta terminar. Un intérprete puede necesitar evaluar la misma parte del árbol sintáctico varias veces (por ejemplo cuando se hacen ciclos), por eso la interpretación puede ser más lenta que la ejecución de un programa compilado. Pero escribir un intérprete es más fácil de mover a una máquina diferente, así que para aplicaciones donde la velocidad no importa, lo mejor es utilizar un intérprete.

Bibliografias:

http://es.kioskea.net/contents/langages/langages.php3

Java

Aqui les dejo un programa en java.

Java

Java es un lenguaje de programación orientado a objetos, desarrollado por Sun Microsystems a principios de los años 90. El lenguaje en sí mismo toma mucha de su sintaxis de C y C++, pero tiene un modelo de objetos más simple y elimina herramientas de bajo nivel, que suelen inducir a muchos errores, como la manipulación directa de punteros o memoria.

Una de las principales características por las que Java se ha hecho muy famoso es que es un lenguaje independiente de la plataforma. Eso quiere decir que si hacemos un programa en Java podrá funcionar en cualquier ordenador del mercado. Es una ventaja significativa para los desarrolladores de software, pues antes tenían que hacer un programa para cada sistema operativo, por ejemplo Windows, Linux, Apple, etc. Esto lo consigue porque se ha creado una Máquina de Java para cada sistema que hace de puente entre el sistema operativo y el programa de Java y posibilita que este último se entienda perfectamente.

Java fue pensado originalmente para utilizarse en cualquier tipo de electrodoméstico pero la idea fracasó. Uno de los fundadores de Sun rescató la idea para utilizarla en el ámbito de Internet y convirtieron a Java en un lenguaje potente, seguro y universal gracias a que lo puede utilizar todo el mundo y es gratuito. Una de los primeros triunfos de Java fue que se integró en el navegador Netscape y permitía ejecutar programas dentro de una página web, hasta entonces impensable con el HTML.

Actualmente Java se utiliza en un amplio abanico de posibilidades y casi cualquier cosa que se puede hacer en cualquier lenguaje se puede hacer también en Java y muchas veces con grandes ventajas. Para lo que nos interesa a nosotros, con Java podemos programar páginas web dinámicas, con accesos a bases de datos, utilizando XML, con cualquier tipo de conexión de red entre cualquier sistema. En general, cualquier aplicación que deseemos hacer con acceso a través web se puede hacer utilizando Java.


Ejemplo: Esto es el juego de piedra papel o tijera.

import javax.swing.*;
import java.util.Random;
public class seleccion{

public static void main(String[] args){

int varUs,varCom;

// do{

do{

String Us = JOptionPane.showInputDialog(null,"Telcclee 1-Piedra, 2-Papel, 3-Tijera");

varUs = Integer.parseInt(Us);

}while(varUs >= 3);

Random generator = new Random();
varCom = (generator.nextInt(3)+1);

JOptionPane.showMessageDialog(null,varUs + " " + varCom);


if(varUs == 1){


if(varCom == 1){


JOptionPane.showMessageDialog(null,"Piedra vs Piedra: Empate!");

}else{

if(varCom == 2){



JOptionPane.showMessageDialog(null,"Piedra vs Papel: Perdiste!");



}else{



if(varCom == 3){



JOptionPane.showMessageDialog(null,"Piedra vs Tijera: Ganaste!");



}//



}//



}//
}else{



if(varUs == 2){



if(varCom == 1){



JOptionPane.showMessageDialog(null,"Papel vs Piedra: Ganaste!");



}else{



if(varCom == 2){



JOptionPane.showMessageDialog(null,"Papel vs Papel: Empate!");



}else{



if(varCom == 3){



JOptionPane.showMessageDialog(null,"Papel vs Tijera: Perdiste!");



}//



}//



} //

}else{



if(varUs == 3){



if(varCom == 1){



JOptionPane.showMessageDialog(null,"Tijera vs Piedra: Perdiste!");



}else{



if(varCom == 2){



JOptionPane.showMessageDialog(null,"Tijera vs Papel: Ganaste!");



}else{



if(varCom == 3){

}//



}//



} //



}//



}//


}//



// String resp =JOptionPane.showMessageDialog(null,"Desea Coninuar? 1 si,,, 0 no!");



// int r = Integer.parseInt(resp);



// }while(r == 1);



}//



}



Lo cargamos con javac nombre del archivo.java, despues java nombre del archivo el programa corre y luego te pide que escogas del 1 al 3 piedra, papel, tijera.

En es te caso yo escogi el 2 papel y la maquina piedra y me indica que gane.


Ejemplos de Recursividad e iteratividad

Materia de Lenguajes de Programacion.

Estos son unos programas en perl donde saco el factorial recursivamente e iterativamente

 Este es el ejemplo recursivo:

 Su terminal.-


Este es el ejemplo iterativo:
Su terminal.-

Estructuras Recursivas

Materia: Lenguajes de Programacion.


Introducción.

Un procedimiento o función recursiva es aquella que se llama así misma. Esta característica permite a un procedimiento recursivo repetirse valores diferentes de parámetros. La recursion es una alternativa a la iteración muy elegante en la solución de problemas, especialmente si estos tienen naturaleza recursiva.

Normalmente, una solución recursiva es menos eficiente en términos de tiempo de computadora que una solución iterativa debido al tiempo adicional de llamada a procedimientos.

En muchos casos, la recursion permite especificar una solución mas simple y natural para resolver un problema que en otro caso seria difícil. Por esta razón la recursion (recursividad) es una herramienta muy potente para la resolución de problemas de programación.

Un objeto recursivo es aquel que forma parte de si mismo. Esta idea puede servir de ayuda para la definición de conceptos matematicos. Asi, la definición del conjunto de los numeros naturles es aque conjunto en el que se cumplen las siguientes caracteristicas:

• 0 es un numero natural.

• El siguiente numero de un numero natural es otro numero natural.

Mediante una definición finita hemos representado un conjunto infinito.

El concepto de la recursividad es muy importante en programación. La recursividad es una herramienta muy eficaz para resolver diversos tipos de problemas existen muchos algoritmos que se describiran mejor en terminos recursivos.

Algoritmos recursivos

Un método común de simplificación consiste en dividir un problema en subproblemas del mismo tipo. Como técnica de programación, esto se denomina división y conquista, y constituye la llave para el desarrollo de muchos algoritmos importantes, así como un elemento fundamental del paradigma de programación dinámica.

Prácticamente todas las lenguajes de programación usadas hoy día permiten la especificação directa de funciones y procedimientos recursivos. Cuando una función es invocada, el ordenador (en la mayoría de los lenguajes sobre la mayor parte de las arquiteturas basadas en pilas) o la implementación del lenguaje registra las varias instancias de una función (en muchas arquiteturas, se usa una pila de llamada, aunque otros métodos puedan ser usados). Recíprocamente, toda función recursiva puede ser transformada en una función iterativa usando una pila.

Toda función que pueda ser producida por un ordenador puede ser escrita como función recursiva sin el uso de iteração; recíprocamente, cualquier función recursiva puede ser descrita a través de iterações sucesivas.

Dentro de la teoría de la recursión, se tiene que existen diferentes tipos de recursión:

Recursión directa. Cuando el código F tiene una sentencia que involucra a F.

Recursión indirecta o cruzada.- Cuando la función F involucra una función G que invoca a la ves una función H, y así sucesivamente, hasta que se involucra la función F. Por ejemplo el algoritmo de Par o impar.

int par (int n)
{
 if (n==0) return n+1;
return impar(n-1);
int impar(int n)
if (n==0) return 0;
return par(n-1);
}
A continuación se expone otro ejemplo de programa que utiliza recursión indirecta, y nos dice si un número es par o impar. Cabe mencionar que existen otros métodos mucho más sencillos para determinar la solución a este problema, basta con determinar el resto de la división entre dos. Por ejemplo: si hacemos par(2) devuelve 1 (cierto). Si hacemos impar(4) devuelve 0 (falso).

int par(int n);
int impar(int n);
int par(int n)
{ if (n == 0) return 1;
return impar(n-1);
}
int impar(int n)
{
 if (n == 0) return 0;
return par(n-1);
}

Recursión simple.- Aquella en cuya función solo aparece una llamada recursiva. Se puede transformar con facilidad en algoritmos iteractivos.

Recursión múltiple.- Se da cuando hay más de una llamada a sí misma dentro del cuerpo de la función, resultando más difícil de transformar a iteractiva. Poe ejemplo el algoritmo de Fibonacci.

int fibo(int n)
{
 if (n<=1) return 1
return fibo(n-1) + fibo(n-2)
}

Recursión anidada.- En algunos de los argumentos de la llamada hay una nueva llamada a sí misma. Por
ejemplo la función de Ackerman:
int Ack(int m, int n)
{
 if (m==0) return n+1
if (n=00) return Ack(n-1, 1)
return Ack(m-1, Ack(m, n-1));
}

Un requisito para que un algoritmo recursivo sea correcto es que no genere una secuencia infinita de llamadas sobre sí mismo. Cualquier algoritmo que genere una secuencia de este tipo no terminará nunca. En consecuencia, la definición recursiva debe incluir un componente base (condición de salida ) en el que f(n) se define directamente (es decir, no recursivamente) para uno o más valores de n. Debe existir una <> de la secuencia de llamadas recursivas.

Al estar trabajando con recursividad, la memoria de la computadora hace uso de una pila de recursión, la cual se divide de manera lógica en 4 segmentos:

Segmento de código.- Parte de la memoria donde se guardan las instrucciones del programa en código 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 de programa.- parte destinada a las variables locales y parámetros de la función que está siendo ejecutada.

Funciones mutuamente recursivas

Cuando se trabaja llamados a la ejecución de las funciones, se provocan las siguientes operaciones:

1.- Reservar espacio en la pila para los parámetros de la función y sus variables locales.

2.- Guardar en la pila la dirección de la línea de código desde donde se ha llamado a la función.

3.- Almacenar los parámetros de la función y sus valores de pila.

4.- Al terminar la función, se libera la memoria asignada en la pila y se vuelve a la instrucción actual.

Pero cuando se trabaja con funciones recursivas, se provoca además lo siguiente:

1.- 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.

2.- El nuevo ejemplar de función comienza a ejecutarse.

3.- Se crean más copias hasta llegar a la primera llamada (ultima en cerrarse).

La ciencia de la computación hace tiempo que descubrió que se puede reemplazar a un método que utiliza un bucle para realizar un cálculo con un método que se llame repetidamente a sí mismo para realizar el mismo cálculo. El hecho de que un método se llame repetidamente a sí mismo se conoce como recursion.

La recursión trabaja dividiendo un problema en subproblemas. Un programa llama a un método con uno o más parámetros que describen un problema. Si el método detecta que los valores no representan la forma más simple del problema, se llama a sí mismo con valores de parámetros modificados que describen un subproblema cercano a esa forma.

Esta actividad continúa hasta que el método detecta la forma más simple del problema, en cuyo caso el método simplemente retorna, posiblemente con un valor, si el tipo de retorno del método no es void. La pila de llamadas a método empieza a desbobinarse como una llamada a método anidada para ayudar a completar una evaluación de expresión. En algún punto, la llamada el método original se completa, y posiblemente se devuelve un valor.

Recursión infinita

La iteración y la recursión pueden producirse infinitamente. Un bucle infinito ocurre si la prueba o test de continuación del bucle nunca se vuelve falsa.

Una recursión infinita ocurre si la etapa de recursión no reduce el problema en cada ocasión de modo que converja sobre el caso base o condición de la salida.

En realidad, larecursión infinita significa que cada llamada recursiva produce otra llamada recursiva y esta a su vez otra llamada recursiva, y así para siempre. En la práctica, dicha función se ejecutará hasta que la computadora agote la memoria disponible y se produzca una terminación anormal del programa.

El flujo de control de una función recursiva requiere de tres condiciones para una terminación normal.

CUANDO NO UTILIZAR RECURSIVIDAD.

La solucion recursiva de ciertos problemas simplifica mucho la estructura de los programas. Como contrapartida, en la mayoria de los lenguajes de programación las llamadas recursivas a procedimientos o funciones tienen un coste de tiempo mucho mayor que sus homologos iterativos. Se puede, por lo tanto, afrimar que la ejecución de un programa recursivo va a ser mas lenta y menos eficiente que el programa iterativo que soluciona el mismo problema, aunque, a veces, la sencilles de la estructura recursiva justifica el mayor tiempo de ejecucion.

Los procedimientos recursivos se pueden convertir en no recursivos mediante la introducción de una pila y asi emular las llamadas recursivas. De esta manera se puede eliminar la recursion de aquellas partes de los programas que se ejecutan mas frecuentemente.

Bibliografias:

http://www.programacionfacil.com/estructura_datos_csharp:mecanica_de_recursion

http://es.wikilingue.com/pt/Recursividade_(ciencia_de_la_computaci%C3%B3n)

Estructuras Iterativas

Materia: Lenguajes de Programacion.

CONTROL DE FLUJO: ESTRUCTURAS ITERATIVAS

La iteración permite controlar mediante expresiones lógicas la repetición de una o varias instrucciones dentro del programa. Los bloques con las instrucciones que se repiten se conocen como ciclos o loops. La expresión que controla la ejecución del ciclo se conoce como condición de control.

El lenguaje de programación C cuenta con tres instrucciones para especificar iteraciones. Aunque las tres instrucciones son lógicamente equivalentes, sus diferencias se radican principalmente en la forma en que se controla la continuación o terminación del ciclo (especificación y verificación). Las instrucciones son:

• while
• do-while
• for
En realidad, casi todos los lenguajes cuentan con instrucciones parecidas (si no iguales) o que funcionan de un modo muy similar a las que vamos a ver aquí. Las estructuras iterativas de control de flujo se ocupan de repetir una serie de líneas de código tantas veces como el programador indique o bien hasta que se de una cierta condición. A estas estructuras también se les llama bucles.

BUCLES FOR
Los bucles for van asignando valores a una variable desde un valor inicial hasta un valor final, y cuando la variable contiene un valor que está fuera del intervalo el bucle termina. Veamos la sintaxis para hacernos mejor a la idea:

for (var=inicial;condición;siguientevalor)
{
Instrucciones
}
Sé que esto es algo difícil de leer, incluso para aquellos que hayan programado en otros lenguajes, puesto que los bucles for de C no se parecen mucho, en cuanto a su sintaxis, al resto de los bucles for de los otros lenguajes, así que trataré de explicarlo con detenimiento. Como veis, tras la sentencia for se indican las especificaciones del bucle entre paréntesis. Dichas especificaciones están divididas en tres partes separadas por punto y coma: la parte de asignación del valor inicial en primer lugar; la parte que verifica la continuidad del bucle (mediante una condición) en segundo lugar; y la parte en que se calcula el siguiente valor en tercer lugar. Pongamos un ejemplo: vamos a calcular el factorial de un número dado, que se encuentra almacenado en la variable num. Se podría hacer de dos formas:
for (byte i=num; i>1 ; i--)
{
fact*=i;
}
O bien:
for (byte i=1; i<=num ; i++)
{
fact*=i;
}
En primer lugar se asigna a la variable i el valor de num (vamos a suponer que num vale 3), es decir, después del primer paso, el valor de i es 3. Posteriormente se comprueba si dicha variable es mayor que 1, es decir, si 3>1. Como la condición del segundo paso se cumple se ejecuta el código del bucle en el tercer paso, fact*=i, con lo que fact (que valía 1) ahora vale 3 (1*3). En el cuarto paso se asigna el siguiente valor a i (i--), con lo que, ahora, i valdrá 2. En el quinto se vuelve a comprobar si i es mayor que 1, y como esto se cumple, el sexto paso vuelve a ejecutar el código del bucle (de nuevo, fact*=i), con lo que ahora fact vale 6 (3*2). El séptimo paso es idéntico al cuarto, es decir, se asigna el siguiente valor a la variable i (de nuevo, i--), con lo que ahora i valdría 1. El octavo paso es idéntico al quinto, comprobando por lo tanto si i es mayor que 1. Sin embargo esta vez, la condición no se cumple (1 no es mayor que 1, sino igual), por lo que la ejecución saldría del bucle y ejecutaría la siguiente línea del programa que esté fuera de él. Date cuenta de que el bucle se seguirá ejecutando siempre que la condición ( i>1 ) se cumpla, y dejará de ejecutarse cuando la condición no se cumpla. Por lo tanto, no habría sido válido poner i==2 en lugar de i>1, ya que esta condición se cumpliría únicamente cuando num valiera 2, pero no en cualquier otro caso. ¿Serías capaz de ver cómo funcionaría el otro bucle? Venga, inténtalo.
BUCLES FOR ANIDADOS
Efectivamente, se pueden colocar bucles for dentro de otros bucles for, con lo que obtendríamos lo que se llaman los bucles for anidados. Son también muy útiles: por ejemplo, piensa que tienes almacenadas unas cuantas facturas en una base de datos, y quieres leerlas todas para presentarlas en pantalla. El problema está en que cada factura tiene una o varias líneas de detalle. ¿Cómo podríamos hacer para cargar cada factura con todas sus líneas de detalle? Pues usando bucles anidados. Colocaríamos un bucle for para cargar las facturas, y otro bucle for dentro de él para que se cargaran las líneas de detalle de cada factura. Así, el segundo bucle se ejecutará completo en cada iteración del primer bucle. Veamos un ejemplo que nos aclare todo esto un poco más:

using System;
namespace BuclesAnidados
{
class BuclesAnidadosApp
{
static void Main()
{
for (int i=1; i<=3; i++)
{
Console.WriteLine("Factura número {0}", i);
Console.WriteLine("Detalles de la factura");
for (int j=1; j<=3; j++)
{
Console.WriteLine(" Línea de detalle {0}", j);
}
Console.WriteLine();
}
string a=Console.ReadLine();
}
}
}
Como ves, el bucle "j" está dentro del bucle "i", de modo que se ejecutará completo tantas veces como se itere el bucle i. Por este motivo, la salida en consola sería la siguiente:
Factura número 1

Detalles de la factura

Línea de detalle 1

Línea de detalle 2

Línea de detalle 3
Factura número 2

Detalles de la factura

Línea de detalle 1

Línea de detalle 2

Línea de detalle 3
Factura número 3

Detalles de la factura

Línea de detalle 1

Línea de detalle 2

Línea de detalle 3
Otra forma de anidar los bucles es utilizando solamente una única sentencia for, aunque no es un modo muy recomendable de hacerlo puesto que resulta mucho más difícil de leer. El siguiente código:

for (int i=1, int j=1; i<=3, j<=3; i++, j++)
{
...
}
Sería el equivalente a esto otro:
for (int i=1; i<=3; i++)
{
for (int j=1; j<=3; j++)
{
...
}
}
BUCLES WHILE
Bien, para los que no sepan inglés, "while" significa "mientras", de modo que ya os podéis hacer la idea: un bucle while se repetirá mientras una condición determinada se cumpla, o sea, devuelva true. Veamos su sintaxis:

while (expresión bool)
{
Instrucciones
}

Efectivamente, las "Instrucciones" que se hallen dentro del bucle while se ejecutarán continuamente mientras la expresión de tipo boolean retorne true. Por ejemplo, podemos escribir un bucle while para pedir una contraseña de usuario. Algo así:

using System;
namespace BuclesWhile
{
class BuclesWhileApp
{
static void Main()
{
string Clave="Compadre, cómprame un coco";
string Res="";
while (Res!=Clave)
{
Console.Write("Dame la clave: ");
Res=Console.ReadLine();
}
Console.WriteLine("La clave es correcta");
string a=Console.ReadLine();
}
}
}

En este pequeño ejemplo el programa pedirá una y otra vez la clave al usuario, y cuando este teclee la clave correcta será cuando finalice la ejecución del mismo. Así, la salida en la consola de este programa sería algo como esto (en rojo está lo que se ha tecleado durante su ejecución):

Dame la clave: No quiero

Dame la clave: Que no

Dame la clave: eres contumaz, ¿eh?

Dame la clave: Vaaaaale

Dame la clave: Compadre, cómprame un coco

La clave es correcta

¿Alguna pregunta? ¿Que qué habría pasado si la condición no se hubiera cumplido antes de ejecutar el bucle, es decir, si Res ya contuviera lo mismo que Clave antes de llegar al while? Bien, pues, en ese caso, el bucle no se hubiera ejecutado ninguna vez, es decir, al comprobar que la expresión de tipo boolean retorna false, la ejecución del programa pasa a la primera línea que se encuentra a continuación del bucle. Vamos a verlo para que te quede más claro. Modificaremos ligeramente el ejemplo anterior, así:

using System;
namespace BuclesWhile
{
class BuclesWhileApp
{
static void Main()
{
string Clave="Compadre, cómprame un coco";
string Res=Clave;
while (Res!=Clave)
{
Console.Write("Dame la clave: ");
Res=Console.ReadLine();
}
Console.WriteLine("La clave es correcta");
string a=Console.ReadLine();
}
}
}

En efecto, en este caso, la salida en consola sería la siguiente:

La clave es correcta
Ya que la ejecución no pasa por el bucle. Bueno, ya veis que es muy sencillo. Por cierto, luego os propondré algunos ejercicios para que practiquéis un poco todo esto de los bucles (a ver si pensabais que os ibais a escaquear).
BUCLES DO
Ciertamente, estos bucles tienen mucho que ver con los bucles while. La diferencia es que estos se ejecutan siempre al menos una vez, mientras que los bucles while, como acabamos de ver antes, pueden no ejecutarse ninguna vez. Veamos la sintaxis de los bucles "do":

do
{
Instrucciones
} while (expresión bool);

Como ves, también hay un while y una expresión boolean, pero en este caso se encuentra al final. De este modo, la ejecución pasará siempre por las instrucciones del bucle una vez antes de evaluar dicha expresión. Vamos a rehacer el ejemplo anterior cambiando el bucle while por un bucle do:

using System;
namespace BuclesDo
{
class BuclesDoApp
{
static void Main()
{
string Clave="Compadre, cómprame un coco";
string Res="";
do
{
Console.Write("Dame la clave: ");
Res=Console.ReadLine();
} while (Res!=Clave);
Console.WriteLine("La clave es correcta");
string a=Console.ReadLine();
}
}
}
El resultado sería el mismo que antes. La diferencia está en que aquí daría exactamente lo mismo lo que valiera la variable Res antes de llegar al bucle, puesto que este se va a ejecutar antes de comprobar dicho valor, y al ejecutarse, el valor de Res se sustituye por lo que se introduzca en la consola. Por lo tanto, repito, los bucles do se ejecutan siempre al menos una vez.
Por otro lado tenemos otro tipo de bucle, los bucles foreach, pero no hablaremos de ellos hasta que hayamos visto arrays e indizadores. Tened un poco de paciencia, que todo se andará.
INSTRUCCIONES DE SALTO
Las instrucciones de salto permiten modificar también el flujo del programa, forzando la siguiente iteración de un bucle antes de tiempo, o la salida del mismo o bien mandando la ejecución directamente a un punto determinado del programa (esto último está altamente perseguido y penado por la ley, o sea, los jefes de proyecto). Son pocas y muy sencillas, así que podéis estar tranquilos, que no os voy a soltar otra biblia con esto...


LA INSTRUCCIÓN BREAK
Algo hemos visto ya sobre la instrucción break. ¿Cómo que no? Anda, repásate la entrega anterior, hombre... Mira que se te ha olvidado pronto... En fin... a lo que vamos. La instrucción break fuerza la salida de un bucle antes de tiempo o bien de una estructura de control de flujo condicional en la que se encuentre (un switch). Ahora nos fijaremos en los bucles, que es donde andamos. Pondremos un ejemplo sencillo: El siguiente programa escribirá múltiplos de 5 hasta llegar a 100:

using System;
namespace InstruccionBreak
{
class InstruccionBreakApp
{
static void Main()
{
int num=0;
while (true)
{
Console.WriteLine(num);
num+=5;
if (num>100) break;
}
string a=Console.ReadLine();
}
}
}

¿Qué es eso de while (true)? Pues un bucle infinito. ¿No decíamos que dentro de los paréntesis había que colocar una expresión boolean? Pues entonces... true es una expresión boolean. De este modo, el bucle es infinito (claro, true siempre es true). Sin embargo, cuando la variable num tiene un valor mayor que 100 la ejecución del bucle terminará, pues se ejecuta una instrucción break.


LA INSTRUCCIÓN CONTINUE
La instrucción continue fuerza la siguiente iteración del bucle donde se encuentre (que puede ser un bucle for, while, do o foreach). Como esto se ve muy bien con un ejemplo, vamos con ello: El siguiente programa mostrará todos los números del uno al veinte a excepción de los múltiplos de tres:

using System;
namespace InstruccionContinue
{
class InstruccionContinueApp
{
static void Main()
{
for (int i=1; i<=20; i++)
{
if (i % 3 == 0) continue;
Console.WriteLine(i);
}
string a=Console.ReadLine();
}
}
}

En este ejemplo, el bucle for va asgnando valores a la variable i entre 1 y 20. Sin embargo, cuando el valor de i es tres o múltiplo de tres (es decir, cuando el resto de la división entre i y 3 es cero) se ejecuta una instrucción continue, de modo que se fuerza una nueva iteración del bucle sin que se haya escrito el valor de i en la consola. Por este motivo, aparecerían todos los números del uno al veinte a excepción de los múltiplos de tres.

Bibliografias:

http://www2.ing.puc.cl/~iic11021/materia/cap5.htm

http://www.exes.es/ManNET/index.asp?Pg=Entrega10.htm