Algoritmos

Casi inconscientemente los seres humanos realizamos tareas rutinarias en series de pasos, procedimientos o acciones que nos permiten alcanzar un resultado para resolver un problema.


Esta serie de pasos o procesos comenzamos a aplicarlas muy temprano desde en la mañana, cuando por ejemplo decidimos tomar un baño, preparar nuestro desayuno, trasladarnos a la escuela o trabajo. Las acciones las repetimos todos los días durante semanas, incluso años. Continuamente hacemos todas nuestras acciones en procesos o pasos para alcanzar cualquier resultado. A estos pasos en informática les llamamos Algoritmos y sirven para resolver problemas.

Definición
Según Osvaldo Cairó: "Formalmente definimos un algoritmo como un conjunto de pasos, procedimientos o acciones que nos permiten alcanzar un resultado o resolver un problema".
Inconcientemente, de manera automática aplicamos algoritmos para resolver problemas cotidianos, cuándo hemos resuelto el problema muchas veces, por ejemplo: si tienes un coche en un estacionamiento, realizas una serie de pasos o acciones para pagar tu boleto y sacar tu coche del estacionamiento.
Un ejemplo común de cómo aplicamos algoritmos de manera inconciente es por ejemplo cuando te lastimas la mano derecha y tienes que abrir una puerta para salir, no te das cuenta del movimiento que hacen tus músculos, tendones y huesos de tu mano, ni el problema que implica abrir una puerta, por que lo realizas todos los días sin mayor dificultad.
Entonces concluimos que los Algoritmos son diseñados o creados para resolver problemas
  La historia ubica la invención de los algoritmos en el siglo IX, por obra y gracia del matemático y astrónomo Mohamed ibn Musa-al Jwarizmi, de allí su nombre. Desarrollo en el Al-yebr-mugabata fórmulas para posibilitar que con un número limitado de pasos e indicaciones claras de ejecución se pudieran resolver ecuaciones de primer y segundo grado.
