Algoritmos

Resolución de Problemas con Computadora

El proceso para diseñar programas con un lenguaje de programación es un proceso creativo, por lo que es de gran importancia que las ideas fluyan. La Ingeniería de Software propone una serie de fases o pasos comunes para dar solución a todo tipo de problema, implementando las bases de investigación e imaginación y así llegar a una solución adecuada.

Fase 1. Análisis del Problema

Esta fase requiere una clara definición donde se contemple exactamente lo que debe hacer el programa y el resultado o solución deseada. Dado que se busca una solución, es importante tener claro lo que se desea realizar y responder a las siguientes preguntas:

  • cuáles datos se conocen (datos de entrada)
  • cuáles datos hacen falta (datos de entrada, solicitar al usuario)
  • cuál es el resultado que se debe generar (datos de salida)
  • qué se debe hacer con esos datos (método que produzca el resultado deseado)

Fase 2. Diseño de la solución

En la fase de diseño se determina como hace el programa la tarea solicitada. Los métodos utilizados para el proceso del diseño se basan en el conocido divide y vencerás. Es decir, la resolución de un problema complejo se realiza dividiendo el problema en subproblemas y a continuación dividir estos subproblemas en otros de nivel mas bajo, hasta que sea implementada una solución en la computadora. Este método se conoce técnicamente como diseño descendente (top-down) o modular.

Cada programa bien diseñado consta de un programa principal (el módulo de nivel mas alto) que llama a subprogramas (módulos) de nivel mas bajo, que a su vez pueden llamar a otros subprogramas. Los módulos pueden ser planeados, codificados, comprobados y depurados independientemente y a continuación combinarlos entre sí.

Este proceso implica la ejecución de estos pasos hasta que el programa se ha terminado:

  • Programar un módulo
  • Comprobar el módulo
  • Depurar el módulo
  • Combinar el módulo, con el resto de los otros módulos

Para un buen diseño de la solución se hace uso de diversas herramientas, tales como: algoritmos, diagramas de flujo, pseudocódigo, código, pruebas y depuración, documentación y mantenimiento.

Fase 3. Algoritmo

Se define como una secuencia de instrucciones que representan un modelo de solución para determinado tipo de problemas. También, se puede definir como un conjunto de instrucciones que realizadas en orden conduce a obtener la solución de un problema. Ejemplo:

Algoritmo: Calcular el área de un rectángulo

1. Inicio
2. Declarar Variables: base, altura, área
3. Pedir datos de base y altura
4. Realizar operación área = base * altura
5. Mostrar el resultado de área
6. Fin

Fase 4. Diagrama de Flujo

El Diagrama de Flujo es una herramienta que permite interpretar la solución de un problema de forma visual. Se define como la representación gráfica que describe un proceso, sistema o algoritmo informático. Los diagramas de flujo emplean rectángulos, óvalos y otras figuras para definir el tipo de paso, junto con flechas conectoras que establecen el flujo y la secuencia. Ejemplo:

Diagrama de Flujo: Calcular el área de un rectángulo

Fase 5. Pseudocódigo

El pseudocódigo es una descripción de alto nivel también conocido como falso lenguaje que utilizan los programadores para representar la solución a un algoritmo de la forma más detallada posible, y a su vez lo más parecida posible al lenguaje de programación que posteriormente se utilizará para la codificación. El pseudocódigo no es programable, solo facilita la programación.

Por lo que se puede definir como una mezcla de lenguaje de programación (en español, ingles o cualquier otro idioma) que se emplea, dentro de la programación estructurada, para realizar el diseño de un programa. (Hernández, 2010).

El pseudocódigo utiliza para representar las acciones sucesivas palabras reservadas en inglés (similares a sus homónimos en los lenguajes de programación), tales como star, begin, end, stop, if-then-else, while, repeat-until, etc. Es un lenguaje de especificación de algoritmos, por lo que su uso permite el paso a la codificación final (esto es, la traducción a un lenguaje de programación) relativamente fácil. Ejemplo:

Pseudocódigo: Calcular el área de un rectángulo

Inicio
Inicializar variables base=0, altura=0, área=0
Mostrar “Introduzca el valor de la base”
Capturar el valor de base
Mostrar “Introduzca el valor de la base”
Capturar el valor de altura
área = base * altura3
Mostrar “El resultado es: “, área

Fin

Fase 6. Codificación

Es la escritura en un lenguaje de programación de la representación de un algoritmo. Dado que el diseño del algoritmo es independiente del lenguaje de programación utilizado en su implementación, el código puede ser escrito con igual facilidad en un lenguaje o en otro. Ejemplo en lenguaje Ansi C:

El programa fuente debe ser traducido a lenguaje máquina. Este proceso se realiza con el compilador y el sistema operativo que se encarga prácticamente de la compilación. Si al compilar el programa fuente se presentan errores (errores de compilación), es necesario volver a editar el programa, corregir los errores y compilar de nuevo. Esto se repite hasta que ya no se presenten más errores, obteniéndose el programa objeto, el cual todavía no es ejecutable directamente. Al ya no existir errores en el programa fuente se debe instruir al sistema operativo para que efectúe la fase de montaje o enlace, del programa fuente con las librerías del programa del compilador. Este proceso de montaje produce un programa ejecutable. Suponiendo que no existen errores durante la ejecución (errores en tiempo de ejecución), se obtendrá la salida de resultados correctos del programa.

Fase 7. Prueba y depuración

Las pruebas consisten en identificar errores que se presenten en la ejecución del programa. Mientras que la depuración consiste en eliminar los errores que se hayan detectado durante la prueba, para dar paso a la solución adecuada.

