P. 1
Visual Basic –Algoritmos (manual)

Visual Basic –Algoritmos (manual)

|Views: 3.364|Likes:
Publicado porluisf009

More info:

Published by: luisf009 on Oct 10, 2009
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

05/11/2014

pdf

text

original

Visual Basic –Algoritmos y Datos 3.1.

– Introducción a la Programación: Las computadoras son máquinas que están cada vez más presentes en nuestras vidas y que aparentemente son capaces de hacer todo. La mayoría de las empresas no pueden prescindir de ellas para realizar sus procesos de gestión. Asimismo, participan en muchos sistemas de fabricación industriales, como las cadenas de montaje de automóviles, asisten a los médicos en una serie de procedimientos sofisticados, permiten controlar la temperatura de edificios, gestionan el sistema de reservas de pasajes de las compañías aéreas, ayudan en las predicciones meteorológicas, etc. Una computadora no es más que una máquina digital electrónica capaz de procesar información a una velocidad muy grande. El término digital significa que la información almacenada y procesada se representa mediante un conjunto finito de valores, en particular códigos numéricos binarios formados por ceros y unos. Esta clase de información se suele llamar discreta, por contraposición de la información llamada continua que podría tomar un conjunto infinito de valores. Los valores binarios (cero y uno) suelen llamarse bits en informática. Por otro lado, la idea de máquina electrónica expresa que las computadoras se construyen utilizando componentes electrónicos de estado sólido, conocidos como circuitos integrados o chips. En general, las computadoras difieren en características como su tamaño, número de procesadores, prestaciones (velocidad de proceso, memoria, etc.) o el tipo de utilización que se hace de ellas (máquinas de propósito general frente a procesadores especializados). El tratamiento de la información realizado por una computadora permite generar resultados de salida correctos a partir de unos datos de entrada que se suministran. Este proceso se lleva a cabo almacenando previamente en la memoria de la computadora unos programas escritos en algún lenguaje de programación que “sea capaz de entender la máquina”. Normalmente, el objetivo es resolver algún problema perfectamente definido. Por ejemplo, puede quererse obtener la nómina mensual de todos los empleados en una empresa a partir de ciertos datos como sueldos base, complementos, trienios, descuentos, anticipos, etc. Para ello, es necesario diseñar un algoritmo que produzca resultados correctos a partir de esos datos. En nuestro ejemplo, el algoritmo consiste en el procedimiento usado para calcular la nómina dependiendo de la categoría profesional y demás información sobre cada empleado. Finalmente, ese algoritmo se expresará en un lenguaje de programación, como Visual Basic, obteniéndose así el correspondiente programa de nómina. 3.1.1.- Problemas, algoritmos y programas: Etimológicamente, la palabra problema deriva del griego proballein y significa “algo lanzado hacia delante”. Un problema es un asunto o un conjunto de cuestiones que se plantean para ser resueltas. La naturaleza de los problemas varía con el ámbito o con el contexto donde están planteados; así, existen problemas matemáticos, químicos, filosóficos, etc. Consideramos aquí sólo aquellos problemas cuya solución se puede calcular utilizando una serie de reglas introducidas en la computadora. Lo sorprendente de estas máquinas es su capacidad para realizar secuencias de operaciones muy complejas, cuando sus circuitos sólo pueden ejecutar directamente instrucciones extremadamente triviales, como comparar dos bits o cambiar un bit de ‘0’ a ‘1’ Muchas veces, la mitad del trabajo es saber exactamente qué problema hay que resolver. Si al abordar un problema no se tiene una descripción simple y precisa de él, resulta complejo modelar, simular o programar su solución en una computadora. En este punto, hay que destacar también la importancia de ciertos aspectos relacionados con la resolución de problemas: notaciones de representación, estrategias, relaciones entre problemas, etc. En general, conviene expresar un problema utilizando algún modelo formal. Por ejemplo, un modelo aritmético puede resultar adecuado para problemas de naturaleza numérica o un modelo basado en gramáticas formales puede servir para problemas de procesamiento simbólico o de textos. Una vez modelado el problema, puede buscarse una solución en forma de algoritmo. Un algoritmo es un conjunto finito, y no ambiguo de etapas expresadas en un cierto orden que, para unas condiciones iniciales, permiten resolver el problema en un tiempo finito. Al plantear una solución algorítmica es importante elegir una representación adecuada de los datos para que dicha solución resulte eficiente.