Desde la simplicidad de preparar una ensalada, a la posibilidad de resolver un problema complejo que nos preocupa los algoritmos son de inestimable ayuda. Lógicamente este moderno caballo de Troya solo muestra su eficiencia estratégica a quienes practican su desarrollo, cuando se le presentan situaciones no rutinarias o aún cuando recurren a los numerosos algoritmos disponibles para situaciones más complejas.
Reglas
Las características que los algoritmos deben reunir son las siguientes:
1. Precisión: Los pasos a seguir en el algoritmo deben ser precisados claramente.
2. Determinismo: El algoritmo, dado un conjunto de datos idénticos de entrada, siempre debe arrojar los mismos resultados
3. Finitud: El algoritmo, independientemente de la complejidad del mismo, siempre debe ser de longitud finita.
Los Algoritmos entonces deberán ser una secuencia de instrucciones numeradas y ordenadas.
Existe una gran cantidad de problemas que requieren de un análisis profundo y de un pensamiento flexible y estructurado para encontrar su solución,. Esos son los tipos de problemas informáticas que se resuelven mediante algoritmos.
Las etapas que debemos seguir para resolver un problema son los siguientes:
Las tres secciones o módulos principales de un Algoritmo son:
El módulo 1 representa la operación o acción que permite el ingreso de los datos del problema.
El módulo 2 representa la operación o conjunto de operaciones secuenciales, cuyo objetivo es obtener la solución al problema.
El módulo 3 representa una operación o conjunto de operaciones que permiten comunicar al exterior el o los resultados alcanzados.
PROBLEMAS EJEMPLO
Tómese como ejemplos sensillos los siguientes
Algoritmo para cambiar una llanta de un coche.
Herramientas
1 llanta de refacción
1 gato hidráulico
1 palanca
1 llave de cruz
1 madero o piedra
Algoritmo
1. coloque el madero o piedra detrás de la llanta
2. con la llave de cruz afloje los birlos de la llanta ponchada.
3. Coloque el gato hidráulico debajo de coche.
4. con la palanca en el gato,  eleve el coche.
5. Quite los birlos a la llanta.
6. Retire la llanta
7. Coloque la llanta de refacción
8. Coloque los tornillos y gírelos con la mano
9. baje el coche con la palanca del gato
10. Con la llave de cruz apriete los birlos.
11. Retire el madero y el gato.
NOTA: El algoritmo fue probado repetidas veces y siempre arrojó el mismo resultado: La llanta lista para usarse.
ALGORITMO PARA REALIZAR LA SUMA DE DOS VARIABLES
FORMULA: C= A + B
VARIABLES: C, A, B DE TIPO NUMÉRICO.
1. Capture un valor numérico.
2. Asigne el valor numérico a la variable A
3. Capture un valor numérico.
4. Asigne el valor numérico a la variable B
5. Realice la suma A + B y asigne el resultado a la variable C.
NOTA; El algoritmo puede ser probado repetidas ves y siempre arrojará el mismo resultado: una suma.
Definición De Programa
Un programa, es un concepto desarrollado por Von Neumann en 1946, es un conjunto de instrucciones que sigue la computadora para alcanzar un resultado específico.
Un lenguaje de programación, por otra parte, está constituido por un conjunto de reglas sintácticas especifica  la formación de instrucciones validas y semánticas especifica el significado de estas instrucciones, que hacen posible escribir un programa. Cualquier notación para la descripción de algoritmos  y estructuras de datos puede llamarse lenguaje de programación; sin embargo, nosotros requeriremos además, que este lenguaje sea implantado en la computadora.
Definición de Programación Lineal
La programación lineal es el conjunto de técnicas matemáticas que intentan resolver la maximización o minimización de una función objetivo, función lineal de varias variables, sujeta a ciertas restricciones, expresadas por secuencias lineales.
Definición de Programación Estructurada
Es una técnica en la cual la estructura de un programa, la escritura de sus partes se realiza tan claramente como es posible mediante el uso de tres estructuras lógicas de control:
· Secuencia: Sucesión simple de dos o más operaciones.
· Selección: División condicional de una o más operaciones.
· Interacción: Repetición de una operación mientras se cumple una condición.
Estos tres tipos de estructuras lógicas de control pueden ser combinados para producir programas que manejen cualquier tarea de procesamiento de información.
Un programa estructurado esta compuesto de segmentos, los cuales puedan estar constituidos por unas pocas instrucciones o por una pagina o más de codificación. Cada segmento tiene solamente una entrada y una salida, estos segmentos, asumiendo que no poseen lazos infinitos y no tienen instrucciones que jamás se ejecuten, se denominan programas propios. Cuando varios programas propios se combinan utilizando las tres estructuras básicas de control mencionadas anteriormente, el resultado es también un programa propio.
La Programación Estructurada esta basada en el Teorema de la Estructura*, el cual establece que cualquier programa propio (un programa con una entrada y una salida exclusivamente) es equivalente a un programa que contiene solamente las estructuras lógicas mencionadas anteriormente.
Una característica importante en un programa estructurado es que puede ser leído en secuencia, desde el comienzo hasta el final sin perder la continuidad de la tarea que cumple el programa, lo contrario de lo que ocurre con otros estilos de programación.
Esto es importante debido a que, es mucho más fácil comprender completamente el trabajo que realiza una función determinada, si todas las instrucciones que influyen en su acción están físicamente cerca y encerradas por un bloque. La facilidad de lectura, de comienzo a fin, es una consecuencia de utilizar solamente tres estructuras de control y de eliminar la instrucción de desvío de flujo de control, excepto en circunstancias muy especiales tales como la simulación de una estructura lógica de control en un lenguaje de programación que no la posea.
 
