DEDICATORIA. Dedico este trabajo a mi profesora por formarnos con su exigencia y hacernos personas mĂĄs responsables y perseverantes. TambiĂŠn a mis papas por su apoyo en cada momento de mi vida y durante la realizaciĂłn de este trabajo.
PRESENTACIร N. Este manual se trata sobre los algoritmos, diagramas de flujos, estructuras condicionales, etc. Consta de ejercicios y ejemplos para poder aprender de forma mรกs fรกcil y didรกctica.
CONOCIENDO LOS ALGORITMOS.
Podemos encontrar muchas definiciones completas o formales de algoritmo en los textos de algorítmica y programación, todas ellas muy similares: Secuencia finita de instrucciones, reglas o pasos que describen de forma precisa las operaciones de un ordenador debe realizar para llevar a cabo un tarea en un tiempo mas finito. Descripcion de un esquema de comportamiento expresado mediante un reportorio finito de acciones y de informaciones elementales, identificadas, bien comprendidas y realizables a priori. Este repertorio se denomica lexico [Pierre Scholl, 1988] Un algoritmo es un conjunto finito de pasos definidos, estructurados en el tiempo y formulados con base a un conjunto finito de reglas no ambiguas, que proveen un procedimiento para dar la solución o indicar la falta de esta a un problema en un tiempo determinado. En matemáticas, ciencias de la computación y disciplinas relacionadas, un algoritmo (del griego y latín,dixit algorithmus y este a su vez del matemático persa Al-Juarismi ) es un conjunto preescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos sucesivos que no generen dudas a quien deba realizar dicha actividad. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solución. Los algoritmos son el objeto de estudio de la algoritmia.
En la vida cotidiana, se emplean algoritmos frecuentemente para resolver problemas. Algunos ejemplos son los manuales de usuario, que muestran algoritmos para usar un aparato, o las instrucciones que recibe un trabajador por parte de su patrón. Algunos ejemplos en matemática son el algoritmo de ladivisión para calcular el cociente de dos números, el algoritmo de Euclides para obtener el máximo común divisor de dos enteros positivos, o el método de Gauss para resolver un sistema lineal de ecuaciones. En general, no existe ningún consenso definitivo en cuanto a la definición formal de algoritmo. Muchos autores los señalan como listas de instrucciones para resolver un problema abstracto, es decir, que un número finito de pasos convierten los datos de un problema (entrada) en una solución (salida). Sin embargo cabe notar que algunos algoritmos no necesariamente tienen que terminar o resolver un problema en particular. Por ejemplo, una versión modificada de la criba de Eratóstenes que nunca termine de calcular números primos no deja de ser un algoritmo. A lo largo de la historia varios autores han tratado de definir formalmente a los algoritmos utilizando modelos matemáticos como máquinas de Turing entre otros.8 9 Sin embargo, estos modelos están sujetos a un tipo particular de datos como son números, símbolos o gráficas mientras que, en general, los algoritmos funcionan sobre una vasta cantidad de estructuras de datos. En general, la parte común en todas las definiciones se puede resumir en las siguientes tres propiedades siempre y cuando no consideremos algoritmos paralelos: Tiempo secuencial. Un algoritmo funciona en tiempo discretizado –paso a paso–, definiendo así una secuencia de estados "computacionales" por cada entrada válida (la entrada son los datos que se le suministran al algoritmo antes de comenzar).
Estado abstracto. Cada estado computacional puede ser descrito formalmente utilizando una estructura de primer orden y cada algoritmo es independiente de su implementación (los algoritmos son objetos abstractos) de manera que en un algoritmo las estructuras de primer orden son invariantes bajo isomorfismo. Exploración acotada. La transición de un estado al siguiente queda completamente determinada por una descripción fija y finita; es decir, entre cada estado y el siguiente solamente se puede tomar en cuenta una cantidad fija y limitada de términos del estado actual. En resumen, un algoritmo es cualquier cosa que funcione paso a paso, donde cada paso se pueda describir sin ambigüedad y sin hacer referencia a una computadora en particular, y además tiene un límite fijo en cuanto a la cantidad de datos que se pueden leer/escribir en un solo paso. Esta amplia definición abarca tanto a algoritmos prácticos como aquellos que solo funcionan en teoría, por ejemplo el método de Newton y la eliminación de Gauss-Jordan funcionan, al menos en principio, con números de precisión infinita; sin embargo no es posible programar la precisión infinita en una computadora, y no por ello dejan de ser algoritmos.10 En particular es posible considerar una cuarta propiedad que puede ser usada para validar la tesis de Church-Turing de que toda función calculable se puede programar en una máquina de Turing (o equivalentemente, en un lenguaje de programación suficientemente general):
MEDIOS DE ALGORITMO.
EXPRESION
DE
UN
Los algoritmos pueden ser expresados de muchas maneras, incluyendo al lenguaje natural, pseudocódigo, diagramas de flujo y lenguajes de programación entre otros. Las descripciones en lenguaje natural tienden a ser ambiguas y extensas. El usar pseudocódigo y diagramas de flujo evita muchas ambigüedades del lenguaje natural. Dichas expresiones son formas más estructuradas para representar algoritmos; no obstante, se mantienen independientes de un lenguaje de programación específico. La descripción de un algoritmo usualmente se hace en tres niveles: 1. Descripción de alto nivel. Se establece el problema, se selecciona un modelo matemático y se explica el algoritmo de manera verbal, posiblemente con ilustraciones y omitiendo detalles. 2. Descripción formal. Se usa pseudocódigo para describir la secuencia de pasos que encuentran la solución. 3. Implementación. Se muestra el algoritmo expresado en un lenguaje de programación específico o algún objeto capaz de llevar a cabo instrucciones.
ALGORITMOS COMO FUNCIONES. Un algoritmo se puede concebir como una función que transforma los datos de un problema (entrada) en los datos de una solución (salida). Más aun, los datos se pueden representar a su vez como secuencias de bits, y en general, de símbolos cualesquiera.1 9 11 Como cada secuencia de bits representa a un número natural (véase Sistema binario), entonces los algoritmos son en esencia funciones de los números naturales en los números naturales que sí se pueden calcular. Es decir que todo algoritmo calcula una función donde cada número natural es la codificación de un problema o de una solución.
En ocasiones los algoritmos son susceptibles de nunca terminar, por ejemplo, cuando entran a un bucle infinito. Cuando esto ocurre, el algoritmo nunca devuelve ningún valor de salida, y podemos decir que la función queda indefinida para ese valor de entrada. Por esta razón se considera que los algoritmos son funciones parciales, es decir, no necesariamente definidas en todo su dominio de definición. Cuando una función puede ser calculada por medios algorítmicos, sin importar la cantidad de memoria que ocupe o el tiempo que se tarde, se dice que dicha función es computable. No todas las funciones entre secuencias datos son computables. El problema de la parada es un ejemplo.
ANALISIS DE UN ALGORITMO. Como medida de la eficiencia de un algoritmo, se suelen estudiar los recursos (memoria y tiempo) que consume el algoritmo. El análisis de algoritmos se ha desarrollado para obtener valores que de alguna forma indiquen (o especifiquen) la evolución del gasto de tiempo y memoria en función del tamaño de los valores de entrada. El análisis y estudio de los algoritmos es una disciplina de las ciencias de la computación y, en la mayoría de los casos, su estudio es completamente abstracto sin usar ningún tipo de lenguaje de programación ni cualquier otra implementación; por eso, en ese sentido, comparte las características de las disciplinas matemáticas. Así, el análisis de los algoritmos se centra en los principios básicos del algoritmo, no en los de la implementación particular. Una forma de plasmar (o algunas veces "codificar") un algoritmo es escribirlo
en pseudocódigo o utilizar un lenguaje muy simple tal como Lexico, cuyos códigos pueden estar en el idioma del programador. Algunos escritores restringen la definición de algoritmo a procedimientos que deben acabar en algún momento, mientras que otros consideran procedimientos que podrían ejecutarse eternamente sin pararse, suponiendo el caso en el que existiera algún dispositivo físico que fuera capaz de funcionar eternamente. En este último caso, la finalización con éxito del algoritmo no se podría definir como la terminación de este con una salida satisfactoria, sino que el éxito estaría definido en función de las secuencias de salidas dadas durante un periodo de vida de la ejecución del algoritmo. Por ejemplo, un algoritmo que verifica que hay más ceros que unos en una secuencia binaria infinita debe ejecutarse siempre para que pueda devolver un valor útil. Si se implementa correctamente, el valor devuelto por el algoritmo será válido, hasta que evalúe el siguiente dígito binario. De esta forma, mientras evalúa la siguiente secuencia podrán leerse dos tipos de señales: una señal positiva (en el caso de que el número de ceros sea mayor que el de unos) y una negativa en caso contrario. Finalmente, la salida de este algoritmo se define como la devolución de valores exclusivamente positivos si hay más ceros que unos en la secuencia y, en cualquier otro caso, devolverá una mezcla de señales positivas y negativas.
Caracteristicas: Las características todo algoritmo son:
fundamentales
que
debe
cumplir
Ser definido: Sin ambigüedad, cada paso del algoritmo debe indicar la acción a realizar sin criterios de interpretación. Ser finito: Un número específico y numerable de pasos debe componer al algoritmo, el cual deberá finalizar al completarlos.
Tener cero o más entradas: Datos son proporcionados a un algoritmo como insumo (o estos son generados de alguna forma) para llevar a cabo las operaciones que comprende. Tener una o más salidas: Debe siempre devolver un resultado; de nada sirve un algoritmo que hace algo y nunca sabemos que fue. El devolver un resultado no debe ser considerado como únicamente “verlos” en forma impresa o en pantalla, como ocurre con las computadoras. Existen muchos otros mecanismos susceptibles de programación que no cuentan con una salida de resultados de esta forma. Por salida de resultados debe entenderse todo medio o canal por el cual es posible apreciar los efectos de las acciones del algoritmo. Efectividad: El tiempo y esfuerzo por cada paso realizado debe ser preciso, no usando nada más ni nada menos que aquello que se requiera para y en su ejecución. un algoritmo es una serie de pasos que se tienen para llevar a cabo una acción. siempre tiene que ser finito, la clave de un algoritmo es que siempre tiene un fin, no se deja incompleto.. un ejemplo en Pseudocodigo seria (Un numero multiplicado por otro) INICIO Num1=0, Num2=0, Multiplicacion=0 Escribir "Ingrese el numero 1", Leer Num1 Escribir "Ingrese el numero 2", Leer Num2 Multiplicacion=Num1*Num2 Escribir "La Respuesta Es: ", Multiplicacion FIN
Descripción formal El algoritmo puede ser escrito de una manera más formal en el siguiente pseudocódigo:
Algoritmo Encontrar el máximo de un conjunto función max( ) //
es un conjunto no vacío de números// ← // es el número de elementos de ←
para
←
si
hasta
//
hacer
entonces
← devolver Sobre la notación: "←" representa una asignación: variable toma el valor de ;
←
significa que la
"devolver" termina el algoritmo y devuelve el valor a su derecha (en este caso, el máximo de ).
VARIABLES Simplemente es una cantidad determinada de símbolos representados por letras que sirven para acumular valores numéricos en su mayoría para facilitar el entendimiendo t del algoritmo y su simplicidad. Por ejemplo: a=10 b=30 c=a+b Donde 'a', 'b' y 'c' son variables y a 'c' se le asigna el valos de la suma de 'a' y 'b', resultando 'c' valiendo 40. Una variable es un nombre asociado a un elemento de datos que está situado en posiciones contiguas de la memoria principal, y su valor puede cambiar durante la ejecución de un programa. Toda variable pertenece a un tipo de dato concreto. En la declaración de una variable se debe indicar el tipo al que pertenece. Así tendremos variables enteras, reales, booleanas, etc. Por otro lado, distinguimos tres partes fundamentales en la vida de una variable: Declaración de variables Esta es la primera fase en la vida de cualquier variable. La forma de declarar variables es muy sencilla. Esta sección debe comenzar con la palabra reservada var, seguida de una lista de parejas lista_de_variables=tipo_al_que_pertenecen. Cada par debe ir seguido por un punto y coma. La lista_de_variables es uno o más nombres de variables separados por comas: var listaVar1:tipo1;...;listaVarn:tipon;
Una variable no representa más que una porción de memoria en donde guardamos un dato que dependerá del tipo al que pertenezca la variable. A diferencia de una constante, el valor de una variable puede cambiar durante la ejecución de un programa. Otra diferencia, es que a una variable no basta con declararla, sino que también es necesario iniciarla. Esto se refiere a darle un valor inicial, y es importante ya que si no lo hacemos, igual nos encontramos con errores cuando ejecutemos el programa. Ejemplo de declaración de variables: ... var I, J, K : Integer; (* valores enteros *) Contador : Integer; Radio : Real; (* valor real *) Letra : Char; (* un caracter *) ... En este ejemplo se declaran seis variables. Las cuatro primeras son de tipo entero. La quinta es de tipo real, o sea, un número con parte decimal. Y la sexta es un carácter, que no es lo mismo que una cadena de un carácter (String[1]). Iniciación de variables Esto no es más que darle un valor inicial a una variable. Así como lo primero que se hace con una variable es declararla, lo siguiente tiene que ser iniciarla. Esto se hace para evitar posibles errores en tiempo de ejecución, pues una variable tiene un valor indeterminado después de declararla. Principalmente, existen dos maneras de otorgar valores iniciales a variables:
Mediante una sentencia de asignación Mediante uno de los procedimientos de entrada de datos (read o readln)
Veamos un ejemplo que reúne los dos casos:
begin ... i:=1; readln(n); while i < n do begin (* cuerpo del bucle *) i := i + 1 end; ... end.
Utilización de variables Una vez declarada e iniciada una variable, es el momento de utilizarla. Esta es la parte que presenta un mayor abanico de posibilidades. A continuación se presentan unas cuantas:
Incrementar su valor:
i := i + 1
Controlar un bucle:
for i:=1 to 10 do ...
Chequear una condición:
if i<10 then ...
Participar en una expresión:
n := (Max - Min) div I
Dado que hay ciertos casos en los que resulta interesante disponer de la capacidad de sólo lectura que tienen las constantes pero no es
posible usarlas debido a las restricciones que hay impuestas sobre su uso, en C# también se da la posibilidad de definir variables que sólo puedan ser leídas. Para ello se usa la siguiente sintaxis:
readonly <tipoConstante> <nombreConstante> = <valor>; Estas variables superan la mayoría de las limitaciones de las constantes. Por ejemplo:
No es obligatorio darles un valor al definirlas, sino que puede dárseles en el constructor. Ahora bien, una vez dado un valor a una variable readonly ya no es posible volverlo a modificar. Si no se le da ningún valor ni en su constructor ni en su definición tomará el valor por defecto correspondiente a su tipo de dato. No tienen porqué almacenar valores constantes, sino que el valor que almacenen puede calcularse durante la ejecución de la aplicación. No tienen porqué definirse como estáticas, aunque si se desea puede hacerse. Su valor se determina durante la ejecución de la aplicación, lo que permite la actualización de códigos cliente sin necesidad de recompilar. Por ejemplo, dado:
namespace Programa1 { public class Utilidad { public static readonly int X = 1; } } namespace Programa2 {
class Test { public static void Main() { System.Console.WriteLine(Programa1.Utilidad.X); } } }
En principio, la ejecución de este programa producirá el valor 1. Sin embargo, si cada espacio de nombres se compilan en módulos de código separados que luego se enlazan dinámicamente y cambiamos el valor de X, sólo tendremos que recompilar el módulo donde esté definido Programa1.Utilidad y Programa2.Test podrá ejecutarse usando el nuevo valor de X sin necesidad de recompilarlo. Sin embargo, pese a las ventajas que las variables de sólo lectura ofrecen respecto a las constantes, tienen dos inconvenientes respecto a éstas: sólo pueden definirse como campos (no como variables locales) y con ellas no es posible realizar las optimizaciones de código comentadas para las constantes.
CONSTANTES. Una constante es una variable cuyo valor puede determinar el compilador durante la compilación y puede aplicar optimizaciones derivadas de ello. Para que esto sea posible se ha de cumplir que el valor de una constante no pueda cambiar durante la ejecución, por lo que el compilador informará con un error de todo intento de modificar el valor inicial de una constante. Las constantes se definen como variables normales pero precediendo el nombre de su tipo del modificador const y dándoles siempre un valor inicial al declararlas. O sea, con esta sintaxis:
const <tipoConstante> <nombreConstante> = <valor>; Así, ejemplos de definición de constantes es el siguiente:
const int a = 123; const int b = a + 125; Dadas estas definiciones de constantes, lo que hará el compilador será sustituir en el código generado todas las referencias a las constantes a y b por los valores 123 y 248 respectivamente, por lo que el código generado será más eficiente ya que no incluirá el acceso y cálculo de los valores de a y b. Nótese que puede hacer esto porque en el código se indica explícitamente cual es el valor que siempre tendrá a y, al ser este un valor fijo, puede deducir cuál será el valor que siempre tendrá b. Para que el compilador pueda hacer estos cálculos se ha de cumplir que el valor que se asigne a las constantes en su declaración sea una expresión constante. Por ejemplo, el siguiente código no es válido en tanto que el valor de x no es constante:
// x es una variable normal, no una constante int x = 123; // Error: x no tiene porqué tener valor constante (aunque aquí lo tenga) const int y = x +123;
Debido a la necesidad de que el valor dado a una constante sea precisamente constante, no tiene mucho sentido crear constantes de tipos de datos no básicos, pues a no ser que valgan null sus valores no se pueden determinar durante la compilación sino únicamente tras la ejecución de su constructor. La única excepción a esta regla son los tipos enumerados, cuyos valores se pueden determinar al compilar como se explicará cuando los veamos en el Tema 14: Enumeraciones Todas las constantes son implícitamente estáticas, por lo se considera erróneo incluir el modificador staticen su definición al no tener sentido hacerlo. De hecho, para leer su valor desde códigos externos a la definición de la clase donde esté definida la constante, habrá que usar la sintaxis <nombreClase>.<nombreConstante> típica de los campos static. Por último, hay que tener en cuenta que una variable sólo puede ser definida como constante si es una variable local o un campo, pero no si es un parámetro. Una constante es un identificador (nombre) para expresar un valor simple. Como el nombre sugiere, este valor no puede variar durante la ejecucción del script. (A excepción de las constantes predefinidas, que en realidad no son constantes). Una constante es sensible a mayúsculas por defecto. Por convención, los identificadores de contantes siempre suelen declararse en mayúsculas. El nombre de una constante sigue las mismas reglas que cualquier otra etiqueta de PHP. Un nombre de constante válido empieza por una letra o subguión, seguido por cualquier número o letras, números o subguiones.
DATOS Los datos que utilizan los programas (o algoritmos) se pueden clasificar en base a diferentes criterios. Uno de los más significativos es aquel que dice que todos los datos que utilizan los programas son simples o compuestos. Un dato simple es indivisible (atómico), es decir, no se puede descomponer. Ejemplo 1: Un año es un dato simple. Año...: 2006 Un año se expresa con un número entero, el cual no se puede descomponer. Sin embargo, un dato compuesto está formado por otros datos. Ejemplo 2: Una fecha es un dato compuesto por tres datos simples (día, mes, año). Fecha: Día...: 30 Mes...: 11 Año...: 2006 Ejemplo 3: Otro ejemplo de dato simple es una letra. Letra...: t Una letra se representa con un carácter del alfabeto. Pero, cuando varias letras se agrupan, entonces se obtiene un dato compuesto por
varios caracteres. Ejemplo 4: Para formar un nombre de persona se utilizan varios caracteres. Nombre...: Ana (dato compuesto por tres caracteres) A continuación, se van a estudiar cinco tipos de datos: entero, real, lógico, carácter y cadena. De ellos, tan solo el tipo cadena es compuesto. Los demás son los tipos de datos simples consideradosestándares. Esto quiere decir que la mayoría de los lenguajes de programación permiten trabajar con ellos. Por ejemplo, en lenguaje C es posible utilizar datos de tipo entero, real y carácter, sin embargo, los datos de tipo lógico no se pueden utilizar, ya que, no existen en este lenguaje. Existen otros tipos de datos, simples y compuestos, que se estudiarán más adelante. A los tipos de datos simples estándares también se les conoce como tipos de datos primitivos, básicos o fundamentales.
TIPOS DE DATOS. ENTERO Un dato de tipo entero es aquel que puede tomar por valor un número perteneciente al conjunto de los números enteros (Z), el cual está formado por los números naturales, su opuestos (números negativos) y el cero. Z = { ..., -3, -2, -1, 0, 1, 2, 3, ... } Ejemplo: La edad de una persona y el año en que nació, son dos datos de tipo entero: Edad...: 29
Año....: 1976 Z es un conjunto infinito de números enteros, y como el ordenador no puede representarlos todos, un dato de tipo entero sólo puede tomar por valor un número perteneciente a un subconjunto de Z. Los valores máximo y mínimo de dicho subconjunto varían según las características de cada ordenador y del compilador que se utilice. En pseudocódigo, para indicar que un dato es de tipo entero se utiliza la palabra reservada:
REAL Un dato de tipo real es aquel que puede tomar por valor un número perteneciente al conjunto de los números reales (R), el cual está formado por los números racionales e irracionales. Ejemplo: El peso de una persona (en kilogramos) y su altura (en centímetros), son datos que pueden considerarse de tipo real. Peso.....: 75,3 Altura...: 172,7 R es un conjunto infinito de números reales, y como el ordenador no puede representarlos todos, un dato de tipo real sólo puede tomar por valor un número perteneciente a un subconjunto de R. Los valores de dicho subconjunto varían según las características de cada ordenador y del compilador que se utilice. En pseudocódigo, para indicar que un dato es de tipo real se utiliza la palabra reservada:
LOGICO En programación, un dato de tipo lógico es aquel que puede tomar por valor sólo uno de los dos siguientes: { verdadero, falso } Los valores "verdadero" y "falso" son contrapuestos, de manera que, un dato de tipo lógico siempre está asociado a que algo se cumpla o no se cumpla. Ejemplo: El estado de una barrera de paso de trenes es un dato que puede considerarse de tipo lógico, por ejemplo, asociando "verdadero" a que esté subida y "falso" a que esté bajada. Estado...: falso (indica que la barrera está bajada) En pseudocódigo, para indicar que un dato es de tipo lógico se utiliza la palabra reservada:
CARÁCTER Un dato de tipo carácter es aquel que puede tomar por valor un carácter perteneciente al conjunto de los caracteres que puede representar el ordenador. En pseudocódigo, el valor de un dato de tipo carácter se puede representar entre comillas simples (') o dobles ("). Pero, en este
curso de diseño de algoritmos, se van a utilizar solamente las comillas simples (al igual que se hace en lenguaje C). Ejemplo: En un examen con preguntas en las que hay que seleccionar la respuesta correcta entre varias opciones dadas (a, b, c, d, e), la respuesta correcta de cada una de las preguntas es un dato de tipo carácter. Respuesta correcta a la pregunta 3...: 'c'
CADENA Un dato de tipo cadena es aquel que pueden tomar por valor una secuencia de caracteres. Enpseudocódigo, el valor de un dato de tipo cadena se puede representar entre comillas simples (') o dobles ("). Sin embargo, en este curso de diseño de algoritmos, se van a utilizar solamente las comillas dobles (al igual que se hace en lenguaje C). Ejemplo: El título de un libro y el nombre de su autor, son datos de tipo cadena. Título...: "La Odisea" (cadena de 9 caracteres) Autor....: "Homero" (cadena de 6 caracteres) Obsérvese que, en la cadena "La Odisea", el carácter espacio en blanco también se cuenta. En pseudocódigo, para indicar que un dato es de tipo cadena se utiliza la palabra reservada:
EXPRESIONES
OPERADORES
DIAGRAMA DATO.
DE
FLUJO
DE
¿QUÉ ES UN DIAGRAMA DE FLUJO DE DATOS? Es una descripción grafica de un procedimiento para la resolución de un problema. Son frecuentemente usados para descubrir algoritmos y programasde computador. Los diagramas de flujos están compuestos por figuras conectadas con flechas. Para ejecutar un proceso comienza por el Inicio y se siguen las acciones indicadas por cada figura: El tipo de figura indica el tipo de paso que representa. Del Software, DFD es un software diseñado para contribuir y analizar algoritmos se puede crear diagramas de flujos de datos para la representación de algoritmos de programación estructurada a partir de las herramientas de edición que para este propósito suministra el programa .Después de hacer haber ingresado el representado por el diagrama, podrá, ejecutarlo analizarlo y depurarlo en un entorno interactivo diseñado para este fin. La interfaz grafica de DFD facilita en gran medida el trabajo con diagramas ya que simula la representación estándar de diagramas de flujo en hojas de papel.
LOS COMPONENTES DE UN DIAGRAMA DE FLUJO SON:
Proceso Flujo Almacén Terminador
PROCESO: El primer componente de diagrama de flujo de datos se conoce como Proceso. El proceso nuestra una parte del sistema que transforman Entradas y Salidas. Algunas analistas prefieren usar un ovalo o un rectángulo con esquinas redondeadas, otros prefieren usar un rectángulo. Las diferencias entre estas tres formas son puramente cosméticas, aunque obviamente es importante usar la misma forma de la manera consistente para representar todas las funciones de un sistema.
FLUJO: Un flujo se representa gráficamente por medio de una flecha que entra y sale de proceso; el flujo se usa para describir el movimiento, de bloques o paquetes de información de una parte del sistema a otra. Los flujos realmente representan Datos, es decir, Bits caracteres, mensajes, números, de puntos, flotante y los diversos tipos de información con los que las computadoras pueden tratar. Los flujos también muestran la dirección: Una cabeza de flecha en cualquier extremo(o posiblemente ambos) del flujo indica si los datos (o el material) se esta moviendo hacia adentro a hacia fuera por ejemplo indica claramente que el numero se esta mandando hacia el proceso denominado validar numero telefónicos, y el flujo denominado honorarios de entrega de chóferes. Los datos que se mueven a dicho flujo viajaran ya sea de un proceso a otro. Ejemplo:
ALMACÉN: Se utiliza para modelar una colección de paquetes de datos en reposo. Se denota por dos líneas paralelas, de modo característico el nombre que se utiliza para identificar para los paquetes que entran y salen del almacén por medios de flujo.
PEDIDOS: Para el analista con conocimiento de proceso de datos es tentador referirse a los almacenes como archivos o bases de datos; pro un almacén también pudiera consistir en datos almacenados también pudiera consistir en datos almacenados en tarjetas perforadas, microfilm, microfichas, discos ópticos, etc. y un almacén también puede ser en conjunto de fichas de papel en una caja de cartón , nombres de fichas de papel en un directorio, diversos archivos en un archivero, o varias formas no computarizadas. Los almacenes se conectan por flujos a los procesos. Así el contexto en el que se muestra en un DFD (Diagrama de Flujo de Datos) es uno de los siguientes:
Un flujo desde un almacén. UN flujo hacia un almacén.
TERMINADOR: Se representa como un rectángulo como los terminadores ser representa en entidades externas con las cuales el sistema se comunica, continuamente, puede ser una persona, o un grupo. Por ejemplo: una organización externa n o una agencia gubernamental, o un grupo o departamento que este dentro de la misma compañía u organización, pero fuera del control del sistema que se esta modelando. En algunos casos, un terminador puede ser otro sistema, como algún otro sistema computacional con el cual se comunica este.
Existen tres cosas importantes que debemos recordar acerca de los terminadores.
Son externos al sistema que se esta modelando. Es evidente que ni el analista ni el diseñador del sistema están en posibilidades de cambiar los contenidos de un terminador o la manera en que esta trabaja. Las relaciones que existen entre lo terminadores no se muestran en el modelo DFD (Diagrama de Flujo de Datos).
REGLAS PARA LA CREACIÓN DE DIAGRAMAS 1. Los diagramas de flujo deben escribirse de arriba hacia abajo y/o de Izquierda a derecha. 2. Los símbolos se unen con líneas, las cuales tienen en la punta una flecha que indica su dirección que fluye la información procesos, se deben utilizar solamente líneas de flujo horizontal o vertical (nunca diagonales). 3. Se debe evitar el cruce de líneas, para lo cual se quisiera separar el flujo del diagrama a un sitio distinto, se pudiera realizar utilizando los conectores, se debe tener en cuenta que solo se van a utilizar conectores cuando sean estrictamente necesario. 4. No deben quedar líneas de flujo sin conectar.
5. Todo texto escrito dentro de un símbolo debe ser legible, preciso, evitando el uso de muchas palabras. 6. Todos los símbolos pueden tener mas de una línea de entrada, a excepto del símbolo final. 7. Solo los símbolos de decisión pueden y deben tener mas de una línea de flujo de salida. Ejemplo de Diagrama de Flujo: Diagrama de flujo que encuentra la suma de los primeros 50 números naturales.
El quinto bloque es un símbolo de suma de decisiones y ramificaciones lo q hay dentro del bloque es una pregunta que se le hace a las valores que actualmente incluyen en el proceso.
¿Es N=50?, obviamente la respuesta es No, ya que N todavía es 1.Por lo que el flujo de nuestro programa se dirigirá hacia la parte en donde se observa la palabra No. Tercer bloque, este le sumara1 (N=N+1) y vuelve a llegar a este bloque, donde preguntará ¿es N=50? No todavía es 2 ha pues regresa al tercer bloque y vuelve hacer lo mismo así la suma los primeros 50 números naturales.
Por ultimo indicaciones que le resultado será mostrado en la impresora.
EXPLICACIÓN DEL DIAGRAMA DE FLUJO
El primer bloque indica el inicio del diagrama de flujo.
El segundo bloque, es un símbolo de procesos.
En este bloque se asume que las variables suman y N ha sido declarada previamente y las inicializa en o para comenzar al conteo y la suma de valores.
Tercer bloque, es también un símbolo de procesos.
En este paso se incrementa en 1 la variable N(N=N+1), por lo que en la primera pasada esta valdrá 1, ya que estaba inicializada en 0.
Cuarto bloque, es exactamente lo mismo que el anterior.
Pero en este, ya se agrega el valor de N a la variable que contendrá la suma (en el primer caso contendrá 1, ya que N=1).
VENTAJAS DEL ENFOQUE DE FLUJOS DE DATOS El enfoque de flujo de datos tiene cuatro ventajas principales sobre la explicación narrativa de la forma en que se mueven los datos a trabes del sistema .Las ventajas son. 1. Libertad para realizar en forma muy temprana la implementación de técnicas de sistema. 2. Una mayor comprensión de las interrelaciones de los sistemas y subsistemas. 3. Comunicación del conocimiento del sistema actual a los usuarios por medio de diagramas de flujo de datos. 4. Análisis de un sistema propuesto para determinar si han sido definidas los datos y procesos necesarios.
SÍMBOLOS USADOS EN EL DIAGRAMA DE FLUJO DE DATOS
SIGNIFICADO DE LOS SÍMBOLOS DE FLUJO El cuadrado doble es representado y usado para una actividad externa (otro departamento, un negocio, una persona, o una maquina) que puedan enviar datos y recibirlas del sistema. La entidad externa es llamada una fuente de destino de datos y es considerada externa al estudio, cada entidad externa es etiquetada con un nombre adecuado. La flecha muestra el movimiento de datos de un punto a otro , esta señalada hacia suceden simultáneamente pueden ser representadas simplemente mediante el uso de flechas paralelas, debido a que una flecha representada datos acerca de una persona lugar o casa, también :Debe ser descrita con un nombre. Un rectángulo con esquinas redondeadas es usado para mostrar la aparición de un proceso de transformación. Los procesos siempre denotan un cambio o transformación de los datos.
USO DE DIAGRAMAS DE FLUJO DE DATOS Los diagramas de flujo de datos son útiles a lo largo del proceso de análisis y diseños. Existen compromisos para decidir que tanto deben ser explotados de los flujos de datos. Se desperdiciara tiempo y se sacrificara complusibilidad si los diagramas de flujo de datos son exclusivamente complejos. Por otro lado, si los diagramas de flujo de datos están muy poco explotados, pueden ocurrir errores u omisiones que pueden eventualmente afectar el sistema que esta en desarrollo. Por ultimo, recuerde que los diagramas del sistema de flujo pueden ser usados para documentar niveles altos o bajos del análisis y para ayudar a sustentar la lógica subyacente en los flujos de datos de la organización.
CARACTERÍSTICAS DE LOS DIAGRAMAS DE FLUJO DE DATOS
Muestran que debe hacer el sistema sin referencias. Son diagramas explícitos y comprensibles. Dan la posibilidad de representan el sistema a diferentes niveles de complejidad, desde lo mas global a lo mas detallado solo requieren de 4 símbolos. Son fácil de mantenimiento, pues los cambios afectan solo algunos de sus elementos y no al todo.
¿CUÁLES SON LAS VENTAJAS DE LOS DIAGRAMAS DE FLUJO DE DATOS?
Fácil lectura, con esto se constituye en un instrumento de mucha versatilidad. Facilitan la interacción Usuario-Analista.
¿CUÁLES SON LAS LIMITACIONES DE LOS DIAGRAMAS DE FLUJO DE DATOS?
No permite recoger el comportamiento de sistema que deben responder a eventos en tiempos acotados. Para ello se usa el diagrama de transición de Estados.
No permite dar cuenta de la de las relaciones entre los datos que se precisan almacenar .Para ello se usan el diagrama Entidad-Relación.
No permite reflejar situaciones en las cuales es preciso dejar de manifiesto la necesaria concurrencia de dos o más flujo de datos para un subproceso pueda iniciar efectivamente su tarea. Para ello se utiliza la especificación de procesos.
No permite recoger el contenido de los flujos de datos ni el contenido de los archivos .Para ello se utiliza el diccionario de datos.
CONCLUSIÓN Muchas personas consideran a un algoritmo y a un diagrama de flujo de datos como herramienta de gran importancia para la programación decomputadora y están en lo cierto para la resolución de problemas mediante algoritmos y diagramas de flujo se ha convertido hoy en día en un instrumento efectivo para el desarrollo de habilidades y destrezas lógicas de y creativas del pensamiento humano. Hoy diferentes formas de resolver un problema, esto es debido a la forma de razonar del ser humano, al igual que cada algoritmo, o diagrama de flujo de datos elaborado. El término lógica define la exposición de leyes, modos y formas aplicadas al razonamiento. El ser humano aplica la lógica para la resolución de problemas de diferentes tipos. Algunos instructores del área de computación no hace mucho hincapié sobre el desarrollo de algoritmo y diagramas de flujo de datos.
SIMBOLOGÍA DE LOS DIAGRAMAS DE FLUJO Las diversas organizaciones usan distintos símbolos, pero el comité sobre computadoras y procesadores de información de la Asociación Norteamericana de Normas ha hecho un gran esfuerzo para normalizar los símbolos de los diagramas de flujo. Esa normalización permite comprender cualquier diagrama de flujo que use los símbolos recomendados. Cada símbolo normal de diagrama de flujo tiene un significado especial.
Expresa Inicio o Fin de un Programa.
Expresa operación algebraica o de asignación.
Expresa condiciones y asociaciones alternativas de una decisión lógica.
decisión numérica.
Expresa condición y acciones alternativas de una
Entrada / Salida: Representa cualquier tipo de Fuente de entrada y salida
Entrada: Lectura de datos por tarjeta perforadas.
Conector dentro de página.
Representa resultado mediante un reporte impreso
Conector fuera de página.
Expresa operación cíclica repetitiva.
Expresa proceso de llamada a una subalterna. Representa datos grabados en una cinta magnética. Almacenamiento en línea Disco Magnético.
REGLAS PARA ESTRUCTURAR UN DIAGRAMA DE FLUJO
El sentido de un diagrama de flujo generalmente es de arriba hacia abajo. Es un símbolo solo puede entrar una flecha de flujo si varias líneas se dirigen al mismo símbolo, se deben unir en una sola flecha.
Las líneas de flujo no deben cruzarse, para evitar los cruces se utilizan los conectores.
De un símbolo excepto el de decisión, solo puede salir una línea de flujo.
Los símbolos Terminal, Conector dentro de página y conector fuera de página solo pueden estar conectados al diagrama por una sola flecha, ya que por su naturaleza es imposible que tenga una entrada y una de salida.
Los émbolos de decisión tendrán siempre una sola flecha de entrada y dos o tres flechas de salida según la cantidad de alternativas que se presentan.
Un diagrama de flujo debe estar complemente cerrado, teniendo una continuidad de principio a fin, no pueden quedar flechas en el aire ni símbolos sin conexión al diagrama pues el flujo seria interrumpido.
CONSIDERACIONES SOBRE DIAGRAMA DE FLUJO Un diagrama de flujo, puede tener tipos de errores diferentes:
DE FORMA: Se genera por no seguir las reglas establecidas, puede hacer el diagrama difícil interpretación, confundir el diagrama y hasta convertirlo en errado en cuanto ser lógica.
DE LÓGICA: Son errores de estructura del diagrama en cuanto al arden puede ser de distinta gravedad, desde dejar de mostrar el resultado. O falta uncálculo hasta un error que determine que un programa nunca llegue a su fin.
DE OBJETIVO: Es cuando un diagrama de flujo esta correcto en cuanto a su estructura y forma pero no soluciona el problema propuesto sino otro. Una vez terminado e diagrama de flujo, es necesario asegurarse de que funcione correctamente cumpliendo el objetivo fundamental, las condiciones especificas y las excepciones del problema propuesto a esto se le llama generalmente "corrida en frió" prueba de escritorio. Para ellos e selecciona algunos datos (creadas por el programador para fines de la prueba) que cubran todos los casos posibles en todas las condiciones. Tomando estos datos se recorre el diagrama de flujo símbolo a símbolo siguiendo la orden de cada uno de ellos, todo esto se hará a un lado del diagrama o en una hoja aparte dándole valores a variables y ejecutando operación que se indique .
SOLUCIONANDO PROBLEMAS CON DIAGRAMAS DE FLUJO DE DATOS. 1. Calcular el sueldo mensual de un operario conociendo la cantidad de horas trabajadas y el pago por hora. Podemos identificar: Datos conocidos: Horas trabajadas en el mes. Pago por hora. Proceso: Cálculo del sueldo multiplicando la cantidad de horas por el pago por hora. Información resultante: Sueldo mensual. Si hacemos un análisis todo problema está constituido por: - Datos conocidos: Datos con los que se cuenta al plantear el problema. - Proceso: Operaciones a realizar con los datos conocidos. - Información resultante: Es la información que resuelve el problema.
2. Calcular el número de pulsaciones que una persona debe tener por cada 10seg de ejercicios si la fórmula es: ‘’num_puls =(220 – edad) / 10’’
INICIO
X, N, P es real
Leer: edad: x
NP = (220 – x) / 10
Mostrar NP
FIN
3. Calcular el nuevo salario de un obrero si obtuvo un incremento de 25% sobre su salario anterior.
INICIO
SA, T, SN es real
Leer: SA
A = (0,25 * SA) SN = SA + T
Mostrar: SN
FIN
4. Todos los lunes, miĂŠrcoles y viernes una persona corre la misma distancia y cronometra los tiempos obtenidos. Determinar el tiempo promedio que la persona tarda en recorrer la ruta en una semana.
INCIO
Lun, Mier, Vie, TP es real
Leer: Lun, Mier, Vie
TP = (lun + Mier + Vie) / 3
Mostrar: TP
FIN
INTEGRANDO LOS APRENDIZAJES. InicioPi ¬ 3.1416 (definición de un valor constante) R ¬ 5 (radio constante ya que es conocido su valor) A ¬ pi * R ^ ² (asignación del valor del área) L ¬ 2 * pi * R (asignación del valor de la longitud) Escribir (A, L) (salida del algoritmo)Fin
Leer el sueldo de tres empleados y aplicarles un aumento del 10, 12 y 15%respectivamente. Desplegar el resultado. Salidas: Sueldos finales Entradas: Salarios de los empleados Datos adicionales: aumentos del 10, 12 y 15%C谩lculos: Sueldo final = sueldo inicial + aumento Aumento = sueldo inicial * porcentaje/100 Definici贸n de variables: Sf1, Sf2, Sf3 = los sueldos finales S1, S2, S3 = salarios de los empleados Aum1, aum2, aum3 = aumentos
CREANDO DIAGRAMA DE FLUJO DE DATOS CON EL SOFWARE FREE DFD. DFD es un programa intĂŠrprete de diagramas de flujo. Sirve para editar, ejecutar y deputar algoritmos representados en Diagramas de Flujo. Con este software diseĂąado especialmente para construir y analizar algoritmos. Usted puede crear diagrama de flujo de datos de manera
sencilla y precisa.
SÍMBOLOS:
Cursor
Ciclo Mientras
Decisión
Llamada
Salida
Asignación
Ciclo Para
Lectura o Entrada
El primer botón, se denomina Cursor, cuando este botón se encuentra activado, se pueden hacer selecciones en el área de edición del programa.
El segundo botón, se denomina Asignación, y sirve para hacer definición de variables en el programa de manera estática.
El tercer botón, se denomina Ciclo Mientras, sirve para crear una estructura repetitiva dentro del programa y ejecutar una serie de instrucciones muchas veces seguidas, mientras se considere una condición como verdadera.
El cuarto botón, se denomina Ciclo Para, sirve para crear del mismo modo que el ciclo mientras una estructura repetitiva dentro del programa, para que se repitan una serie de instrucciones, solo que la condición es diferente. El quinto botón, se denomina Decisión, sirve para tomar decisiones simples dentro del programa, se ingresa dentro de la “decisión”, una condición y dependiendo de si esa condición es falsa o verdadera, el programa ejecutara una serie de instrucciones diferentes en cada caso.
El sexto botón, se denomina Lectura o Entrada, sirve para realizar definiciones de variables de manera dinámica, en el momento en que el programa está en ejecución.
El séptimo botón, se denomina Salida, sirve para mostrar salidas por pantalla de los diferentes procesos que se realizan con el programa, es el único medio que tenemos para obtener resultados.
El octavo botón, se denomina Llamada, sirve para hacer llamadas a otros subprogramas.
Ejemplos: Hallar el cuadrado de un número, ingresado por teclado X = (núm) ^2
INICIO
Num X es entero
Leer num
X num ^ 2
Mostrar X
FIN
Diseñar en DFD que te permita calcular la raíz cuadrada de un número y el resultado mostrado por impresión.
INICIO
Num Y es real
Leer num
Y = sqrt (num)
Y imprimir
FIN
ESTRUCTURAS CONDICIONALES. Las estructuras condicionales comparan una variable contra otro(s)valor (es), para que en base al resultado de esta comparación, se siga un curso de acción dentro del programa. Cabe mencionar que la comparación se puede hacer contra otra variable o contra una constante, según se necesite. Existen tres tipos básicos, las simples, las dobles y las múltiples.
Simples: Las estructuras condicionales simples se les conoce como Tomas de decisión. Estas tomas de decisión tienen la siguiente forma:
Dobles: Las estructuras condicionales dobles permiten elegir entre dos opciones o alternativas posibles en funci贸n del cumplimiento o no de una determinada condici贸n. Se representa de la siguiente forma:
Múltiples: Las estructuras de comparación múltiples, son tomas de decisión especializadas que permiten comparar una variable contra distintos posibles resultados, ejecutando para cada caso una serie de instrucciones especificas. La forma común es la siguiente:
INTEGRANDO NUESTRO APRENDIZAJE. Ejercicio 1:- En un estacionamiento cobran $/. 1.500 por hora o fracción. Diseñe un algoritmo que determine cuanto debe pagar un cliente por el estacionamiento de su vehículo, conociendo el tiempo de estacionamiento en horas y minutos. Algoritmo 1
// Salida de resultados IMPRIMIR pago FIN
NICIO // Declaración de variables ENTERO horas, minutos REAL pago // Entrada de datos LEER horas, minutos // Si hay alguna fracción de hora, incrementa las horas a pagar en una unidad SI( minutos > 0 ) horas = horas + 1 // Determina el importe a pagar pago = horas * 1.500
Ejercicio 2:- Diseñe un algoritmo que determine si ún número es o no es, par positivo. Algoritmo
INICIO // Declaración de variables REAL numero CADENA tipoNumero // Entrada de datos LEER numero // Determina si el número es o no es, par positivo SI( (numero%2==0) && (numero>0) ) tipoNumero = "El número es par positivo" SINO tipoNumero = "El número no es par positivo" // Salida de resultados IMPRIMIR tipoNumero FIN
Ejercicio 3:- Un supermercado ha puesto en oferta la venta al por mayor de cierto producto, ofreciendo un descuento del 15% por la compra de más de 3 docenas y 10% en caso contrario. Además por la compra de más de 3 docenas se obsequia una unidad del producto por cada docena en exceso sobre 3. Diseñe un algoritmo que determine el monto de la compra, el monto del descuento, el monto a pagar y el número de unidades de obsequio por la compra de cierta cantidad de docenas del producto. Algoritmo
INICIO // Declaraci贸n de variables REAL montopag, montocom, montodes, precio ENTERO docenas, obsequio // Entrada de datos LEER docenas, precio // Determina el monto de la compra montocom = docenas*precio // Determina el monto del descuento y el obsequio SI( docenas > 3 ){ montodes = 0.15*montocom obsequio = docenas-3 } SINO{ montodes = 0.10*montocom obsequio = 0 } // Determina el monto a pagar montopag = montocom - montodes // Salida de resultados IMPRIMIR montocom, montodes, montopag, obsequio FIN
BIBLIOGRAFÍA.
http://www.rodolfoquispe.org/blog/que-es-un-algoritmo.php http://es.wikipedia.org/wiki/Algoritmo http://es.scribd.com/doc/3876686/ejemplos-de-algoritmos http://espanol.answers.yahoo.com/question/index?qid=20100524124908AABeHPQ http://es.answers.yahoo.com/question/index?qid=20081121192854AA70VC6 http://www.devjoker.com/contenidos/catss/147/Constantes.aspx http://php.net/manual/es/language.constants.php http://www.carlospes.com/ejercicios_de_algoritmos/tipos_de_datos.php http://www.monografias.com/trabajos60/diagrama-flujo-datos/diagrama-flujo-datos2.shtml http://artemisa.unicauca.edu.co/~nediaz/LabII/practica06.htm