Para convertir un algoritmo, que puede estar expresado en una notación informal o seudolenguaje, en un programa será necesario varias etapas de formalización o refinamiento progresivo. El objetivo final es describir una solución algorítmica al problema inicialmente planteado mediante el uso de las construcciones formales de un lenguaje de programación. Dicho programa se podrá ejecutar en una computadora, y para un conjunto de datos de entrada producirá unos resultados. Por ejemplo, supóngase que se desea construir una tabla con las distancias kilométricas por carretera entre un conjunto de ciudades de un país. Para ello, se suministran como datos de entrada las distancias entre pares de ciudades directamente conectadas. Este problema puede modelarse mediante un grafo. Se trata de una estructura de datos (o manera de organizar la información) no lineal, en la que existen unos elementos llamados nodos o vértices que contienen unos datos. Entre pares de nodos se establecen unas relaciones que si son dirigidas se llaman arcos y si no lo son aristas. Los vértices van a representar las ciudades y a las aristas que unen ciudades conectadas se les asocia la distancia correspondiente. Para su resolución se puede utilizar un algoritmo que permita calcular caminos de distancia mínima entre todos los pares de nodos de un grafo. La solución , en forma de programa, se puede obtener mediante sucesivos refinamientos hasta conseguir describir cada una de las operaciones y datos del algoritmo mediante sentencias de un lenguaje de programación de alto nivel. - Aspectos de la resolución de problemas: No existe un método universal que permita resolver cualquier problema. En general, la resolución de problemas es un proceso creativo donde el conocimiento, la habilidad y la experiencia tienen un papel importante. El proceder de manera sistemática (sobre todo si se trata de problemas complejos) puede ayudar en la resolución. Es muy importante que el problema tratado esté perfectamente definido: se trata en este momento de saber qué es lo que hay que resolver antes de averiguar cómo resolver el problema. Esta etapa de definición lleva consigo eliminar las ambigüedades y la información irrelevante que aparezca en el enunciado de un problema, y saber exactamente qué elementos constituyen una solución válida. Al comenzar a abordar un problema hay que tener en cuenta que, para la mayoría de ellos, hay muchas maneras de resolverlos y pueden existir muchas soluciones. Se plantean, sin embargo, algunos criterios o estrategias generales que se deben tener en cuenta. En particular, son útiles las siguientes: -Usar toda la información útil (no superflua) disponible en el enunciado del problema. -Hacer explícitas las reglas y datos que parezcan implícitos (por ejemplo, en muchos problemas numéricos se pueden usar reglas convencionales de la aritmética o el álgebra). -Profundizar en el problema considerando (por ejemplo, empleando algún tipo de notación, utilizando determinados símbolos o dibujando algún diagrama que nos permitan captar ciertos detalles del problema antes de resolverlo). -Dividir un problema complejo en subproblemas más simples, que se puedan resolver independientemente y después combinar sus soluciones. -Otra forma de abordar un problema consiste en trabajar “hacia atrás”; es decir, partir de la solución e intentar llegar al estado inicial. Existe otro aspecto muy importante, aún no mencionado, a tener en cuenta cuando se intenta resolver un problema. Generalmente, los problemas no están aislados, sino que existen interrelaciones o afinidades. En estos casos resulta muy práctico disponer de la solución de un problema afín para resolver el que nos ocupa. Existen diversos grados de afinidad entre problemas. Así, se dice que dos problemas son isomorfos cuando se puede establecer una aplicación biyectiva entre los estados y acciones de uno de ellos con los del otro. La similaridad es una relación entre problemas más débil; sin embargo, el proceso seguido para encontrar la solución a un problema puede ayudar a resolver otro similar. Otro tipo de afinidad entre dos problemas se da cuando uno de ellos es un caso especial del otro; resolver el caso especial puede ayudar a encontrar la solución del problema más general, o viceversa. Las consideraciones mencionadas hasta ahora corresponden a la resolución general de problemas (no necesariamente a problemas informáticos); sin embargo, estas ideas se pueden particularizar para resolver problemas donde se use la computadora como herramienta. A veces, la situación más frecuente para mucha gente es comenzar a programar la solución de un problema que no está completamente definido, o pensar en detalles de implementación sin saber cómo abordar el problema independientemente de la computadora. Es mucho más