VENTAJAS POTENCIALES
Un programa escrito de acuerdo a estos principios no solamente tendrá una estructura, sino también una excelente presentación.
Un programa escrito de esta forma tiende a ser mucho más fácil de comprender que programas escritos en otros estilos.
La facilidad de comprensión del contenido de un programa puede facilitar el chequeo de la codificación y reducir el tiempo de prueba y depuración de programas. Esto ultimo es cierto parcialmente, debido a que la programación estructurada concentra los errores en uno de los factores más generador de fallas en programación: la lógica.
Un programa que es fácil para leer y el cual esta compuesto de segmentos bien definidos tiende a ser simple, rápido y menos expuesto a mantenimiento. Estos beneficios derivan en parte del hecho que, aunque el programa tenga una extensión significativa, en documentación tiende siempre a estar al día, esto no suele suceder con los métodos convencionales de programación.
La programación estructurada ofrece estos beneficios, pero no se la debe considerar como una panacea ya que el desarrollo de programas es, principalmente, una tarea de dedicación, esfuerzo y creatividad.
*TEOREMA DE LA ESTRUCTURA
El teorema de la estructura establece que un programa propio puede ser escrito utilizando solamente las siguientes estructuras lógicas de control: secuencia, selección e iteración.
Un programa de define como propio si cumple con los dos requerimientos siguientes:
                a. Tiene exactamente una entrada y una salida para control del programa.
    1. Existen caminos seguibles desde la entrada hasta la salida que conducen por cada parte del programa, es decir, no existen lazos infinitos ni instrucciones que no se ejecutan.
Las tres estructuras lógicas de control básicas, se definen de la siguiente forma:
Secuencia: es simplemente la formalización de la idea de que las instrucciones de un programa son ejecutadas en el mismo orden en que ellas aparecen en el programa. En términos de diagrama de flujo la secuencia es representada por una función después de la otra.
Selección: Es la elección entre dos acciones tomando la decisión en base al resultado de evaluar un predicado. Esta estructura de control es denominada usualmente
IF-THEN-ELSE.
Iteración: Esta estructura lógica es utilizada para que se repita la ejecución de un conjunto de instrucciones mientras se cumpla una condición o predicado. Generalmente a esta estructura se le conoce como DO-WHILE (hacer mientras).
  OTRAS ESTRUCTURAS LÓGICAS DE CONTROL:
Aunque todos los programas pueden ser escritos utilizando solamente las tres estructuras de control descritas anteriormente, es algunas veces, conveniente utilizar algunas estructuras adicionales:
La estructura de iteración básica es el DOWHILE, pero existe una estructura que es muy parecida a ella y que a veces es usada, dependiendo del proceso que se este tratando de representar y de las características apropiadas en el lenguaje con el cual se esta trabajando, esta forma de control es la que se llama DOUNTIL.
Algunas veces resulta de gran ayuda, desde el punto de vista de eficiencias y facilidad de lectura de un programa, tener alguna forma de expresar una desviación del flujo de control hacia múltiples procesos en función del resultado de la evaluación de un predicado; usualmente, a la estructura de control que satisface el requerimiento anterior, se le denomina la estructura CASE . Por ejemplo, si es necesario ejecutar una de cien tareas diferentes en función del valor de un código de 2 dígitos, podemos representar este proceso mediante 100 estructuras IF, sin embargo el sentido común nos induce a pensar que no hay razón para adherirnos rígidamente a las tres estructuras básicas de control y en lugar de 100 IF usaríamos la estructura CASE, que permite hacerlo más rápido.
Esta estructura utiliza el valor de una variable para determinar cual, de varias rutinas, será ejecutada. La representación gráfica de esta estructura de control se muestra a continuación:
En cada lenguaje será necesario establecer cuales son las instrucciones que, en forma conveniente y eficiente, realizan funciones establecidas por las diferentes estructuras lógicas de control.
  ETIQUETAS E INSTRUCCIÓN GO-TO:
Ocasionalmente se habla de la programación estructurada como una técnica de programación que no utiliza GO-TO(instrucción de desvío del flujo de control en forma incondicional); si bien es cierto que un programa bien estructurado tiene, o bien ninguna o muy pocas instrucciones GO-TO, asumiendo que estamos empleando un lenguaje de programación adecuado, la ausencia de instrucciones GO-TO puede ser mal interpretada.
Un programa bien estructurado gana una parte importante de su fácil comprensión del hecho que puede ser leído en forma secuencial sin desvíos en el flujo de control desde una parte del programa a otra. Esta característica es consecuencia de usar exclusivamente las estructuras lógicas de control estándar, esta lectura TOPDOWN es beneficiosa debido a que hay un limite definido para muchos detalles que la mente humana puede abarcar de una vez. Se hace relativamente fácil y rápida la comprensión de la tarea que realiza una instrucción si su función puede ser entendida en términos de unas pocas instrucciones mas, físicamente contiguas y delimitadas.
El problema con la instrucción GO-TO es que generalmente aleja al programa realizado de los propósitos descritos y en casos extremos puede hacer que un programa sea esencialmente incomprensible.
No se requieren esfuerzos especiales para eliminar de un programa los GO-TO, los cuales han sido, algunas veces, malentendidos como enemigos de la programación estructurada, existen buenas razones para no querer usarlos pero no se necesita que se realice un trabajo arduo para eliminarlo; ellos no aparecerán, en general, cuando se utilicen las estructuras lógicas de control, descritas anteriormente. Naturalmente, si escogemos para programar un lenguaje de computación que no posea las estructuras lógicas de control fundamentales, entonces, tendremos que simularlas y seguramente ello implicara el uso de la instrucción GO-TO; pero este uso puede hacerse en forma controlada.
Existen situaciones poco comunes en las cuales el uso de GO-TO puede tener ventajas comparado con otras maneras de expresar un proceso; estos casos son excepcionales y usualmente no ocurren en la programación realizada diariamente.
Se deben analizar cuidadosamente las consecuencias de emplear el GO-TO, antes de su uso.
SEGMENTACIÓN:
Para la comprensión de un programa se haga en forma fácil y rápida es necesario que, al revisarlo, uno no tenga que hojear una gran cantidad de paginas para entender cuales el trabajo que realiza. Una regla practica para lograr estos fines es establecer que cada segmento del programa no exceda, en longitud, a una pagina de codificación, o sea, alrededor de 50 líneas (el significado que se asigna al termino segmento, en este trabajo, no tiene ninguna relación con su significado con relación a las funciones de sistemas operativos o sistemas maneadores de Bases de Datos.)
La segmentación no es solamente partir un programa en trozos cuya longitud sea de unas 50 líneas; esta técnica debe cumplir con ciertas características fundamentales:
La segmentación reflejará la división del programa en partes que se relacionen entre sí en forma jerárquica, formando una estructura de árbol. Esta organización puede ser representada gráficamente por un diagrama de procesos, lo que hace más sencillo comprender la relación existente entre un segmento y el resto del programa. Adicionalmente, podemos indicar que, el segmento arriba de la estructura jerárquica contendrá las funciones de control de mas alto nivel, mientras que los segmentos inferiores en esta organización contendrán funciones detalladas.
Una segmentación bien diseñada deberá mostrar, claramente, las relaciones existentes entre las distintas funciones de manera que sea fácil comprender lo que debe hacer el programa y asegurar que efectivamente lo realice. Este hecho, garantizará que los cambios que se efectúen a una parte del programa, durante la programación original o su mantenimiento, no afecten al resto del programa que no ha sufrido cambios.
En una segmentación bien realizada la comunicación entre segmentos se lleva a cabo de una manera cuidadosamente controlada. Algunos programadores recomiendan que los segmentos consistan en procedimientos y la única comunicación existente entre ellos sea a través de una lista de parámetros, esto reduce la oportunidad de que interactúen entre ellos de una manera indeseada e in entendible.
IDENTIFICACIÓN:
El uso de la identificación es importante debido a que, cuando se es consistente en su utilización, facilita la lectura del programa al mostrar en una forma gráfica las relaciones existentes entre las distintas instrucciones.
La identificación puede ser de gran beneficio.
Las siguientes son sugerencias para el desarrollo de identificación en un centro de procesamiento, la idea fundamental es ayudar a que el lector de un programa le sea fácil comprender las relaciones y las funciones existentes en él:
a. En los lenguajes donde se permite el uso de etiquetas, estas deben colocarse lo más externas posibles, por ejemplo comenzando en la columna 2, y deben estar separadas por una línea (siempre que lo permita el lenguaje en uso.)
    1. Se obtiene fundamento si todas las instrucciones comienzan en una misma columna, por ejemplo en la columna 4 o cualquier otra ubicada a su derecha.
    2. En los lenguajes en que se hagan declaraciones sobre las variables a utilizar, la información quedara mas claramente representada si los atributos declarados se alinean en forma vertical.
    3. El uso de líneas en blanco ayuda a mostrar con mas claridad las relaciones existentes entre distintos ítems agrupados en las declaraciones
    4. Las instrucciones son mucho más fáciles de localizar y de cambiar si no se escribe mas de una instrucción por línea.
    5. La visión de control de las estructuras lógicas o de los bloques se clarifica si las instrucciones controladas son idénticas por alguna cantidad constante.
  VENTAJAS DE LA PROGRAMACIÓN ESTRUCTURADA:
Con la programación estructurada elaborar programas de computador sigue siendo un albor que demanda esfuerzo, creatividad, habilidad y cuidado. Sin embargo, con este nuevo estilo podemos obtener las siguientes ventajas:
                 1. Los programas son más fáciles de entender. Un programa estructurado puede ser leído                          en secuencia, de arriba hacia abajo, sin necesidad de estar saltando de un sitio a otro                      en la lógica, lo cual es típico de otros estilos de programación. La estructura del                      programa es más clara puesto que las instrucciones están más relacionadas entre sí, por                       lo que es más fácil comprender lo que hace cada función.
    1. Reducción del esfuerzo en las pruebas. El programa se puede tener listo para producción normal en un tiempo menor del tradicional; por otro lado, el seguimiento de las fallas("debugging") se facilita debido a la lógica más visible, de tal forma que los errores se pueden detectar y corregir mas fácilmente.
    2. Programas más sencillos y más rápidos.
    3. Aumento de la productividad del programador.
    4. Se facilita la utilización de las otras técnicas para el mejoramiento de la productividad en programación.
    5. Los programas quedan mejor documentados internamente.
DEFINICIÓN DE SISTEMA
Un sistema informático es un conjunto de partes que funcionan relacionándose entre sí con un objetivo preciso. Sus partes son: hardware, software y las personas que lo usan. Por ejemplo, una computadora, sus dispositivos periféricos y la persona que la maneja, pueden constituir un sistema informático. Un sistema informático puede formar parte de un sistema de información; en este último la información, uso y acceso a la misma, no necesariamente está informatizada. Por ejemplo, el sistema de archivo de libros de una biblioteca y su actividad en general es un sistema de información. Si dentro del sistema de información hay computadoras que ayudan en la tarea de organizar la biblioteca, estonces ese es un sistema informático. Diferencia entre sistema informático y sistema de información * En un sistema informático se utilizan computadoras para almacenar, procesar y/o acceder a información. * En un sistema de información se pueden utilizar computadoras, pero no es necesario. El acceso a la información puede ser físico (por ejemplo, una persona se encarga de buscar en un archivador). * Tanto el sistema informático como el sistema de información, incluyen a las personas que acceden o producen información dentro del sistema. Las personas tienen que capacitarse para entender el funcionamiento y procedimientos que soporta sistema. * Ambos sistemas tienen un propósito. Por ejemplo, gestionar el acceso y distribución de libros una biblioteca, administrar la entrada/salida de mercadería, personal y otros recursos de un comercio, etc.