seminario de sistemas

Upload: martin-viruel-dzib

Post on 13-Apr-2018

218 views

Category:

Documents


0 download

TRANSCRIPT

  • 7/26/2019 Seminario de Sistemas

    1/165

    Jorge Vasconcelos Santilln

    MANUAL DE

    CONSTRUCCIONDE PROGRAMAS

    Mxico, 2000

  • 7/26/2019 Seminario de Sistemas

    2/165

  • 7/26/2019 Seminario de Sistemas

    3/165

    1998, Derechos Reservados conforme a la LeyConstruccin de ProgramasJorge Vasconcelos SantillnMxico, D.F.

  • 7/26/2019 Seminario de Sistemas

    4/165

    V

    Presentacin

    Esta obra pretende ser un enlace entre los textos de introduccin a la programacin

    y los de ingeniera de software.

    Fue elaborada de modo sencillo, con abundantes ejemplos y sugerencias,para que resultara atractiva a los programadores prcticos (que tienden a detestarlos libros tericos y pesados), y los motive a mejorar la calidad de sus programas.

    De igual modo puede ser til para aclarar algunos conceptos sobreAnlisis y Diseo de Sistemas e Ingeniera de Software, que suelen resultarconfusos al estudiarse por primera vez.

    La obra reune ideas de muchos textos, profesores y programadoresexpertos, as como experiencias del propio autor. No obstante, para que puedacompletarse, el lector deber agregarle sus propios conocimientos.

    Es importante advertir que la obra slo comprende tcnicas para laconstruccin de programas procedimentales; aunque actualmente hay otras tcnicascon mucho xito, como la programacin y diseo orientado a objetos, laprogramacin visual o las tcnicas de inteligencia artificial.

    Una recomendacin final: para que este libro le resulte ms til convieneque ya haya pasado muchas horas programando y conocer bien algn lenguaje,aunque no lo domine.

    El Autor

  • 7/26/2019 Seminario de Sistemas

    5/165

    VII

    Prefacio

    "La buena programacin no se aprende de generalidades, sino viendo cmo los

    programas significativos pueden hacerse claros, fciles de leer, fciles de

    mantener y modificar, pensados para los humanos, eficientes y confiables;

    aplicando el sentido comn y buenas prcticas de programacin. El estudio

    cuidadoso y la imitacin de buenos programas dirige hacia una mejor escritura."

    SOFTWARE TOOLS IN PASCALKernigham y Plauger

    La aparicin de las computadoras personales acarre innumerables ventajas, y unade las ms notables fue permitir que cualquier persona pudiese convertirse conrelativa facilidad en un programador.

    Sin embargo, al evitarse la escrupulosidad que se requera para llegar a serun programador de computadoras, se incurrieron en vicios nuevos.Desafortunadamente se ha producido una gran cantidad de software basura:programas de poca calidad, hechos al vapor; y que se entregan al consumidor -aprecios bajos e inclusive altos-, pero sin soporte futuro. Por el contrario el softwarede calidad requiere no slo de muchas lneas de cdigo, sino tambin de muchas

    horas de trabajo para revisar cuidadosamente el proyecto, desde los borradoreshasta el producto final.

    Debido a las labores que envuelve el desarollo de un buen proyecto, losespecialistas en cmputo se percataron de la necesidad de mtodos que facilitasenla construccin de programas (an mucho antes del advenimiento de lasmicrocomputadoras). Tales mtodos deberan cumplir tres funciones:

    1. Ayudar en la deteccin y correccin de errores,2. Asegurar la correccin, tanto de algoritmos como de programas, y

    3. Ayudar a desarrollar programas fciles de comprender y modificar.

    Esta obra, Manual de Construccin de Programas, presenta algunas deestas tcnicas, y las pone a disposicin del programador que se ha formado duranteesta generacin de computadoras.

  • 7/26/2019 Seminario de Sistemas

    6/165

    VIII

    La filosofa seguida est plasmada en la frase inicial de Kernigham yPlauger, pues se ejemplifica con muchos programas para que el lector aprecieaciertos y errores, y aprenda de la imitacin. Los elementos tericos son losmnimos para evitar caer en generalidades que resultan tan ilegibles comoinaplicables. No est saturada de ejemplos que resulten difciles de entender o que

    deban imitarse, sino por el contrario, slo se presentan elementos bsicos (ideas,programas o sugerencias), para que el programador reflexione y le surjan valiosasideas.

    Aun cuando resulte doloroso para muchos programadores jvenes(generalmente formados durante el bachillerato), la prctica de la programacin noes suficiente; se requiere de una pequea dosis de teora slida; pero no en formaaislada, sino complementada con la prctica; de este modo las experienciasprcticas permitirn la asimilacin o rectificacin de los conceptos, al tiempo que lateora ayudar a tomar decisiones y mejorar el desempeo prctico.

    Este libro es bsicamente un manual de consulta. Consta de siete seccionesque pueden ser estudiadas independientemente. A lo largo del libro hay mltiplesejemplos, que conviene analzar con cuidado.

    El Captulo 1 menciona algunos conceptos de los debe estar consciente unprogramador que se interese por desempear un buen trabajo.

    El Captulo 2 es una introduccin al Anlisis y Diseo de Sistemas. Fue

    escrita para que los programadores especializados tengan nociones de lasactividades que engloban al desarrollo de los sistemas de cmputo. Como no tieneel rigor de los textos especializados en la materia, puede ser utilizado como apoyoen los primeros cursos de programacin avanzada a nivel bachillerato e inclusolicenciatura.

    El Captulo 3 es un recordatorio sobre el importantsimo tema de losalgoritmos, su necesidad y sus ventajas. Recuerda tambin los diagramas de flujo yprofundiza en los conceptos sobre programacin estructurada y programacinmodular, que suelen utilizarse sin conocerse.

    El Captulo 4 presenta el paso posterior al algoritmo, la creacin deprogramas. Se basa en el artculo de Kernigham "Estilos de Programacin",publicado en la revista Computing Surveys en 1974, cuya validez actual esindudable; adems se presentan varias sugerencias para mejorar el desarrollo deprogramas, as como algunos criterios para medir su calidad.

  • 7/26/2019 Seminario de Sistemas

    7/165

    IX

    El Captulo 5 est dedicado al ms tedioso trabajo que involucra laconstruccin de programas: la documentacin. Describe los tres principales nivelesde documentacin: interna, tcnica y para el usuario. Para facilitar esta fase, seproveen numerosas sugerencias y formatos bsicos tiles para los programadoresque documentan por primera vez.

    El Captulo 6 muestra ideas para depurar los programas, tcnicas, describealgunos de los errores comunes, e incluso contiene un pequeo catlogo deprogramas con errores poco evidentes.

    Finalmente, el captulo 7 hace una breve introduccin al tema deoptimizacin de programas.

    Reconocimientos

    Esta obra es producto de aos de experiencia, de ideas de muchos especialistas y deabundante material bibliogrfico; y este espacio est dedicado precisamente apresentar un reconocimiento a ellos. De antemano ofrezco disculpas por lasomisiones en que haya incurrido.

    Las siguientes personas influyeron decisivamente en el contenido global dela obra:

    Eduardo Gonzlezy Salvador Castro, del Banco de Mxico, ambos profesores

    de la Fundacin Arturo Rosenblueth especialistas en Anlisis y Diseo de Sistemas.Las sugerencias para construir Diagramas de Flujos de Datos se basan en losapuntes de clase de Eduardo Gonzlez.

    Peter Juliff, cuyas ideas fueron la base para construir los cuadros sobre las diversasformas de los mdulos, los diagramas de estructura y de Nassi-Schneiderman.

    Luis Daniel Soto Maldonado, que, como profesor de la Fundacin ArturoRosenblueth, aport muchos conceptos para el mejoramiento de los programas y enespecial sobre la Notacin Hngara.

    Brian Kernighamya Plauger, cuyo artculo "Programming Style Examples andCounterexamples" es la base del capitulo 4; espero que perdonen la adaptacinque se hizo.

    Nora Vasconcelosque elabor el dibujo del sistema biolgico del captulo 2.

  • 7/26/2019 Seminario de Sistemas

    8/165

    X

    Leticia Mijangos,que elabor varios documentos cuya estuctura y estilo sirvieronde base para elaborar las plantillas para los Manuales Tcnico y del Usuario.

    Los siguientes temas se inspiraron en otras obras:

    El tema de acoplamiento y cohesin se basa principalmente en el libro de Fairley,Ingeniera de Software de Mc Graw Hill.

    El cuadro Seis formas de decir: "Hola Mundo" se basa en un documento obtenido atravs de Internet.

    Los criterios para mejorar la calidad de un programa y las malas prcticas deprogramacin se basan en una seccin del libro de Paul M. Embree y Bruce Kimble,C Language Algorithms for Di gital Signal Processing. Prentice Hall, USA,1991.

    La apologa sobre el goto fue inspirada por Herbert Schildt.

    Los siguientes documentos aportaron ideas fundamentales para laelaboracin de toda la obra:

    Artculo de Prado Angeles, Ernesto. Tips para Anlisis y Diseo de Programas.Pc / Tips Byte. Mxico, Marzo 1992.

    Apuntes del profesor Eduardo Gonzlez sobre Anlisis y Diseo de Sistemas.

    Enciclopedia Prctica de Informtica Algar. Barcelona, Espaa, 1986.

    Libro de texto de Bores, Rosario y Rosales, Romn. Computacin, M etodologa,Lgica Computacional y Programacin. Mc Graw Hill, Mxico, 1993.

    Libros de Luis Joyanessobre programacin, publicados por Mc Graw Hill.

    Kruse, Robert L. Estructur a de Datos y Diseo de Programas. Prentice Hall,Mxico, 1988.

    Yourdon, Edward. Anli sis Estructurado Moderno. Prentice hall. Mxico, 1993.Y finalmente, un especial reconocimiento al excelente libro de Peter Juliff,Program Design, 3rd Ed. Prentice Hall, Australia 1990; lamentablemente agotado.

  • 7/26/2019 Seminario de Sistemas

    9/165

    XI

    Contenido

    1. Lo que todo programador debe saber

    1.1 Qu es un programador? 21.2 El trabajo del programador 21.3 Ventajas de una planeacin 41.4 Cmo planear las actividades 6

    2. Anlisis y diseo de sistemas2.1 Conceptos sobre sistemas 122.2 Desarrollo de sistemas 132.3 Las Fases del desarrollo de sistemas 152.4 Metodologas estructuradas: el anlisis 19

    3. Diseo de algoritmos3.1 Etapas del desarrollo de programas 303.2 Diferencia entre algoritmo y programa 343.3 Bases para el diseo de algoritmos 373.4 Diagramas de flujo 413.5 Programacin estructurada 423.6 Programacin modular 453.7 Diagramas de estructura 56

    4. Construccin de programas4.1 Estilo de programacin: ejemplos y

    contraejemplos 624.2 Criterios para medir la calidad de un

    programa 734.3 Algunas malas prcticas de programacin 794.4 El goto 804.5 Lenguajes de programacin 82

    5. Documentacin de programas5.1 Por qu documentar? 865.2 Cmo nombrar variables 885.3 Documentacin interna 905.4 Documentacin tcnica 985.5 Documentacin para el usuario 104

  • 7/26/2019 Seminario de Sistemas

    10/165

    XII

    6. Depuracin de programas6.1 Es inevitable depurar? 1126.2 Algunas tcnicas para comprobacin de

    rutinas 1136.3 Errores comunes 118

    6.4 Manejo de errores 121

    7. Optimizacin de programas7.1 Sugerencias de optimizacin 1287.2 Uso de memoria dinmica 134

  • 7/26/2019 Seminario de Sistemas

    11/165

    XIII

    ndice de cuadros y figuras

    cuadro 1-1 Las virtudes de un programador 3cuadro 1-2 (a) Claro y obscuro (a) 4

    cuadro 1-2 (b) Claro y obscuro (b) 6cuadro 1-3 Un ejercicio de planeacin 7

    figura 2-1 Un sistema biolgico 12cuadro 2-1 Diferencia entre sistema y programa 13figura 2-2 Modelos de ciclo de vida del software 14figura 2-3 Desarrollo de sistemas o programas 15

    cuadro 2-2 Cmo analizar un proyecto 16cuadro 2-3 Sugerencias para anlisis y diseo 17cuadro 2-4 Quin y cundo del anlisis de sistemas 18figura 2-4 Un diagrama de flujo de datos 20figura 2-5 Figuras empleadas en los diagramas de flujo de datos 20

    cuadro 2-5 Sugerencias para dibujar diagramas de flujos de datos 22cuadro 2-6 Las ventajas del anlisis estructurado para el programador 25cuadro 2-7 Una sencilla aplicacin del anlisis estructurado 25

    figura 3-1 Etapas del desarrollo de programas 30cuadro 3-2 Centrar un letrero 32cuadro 3-3 Un algoritmo de seis pasos para hacer programas 34cuadro 3-4 Algoritmo y programa en Pascal para obtener las races de la

    ecuacin cuadrtica 35

    cuadro 3-5 Suma de matrices 36cuadro 3-6 Algoritmo y programa en Lisp para realizar una bsqueda de"primero en profundidad" 37

    cuadro 3-7 Caractersticas de un algoritmo 37figura 3-2 Figuras usadas en los diagramas de flujo 38

    cuadro 3-8 Un lenguaje mnimio 39cuadro 3-9 Los diagramas de Nassi-Schneiderman 41

    cuadro 3-10 Estructuras de programacin 44cuadro 3-11 Las diversas formas de los mdulos 45

    figura 3-3 (a) Acoplamiento 47figura 3-3 (b) Cohesin 48

    cuadro 3-12 Ejemplos de cdigo con diferentes niveles de acoplamiento ycohesin 49figura 3-4 Figuras para diagramas de estructura 57

    cuadro 4-1 Niveles de construccin de programas 62cuadro 4-2 Seis formas de decir: "HOLA MUNDO" 71cuadro 4-3 Sugerencias para programar 73cuadro 4-4 Hice un buen programa? 78

  • 7/26/2019 Seminario de Sistemas

    12/165

    XIV

    cuadro 4-5 El goto enmascarado 8cuadro 4-6 Lenguajes procedurales 8

    cuadro 5-1 Documentacin 8cuadro 5-2 Notacin hngara 8

    cuadro 5-3 Comentarios generales de un programa 9cuadro 5-4 Ejemplo de un encabezado con historial 9cuadro 5-5 Ejemplos de subrutinas y parmetros comentados 9

    cuadro 5-6 (a) Un programa rido sin comentar 9cuadro 5-6 (b) Un programa rido con comentarios 9

    cuadro 5-7 Descripcin de algoritmos 9cuadro 5-8 Un ejemplo de cdigo comentado 9cuadro 5-9 Elementos generales de un manual tcnico 9

    cuadro 5-10 Plantilla general para un manual tcnico 9cuadro 5-11 Elementos generales de un manual del usuario 1

    cuadro 5-11 Plantilla general para un manual del usuario 1cuadro 5-12 Desarrollando el programa de instalacin 1

    cuadro 6-1 Cuatro ideas valiosas sobre depuracin 1cuadro 6-2 Mtodos de caja negra y caja de cristal para detectar errores 1cuadro 6-3 Verificaciones antes de entregar programas 1cuadro 6-4 Lista de comprobacin de errores 1cuadro 6-5 Sugerencias de programacin con listas ligadas 1cuadro 6-6 Un catlogo de errores inesperados 1

    cuadro 7-1 Un programa optimizable 1

    cuadro 7-2 Otro programa optimizable. 1

  • 7/26/2019 Seminario de Sistemas

    13/165

    Captulo 1

    vvLo que todo p rogramado rdebe saber

    1.1 Qu es un programador? 2

    1.2 El trabajo del programador 2

    1.3 Ventajas de una planeacin 4

    1.4 Cmo planear las actividades 6

  • 7/26/2019 Seminario de Sistemas

    14/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    2

    "Programar es asignar lgica al caos,

    vida a lo inerte e inteligencia a lo ininteligible."

    J. Galicia.

    1.1 Qu es un programador?

    Un programadores un especialista en computacin, que conoce las caractersticasy funcionamiento de la computadora y tiene la capacidad para describir la solucina un problema mediante una secuencia de pasos elementales, y posteriormentepuede transformarlos en acciones que la mquina pueda efectuar.

    Los programadores, junto con los analistas y los diseadores, forman elequipo de especialistas encargados del desarrollo de sistemas tiles para resolverproblemas mediante la computadora.

    El analista estudia el panorama del problema, el diseador propone unaestrategia de solucin y el programador se encarga de convertir esa estrategia enprogramas que la computadora pueda ejecutar.

    Cuando el proyecto es muy pequeo, el programador mismo se conviertetambin en analista, diseador y consumidor.

    De cualquier manera, todo programador debe tener los conocimientossuficientes para comprender la labor que desempean los otros especialistas y en sucaso para realizarla.

    1.2 El trabajo del programador

    Un programador tiene a su cargo varias responsabilidades, de entre las quedestacan:

    1. Construir algoritmos tiles y elegantes, o aplicar prudentemente losalgoritmos y programas existentes que ya resuelvan el problema.

    2. Construir una estructura de datos apropiada al problema.

    3. Tener conocimiento de los procesos que ocurren detrs de las rutinasprovistas por los lenguajes.

    Es muy importante que un programador sea capaz de construiruna aplicacin compleja a partir de instrucciones muy elementales.

  • 7/26/2019 Seminario de Sistemas

    15/165

    LO QUE TODO PROGRAMADOR DEBE SABER

    3

    4. Construir soluciones a la medida y no adaptar los problemas a solucionespreestablecidas.

    5. Usar las herramientas disponibles, pero evitando que una herramienta detengao altere la solucin a un problema.

    6. Investigar aquellos conceptos involucrados en un problema que ignore. Siocupar una programa ya existente, no debe limitarse a capturar losalgoritmos; debe entender un programa antes de poder modificarlo o extraerpartes de l.

    Un compromiso de tica personal debera ser:" No desarrol lar un prog rama sin cono cer la teora que lo fundam enta"

    7. Reconocer cuando es realmente til usar la computadora y cuando se

    convierte en abuso. No debe delegar la responsabilidad personal a lasfacilidades que ofrezca la computadora.

    Cuadro 1-1LAS VIRTUDES DE UN PROGRAMADOR

    ISer capaz de analizar un problema hasta

    comprenderlo completamente.

    II

    Ser capaz de disear unaestrategia que describa los pasos requeridos

    para obtener la solucin del problema.

    IIIConocer el funcionamiento,

    capacidades y limitaciones de las computadoras.

    IVDominar un lenguaje de programacin en particular,

    y adems conocer algn lenguaje adecuadoa la solucin del problema.

    VSer capaz de evitar el perfeccionismoy equilibrar entre lo ideal y lo real.

  • 7/26/2019 Seminario de Sistemas

    16/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    4

    1.3 Ventajas de una planeacin

    Planear significa pensar un poco antes de dedicarse a construir. Es una labor queimplica trabajo de escritorio.

    La planeacines especialmente importante para desarrollar programas. Siel problema es sencillo, la planeacin ser ligera (una simple inspeccin alproblema); si el problema es complejo, la planeacin ser ms estricta (pasar por lasfases de anlisis, diseo, implementacin).

    Si bien es cierto que elaborar un programa directamente sobre lacomputadora es fcil y cmodo, tambin es cierto que suelen resultar conalgoritmos y estructuras de datos demasiado complicadas (excepto si el problemaoriginal es sencillo). Esto se debe a que es una tarea dispersa: hay que pensar elalgoritmo, codificar y mecanografiar al mismo tiempo; esta convergencia de tareasaumenta las posibilidades de error y produce cdigo difcil de depurar. El cuadro 1-2 (a) muestra un programa que se escribi directamente sobre el teclado, sinplanearse.

    Cuadro 1-2 (a)

    Claro y obscuro (a)

    /* Programa para leer un dividendo y un divisor yescribir el residuo de su divisin.

    */#include

    #include #include #include

    int Dividendo, Divisor;int Modulo(int, int);

    void main(){clrscr();printf("Este programa devuelve el residuo de la division de dos nmeros \n");printf("(Los nmeros deben ser enteros y el dividendo mayor que el divisor) \n");printf("Presione [ENTER] para continuar o cualquier otra tecla para salir");

    if (getch() != 13)exit(0);delline(); printf("\n");

    printf("Cul es el valor de el dividendo? ");scanf("%d",&Dividendo);

    printf("Cul es valor del divisor? ");scanf("%d",&Divisor);

    Nunca encienda

    la computadorasi desconoce lo

    que va a hacer.

  • 7/26/2019 Seminario de Sistemas

    17/165

    LO QUE TODO PROGRAMADOR DEBE SABER

    5

    if (Modulo(Dividendo,Divisor) != 0)printf("El residuo de %d entre %d es igual a %d \n", Dividendo, Divisor,

    Modulo(Dividendo,Divisor));else

    printf("La divisin de %d entre %d es exacta, el residuo es igual a 0 \n",Dividendo, Divisor);

    do { } while (kbhit() == 0);clrscr();

    }

    int Modulo(divndo, divsor)int divndo, divsor;{int Factor;Factor = 1;while (divsor divndo)return(divndo - (divsor * Factor));

    Factor ++;}return 0;

    }

    Aun cuando pueda parecer tedioso, aplicar un mtodo de planeacinahorra tiempo durante la codificacin y la depuracion del programa, ya que sesimplifican los algoritmos y las estructuras.

    Si ya tiene muy arraigada la costumbre de programardirectamente sobre el teclado, basta que siga algunas de estas

    tcnicas para que mejore la calidad de su software. Pero noolvide que para problemas difciles deber dedicarle algunos

    minutos al trabajo de escritorio.

    El cuadro 1-2 (b) muestra otro programa, que realiza la misma tarea que elanterior, para el cual se tomaron algunos minutos de reflexin, antes de sentarse aprogramarlo.

  • 7/26/2019 Seminario de Sistemas

    18/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    6

    cuadro 1-2 (b)

    Claro y obscuro (b)

    /*Dados un dividendo y un divisor,

    escribir el residuo de su divisin.*/

    main (){

    int dividendo, divisor;int cociente, residuo;

    printf("\nValor del dividendo: ");scanf("%d",&dividendo);

    printf("\nValor del divisor: ");scanf("%d",&Divisor);

    /* Aplicar una divisin entera */

    cociente = dividendo / divisor;residuo = dividendo - cociente*divisor;

    printf ("El residuo es %d\n",residuo);return (0);

    }

    1.4 Cmo planear las actividades

    Para elaborar un programa lo primero que debe hacerse es definir sus objetivos ydelimitar con precisin sus alcances; y enseguida planear todas las tareas quedebern desarrollarse para construirlo. Esto incluye tanto los elementos tericosque debern investigarse, como las opciones que ofrecer el programa. Si le es til,puede seguir este esquema:

    1. Enlistar todas las actividades y opciones que el programa deber efectuar, sindetallarlas, ni ordenarlas.

    2. Jerarquizar la lista, considerando complejidad y tiempo disponible.

    3. Detallar cada actividad, siguiendo este mismo esquema.

    4. Asignar tiempos.Al desarrollar las actividades trate de cumplir con los tiempos marcados.Si llegara a excederse en el tiempo asignado a un paso, deber reconsiderar eltiempo disponible para el resto de las actividades.

    No importa que su planeacin sea muy sencilla o poco profunda, siempre leser de mucha ayuda.

  • 7/26/2019 Seminario de Sistemas

    19/165

    LO QUE TODO PROGRAMADOR DEBE SABER

    7

    cuadro 1-3

    Un ejercicio de planeacin

    Hay programas que muy fcilmente se pueden desarrollar directamente sobre la computadora,

    pero tambin hay otros que sin un anlisis previo, no salen. Aqu hay un par de ejercicios quemuestran ambos casos.

    I. En el lenguaje de su predileccin elabore un programa para dibujar en la pantalla esta figura :

    (Si tarda ms de quince minutos, entonces todava le falta mucha prctica en la programacin.)

    Si ya logr resolver este problema, pase al siguiente:

    II. Elabore un programa para dibujar una telaraa similar a esta:

    A continuacin se muestra una estrategia para solucionar ambos problemas, pero no vayaa verla hasta no haberlo intentado usted mismo.

  • 7/26/2019 Seminario de Sistemas

    20/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    8

    cuadro 1-3 (solucin)

    Para resolver el primer problema,considerse una recta L, que une los puntosP y Q, como se muestra en el dibujo de la

    izquierda.La figura se forma por el

    desplazamiento de la recta L, de tal modoque los puntos P y Q se muevan sobre losejes. Para lograrlo, el punto inicial Psiempretendr las coordenadas (0,Y), y el puntofinal Qser (X,0).

    Xy Yse movern a intervalos regulares, desde un valor mnimo hasta unvalor mximo. El algoritmo bsico para hacer un cuadrante de la figura es:

    Y = MaxYX = MinX;Para i desde 0 hasta 50 Hacer

    InicioDibujaLnea (0,Y,X,0)y = y - 10;x = x +10Fn

    Para generar la segunda figura efectuamos un anlisis de su forma; posee ocholneas rectas unidas por un mismo vrtice y separadas por un ngulo de 45. Entrecada lnea se encuentran curvas separadas una distancia constante.

    Para facilitar la construccin,consideremos que cada curva es elarco de un crculo, cuyo centro seencuentra en la bisectriz de las rectasque la sostienen (vase la figura de laderecha). Ese centro se desplaza, unalongitud constante, sobre la bisectrizpara generar cada nuevo arco.

    Dado que tenemos ladistancia a la que se halla el centro, y

    slo puede encontrarse en alguna delas rectas cuyos angulos conocemos,el centro se expresar como un vectorcon longitud y ngulo:

    centro = (r,))

  • 7/26/2019 Seminario de Sistemas

    21/165

    LO QUE TODO PROGRAMADOR DEBE SABER

    9

    El conjunto de rectas y sus ngulos semuestran a la derecha.

    Sin embargo, para poder dibujar el arcorequerimos que el centro se exprese en

    coordenadas cartesianas, para ello aplicamos lasfunciones trigonomtricas:

    y r Sen

    x r Cos

    ==

    ==

    ( )

    ( )

    Por lo tanto, para desplazar el centro, el ngulo deber tomar alguno delos valores 22.5, 67.5, 112.5,... y la longitud r deber incrementarse en algunacantidad constante.

    El algoritmo bsico ser:

    dr = 10

    d= 45

    r = 5

    = 22.5

    Para i desde 1 hasta 8 HacerInicio

    y = r*Sen()

    x = r*Cos()dibujar arco con centro en x,y y radio aproximado r/ 2r = r + dr

    =+ dFin

    ahora que tenemos el algoritmo, ya podemos sentarnos a probarlo en lacomputadora. En su estado actual requerir algunos ajustes que slo apreciaremosuna vez que haya aparecido algo en la pantalla; sin embargo, la parte ms dificil yafue salvada: conceptualizar una solucin.

    Evite trabajar en varios proyectos a la vez, pues las ideassuelen mezclarse y confundirse.

  • 7/26/2019 Seminario de Sistemas

    22/165

    Captulo 2

    v Anlis is y d iseo desistemas

    2.1 Conceptos sobre sistemas 122.2 Desarrollo de sistemas 132.3 Las fases del desarrollo de sistemas 15

    2.4 Metodologas estructuradas: el anlisis 19

  • 7/26/2019 Seminario de Sistemas

    23/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    12

    2.1 Conceptos sobre sistemas

    Unsistemaes un grupo de elementos u objetos, y las relaciones que existen entreellos. La figura 2-1 muestra como ejemplo un sistema biolgico (ecosistema).

    Unsistema de informacin1es aqul que tiene como elemento principalla informacin y considera las transformaciones que sufre.

    Un sistema de informacin debe contar con los siguientes elementos:

    1. Informacin (datos).2. Transformadores de informacin.3. Fuentes de informacin.4. Receptores de informacin.5. Almacenes de datos.

    1 El concepto de sistema de informacin no considera cules son los componentes fsicos delsistema (es decir, no hace referencia a computadoras).

    Figura 2-1: Un sistema biolgico

    La Tierra es un complejo sistema donde intervienen muchos actores: el Sol, las plantas, laatmsfera, el suelo y los animales. Las plantas producen el oxigeno que hay en el aire, para ellorequieren de sustancias alimenticias alojadas en el suelo, de agua y de los rayos solares. En la

    atmsfera tambin se encuentran las nubes, producto de la evaporacin del agua (depositada enmares y lagos); al enfriarse las nubes se deshacen como lluvia que aprovecharn todos los seres vivosy llenarn nuevamente los depsitos de agua. Las plantas tambin sirven de alimento a los animalesherbvoros; stos a su vez, son el alimento de los carnvoros; y todos ellos al morir enriquecen elsuelo. Esta es una compleja red de intercambios de la que dependemos todos.

  • 7/26/2019 Seminario de Sistemas

    24/165

    ANLISIS Y DISEO DE SISTEMAS

    13

    Unsistema computacional es un sistema de informacin que se apoya enlas computadoras.

    Las fuentes y los receptores de informacin son los usuarios. Lastransformaciones se efectan mediante programas en la computadora y los

    almacenes suelen ser archivos en discos o cintas (e incluso la memoria RAM).

    Al estudiar sistemas destaca el concepto de modelo. Bsicamente unmodelo es una representacin abstracta de la realidad. Los modelos permitenestudiar los fenmenos, objetos y sistemas, sin considerar detalles superfluos.Cuando se ha completado el estudio y se tienen conclusiones, stas puedenaplicarse a la realidad con cierta confiabilidad.

    Cuadro 2-1Diferencia entre sistema y programa

    La forma ms sencilla de explicar la diferencia entre sistema y programa es recordar un antiguorefrn popular: "una golondrina no hace un verano"; con esto queremos hacer notar que unprograma asilado (por largo que sea) no es un sistema. Desafortunadamente hay una tendenciapopular a llamar "sistema" a todo programa y tambin a considerar que todo sistema involucracomputadoras.

    Un programa es simplemente un grupo de instrucciones que la computadora debe seguirpara transformar datos, mientras que un sistema computacional debe integrar varios componentes,desde varios programas hasta varias computadoras.

    2.2 Desarrollo de sistemas

    Por desarrollo de sistemasse conoce a una disciplina dedicada a la construccin desistemas donde las transformaciones y flujos se efecten de la mejor manera.

    Para desarrollar sistemas no necesariamente se requiere de equipo decmputo (una organizacin es un sistema), pero en esta obra nos concentraremosen los sistemas computacionales.

    Un sistema computacional puede constar desde un pequeo grupo deprogramas para operar en pocas computadoras (como es el caso del sistemaoperativo), hasta los requerimientos para control de vuelos espaciales o transmisinva satlite.

    Cuando se requiere resolver ciertas necesidades y el sistema no existe o elexistente se ha vuelto inadecuado, entonces es necesario construir un sistema decmputo nuevo.

  • 7/26/2019 Seminario de Sistemas

    25/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    14

    Las fases que se siguen para desarrollar sistemas computacionales seconoce como ciclo de vida del softwarey esencialmente consta de cinco etapas:

    1. Especificacin de Requerimientos.2. Anlisis.

    3. Diseo.4. Implementacin y Pruebas.5. Mantenimiento.

    De acuerdo a como se suceden las fases del ciclo de vida del software, han sidopropuestos dos modelos para el desarrollo de sistemas: el modelo cascada y elmodelo espiral(figura 2-2).

  • 7/26/2019 Seminario de Sistemas

    26/165

    ANLISIS Y DISEO DE SISTEMAS

    15

    En el modelo cascada, el resultado de cada fase es alimentado a lasiguiente, terminndose el proceso con el mantenimiento. En esta ltima fase seefectan los cambios necesarios para que el sistema siga funcionando ante nuevasnecesidades. El software termina su vida cuando deja de cumplir con el propsitopara el que fue creado, y ya no es posible seguir actualizndolo.

    El modelo espiral elimina la fase de mantenimiento, por lo que cualquiermodificacin al sistema deber cumplir con todas las fases nuevamente. Esto obligaa que cada fase sea muy bien hecha y est documentada.

    2.3 Las fases del desarrollo de sistemas

    La figura 2-3 muestra el desarrollo de sistemas (o programas) como un proceso decaja negra, entra una serie de requerimientos y a la salida se obtiene el sistema.

    En esta seccin se explicar cada fase.

    Especificacin de Requerimientos

    Este es el primer paso para poder construir el sistema. Consiste en elaborar unalista que indique*:

    1. Qu necesito?2. Cul es el esbozo del problema?3. Qu espero lograr con el sistema?

    4. Con qu recursos cuento actualmente?5. Qu posibilidades tengo de obtener ms recursos?

    No se puede desarrollar un buen sistema sin antes habercomprendido el problema y la teora asociada.

    *Si desea ser muy formal incluya tambin una exposicin de motivos, descripcin de antecedentesy del estado actual, organigrama de la institucin, ventajas esperadas, etctera.

  • 7/26/2019 Seminario de Sistemas

    27/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    16

    La Fase de Anlisis

    La fase de anlisis consiste en hacer un estudio del estado existente de las cosas.Esta etapa es muy importante, pues delimitar con precisin al problema y losalcances de la solucin.

    El anlisis permite construir un modelo del problema, que pueda utilizarsepara elaborar el modelo de la solucin.

    El anlisis permite detectar las caractersticas y problemas en el sistema.

    El resultado del anlisis debe ser una descripcin completa y detallada delfuncionamiento del sistema bajo estudio, ya sea que exista o que slo sea unapropuesta.

    cuadro 2-2

    Cmo analizar un proyecto

    1. Sumergirse en el problema

    2. Hacer una descripcin de lo que est siendo requerido.

    3. Separar las salidas deseadas de los datos que pueden ser tomadoscomo entradas.

    5. Identificar las restricciones al proyecto.

    La Fase de Diseo de Sistemas

    La fase de diseo se encarga de la preparacin de un sistema de informacin,independientemente de cmo se vaya a implementar.

    El resultado del diseo es un modelo lgico, que describe elfuncionamiento y especifica detalladamente cada parte del sistema.

    El Diseo de Programas

    La etapa de diseo de programasrelaciona (o enlaza) el modelo lgico (elaboradoal disear el sistema) con las caractersticas especficas del hardware.

    El anlisis nosdice:"las cosas

    estn as".

    El diseo nosdice: "sta es la

    solucin"

  • 7/26/2019 Seminario de Sistemas

    28/165

    ANLISIS Y DISEO DE SISTEMAS

    17

    Esta fase no suele aparecer en los modelos de desarrollo de software; sinembargo si un sistema de cmputo se desarrolla correctamente, hay un pasointermedio entre el diseo del sistema y su implementacin.

    Esta fase debe presentarse siempre antes de sentarse a programar.

    Durante el diseo de programas no se proponen soluciones alternativas,slo se construye.

    La Implementacin y las Pruebas

    Durante esta fase se construye y corrige el sistema requerido.

    En algunas ocasiones, para construir la solucin se recurre a prototipos,que son programas huecosque slo muestran algunas de las opciones del sistema.El prototipo permite que el usuario defina an ms los requerimientos. Para facilitarmodificaciones al prototipo se debe programar modularmente.

    cuadro 2-3

    Sugerencias para Anlisis y Diseo

    1. Se considera que el desarrollo de un proyecto es tan grande o complejo queno se pueden recordar todos los detalles, por lo que hay que usar algunametodologa.

    2. Documentar cada etapa del proyecto (instalacin, uso, desarrollo y

    mantenimiento).3. Dedicar todo el tiempo necesario para establecer una definicin exacta acorde

    a las necesidades reales.

    4. Elaborar un documento de requisitos, que consiste en una especificacincompleta y consistente (sin contradicciones) de lo que se tiene que hacer,pero sin especificar cmo deber hacerse.

    Introduccin: Necesidad del sistema, contexto, breve descripcin defuncionamiento, estructura del documento y notacin.

    Requerimientos de Hardware, configuracin mnima y ptima.Descripcin simple de servicios al usuario.GlosarioIndice

    5. Enfoque evolutivo basado en construccin de prototipos (para dar algunaidea al usuario, experimentacin). Modelo que incluya slo algunas de lasopciones que se tendrn en el sistema final.

    El diseodeprogramas seencarga deconstruirconceptualmente

    la solucin

    Laimplementacinde programas seencarga deconstruirfsicamentela

    solucin

    Siempre

    cercirese deque entiende elproblema porcompleto.

  • 7/26/2019 Seminario de Sistemas

    29/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    18

    6. Adoptar una metodologa de programacin y ser consistente durante todo eldesarrollo.

    7. Cuando tenga que desarrollar programas para otras personas tenga en cuentalo siguiente:

    Es muy raro que los usuarios estn completamente conscientes de laverdadera naturaleza de sus problemas y suelen esperar que el experto lesdiga cul es el problema y cmo resolverlo.

    Los usuarios no estn interesados en los detalles de funcionamiento, slodesean respuestas del programa.

    8. Para poder determinar la funcin del programa deseado por el usuario:Empezar con una vaga enunciacin de intenciones, que se afine conpersuacin e interrogacin para obtener las especificacin de requerimientos.

    Cmo se utilizar ?

    Qu aspecto tendr ? Cmo se organizar ? Qu deber hacer (procesos y clculos)?

    Al finalizar se deber poder enunciar con claridad las necesidades delusuario. Sealar algunas de las tareas especficas del programa.

    En proyectos personales por lo general el programador es tambindiseador, analista y consumidor. Aun as haga un esfuerzo de explicarse a smismo los problemas, las soluciones y las necesidades con la misma facilidadque si estuviera hablando con otra persona.

    cuadro 2-4

    Quin y cundo del Anlisis de Sistemas.

    1960 - Edsger Dijkstra de la Universidad de Eindhoven alert a los programadores sobre elpeligro de usar indiscriminadamente el "goto".

    1966 - Bhm y Jacopini demostraron que para construir programas slo se requieren tresestructuras de control (teorema de la estructura).

    70's - Se desarrolla la programacin estructurada, como una tcnica que incorpora yformaliza el teorema de la estructura y la consecuente eliminacin del "goto".

    Las aportaciones acadmicas de Niklaus Wirth y David Parnas se convertiran mstarde en la Ingeniera de Software.

    80's - Se desarrollan las metodologas estructuradas. Eduard Yourdon, Tom de Marco,Gerry Weinberg y Michael Jacson trasladaron los conceptos tericos en tcnicasprcticas y heursticas que los programadores pudieran entender y seguir.

  • 7/26/2019 Seminario de Sistemas

    30/165

    ANLISIS Y DISEO DE SISTEMAS

    19

    2.4 Metodologas estructuradas: el anlisis

    Se llaman metodologas estructuradas a un conjunto de tcnicas y convenciones

    que sirven para hacer un modelo del problema que pueda evolucionar suavementehasta obtenerse el modelo de la solucin2.

    Usar metodologas estructuradas ofrece dos beneficios principales:

    1. Permite documentar el sistema al mismo tiempo que se le construye.

    2. Establece un mapa (o plan de accin) que le permitir al programador visualizarclaramente los mdulos integrantes y los parmetros requeridos.

    Dentro de las metodologas estructuradas hay anlisis estructurado, diseoestruturado, revisiones estructuradas y algunas otras. En este libro slo se tratar elprimero.

    El anlisis estructurado es una tcnica que facilita el estudio de un problemapara construir o modificar un sistema.

    Esta metodologa se integra de tres herramientas:

    1. Diagrama de Flujo de Datos(DFD)2. Diccionario de Datos (DD)3. Especificaciones Estructuradas de Proceso(minispec).

    1. Diagramas de Flujo de Datos

    Un diagrama de flujo de datoses una representacin atemporal (no depende deltiempo, es decir, puede usarse en cualquier momento) en forma de red de las partescomponentes de un sistema y de las trayectorias seguidas por los datos. El

    diagrama de flujo de datos es totalmente diferente de los Diagramas de Flujousados para representar algoritmos (figura 2-4).

    2Las metodologas estructuradas se estudian con profundidad en textos de Anlisis y Diseo deSistemas e Ingeniera de Software.

    Seguir unametodologaayudar a ordenary planear eltrabajo.

    "Es mejor usar

    una metodologa

    que no usar nada.

    Salvador Castr

  • 7/26/2019 Seminario de Sistemas

    31/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    20

    Esta herramienta facilita la subdivisin de un sistema en sus componenteslgicos (conceptuales).

    La figura 2-5 muestra los dibujos usados en los diagramas de flujo de

    datos y el cuadro 2-7 ilustra su uso con un ejemplo.

  • 7/26/2019 Seminario de Sistemas

    32/165

    ANLISIS Y DISEO DE SISTEMAS

    21

    FLUJO DE DATOS

    Es una tuberaimaginaria por la cual fluyenpaquetes de informacinde estructuraconocida. Esta tubera permite el desplazamiento de los paquetes en cualquiermomento; es decir, no indica el momento preciso en el que se mover informacin.

    El flujo de datos se dibuja como una flecha que conecta dos procesos. Elsentido de la flecha indica la direccin en que viajan los paquetes de datos. A laflecha se le asigna un nombre (relacionado con el nombre del paquete) que seregistra en el diccionario de datos.

    Los paquetes diferentes deben fluir por tuberas diferentes. Una analogaprctica: el agua fra y el agua caliente fluyen por tuberas diferentes.

    Si al momento de nombrar un flujo de datos observa que representardenes (describe un dato que no es procesado sino interpretado), debe eliminarseese flujo.

    Notacin para nombrar flujos de datos (ver cuadro 2-7):

    1. Nombrar al flujo con el nombre que represente al dato o a lo que se sabe deellos.

    2. Usar maysculas o guiones para separar las palabras. Suprimir artculos,conjunciones y preposiciones.

    3. Dos flujos distintos no deben tener el mismo nombre.4. Los flujos que se mueven entre depsitos no requieren etiquetarse.

    PROCESO

    Es un elemento del sistema que se encarga de transformar datos. Los flujos dedatos llegan y salen del proceso.

    Se dibuja como un crculo, llamado burbuja, con un nombre y un nmeroen su interior.

    Una burbuja indica que se debe efectuar un trabajo, pero no debemencionar cmo hacerlo.

    Es muy importante considerar que los procesos no destruyen ni creandatos, slo los transforman.

    Notacin para nombrar procesos (ver cuadro 2-7):

    1. El nombre lo tomar segn los flujos de E/S. Si no lo puede tomar significa quees un proceso complejo que deber descomponerse.

    2. Generalmente deber ser una oracin imperativa de verbo activo.

  • 7/26/2019 Seminario de Sistemas

    33/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    22

    DEPOSITOS DE DATOS

    Es un elemento que almacena datos para su uso posterior.

    Se dibuja como dos lneas paralelas con el nombre de los datos queguarda, y se registra en el diccionario de datos.

    Fsicamente un depsito de datos puede ser un archivo, una arreglo, unavariable, un archivero, una hoja de papel, etctera.

    Los depsitos actan como buffercuando se requiere de interfaces en lossistemas (las interfaces son elementos que conectan dos partes de diferentenaturaleza, por ejemplo dos computadoras diferentes o la computadora y elusuario).

    FUENTES O DESTINOS

    Son elementos externos que envan informacin al sistema o requieren de losresultados. Pueden ser personas u otros sistemas.

    Tanto las fuentes como los destinos se dibujan con un rectngulo en cuyointerior est el nombre del elemento externo.

    Se requiere de una fuente/destino cuando no importa saber cmo seprodujeron los datos o qu uso se les dar.

    cuadro 2-5

    Sugerencias para dibujar Diagramas de Flujos de Datos

    1. Concentrarse primero en visualizar los flujos de datos: cules son, de dnde vienen y a dndevan.

    2. Etiquetar y anexar en el diccionario de datos todos los flujos de datos.

    3. Tratar de visualizar cmo se enlazan o separan los flujos de datos para obtener las salidas.

    4. Poner burbujas en blanco donde se requiera transformar datos. La convergencia o divergenciade flujos indica la existencia de un proceso (transformacin). Para etiquetarlas, tomar como

    base los nombres de los flujos que entran y salen. Las burbujas no deben crear ni destruirdatos.

    5. Considerar la situacin normal del sistema, ignorando la inicializacin y terminacin.

    6. Omitir el manejo de errores.

    7. No mostrar flujos de control.

    8. No considerar restricciones de hardware ni de recursos.

    10. Estar preparado para comenzar de nuevo.

  • 7/26/2019 Seminario de Sistemas

    34/165

    ANLISIS Y DISEO DE SISTEMAS

    23

    CONSTRUCCION DE DIAGRAMAS DE FLUJOS DE DATOS

    1. Dibujar un diagrama decontexto del sistema: representarcon un crculo a todo el sistema eindicar las entradas al sistema conflechas que se dirigen hacia laburbuja, y las salidas con flechasque salen de la burbuja. Tanto lasentradas como las salidas debenregistrarse en el diccionario dedatos.

    Si se ignoran datos en el

    diagrama de contexto, debernignorarse en lo sucesivo.

    El diagrama de contexto deber descomponerse en diagramas de nivelesinferiores, cada vez ms detallados.

    2. Segn las caractersticas propias del sistema, hacer undiagrama de conectividad o pasar directamente al

    diagrama de nivel 0.

    Un diagrama de conectividad consiste en trazar,sobre el diagrama de contexto, las lneas que unen losflujos de entrada para formar los flujos de salida.Terminado este diagrama se dibujan burbujas en todos lospuntos donde los flujos convergen o divergen,obtenindose el diagrama de nivel cero.

    El diagrama de nivel cerorepresenta las principales actividades delsistema que se est estudiando, e indicala complejidad del mismo.

  • 7/26/2019 Seminario de Sistemas

    35/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    24

    3. As como se subdividi el diagrama decontexto, se sigue subdividiendo cada una de

    las burbujas en los diagramas de flujo dedatos, utilizando como referencia el nmerode burbuja del cual provienen (burbujapadre).

    Los flujos que entran o salen de laburbuja padre, deben entrar y salir deldiagrama hijo.

    La descomposicin debe continuar

    hasta que todas las burbujas sean primitivas funcionales, es decir, procesos quecumplen alguna de las siguientes condiciones:

    a) Tienen una sola entrada y una salida.b) No existen flujos de datos internos por lo que no se puede fragmentar.c) Se puede escribir fcilmente la especificacin de proceso.

    Es muy importante que cada diagrama de flujo de datos contenga entre 7 y 9 burbujas(excepto el diagrama de nivel cero). Un nmero mayor de burbujas indica la necesidad

    de descomponer mejor el diagrama.

    2. Diccionario de datos

    Un diccionario de datos es un compendio que describe los datos mostrados en losdiagramas de flujo de datos. Debe enlistar alfabticamente todos los datos delsistema.

    Los datos anotados deben cumplir lo siguiente:

    a) Describir el significado de los flujos y depsitos mostrados en los diagramasde flujo de datos.

    b) Indicar los rangos y unidades de los datos elementales.

    c) Indicar cmo se conforman los datos compuestos.

    En un diccionario de datos se utilizan los siguientes smbolos:

    = descripcin del dato+ enlace entre datos() dato opcional{} repeticin de datos[] datos alternativos| separador de opciones

  • 7/26/2019 Seminario de Sistemas

    36/165

    ANLISIS Y DISEO DE SISTEMAS

    25

    ** comentario@ dato llave

    3. Especificaciones de Proceso

    Una especificacin estructurada de proceso o miniespecificacin es un texto quedescribe lo que sucede en el interior de un proceso, indicando qu debe hacersepara transformar las entradas en salidas.

    Dicho en otras palabras es un algoritmo y por lo tanto puede describirsemediante pseudocdigo (lenguaje estructurado) o diagramas de flujo.

    cuadro 2-6

    Las ventajas del anlisis estructurado para el programador

    Aun cuando el anlisis estructurado es una herramienta dirigida propiamente alanalista, el programador puede beneficiarse directamente con ella.

    I. Las burbujas del diagrama de flujo de datos permiten reconocer los mdulosque integrarn al programa, y los flujos de datos muestran los parmetros quedebern pasarse.

    II. El diccionario de datos permite determinar fcilmente los tipos de datos quedebern definirse en el programa.

    III. Las miniespecificaciones sern las base del algoritmo que se programar en

    cada mdulo.

    cuadro 2-7

    Una sencilla aplicacin del anlisis estructurado

    En este ejemplo consideramos la operacin bsica de un videoclub:1. dar de alta nuevos clientes,2. rentar pelculas y3. recibir la devolucin de los videocassettes.

    Los procedimientos son: (a) a los nuevos clientes se les asigna una credencial con su

    nombre y matrcula; (b) para rentar pelculas basta con mostrar la credencial, pasar la pelculadeseada por una lectora de cdigo de barras y efectuar el pago correspondiente; y (c) para ladevolucin basta entregar la pelcula (que vuelve a pasar por la lectora).

    Para mostrar cmo se aplican las herramientas del anlisis estructurado, primero veremoslos diagramas de flujos de datos, luego las especificaciones de proceso y finalmente el diccionariode datos, sin embargo estas tres se construyen de manera paralela y cada componente est referidoen las otras.

  • 7/26/2019 Seminario de Sistemas

    37/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    26

    I. Diagramas de flujo de datos

    Paso 1: Representar al sistema en su conjunto mediante un diagrama de contexto

    Paso 2: Descomponer la burbuja de contexto en el diagrama de nivel 0.

  • 7/26/2019 Seminario de Sistemas

    38/165

    ANLISIS Y DISEO DE SISTEMAS

    27

    Este ejemplo es muy sencillo, por lo que una vez que hemos alcanzado este nivel lasburbujas ya son primitivas, por lo que podemos pasar a la especificacin de proceso. (Si el sistemafuese ms complejo, cada una de las burbujas del nivel cero deber subdividirse, tal como se hizocon el diagrama de contexto).

    Observe que el diagrama de flujo de datos resulta til para determinar los mdulos quedeber tener el programa o sistema y los parmetros que debern pasarse entre ellos.

    II. Especificaciones de proceso

    1. Registro de Nuevo ClienteSolicitar Nombre_ClienteSolicitar Direccin_ClienteSolicitar Telfono_ClienteAsignar Matrcula_ClienteIntegrar Registro_ClienteActualizar Catlogo de ClientesEntregar Credencial

    2. Renta de PelculaPor cada Clave_PelculaSolicitar Matrcula_ClienteActualizar servicios en Catlogo de ClientesObtener Registro_PelculaActualizar existencias en Catlogo de PelculasCalcular Precio_ServicioInformar Precio_ServicioRecibir Pago

  • 7/26/2019 Seminario de Sistemas

    39/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    28

    Entregar Comprobante_Renta

    3. Devolucin de PelculaPor cadaClave_Pelcula

    Actualizar existencias en Catlogo de Pelculas

    (Los procesos que implican movimientos en los catlogos se efectan a traves deladministrador de catlogos, que es en realidad un manejador de bases de datos, por lo que no se ledetallar aqu.)

    Observe que las especificaciones de proceso resultan tiles para disear y construir losalgoritmos que se usarn en los programas.

    III. Diccionario de datos

    Clave_Pelcula= * Clave asignada al ttulo grabado en videocassette *

    Catlogo_de_Clientes = * Archivo(s) que contienen los datos de los usuarios *= { Registro_Cliente }

    Catlogo_de_Pelculas= * Archivo(s) que contienen los datos de las pelculas *= { Registro_Pelcula }

    Comprobante_Renta= * Recibo del servicio prestado *Nombre_Pelcula + Precio_Servicio + Nombre_Usuario

    Credencial= * Identificacin de un usuario del videoclub *Nombre_Cliente + Matrcula_Cliente

    Direccin_Cliente = * Domicilio particular del cliente *Calle + Nmero + [Colonia|Municipio] + Ciudad + Cdigo_Postal

    Matrcula_Cliente= * Nmero de registro asignado al cliente *

    Nombre_Cliente = * Nombre propio del cliente *Apellido_Paterno + Apellido_Materno + Nombre

    Pago= * Cantidad monetaria requerida por el servicio *

    Precio_Servicio= * Total a pagar por la renta *

    Registro_Cliente= * Configuracin de los registros del catlogo de clientes *

    Nombre_Cliente + Matrcula_Cliente + Telfono_Cliente +Direccin_ Cliente + [Observaciones ]

    Registro_Pelcula= * Configuracin de los registros del catlogo de pelculas *Nombre_Pelcula + Clave_Pelcula + Existencias

    Telfono_Cliente = * Telfono particular del cliente *

  • 7/26/2019 Seminario de Sistemas

    40/165

    ANLISIS Y DISEO DE SISTEMAS

    29

    Observe que el diccionario resulta til para determinar las variables y estructura de losregistros que se usarn en los programas.

    Una advertencia, este ejemplo slo es una propuesta del autor, diferentes analistaspueden tener opiniones diferentes, incluso usted mismo puede encontrar posibles mejoras.

  • 7/26/2019 Seminario de Sistemas

    41/165

    Captulo 3

    vvDiseo de algo r i tmos

    3.1 Etapas del desarrollo de programas 303.2 Diferencia entre algoritmo y programa 343.3 Bases para el diseo de algoritmos 373.4 Diagramas de flujo 413.5 Programacin estructurada 423.6 Programacin modular 45

    3.7 Diagramas de estructura 56

  • 7/26/2019 Seminario de Sistemas

    42/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    30

    3.1 Etapas del desarrollo de programas

    Un programa se elabora para resolver un problema mediante la computadora. Encomputacin un problemaconsiste en obtener ciertos resultados a partir de unos

    datos previos.

    Para desarrollar un programa y tener mayor confianza sobre su correctofuncionamiento es conveniente seguir las etapas presentadas en la figura 3-1.

    ll Definicin del problema

    Consiste en establecer cules son los datos disponibles (para resolver elproblema) y a qu resultados se desea llegar.

    Para superar esta fase se debe redactar un texto que indique qu es lo quese pretende solucionar y contenga toda la informacin til al respecto.

    Algunas veces la definicin del problema ya est elaborada (como en loslibros de fsica). Sin embargo llega a suceder que no toda la informacinproporcionada es til.

    Para mejorar la comprensin del problema, pregunte todo lonecesario a las personas que estn relacionadas con l.

  • 7/26/2019 Seminario de Sistemas

    43/165

    DISEO DE ALGORITMOS

    31

    ll Anlisis del problema

    Consiste en hacer un examen profundo del problema y su situacin, con elfin de entenderlo por completo y poder proponer una solucin.

    Durante esta fase se debe definir con precisin qu informacin es til ycul no. Si se descubre informacin faltante, deber investigarse.

    Como resultado de esta fase se propondr una solucin, pero sin indicarcmo obtenerla.

    Es imposible especificar un problema que no se ha entendido.Si usted es capaz de explicarlo a otra persona, sin dar por

    supuesto que ella sabe lo que quiere comunicarle, entonces ya

    ha entendido el problema.

    ll Diseo del algoritmo

    Consiste en planear y especificar la estrategia que se seguir para alcanzarla solucin de un problema.

    El producto de esta fase es un documento que detalle los pasos queposteriormente se convertirn en programas.

    ll Programacin y pruebas

    Consiste en codificar el algoritmo diseado en un lenguaje deprogramacin y probar su funcionamiento para corregir errores.

    ll Mantenimiento

    Consiste en modificar el programa segn vayan apareciendo nuevas

    necesidades.

    El cuadro 3-2 muestra un ejemplo muy sencillo donde se aplican cada unade estas fases.

    No siempre puede (ni conviene) seguirse el orden estricto deldiseo de programas. Hay que efectuar experimentos para ir

    modificando los planes iniciales.

  • 7/26/2019 Seminario de Sistemas

    44/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    32

    Cuadro 3-2

    Centrar un letrero*

    ll ANALISIS

    1o. Enunciado del problema: Centrar un letrero cualquiera de manera similar a como se haracon una mquina de escribir.

    2o. Solucin del problema: Para centrar un letrero es necesario dejar espacios antes de escribirlo,entonces hay que desarrollar un mtodo para calcular esa cantidad de espacios y aplicarlo.

    l DISEO

    1o. Descripcin sencilla del algoritmo

    Se cuentan las letras (incluyendo los espacios) en el letrero y se resta del total de columnas enla hoja ("golpes por pgina"). El nmero que resulta corresponde al total de espacios en blancoque quedaran si se escribe la lnea desde el margen izquierdo. Por lo tanto, para centrar se deben

    repartir los espacios en dos porciones iguales, una quedar antes y otra despus del letrero.

    2o. Consideraciones iniciales

    a) Como el letrero puede ser cualquiera, se le deber preguntar al usuario cul es, y almacenarloen una variable (que llamaremos LETRERO).

    b) El ancho es el total de columnas o golpes por pgina; se fija al principio del trabajo y no sevara. Como el ancho puede ser de 80, 70, 65, o cualquier otro, lo sustituiremos porANCHO.

    c) Se requerirn de dos variables ms: LONG, donde se guarde el total de letras (caracteres)contenidos en el letrero y NUM_ESPACIOS que tendr el valor de espacios en blanconecesarios.

    3o. Algoritmo

    (1) Inicio(2) ANCHO= 80(3) Leer LETRERO(4) LONG = total de caracteres en LETRERO(5) NUM_ESPACIOS= ANCHO - LONG/ 2(6) Imprimir NUM_ESPACIOSde blancos(7) Imprimir LETRERO(8) Fin

    Comentarios:

    En la lnea (2) fijamos el ancho en 80, segn sean las necesidades puede fijarse en cualquierotro valor.

    La lnea (4) indica el total de caracteres, manualmente se hace contando las letras, en loslenguajes de programacin hay funciones especiales que hacen esto precisamente.

    *Adaptado de Vasconcelos Santilln, Jorge.Introduccin a la Computacin. PublicacionesCultural. Mxico, 1997.

  • 7/26/2019 Seminario de Sistemas

    45/165

    DISEO DE ALGORITMOS

    33

    l Programacin

    Program CentrarLetrero;Var

    i,Ancho,Long,NumEspacios : Integer;Letrero : String;

    BeginAncho := 80;Write ('Escriba algn mensaje ');Read (Letrero);Long := Length(Letrero);NumEspacios := (Ancho - Long) Div 2;For i := 1 To NumEspacios Do

    Write (' ');Write (Letrero);

    End.

    l Mantenimiento

    Las necesidades cambia y el ancho de la pantalla ser de 132. Tambien deber aparecerel letrero entre asteriscos.

    Program CentrarLetrero;Var

    i,Ancho,Long,NumEspacios : Integer;Letrero : String;

    BeginAncho := 132; ModificacinWrite ('Escriba algn mensaje ');Read (Letrero);Long := Length(Letrero);NumEspacios := (Ancho - Long) Div 2;For i := 1 To NumEspacios Do

    Write (' ');Write ('*',Letrero,'*'); Modificacin

    End.

    Que una idea (algoritmo, programa o lenguaje) sea antiguo, no implica que seaobsoleto; por el contrario, le puede aportar valiosos elementos que slo

    requieran adaptarse a su trabajo propio.

  • 7/26/2019 Seminario de Sistemas

    46/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    34

    cuadro 3-3

    UN ALGORITMO DE SEIS PASOS PARA HACER PROGRAMAS

    1. Especifique con precisin todo el problema.

    2. Divida el problema en subproblemas. Disee un algoritmo que solucione cadasubproblema. Hgalos tan sencillos que su correccin sea evidente.

    3. Verifique que el algoritmo sea lgicamente correcto y que cumpla con lasespecificaciones.

    4. Codifique usando el lenguaje apropiado, estructuras de datos conocidas y otras rutinastiles. Aplique tcnicas de programacin estructurada y de documentacin.

    5. Compruebe el programa con algunos datos cuidadosamente seleccionados y elimine los

    errores que pueda haber. Nunca deje errores sin corregir, o en su caso documentar.

    6. Efectue estos pasos con cada subproblema.

    Los buenos algoritmos son

    elegantes entidades algebricas.

    Richard E. Blahut

    3.2 Diferencia entre algoritmo y programa

    Un algoritmo es una frmula o una secuencia de pasos que resultan tiles paradarle solucin a un problema. Debe ser independiente de la sintaxis de un lenguajede programacin en particular puesto que es la concrecin de un plan y es un mediopara comunicar ideas entre personas (no obstante un algoritmo puede tomar enconsideracin a otros algoritmos).

    Un programa es un grupo de instrucciones, escritas en un lenguajeespecializado, cuya finalidad es indicarle a una mquina cmo efectuar un trabajo.

    A cada lnea de un algoritmo le corresponden una o ms lneas de cdigo.

    El algoritmodefine la lgicacon que fluyen

    las instruccionesde un programa.

  • 7/26/2019 Seminario de Sistemas

    47/165

    DISEO DE ALGORITMOS

    35

    En el cuadro 3-4 se compara un algoritmo con el correspondienteprograma en un lenguaje de programacin.

    Si usted programa en Pascal, C, o algn lenguaje similar, reconocer que

    entre el algoritmo y el programa no hay mucha diferencia. Si el algoritmo se redactausando un lenguaje ms formal (pseudocdigo) se parecer an ms al programa:

    inicioleer A, B, C

    X = (-B + B - 4 A C ) / (2 A)1

    X = (-B - B - 4 A C ) / (2 A)2 escribir X1, X2

    fin

    y esta semejanza ser an mayor si la redaccin se hace en ingls:

    beginread A, B, C

    X = (-B + B - 4 A C ) / (2 A)1

    X = (-B - B - 4 A C ) / (2 A)2 write X1, X2

    end

    cuadro 3-4ll Algoritmo para obtener las races de la ecuacin cuadrtica

    Paso 1: Obtener los coeficientes de la ecuacin cuadrtica

    Paso 2: Aplicar la frmula X = (-B B - 4 A C ) / (2 A)1,2 Paso 3: Entregar los resultados de la frmula

    Paso 4: Fin

    ll Programa en Turbo Pascal para calcular las races de ecuacin cuadrtica

    Program Obtener_Raices;Var

    A,B,C,X1,X2 : Real;

    BeginWrite ('Escriba el coeficiente cuadrtico: ');Read (A);Write ('Escriba el coeficiente lineal: ');Read (B);Write ('Escriba el trmino independiente: ');Read (C);

    X1 := (-B + SQRT (B*B - 4*A*C)) / (2*A);X2 := (-B - SQRT (B*B - 4*A*C)) / (2*A);

  • 7/26/2019 Seminario de Sistemas

    48/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    36

    WriteLn ('Las races de la ecuacin son: ',X1:0:2,' y ',X2:0:2);End.

    cuadro 3-5

    Suma de Matrices

    Hay varias formas que describen el algoritmo de la suma de dos matrices:

    1. "Sumarn entrada a entrada"2. Esquemticamente:

    a b c

    d e f

    g h i

    z y x

    y v u

    t s r

    a z b y c x

    d y e v f u

    g t h s i r

    ++

    ==

    ++ ++ ++

    ++ ++ ++

    ++ ++ ++

    3. De manera general

    SeanA, By Cmatrices de nx m,aijun elemento cualquiera de Abijun elemento cualquiera deBcijun elemento cualquiera de C

    c a bi j i j ij i n y j m == ++ , 1 1

    Esta ltima forma permite indicar con mayor facilidad otros procedimietnos, comocalcular la suma de las diagonales de una matriz

    Diagonal a Antidiagonal a i i i n i i

    n

    i

    n

    == == ++====

    ( )111

    As como ste, hay una gran cantidad de casos en los que hacer elalgoritmo resulta en la construccin del programa3 (si se programa en un lenguajede alto nivel). Sin embargo tambin existen otros casos en los que la diferenciaentre algoritmo y programa es enorme (vase el cuadro 3-5).

    Un programa puede constar de uno o ms algoritmos.

    3Esta facilidad ha motivado la construccin de programas directamente sobre el teclado.

  • 7/26/2019 Seminario de Sistemas

    49/165

    DISEO DE ALGORITMOS

    37

    Obsrve que en el ejemplo del cuadro 3-6 resulta ms fcilentender el algoritmo que el programa. Si usted tiene oportunidad deestudiar inteligencia artificial (campo donde suelen utilizarsebsquedas, esto es, ubicar la mejor posibilidad entre una gran gama

    situaciones, como en el ajedrez) observar que este algoritmo esfcilmente implementable en cualquier lenguaje. Si slo tuviese elprograma, antes de intentar hacerlo con otro lenguaje, tendra que aprender Lisp.

    cuadro 3-6ll Algoritmo para realizar una bsqueda de "primero en profundidad".

    1. Inicializar la lista OPEN con el nodo INICIO2. Mientras haya nodos en OPEN hacer2.1 Apuntar TMP al primer elemento de OPEN y retirarlo de la lista.2.2 Si TMP es el nodo BUSCADO entonces terminar con xito

    en otro caso expandir los sucesores de TMP y colocarlosal principio de OPEN.

    3. Si OPEN est vaco entonces terminar con fracaso.

    ll Programa en Lisp para efectuar una bsqueda de "primero en profundidad".

    (defun DFS (inicio buscado sucesores)(setq open (list inicio) )(loop ((null open))

    (setq tmp (car open))(setq open (cdr open))((equal tmp buscado))(setq l (expand tmp sucesores))(setq open (append l open) )

    )

    )

    3.3 Bases para el diseo de algoritmos

    El diseo de algoritmos es una actividad que consiste en especificar los pasosnecesarios para alcanzar la solucin de un problema. Debe considerar que algunosde esos pasos sern otros algoritmos (que ya estarn diseados o debern planearsedespus).

    cuadro 3-7

    Caractersticas de un algoritmo

    1) Alcanzar la solucin (correcta) en un tiempo finito.

    2) Constar de pasos claros, precisos y no ambiguos.

    Dos algoritmos

    son compatibles

    si producen las

    mismas salidas

    ante iguales

    entradas.

  • 7/26/2019 Seminario de Sistemas

    50/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    38

    3) Mostrar claramente cules son los datos iniciales y cules son losresultados.

    Para establecer esa serie de pasos se requiere reflexionar sobre

    el problema. Si el problema es grande entonces conviene dividirlo enotros ms pequeos que puedan entenderse con ms detalle y atendercada uno de los subproblemas por separado, sin preocuparse por losdems.

    Por cada problema se debe considerar lo siguiente:

    1. Definir con precisin qu datos se utilizarn como entradas.

    2. Definir con precisin qu datos se requerirn como salidas.

    3. Si ya existen algoritmos adecuados, aprovecharlos prudentemente.

    4. Determinar qu acciones se deben efectuar sobre las entradas hasta convertirlasen resultados y describir cada una con frases no ambiguas.

    Si le resulta difcil disear algn algoritmo considere aplazarlo un poco.A veces posponer los problemas simplifica su solucin; y siempre est

    dispuesto a empezar desde el principio, es posible que el segundointento sea ms breve y fcil.

    Por lo general las acciones que pueden integrarse en un algoritmo son:4

    a) Pedir datosb) Desplegar datosc) Evaluar condicionesd) Ejecutar operaciones matemticas

    Estas acciones pueden describirse mediante dibujos (diagramas de flujo,figura 3-2), lenguaje natural, pseudocdigo (espaol o ingls estructurado), eincluso con las palabras propias de un lenguaje de programacin.

    4Para controlar el orden en que se efectan estas acciones se requiere de estructuras de control ode saltos (goto).

    Hagaalgoritmos tan

    sencillos yclaros que sulgica seaevidentementecorrecta.

    No espereencontrar el

    algoritmo

    adecuado alprimer intento.

  • 7/26/2019 Seminario de Sistemas

    51/165

    DISEO DE ALGORITMOS

    39

    Observe que el ejemplo siguiente slo usa los elementos antes

    mencionados.Problema: El salario diario de un empleado se calcula en base a lossiguientes datos: se pagan a N$ 15 cada una de las primeras 8 horas, y a $20cada hora extra. Calcular el salario mensual, considerando que se trabajanslo cinco das a la semana.

    Algoritmo:InicioMAX_HORAS = (8 horas)*(5 das)*(4 semanas);Leer HORAS_TRABAJADASSi HORAS_TRABAJADAS > MAX_HORAS Entonces

    InicioHORAS_EXTRAS = HORAS_TRABAJADAS - MAX_HORASHORAS_TRABAJADAS = MAX_HORASSUELDO = HORAS_TRABAJADAS * 15 + HORAS_EXTRAS * 20Fin

    En otro casoSUELDO = HORAS_TRABAJADAS * 15

    Imprimir SUELDOFin

    No intente disear hasta el ltimo detalle, muchas de las caractersticas finalesdel programa van surgiendo mientras se le desarrolla.

    Para que los algoritmos se puedan convertir con facilidad en programaselegantes y de calidad conviene seguir las tcnicas de programacin estructuracin

    y programacin modular.

    Existen situaciones en que puede ser difcil disear, entoncesconviene lograr que primero funcione, adquirir experienciasobre el comportamiento de las entradas y salidas, y lasiguiente vez hacerlos bien desde el principio.

  • 7/26/2019 Seminario de Sistemas

    52/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    40

    cuadro 3-8

    Un lenguaje mnimio

    Los procesos ms complejos pueden ser construdos a partir de un lenguaje muy reducido queno contenga estructuras de programacin. Este tipo de problemas son estudiados por la

    Computabilidad. Enseguida vemos un pequeo conjunto de instrucciones a partir del cual seconstruyen las dems estructuras de programacin.

    ll Instrucciones Bsicas:

    1o. Inc variable Incrementar en 1 el valor de la variable

    2o. Dec variable Decrementar en 1 el valor de la variable

    3o. While variable0 Do Repetir un proceso si el... valor de la variable es

    End While diferente de cero

    llInicializar una variable en cero { variable:= 0; }

    Procedure Clear variableWhile variable0 Do

    Dec VariableEnd While

    ll Asignar un valor a una variable { nom1 := nom2; }

    Procedure asigna variableClear AuxClear Nom1While Nom2 0 Do

    Dec Nom2Inc Aux

    End While

    While Aux 0 DoInc Nom1Inc Nom2Dec Aux

    End While

    ll Evaluar una condicin { If X = 0 Then S1 Else S2 }

    Procedure If auxInc FlagClear AuxWhile Aux 0 Do { else }

    S2Clear AuxClear Flag

    End While

  • 7/26/2019 Seminario de Sistemas

    53/165

    DISEO DE ALGORITMOS

    41

    While Flag 0 DoS1Clear Flag

    End While

    ll Ciclo Repeat { Repeat S Until X = 0 }

    Procedure Repeat UntilXInc XWhile X 0 Do

    Dec XS

    End While

    3.4 Diagramas de flujo

    Los diagramas de flujo son representaciones del flujo que siguen las instruccionesde un programa.

    Los diagramas de flujo fueron muy utilizados durante la dcada de lossesentas, pero resultaron inadecuados como herramienta de modelado de sistemas,debido a que facilitan la creacin de cdigo no estructurado y complejo. Frente a

    ellos, el pseudocdigo fue una alternativa realmente mejor.

    Pero si bien estos diagramas han cado en desuso, an pueden resultartiles. Conviene recurrir a los diagramas de flujo en los siguientes casos:

    1) Para seguir la secuencia lgica de procesos complejos.

    2) Para intercambiar entre estructuras de control

    3) Para redireccionar el flujo, eliminando goto's, o sustituyndolos porestructuras de control.

    4) Para cambiar un programa de un lenguaje a otro.5) Para esbozar fcilmente un procedimiento complejo.

    cuadro 3-9

    Los diagramas de Nassi-Schneiderman

    Una alternativa a los diagramas de flujo son los diagramas de Nassi-Schneiderman,desarrollados hacia 1973.

  • 7/26/2019 Seminario de Sistemas

    54/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    42

    Son diagramas estructurados y pueden representar algoritmos sin utilizarflechas para indicar el flujo.

    3.5 Programacin estructurada

    La programacin estructurada es una tcnica de diseo de programas querequiere la aplicacin de tres conceptos5:

    1. Uso de las estructuras de control: Secuencia, Seleccin e Iteracin(cuadro 3-9).

    2. Eliminacin del uso delgoto.3. Diseo de algoritmos y programas con un solo flujo de entrada y uno solo desalida.

    Mediante esta tcnica se puede leer y entender la lgica de los programassecuencialmente, de principio a fin; y puede aplicarse an a nivel de pseudocdigo.

    Si est acostumbrado a programar en C o Pascal le resultar naturalaplicar las estructuras, no usar el gotoy tener mdulos con una sola entrada y una

    sola salida.

    Estas tcnicas pueden seguirse aun cuando el lenguaje no posea lasimplementaciones de las estructuras, como se muestra a continuacin con unejemplo en lenguaje ensamblador.

    5En realidad los dos ltimos son consecuencia de la aplicacin del primero.

  • 7/26/2019 Seminario de Sistemas

    55/165

    DISEO DE ALGORITMOS

    43

    mov cx,10 ; emulacion de repeat-untilREPEAT: ; Repeat

    nop ;call cuerpo del mdulo ;dec cx ;

    jnz REPEAT ; Until CX = 0

    mov cx,10 ; emulacion de while-doWHILE: jcxz NEXT ; While CX 0 Do

    nop ;call cuerpo del mdulo ;dec cx ;

    jmp WHILE ; End While

    ; emulacion de For-NextNEXT: mov cl, 10 ; limite inferior

    mov ch, 20 ; limite superiorFOR: cmp cl,ch ; For X := CL To CH Do

    je CONTINUEnop ;call cuerpo del mduloinc cl

    jmp FOR ; Next XCONTINUE: ;fin ; Salida del FOR-Next

    Para finalizar esta seccin, presentamos un algoritmo no estructurado(con su diagrama de flujo) y un fragmento de programa con dos puntos de salida.

  • 7/26/2019 Seminario de Sistemas

    56/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    44

    int traslada (simbolo,tr)char *simbolo, *tr;

    {int t;t = 0;while (*trans[t] {

    if(!strcmp(trans[t],simbolo)) {

    strcpy(tr,trans[t+1];

    return 1;}

    }

    t += 2;}

    Aplicar programacin estructurada produce cdigo fcilde leer, fcil de mantener e incluso fcil de escribir.

  • 7/26/2019 Seminario de Sistemas

    57/165

    DISEO DE ALGORITMOS

    45

    Cuadro 3-10: Estructuras de Programacin

    La programacin estructurada se basa en el uso de las estructuras decontrol:

    Secuencia

    Seleccin Iteracin

    Estas estructuras controlan el flujo que siguen las instrucciones de un programa.

    SECUENCIA

    Estructura utilizada en operaciones que debernejecutarse una sola vez, siguiendo un orden determinado,de inicio a fin.

    SELECCION

    Estructura

    utilizada para elegirentre accionesdiferentes.

    ITERACION

    Estructura utilizada para realizar variasveces una misma accin.

  • 7/26/2019 Seminario de Sistemas

    58/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    46

    3.6 Programacin modular

    La programacin modular es una tcnica de construccin de programas queconsiste en descomponer un gran proceso en pequeas rutinas independientes, que

    realicen tareas concretas y sean fciles de comprender y mantener.

    cuadro 3-11LAS DIVERSAS FORMAS DE LOS MODULOS

    MACRO: Es una sola instruccin, que se incluye en el programa fuente, y se expande en variasinstrucciones del mismo nivel del lenguaje.

    SUBRUTINA (procedimiento): Es una seccin de cdigo que lleva una tarea autocontenidadentro de un programa. Se ejecuta mediante una llamada desde uno o ms puntos dentro del

    programa, y despus de completarse regresa a la instruccin siguiente de su llamada.

    FUNCIONES:Se ejecutan como subrutinas. Efectan operaciones matemticas. Se les pasa unparmetro y su llamada regresa el resultado del clculo.

    CORRUTINAS: Mdulos que efectan su operacin de modo paralelo o interactivo.

    SUBRUTINA RECURSIVA: Procedimiento que tiene la capacidad para llamarse a s mismo.No todos los lenguajes tienen esta facilidad.

    Un programa escrito modularmente facilita el mantenimiento, pues es msfcil encontrar y aislar la parte a modificar y slo es necesario alterar ese mdulo.

    Es fcil visualizar un programa como una construccin modular si seconsidera que todos los programas siguen los siguientes patrones de lgica:

    1. Patrn bsico:

    a) Principio - Rutinas de inicializacin, lectura de entradas, apertura dearchivos, activacin de modos grficos.

    b) Mitad - Procesamiento de datos.c) Fin - Emisin de resultados, cierre de archivos, restauracin de modos de

    video, liberacin de memoria.

    3. Ciclo determinstico

    Los procesos se repiten un predeterminado nmero de veces.

    4. Ciclo indeterminado

    Los procesos se repiten hasta que una condicin especfica es detectada.

  • 7/26/2019 Seminario de Sistemas

    59/165

    DISEO DE ALGORITMOS

    47

    llSugerencias para construccin de mdulos

    1. Antes de desarrollar un mdulo se debe tener claro para qu servir.

    2. Cada subprograma deber ejecutar una sola tarea, pero hacerla bien.3. Ningn mdulo deber afectar a algn otro procedimiento. Use variables locales

    tanto como le sea posible ya que su margen de accin est limitado naturalmenteal mdulo que las define.

    4. Cada mdulo deber comportarse como una caja negra: recibir entradas,efectuar un proceso desconocido y entregar resultados.

    5. La comunicacin entre mdulos debe efectuarse mediante parmetros.

    6. Si al tratar de describir la tarea realizada por un mdulo se extiende o seexageran los detalles, deber considerarse la divisin del mdulo.

    7. Cualquier tarea que se efecta ms de una vez en un programa, debe serseparada en un mdulo. Todas las secciones que acten como interfaces deentrada y salida de datos hacia el usuario tambin debern ser mdulosespeciales.

    8. Escribir los mdulos de modo general. Colocarlos en libreras para que puedanser incorporados en programas diferentes.

    9. Evitar que la implementacin de un mdulo complicado retarde la construccindel resto del programa.

    10. Construir mdulos con pocos ciclos y pocas opciones para facilitar su prueba ydepuracin. El tamao mximo conveniente para un mdulo es de unas 23 lneas(una pantalla).

    llEl acoplamiento y la cohesin

    Los trminos Acoplamiento y cohesinfueron acuados por Stevens, Constantiney Myers para describir la calidad de los mdulos de un programa. Mientras mejoressean los mdulos, ms fcil ser la depuracin.

    Acoplamientosignifica dependencia de un mdulo respecto de otro. Vistode otra forma, indica qu tan intersectados estn los mdulos (figura 3-3a). Hayvarios niveles de acoplamiento, el ms alto es acoplamiento de contenido y el msbajo es el acoplamiento de datos.

  • 7/26/2019 Seminario de Sistemas

    60/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    48

    1. Acoplamiento de contenido: las instrucciones de un mdulo o sus datos localespueden ser alterados por otro mdulo. Por ejemplo, un virus altera el contenidode otros mdulos (archivos o programas); o tambin ciertos programas en BASIC(intrprete) o en lenguaje mquina s pueden alterar su propio cdigo porquecada instruccin ocupa una zona especfica de memoria que puede ser alterada al

    ejecutarse la instruccin que le antecede (esto mismo es difcil de lograr si losmdulos estn escritos en C o en Pascal ya que ambos lenguajes requierencompilador).

    2. Acoplamiento de zonas: varios mdulos utilizan reas de datoscomunes (variables globales). Esto es prcticamente inevitablecuando se usan archivos puesto que no puede haber archivoslocales para cada mdulo.

    3. Acoplamiento de control: el flujo seguido por las instrucciones de un mdulopuede ser controlado desde otro mdulo, mediante parmetros de control. Este

    tipo de aclopamiento es caracterstico de los mdulos manejadores de mens.

    4. Acoplamiento de datos: los datos requeridos por un mdulo se obtienenmediante parmetros.

    El acoplamiento

    de datos es el

    ms

    recomendable.

  • 7/26/2019 Seminario de Sistemas

    61/165

    DISEO DE ALGORITMOS

    49

    Figura 3-3 (a)Cohesines el grado de interrelacin entre las instrucciones de un mismo

    mdulo. Indica qu tanto pertenecen las instrucciones a un mdulo, para alcanzarun mismo objetivo (figura 3-3b). La cohesin nos indica cuntas tareas hace a lavez un mismo mdulo.Hay varios niveles de cohesin, el ms bajo es la cohesin

    coincidental y el ms alto es cohesin funcional.1. Cohesin coincidental: un mdulo tiene instrucciones muy poco relacionadas;

    es decir, hace varias cosas a la vez. Por ejemplo un mdulo de inicializacin(abre archivos, ajusta modo de video, etctera) o una mala modularizacin.

    2. Cohesin lgica o temporal: un mismo mdulo realiza variasfunciones. Pueden requerir de parmetros de control, o ser secuencial.Este tipo de cohesin se presenta en un mdulo manejador de men.

    3. Cohesin en la comunicacin: un mismo mdulo realiza

    actividades diferentes pero utilizando los mismos datos.

    4. Cohesin secuencial: la salida de una instruccin es la entrada de la siguiente.

    5. Cohesin funcional: todas las instrucciones se enfocan a desarrollar una solatarea.

    La cohesin

    secuencial y

    funcional son

    las ms

    recomendables

  • 7/26/2019 Seminario de Sistemas

    62/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    50

    Figura 3-3 (b)

    Un buen programa tiene mdulos con una alta cohesin y un bajoacoplamiento, as todos sus mdulos colaboran con el propsito globaldel programa y para hacer modificaciones basta afectar en un mdulo

    especfico sin preocuparse del resto.

    El cuadro 3-11 presenta alguno ejemplos de cdigo con diferentes gradosde cohesin y acoplamiento.

    cuadro 3-12

    Acoplamiento de contenido

    F En este programa hay acoplamiento de contenido entre los mdulos ajustareimprimir.

    title SALUDO

    .model small.stack 10h

    .dataCR = 0DhLF = 0AhMESSAGE db CR,LF,'Hola Mundo','$'

    .code

    inicio proc imprime cinco veces el mensajemov cx, 5

    ciclo: call imprimirloop ciclo

    call ajustar esta rutina altera el cdigo del mdulo imprimirmov cx, 5

    ciclo2:call imprimirloop ciclo2

    fin: mov ax, 4C00hint 21hret

    inicio endp

    imprimir proc despliega en pantalla el mensajepush cxpush dsmov ax, @data

    uno: mov ds, axdos: mov dx, offset MESSAGE

    tres: mov ah, 9int 21hpop dspop cxret

    imprimir endp

    ajustar proc altera las instrucciones marcadas con las banderasmov bx, offset unomov cs:[bx], 0D18Bh

  • 7/26/2019 Seminario de Sistemas

    63/165

    DISEO DE ALGORITMOS

    51

    mov bx, offset dosmov cs:[bx], 0C280hmov cs:[bx+1], 30C2hmov bx, offset tresmov cs:[bx], 02B4hret

    ajustar endp

    End Inicio Resultado de la ejecucin:

    Acoplamiento de contenido

    F dado que este mdulo es recursivo, hay acoplamiento consigo mismo, debido

    a que se est haciendo un paso de parmetros por referencia.

    Function Factorial (var i : Word):Word;Begin

    If i = 0 ThenFactorial := 1

    ElseBegini := i - 1;Factorial := (i+1) * Factorial(i);End;

    End;

    Acoplamiento de zonas

    F Todos los mdulos hacen referencia al mismo arreglo. Si uno de ellos

    modifica el contenido, se modifica para todos..

    ConstMAX_STACK = 20;

    VarStack : Record;arr : Array[1..MAX_STACK] Of String;tope : Byte;

    End;

    Procedure Push (st : String);Begin

    With stack DoBeginInc(tope);If tope

  • 7/26/2019 Seminario de Sistemas

    64/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    52

    End;

    Function Pop : String;Begin

    With Stack DoBeginIf tope > 0 Then

    BeginPop := arr[tope];arr[tope] := '';Dec(tope);

    EndEnd;

    End;

    Function Peek : String;Begin

    With Stack Do

    If tope > 0 ThenPeek := arr[tope]

    ElsePeek := '';

    End;

    Acoplamiento de control y cohesin temporal

    F La seccin del cdigo que se ejecutar, depende del valor de Opcion.

    Procedure CalcularAreas (Opcion : Char);Var

    b,h,

    l,r,area : Real;

    BeginCase Opcion Of

    '1' : BeginWrite ('Escriba la Base y la altura: ');Readln (b,h);area := b * h;Write ('El rea es: ',area);

    End;'2' : Begin

    Write ('Escriba el lado: ');Readln (l);area := l * l;

    Write ('El rea es: ',area);End;'3' : Begin

    Write ('Escriba el radio: ');Readln (r);area := PI * r * r;Write ('El rea es: ',area);

    End;End;

    End;

  • 7/26/2019 Seminario de Sistemas

    65/165

    DISEO DE ALGORITMOS

    53

    Acoplamiento de control

    F En este fragmento de cdigo se observa claramente un acoplamiento de control entre los

    mdulos, debido a que para que Accion2pueda ejecutar sus instrucciones,

    depende de un dato que est fuera de l, Resp. El valor de Respse obtiene

    de otro mdulo ajeno, Accion1.

    VarResp : Char;

    Procedure Accion1;Begin

    { Instrucciones...}

    WriteLn ('Desea Continual');ReadLn (Resp);

    End;

    Procedure Accin2;Begin

    If Resp = 'S' ThenBegin

    { Instrucciones... }

    End;End;

    BeginAccion1;accion2;

    End.

    F Para liberar este acoplamiento de control, podemos reescribir parte del cdigo.Var

    Resp : Char;

    Procedure Accion1;Begin

    { Instrucciones...}End;

    Procedure Accin2;Begin

    { Instrucciones... }End;

    BeginAccion1;WriteLn ('Desea Continual');ReadLn (Resp);If Resp = 'S' Then Accion2;

    End.

  • 7/26/2019 Seminario de Sistemas

    66/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    54

    F Este reacomodo dej a los mdulos Accion1y Accion2desacoplados, ya que se

    delego el control del flujo a un mdulo superior.

    Acoplamiento de datosF Cada mdulo recibe datos externos mediante parmetros.

    ConstMAX_STACK = 20;

    Typet_Stack = Record

    arr : Array[1..MAX_STACK] Of String;tope : Byte;

    End;

    Procedure Push (var stack : t_Stack; st : String);Begin

    With stack DoBeginInc(tope);If tope 0 Then

    BeginPop := arr[tope];

    arr[tope] := '';Dec(tope);End

    End;End;

    Function Peek (Stack : t_Stack) : String;Begin

    With Stack DoIf tope > 0 Then

    Peek := arr[tope]Else

    Peek := '';End;

    Cohesin coincidental

    F Este es el programa original que fue hecho de un solo bloque.

    PROGRAM ASTERISCO;{VERSION ORIGINAL}USES CRT;VAR

  • 7/26/2019 Seminario de Sistemas

    67/165

    DISEO DE ALGORITMOS

    55

    C,C2,C3,CONT,CONT1:INTEGER;BEGIN

    CLRSCR;CONT1:=1;CONT:=7;REPEATGOTOXY (CONT,CONT1);

    WRITELN ('*');CONT:=CONT-1;CONT1:=CONT1+1;UNTIL CONT =1;BEGINC2:=1;C:=7;REPEATGOTOXY (C,C2);WRITELN ('*');C:=C+1;C2:=C2+1;UNTIL C2= 7;BEGINC3:=7;

    C:=1;REPEATGOTOXY (C,C3);WRITELN ('*');C:=C+1;C3:=7;UNTIL C=14;END;END;READLN;

    END.

    F Al modularizar el programa anterior slo se le fragmenta. Observe el

    programa principal, donde se aprecia con claridad cmo la

    relacin entre sus instrucciones es slo coincidencia.

    PROGRAM ASTERISCO;{VERSION MODULAR}USES CRT;VAR

    C,C2,C3,CONT,CONT1:INTEGER;

    Procedure Primero;BEGIN

    CLRSCR;CONT1:=1;CONT:=7;

    End;

    Procedure Segundo;Begin

    REPEATGOTOXY (CONT,CONT1);WRITELN ('*');CONT:=CONT-1;CONT1:=CONT1+1;UNTIL CONT =1;

    End;Procedure Tercero;

  • 7/26/2019 Seminario de Sistemas

    68/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    56

    BEGINC2:=1;C:=7;REPEATGOTOXY (C,C2);WRITELN ('*');C:=C+1;

    C2:=C2+1;UNTIL C2= 7;End;

    Procedure Cuarto;BEGINC3:=7;C:=1;REPEATGOTOXY (C,C3);WRITELN ('*');C:=C+1;C3:=7;UNTIL C=14;END;

    BEGINPrimero;Segundo;Tercero;Cuarto;

    END.

    Cohesin en la comunicacin

    F La misma variable Empleadose usa en cada mdulo.

    Procedure Actualizar (Empleado : TipoPersona);

    BeginMostrarInformacion(Empleado);

    ActualizarArchivo (Empleado);ImprimiCheque (Empleado);

    End;

    Cohesin Secuencial

    F La salida de cada etapa es utilizada por la siguiente.

    Procedure RacesCuadrticas;Var

    A,B,C,

    X1,X2,Disc : Realflag : Boolean;

    BeginA := ObtenerCoeficiente;B := ObtenerCoeficiente;C := ObtenerCoeficiente;Disc := CalcularDiscriminante (A,B,C);If Disc >= 0 Then

    Begin

  • 7/26/2019 Seminario de Sistemas

    69/165

    DISEO DE ALGORITMOS

    57

    X1 := CalcularRaiz1 (A,B,Disc);X2 := CalcularRaiz2 (A,B,Disc);Imprimir X1,X2;End;

    End;

    3.7 Diagramas de estructura

    Los diagramas de estructura son representaciones grficas de la jerarquaexistente entre los mdulos de un programa, y las estructuras de programacinutilizadas para controlar la operacin de esos mdulos.

    Cada mdulo se representa como un rectngulo (figura 3-4). Los mdulosa su vez se pueden componer de otros, o ser mdulos primitivos.

    Un mdulo primitivo se encarga de desarrollar el procesamiento de losdatos, mientras que un mdulo no primitivo se encarga de administrar a otrosmdulos.

    Para elaborar un diagrama de estructura considere lo siguiente:

    1. Descomponer el problema en una jerarqua de mdulos (cada mdulo debedesarrollar una sola tarea).

    2. Indique las estructuras de control del siguiente modo:

    l La ejecucin de varios mdulos en secuencia se indica de derecha a izquierda.

    l

    La ejecucin condicionada de varios mdulos se indica mediante el rombo,sealndose de derecha a izquierda el orden en que se evalan las condiciones.

    l La iteracin se indica mediante uan flecha que indica los mdulos a repetir.

  • 7/26/2019 Seminario de Sistemas

    70/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS

    58

    El diagrama de estructura se puede traducir a pseudocdigo (y viceversa),debido a que existe una correspondencia directa de estructuras de control y losnombres de los mdulos.

  • 7/26/2019 Seminario de Sistemas

    71/165

    DISEO DE ALGORITMOS

    59

    Figura 3-4: Figuras para Diagramas de Estructura

  • 7/26/2019 Seminario de Sistemas

    72/165

    MANUAL DE CONSTRUCCIN DE PROGRAMAS