productivo conocer primero un problema lo suficiente y plantear una estrategia adecuada para su resolución, que comenzar prematuramente a programar la solución a un problema incompleto, ambiguo o que no ha sido analizado adecuadamente. 3.1.3.- Algoritmos Uno de los ejemplos más sencillos de un algoritmo es una receta de cocina. Tomemos una receta cualquiera, como las que podemos encontrar en diarios y revistas: PLATO XX Tiempo de ejecución: 1 hora Dificultad: mínima Ingredientes : A,B,C,D,E,F y 300 cc de Salsa roja Elementos: Utensillos: batidor, espátula,....., 2 fuentes mediana, 1 olla Preparación : Masa: 1. Mezclar los ingredientes A , B y C 2. Batir enérgicamente durante 3 minutos 3. Dejar reposar Pasta crema: 1. Desmenuzar los ingredientes D y E. 2. Ir agregando de a poco el ingrediente F, batiendo. repetir esta operación hasta alcanzar el PUNTO de HILO. 3. Dejar enfriar. Armado: 1. Colocar una capa de masa sobre la fuente enharinada. 2. Respelgar la masa. 3. Cubrir con la pasta crema. 4. Adornar arriba con el resto de la masa. 5. Cocinar a horno suave 15 minutos. 6. Cubrir con SALSA ROJA y servir. Podemos aquí identificar un conjunto finito, ordenado y preciso de acciones, para que la persona que desee cocinar pueda llevar a cabo la preparación del plato XX (La persona que cocina es el resolutor o ejecutor, y preparar el plato es el problema a resolver). Hay entradas (ingredientes) y una salida (el plato). El ejecutor (cocinero) dispone de los medios (utensillos cocina) para realizar las acciones y comprende (interpreta) las indicaciones de cada paso. Se puede observar que el proceso está definido en secciones (módulos o partes) y que hay una parte principal (el armado) que aplica (emplea) todas las anteriores. También emplea (cita) una sección (módulo) descripta fuera de la receta, pues se entiende que es de carácter general y puede emplearse en varias recetas. - Algoritmos computacionales Para este tipo de algoritmos el ejecutor es la máquina, que puede realizar un conjunto limitado de operaciones (instrucciones). El algoritmo (receta) se constituye en un conjunto de instrucciones (programa), las que deben darse en un lenguaje adecuado (lenguaje de programación) que la máquina comprenda y que ella almacena en su memoria con formato digital (compilación). Para llevar a cabo la tarea (resolver el problema) se debe dar una orden (ejecución). Los elementos con los que trabajará el programa (ingredientes) son información (o también llamada datos) los que se manejan en formatos especiales que pueden ser reconocidos por la máquina. Los datos que se ingresan a la máquina desde dispositivos de entrada (medios de entrada) se denominan datos de entrada; cuando están siendo tratados por la máquina durante el programa o son generados por el programa para cumplir la tarea, se habla de datos en memoria y en particular datos auxiliares y cuando son entregados de cierta forma al usuario (medios de salida) se denominan datos de salida.

