Beruflich Dokumente
Kultur Dokumente
Ciclo II/2013
Programacin Modular.
Cuando los problemas que vamos a resolver son muy grandes o complejos, el disear la solucin se convierte en una actividad lenta, es aqu donde se utiliza la Programacin Modular, ya que este tipo de programacin facilita la tarea de programar y permite elaborar estos programas de manera ms rpida y eficaz.
La experiencia ha demostrado que la mejor manera de desarrollar una solucin y mantenerla, es construirla a partir de piezas pequeas, que la hacen ms manejable.
PROGRAMACIN MODULAR o ANLISIS ESTRUCTURADO. La Programacin modular es uno de los mtodos de diseo ms fciles, flexibles, y potentes para programar y mejorar la productividad de los programas. Esta tcnica divide el problema en pequeas partes o sub-problemas y se debe disear una solucin para cada una de esas partes.
A las divisiones o partes de un problema y a las soluciones o algoritmos que los resuelven, se les conoce como mdulos;
Para resolver cada sub-problema (o mdulo), ste se debe plantear, analizar, disear su algoritmo y codificarlo, individualmente. Recordemos que la solucin de cada sub-problema resuelve slo una parte del problema; la solucin completa del mismo est formada por el conjunto de todas y cada una de las pequeas soluciones diseadas y la interrelacin de todas ellas.
Todo problema resuelto por esta tcnica tiene un algoritmo denominado PRINCIPAL, comnmente conocido como: mdulo raz, mdulo conductor o mdulo de control; ya que controla todo lo que sucede, tanto en ese mdulo como en todos los dems, transfiriendo el control de ejecucin a cada mdulo en el momento que sea requerido. De esa forma, cada mdulo puede realizar su funcin o tarea, pero al terminar regresa el control de ejecucin al algoritmo o mdulo principal. La solucin de cada mdulo se le conoce como SUBALGORITMO. Un problema resuelto mediante programacin modular genera un algoritmo modular que consta de un algoritmo principal y uno o varios subalgoritmos. El algoritmo principal debe contener las llamadas a los sub-algoritmos y podra realizar una o varias tareas. Cada sub-algoritmo como representacin de la solucin de un mdulo tiene todas las propiedades de un algoritmo. Adems, estos pueden contener tareas simples que Slo se ejecutan una vez o, lo que es ms frecuente, tareas repetitivas que se ejecutan varias veces y son llamadas para ejecutarse desde el algoritmo principal. Si la tarea asignada a un mdulo es muy compleja (o muy grande), debe dividirse todava en otro u otros mdulos ms pequeos. El proceso sucesivo de subdivisin de mdulos contina hasta que cada mdulo tenga solamente una tarea o accin especfica que ejecutar, esta tarea puede ser de entrada, salida, procesamiento o manipulacin de datos, control de otros mdulos o una combinacin de todos o algunos de estos. Los resultados producidos por un mdulo pueden ser utilizados por otro mdulo cuando se transfiera el control a ellos. Se disea cada mdulo con independencia de los dems, y siguiendo un mtodo ascendente o Descendente, se llega hasta la descomposicin final del problema en mdulos en forma y6nJerrquica. En definitiva la tcnica consiste en: Dividir el problema en sub-problemas ms pequeos. Aplicar la Metodologa para resolver problemas a cada sub-problema; es decir para cada sub-problema se hace lo siguiente:
_ Planteamiento (Qu hace?) _ Anlisis del problema (Cmo lo hace?) _ Diseo de la solucin o flujograma _ Codificacin o programa
En la figura anterior, el mdulo 3-2-2 depende del mdulo 3-2, ste depende del mdulo 3 y ste a su vez del mdulo 0. Lo primero que podemos hacer es dividir el problema en tres partes: Entrada, Proceso y Salida, Como son las partes de todo algoritmo, siempre estn presentes y si el proceso en s es grande o complejo, se puede dividir en ms partes. Con la prctica veremos que se puede dejar la entrada de datos como parte del mdulo principal y que la salida puede ser un solo mdulo o formar parte de los mdulos de proceso; tambin podemos dejar la salida en el principal y disear un mdulo de entrada de datos y desde luego los de proceso. En fin que no hay una regla para dividir un problema, cada uno divide y disea los mdulos que considere necesarios. Cada mdulo puede contener acciones solo de entrada, solo de proceso, solo de salida de datos o, una combinacin de todos. Los datos con que trabaja un mdulo se conocen como , y estos forman parte de los datos de entrada, son enviados por el mdulo que lo precede por ejemplo en la figura anterior, los parmetros del mdulo 1-2, deben ser facilitados por el mdulo 1. Adems, cada mdulo puede producir resultados (datos de salida) que no se imprimen, sino que son requeridos por el mdulo que lo precede y, a estos datos, se les conoce como
parmetros
Valor de
Retorno.
Concepto de mdulo: Un mdulo representa siempre una funcin o tarea determinada y en general consta de: Un conjunto de instrucciones que se procesan de una sola vez y se referirn mediante un nombre por el que posteriormente sern llamados o invocados desde diferentes puntos de un programa. Un mdulo debe tener un punto de entrada y un punto de salida y puede ser: un programa, una funcin, un procedimiento o subrutina.
Ejemplo Se desea disear un programa que lea una serie de n nmeros de un archivo o del teclado, los visualice ordenadamente y calcule la frecuencia de aparicin de cada uno de ellos. La descomposicin del problema en mdulos puede ser: Entrada de nmeros de la lista. Ordenar los nmeros de la lista. Visualizar lista ordenada. Calcular y visualizar frecuencia de aparicin.
Mdulo Raz
Ordenar lista
Visualizar lista
Ejemplo de modularidad.
VENTAJAS DE UTILIZAR PROGRAMACIN MODULAR (o Anlisis Estructurado). La tcnica de Anlisis Estructurado se conoce tambin como la tcnica
Divide y
_ Disminuir la complejidad _ Aumentar la claridad y fiabilidad. _ Posibilita el uso repetitivo de las rutinas en el mismo o en diferentes programas. _ Facilitar la ampliacin del programa mediante nuevos mdulos. _ Facilitar las modificaciones y correcciones al quedar automticamente localizadas en un mdulo, lo cual indica que un programa modular es fcil de mantener y modificar. _ Un programa modular es ms fcil de escribir y depurar (ejecutar, probar y poner a punto). _ Un programa modular es ms fcil de controlar. El desglose de un problema en mdulos permite encomendar los mdulos ms complejos a los programadores ms experimentados. y los ms sencillos a los programadores con menos pericia o experiencia.
REPRESENTACIN GRFICA DE UN ALGORITMO MODULAR La representacin grfica de la solucin de un problema mediante esta tcnica, tiene varios flujogramas: uno que representa el mdulo principal y uno o varios ms, que representan a cada uno de los mdulos que se hayan diseado. A cada mdulo se le debe asignar un identificador o nombre, que lo diferencie de otros. Para indicar dentro del FLUJOGRAMA principal que se har uso de un subflujograma se utiliza el rectngulo con doble barra vertical, dentro del cual se escribe el nombre del mdulo, a esto se le conoce como llamada a un sub-flujograma o invocacin del sub-flujograma o sub rutina. Para diferenciar un subflujograma del flujograma principal, a los smbolos de inicio y fin se le aaden barras verticales; en el smbolo de inicio y fin, se escribe el identificador o nombre del mdulo y los parmetros de ste si los necesita; es muy comn terminar un sub-flujograma con la palabra retornar en el smbolo de fin, ya que al llegar a ste, se regresa el control de ejecucin al flujograma principal o, al sub-flujograma que lo ha utilizado o invocado, tambin se escribe aqu el valor de retorno si el mdulo produce alguno. La representacin grfica (flujograma) de la solucin de un problema descompuesto en forma modular, adopta la estructura siguiente:
En donde: Proceso1, Proceso2 y Proceso3 pueden contener estructuras: Secuenciales (lectura, escritura, asignacin) Selectivas (seleccin simple, doble o mltiple) Iterativas (Mientras, Desde-hasta, Hacer -mientras) Un sub-flujograma (mdulo) puede ser invocado desde el flujograma principal o desde otro subflujograma, al terminar de ejecutarse se retorna al flujograma principal o al sub-flujograma que lo invoc.
MODULARIDAD EN C.
Para aprender a escribir en C un programa modular, se hace necesario recordar algunos conocimientos ya adquiridos.
Funcin: Una funcin es un conjunto de sentencias que realizan una tarea especfica, dicho de otra manera, una funcin es la codificacin en C de un mdulo; puede ser llamada o invocada desde cualquier parte del programa y devuelven un nico valor o ninguno. Para codificar en C una funcin necesitamos de las siguientes acciones:
Variables locales. Las variables locales se declaran siempre dentro de la funcin y son locales a la funcin donde han sido declaradas; es decir, su mbito est confiado a esa funcin. Las variables locales definidas en funciones deferentes sern independientes unas de otras, incluso si tienen el mismo nombre. Cualquier variable declarada dentro de una funcin se interpreta como una variable local a menos que se incluya dentro de la declaracin de un tipo distinto de almacenamiento. Variables globales El mbito de las variables globales se extiende desde el punto de definicin hasta el resto del programa. Por tanto, generalmente abarcan dos o ms funciones y frecuentemente todo el programa. Como las variables globales se reconocen en todo el programa se puede acceder a las mismas desde cualquier funcin que se encuentre dentro de su mbito. Mantiene los valores asignados dentro de este mbito. Por tanto a una variable global se le puede asignar un valor dentro de una funcin y este valor puede usarse dentro de otra funcin. La utilizacin de variables globales proporciona un mecanismo adecuado de transferencia de informacin entre funciones. Todo programa en C consta de una o ms funciones. Una de estas funciones tiene que llamarse main. Se pueden subordinar funciones adicionales a main, y posiblemente una a otras. Si un programa contiene varias funciones, sus definiciones pueden aparecer en cualquier orden, pero deben ser independientes unas de otras. Esto es, una definicin de una funcin no puede estar incluida en otra. Cuando se accede a una funcin desde alguna parte determinada del programa, se ejecutan las instrucciones de que consta. Se puede acceder a una misma funcin desde varios lugares
distintos del programa. Una vez que se ha completado la ejecucin de una funcin, se devuelve el control al punto desde el que se accedi a ella. Generalmente una funcin procesar la informacin que le es pasada desde el punto del programa en donde se accede a ella y devolver un solo valor. La informacin se le pasa a la funcin mediante unos identificadores especiales llamados argumentos y es devuelta por medio de la instruccin devuelven nada.
Prototipos de funciones.
Los prototipos de funciones normalmente se escriben al comienzo del programa, delante de todas las funciones definidas por el programador. La forma general de un prototipo de funcin es:
10
El paso de parmetros por valor se conoce tambin como paso por copia, y
significa que cuando C ejecuta la funcin y la sentencia que invoca la funcin, la funcin recibe una copia de los valores de los parmetros, si se cambia un parmetro afecta slo la funcin y no tiene efecto fuera de ella.
Ejemplo de la sintaxis de la declaracin de una funcin: Prototipo de una funcin llamada suma, trabaja con dos parmetros enteros (n1 y n2) devuelve un valor entero:
En trminos generales la primera lnea se puede escribir as: Tipo-de-dato nombre( tipo 1 arg 1, tipo 2 arg 2, .tipo n arg n){ Donde - tipo-de-dato representa el tipo de datos del valor que devuelve la funcin y nombre el nombre de la funcin, y tipo 1, tipo 2, tipo n representan los tipos de datos de los argumentos arg 1, arg 2..arg n. los tipos de datos se suponen enteros cuando no se indican explcitamente.
Los argumentos se denominan argumentos formales, ya que representan los nombres de los elementos que se transfieren a la funcin desde la parte del programa que hace la llamada. Tambin se llaman parmetros o parmetros formales (los argumentos correspondientes en la referencia a la funcin se denominan argumentos reales, ya que definen la informacin que realmente se transfiere). Los identificadores utilizados como argumentos formales son <<locales>>, en el sentido de que no son reconocidos fuera de la funcin.
11
Lista_parmetros: Lista de declaraciones de los parmetros de la funcin separados por comas. Declaraciones_variables_locales: Detalle de las variables que se utilizan y sus tipos de datos, en la funcin. Sentencias: Cuerpo de la funcin. Expresin: Valor que devuelve la funcin, normalmente es el nombre de una variable.
12
ES IMPORTANTE RECORDAR: Tipo de resultado: Es el tipo de dato que devuelve la funcin y aparece antes del nombre de la misma. Lista de parmetros: Es una lista de parmetros tipificados que utiliza la funcin. Cuerpo de la funcin: Se encierra entre llaves. No hay punto y como despus de la llave de cierre. No se pueden declarar funciones anidadas. Declaraciones locales: Las constantes y variables declaradas dentro de una funcin, son locales a la misma; por lo tanto se usan dentro de la misma y no existen fuera de ella. Antes de utilizar una funcin o de invocarla, debe ser declarada. La declaracin de una funcin contiene solo la cabecera de la misma, conocida tambin como prototipo. Ejemplo de la sintaxis completa del uso de funciones:
#include <stdio.h> #include<stdlib.h> void resta(int valor1, int valor2); int multiplica(int, int); int main() { int numero1, numero2, resultado; system("cls"); printf("Introduzca dos nmeros"); scanf("%d %d",&numero1,&numero2); resta(numero1, numero2); // llama a la funcin "resta" resta(numero2, numero1); // llama a la funcin resta
13
Programacin I Ciclo II 2012 resultado = multiplica(numero1, numero2); // llama a la funcin multiplica y guarda el valor retornado en la variable //resultado printf("\n La multiplicacin de los dos valores es: %d", resultado); return 0; } void resta(int valor1, int valor2) { int sustraccion; // variable local sustraccion = valor1 - valor2; printf( "\nLa resta de los dos valores es:% d",sustraccion); } int multiplica(int valor1, int valor2) { int local; // variable local local = valor1 * valor2; return local; }
14
Programacin I Ciclo II 2012 Ejemplo 3: Mostrar la serie fibonacci hasta un numero ledo desde el teclado.
Anlisis
Datos de entrada: Cantidad de nmeros amostrar de la serie Datos de salida Serie fibonacci Proceso: a=1 b=0 c=a+b b=a a=c Restricciones n tiene que ser > 0 tipo entero entero variable n a
main 0
Top-down
Captura 1.0
Resultado 1.1
Diagrama de flujo
inicio captura resultado(n)
captura
a=1 b=0
resultado(n)
c=a+b b=a
fin_captura
a=c
fin_resultado
15
Programa
#include<stdio.h> #include<stdlib.h>
/*------ funcin principal---------*///// main(){ captura(); / / llamada a la funcin camptura return 0; } /*------------------------*/////
/*------ Definicin de la funcin captura---------*///// void captura( ){ int n; system("cls"); do{ printf("Digite un nmero"); scanf("%d",&n);} while(n<=0); resultado(n); // llamada a la funcin resultado y pasa como parmetro n } /*------ termina la funcin captura---------*/////
/*------ Definicin de la funcin resultado---------*///// void resultado(int n){ int a=1,b=0,i,c; for(i=1;i<=n;i++){ printf("%d\t",a); c=a+b; b=a; a=c; } } /*------ termina la funcin resultado---------*/////
16
captura 1.0
operacin 1.0
resultado 3.0
Suma 1.1
Resta 1.2
Divisin 1.3
multi 1.4
Modulo 1.5
De donde: Main; llama a la funcin captura, despus llama a la funcin operacin y por ltimo a la funcin resultado. Captura; captura don nmeros reales y la operacin a realizar; y le devuelve lo capturado a main. Operacin: dependiendo del tipo de operador capturado llamar al modulo correspondiente y le enviar los datos respectivos, adems retornar el resultado a main(). Resultado: mostrar el resultado que le ha enviado main, en pantalla. Suma; realizar la suma de los datos que le envi operacin y retornar el resultado
17
Resta, realizar la resta con los datos que le enve operacin y retornar el resultado Divisin; realizar la divisin con los datos que le enve operacin y retornar el resultado multi; realizar la multiplicacin con los datos que le enve operacin y retornar el resultado. modulo; obtendr el resto, con los datos que le enve operacin y retornar el resultado.
6. Desarrollar una solucin que obtenga el promedio de los nmeros pares, promedio de los impares, y la cantidad de nmeros primos, de n nmeros ingresados desde el teclado. Debe hacer uso de funciones donde una de ellas debe ser un men para elegir que se sedea visualizar. Ejemplo Men 1. Promedio Pares 2. Promedio impares 3. Cuantos primos 0. Salir. 7. Una persona desea invertir X cantidad de dinero en un negocio, el cual le otorga un % inters ingresado desde el teclado. Cul ser la cantidad de dinero que esta persona tendr al cabo de cinco aos si la ganancia de cada mes es reinvertida? 8. Calcule lo que debe pagar cada cliente en un almacn; si por cada compra el cliente tiene derecho a sacar un papelito, y dependiendo del color, se efectan diferentes descuentos. Si el color es blanco, se realiza un descuento del 3% sobre la cuenta, si es verde, un descuento de 5% y si es rojo, un descuento de 7%. se sabe adems que si es da lunes o viernes, el porcentaje de descuento es el doble.
9. Escribe una funcin que calcule el factorial de un nmero, dado como parmetro. A continuacin realiza un programa que lea por teclado un nmero entero n y muestre por pantalla los factoriales de los nmeros de 1 a n. El programa debe usar la funcin factorial previamente definida. 10. Realizar un programa que calcule el nmero e, utilizando el siguiente desarrollo en serie: e = 1 + 1/1! + 1/2!+ + 1/10! + El programa debe usar la funcin factorial definida en el ejercicio anterior. 11. Dos nmeros son amigos, si cada uno de ellos es igual a la suma de los divisores del otro. Por ejemplo, 220 y 284 son amigos, ya que: Suma de divisores de 284: 1 + 2 + 4 + 71 + 142 = 220 Suma de divisores de 220: 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284 Hacer una funcin que determine si dos nmeros dados como parmetros son amigos o no. A continuacin realizar un programa que muestre todas las parejas de nmeros
18
amigos menores o iguales que n, siendo n un nmero introducido por teclado. El programa debe usar la funcin amigo previamente definido. 12. Escribir un programa que pida los 3 lados de un tringulo y a continuacin muestre los siguientes datos: Cuanto vale la hipotenusa, Cuanto el cateto mayor y cuanto el cateto menor, y Si el tringulo es equiltero, issceles o escaleno.
10. Realizar un programa que muestre por pantalla el siguiente men:
1.- Calcular el factorial de un nmero. 2.- Calcular el n e: 3.- Hallar si dos nmeros son amigos 0.- Salir del programa El usuario podr elegir cada una de las opciones del men. Si la opcin pulsada no es ninguna de las anteriores el programa debe mostrar un mensaje informando de tal error y no debe salirse hasta que se ingrese la opcin salir. 11. Construir un programa modular para tratamiento de cadenas de caracteres. Una cadena se construye a partir de un string de caracteres y tiene una longitud que describe el nmero de caracteres de la cadena. El programa proporciona las siguientes opciones: - Ingresar una nueva cadena - Obtener la longitud de una cadena - Obtener el texto de la cadena - Convertir la cadena a minsculas - Copiar una cadena - Concatenar dos cadenas - Comprobar si una cadena est vaca - Comparar dos cadenas, c1 y c2, para comprobar si: c1 = c2 c1 < c2 c1 > c2 12. Crear una funcin en C que permita al usuario escribir una palabra pero cuando se digite cada letra o carcter slo aparezca un asterisco como si estuviese ingresando una clave. Ejemplo si digita la palabra profesor aparecer en la pantalla ******** 13. Escribir una funcin en C que cuente el nmero de ocurrencias de cada vocal (tanto si es mayscula como minscula) en una cadena de caracteres y los muestre por pantalla. 14. Escribir una funcin que ingrese un numero cualquiera y que devuelva como resultado la suma de sus dgitos, ejemplo si el nmero fuera 23 la suma seria 5.
19
15. Escribir una funcin llamada "cantidad" que reciba como argumento un numero entero y un string y que luego diga si el string tiene la misma cantidad de letras que el numero entero ingresado. 16. Escribir una funcin que tenga como entrada una cadena y devuelva el numero de consonantes y dgitos de la cadena. 17. Crear un programa en C que solicite nmeros naturales hasta que el usuario desee terminar. Por cada nmero introducido se deber visualizar: - Si el nmero es primo: su factorial. - Y si el nmero no es primo: sus mltiplos menores que el mismo. 18. Pirmide. Escribir una funcin que imprima por pantalla una pirmide como la de la figura: * *** ***** ******* **** ***** El argumento de la funcin es la altura de la pirmide. 19. Si el cuadrado de un nmero es igual a la suma de los nmeros impares del numero (ejemplo 32 = 1+3+5) cree una funcin que calcule el cuadrado de un numero mediante sumas sucesivas de los nmeros impares. 20. Desarrollar un programa en c que permita obtener el permetro y rea de una figura de 4 lados y diga si es un cuadrado o un rectngulo. Esto mediante funciones. 21. Escribir un programa que imprima el equivalente en letras de una cantidad introducida en cifras (ejemplo= se introduce "190" y el programa me entregue "ciento noventa" 22. Escribir un programa que a travs de un men permita al usuario elegir el clculo del rea de cualquiera de las figuras geomtricas: circulo, cuadrado, rectngulo o triangulo, mediante funciones. 23. Desarrollar un programa que calcule el coeficiente del binomio con una funcin factorial. Nota: el factorial solo se le podrn sacar a nmeros enteros positivos.
m n
m! n!(m-n)!
24. Desarrollar un programa que lea dos nmeros enteros, luego los pase como parmetros a una funcin cuya tarea es visualizar todo el nmero que estn comprendidos entre los dos enteros.
20
25. Disear un programa que calcule el mximo comn divisor de dos nmeros mediante el algoritmo de Euclides. Sean dos nmeros A y B, el mtodo para hallar el mximo comn divisor (mcd) de dos nmeros A y B por el mtodo de Euclides es: Dividir el nmero mayor (A) por el menor (B). si el resto de la divisin es cero, el numero B es el mximo comn divisor. Sin la divisin no es exacta, se divide el nmero menor (B) por el resto de la divisin anterior. Se siguen los pasos anteriores hasta obtener un resto cero. El ltimo divisor es el MCD buscado. 26. Se introduce por el teclado una hora determinada con el formato; H, M, S (H: horas, M: minutos, S: segundos). Se pide calcular la hora que ser dentro de un segundo. 27. En un negocio de fotocopias, se ofrecen los siguientes servicios: Ventas varias: Lpiz = $ 0.75 Hojas Bond = $ 0.25 Folder = $ 1.25 Borrador = $ 3.66 Fastener = $ 1.00 Bolgrafo = $ 1.50 Fotocopiado: Tamao carta = $ 0.02 Tamao oficio = $ 0.03 Planos = $ 0.10 Colores = $ 0.25 (sin importar tamao) Procesamiento de texto: Slo texto = $ 0.15 Con grficos = $ 0.25 Disear un programa que calcule la cuenta total a pagar de un cliente, segn los servicios que haya requerido. Si el cliente no compra algn artculo o servicio puede introducir 0 unidades y desplegar el mensaje: Lo esperamos de nuevo. La cuenta total a pagar debe de ser expresada tanto en colones como en dlares y diferenciar los totales segn los rubros de servicio utilizados.
21