Las pruebas de escritorio nos permiten verificar de manera manual los valores que van obteniendo cada una de las variables involucradas en el algoritmo, siguiendo la lógica de programación establecida. De esta forma, podemos tener mayor certidumbre de que el algoritmo al programarlo realizará lo que realmente queremos que haga.

Al ejecutar un programa se pueden producir tres tipos de errores:

  • Errores de Compilación: Se producen normalmente por un uso incorrecto de las reglas del lenguaje de programación, suelen ser errores de sintaxis.
  • Errores de Ejecución: Se producen por instrucciones que la computadora puede comprender pero no ejecutar. En estos casos se detiene la ejecución del programa y se imprime un mensaje de error. Ejemplo de esto puede ser una división por cero.
  • Errores Lógicos: Se producen en la lógica del programa y la fuente del error suele ser el diseño del algoritmo, son más difíciles de detectar puesto que el programa puede funcionar y no producir errores de compilación ni de ejecución pero regresará resultados incorrectos. En este caso se debe regresar a la fase de diseño, modificar el algoritmo, cambiar el programa fuente y compilar y depurar una vez más.

Fase 8. Documentación

Es la guía o comunicación escrita que sirve como ayuda para usar un programa, o facilitar futuras modificaciones. La importancia de la documentación debe ser destacada por su influencia en la etapa final, ya que programas pobremente documentados son difíciles de leer, mas difíciles de depurar y casi imposibles de mantener y modificar.

Puede ser interna y externa. La documentación interna es la contenida en líneas de comentarios. La documentación externa incluye análisis, diagramas de flujo y/o pseudocódigo, manuales de usuarios con instrucciones para ejecutar el programa y para interpretar los resultados.

La documentación es vital cuando se desea corregir posibles errores futuros o bien cambiar el programa. Estos cambios se denominan mantenimiento del programa.

Además es de buena costumbre para todo buen programador, dejar comentado su código, esto es para que el futuro programador pueda darle mantenimiento fácilmente a el programa, o incluso, si es el mismo creador quien debe darle mantenimiento.

Fase 9. Mantenimiento

El mantenimiento se lleva a cabo después de terminar el programa, tales aplicaciones de software deben ser sometidas a procesos de modificación que extiendan su vida útil o mejoren sus características. El mantenimiento consisten en la corrección de errores (bugs), adaptación a nuevos entornos tecnológicos o agregado de funcionalidad. Es una actividad que se repite periódicamente desde que empieza a utilizarse hasta su abandono definitivo.

Existen distintos tipos de mantenimiento: a) preventivo, b) predictivo, c) correctivo, d) adaptativo e) evolutivo y f) perfectivo.

2. Algoritmos

Es un método para resolver un problema, debe presentarse como una secuencia ordenada de instrucciones que siempre se ejecutan en un tiempo finito y con una cantidad de esfuerzo también finito. El concepto se puede resumir en: método para resolver un problema mediante una serie de pasos precisos, definidos y finitos.

En un algoritmo siempre debe haber un punto de inicio y un punto de terminación, estos deben ser únicos y deben ser fácilmente identificables.

Características del Algoritmo

Todo algoritmo debe cumplir las siguientes características:

  • Ser Preciso: Debe especificar sin ambigüedad el orden en que se deben ejecutar las instrucciones.
  • Estar Definido: Cada vez que se ejecute bajo las mismas condiciones, la secuencia de ejecución deberá ser la misma proporcionándonos el mismo resultado.
  • Ser Finito: Siempre que sea adecuado sé realizarán un número finito de instrucciones, en un tiempo finito y requiriendo una cantidad finita de esfuerzo.

Por ejemplo: Un algoritmo que nos permita calcular el área de un cuadrado e imprima su resultado. Primero será necesario analizar todo aquello que se requiera para solucionar este problema, es decir; identificar las entradas de datos (la dimensión del lado), la información a mostrar (el área) y los procesos o formulas que tendremos que realizar para producir un resultado deseado (la operación área = lado X lado).

  1. inicio
  2. leer un lado
  3. hacer el área = lado X lado
  4. Mostrar el resultado, área
  5. Fin

Otro ejemplo seria un algoritmo que nos indique el número mayor de dos números.

  1. inicio
  2. leer los valores para X, Y
  3. Si el valor X > Y, entonces
  4. Mostrar el valor X
  5. Si no
  6. Mostrar el valor Y
  7. Fin

Algoritmo que permita saber el área de un círculo de radio variable.

  1. Inicio
  2. Leer el radio
  3. Hacer área = 3.1416 x radio x radio
  4. Imprimir área
  5. Fin

Algoritmo que nos indique cual de los 2 rectángulos tiene el área mayor. Ambos rectángulos cuentan con base y altura variables.

  1. Inicio
  2. Leer base1, altura1
  3. Leer base2, altura2
  4. Realizar area1 = base1 x altura1
  5. Realizar area2 = base2 x altura2
  6. Si el area1 > area2 entonces
  7. Imprimir el rectángulo1 tiene un área mayor
  8. Si no
  9. Imprimir el rectángulo2 tiene un área mayor
  10. Fin

Algoritmo que imprima los números pares comprendidos entre 1 y 1000. Por ejemplo: 2, 4, 6,... 1000.

  1. Inicio
  2. Hacer contador = 1
  3. Mientras contador < = 1000 hacer lo que sigue
  4. Si el residuo de (contador / 2) = 0 entonces
  5. Imprimir contador
  6. Incrementar el valor de contador en 1 (contador = contador + 1)
  7. Regresar al paso 3 y verificar si llegamos a 1001
  8. Fin

Los algoritmos se pueden expresar por fórmulas, diagramas de flujo, y pseudocódigo conocidos como herramientas de programación. Está última representación es la mas utilizada por su sencillez y parecido a el lenguaje humano.