Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 1 Introducción a los ordenadores Un ordenador (figura 1.1) es una máquina que acepta información de entrada (datos de entrada), la procesa de acuerdo con un conjunto de instrucciones almacenado en su memoria y produce resultados (datos de salida). El ordenador trabaja con dos tipos de información diferentes: 1. Datos: elementos sobre los que actúan las instrucciones del programa, bien como entrada o como resultado de las operaciones. 2. Instrucciones: indican al computador qué es lo que tiene que hacer con los datos. Las instrucciones y los datos se encuentran almacenados en la memoria del computador. El procesador recoge y ejecuta una a una las instrucciones. Estas instrucciones implican operaciones sobre los datos que se encuentran en memoria. Un aspecto muy importante de los ordenadores digitales es que trabajan con información binaria. Tanto las instrucciones como los datos están codificados en el sistema binario. El diseño de un sistema informático resulta más fácil, su realización menos compleja y su funcionamiento más fiable si se utilizan sólo dos valores o estados posibles para las variables físicas que representan la información en el interior del computador. Estos estados o valores se representan conceptualmente con el 0 y el 1, y corresponden a dos niveles de tensión, dos situaciones de una lámpara, etc. Entonces, la unidad más elemental de información es un valor binario conocido como bit (binary digit). La capacidad de almacenamiento de información de un computador o de un soporte de información se suele medir en bytes, un byte consta de 8 bits. Como esta unidad es pequeña se suelen utilizar los siguientes múltiplos: El soporte físico o hardware de un ordenador involucra un conjunto de circuitos electrónicos, cables y otros elementos físicos. Está compuesto de un conjunto de bloques lógicos gobernados por controladores y conectados entre sí por un sistema de buses (figura 1.3). El soporte lógico o software de un ordenador es el conjunto de programas ejecutables por el computador. Se entiende por programa un conjunto ordenado CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 2 de instrucciones que se le proporciona al computador en el que se indica las operaciones o tareas que se desea que realice. A continuación, se describen los elementos básicos de la arquitectura de un ordenador según el modelo de Von Neumann (figura 1.3): a) Memoria: en la memoria se almacena el programa (conjunto de instrucciones y datos). Internamente la memoria se o rganiza en posiciones de bytes (8 bits). Las posiciones se identifican por medio de su dirección. En la imagen de la figura 1.3 se puede ejemplifica una memoria de 16 posiciones, entonces para poder direccionar a cada una de ellas se necesitarán 4 bits (con esa cantidad de bits se pueden representar los números enteros comprendidos entre 0 y 15). La memoria está dividida en dos partes. En la primera parte se almacenan los datos y en la segunda parte se almacenan las instrucciones que se deben realizar sobre los datos: 1. Zona de datos: cada dato ocupa una posición de memoria (1 byte). El ordenador solo trabaja con números enteros con signo. Usando esta representación el primer bit indica el signo del número (0 positivo y 1 negativo) y los otros 7 bits representan la magnitud del número en el sistema binario. Con 7 bits se pueden representar las magnitudes enteras situadas entre 0 y 127 (27 - 1). Teniendo en cuenta el signo, el ordenador de este ejemplo puede trabajar con números enteros situados en el rango [-127, + 127]. 2. Zona de instrucciones: las posibles instrucciones que interpreta el computador son: CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 3 Las operaciones aritméticas (ADD, SUB, MUL y DIV) utilizan los registros como espacio para almacenar los operandos y el resultado de la operación. Los registros son almacenamientos temporales situados en el procesador. El ordenador tiene 2 registros R0 y R1, identificados por 0 y 1 respectivamente. Por ello, si por ejemplo se quiere sumar dos posiciones de memoria, primero se copiarán las posiciones de memoria en los 2 registros (2 instrucciones LOAD), luego se realizará la operación de suma (instrucción ADD) y, por último, se almacenará el contenido del registro resultado en una posición de memoria (1 instrucción STORE) Las posiciones de memoria de la zona de instrucciones no representan datos, sino instrucciones. Por ello, las instrucciones anteriores están codificadas en binario, esto es, cada instrucción tiene asociado un código de tres bits que la identifica. Además, se han de codificar también los operandos de las instrucciones. Los posibles significados de los 8 bits de una posición de memoria de la zona de instrucciones se muestran en la figura 1.4. b) Procesador: en el procesador se interpretan las instrucciones y se realizan las operaciones. Esta unidad recoge, una tras otra, las instrucciones máquina almacenadas en memoria y genera las señales de control necesarias para que el ordenador funcione y ejecute las instrucciones leídas. Las operaciones se realizan en la unidad aritmético-lógica bajo la directriz de la unidad de control. La unidad aritmético-lógica realiza operaciones sobre los dos registros y almacena el resultado en uno de ellos. Se denomina unidad central de proceso o procesador al conjunto de la unidad de control, los registros y la unidad aritmético-lógica, esto es, al bloque encargado de ejecutar las instrucciones. Se suelen usar las siglas UCP o CPU (Central Processing Unit) para denominar este conjunto. Con esta arquitectura podemos suponer como funciona el software que le indica las operaciones a realizar mediante un ejemplo muy sencillo. La programación de los ordenadores se realiza normalmente usando un lenguaje de alto nivel (C, Pascal, Fortran, Java, etc) más cercano al usuario. Los compiladores (y los intérpretes) recogen estos programas y generan el código máquina que interpreta directamente la unidad de control. Por ejemplo, para realizar la operación (A + B)*A usando los valores A = 3 y B = 6, el compilador del ordenador en este ejemplo generaría el código máquina mostrado en la figura 1.5. CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 4 Interconexión de Componentes La arquitectura de Von Neumann representada en la figura 1.3 está incompleta. Hasta ahora hemos visto los diferentes bloques funcionales que constituyen un ordenador. Sin embargo, para que estas partes formen el sistema deben conectarse entre sí de forma organizada. Las unidades funcionales que constituyen el computador se comunican por conjuntos de conexiones denominados buses. La interconexión de unas unidades con otras es variante, dependiendo de la estructura o configuración concreta del ordenador. En general, el ordenador cuenta con un bus para conectar el procesador, la memoria y los controladores de las unidades de entrada/salida. El conjunto de todos los buses que posee el ordenador se denomina bus del sistema. Normalmente, la conexión de las unidades de entrada/salida al bus del sistema se realiza por medio de controladores (también denominados drivers). Estos controladores adaptan las características de los periféricos (unidades de entrada/salida y de memoria masiva) a las del bus del sistema, estableciendo unos protocolos de comunicacionespara controlar el flujo de información de forma adecuada y eficaz. De este modo se puede realizar la transferencia de información cargando datos y programas en la memoria y sacando resultados impresos. Software de Tratamiento El software de tratamiento es el conjunto de programas que los usuarios utilizan para resolver sus problemas de procesamiento de información o realizar sus aplicaciones. Estas aplicaciones pueden ser cálculos científicos, aplicaciones de gestión administrativa, almacenamiento y recuperación de la información, etc. Este tipo de software a su vez se puede clasificar en dos tipos: CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 5 • Software de programación: programas o utilidades que facilitan la construcción de las aplicaciones de los usuarios. Incluye herramientas como compiladores, intérpretes, editores de texto, módulos de gestión de archivos y cargadores-montadores. • Software de aplicación: incluye programas relacionados con aplicaciones específicas, como pueden ser procesadores de textos, bibliotecas de programas para problemas estadísticos y matemáticos, sistemas para administración de archivos, sistemas para administración de bases de datos, herramientas de cálculo numérico, etc. Aquí se incluyen los programas realizados por los usuarios. Parámetros característicos del ordenador digital Los parámetros que se suelen emplear para caracterizar las prestaciones de un ordenador son los siguientes: • Frecuencia de reloj. La unidad de control contiene un reloj o generador de impulsos que sincroniza todas las operaciones elementales del ordenador. El periodo de la señal se denomina tiempo de ciclo y está comprendido entre nanosegundos y varios microsegundos, dependiendo del procesador. La frecuencia de reloj, que se mide en millones de ciclos/segundo o MegaHerzios (MHz). Es un parámetro que en parte determina la velocidad de funcionamiento de un ordenador. Es importante reseñar que el aumento de MHz no supone un incremento directo de las prestaciones. No se trata de tener muchos MHz sino de emplearlos adecuadamente. • Ancho de palabra. Expresa el número de bits que maneja en paralelo el ordenador. Cuanto mayor sea el ancho de palabra mayor será la precisión de la representación numérica del ordenador. La mayoría de los ordenadores actuales trabajan con 32 o 64 bits. • Memoria RAM. Expresa el tamaño de la memoria principal del ordenador. Los tamaños de memoria varían mucho dependiendo del tipo de ordenador. • Memoria secundaria. Expresa el tamaño del disco duro del ordenador. Al igual que la memoria RAM, su tamaño varía mucho en función del tipo de ordenador. La capacidad de almacenamiento de los ordenadores personales actuales suele ser del orden de Gbytes. • MIPS (millones de instrucciones por segundo). Expresa la velocidad de ejecución de las instrucciones máquina. La diferencia en el repertorio de instrucciones máquina de distintos procesadores obliga a tener cuidado al compararlos usando esta métrica. • MFLOPS (millones de operaciones en coma flotante por segundo). Expresa la velocidad de cálculo del computador. Los ordenadores trabajan en el rango de centenas de MFLOPS y de centenas de GFLOPS. • Programas de test. Debido a que las medidas en MIPS o MFLOPS no permiten comparar ordendaores con distintas arquitecturas, cada vez es más frecuente el uso de programas de test en el proceso de evaluación. Estos programas suelen estar formados por partes de aplicaciones típicas codificadas en un lenguaje de alto nivel. Las métricas proporcionadas por estos tests dan un valor para el rendimiento del ordenador mucho más fiable y deben ser tenidas más en cuenta que los rendimientos pico en MIPS o MFLOPS proporcionados por el fabricante. El test más utilizado actualmente para medir el rendimiento de los procesadores está formado CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 6 por las pruebas de referencia SPEC (Systems Performance Evaluation Cooperative). Las SPECint son unas pruebas que miden las prestaciones en aplicaciones con enteros y las SPECfp son pruebas que miden las prestaciones sobre números reales. Estas pruebas intentan medir de manera aproximada el rendimiento que pueden proporcionar los procesadores con aplicaciones reales. Niveles de abstracción del uso de ordenadores El ordenador digital es uno de los sistemas más complejos construidos por el hombre y su complejidad aumenta a un ritmo cada vez más rápido. Su estudio se divide en una serie de niveles que hacen abstracción de los niveles inferiores para centrarse en los detalles relevantes en cada nivel. Los niveles más bajos corresponden a menor grado de abstracción y los más altos a grados de abstracción más elevados. Cada nivel se apoya en el inmediatamente inferior, el estudio y desarrollo del ordenador en un nivel se realiza empleando módulos básicos y un leguaje, proporcionados por el nivel inmediatamente inferior. En la figura 1.6 se muestran los niveles más generales en los que se suele estudiar el ordenador, y los módulos básicos que cada nivel proporciona al nivel superior contiguo. Figura 1.6. Niveles de Abstracción de un ordenador a) Aplicaciones. Las aplicaciones son programas ejecutables que nos ayudan a desarrollar tareas específicas. Existen aplicaciones de procesador de textos, como WordPerfect, Word, etc., o herramientas matemáticas como MATLAB, Mathematica, etc. A este nivel solo es necesario conocer la aplicación con la que se trabaja y en absoluto el funcionamiento interno del ordenador. De hecho, se tiende cada vez más a que el usuario final de las aplicaciones se desentienda cada vez más de otros conocimientos de informática y pueda centrarse en resolver su problema con el mínimo esfuerzo posible. Las aplicaciones se crean por medio de algún lenguaje de alto nivel. b) Lenguajes de Alto Nivel. Este nivel se presenta al usuario como una máquina virtual que le permite codificar sus algoritmos por medio de un lenguaje de programación próximo al nivel de especificación del problema. Mediante lenguajes cercanos al usuario podemos especificar programas que ejecuta el ordenador sin que el usuario conozca detalle alguno sobre CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 7 el hardware, por tanto, los programas son portables. El compilador traduce estos programas a código máquina que interpreta directamente la unidad de control. Ejemplos de lenguajes de alto nivel son C, Pascal, Fortran, JAVA, etc. c) Sistema Operativo. El sistema operativo nos facilita una serie de rutinas de control para gestionar el ordenador y nos aporta un entorno para ejecutar programas. Para ello se proporciona una serie de funciones para la gestión de la memoria virtual, sistemas de archivos, asignación de recursos, procesamiento paralelo, etc. En este nivel también se proporcionan los programas encargados de realizar la traducción entre los programas de alto nivel y el código máquina: los compiladores. Los compiladores realizan así mismo la optimización del código en función de la arquitectura presentada en el nivel inferior. Las funciones del sistema operativo se implementan por medio de las instrucciones máquina proporcionadas por el nivel inferior. d) Arquitectura. Este nivel estudia la arquitectura del repertorio de instrucciones que incluye: el repertorio de instrucciones, los modos de direccionamiento y el modelo de programación o registros visibles por el usuario; así como la programación de los dispositivos de Entrada/Salida (E/S) y el control de las comunicacionesentre los diferentes subsistemas. Este es el nivel que actúa como interfaz entre el usuario, generalmente por medio del compilador, y el hardware del ordenador, y en él se recogen los bloques fundamentales del ordenador para implementar un diseño que cumpla las especificaciones arquitectónicas. e) Estructura. Aquí se trata el diseño de la estructura del ordenador a nivel de sus bloques fundamentales. Aparece el sistema secuencial formado por los bloques componentes del computador: procesador memoria, buses, controladores. El objetivo principal es diseñar el control del ordenador. Se usan los bloques básicos proporcionados por el nivel contiguo inferior para construir los bloques fundamentales que forman el computador, su control, y así diseñar un computador que cumpla las especificaciones arquitectónicas. El control microprogramado permite modificar el aspecto del nivel inmediatamente superior (lenguaje máquina) a la vez que mantiene la misma realización digital. Por ejemplo, se pueden añadir nuevas instrucciones en el lenguaje máquina mediante la inclusión en este nivel del microprograma capaz de implementarlas. f) Tecnología. En este nivel se estudian los circuitos digitales que componen los bloques básicos que forman el ordenador. Se diseñan bloques combinacionales y secuenciales básicos como registros, módulos de memoria o multiplexores por medio de los bloques básicos del diseño lógico, como las puertas y biestables construidos por medio de transistores, diodos, etc. Implementados en los circuitos integrados. Introducción a la Resolución de Problemas con Algoritmos El objetivo primordial de cualquier usuario de un ordenador es demandar algún tipo de proceso o cálculo aprovechándose de su velocidad. Para realizar esta acción tenemos que comunicamos de algún modo con el ordenador. Los ordenadores no son capaces de analizar problemas, únicamente realizan una tarea de acuerdo con el modo en que la tarea ha sido especificada. La descripción de la tarea se realiza por medio de un algoritmo. Este algoritmo debemos transmitírselo al ordenador usando un lenguaje que sea capaz de CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 8 interpretar. El lenguaje que entiende el ordenador es el código máquina. El proceso de programación de un ordenador cuando se usa este lenguaje es bastante tedioso y propenso a errores. Por ello, nos valemos de otros lenguajes más cercanos al nuestro, como son los lenguajes de alto nivel. De este modo dejamos al compilador el trabajo de traducir los programas de alto nivel a programas en código máquina. Normalmente, para resolver un problema grande lo dividimos en unidades más pequeñas y manejables. Se usa la técnica de refinamiento o diseño descendente para dividir la tarea o problema en pasos cada vez más sencillos, hasta que se puedan sustituir directamente por las sentencias del lenguaje de alto nivel que se utiliza. En estas especificaciones, en diferentes niveles de refinamiento, únicamente se deben emplear las estructuras básicas de la programación. De este modo es muy fácil traducir el algoritmo en un programa empleando un lenguaje de alto nivel. Una vez que tenemos el programa se ha de realizar una serie de operaciones para obtener el código máquina ejecutable. Se suelen agrupar los conjuntos de sentencias que desarrollan una misma tarea en un módulo independiente cuyas interacciones con el exterior estén delimitadas. Estos módulos independientes o subprogramas pueden ser subrutinas (procedimientos) o funciones. Este empaquetamiento tiene múltiples ventajas. Una de ellas es que se pueden crear bibliotecas de subrutinas que resuelven eficientemente los problemas numéricos más comunes. De este modo, se acelera la escritura de códigos y se reduce el riesgo de cometer errores. Algoritmos A pesar del desarrollo de la Inteligencia Artificial y de los Sistemas Expertos; tales como Machine Learning o el Deep Learning, el computador no es un sistema inteligente y, en general, no es capaz de analizar un problema y darnos una solución. Para que la máquina realice una tarea es necesario describir cómo debe realizarla, paso a paso (esto si utilizamos el paradigma imperativo para el desarrollo de programas), y en términos de operaciones simples que puede ejecutar. Las operaciones que puede realizar un ordenador son, por ejemplo, sumar, restar o transferir datos. A tal descripción se le denomina algoritmo. Algoritmo: un algoritmo es un método para resolver un problema, que consiste en la realización de un conjunto de pasos lógicamente ordenados tal que, partiendo de ciertos datos de entrada, permite obtener ciertos resultados que conforman la solución del problema. Así, como en la vida real, cuando tenemos que resolver un problema, o lograr un objetivo, por ejemplo: “Tengo que atarme los cordones”, para alcanzar la solución de ese problema, realizamos un conjunto de pasos, de manera ordenada y secuencial. Es decir, podríamos definir un algoritmo para atarnos los cordones de la siguiente forma: 1. Ponerme las zapatillas. 2. Agarrar los cordones con ambas manos. 3. Hacer el primer nudo. 4. Hacer un bucle con cada uno de los cordones. 5. Cruzar los dos bucles y ajustar. 6. Corroborar que al caminar los cordones no se sueltan y la zapatilla se encuentra correctamente atada. CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 9 El concepto de algoritmo es fundamental en el proceso de programación de un ordenador, pero si nos detenemos a observar a nuestro alrededor, así como el ejemplo anterior podemos descubrir muchos otros: nos están dando un algoritmo cuando nos indican la forma de llegar a una dirección dada, seguimos algoritmos cuando conducimos un automóvil o cualquier tipo de vehículo. Todos los procesos de cálculo matemático que normalmente realiza una persona en sus tareas cotidianas, como sumar, restar, multiplicar o dividir, están basados en algoritmos que fueron aprendidos en la escuela primaria. Como se ve, la ejecución de algoritmos forma parte de la vida moderna. Por otro lado, la complejidad de los distintos problemas que podamos abordar puede variar desde muy sencilla a muy compleja, dependiendo de la situación y la cantidad de elementos que intervienen. En casos de mayor complejidad suele ser una buena solución dividir al problema en diferentes subproblemas que puedan ser resueltos de manera independiente. De esta forma la solución final al problema inicial será determinada por las distintas soluciones de los problemas más pequeños cuya resolución es más sencilla. Luego de haber definido el algoritmo necesario, se debe traducir dicho algoritmo en un conjunto de instrucciones, entendibles por la computadora, que le indican a la misma lo que debe hacer; este conjunto de instrucciones conforma lo que se denomina, un programa. Para escribir un programa se utilizan lenguajes de programación, que son lenguajes que pueden ser entendidos y procesados por el ordenador. Tanto el lenguaje de programación como el ordenador son los medios para obtener un fin: conseguir que el algoritmo se ejecute y se efectué el proceso correspondiente. Características de los algoritmos Las características fundamentales que debe cumplir todo algoritmo son: • Un algoritmo debe ser preciso e indicar el orden de realización de cada paso. • Un algoritmo debe estar específicamente definido. Es decir, si se ejecuta un mismo algoritmo dos veces, con los mismos datos de entada, se debe obtener el mismo resultado cada vez. • Un algoritmo debe ser finito. Si se sigue un algoritmo, se debe terminar en algún momento; o sea, debe tener un numero finito de pasos. Debe tener un inicio y un final. • Un algoritmodebe ser correcto: el resultado del algoritmo debe ser el resultado esperado. • Un algoritmo es independiente tanto del lenguaje de programación en el que se expresa como de la computadora que lo ejecuta. Eficiencia de algoritmos En muchos casos, el algoritmo que resuelve un problema no es único. Por ejemplo, estudiaremos diferentes métodos para resolver sistemas de ecuaciones lineales. Por ello, normalmente interesa no sólo encontrar un algoritmo, sino que éste sea suficientemente eficiente. Es posible realizar comparaciones entre algoritmos que resuelven el mismo problema. La eficiencia de un algoritmo numérico suele medirse por los siguientes factores: • El tiempo de ejecución o complejidad computacional. Generalmente no se comparan dos tiempos, sino la variación de la complejidad respecto al tamaño del problema. Por ejemplo, en la suma de dos vectores de longitud N la complejidad varía como O(N), esto es, de orden N. Esto significa que, CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 10 si la longitud de los vectores se multiplica por dos, el tiempo consumido en la suma vectorial también se multiplica por dos. • Los recursos que se necesitan para implementar el algoritmo. En concreto se suele considerar el uso de la memoria por parte del algoritmo. Al igual que en el caso de la complejidad, se suelen comparar variaciones. • Errores numéricos. Los métodos numéricos llevan asociados una serie de errores. Estos errores se deben tener en cuenta cuando se comparan diferentes métodos para resolver el mismo problema numérico. Los errores que se estudiarán son: redondeo (los computadores trabajan con un número finito de dígitos), truncamiento (debido a la aproximación de un problema continuo por un problema discreto) y convergencia (las soluciones generadas por los métodos iterativos son buenas para el criterio de convergencia). Un ejemplo de método muy ineficiente es el método de Cramer para resolver sistemas de ecuaciones. Si este método se emplea para resolver un sistema de 20 ecuaciones, en un ordenador donde una operación aritmética básica consume un microsegundo, el tiempo que requiere para obtener el resultado excedería el millón de años. En cambio, si empleamos el método de eliminación gaussiana se requerirían 0,005 segundos. Este ejemplo ilustra muy bien el hecho de que hay que pensar detenidamente qué método emplear en cada situación. Diseño de Problema Para diseñar un algoritmo se suele emplear la técnica “divide y vencerás” (refinamiento o diseño descendente), que divide un problema grande en unidades más pequeñas y manejables. Siguiendo esta técnica, se divide una tarea en partes más pequeñas que se pueden resolver individualmente. Se pueden emplear únicamente las tres estructuras básicas de la programación para expresar el algoritmo en cada nivel de refinamiento. De este modo, la traducción de un algoritmo a un programa es inmediata usando un lenguaje de alto nivel. Los problemas que pretendemos resolver son demasiado difíciles de analizar como para dividirlos en pasos mentalmente. Por ello se usa la técnica “divide y vencerás” (refinamiento o diseño descendente). El problema global se divide en fases independientes y, a continuación, se analizan estas fases sin tener en cuenta el resto. Esto se hace de un modo recursivo hasta que las fases se pueden describir por medio de sentencias del lenguaje de programación. Para entender esta técnica vamos a estudiar el siguiente problema: El bloque anterior expone el problema que se pretende resolver, pero no especifica los pasos básicos que lo resuelvan. Esta tarea debemos dividirla en pasos más sencillos La tarea 1.2 es todavía muy ambigua, debemos seguir refinándola CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 11 Pero aún no hemos terminado. Varios de estos pasos en este algoritmo implican operaciones más detalladas que deben formalizarse Supongamos que además queremos escribir en pantalla un mensaje especial si el resultado es cero El método por el cual este algoritmo fue desarrollado es importante: se comenzó con un enunciado genérico de la solución del problema y se continuó hasta encontrar el algoritmo final, para lo que se incrementaron sistemáticamente los detalles. ¿Cuándo un nivel de detalle es el adecuado? Esto se conoce en función del lenguaje de programación que usemos para implementarlo. Los lenguajes de programación. Por ejemplo, si implementamos un algoritmo numérico con Matlab o Scilab, el nivel de refinamiento del algoritmo es inferior al alcanzado con C, Java o Fortran. Por ejemplo, en el caso estudiado quedaría así CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 12 La complejidad de este algoritmo es de orden O(N), donde N es el número de componentes del vector. Esto significa que, si con una longitud de vector el algoritmo consume cierto tiempo, con un vector doble en longitud, el tiempo de ejecución se multiplica también por 2. Debemos tener en cuenta que esto es una aproximación porque si duplicamos la longitud del vector, solo la sección del algoritmo denominada 1.2.2 será la que consuma el doble de tiempo. El resto del algoritmo consumirá el mismo tiempo. Además, al duplicarse la cantidad de datos la jerarquía de memoria puede ser explotada de modo más o menos eficiente. Pero si deseamos formalizar el método aplicado para el desarrollo de cualquier algoritmo podemos hacerlo de la siguiente manera: Dado un problema, para plantear un algoritmo que permita resolverlo, es conveniente entender correctamente la situación problemática y su contexto, tratando de deducir del mismo los elementos ya indicados (entradas, procesos y salida). En este sentido entonces, para crear un algoritmo: 1. Comenzar identificando los resultados esperados, porque así quedan claros los objetivos a cumplir. 2. Luego, individualizar los datos con que se cuenta y determinar si con estos datos es suficiente para llegar a los resultados esperados. Es decir, definir los datos de entrada con los que se va a trabajar para lograr el resultado. 3. Finalmente, si los datos son completos y los objetivos claros, se intentan plantear los procesos necesarios para pasar de los datos de entrada a los datos de salida. Ejemplo Guiado: Obtención del área de un rectángulo CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 13 Desarrolle un algoritmo que permita calcular el perímetro y el área de un triángulo dado como entradas el valor de los 3 lados. Eficiencia del Método aplicado El problema planteado sobre las sumas de los elementos de un vector también puede resolverse usando el método de las sumas parciales. Por ejemplo, si el vector tiene 8 componentes, es decir 𝑣𝑖 = 1,… ,8 Calculamos en primer lugar las cuatro sumas parciales 𝑣1 + 𝑣2 = 𝑤1 𝑣3 + 𝑣4 = 𝑤2 𝑣5 + 𝑣6 = 𝑤3 𝑣7 + 𝑣8 = 𝑤4 A continuación, realizamos las sumas 𝑤1 +𝑤2 = 𝑤1 𝑤3 +𝑤4 = 𝑤2 Y por último concluimos con 𝑤1 +𝑤2 para obtener la suma global. El número de operaciones o complejidad del método es muy parecido al caso anterior, pero los requisitos de memoria son superiores porque necesita un vector adicional 𝑤 donde almacenar las sumas parciales. Sin embargo, este método se suele emplear más frecuentemente porque se produce una menor acumulación de errores de redondeo. Además, es más apto para ser implementado en un ordenador paralelo, con varios procesadores,dado que la tarea fundamental (las sumas parciales) puede repartirse en subtareas independientes. Las estructuras de control La programación basada en el paradigma imperativo (el que usaremos en la asignatura sin entrar en detalles) describe una metodología para diseñar y desarrollar programas. Según este paradigma el programa se considera como el texto de un libro; el programa ha de estar bien redactado, con elegancia y legibilidad. El programa ha de ser fácil de leer y cualquier programador deber ser capaz de entender fácilmente programas desarrollados por otros. Está comprobado que las técnicas de este paradigma facilitan notablemente la tarea de programar. Un programa escrito con buen estilo da lugar a un menor número de errores y es más fácil de mantener y modificar en el futuro. Un programa puede ser escrito utilizando tres tipos de estructuras de control: a) secuenciales b) selectivas o de decisión c) repetitivas Las Estructuras de Control determinan el orden en que deben ejecutarse las instrucciones de un algoritmo: si serán recorridas una luego de la otra, si habrá que tomar decisiones sobre si ejecutar o no alguna acción o si habrá repeticiones. Estructura secuencial CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 14 Es la estructura en donde una acción (instrucción) sigue a otra de manera secuencial. Las tareas se dan de tal forma que la salida de una es la entrada de la que sigue y así en lo sucesivo hasta cumplir con todo el proceso. Esta estructura de control es la más simple, permite que las instrucciones que la constituyen se ejecuten una tras otra en el orden en que se listan. Por ejemplo, considérese el siguiente fragmento de un algoritmo: Representación en Diagrama de Flujos Representación en Pseudocodigo 1.1. Operación 1 2.1. Operación 2 … En este fragmento se indica que se ejecute la operación 1 y a continuación la operación 2. Estructura selectiva Estas estructuras de control son de gran utilidad para cuando el algoritmo a desarrollar requiera una descripción más complicada que una lista sencilla de instrucciones. Este es el caso cuando existe un numero de posibles alternativas que resultan de la evaluación de una determinada condición. Este tipo de estructuras son utilizadas para tomar decisiones lógicas, es por esto por lo que también se denominan estructuras de decisión o alternativas. En estas estructuras, se realiza una evaluación de una condición y de acuerdo con el resultado, el algoritmo realiza una determinada acción. Las condiciones son especificadas utilizando expresiones lógicas. Las estructuras selectivas/alternativas pueden ser: • Simples • Dobles • Múltiples Alternativa Simple La estructura alternativa simple si-entonces (en inglés if-then) lleva a cabo una acción al cumplirse una determinada condición. La selección si-entonces evalúa la condición y: • Si la condición es verdadera, ejecuta la acción S1. • Si la condición es falsa, no ejecuta nada. En Diagrama de Flujos En pseudocódigo (español) En pseudocódigo (inglés) CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 15 Ejemplo: Inicio numero ← 3 Si (3 % 2 = 0) entonces El número es par Fin_si Fin Donde % representa el módulo, es decir el resto de dividir 3 por 2 y ← indica asignación, es decir que la variable número se le asigna el valor 3 Alternativa Doble Existen limitaciones en la estructura selectiva simple, y se necesitará normalmente una estructura que permita elegir dos opciones o alternativas posibles, de acuerdo al cumplimiento o no de una determinada condición: • Si la condición es verdadera, ejecuta la acción S1. • Si la condición es falsa, ejecuta la acción S2. En Diagrama de Flujos En pseudocódigo (español) En pseudocódigo (inglés) Ejemplo: Inicio numero ← 3 Si (3 % 2 <> 0) entonces El número es impar Sino El número es par Fin_si Fin Alternativa Múltiple Se utiliza cuando existen más de dos alternativas para elegir. Esto podría solucionarse por medio de estructuras alternativas simples o dobles, anidadas o en cascada. Sin embargo, se pueden plantear serios problemas de escritura del algoritmo, de comprensión y de legibilidad, si el número de alternativas es grande. En esta estructura, se evalúa una condición o expresión que puede tomar n valores. Según el valor que la expresión tenga en cada momento se ejecutan las acciones correspondientes al valor. En especial se debe destacar que también es posible indicar que acción se llevará a cabo cuando ninguna de las otras alternativas descriptas se cumpla. Esta alternativa se denomina genéricamente “alternativa por defecto” o “default”. CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 16 En Diagrama de Flujos En pseudocódigo (español) Ejemplo: Inicio sueldo ← 100 antigüedad ← 5 Según sea antigüedad 5: sueldo ← sueldo + sueldo * 0,3 10: sueldo ← sueldo + sueldo * 0,5 Por defecto: sueldo * sueldo * 0,1 Fin_según Fin Donde * es el operador para indicar multiplicación. Estructura repetitiva o iterativa Durante el proceso de creación de programas, es muy común, encontrarse con que una operación o conjunto de operaciones deben repetirse muchas veces. Para ello es importante conocer las estructuras de algoritmos que permiten repetir una o varias acciones, un número determinado de veces. Las estructuras que repiten una secuencia de instrucciones un número determinado de veces se denominan BUCLES. Y cada repetición del bucle se llama iteración. Todo bucle tiene que llevar asociada una condición, que es la que va a determinar cuándo se repite el bucle y cuando deja de repetirse. Un bucle se denomina también lazo o loop. Hay que prestar especial atención a los bucles infinitos, hecho que ocurre cuando la condición de finalización del bucle no se llega a cumplir nunca. Se trata de un fallo muy típico, habitual sobre todo entre programadores principiantes. Las estructuras repetitivas/iterativas son: • Mientras, en inglés While • Hacer mientras o Repetir hasta, en inglés Do While • Para, en inglés for Estructura Mientras Esta estructura repetitiva “mientras”, es en la que el cuerpo del bucle se repite siempre que se cumpla una determinada condición. En Diagrama de Flujos En pseudocódigo (español) En pseudocódigo (inglés) CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 17 Ejemplo: Inicio sumador ← 0 contador ← 1 Mientras (contador <= 5) hacer sumador ← sumador + (contador * 2) contador ← contador + 1 Fin mientras Fin Estructura Hacer mientras Esta estructura es muy similar a la anterior, solo que a diferencia del While el contenido del bucle se ejecuta siempre al menos una vez, ya que la evaluación de la condición se encuentra al final. De esta forma garantizamos que las acciones dentro de este bucle sean llevadas a cabo, aunque sea una vez independientemente del valor de la condición. En Diagrama de Flujos En pseudocódigo (español) En pseudocódigo (inglés) Ejemplo: Inicio sumador ← 0 contador ← 6 Hacer sumador ← sumador + (contador * 2) contador ← contador - 1 Mientras (contador >= 4) hacer Fin CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTODE ORDENADORES Y ALGORITMOS Página 18 Estructura Repetir La estructura for es un poco más compleja que las anteriores y nos permite ejecutar un conjunto de acciones para cada elemento de una lista, o para cada paso de un conjunto de elementos. Su implementación depende del lenguaje de programación, pero en términos generales podemos identificar tres componentes: la inicialización, la condición de corte y el incremento En Diagrama de Flujos En pseudocódigo (español) Ejemplo Inicio cant_pares ← 0 Para (numero ← 1; numero <=100; numero ← numero + 1) Si (numero % 2 = 0) entonces cant_pares ← cant_pares + 1 Fin_si Fin para Fin El programa es la traducción directa del modelado de un algoritmo en un nivel de refinamiento. Por ello, lo realmente importante y complicado es describir cómo se resuelve un problema por medio de un modelo de algoritmo. Del modelo se puede pasar rápidamente a cualquier lenguaje de alto nivel que implemente las estructuras básicas, como MATLAB, FORTRAN, Java o C. A lo largo de los apuntes se exponen los pseudocódigos de diferentes algoritmos numéricos y a continuación se implementan usando Scilab; sin embargo, no necesariamente estarán implementados de la forma más eficiente por cuanto el objetivo es mostrar la esencia del método. Escribimos, también los algoritmos modelados en pseudocódigo de modo que el lector pueda implementar rápidamente los métodos en otro lenguaje de alto nivel diferente. Características de un buen programa A pesar de que un algoritmo esté correctamente programado y resuelva el problema numérico para el que fue diseñado, es necesario implementar el código del mejor modo posible para que pueda ser fácilmente interpretado y actualizado por otro usuario. Los criterios que se deben seguir son los siguientes: CÁLCULO NUMÉRICO – ING EN INFORMÁTICA – LIC EN SISTEMAS – ING EN MINAS FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy FUNCIONAMIENTO DE ORDENADORES Y ALGORITMOS Página 19 • Fiabilidad: el código no debe tener errores, debe resolver el problema numérico para el que ha sido creado. • Robustez: el código debe tener la capacidad de detectar errores en los datos introducidos. Esto es, debe ser capaz de detectar situaciones para las que no ha sido programado. De este modo el código es capaz de enfrentarse a una gran variedad de situaciones sin intervención del usuario. • Potabilidad: el código debe poderse trasladar sin ser modificado de un ordenador a otro. Esto significa que no debe hacer ningún tipo de suposición sobre la arquitectura del computador. El código se debe implementar en un lenguaje de alto nivel. • Mantenimiento: si el código necesita ser modificado, para hacer correcciones o para mejorarlo, esta acción se debe poder hacer con el mínimo esfuerzo. Para ello es fundamental que se sigan las normas de la programación establecidas, se delimiten los bloques que forman el programa y, además, se comente con detalle el código. Resuelva los siguientes ejercicios indicando para cada uno de ellos: entrada – proceso – salidas y su algoritmo. Suba los algoritmos en el aula virtual. Ejercicio 2: Averiguar si un número es primo o no. Ejercicio 3: Obtenga las raíces reales de la ecuación de segundo grado. Ejercicio 4: Hallar el promedio de la suma de N números. Ejercicio 5: Hallar el factorial de un número N usando las tres estructuras iterativas.
Compartir