u ii modularidad

Upload: miguel-ticas

Post on 08-Jul-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/19/2019 u II Modularidad

    1/28

      1

    UNIVERSIDAD DE EL SALVADOR FACULTAD DE INGENIERIA Y ARQUITECTURA

    ESCUELA DE INGENIERIA DE SISTEMAS INFORMATICOSPROGRAMACION I

    Ciclo II-2015

    UNIDAD II. ANÁLISIS ESTRUCTURADO

    Objetivo de la Unidad:  Conocer y aplicar los conceptos relacionados con el Análisis

    Estructurado para la solución de problemas.

    Contenido de la Unidad: 2.1 Definición de Programación Modular2.2 Técnicas de Diseño Modular2.3 Análisis Estructurado2.4 Representación Gráfica de Soluciones Modulares2.5 Variables Locales2.6 Variables Globales2.7 Concepto de Función2.8 Definición de una Función2.9 Invocación de una Función2.10 Parámetros de una Función

    2.11 EjemplosIntroducciónCuando los problemas que se van a resolver son muy grandes o complejos, diseñar la solución seconvierte en una actividad lenta y ardua, es aquí donde posee mayor utilidad la ProgramaciónModular, ya que facilita la tarea de programar y permite elaborar programas de manera más rápiday eficaz.

    La experiencia ha demostrado que la mejor manera de desarrollar una solución y mantenerla, esconstruirla a partir de piezas pequeñas, que la hacen más manejable. A continuación se presentandiferentes elementos que facilitan el diseño, implementación, operación y mantenimiento desoluciones grandes para problemas grandes.

    2.1 Definición de Programación Modular  Esta técnica también es conocida como Análisis Estructurado, y es uno de los métodos de diseñomás fácil. Ayuda a mejorar la productividad de los programas además que, es una forma flexible ypotente de programar .

    Esta técnica divide el problema en pequeñas partes o sub-problemas y se debe diseñar unasolución para cada una de esas partes. A las divisiones o partes de un problema y a las solucioneso algoritmos que los resuelven, se les conoce como módulos; cada módulo debe realizar una tareao actividad específica, según las divisiones que se hayan hecho.

    Para resolver cada sub-problema (o módulo), se le aplica la Metodología para Resolver Problemascompleta, es decir se debe plantear, analizar, diseñar su algoritmo y codificarlo, individualmente.

    Recordar que la solución de cada sub-problema resuelve sólo una parte del problema; la solucióncompleta del mismo está formada por el conjunto de todas y cada una de las pequeñas solucionesdiseñadas y la interrelación de todas ellas.

    Todo problema resuelto por esta técnica tiene un algoritmo denominado PRINCIPAL, comúnmenteconocido como: módulo raíz, módulo conductor o módulo de control; ya que controla todo lo quesucede, tanto en ese módulo como en todos los demás, transfiriendo el control de ejecución acada módulo en el momento que sea requerido. De esa forma, cada módulo puede realizar sufunción o tarea, pero al terminar regresa el control de ejecución al algoritmo o módulo principal.

  • 8/19/2019 u II Modularidad

    2/28

      2

    La solución de cada módulo se le conoce como SUB-ALGORITMO, en términos generales, si estárepresentado en un diagrama: sub-flujograma, si está escrito en código sub-programa (subrutina)y en lenguaje  C, función. Un problema resuelto mediante programación modular genera unalgoritmo modular que consta de un algoritmo principal y uno o varios sub-algoritmos.

    El algoritmo principal debe contener las llamadas (o invocaciones) a los sub-algoritmos; es decires el que indica el orden en que se ejecutan cada uno de los sub-algoritmos. Además, el módulo

    principal puede realizar una o varias tareas. Cada sub-algoritmo como representación de lasolución de un módulo debe mantener todas las propiedades de un algoritmo. Por lo tanto, estospueden contener tareas simples que sólo se ejecutan una vez o, lo que es más frecuente, tareasrepetitivas que se ejecutan varias veces y son llamadas para ejecutarse desde el algoritmoprincipal.

    Si la tarea asignada a un módulo es muy compleja (o muy grande), debe dividirse todavía en otro uotros módulos más pequeños. El proceso sucesivo de subdivisión de módulos continúa hasta quecada módulo tenga solamente una tarea o acción específica que ejecutar, esta tarea puede ser deentrada, salida, procesamiento o manipulación de datos, control de otros módulos o unacombinación de todos o algunos de estos.

    Los datos requeridos en un módulo pueden leerse en éste o pueden ser enviados a éste por elmódulo de control; y los resultados producidos por un módulo pueden ser impresos dentro delmódulo o remitirse al módulo de control para que sean utilizados por otro módulo cuando setransfiera el control a ellos.

    Se diseña cada módulo con independencia de los demás, y siguiendo un método ascendente odescendente, se llega hasta la descomposición final del problema en módulos en forma jerárquica.

    En pocas palabras, la técnica implica dos partes:

    1. Dividir el problema en sub-problemas más pequeños.

    2. Aplicar   la Metodología para resolver problemas a cada sub-problema; es decir para cadasub-problema se hace lo siguiente: * Planteamiento (Qué hace?)* Análisis del problema (Cómo lo hace?)* Diseño de la solución o flujograma* Codificación o programa

    22..22 TTééccnniiccaass ddee DDiisseeññoo MMoodduullaar r  Con el objeto de facilitar el diseño de algoritmos y la organización de los diversos elementos quelos componen se utilizan algunas técnicas que muestran una metodología a seguir para resolver losproblemas. Estas técnicas hacen que los programas sean más fáciles de escribir, verificar, leer ymantener. Algunas de las técnicas más conocidas son : Top Down o Diseño Descendente,

    Botton Up o Diseño Ascendente y Warnier Orr. 

    TOP DOWN:  técnica de diseño que consiste en tomar inicialmente, el problema completo, comoun todo y descomponerlo sucesivamente en problemas más pequeños y por lo tanto, de soluciónmás sencilla, representa cada módulo por medio de rectángulos, y las relaciones que existen entreellos por líneas rectas, siendo el primer módulo siempre el módulo raíz o de control (será la técnicade diseño adoptada para la asignatura, por esta razón será abordada más profundamente másadelante en este documento):

  • 8/19/2019 u II Modularidad

    3/28

  • 8/19/2019 u II Modularidad

    4/28

      4

    El Diseño Descendente o Top-down, esto es de arriba hacia abajo, es un procedimiento medianteel cual un problema se descompone en una serie de niveles o pasos sucesivos de refinamiento. Lametodología consiste en efectuar una relación entre las etapas de estructuración (o sub-problemas), de modo que se conecten o comuniquen unas con otras, mediante entradas y salidasde información. Es decir, se descompone el problema en etapas o estructuras jerárquicas, deforma que se puede considerar cada estructura desde dos puntos de vista: ¿qué hace esa etapa?y, ¿cómo lo hace? Cada nivel de refinamiento o sub-problema, conocidos ahora como módulos, se

    debe consideran de la siguiente forma:

    Desde el exterior:

    ¿ Qué hace ?Desde el interior:

    ¿ Cómo lo hace ?

     Para dibujar el diseño se debe tomar en cuenta lo siguiente:  Se representa cada sub-problema por medio de un rectángulo, incluyendo el modulo principal.  A cada módulo se le adjudica un nombre o identificador (igual que a las variables) y se escribe

    al centro del rectángulo.  La relación o dependencia de los módulos se dibuja por medio de líneas rectas.  El módulo raíz es el primero del diagrama y, es el único que se encuentra en ese nivel.  El módulo de un nivel n, le puede enviar datos a un módulo de más abajo.  Un módulo de un nivel le puede enviar resultados al módulo de quien depende.

    Debe recordarse que las líneas que conectan dos módulos indican en primer lugar dependencia entre ellos (el módulo del nivel superior es el que controla la ejecución del módulo del nivel inferior)y, en segundo lugar, comunicación, ya que entre ellos se pueden enviar datos. La comunicaciónentre módulos siempre es de forma vertical, nunca de forma horizontal. Por ejemplo, en eldiagrama de la figura anterior, el módulo 0 (o módulo principal) indica cuándo se ejecuta el módulo2 y puede enviarle datos; este módulo 2 al terminar su ejecución le puede enviar su resultado almódulo principal. Los módulos 2 y 3 no se relacionan entre ellos (ni dependencia nicomunicación).

    Módulo 2Módulo 1

    Módulo 1-2

    Módulo 3

    Módulo 3-1 Módulo 3-2 Módulo 3-3

    Módulo 3-2-1 Módulo 3-2-2

    Módulo 0

    Módulo 4

    Módulo 4-1

    Módulo 4-1-1

  • 8/19/2019 u II Modularidad

    5/28

      5

    Para dividir un problema en trozos del mismo, más pequeños, lo indicado es hacer una lista de lasacciones o cosas que deben realizarse y agruparlas de alguna manera conveniente; además debenser relacionadas, indicando por medio de líneas la dependencia entre los módulos, en la figuraanterior, el módulo 3-2-2 depende del módulo 3-2, éste depende del módulo 3 y éste a su vez delmódulo 0.

    Se sugiere que, lo primero que se puede hacer, es dividir el problema en tres partes: Entrada,

    Proceso y Salida, que como son las partes de todo algoritmo, casi siempre están presentes y si elproceso en sí es grande o complejo, se puede dividir en más partes.

    Comúnmente, se puede dejar la entrada de datos como parte del módulo principal y la salida puedeser un solo módulo o formar parte de los módulos de proceso; también se puede dejar la salida enel principal y diseñar un módulo de entrada de datos y desde luego los de proceso. En fin que nohay una regla para dividir un problema, cada programador divide y diseña los módulos queconsidere necesarios.

    Cada módulo puede contener acciones sólo de entrada, sólo de proceso, sólo de salida de datos o,una combinación de todos.

    Los datos con que trabaja un módulo se conocen como parámetros, y estos forman parte de losdatos de entrada, (pero no se leen), son enviados por el módulo que lo precede. Por ejemplo en lafigura anterior, los parámetros del módulo 1-2, deben ser facilitados por el módulo 1.

    Cada módulo puede producir resultados (datos de salida) que no se imprimen, sino que sonrequeridos por el módulo que lo precede y se les conoce como Valor(es) de Retorno, de nuevo enla figura anterior, el resultado del módulo 3-2-2 es o pude ser enviado al modulo 3-2. Un módulopuede tener uno o varios parámetros, pero sólo puede enviar un valor de retorno. El móduloprincipal no tiene parámetros ni valor de retorno.**************************************************************************************************************************************************************************************************************** 2.3 Análisis EstructuradoLa técnica de Análisis Estructurado se conoce también como la técnica “Divide y Vencerás”, ya

    que se descompone un problema en módulos independientes más simples, que son fáciles deresolver. Se diseña la solución de cada módulo con independencia de los demás. Lo que facilita elanálisis, el diseño del algoritmo y, desde luego, su codificación. Además, puesto que cada módulose considera independiente, varios programadores pueden diseñar por separado las soluciones adiferentes módulos, con lo cual se minimiza el trabajo o esfuerzo personal y el tiempo de diseñopara la solución completa.

     Algunas ventajas de programar modularmente son:  Disminuir la complejidad.   Aumentar la claridad y fiabilidad.  Posibilitar el uso repetitivo de las rutinas en el mismo o en diferentes programas.  Facilitar la ampliación del programa mediante nuevos módulos.

      Facilitar las modificaciones y correcciones al quedar automáticamente localizadas en unmódulo, lo cual indica que un programa modular es fácil de mantener y modificar.  Facilitar la escritura y depuración de programas (ejecutar, probar y optimizar).  Facilitar el control porque el desglose de un problema en módulos permite encomendar los

    módulos más complejos a los programadores más experimentados y los más sencillos a losprogramadores con menos pericia o experiencia.

     Ahora bien, independientemente de la técnica que se utilice para diseñar, para que este tipo deprogramación sea realmente efectiva, se debe establecer un  organigrama modular(representación gráfica de un algoritmo modular).

  • 8/19/2019 u II Modularidad

    6/28

      6

    22..44 RReeppr r eesseennttaacciióónn GGr r ááf f iiccaa ddee uunn AAllggoor r iittmmoo MMoodduullaar r  La representación gráfica de la solución de un problema mediante esta técnica, tiene variosflujogramas: uno que representa el módulo principal y, uno o varios que representan a cada uno delos módulos que se hayan diseñado. Recordar que a cada módulo se le debe asignar unidentificador o nombre, que lo diferencie de otros.

    Para indicar dentro del FLUJOGRAMA  principal que se hará uso de un subflujograma se utiliza el

    rectángulo con doble barra vertical, dentro del cual se escribe el nombre del módulo, a esto se leconoce como “invocación del sub-flujograma” o “llamada a un sub-flujograma”.

    Para diferenciar un subflujograma del flujograma principal, a los símbolos de inicio y fin se leañaden barras verticales; en el símbolo de inicio y fin, se escribe el identificador o nombre delmódulo y los parámetros de éste si los necesita; es muy común terminar un sub-flujograma con lapalabra retornar en el símbolo de fin, ya que al llegar a éste, se regresa el control de ejecución alflujograma principal o, al sub-flujograma que lo ha utilizado o invocado, también se escribe aquí elvalor de retorno si el módulo produce alguno. Las siguientes figuras muestran los símbolosdescritos anteriormente:

    o también:

    Invocación de unSub-flujograma

    Inicio de unSub-flujograma

    Fin de unSub-flujograma

    La representación gráfica (flujograma) de la solución de un problema descompuesto en formamodular, adopta la estructura siguiente:

    Subflujogramas

    Flujograma Principal

    Un sub-flujograma (módulo) puede ser invocado desde el flujograma principal o desde otro sub-flujograma, al terminar de ejecutarse se retorna al flujograma principal o al sub-flujograma que loinvocó. *****************************************************************************************************

    Nombre del

    módulo(parámetros)

    Nombre del módulo

    (Parámetros)

    Fin_Nombre del módulo,

    Valor de retorno

    Inicio

    Proceso1

    Nombre1

    Fin

    Nombre1

    Proceso2

    Fin_Nombre1

    Nombre2

    Proceso3

    Retornar

    Retornar valor de retorno

    Nombre2

    En donde: Proceso1, Proceso2 y Proceso3 pueden contener estructuras:  Secuenciales (lectura, escritura, asignación)  Selectivas (selección simple, doble o múltiple)  Iterativas (Mientras, Desde-hasta, Hasta que)

  • 8/19/2019 u II Modularidad

    7/28

      7

    2.5 Variables LocalesSon variables que se declaran dentro de un módulo, y mantienen su valor mientras este módulo seestá ejecutando; es decir que cuando se ejecuta otro módulo no existen en memoria , por lo tantono se pueden utilizar fuera del módulo donde fueron declaradas.

    2.6 Variables GlobalesEstas variables pueden ser referenciadas desde cualquier módulo. Lo cual significa que se pueden

    utilizar en todos los módulos, conservando su valor en todos ellos, siempre y cuando no semodifique; sin embargo, ese valor se puede cambiar en cualquier módulo que utilice la variableglobal y de allí en adelante lo conservará en todos los demás módulos que la utilicen hasta quealguno de ellos requiera modificarla nuevamente. 

    2.7 Concepto de FunciónUn sub-algoritmo es un algoritmo que realiza una tarea específica dentro de la solución de unproblema; es decir, que resuelve una parte de un problema. Si se representa por medio de undiagrama se le conoce como sub-flujograma. Puede ser llamado o invocado desde el flujogramaprincipal o cualquier otro sub-flujograma. Todo sub-flujograma puede recibir uno o varios datos(parámetros) de quien lo invoca, pero sólo puede enviar un único resultado (valor de retorno).

    Las funciones son un conjunto de instrucciones que realizan una tarea específica. En generaltoman ciertos valores de entrada, llamados parámetros y proporcionan un valor de salida o valor deretorno; aunque en el Lenguaje C, tanto unos como el otro son opcionales, y pueden no existir.Todos los programas en C contienen, como mínimo, una que es la función main .

    Una función muy especial es la función main. Se trata de la función de entrada, y debe existirsiempre, ya que será la que tome el control cuando se ejecute el programa. Existen reglas para eluso de los valores de retorno y de los parámetros de la función main, pero de momento se usarácomo int main() o int main(void), con un entero como valor de retorno y sin parámetros de entrada.El valor de retorno indicará si el programa ha terminado sin novedad ni errores retornando cero,cualquier otro valor de retorno indicará un código de error.

    Entonces, una función es un grupo de instrucciones con un objetivo en particular que se ejecuta alser llamada desde otra función o procedimiento. Una función puede llamarse múltiples veces eincluso llamarse a sí misma (función recurrente). En general, deben tener un nombre único en elámbito para poder ser llamadas, un tipo de dato del resultado a ser obtenido, una lista deparámetros de entrada y su código.

    Las funciones pueden recibir datos desde afuera al ser llamadas a través de los parámetros ydeben entregar un resultado. Se diferencian de los procedimientos porque estos no devuelven unresultado.

    Los parámetros o argumentos de una función son los datos que son parte de las entradas delmódulo, pero dentro del cuerpo no se leen, deben de declararse en la invocación de la función y en

    el inicio de la misma. Una función puede tener o no parámetros.

    Los parámetros se comportan como variables locales, creándose al entrar a la función ydestruyéndose al salir de ésta; es decir que, los parámetros reciben sus valores del módulo queinvoca la función, y con estos valores se trabajará dentro de ella.

    Se conoce como valor de retorno aquel que se genera en la función y se envía al módulo de quiendepende; es decir, el módulo que lo invocó.

    http://www.alegsa.com.ar/Dic/funcion.phphttp://www.alegsa.com.ar/Dic/funcion.phphttp://www.alegsa.com.ar/Dic/ejecutar.phphttp://www.alegsa.com.ar/Dic/tipo%20de%20dato.phphttp://www.alegsa.com.ar/Dic/funcion.phphttp://www.alegsa.com.ar/Dic/funcion.phphttp://www.alegsa.com.ar/Dic/parametros.phphttp://www.alegsa.com.ar/Dic/parametros.phphttp://www.alegsa.com.ar/Dic/funcion.phphttp://www.alegsa.com.ar/Dic/funcion.phphttp://www.alegsa.com.ar/Dic/tipo%20de%20dato.phphttp://www.alegsa.com.ar/Dic/ejecutar.phphttp://www.alegsa.com.ar/Dic/funcion.phphttp://www.alegsa.com.ar/Dic/funcion.php

  • 8/19/2019 u II Modularidad

    8/28

      8

    Entonces, una función es un conjunto de líneas de código que realizan una tarea específica ypuede retornar un valor. Las funciones pueden tomar parámetros que modifiquen sufuncionamiento. Las funciones son utilizadas para descomponer grandes problemas en tareassimples y para implementar operaciones que son comúnmente utilizadas durante un programa y deesta manera reducir la cantidad de código. Cuando una función es invocada se le pasa el control ala misma, una vez que esta finalizó con su tarea el control es devuelto al punto desde el cual lafunción fue llamada.

    2.8 Definición de una Función

    La forma genérica de definir funciones en C es:t ipoValorRegreso  nombreFuncion (parámetr os ){declaraciones  sentencias

    }

    tipoValorRegreso es el tipo de dato del resultado de llamar a la función, puede ser un entero, unacadena, un carácter, etc. o también puede ser void que indica que esa función no devolverá ningún

    valor.

    nombreFuncion es un identificador o nombre válido. Por lo general se aconseja poner un nombrecorto que especifique lo que hace esa función.

    Los parámetros son una lista, separada por comas, que especifica los datos que se espera recibir.Si se escribe void se entiende que esa función no necesita ningún parámetro.

    La función tiene un cuerpo o bloque, donde están las declaraciones y las sentencias. En lasdeclaraciones se especifican variables locales (sólo podrán ser usadas dentro de esa función). Nose deben declarar las variables que llegan por parámetro. No se pueden definir funciones dentro deotra función, pero sí se puede llamar a una función dentro de otra función (incluso se puede llamar

    a sí misma que es el caso de las funciones recursivas).

    Dentro del enunciado de las funciones se debe regresar el control al punto desde donde se invocóa dicha función. En el caso de las funciones que no regresen resultados, estas finalizan cuandotermina de ejecutarse la última línea de la función o cuando se llega al enunciado return. Si lafunción devuelve un resultado, se debe especificar: return expresión; 

    Para terminar, se debe recordar que la mejor práctica al programar es modularizar, o sea, crearmúltiples funciones simples que trabajarán juntas para crear un programa complejo.

    Más específicamente, la sintáxis de una definición de función en DevC es:[extern|static] [modificadores] ()

    { [sentencias]}

    Opcionalmente (indicado por la presencia de corchetes) posee una palabra que especifica el tipode almacenamiento, puede ser extern  o static. Si no se especifica ninguna, por defecto seráextern. Esto quiere decir que son accesibles desde cualquier punto del programa, aunque seencuentren en otros archivos fuente del mismo programa. En contraposición las funcionesdeclaradas static sólo son accesibles dentro del archivo fuente donde se definen.

    http://www.alegsa.com.ar/Notas/111.phphttp://www.alegsa.com.ar/Dic/caracter.phphttp://www.alegsa.com.ar/Dic/variable.phphttp://www.alegsa.com.ar/Notas/111.phphttp://www.alegsa.com.ar/Dic/programar.phphttp://www.alegsa.com.ar/Dic/programar.phphttp://www.alegsa.com.ar/Notas/111.phphttp://www.alegsa.com.ar/Dic/variable.phphttp://www.alegsa.com.ar/Dic/caracter.phphttp://www.alegsa.com.ar/Notas/111.php

  • 8/19/2019 u II Modularidad

    9/28

      9

    Los programas complejos se escriben normalmente usando varios archivos fuente. Estos archivosse compilan separadamente y se enlazan todos juntos, dentro de un Proyecto. Esto es una granventaja durante el desarrollo y depuración de grandes programas, ya que las modificaciones en unarchivo fuente sólo obligarán a compilar dicho archivo fuente, y no el resto, con el consiguienteahorro de tiempo. La definición de las funciones y clases puede hacerse dentro de los archivosfuente o también pueden enlazarse desde bibliotecas compiladas previamente.Por ejemplo si un programador quiere ofrecer ciertas funciones agrupadas bajo una biblioteca para

    realizar una tarea en particular, pero internamente necesita crear y usar unas funciones auxiliares,entonces restringe el acceso a esas funciones auxiliares, porque no pertenecen al juego defunciones que quiere ofrecer. Así:// "oper.cpp"

    // Ejecuta una instrucción de un procesador especializado

    // para realizar cualquier operación aritméticastatic double instAritmetica( unsigned int nInst, double param1, double param2 )

    {

    ...

    }

    double sumar( double der, double izq )

    {

    return instAritmetica( 1, der, izq );}

    double restar( double der, double izq )

    {

    return instAritmetica( 2, der, izq );

    }

    double multiplicar( double der, double izq )

    {

    return instAritmetica( 3, der, izq );

    }

    double dividir( double der, double izq )

    {

    return instAritmetica( 4, der, izq );

    }

    De esta manera, cualquier programador tendrá acceso a las cuatro funciones aritméticas que elprogramador original quiso ofrecer. No se ofrece la función, 'instAritmetica()', porque no pertenece aese conjunto de funciones creado por el programador original.

    Otro ejemplo puede ser a la hora de limitar la cantidad de funciones ofrecidas siguiendo unadocumentación establecida por los diseñadores. Un jefe de proyecto da una lista de las funcionesque se deben implementar, pero no limita mucho en cuanto a la forma de implementarlas. Paraimplementar las funciones indicadas, se pudieron haber creado unas cuantas funciones más paraayudar en la creación de las demás. Esas otras funciones auxiliares que fueron creadas no formanparte del cometido original, y como se limitan a un código fuente, se decides usar 'static'.

    Otra razón puede ser que existan coincidencias con las funciones que se usan en varios archivosfuente. Para separar una función de las otras "versiones", se usa 'static' para no compartirlas y asíevitar problemas de conflicto de nombres.

    El tipoValorRetorno, que puede ser void, si no se necesita valor de retorno. En C, si no seestablece, será int por defecto, aunque en general se considera una mala técnica de programaciónomitir el tipo de valor de retorno de una función. En C++ es obligatorio indicar el tipo del valor deretorno.

  • 8/19/2019 u II Modularidad

    10/28

      10

    Modificadores es, como lo indican los corchetes, opcional. Tienen un uso muy específico que serátratado posteriormente.

    Es muy útil y recomendable que el identificador de la función posea un nombre que indique, lomás claramente posible, qué es lo que hace la función, y que permita interpretar qué hace elprograma con sólo leerlo. Cuando se precisen varias palabras se utilizará la Técnica Camel yaexplicada en la Unidad I.

    La lista de declaraciones de parámetros  entre paréntesis, son los valores de entrada (y enocasiones también de salida). Para la función se comportan exactamente igual que variables, y dehecho cada parámetro se declara igual que una variable. Una lista de parámetros es un conjunto dedeclaraciones de parámetros separados con comas. Puede tratarse de una lista vacía.

    Una definición contiene además las instrucciones con las que la función realizará su trabajo, esdecir, su código o conjunto de sentencias que la componen. El cuerpo de la función representa elcódigo que será ejecutado cuando se llame a la función. El cuerpo de la función se encierra entrellaves "{}". Por ejemplo:

    int Mayor(int a, int b)

    {

    if (a > b) return a;else return b;

    }

    La definición de una función sirve para indicar al compilador los tipos de retorno y los de losparámetros de una función, de modo que compruebe si son del tipo correcto cada vez que se useesta función dentro del programa, o para hacer las conversiones de tipo cuando sea necesario.Para el ejemplo expuesto, se indica al compilador que existe dentro del programa una función"Mayor" que admite dos parámetros de tipo int y que devolverá un valor de tipo int.

    2.9 Invocación de una Función

    La invocación o llamada de una función es la sentencia o instrucción a través de la cual se haceuso de ella y está escrita dentro del módulo principal o del módulo demandante de la operación arealizar. Por ejemplo, una forma de invocar la función Mayor descrita anteriormente podría ser:

    //Programa que lee dos enteros y determina el mayor de ellos

    #include

    main()

    {

    int n1, n2, nMayor;

    printf(“Introduzca primer número entero a comparar: “); scanf (“%i”, &n1); 

    printf(“Introduzca segundo número entero a comparar: “); 

    scanf (“%i”, &n2); 

    nMayor = Mayor(n1, n2); //Invocación o llamada de la función Mayor

    printf(“El número mayor es: “, nMayor); 

    getch();

    }

  • 8/19/2019 u II Modularidad

    11/28

      11

    2.10 Parámetros de una FunciónSe va considerar el caso en el cual se desea crear la función cuadrado(), que deberá devolver elcuadrado de un número real (de punto flotante), es decir, cuadrado() aceptará números de puntoflotante y regresará una respuesta como número flotante. (Nota: aunque para la función deejemplo, el tipo de retorno coincide con el tipo de parámetro pasado, algunas veces las cosaspueden cambiar, es decir, no es obligatorio que una función reciba un parámetro de un tipo y quetenga que regresar una respuesta de dicho tipo).

    // Regresar el cuadrado de un númerodouble cuadrado(double n)

    {

    return n*n;

    }

    Normalmente, las funciones operan sobre ciertos valores pasados a las mismas ya sea comoconstantes literales o como variables, aunque se pueden definir funciones que no recibanparámetros. Existen dos formas en C de pasar parámetros a una función; por referencia o por valor.El hecho es que si en una declaración de función se declaran parámetros por referencia, a losmismos no se les podrá pasar valores literales ya que las referencias apuntan a objetos (variables ofunciones) residentes en la memoria; por otro lado, si un parámetro es declarado para ser pasadopor valor, el mismo puede pasarse como una constante literal o como una variable. Los parámetros

    pasados por referencia pueden ser alterados por la función que los reciba, mientras que losparámetros pasados por valor o copia no pueden ser alterados por la función que los recibe, esdecir, la función puede manipular a su antojo el parámetro, pero ningún cambio hecho sobre estese reflejará en el parámetro original.

    La función cuadrado() es un clásico ejemplo que muestra el paso de parámetros por valor, en esesentido la función recibe una copia del parámetro n. En la misma función se puede observar que serealiza un cálculo ( n*n ), sin embargo el parámetro original no sufrirá cambio alguno, esto seguirásiendo cierto aún cuando dentro de la función hubiera una instrucción parecida a n = n * n; o n*=n;.Para mostrar un ejemplo del paso de parámetros por referencia, se va a retomar el caso de lafunción cuadrado, salvo que en esta ocasión se cambiará ligeramente la sintáxis para definir lamisma:

    // Regresar el cuadrado de un númerodouble cuadrado2(double &n)

    {

    n *= n;

    return n;

    }

     Al poner a prueba las funciones cuadrado() y cuadrado2() se podrá verificar que la primera de estasno cambia el valor del parámetro original, mientras que la segunda sí lo hace.Para llamar o invocar a la función cuadrado() vista anteriormente, se puede emplear:

    cout

  • 8/19/2019 u II Modularidad

    12/28

      12

    Bajo ciertas circunstancias se deseará escribir funciones que no regresen valor alguno y para ellose puede declarar a la función como void. La palabra reservada void es utilizada para declararfunciones sin valor de retorno y también para indicar que una función específica no requiere deparámetros. Por ejemplo, la función pausa() que se verá en seguida, no devolverá valor alguno y lamisma no requiere de parámetros.

    // Requiere de la librería iostream

    void pausa(void){

    cout >a donde a es la variable de entrada donde se va a guardar lainformación solicitada al usuario. cout

  • 8/19/2019 u II Modularidad

    13/28

      13

    Para ver un ejemplo más, se va a considerar el caso de la función binstr() del siguiente programa.Se va a modificar dicha función de manera que sirva para convertir números decimales en cadenasnuméricas y cuya base de conversión sea pasada como parámetro. Es decir, la función podráconvertir números decimales a: binario, octal, decimal, hexadecimal, etc.; y la única condición seráque la base indicada esté entre el 2 y el 36, inclusive. Nota: Ya que la función servirá para convertirnúmeros a cualquier representación será nombrada como numstr()  en lugar de binstr(). Si lafunción es invocada sin el parámetro base regresará una cadena de dígitos decimales:

    #include

    #include

    int main()

    {

    int n = 128;

    cout

  • 8/19/2019 u II Modularidad

    14/28

      14

    II.  TOP DOWNGrandes pasos o cosas que hacer:1. Leer y validar los datos2. Convertir a minutos3. Convertir a segundos4. Imprimir

    Con los pasos anteriores, se decide que se van a diseñar 4 módulos y el principal:  uno de entrada o lectura de datos, que además los valida;  otro que convierte las horas en minutos;  otro que convierte los minutos a segundos y  el cuarto que imprime los resultados.

    El módulo principal, llamado Tiempos, por lo que se desea que haga; solo recibe los datos, invocalos otros módulos en el orden debido y envía los parámetros. El diagrama Top Down asociado es:

    III.  APLICACIÓN METODOLOGÍA PARA RESOLVER PROBLEMAS (por  módulo)a. MÓDULO leer:

    ** Qué Hace?  Lee y valida los datos.

    Entrada de datos Salida de datos

    Cantidad de horas a convertir Devuelve el número de horas

    ** Cómo lo hace?Datos de Salida:Variables de Salida: No hay, devuelve el número de horas 

    Datos de EntradaVariables de Entrada:

    Nombre Tipo Descripciónhora entero Representa el número de horas a convertir, variable local

    Parámetros:  No hay, la función no tiene parámetros.

    Constantes: No existen.Restricciones: hora >0Proceso: No hay, solo lee y valida el número de horasVariables de Proceso: No hay

    tiempos

    segundosminutosleer imprimir

  • 8/19/2019 u II Modularidad

    15/28

      15

    Diseño de Solución: Sub-flujograma: 

    b. MÓDULO minutos:

    ** Qué Hace?  Convierte las horas en minutos.

    Entrada de datos Salida de datos

      Recibe la cantidad de horas   Devuelve el número de minutos

    ** Cómo lo hace?

    Datos de SalidaVariables de Salida: No hay, devuelve el numero de minutos Datos de Entrada: Variables de Entrada: No hay.

    Parámetros:Nombre Tipo Descripción

    h Entero Representa el número de horas a convertir

    h: Número de horas a convertir, leídas en el módulo leer.

    Constantes: El número de minutos que tiene una hora: 60.

    Restricciones:  No hay

    Proceso: min = 60 * h

    Variables de Proceso:Nombre Tipo Descripción

    min Entero Representa el número de minutos, variable local

    leer ( )

    hora

    Mientras hora

  • 8/19/2019 u II Modularidad

    16/28

      16

    Diseño de Solución Sub-flujograma:

    c. MÓDULO segundos:** Qué Hace?  Convierte los minutos en segundos.

    Entrada de datos Salida de datos

    Recibe la cantidad de minutos Devuelve el número de segundos

    ** Cómo lo hace?Variables de Salida: No hay, devuelve el número de segundos 

    Variables de Entrada: No hay.

    Parámetros:Nombre Tipo Descripción

    m entero Representa el número de minutos a convertir

    Constantes: La cantidad de segundos que tiene un minuto: 60.

    Restricciones: No hay

    Proceso: seg = 60 * m

    Variables de Proceso:Nombre Tipo Descripción

    seg entero Representa el número de segundos, variable local

    Diseño de Solución Sub-flujograma:

    segundos ( m )

    Retornar seg

    seg = 60 * m

    minutos ( h )

    Retornar min

    min = 60 * h

  • 8/19/2019 u II Modularidad

    17/28

      17

    d. MÓDULO imprimir:** Qué Hace?  Imprime horas, minutos y segundos.

    Entrada de datos Salida de datos

      Recibe la cantidad de horas,minutos y segundos

      Cantidad de horas  Cantidad de minutos  Cantidad de segundos

    ** Cómo lo hace?Variables de Salida:

    Nombre Tipo DescripciónHo entero Representa el número de horas, variable localMi entero Representa el número de minutos, variable localSe entero Representa la cantidad de segundos, variable local

    Variables de Entrada: No hay, recibe como parámetros el número de horas, minutos y segundos.

    Parámetros:Ho, Mi, Se: Número de horas, minutos y segundos a imprimir leídos oCalculados en los otros módulos.

    Constantes: No existen.

    Restricciones: No hay

    Proceso: No hay

    Variables de Proceso: No hay

    Diseño de Solución Sub-flujograma:

    im rimir ho mi se

    Retornar

    “No. Horas”, ho 

    “Equivalentes a:” 

    mi, “Minutos” se,“ Se undos” 

  • 8/19/2019 u II Modularidad

    18/28

      18

    e. MÓDULO Principal:** Qué Hace?  Llama a los otros módulos y Recibe-Asigna los resultados.

    Entrada de datos Salida de datos

      Recibe la cantidad de horas  Recibe la cantidad de minutos  Recibe la cantidad de segundos 

      Envía la cantidad dehoras, minutos ysegundos

    ** Cómo lo hace?Variables de Salida: No hay, envía como parámetros: el número de horas, minutos y segundos ala función imprimir.Variables de Entrada: No hay, recibe los valores de retorno de los otros módulos: el número dehoras, minutos y segundosParámetros:  No hay. Constantes: No existen.Restricciones: No hay

    Proceso: Invoca los módulos, envía parámetros y recibe-asigna los resultados:numH = Leer( ) //resultado de LeernumM = minutos( numH ) //resultado de minutosnumS = segundos( numM ) //resultdo de segundos

    Variables de Proceso:Nombre Tipo DescripciónnumH entero Representa el número de horas, variable localnumM entero Representa el numero de minutos, variable localnumS entero Representa el número de segundos, variable local

    Diseñe de solución Flujograma:

    Inicio

    Fin

    numH = leer ()

    numM = minutos(num_h)

    numS = segundos(num_m)

    imprimir ( numH, numM, numS)

  • 8/19/2019 u II Modularidad

    19/28

      19

    #include

    #include

    // Convierte una cantidad de horas en minutos y segundos

    // Declaracion y Definicion de Funciones

    int leer () {

    // Funcion que lee desde teclado la cantidad de horas a convertir

    int hora;

    printf ("Digite el numero de horas: ");

    scanf ("%i", &hora);

    while (hora

  • 8/19/2019 u II Modularidad

    20/28

      20

    Ejemplo 2Diseñar una solución que simule una calculadora sencilla; es decir, que realice las operacionesaritméticas básicas: SUMA, RESTA, MULTIPLICACIÓN Y DIVISIÓN. El programa debe permitirrealizar varias operaciones e imprimir cada vez: el nombre de la operación realizada, los datos, elresultado obtenido y, el número total de operaciones que se realizaron.

    I. PLANTEAMIENTO GENERALEntrada de datos Salida de Datos

      Datos a operar    Tipo de operación

    deseada 

      Nombre de la operación  Datos Iniciales  Resultado  No. de operaciones realizadas

    II. TOP- DOWNEl tener una idea de lo que se va a hacer ayuda mucho a decidir cuantos módulos se van a diseñar

    y la relación que existe entre ellos; por lo tanto, las grandes cosas o pasos que se deben realizarson: 1. Leer datos2. Elegir la Operación3. Operar (producir el resultado)4. Imprimir el resultado5. Contar las operaciones

    De aquí se puede inferir que se va a tener un módulo para cada operación aritmética; además elmódulo principal va a leer los datos y es necesario validarlos, luego los envía a los módulos,también va a contar e imprimir el número de veces que se opera. El top-down queda así:

    III. ANÁLISIS ESTRUCTURADOa. MODULO suma

    ** Qué hace?: Suma dos números e imprime: la palabra “SUMA”, losnúmeros sumados y el resultado de la suma

    Entrada de datos Salida de Datos

      Recibe los dosnúmeros a sumar  

      Mensaje: “SUMA”   Datos Iniciales o sumados  Resultado

    Principal

    divimultirestasuma

  • 8/19/2019 u II Modularidad

    21/28

      21

    ** Cómo lo Hace?:Variables de Salida.

    Nombre Tipo Descripcióna Real El primer operandob Real El segundo operandor Real El resultado de la operación

    Variables de Entrada: No hay. 

    Parámetros: a, b: Los dos números que se van a sumar.

    Constantes: No existen.Restricciones: No hay.Proceso: r = a + bVariables de Proceso: No hay.

    Flujograma: (Diseño de Solución)

    b. MÓDULO resta** Qué hace ?:  Resta dos números e imprime: la palabra “RESTA”, los

    números restados y el resultado de la diferencia

    Entrada de datos Salida de Datos

      Recibe los dosnúmeros a restar  

      Mensaje: “RESTA”   Datos Iniciales  Resultado

    suma a b

    “SUMA” 

    “Datos”, a,b 

    r = a + b

    “Resultado de la

    o eración:” r

    Retornar

  • 8/19/2019 u II Modularidad

    22/28

      22

    ** Cómo lo Hace?:Variables de Salida.

    Nombre Tipo Descripcióna Real El primer operandob Real El segundo operandor Real El resultado de la operación

    Variables de Entrada: No hay, se reciben los datos a restar (a,b)Parámetros: a, b: Los dos números que se van a restar.Constantes: No existen.Restricciones: No hay.Proceso:

    r = a - b

    Variables de Proceso: No hay. 

    Diseño de Solución Sub-flujograma:

    c. MÓDULO multi** Qué hace?:  Multiplica dos números e imprime: la palabra“MULTIPLICACION”, los números multiplicados y el resultado del producto. 

    Entrada de datos Salida de Datos

      Recibe los dosnúmeros amultiplicar  

      Mensaje: “MULTIPLICACIÓN”   Datos Iniciales  Resultado

    resta a b

    “RESTA” 

    “Datos”, a,b 

    r = a - b

    “Resultado de lao eración:” r

    Retornar

  • 8/19/2019 u II Modularidad

    23/28

      23

    ** Cómo lo Hace?:Variables de Salida.

    Nombre Tipo Descripcióna Real El primer operandob Real El segundo operandor Real El resultado de la operación

    Variables de Entrada: No hay.Parámetros: a, b: Los dos números que se van a multiplicar.Constantes: No existen.Restricciones: No hay.Proceso: r = a * bVariables de Proceso: No hay. 

    Diseño de Solución Sub-flujograma:

    d. MÓDULO divi** Qué hace?:  Divide dos números e imprime: la palabra “DIVISION”, los números dividosy el resultado de la división 

    Entrada de datos Salida de Datos

      Recibe los dosnúmeros a dividir  

      Mensaje: “DIVISION”   Datos Iniciales  Resultado

    multi a b

    “MULTIPLICACIÓN

    “Datos”, a,b 

    r = a * b

    “Resultado de laoperación:”, r

    Retornar

  • 8/19/2019 u II Modularidad

    24/28

      24

    ** Cómo lo Hace?:Variables de Salida.

    Nombre Tipo Descripcióna Real El primer operandob Real El segundo operandor Real El resultado de la operación

    Variables de Entrada: No hay,Parámetros: a, b: Los dos números que se van a dividir.Constantes: No existen.Restricciones: No hay.Proceso: Hay que recordar que la división por cero no se puede ejecutar, por lo tanto:

    ¿b!=0? Si: r = a/bNo:  imprimir a, b “no se pueden dividir” 

    Variables de Proceso: No hay. 

    Diseño de solución Sub-flujograma

    No Sib!=0

    divi a b

    “DIVISION” 

    “Datos”, a,b 

    r = a / b

    “Resultado de lao eración:” r

    Retornar

    a, “y”, b, “No sepueden dividir” 

  • 8/19/2019 u II Modularidad

    25/28

      25

    e. MÓDULO principal** Qué hace?:  Lee dos datos reales, elige la operación a realizar y cuenta lasoperaciones hechas en total.

    Entrada de datos Salida de Datos

      Dos datos a operar  Tipo de operación  Valor para hacer

    otro cálculo

      Número de operacionesrealizadas

      Envía los datos a operar

    ** Cómo lo Hace?:Variables de Salida:

    Nombre Tipo Descripcióni Real El contador de las operaciones realizadas. Vi=0, Vc=1,

    Vf.?

    Debe enviar o mandar los dos números a operar a cada módulo

    Variables de Entrada:Nombre Tipo Descripción

    x Real El primer operandoy Real El segundo operando

    op Entero El tipo de la operación a realizar 1: suma 2: resta 3.multiplicación 4: división

    otra Entero Indica si se requiere otra operación, 1: otro cálculo

    Parámetros: No hay, la función principal nunca tiene parámetros.

    Constantes: No existen.

    Restricciones: op>=1 && op

  • 8/19/2019 u II Modularidad

    26/28

      26

    Diseño de Solución (Flujograma):

    Si

    1

    Inicio

    i = 0

    “Para haceruna operación

    digite 1” 

    otra

    otra==1

    op

    “1: Suma 2: Resta3: Mutiplicación4: División” 

    MIENTRAS

    op4

    “Error, debeser entre 1 y4” 

    op

    x, y

    1

    op

    3

    2

    4

    suma x,

    resta x,

    multi(x,y)

    divi(x,y)

    i = i + 1

    “Para hacerotra operación

    digite 1” 

    otra

    2

    3

    2

    “Se realizaron:”, i, “operaciones” 

    Fin

    No

  • 8/19/2019 u II Modularidad

    27/28

  • 8/19/2019 u II Modularidad

    28/28

    // Modulo Principal main () {

    int i, otra, op;float x,y; //Numeros a operari=0; printf ("\nPara hacer una operacion digite 1 ");scanf("%i", &otra); while (otra==1) {

     printf("\n1: Suma"); printf("\n2: Resta"); printf("\n3: Multiplicacion"); printf("\n4: Division"); printf("\nDigite el numero de la opcion elegida: ");scanf ("%i", &op); while (op4) {

     printf ("\nError, debe ser entre 1 y 4 ");scanf ("%i", &op);

    } printf("\nIntroduzca los dos numeros a operar: ");scanf ("%f %f", &x, &y);switch (op) {case 1:

    suma (x,y); break;

    case 2:resta (x,y); break;

    case 3:

     multi (x,y); break;

    case 4:divi (x,y); break;

    }i++; printf("\nPara hacer otra operacion, digite 1 ");scanf("%i", &otra);

    } printf ("\nSe realizaron %i operaciones", i);

    getch(); //pausa}