Etapas para la resolución de Problemas
A la hora de escribir un algoritmo para la resolución de algún problema tenemos que tener en cuenta los siguientes puntos:
1- Definición del problema: no es más que la enunciación completa del problema. Es fundamental conocer QUE se desea realizar a través de la definición.
2- Análisis del problema: en cualquier problema se deben poder reconocer tres conjuntos perfectamente definidos: un conjunto de datos (Que información tengo), un conjunto de resultados (Que quiero obtener) y una o más relaciones que vinculen a los dos conjuntos anteriores (Como puedo obtener un resultado a partir de los datos).
3- Selección del modelo: se deben proponer o aplicar un modelo para lograr sistematizar la búsqueda de la información. Además consiste en plantear un plan o esquema general de las tareas que deben realizarse para llegar a la solución. El modelo que en algorítmica computacional se conoce como "Programación Modular y Estructurada".
4- Diseño de la solución: en base al diseño elegido, se debe plantear el diseño de la solución. En esta etapa es muy ligada al modelo en cuestión, existen técnicas de diseño para cada modelo.
5- Codificación: consiste en describir los pasos que deben ejecutarse para resolver una instancia de diseño para cada modelo. Es común utilizar aquí un programa algorítmico.
6- Prueba: se verifica el funcionamiento de la solución propuesta y se detectan aquí los errores que se presentan. 7- Depuración: aquí se deben subsanar los errores detectados en las pruebas.
8- Documentación: finalizada la resolución de problemas mediante un "programa" es necesario y muy conveniente documentarlo. La documentación puede ser Externa (incluye análisis, diseño, código, manuales de usuario con instrucciones para el uso del programa e interpretación de los resultados) y la Interna (se refiere a las líneas de texto en el código con comentarios descriptivos).
¿En qué consiste la división modular?
Es una estrategia para atacar la complejidad del problema. Consiste en dividir o descomponer el problema original en una sucesión de problemas más simples, de tamaños suficientemente pequeños como para que cada uno de ellos pueda ser comprendido en su totalidad.
A menudo se refiere a si mismo con el nombre de "Desarrollo o Diseño top - down", método de refinamiento sucesivos o diseño compuesto.
Planteada la división modular indicando que tareas hacer, debemos especificar una lista detallada de cómo hacerlas, llegando así a definir una solución paso a paso del problema.
Esta solución así expresada recibe el nombre de "Algoritmo".
Algoritmo
Un algoritmo es un conjunto finito de operaciones (instrucciones - pasos) que sigue un determinado orden que permiten resolver un problema. Las características principales de todos algoritmos son:
FINITUD: permiten arribar a la solución de un problema después de una cantidad finita de pasos. PRESICIÓN: cada paso debe exponerse en forma clara y precisa y no debe dar lugar a ambigüedades.
GENERALIDAD: la solución debe ser aplicada a un conjunto de problemas del mismo tipo y no a un sólo problema en particular.
Un algoritmo debe estar expresado en un lenguaje comprensible para el "ejecutante".
Las acciones deben ser tales que ele "ejecutante" sea capaz de realizarlas.
Los algoritmos computacionales tienen la ventaja de proponer un conjunto de acciones, que cualquier computadora puede ejecutar.
Conceptos de interés y elementos de un algoritmo computacional
- Procesador ejecutante: es la entidad capaz de comprender un enunciado y ejecutar las tareas descriptas en un algoritmo.
- Ambiente: es el conjunto de recursos con los que debe contar el ejecutante para poder resolver un determinado trabajo.
- Acciones y primitivas: las soluciones de un problema, implica la ejecución de un conjunto de pasos que conforman un algoritmo.
Cada uno de esos pasos se llama acción. La acción es un evento que modifica el ambiente de un algoritmo.
Decimos que una acción es primitiva, si el ejecutante, para llevarla a cabo no requiere de ningún tipo de información adicional.
La acción no primitiva implica que para ser resuelta, el ejecutante requiere que sea descompuesta en acciones primitivas.
- Constante: se define así al valor buen o puede alterarse en el transcurso de un algoritmo. Por ejemplo: 123, Falso... - Variable: es una posición de memoria capas de almacenar un único valor por vez.
A medida que se ejecutan las accione que describe el algoritmo esa "variable" podrá representar valores nuevos.
En un algoritmo una variable se referencia a través de "nombres o identificadores". Por ejemplo: Leer A, B.
- Nombres o identificadores: Para poner el nombre o identificador de algún elemento del algoritmo el diseñador tiene amplia libertad, sólo tiene que cumplir tres reglas: 1- Utilizar sólo letras y/o dígitos comenzando siempre con una letra. 2- No utilizar palabras claves que emplea el pseudocódigo como son: leer, escribir, mientras o para las funciones internas rc, sen, trunc, etc. o las palabras correspondientes a constantes lógicas verdadero y falso. 3- No hace distinciones entre mayúsculas y minúsculas.
- Expresión: es el conjunto de operandos ligados por operadores cuya evaluación arroja un resultado. Por ejemplo 2+5+a, 4*5, a<b.
Tipos de información
a) TIPO NUMÉRICO:
- Constante numérica: los valores o constantes de tipo numérico son decimales y pueden estar precedidos por los signos + y -, la ausencia de estos implica que un número es positivo.
Un detalle importante es que los números reales deben separar su parte entera de la fracción decimal con un punto en vez de una coma. No utilizar ningún símbolo para la separación de miles. Ejemplo: 14, -12500, +1.945.
- Variables numéricas: se denomina así a una posición de memoria que contenga cualquier valor numérico.
- Expresiones numéricas: se plantean en general con constantes numéricas, variables numéricas, funciones y los operadores algebraicos.
La jerarquía de estos operando es idéntica a la planteada por álgebra de número y sólo puede alterarse a través de los paréntesis. Ejemplo; 2+3-4, 10/5+6, (5+6)/2.
- Funciones predefinidas: se asume que el ejecutante del algoritmo, conoce y puede resolver ciertas funciones numéricas. A estas funciones numéricas se las llama funciones predefinidas y tienen la propiedad de devolver un valor o resultado, al ser aplicado sobre un argumento que se indica entre paréntesis. Por ejemplo: abs(), sen(), cos(), trunc().
b) TIPO CARACTER:
- Constante tipo caracter: se incluyen aquí todos los caracteres y símbolos del código ASCII y las cadenas de caracteres.
Se observa que a las constantes de tipo caracter o las cadenas de caracteres se indican entre apostrofes o simples comillas. Esto es para evitar confundir los datos con el identificador de una variable. Por ejemplo:'a', 'luis rodriguez'.
- Variable tipo caracter: es una posición de memoria que contenga cualquier tipo de caracter o cadena de caracteres. c) TIPO LÓGICAS: - Constantes tipo lógicas: se incluyen sólo dos constantes o valores posibles "verdadero" y "falso".
- Variables lógicas: se define así a una posición de memoria que contenga cualquier dato de tipo lógico.
- Expresión lógica: aquí cobran mucha importancia una serie de operadores que nos permiten plantear una serie de tipo lógica.
Las expresiones más simples son las relacionales que se utilizan de operadores relacionales matemáticos para comparar operandos de igual tipo.
- Operadores relacionales: las expresiones lógicas: c<z, 7>M se conocen como "expresiones relacionales", permiten comparar o relacionar dos operando del "mismo tipo".
Acciones algorítmicas
Primitivas
En el lenguaje algorítmico (pseudocódigo), las primitivas se identifican con palabras claves o reservadas.
El control de la ejecución de las acciones primitivas de un algoritmo suelen ser diferentes según el caso.
Acciones primitivas de estructura secuencial
- Asignar: esta acción permite a un identificador de variable representar o memorizar cierto valor. la anotación es la siguiente: a<-v. Donde a es el nombre de la variable a la cual el ejecutante debe asignar el valor de la expresión v. El símbolo <- puede leerse "toma el valor de". Los tipos de a y de v deben coincidir, en caso de no serlos dará error.
Según el tipo de asignación puede ser:
a) Numérica: a<-45.
b) Tipo caracter: letra<-'A'.
c) Lógicas: m<- FALSO.
- Entrada: todo algoritmo tiene por objetivo principal reducir los resultados pudiendo o no incorporar información del medio externo (datos), al ambiente o sistema que observa.
Esta incorporación de valores del exterior nos lleva a definir una acción algorítmica primitiva de Lectura o Entrada. Se usará para ello la palabra Leer, seguida de la variable o lista de variables.
Esta acción tiene le mismo efecto que una asignación, sólo que ésta última utiliza valores del ambiente del algoritmo; en cambio la lectura asigna valores desde el exterior.
Sin estación, la ejecución de un algoritmo producirá siempre la misma respuesta.
Las acciones de lectura y asignación permiten “definir variables” en un algoritmo.
- Salida: la acción primitiva que permite a un algoritmo comunicar resultados o salida de información al medio exterior que representará por la palabra clave Escribir.
Se destacan algunas diferencias entre las acciones de lectura y escritura. La lectura se utiliza solamente a través de variables; y por lo tanto, si se lee una variable que ya fue definida en el algoritmo, implicará un acceso destructivo; esto es, la variable perderá su valor para tomar el del nuevo dato que se ingrese. En cambio, si se escribe resultados a través de variables el ejecutante realizará un proceso no destructivo a dichas variables, pues solo necesita conocer su contenido para ejecutar la escritura. Aquí las variables conservan sus valores después de la acción.
Las acciones de lectura y escritura son conocidas como acciones de entrada/salida o abreviadamente E/S.
Representaciones gráficas de algoritmos computacionales
El pseudocódigo es una de las formas que se puede emplear para representar algoritmos.
Además, se diseñarán en forma de gráfica a través de los llamados diagramas de flujo.
En el diagrama de flujo, las estructuras de las primitivas del pseudocódigo se representan con formas geométricas identificatorias o bloques. Estos bloques se unen con flecha que nos indican las secuencias u orden en que van a ejecutarse las instrucciones, es decir el flujo recorrido que ha de seguir el diagrama.
Una de las ventajas del empleo de diagramas de flujo, es la visualización plana de las acciones que forman el algoritmo, permitiendo seguir fácilmente su lógica.
Prueba de escritorio: seguimiento algorítmico Probar un algoritmo es ejecutar cada una de las acciones incluidas en él.
La prueba de escritorio o seguimientote un algoritmo puede efectuarse de la siguiente manera:
a) Proponga un conjunto de datos. Estos datos deben coincidir en cantidad y tipo con las variables que aparezcan en las acciones de lectura.
b) Construya una tabla y coloque – encabezando cada columna de la tabla – cada una de las variables que aparezcan en el algoritmo.
c) Escriba Salida en el encabezado de la última columna de la tabla. Aquí se notarán los resultados que produzca el algoritmo como consecuencia de la acción de Escribir.
d) Comience a ejecutar las acciones del algoritmo. Cuando encuentre una asignación de una variable coloque el valor o dato a asignar en la columna correspondiente a esa variable. e) Si lee una variable, tomo el dato de prueba propuesto para esa variable y colóquelo en la columna correspondiente a esa variable.
f) Si vuelve a asignar o a leer una variable ya creada, continúe anotando en la columna correspondiente.
g) Al terminar de ejecutar las acciones, los resultados o salida del algoritmo deben aparecer en la columna de Salida.
Documentación
La documentación del programa es fundamental para diseñadores y usuarios.
En pseudocódigo solo se documentarán los algoritmos internamente, esto es, se efectuarán comentarios de ciertas acciones o grupos de acciones para permitir al diseñador o al equipo del diseño releer el algoritmo con facilidad.
Para documentar internamente un algoritmo en pseudocódigo se empleará la doble barra (//) y a continuación el texto o la frase explicativa.
Al ejecutar el algoritmo, este texto a la derecha de la // debe ser ignorado, pues no constituye a una acción algorítmica.
Teorema fundamental de la Programación Estructurada
Baun y Jacopini demostraron que: "Todo problema computacional - sin importar su complejidad - puede resolverse empleando solo tres estructuras básicas del control. Éstas son: de tipo Secuencial, Condicional y Repetitiva".
Un algoritmo estructurado esta conformado por segmentos de código. Cada uno de estos segmentos tiene un único punto de entrada y un único punto de salida. Las acciones algorítmicas se encuadran en alguna de las estructuras básicas de control siguiente: Secuenciales, Condicionales y Repetitivas.
Estructuras básicas de control
ESTRUCTURA SECUENCIAL: las acciones correspondientes a esta estructura se van ejecutando en el orden que aparecen, es decir secuencialmente.
Todas las acciones al escribirlas en pseudocódigo deben ser finalizadas con el signo punto y coma (;).
ESTRUCTURA SECUENCIAL SI - ENTONCES: esta estructura implica una toma de desiciones en el algoritmo, donde el ejecutante (la computadora) puede seguir un camino otro, según el valor de verdad de una expresión lógica.
La presencia de esta estructura en un algoritmo le indica al ejecutante que: debe evaluar la expresión lógica planteada: si es verdadera, debe ejecutar las acciones indicadas, luego ir al fin de la estructura y si es falso, resolver la otra parte. luego ir al fin de la estructura.
La palabra clave Si y FinSi representan respectivamente la entrada y el fin de la estructura.
La salida por Verdadero siempre tendrá al menos una acción para ejecutar; pero posible que no haya acciones en la salida por Falso de la expresión lógica.