domingo, 1 de noviembre de 2015

Historia de la algoritmia

La palabra algoritmo proviene del nombre del matemático llamado Abu Abdullah Muhammad bin Musa al-Khwarizmi (hay muchas variantes para el nombre al usar el alfabeto latin, tales como Al-Khorezmi, Al-Khwarizmi, Al-Khawarizmi, Al-Khawaritzmi o Al-Khowarizmi) que vivió entre los siglos VIII y IX.

Su trabajo consistió en preservar y difundir el conocimiento de la antigua Grecia y de la India. Sus libros eran de fácil comprensión, de ahí que su principal valor no fuera el de crear nuevos teoremas o nuevas corrientes de pensamiento, sino el de simplificar las matemáticas a un nivel lo suficientemente bajo para que pudiera ser comprendido por un amplio público. Cabe destacar cómo señaló las virtudes del sistema decimal indio (en contra de los sistemas tradicionales árabes) y cómo explicó que, mediante una especificación clara y concisa de cómo calcular sistemáticamente, se podrían definir algoritmos que fueran usados en dispositivos mecánicos similares a un ábaco en vez de las manos. También estudió la manera de reducir el numero de operaciones necesarias que formaban el cálculo.     Por esta razón, aunque no haya sido él el inventor del primer algoritmo, merece que este concepto esté asociado a su nombre. Al-Khorezmi fue sin duda el primer pensador algorítmico.

Ya en el siglo XIX, se produjo el primer algoritmo escrito para un computador. La autora fue Ada Byron, en cuyos escritos se detallaban la máquina analítica en 1842. Por ello que es considerada por muchos como la primera programadora aunque, desde Charles Babbage, nadie completó su máquina, por lo que el algoritmo nunca se implementó.

La idea de resolver un problema o de disponer de un algoritmo es bastante antigua, tal es así, que existía la errada creencia que no había problema que no se pudiera resolver y en base a ello, el matemático David Hilbert quiso descubrir un algoritmo para los algoritmos. Hoy en dia gracias a los trabajos de Kurt Gödel, Alonzo Church (calculo lamba), Alan Turing (maquina de turing), se sabe que dentro del universo de problemas, una pequeña parte es computable, luego que el objetivo que perseguia David Hilbert no era computable, es lo que se ha denominado como la computabilidad de los algoritmos.

Concepto de algoritmo, diagrama de flujo y pseudocódigo

Un algoritmo se define como un método que se realiza paso a paso para solucionar un problema que termina en un número finito de pasos. Las características fundamentales que debe cumplir todo algoritmo son:
  • Debe ser preciso e indicar el orden de realización de cada paso.
  • Debe ser definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez.
  • Debe ser finito. Si se sigue un algoritmo, se debe terminar en algún momento; o sea debe tener un número finito de pasos.
La definición de un algoritmo debe describir tres partes: Entrada, Proceso y Salida.

 

Diagrama de Flujo

Es aquel que se vale de diversos símbolos para representar las ideas o acciones a desarrollar. Es útil para organizar las acciones o pasos de un algoritmo pero requiere de etapas posteriores para implementarse en un sistema de cómputo.
También se puede decir que es la representación gráfica de un algoritmo, entre las características importantes de un diagrama de flujo podemos encontrar:
  •     Es fácil de darle seguimiento a las operaciones
  •     Es más fácil de corregir
  •     No existen problemas con el lenguaje, tal y como podría suceder con un algoritmo.

Pseudocódigo.
En ciencias de la computación y análisis numérico el pseudocódigo (o falso lenguaje) es una descripción de un algoritmo informático de programación de alto nivel compacto e informal que utiliza las convenciones estructurales de un lenguaje de programación verdadero, pero que está diseñado para la lectura humana en lugar de la lectura en máquina, y con independencia de cualquier otro lenguaje de programación. Normalmente, el pseudocódigo omite detalles que no son esenciales para la comprensión humana del algoritmo, tales como declaraciones de variables, código específico del sistema y algunas subrutinas.
https://andresmtzg.wordpress.com/2012/09/27/concepto-de-algoritmo-diagrama-de-flujo-y-pseudocodigo/

Variables y constantes

Proviene del latín variabĭlis, una variable es aquello que varía o puede variar. Se trata de algo inestable, inconstante y mudable. En otras palabras, una variable es un símbolo que representa un elemento no especificado de un conjunto dado. Este conjunto es denominado conjunto universal de la variable o universo de la variable, y cada elemento del conjunto es un valor de la variable.
Por ejemplo: x es una variable del universo {2, 4, 6, 8}. Por lo tanto, x puede tener cualquiera de dichos valores, es decir que puede ser reemplazada por cualquier número par menor a 9.
Una variable es un elemento de una fórmula, proposición o algoritmo, que puede ser sustituido o puede adquirir un valor cualquiera dentro de su universo. Los valores de una variable pueden definirse dentro de un rango o estar limitados por condiciones de pertenencia.
Puede hablarse de distintos tipos de variable: las variables dependientes, que son aquellas que dependen del valor que asuman otros fenómenos o variables; las variables independientes, cuyos cambios en los valores determinan cambios en los valores de otra; variables cualitativas, que expresan distintas cualidades, características o modalidades; y variables cuantitativas, que se enuncian mediante cantidades numéricas, entre otras.
En el ámbito de la programación (informática), las variables son estructuras de datos que pueden cambiar de contenido a lo largo de la ejecución de un programa. Estas estructuras corresponden a un área reservada en la memoria principal de la computadora.