La información que dispone la máquina (programa y datos) siempre son almacenados internamente en la memoria en formato digital (binario: bits, bytes, registros, direcciones). Cuando los datos son ingresados por el usuario, desde dispositivos manipulados por él (teclado, scanner, reconocedor de voz, lectoras láser, etc.) los datos se presentan en formatos que son accesibles al usuario (teclas, páginas de papel, micrófono, códigos de barra, etc.). Lo mismo para la salida (caracteres lumínicos en la pantalla, sonidos por parlantes, caracteres imprimibles por impresoras , etc.). Los programas (salvo que sean muy elementales) no se escriben como una extensa lista de instrucciones. Teniendo en cuenta que los programas seguramente tendrán que ser corregidos, modificados o cuanto menos entendidos, es indispensable pensar en una metodología para su diseño. Una estrategia popular se basa en dividir los problemas (o procesos) en procesos más simples, para facilitar su comprensión y resolución. Para ello es indispensable que se indique cómo el problema mayor se va a resolver aplicando la resolución de los problemas más sencillos. Este criterio puede continuar hasta que los problemas en que hemos dividido un proceso son de sencilla solución. Esta metodología se denomina Diseño Modular Descendente, y en cada nivel de descomposición se identifica un módulo principal (llamador) que invoca a otros módulos (llamados) para resolver los problemas en los cuales se dividió al primero. Al escribir el programa o proceso principal, los módulos que serán llamados pueden estar indicados como porciones de ese programa (subprogramas internos) o haber sido escritos como módulos independientes (subprogramas externos). Observando el ejemplo de la receta en el punto anterior, se puede ver que el proceso principal es el armado, que llama a procesos descriptos en la misma receta (masa, pasta crema), los cuales constituyen subprocesos internos (propios de esta receta) y procesos externos (salsa roja) que constituyen subprocesos externos (generales para varias recetas). A su vez, para realizar la salsa roja (como podría haberse dado para la pasta crema) pueden encontrarse otros subprocesos. Notar que nada se dijo sobre el punto de hilo, porque se puede entender que el resolutor reconoce por propia capacidad (o experiencia) cuando se alcanzó tal punto. Pero bien podría darse el caso que sea necesario definir cuando este punto es alcanzado. Notar también que hay una diferencia entre el empleo de los diferentes subprocesos. La masa, la pasta crema, la salsa roja, son productos que han dejado como resultado los subprocesos correspondientes; y en el armado los utilizamos directamente en acciones concretas, a estos subprocesos se los denomina Funciones porque tienen como finalidad producir un resultado que se emplea en otra acción. En cambio, respelgar es un conjunto de acciones que constituyen un subproceso, el cual se lleva a cabo cuando se lo invoca sin que deje un producto nuevo; a éstos se los denomina Procedimientos. En general el formato interno de almacenamiento de los datos es transparentepara el usuario, aunqueun programador debe tener cierto conocimiento para poder tomar decisiones respecto al almacenamiento y utilizar racionalmente espacio de memoria y operaciones.