Todos aquellos factores, eventos o sucesos, susceptibles de cambio, ya de sea de origen personal, social, físico, etc., que pueda adoptar más de un valor en un continuo, se le denomina variable, así por ejemplo, la edad, es una variable cuantitativa continua, ya que puede adoptar más de un valor en un gradiente preestablecido; otro ejemplo, sería el género, variable dicotómica (es decir puede adoptar dos únicos valores) de naturaleza cualitativa. Por tanto, es la naturaleza de la variable la que nos determina la forma de estudio.


Constantes

¿Qué tipos de constantes existen en programación?
» Constantes de Tipo Entero
» Constantes de Tipo Real
» Constantes de Tipo Lógico
» Constantes de Tipo Carácter
» Constantes de Tipo Cadena
» Ejercicios de Identificadores, Variables y Constantes en Pseudocódigo
En programación, una constante representa a un valor (dato almacenado en memoria) que no puede cambiar durante la ejecución de un programa. Por ejemplo, en lenguaje C, una constante puede ser de tipo entero, real, carácter, cadena o enumerado. Las constantes de tipo enumerado se van a estudiar en el apartado "Datos de Tipos Enumerados". En cuanto a las demás, se pueden expresar de dos formas diferentes:
  1. Por su valor.
  2. Con un nombre (identificador).
Ejemplo 1: Las siguientes constantes de tipo entero están expresadas por su valor:


-5
10

Para expresar una constante con un nombre, la constante debe ser declarada previamente. Todas las constantes que se declaran en un programa son definidas de la misma forma, indicando de cada una de ellas:

  1. Su nombre (mediante un identificador).
  2. El valor que simboliza (mediante una expresión)



Condicionales: simples y compuestos

No todos los problemas pueden resolverse empleando estructuras secuenciales, cuando hay que tomar una decisión aparecen las estructuras condicionales.

En nuestra vida diaria se nos presentan situaciones donde debemos decidir.
¿Elijo la carrera A o la carrera B?
¿Me pongo este pantalón?
Para ir al trabajo, ¿elijo el camino A o el camino B?
Al cursar una carrera, ¿elijo el turno mañana, tarde o noche?

Por supuesto que en un problema se combinan estructuras secuenciales y condicionales.

Estructura condicional simple.

Cuando se presenta la elección tenemos la opción de realizar una actividad o no realizar ninguna.

Representación gráfica:
Podemos observar: El rombo representa la condición. Hay dos opciones que se pueden tomar. Si la condición da verdadera se sigue el camino del verdadero, o sea el de la derecha, si la condición da falsa se sigue el camino de la izquierda.
Se trata de una estructura CONDICIONAL SIMPLE porque por el camino del verdadero hay actividades y por el camino del falso no hay actividades.

Por el camino del verdadero pueden existir varias operaciones, entradas y salidas, inclusive ya veremos que puede haber otras estructuras condicionales.


Condicional compuesta

Cuando se presenta la elección tenemos la opción de realizar una actividad u otra. Es decir tenemos actividades por el verdadero y por el falso de la condición. Lo más importante que hay que tener en cuenta que se realizan las actividades de la rama del verdadero o las del falso, NUNCA se realizan las actividades de las dos ramas.
Representación gráfica:

Operadores

En una condición deben disponerse únicamente variables, valores constantes y operadores relacionales.

Operadores Relacionales:

> (mayor) 
< (menor)
>= (mayor o igual)
<= (menor o igual)
= (igual)
!= (distinto)

Operadores Matemáticos

+ (más)
- (menos)
* (producto)
/ (división)
% (resto de una división)  Ej.:  x=13%5;  {se guarda 3}
Hay que tener en cuenta que al disponer una condición debemos seleccionar que operador relacional se adapta a la pregunta.

Ciclos

Ciclo Mientras

Esta es la estructura que nos permite repetir un bloque de instrucciones con una condición y se repite siempre y cuando esta condición sea verdadera, sino no entra al ciclo mientras.
La estructura es la siguiente:
INICIO.
   INSTRUCCION 1
    MIENTRAS (CONDICION LOGICA) HAGA
     INSTRUCCION 2
     INSTRUCCION 3
    FIN MIENTRAS
   INSTRUCCION 4
FIN

El ciclo mientras tiene que tener su final y salirse de él, tiene un límite y su límite es hasta que la condición ya no se cumpla, ósea que sea falsa.

Ejemplo
Realizar un algoritmo para sumar consecutivamente y cuando la suma sea superior a 100 deje de pedir números y muestre el total.
Pseudocodigo
INICIO
   ENTERO: N SUMA
   SUMA=0
    MIENTRAS (SUMA<=100)
     MOSTRAR ('DIGITE UN NUMERO')
     LEER(N)
     SUMA=SUMA+N
    FIN MIENTRAS
   MOSTRAR ('LA SUMA ES:', SUMA)
FIN

  

Ciclo hasta que

El ciclo HASTA QUE es similar al ciclo MIENTRAS, la diferencia está en que el bloque de acciones se ejecuta nuevamente si la condición evalúa a falso y no se ejecuta más si evalúa a verdadero. Sobra advertir que el bloque de acciones se ejecuta por lo menos una vez. La forma general del ciclo Hasta Que es la siguiente:



Ejemplo

Realizar un algoritmo que pregunte al usuario un número comprendido en el rango de 1 a 5. El algoritmo deberá validar el número, de manera que no continúe la ejecución del programa mientras no se escriba un número correcto.

Pseudocódigo
                        


Ciclo Desde, Hasta que.

El ciclo para, es un ciclo repetitivo donde el usuario decide cuantas veces quiere que repita una pregunta en el algoritmo. La estructura de este ciclo es la siguiente.
Para (expresión lógica) expresión incrementada.

Instrucción 1
instruccion2
Fin para

EJEMPLO.
Un algoritmo que lea 5 números dados por un usuario y luego muestra el resultado de la suma.

Pseudocodigo
INICIO
ENTERO: N, i, SUMA
SUMA=0
PARA (i= 1 HASTA, 5, 1)
MOSTRAR ('DIGITE UN NUMERO')
LEER (N)
SUMA= SUMA+N
FIN PARA
MOSTRAR ('LA SUMA ES:', SUMA)
FIN

Donde 5 son las veces que quiero que se repita la pregunta y 1 de cuanto en cuanto se incrementa, en este casa de 1 en 1.

Diagrama de flujo de Datos







Vectores y matrices


En programación, una matriz o vector es una zona de almacenamiento continuo, que contiene una serie de elementos del mismo tipo, los elementos de la matriz. Desde el punto de vista lógico una matriz se puede ver como un conjunto de elementos ordenados en fila (o filas y columnas si tuviera dos dimensiones).
En principio, se puede considerar que todas las matrices son de una dimensión, la dimensión principal, pero los elementos de dicha fila pueden ser a su vez matrices (un proceso que puede ser recursivo), lo que nos permite hablar de la existencia de matrices multidimensionales, aunque las más fáciles de imaginar son los de una, dos y tres dimensiones.
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, ya que esta estructura puede cambiar de tamaño fácilmente durante la ejecución de un programa.

Índices

Todo vector se compone de un determinado número de elementos. Cada elemento es referenciado por la posición que ocupa dentro del vector. Dichas posiciones son llamadas índice y siempre son correlativos. Existen tres formas de indexar los elementos de una matriz:
·         Indexación base-cero (0): en este modo el primer elemento del vector será la componente cero ('0') del mismo, es decir, tendrá el índice '0'. En consecuencia, si el vector tiene 'n' componentes la última tendrá como índice el valor 'n-1'. El lenguaje C es un ejemplo típico que utiliza este modo de indexación.
·         Indexación base-uno (1): en esta forma de indexación, el primer elemento de la matriz tiene el índice '1' y el último tiene el índice 'n' (para una matriz de 'n' componentes).
·         Indexación base-n (n): este es un modo versátil de indexación en la que el índice del primer elemento puede ser elegido libremente, en algunos lenguajes de programación se permite que los índices puedan ser negativos e incluso de cualquier tipo escalar (también cadenas de caracteres).

Notación

La representación de un elemento en un vector se suele hacer mediante el identificador del vector seguido del índice entre corchetes, paréntesis o llaves:
Notación
Ejemplos
vector[índice_1,índice_2...,índice_N]
(JavaLexicoPerl, etc.)
vector[índice_0][índice_1]...[índice_N]
(CC++PHP, etc.)
vector(índice_1,índice_2...,índice_N)
(Basic)
Aunque muchas veces en pseudocódigo y en libros de matemática se representan como letras acompañadas de un subíndice numérico que indica la posición a la que se quiere acceder. Por ejemplo, para un vector "A":
A0, A1, A2 (vector unidimensional)

Formas de acceso

La forma de acceder a los elementos de la matriz es directa; esto significa que el elemento deseado es obtenido a partir de su índice y no hay que ir buscándolo elemento por elemento (en contraposición, en el caso de una lista, para llegar, por ejemplo, al tercer elemento hay que acceder a los dos anteriores o almacenar un apuntador o puntero que permita acceder de manera rápida a ese elemento).
Para trabajar con vectores muchas veces es preciso recorrerlos. Esto se realiza por medio de bucles. El siguiente pseudocódigo muestra un algoritmo típico para recorrer un vector y aplicar una función '' a cada una de las componentes del vector:
i = 0
mientras (i < longitud)
    //Se realiza alguna operación con el vector en la i-ésima posición
    f(v[i])
    i=i+1