- Sintaxis y semántica de un lenguaje de programación: Los lenguajes de programación permiten expresar nuestros algoritmos en una notación formal que pueda ser reconocida y ejecutada por la computadora. Dicha especificación se llama programa. La sintaxis de un lenguaje de programación especifica cómo se pueden construir los programas en él, permitiéndose sólo el uso de determinadas combinaciones de símbolos seleccionados y palabras clave. Sin embargo, los lenguajes de programación no sólo necesitan una sintaxis precisa, sino también una semántica precisa. Es necesario asignar, de alguna forma, significado a cada tipo de construcción permitida en un lenguaje de programación, para poder escribir programas en él e interpretar su significado. Por ejemplo, el siguiente tipo de instrucción iterativa utilizada en el lenguaje Visual Basic y descrita mediante la siguiente producción: Do While <expresión booleana> <grupo_sentencias> Loop Significa exactamente que primero es preciso evaluar una expresión booleana y sí su significado es cierto, ejecutar el grupo de sentencias asociado. A continuación, hay que volver a evaluar la expresión y repetir el proceso hasta que el resultado de la expresión booleana deje de ser cierto. Una descripción clara y completa de la sintaxis y semántica es necesaria para asegurar que todas las implementaciones del lenguaje acepten exactamente los mismos programas. - Paradigmas de programación: Un paradigma de programación es una colección de patrones conceptuales que modelan la forma de razonar sobre problemas, de formular algoritmos y, a la larga, de estructurar programas. A veces, un lenguaje contiene o soporta los elementos de un determinado paradigma; por ejemplo, Visual Basic es un lenguaje diseñado según el paradigma orientado a eventos. Por supuesto, suele haber más de un lenguaje basado en un paradigma dado. También existen lenguajes que combinan elementos de varios paradigmas. De todas formas, y aunque en la práctica muchas veces se confunden, conviene distinguir ambos conceptos, paradigma y lenguaje de programación. Los dos paradigmas más extendidos y estudiados desde un punto de vista algorítmico, quizá sean el imperativo y el funcional. Entre los paradigmas más recientes, se encuentra el paradigma orientado a eventos, que es el que estamos utilizando como marco conceptual en este curso de programación básica, y el cual se adapta perfectamente a ambientes (como el sistema operativo Windows) que funcionan estrechamente relacionados al concepto de eventos. - Fases en el desarrollo de un algoritmo: Cualquier consideración sobre el desarrollo de un algoritmo con cierta complejidad conceptual debe comenzar aislando cada una de sus fases componentes. Se pueden identificar las siguientes etapas de una manera más o menos general: 1) Análisis del problema Se refiere a la etapa en la cual el programador toma conocimiento del problema antes de proceder a desarrollar una solución. Es un proceso de naturaleza cognoscitiva y difícil de describir. Un análisis inadecuado puede conducir a una mala interpretación del enunciado del problema. Los errores en esta etapa son, con frecuencia, difíciles de detectar y consumen mucho tiempo al arrastrarse hacia fases posteriores. 2) Desarrollo de la solución Una vez definido el problema y teniendo cierta idea de cómo resolverlo, se puede utilizar alguna Tutoriales, manuales de referencia y descripciones formales son algunas de las distintas formas usadaspor los diseñadores y proveedores para representar la estructura y el significado de los distintos componentes de cada lenguaje de programación.

de las técnicas conocidas de diseño de algoritmos. Muchas veces, debido a la complejidad interna de los problemas a resolver, se puede ir describiendo la solución como una secuencia de pasos bastante generales (esto puede hacerse en lenguaje natural), que cada vez se van detallando o refinando más hasta obtener una solución. En esta etapa también se empiezan a tomar decisiones sobre las estructuras de datos que se utilizarán para representar los datos del problema. 3) Codificación de la solución Considerando que la solución algorítmica ha sido bien definida, este proceso resulta casi completamente mecánico. Utilizando las reglas sintácticas y semánticas de un lenguaje de programación, el algoritmo se escribe teniendo en cuenta también ciertos criterios de estilo o estructura. 4) Verificación y análisis de la solución Con la verificación se trata de comprobar que el algoritmo codificado en la etapa anterior es correcto; es decir, produce unos resultados correctos para todos los conjuntos posibles de datos válidos. Para ello se recurre a procedimientos matemáticos formales de verificación. Para algoritmos sencillos, donde el conjunto de datos sea pequeño, existe la posibilidad de realizar pruebas (donde se comprueba el comportamiento del algoritmo para ciertos conjunto significativo de datos). No obstante, aun cuando las pruebas muestren la presencia de errores, nunca pueden demostrar la ausencia de éstos (ya que para ello sería preciso examinar el resultado que produce el algoritmo para todos los conjuntos posibles de datos válidos). 3.1.3.5.- Corrección y eficiencia de algoritmos: Sea un programa resultante de codificar un determinado algoritmo en un lenguaje de programación ejecutable. Puede resultar que dicho programa no funcione correctamente para unos datos de entrada que se le suministren. Generalmente, no será un problema de la computadora utilizada (los errores del hardware son una rareza en las computadoras actuales). Si los datos son correctos, el error está en el algoritmo utilizado para resolver el problema. En un programa de cierta complejidad pueden existir errores lógicos que permanezcan sin ser detectados durante largo tiempo. El proceso de comprobar repetidamente un algoritmo (o ejecutar el programa asociado) con el objetivo de encontrar y eliminar errores se llama depuración. Una forma de depurar un programa consiste en hacer que nuestro programa escriba ciertos mensajes para saber el valor de determinadas variables o simplemente si se ha ejecutado o no un conjunto de sentencias. En algunas partes de un algoritmo, el programador puede hacer las veces de computadora construyéndose una tabla de doble entrada donde, por ejemplo, en las filas sitúe el número de la iteración tratada y las columnas las variables usadas. De esta forma, se irá completando la tabla de acuerdo a la ejecución del algoritmo y detectándose si las variables consideradas toman los valores apropiados. Sin embargo, el método anterior no garantiza que un algoritmo esté libre de errores y produzca el resultado correcto para cualquier dato de entrada válido. La verificación de algoritmos aplica técnicas de prueba matemáticas para establecer que los resultados obtenidos por las ejecuciones, para unos datos cualesquiera, concuerdan con las especificaciones formales definidas. También hay que garantizar que el algoritmo termina alcanzando un objetivo establecido en un número finito de pasos; esto es, en un tiempo finito. Se hace pues necesaria una prueba formal de la terminación de un algoritmo. Otro aspecto importante es la eficiencia. Dado un problema computacional, para el que se han escrito un conjunto de algoritmos correctos ¿cuál de ellos elegir? Si se trata de una solución algorítmica que se va a usar muy a menudo, resulta económicamente más ventajoso hacer un mejor uso de los recursos de la computadora (en particular, del tiempo de utilización del procesador o tiempo de ejecución y de la memoria consumida). La memoria consumida por un algoritmo es la suma de dos componentes: una parte fija que es independiente de sus datos y resultados, y una parte variable que depende del tamaño del problema considerado. La primera consiste en el espacio reservado para el código del algoritmo, variables simples, constantes, estructuras de datos de tamaño fijo, etc. La segunda es el espacio de memoria necesitado por las variables cuyo tamaño dependa de la instancia del problema que está siendo resuelta, del espacio requerido (si es preciso) para las diferentes activaciones de los subprogramas recursivos, etc.

El tiempo de ejecución para un programa depende de factores como los datos de entrada, la calidad del código generado por el compilador, la naturaleza y velocidad de las instrucciones de máquina empleadas en la ejecución y la complejidad en tiempo del algoritmo utilizado en el programa. El tiempo de ejecución de un programa, T(n), será una función del tamaño de sus datos de entrada. La clase de esta función expresará la complejidad del algoritmo. 3.1.3.6.- Diseño de algoritmos: Hasta ahora se han realizado algunos comentarios respecto a la necesidad de diseñar algoritmos correctos y eficientes utilizando los elementos de un lenguaje de programación. Es necesario en este momento mencionar algo sobre cómo hacerlo. El acto de diseñar un algoritmo puede considerarse como una tarea que difícilmente podrá ser del todo automatizada. Todo problema algorítmico es un reto para su diseñador: algunos resultan inmediatos de resolver, otros son bastante complejos. La investigación en esta área ha permitido descubrir un conjunto de métodos o esquemas de diseño hacia los cuales puede orientarse la realización de muchos algoritmos. No obstante, y a pesar de que resulta más adecuado en bastantes casos utilizar alguno de estos esquemas que realizar un diseño “desde cero”, idear un algoritmo continúa siendo una labor bastante creativa donde los conocimientos y la experiencia del propio diseñador tienen un papel fundamental. Divide y vencerás Consiste en descomponer un problema en subproblemas, resolver independientemente los subproblemas para luego combinar sus soluciones y obtener la solución del problema original. Esta técnica se puede aplicar con éxito a problemas como la multiplicación de las matrices, la ordenación de vectores, la búsqueda en estructuras ordenadas, etc. Ejemplo: Búsqueda de una palabra en un diccionario Como ejemplo sencillo de aplicación de esta estrategia puede considerarse la búsqueda de una palabra en un diccionario de acuerdo con el siguiente criterio. Se abre el diccionario por la página central (quedando dividido en dos mitades) y se comprueba si la palabra aparece allí o si es lexicográficamente anterior o posterior. Si no se ha encontrado y es anterior, se procede a buscarla en la primera mitad; si es posterior, se buscará en la segunda mitad. El procedimiento se repite sucesivamente hasta encontrar la palabra o decidir que no aparece. Método voraz Este método trata de producir algún tipo de mejor resultado a partir de un conjunto de opciones candidatas. Para ello, se va procediendo paso a paso realizándose la mejor elección (usando una función objetivo que respeta un conjunto de restricciones) de entre las posibles. Puede emplearse en problemas de optimización, como el conocido de la mochila, en la búsqueda de caminos mínimos sobre grafos, la planificación en el orden de la ejecución de unos programas en una computadora, etc. Ejemplo: Dar un cambio utilizando el menor número de monedas Considérese ahora el problema de la devolución del cambio al realizar una compra (por ejemplo, en una máquina expendedora de tabaco). Suponiendo que se disponga de cantidad suficiente de ciertos tipos diferentes de monedas de curso legal, se trata de dar como cambio la menor cantidad posible usando estos tipos de monedas. La estrategia voraz aplicada comienza devolviendo, cuando se pueda, la moneda de mayor valor (es decir, mientras el valor de dicha moneda sea mayor o igual al cambio que resta por dar), continúa aplicándose el mismo criterio para la segunda moneda más valiosa, y así sucesivamente. El proceso finaliza cuando se ha devuelto todo el cambio. - El estilo en la algorítmica: Algunas consideraciones estilísticas pueden contribuir a mejorar la calidad de los algoritmos (y programas) mediante la reducción del número de errores que aparecen al desarrollarlos. También influyen haciendo que nuestros algoritmos resulten más fáciles de leer y entender para otras personas.

Los criterios de estilo pueden reflejarse en un conjunto de normas de estilo de codificación. Ello asegurará que tanto algoritmos como programas resulten legibles y puedan modificarse fácilmente en caso de necesidad. Generalmente, estas normas de estilo se dirigen hacia aspectos como la forma de construir los nombres de las variables o tipos de datos que aparezcan; la tipografía seguida a la hora de escribir nombres de variables, subprogramas, palabras clave, etc; el modo de encolumnar las distintas partes de un algoritmo para facilitar su lectura y comprensión, y las normas sobre cómo y dónde deben de introducirse los comentarios. Estilo y claridad de los programas van fuertemente unidos. Ante la pregunta: “¿Cuáles son las características de un buen algoritmo?”, las siguientes respuestas reflejan, en cierta medida, los factores que identifican la calidad en ellos: - Corrección (eficacia): el algoritmo debe funcionar Nunca se debe olvidar que la característica más simple e importante de un algoritmo es que funcione y resuelva el problema. Puede parecer obvio, pero resulta difícil de asegurar en algoritmos complejos. - Eficiencia: el algoritmo no debe desaprovechar recursos La eficiencia de un algoritmo se mide por los recursos que éste consume. En particular, se habla de la memoria y del tiempo de ejecución. A pesar de que con la reducción de los costes del hardware es posible diseñar computadoras más rápidas y con más memoria, no hay que desperdiciar estos recursos y tratar de desarrollar algoritmos más eficientes. Cuando se habla de tiempo nos referimos a la cantidad de operaciones que realiza (no precisamente el tiempomilisegundos-que insuman). Un algoritmo será más eficiente que otro si resuelve la misma cuestión con menor cantidad de operaciones. - Claridad: el algoritmo debe estar bien documentado La documentación ayuda a comprender el funcionamiento de los algoritmos. Ciertos detalles o algunas partes especiales de los mismos pueden olvidarse fácilmente o quedar oscuras si no están adecuadamente documentadas. En realidad, y de acuerdo con los puntos de vistas anteriores, la calidad de un algoritmo tiene muchas facetas y todas ellas importantes. Resumiendo, lo ideal es que nuestros algoritmos resulten correctos, eficientes, claros, fiables y fáciles de mantener. - Diseño de Programas: El diseño de programas es una tarea difícil y es un proceso creativo. No existe un conjunto completo de reglas, ni algoritmos para indicar cómo escribir programas. Las fases mencionadas anteriormente, disponen de una serie de pasos que enlazados convenientemente conducirán a la solución del problema. Aunque el diseño de programas es un proceso esencialmente creativo, se pueden considerar una serie de fases o pasos comunes que generalmente deben seguir todos los programadores.

Las fases de resolución de un problema con computadora son: Análisis del problema Diseño del algoritmo Codificación Compilación y ejecución Verificación Depuración Documentación Las dos primeras fases conducen a un diseño detallado escrito en forma de algoritmo. Durante la tercera etapa (codificación) se implementa el algoritmo en un código escrito en un lenguaje de programación, reflejando las ideas desarrolladas en las fases de análisis y diseño. La fase de compilación traduce el código fuente a código de máquina mediante el empleo de intérpretes o compiladores y en la fase de ejecución se corre el programa sobre la computadora. En las fases de verificación y depuración el programador busca errores de las etapas anteriores y los elimina. Podrá comprobar que mientras más tiempo gaste en la fase de análisis y diseño menos tiempo invertirá en la fase de

verificación y depuración. Por último, se debe realizar la importante fase de documentación del programa, con el objeto de que cualquier persona ajena al mismo pueda entender qué hace y cómo lo hace. Antes de profundizar sobre las tareas a realizar en cada fase, precisemos más el concepto y significado de la palabra algoritmo. Un algoritmo es un método para resolver un problema mediante la combinación de una serie de pasos precisos, definidos y finitos. Un algoritmo es preciso en el sentido que los pasos que lo componen deben realizarse en un determinado orden y no en otro. Que sea definido implica que si se ejecuta varias veces el mismo algoritmo sobre el mismo conjunto de datos de entrada, siempre se obtienen los mismos datos de salida, es decir, el algoritmo es unívoco. Finalmente, que sea finito implica que debe finalizar después de un número finito de pasos. Un algoritmo debe producir un resultado en un tiempo finito. Los métodos que utilizan algoritmos se denominan métodos algorítmicos, en oposición a los métodos que implican algún juicio o interpretación que se denominan métodos heurísticos. Los métodos algorítmicos se pueden implementar en computadoras; sin embargo, los procesos heurísticos no han sido convertidos fácilmente en las computadoras. En los últimos años las técnicas de inteligencia artificial han hecho posible la implementación del proceso heurístico en computadoras. Entre las herramientas de que dispone el programador para una representación gráfica de un algoritmo destacan los ordinogramas, diagramas de flujo de Nassi-Schneiderman y últimamente se utiliza con más frecuencia la herramienta del pseudocódigo.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->