Está en la página 1de 29

UNIVERSIDAD DE EL SALVADOR

FACULTAD DE INGENIERIA Y ARQUITECTURA


ESCUELA DE INGENIERIA DE SISTEMAS INFORMATICOS

INTRODUCCION A LA INFORMATICA - CICLO I


Unidad III. Metodología para la resolución de problemas

Objetivo: Aplicar una metodología que le permita desarrollar soluciones informáticas a través
del análisis, diseño y programación de dichas soluciones.

Contenido de la Unidad:

Introducción
1. Resolución de problemas informáticos
1.1. Conceptos Generales
1.2. Proceso solucionador de problemas
1.2.1. Formulación del problema
1.2.2. Análisis del Problema
1.2.3. Búsqueda de soluciones
1.2.4. Decisión
1.2.5. Especificación
1.3. Uso del proceso solucionador de problemas en la asignatura
1.3.1. Planteamiento del problema
1.3.2. Análisis del problema
1.3.3. Diseño de la solución
1.3.4. Codificación de la solución
1.3.5. Depuración de la solución
1.4. Algoritmos
1.4.1. Definición de Algoritmo
1.4.2. Representación de un Algoritmo
1.4.3. Pseudo-código
1.5. Ejemplos de resolución de problemas
2. Modularidad
2.1. Definición
2.2. Técnicas de diseño modular
2.3. Diseño descendente o Top – down
2.4. Ventajas de la modularidad
2.5. Conceptos relacionados con programación modular
2.6. Ejemplo de solución de problemas aplicando modularidad

1
Introducción

En esta unidad se inicia el desarrollo de la capacidad analítica para resolver problemas, aplicando
una metodología que permita solucionar un problema de forma sencilla, ordenada y eficaz. Para
llegar a comprender esta metodología se estandarizarán ciertos conceptos que servirán tanto en
esta unidad como en las que le siguen.

1. Resolución de problemas informáticos

1.1.Conceptos Generales. Cairó (2005) dice que "casi inconscientemente, los humanos
efectuamos cotidianamente una serie de pasos o acciones que nos permiten alcanzar un
resultado o resolver un problema". Efectivamente si reflexionamos por un momento nuestra rutina
diaria encontraremos variedad de situaciones (problemas) que debemos resolver y sin excepción
alguna debe seguirse un proceso o serie de pasos para resolver cada uno (lo que conocemos
como algoritmo)

• Tomar un baño.
• Tomar el desayuno.
• Limpiar el calzado.
• Elegir la vestimenta.
• Que autobús tomar.

En la asignatura nos encontraremos con situaciones como las siguientes:

• Calcular suma de dos números.


• Calcular el promedio de notas para un grupo de clase.
• Averiguar si un número es primo.
• Calcular el valor futuro de un préstamo para 5 años aplicando interés simple.

A partir de los ejemplos anteriores podemos plantear los siguientes conceptos:

Problema: Es una situación real, que tiene ciertas condiciones y/o restricciones, que se necesita
transformar.

Solución: Es un medio para lograr la transformación deseada. No es común que un problema


tenga una única solución, la mayoría de los problemas tienen varias soluciones posibles, por
ejemplo para limpiar el calzado puede usar un cepillo o una franela y el uso de betún (RAE, 1) o
agua, dependerá del tipo de calzado o como acostumbramos a hacerlo.

Un problema involucra algo más que hallar una solución, requiere la mejor forma de lograr la
transformación deseada, y para ello se debe elegir entre todas las posibles soluciones cual es la

2
óptima. Una norma de preferencia para seleccionar de entre varias soluciones se conoce como
criterio, por ejemplo cierto tipo de zapato obtiene una mejor limpieza y protección si se le aplica
betún. Es difícil imaginar un problema que no tenga ciertas exigencias o restricciones a las
soluciones. Una restricción es algo que debe cumplir una solución y se relacionan con las
condiciones iniciales o datos del problema, por ejemplo si el tipo de zapato solo admite betún no
debe aplicarse agua. Es necesario evitar confundir criterio con restricción. Si se retoman los
ejemplos anteriores debe quedar claro que el criterio es usar betún, no quiere decir que no se
pudo usar agua, según el análisis se ha elegido usar betún, en cambio el ejemplo de restricción
valida que si se cumple con cierta condición, en este caso que el tipo de zapato solo acepta betún
no permite que se aplique agua.

1.2.Proceso solucionador de problemas.

Dado conocer por Edward Krick (1978) en su libro Introducción a la Ingeniería y al


Diseño en la Ingeniería. Se le conoce como el Proceso de Diseño, o simplemente diseño, está
compuesto por las siguientes fases:

• Formulación del Problema. Definición amplia, sin detalle del problema en cuestión.
• Análisis del Problema. Definición detallada del problema.
• Búsqueda de Soluciones. Acumulación de soluciones alternativas aplicando la invención,
la investigación, etc.
• Decisión. Evaluación, comparación y selección de las alternativas hasta descubrir la
mejor.
• Especificación. Documentación completa de la solución seleccionada.

Esquemáticamente, podemos representarlo así:

Formulación del problema


Análisis del problema
Reconocimiento Investigación Solución
de un problema Decisión completamente
Especificación especificada

1.2.1. Formulación del problema. Es la definición amplia, sin detalles del problema en
cuestión. Todo problema se puede formular oral o en forma de diagrama, en papel o en la
mente. En muchos casos bastará con usar unas cuantas palabras o con elaborar un sencillo
diagrama. El método de la caja negra que se emplea para visualizar problemas es un método
de formulación diagramática.

3
Estado A Un problema Estado B

Zapatos sucios Limpiar Calzado Zapatos limpios

Un número Averiguar su un número es Mensaje si el número es


primo primo o no

En la etapa de formulación del problema, no se sabe que hay en la caja negra, ni tampoco
es de interés. No hay reglas firmes y rápidas para la formulación de problemas. Cuando se
ataca un problema, es de esperar que, desde el primer momento, se escoja cuidadosamente
el problema que se intenta resolver. Se debe luchar por lograr una visión amplia y ordenada
de cada problema antes de interesarse por las soluciones posibles y adentrarse en cualquier
tipo de detalles. Después de hacerlo, se puede y debe definir el problema al detalle.

1.2.2. Análisis del Problema. Esta fase requiere una clara definición, donde se contemple
exactamente lo que debe hacer el programa y el resultado o solución deseada (Joyanes,
2013). Los componentes del análisis del problema son:
• Variables de entrada: Característica dinámica del estado A. Se responde a la pregunta ¿qué
entradas se requieren? documentando los tipos de datos con los cuales se trabaja y la
cantidad. Un problema Averiguar si un número es primo.

• Variables de salida: Característica dinámica del estado B. Se responde a la pregunta ¿qué


es la salida deseada? documentando el tipo de datos de los resultados y la cantidad.
• Variables de Solución: manera en que pueden diferir las soluciones que se dan a un
problema.
• Restricciones: características de una solución previamente fijada por una decisión, por la
naturaleza, por la ley o por cualquiera otra fuente que tenga que respetar el solucionador de
problemas.

• Criterios: durante el análisis se deben identificar los criterios que se deben usar para
seleccionar la mejor solución. En realidad, los criterios no cambian radicalmente de un
problema de Ingeniería a otro; el costo de fabricación, la seguridad, la confiabilidad, la
apariencia, la facilidad de uso y el costo de mantenimiento son criterios que se aplican en
casi todos los casos. Pero el peso relativo con que se aplican estos criterios puede cambiar
en forma significativa. La restricción es una proposición que implica selección entre dos
posibilidades. La solución satisface o no satisface a la restricción. El criterio, siendo un valor
contra el cual se juegan las soluciones, es una cuestión de grado, algunas soluciones son
más o menos atractivas que otras. El criterio no tiene el corte limpio, o la característica de
pasa/no pasa de una restricción.

1.2.3. Búsqueda de soluciones. Después de definir un problema, se deben centrar todos

4
los esfuerzos en realizar una búsqueda real y eficaz (en su mente, en obras escritas y en
todo el mundo que le rodea) para encontrar soluciones. Las soluciones tienden a parecerse
mucho a la manera actual de resolver el problema, porque la solución ya conocida de un
problema tiene gran fuerza de atracción. Después de que la gente ha vivido con cierta
solución algún tiempo y se ha acostumbrado a ella, sus ideas parecen ir sobre rieles en esa
dirección. Consideraciones sobre el método de búsqueda
• Primero se lleva al máximo el número y la variedad de soluciones que se puedan aplicar,
ampliando el espacio de solución tanto como resulte práctico.
• En seguida aproveche al máximo ese espacio de soluciones expandido; en su interior haga
eficazmente la búsqueda.

Dos de los métodos utilizados son:

• Método sistémico
o Árbol de Alternativas.
• Método aleatorio
o Lluvia de Ideas.

Algo que no se debe hacer es dejarse abrumar por los detalles antes de que sea necesario
y evitar la evaluación prematura, si el problema es complejo estudiaremos más adelante
como dividirlo en sub-problemas de ser necesario.

1.2.4. Decisión. Procedimiento General para la Toma de Decisiones

1. Seleccionar los criterios y su ponderación relativa (Costo-Beneficio).

2. Predecir el funcionamiento de las soluciones alternativas respecto a estos criterios.

3. Comparar las alternativas en base a los funcionamientos pronosticados.

4. Hacer la elección.

Entre algunos ejemplos de posibles Criterios a tomar en cuenta tenemos:


Inversión inicial

• Costo de operación
• Seguridad
• Disponibilidad
• Aceptación del público
• Destreza que se requiere para la operación

1.2.5. Especificación. Un aspecto muy importante de resaltar es que un ingeniero que


diseña, no siempre llega a construir, operar o mantener su creación. Esto hace que sea
obligatorio el documentar con toda amplitud y comunicar con gran eficacia su propuesta de

5
solución a las personas que se encargarán de su construcción, operación o mantenimiento,
para que puedan cumplir satisfactoriamente con su responsabilidad.

El siguiente esquema resume el proceso solucionador en todas sus fases:

Reconocimiento del problema

Formulación del problema

Problema formulado
Otros hechos y opiniones importantes
Información, opiniones, tradiciones y otros datos de carácter secundario

Análisis del problema

Definición detallada del problema en función de especificaciones, restricciones y criterios

Investigación

Soluciones completas y parciales

Decisión

Solución preferida

Especificación

Solución completamente especializada

1.3.Uso del proceso solucionador de problemas en la asignatura.

Para resolver los problemas de forma ordenada y sencilla, utilizaremos este proceso con
ciertas modificaciones que lo vuelven funcional para los fines de la asignatura. El Proceso
Solucionador de Problemas, es conocido también como Metodología para Resolver
Problemas. A continuación presentamos los pasos necesarios para resolver problemas:

1. Planteamiento del problema.


2. Análisis del problema.
3. Diseño de la solución.
4. Codificación de la solución.
5. Depuración de la solución.
6. Documentación y mantenimiento.

6
El proceso abarca las actividades y eventos que transcurren entre el reconocimiento de un
problema y la especificación de una solución del mismo que sea funcional, económica y
satisfactoria.

1.3.1. Planteamiento del problema. Con esta etapa se debe comprender el problema, es
tener claro que lo que queremos obtener y con que contamos actualmente para conseguirlo.
¿Se intentaría resolver un problema sin saber en qué consiste? Seguramente que no, por
ello no debemos inclinarnos a intentarlo si no lo sabemos. Los objetivos principales de la
formulación de un problema son:

• Definir en términos generales en qué consiste.


• Determinar si merece nuestra atención.
• Obtener una buena perspectiva del problema cuando sea más oportuno y fácil
hacerlo.

Estas son cosas que deben conocerse al principio, antes de empezar a resolver el problema.
Con frecuencia no se le presenta el verdadero problema al ingeniero, más bien, él mismo
debe determinar en qué consiste. Esto suele ser difícil porque su naturaleza a menudo es
encubierta por mucha información sin importancia, soluciones que se emplean
corrientemente, opiniones que originan confusión y por las formas tradicionales y
desventajosas de considerar un problema. En esta fase del proceso, se debe identificar la
transformación que se desea expresando en términos generales el problema particular,
ignorando los detalles por el momento y concentrándose en la identificación de los estados
inicial y estado final de la situación en cuestión o problema, llamado también estado A y B.

Para representar la Formulación del Problema en forma esquemática, se hace uso


del método de la “Caja Negra”, así:

¿Cómo estamos? ¿Cómo queremos estar?

ESTADO A ESTADO B

Entrada de datos Salida

Proceso

Estado inicial Estado Final

Para comprender mejor el planteamiento se sugiere documentar el planteamiento del


problema así:

Ejemplo 1.3.1.: Diseñe una solución que le permita verificar si un número es primo.

7
Planteamiento del problema

Entrada Proceso Salida


Un número Mensaje indicando si el
número es primo o no

Ejemplo 1.3.3.: Diseñe una solución que permita calcular para 1 estudiante el promedio de
notas de sus 5 evaluaciones.

Planteamiento del problema

Entrada Proceso Salida


El promedio de notas del
5 notas del estudiante estudiante

En este ejemplo la salida solo se refiere a valores calculados. Cuando se estudie modularidad
se verá que algunos subprogramas devuelven valores sin mensajes y otros muestran
mensajes sin devolver valor.

1.3.2. Análisis del problema. En la formulación del problema es suficiente identificar el


estado A, y el estado B, que en informática se conocen como Entrada de Datos y Salida de
Datos, respectivamente; sin embargo, para resolver el problema es necesario saber más
acerca de la entrada y la salida. Por lo tanto, durante esta etapa de la metodología, se detallan
o especifican los estados A y B determinando las características cualitativas y cuantitativas
de ambos estados. Básicamente, el análisis del problema consiste en:

a. Definir las variables de salida: ¿Qué se nos pide?, ¿Qué resultados queremos?, ¿Cuáles
incógnitas debemos obtener? Debe tenerse en cuenta que todo lo que se nos pide siempre
son datos variables.

b. Definir Datos de entrada: ¿Qué datos tenemos?, ¿Son estos suficientes? ¿Son datos
variables o constantes? En este punto debe de diferenciarse los datos variables de los datos
constantes, asignando tipos de datos. Si son constantes especificar su valor.

c. Que restricciones existen: ¿Existen limitantes para las variables de entrada?

d. Criterios: ¿Qué criterios se utilizarán para seleccionar el mejor diseño? Realmente, los
criterios cambian muy poco de problema a problema. Generalmente van asociados a costos,
tiempo o recursos necesarios. Para efectos de la asignatura, no sé incluirán en la
documentación del análisis.

8
e. Detallar los procesos necesarios para transformar el estado A
en B: ¿Qué fórmulas, ecuaciones, modelos, procesos, etc. necesitamos para obtener
resultados a partir de los datos de entrada? En la asignatura trabajaremos solo con Diseño
de la Solución a través de pseudocódigo.

f. Definir las variables de proceso: Las variables de proceso son aquellas que se generan
o producen durante el proceso, para obtener el estado B, pero no son de entrada ni de salida.
Cabe mencionar que no todos los análisis de problemas se documentan variables de proceso.

1.3.3. Diseño de la solución. En esta etapa ya tenemos una idea clara de cómo solucionar
el problema, en el caso particular de la materia, la solución así diseñada se conoce como:
ALGORITMO, y consiste en ordenar todo lo que tenemos en el Análisis: conocer los datos
de entrada, procesar o realizar los cálculos necesarios en el orden debido y por último
especificar los datos de salida o información. Esta etapa requiere de mucho ingenio y
creatividad.

1.3.4. Codificación de la solución: Consiste en traducir o escribir el algoritmo, en un


lenguaje de programación de alto nivel.

1.3.5. Depuración de la solución. Una vez introducido el programa en el computador, debe


probarse exhaustivamente, ejecutando el programa hasta que se obtengan los resultados
deseados y que esté libre de errores. Cuando se ejecuta un programa, se pueden producir 3
tipos de errores:

a. Error de compilación, se producen por el uso incorrecto de las reglas del lenguaje de
programación, estos errores se conocen con el nombre de “errores de Sintaxis”.

b. Errores de ejecución, se producen por instrucciones que el computador puede traducir


pero no ejecutar. Ejemplo: división entre cero, raíz cuadrada de un número negativo, imprimir
una variable que no se le ha asignado ningún valor, asignar un valor numérico a una variable
de tipo alfanumérico.

c. Errores lógicos, Estos errores se producen cuando, el programa se compila y ejecuta,


pero los resultados obtenidos o datos de salida, son incorrectos o no se obtiene ningún
resultado. Ejemplo: Cálculo incorrecto del salario neto.

1.4. Algoritmos.

1.4.1. Definición de Algoritmo: Es una descripción ordenada y breve de los pasos a seguir
para realizar una tarea o actividad y con ello resolver un problema manualmente o por medio
de una máquina. Las principales características que los algoritmos deben reunir son las
siguientes:

9
Precisión: Los pasos a seguir en el algoritmo deben ser precisados claramente.

Determinismo: El algoritmo, dado un conjunto de datos idénticos de entrada, siempre debe


arrojar los mismos resultados.

Finitud: El algoritmo, independiente de la complejidad del mismo, siempre debe ser de


longitud finita.

Además se pueden listar las siguientes:

• Todo algoritmo tiene un único inicio y un único final.


• El algoritmo se debe diseñar de forma general, o sea que debe resolver el problema,
según los datos que sean proporcionados.
• Debe ser eficaz, es decir que al finalizar la ejecución del algoritmo, la solución del
problema debe ser alcanzada; de esto se obtiene que todo buen algoritmo debe tener
un paso para finalizar el mismo.
• La ejecución de todo algoritmo debe de ser factible de implementar, es decir se debe
tener acceso a todo lo que éste requiera (datos y tecnología).
• Un algoritmo consta de tres secciones o módulos principales:
o Entrada de datos, donde se conocen los datos de entrada.
o Procesamiento de datos (o proceso), donde se transforman los datos de
entrada en datos de salida, y
o Salida de datos, donde se muestran los datos de salida o información
requerida.

Secciones principales de un algoritmo:

Algoritmo

Entrada de datos Procesamiento Salida de los resultados


de los datos

Esta estructura puede cambiar de acuerdo al tipo de programa y complejidad.

1.4.2. Representación de un Algoritmo:

Algoritmo narrado: Usando nuestro idioma natural, con nuestras propias palabras, se
detallan los pasos a realizar para resolver un problema.

10
Algoritmo esquematizado: Usando una serie de símbolos para representar cada paso del
algoritmo. A este esquema de solución se le llama Diagrama de Flujo o Flujograma, también
se puede representar mediante una Carta Nazzi Shneiderman o utilizarse símbolos
estandarizados para diagramas de flujo como los de American National Estándar Institute
(ANSI), Internacional Organization for Standarization (ISO).

Algoritmo pseudo-codificado: Usamos una mezcla de lenguaje natural y un código de


programación específico (o lenguaje de programación).

Algoritmo codificado: En esta representación de algoritmo, usamos un código o lenguaje


de programación, como C, C++, Java, C#, etc. Un algoritmo codificado se conoce como
programa. En esta asignatura elaboraremos nuestros primeros algoritmos como
pseudocódigo, según la nomenclatura sugerida por Cairó (2005).

1.4.3. Pseudo-código. Es un lenguaje que se utiliza para mostrar la solución de un problema.


Una característica importante de éste es que facilita al estudiante concentrarse en las
estructuras de datos y algoritmos asociados a ella sin la necesidad de relacionarlas a un
lenguaje de programación en particular. El pseudo-código se usa para diseñar soluciones
con una lógica estructurada y secuencial. Es necesario recordar que en esta asignatura el
lenguaje de programación estudiado es C #. Siendo este un lenguaje orientado a objetos, las
soluciones completas deben diseñarse y documentarse con herramientas adecuadas al
paradigma. Sin embargo, a este momento se están estudiando solamente soluciones a
problemas que no implican el uso de otras clases más allá de la clase que creamos por
defecto en nuestros proyectos, por tanto, diseñaremos algoritmos que solucionan problemas
haciendo uso solo del método principal (Main) o usando otros a partir de la implementación
de modularidad. Es común que a la elaboración del pseudo-código le siga la construcción de
un diagrama de flujo, que esquematiza gráfica y detalladamente la solución del problema, y
es a partir de este que se escribe un programa en algún lenguaje de programación
estructurado, en nuestro caso, será la definición del comportamiento definido en un módulo
el que usará lógica estructurada. A continuación se presenta una tabla donde se encuentran
los símbolos que se usan para diagramas de flujo, su instrucción equivalente en lenguaje
algorítmico y un ejemplo de uso.

Representación del símbolo Instrucción Ejemplo

Representa el uso de teclado Leer a,b


para introducir datos.

a,b

Entrada de datos , desde archivos Ingresa a

11
Hacer Hacer i=i+1

i=i+1

Mostrar en pantalla sin uso de Muestra i


variables
i

Imprimir, incluyendo variables o Imprime i


datos de salida. i

Condicional (necesita tomar


una decisión)

a>b

Conector. Representa una Continua en el conector 1


conexión o enlace en la misma
página.
1

Conector de página. Transfiere Continua en el conector * de la


el flujo a una página diferente. siguiente página

Comentario o aclaración Comenta lo que hace el


procedimieto

Cálculo de descuento
por préstamos

Los pseudo-códigos que haremos en esta asignatura tendrán la siguiente estructura:

{Descripción de lo que hace el programa}


NombreDelPrograma

Descripción de lo que hace el programa

{variableTipoK1, variableTipoK2... y variableTipoKN son de tipo K


variableTipoH1, variableTipoH2... y variableTipoHN son de tipo H}

1. Leer variable1 y variable2


2. Hacer operación1

12
operación2
3. Escribir "Mensaje" variables

1.5. Ejemplos de resolución de problemas.

Ahora que sabemos qué hacer para plantear, analizar y diseñar la solución a un problema.

Ejemplo 1.5.1.: Diseñe una solución que le permita multiplicar dos números.
Planteamiento del problema

Entrada Proceso Salida

Dos números Mostrar producto de los


dos números

Análisis del problema

a) Definición de variables de salida

Nombre Tipo Descripción

pro Entero Resultado de la multiplicación de num1 y


num2

b) Definición de Datos de entrada

Variables

Nombre Tipo Descripción

num1 Entero Primer número a multiplicar

num2 Entero Segundo número a multiplicar

Constantes :No hay

c) Restricciones

No hay restricciones

d) Proceso
En el proceso se define a grandes rasgos lo que debe hacerse. En este caso el proceso
será multiplicar los dos números
pro= num1*num2

13
e) Variables de proceso: Aquí se definen variables que será necesario utilizar en el
programa sin embargo, no son variables de entrada ni de salida.
En este caso no hay variables de proceso, ya que se encuentra la variable de salida con
una operación directa de las variables de entrada.

Diseño de la solución

Puede diseñar la solución a través de un flujograma o a través de pseudocódigo

Pseudo-código Flujograma
Inicio

multiplicacion num1,num2

{El programa calcula el producto de dos números dados}


{num1, num2 y pro son variables de tipo entero}
Pro=num1*num2
1. Leer num1, num2
2. Hacer pro = num1 * num2
3. Escribir "El producto de" num1 " por " num2 " es: " pro “el producto de
“num1 “ y “
num2”es ”prom

Fin

Ejemplo 1.5.2.: Diseñe una solución que permita calcular el promedio de 3 notas de un
estudiante.

Planteamiento del problema

Entrada Proceso Salida

Tres notas el promedio de las notas

Análisis del problema

a) Definición de variables de salida

14
Nombre Tipo Descripción

prom Real Promedio de la notas

b) Definición de Datos de Entrada


Variables

Nombre Tipo Descripción

nota1 Real Primera nota

nota2 Real Segunda nota

Nota3 Real Tercera Nota

Constantes : el número de notas ya lo conocemos y no cambiará por lo que lo podemos


considerar una constante a lo largo del programa

Nombre Tipo Descripción Valor

numNotas Entero Número de notas 3

c)Restricciones

nota1, nota2, nota3 deben ser valores mayores que cero y menores a diez

c) Proceso
Inicialmente podemos pensar la solución especificando un conjunto de pasos lógicos para solucionar el
problema:

Leer tres notas


Sumar las tres notas
Dividir las la suma entre 3 y asignar el resultado a una variable
Mostrar el promedio en pantalla acompañado de un mensaje

Diseño de la solución

Cuando ya se tiene clara la idea de lo que debemos hacer se pasa a :

15
Pseudo-código

promedio

{El programa dadas tres notas de un estudiante calcula su promedio}

{nota1, nota2, nota3 y prom son variables de tipo real}

1. Leer nota1, nota2 y nota3


2. Hacer suma = nota1+nota2 + nota3
3. prom = suma/numNotas
4. Escribir "El promedio es:" prom

Flujograma
Inicio

“Digite las 3 notas del


estudiante (Entre 0 y
10)”

nota1,nota2,nota3

suma=nota1+nota2+nota3

prom=suma/numNotas

“El promedio es “,
prom

fin

2. Modularidad

Cuando los problemas que vamos a resolver son muy grandes o complejos, el diseñar la
solución no es tarea sencilla, es aquí donde nos presta su mayor utilidad la modularidad, ya

16
que nos facilita la tarea de programar y nos permite elaborar estos programas de manera
más rápida y eficaz. La experiencia ha demostrado que la mejor manera de desarrollar una
solución y mantenerla, es construirla a partir de piezas pequeñas, que la hacen más
manejable. A continuación se presentan diferentes elementos que facilitan el diseño,
implementación, operación y mantenimiento de soluciones grandes para problemas grandes.

2.1.Definición

En lenguajes de programación orientada a objetos como C# se define modularidad como la


propiedad que permite subdividir una aplicación en partes más pequeñas llamadas módulos,
cada una de las cuales debe ser tan independiente como sea posible de la aplicación en sí y
de las restantes partes. El siguiente ejemplo ilustra la definición para mejorar la comprensión
de la misma: Se le ha planteado el siguiente problema: Diseñe una solución simule una
calculadora básica, permitiendo realizar suma, resta, multiplicación y división de dos números
leídos.

Esquema de la solución del problema sin aplicar modularidad:

Calculadora básica :

Suma Todo el código de la solución se


Módulo principal
Resta encuentra en el módulo principal

Multiplicación

División

Aplicando el concepto de modularidad al problema:

El módulo principal no tiene el código que hace las


operaciones, cuando se necesite realizar una de las cuatro
Calculadora básica operaciones se llamará por su nombre y según su
definición. Cada submódulo consiste en un subprograma
que se encarga de realizar una operación según su
especificación.

17
Módulo
Principal

Suma Resta Multiplicación División

Submódulos

Para resolver cada sub-problema (o módulo), se le aplica la Metodología para Resolver


Problemas completa, es decir se debe plantear, analizar, diseñar su algoritmo y codificarlo,
individualmente. Recordemos que la solución de cada subproblema resuelve solo una parte
del problema; la solución completa del mismo está formada por el conjunto de todas y cada
una de las pequeñas soluciones diseñadas y la interrelación de todas ellas.

Todo problema resuelto por esta técnica tiene un algoritmo denominado principal,
comúnmente conocido como: módulo raíz, módulo conductor o módulo de control; ya que
controla todo lo que sucede, tanto en ese módulo como en todos los demás, transfiriendo el
control de ejecución a cada módulo en el momento que sea requerido. De esa forma, cada
módulo puede realizar su función o tarea, pero al terminar regresa el control de ejecución al
algoritmo o módulo principal. En C# el módulo principal será Main. La solución de cada
módulo se le conoce como sub-algoritmo.

El algoritmo principal debe contener las llamadas (o invocaciones) a los subalgoritmos, es


decir es el que indica el orden en que se ejecutan cada subalgoritmo; además, el modulo
principal puede realizar una o varias tareas. Cada sub-algoritmo como representación de la
solución de un módulo debe mantener todas las propiedades de un algoritmo. Por lo tanto,
estos pueden contener tareas simples que sólo se ejecutan una vez o son llamadas varias
veces para ejecutarse desde el algoritmo principal.

Si la tarea asignada a un módulo es muy compleja (o muy grande), debe dividirse todavía en
otro u otros módulos más pequeños. El proceso sucesivo de subdivisión de módulos continúa
hasta que cada módulo tenga solamente una tarea o acción específica que ejecutar, esta
tarea puede ser de entrada, salida, procesamiento o manipulación de datos, control de otros
módulos o una combinació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
el módulo de control; y los resultados producidos por un módulo pueden ser impresos dentro
del módulo o remitirse al módulo de control para que sean utilizados por otro módulo cuando
se transfiera el control a ellos.

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

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

18
Aplicar la Metodología para resolver problemas a cada sub-problema; es decir para cada sub-
problema se hace lo siguiente:

1. Planteamiento (Qué hace?)


2. Análisis del problema (Cómo lo hace?)
3. Diseño de la solución: Pseudo-código o flujograma
4. Codificación

2.2. Técnicas de diseño modular.

Con el objeto de facilitar el diseño de algoritmos y la organización de los diversos elementos


que los componen se utilizan algunas técnicas que muestran una metodología a seguir para
resolver los problemas. Estas técnicas hacen que los programas sean más fáciles de escribir,
verificar, leer y mantener. Algunas de las técnicas más conocidas son:

• Top Down o Diseño Descendente


• Botton Up o Diseño Ascendente
• WarnierOrr

TOP DOWN: Es una técnica de diseño, que consiste en tomar inicialmente, el problema
completo, como un todo y descomponerlo sucesivamente en problemas más pequeños y por
lo tanto, de solución más sencilla, representa cada modulo por medio de rectángulos, y las
relaciones que existen entre ellos por líneas rectas, siendo el primer módulo siempre el
modulo raíz o de control:

Módulo principal
o módulo raíz
Módulo 0

módulo 1 módulo 2 módulo 3

submódulos
módulo 4 módulo 5

módulo 6

BOTTON UP: Esta técnica consiste en partir de los detalles más precisos del algoritmo
completando sucesivamente módulos de mayor complejidad, este método es inverso al

19
anterior, parte de lo más simple para llegar a lo complejo; se recomienda utilizarlo cuando:
ya se cuenta con experiencia en la aplicación de la técnica, o cuando se tiene un modelo a
seguir y ya se sabe lo que se va a hacer, o se cuenta con amplia pericia en la resolución de
problemas semejantes. Conforme se va alcanzando el desarrollo de módulos más grandes
se plantea como objetivo final la resolución global del problema. La técnica de Botton Up es
frecuentemente utilizada para la realización de pruebas a sistemas ya concluidos:

WARNIER ORR: Es una técnica que utiliza una representación semejante a la de cuadros
sinópticos para mostrar el funcionamiento y organización de los elementos que conforman el
algoritmo. Básicamente es igual al Top Down, ya que toma el problema completo y lo va
dividiendo en partes más pequeñas, se diferencia en la representación del diseño, Warner
Orr utiliza una notación de llaves para organizar los módulos: El tipo de diseño que se utilizará
es el Descendente, por lo que se amplía un poco más.

2.3.Diseño descendente o Top - down. El diseño descendente o Top-down, esto es de


arriba hacia abajo, es un procedimiento mediante el cual un problema se descompone en una
serie de niveles o pasos sucesivos de refinamiento. La metodologí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 salidas de información. Es decir, se
descompone el problema en etapas o estructuras jerárquicas, de forma que se puede

20
considerar cada estructura desde dos puntos de vista: ¿Qué hace esa etapa? y, ¿Cómo lo
hace? Para dibujar el diseño tome 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
(verticales y horizontales.
• El módulo raíz o principal, 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 n nivel le puede enviar resultados al módulo de quien depende.

El diseño descendente o Top-down, puede verse a continuación:

Para dividir un problema en trozos del mismo, más pequeños, lo indicado es hacer una lista de
las acciones o cosas que deben realizarse y agruparlas de alguna manera conveniente; además
debemos relacionarlas, indicando por medio de líneas la dependencia entre los módulos, en la
figura anterior, el módulo 3-2-2 depende del módulo 3-2, éste depende del módulo 3 y éste a su
vez del mó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
el proceso en sí es grande o complejo, se puede dividir en más partes.

Con la práctica veremos que se puede dejar la entrada de datos como parte del módulo principal
y que la salida puede ser un solo módulo o formar parte de los módulos de proceso; también
podemos dejar la salida en el principal y diseñar un módulo de entrada de datos y desde luego
los de proceso. En fin que no hay una regla para dividir un problema, cada persona divide y
diseña los módulos que considere necesarios.

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

21
Los datos con que trabaja un módulo se conocen como parámetros, y estos forman parte de los
datos de entrada, (pero no se leen), son enviados por el módulo que lo precede por ejemplo en
la figura 5, los parámetros del módulo 1-2, deben ser facilitados por el módulo 1. Además, cada
módulo puede producir resultados (datos de salida) que no se imprimen, sino que son requeridos
por el módulo que lo precede y, a estos datos, se les conoce como Valor de Retorno, de nuevo
en la figura 5, el resultado, del módulo 3-2-2 es o pude ser enviado al módulo 3-2. Un módulo
puede tener uno o varios parámetros, pero solo puede enviar un solo valor de retorno. El modulo
principal valores de retorno y regularmente tampoco parámetros, sin embargo en C# el método
Main si puede tenerlos.

2.4.Ventajas de la modularidad.

Ésta 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 de resolver. Se diseña la
solución de cada módulo con independencia de los demás. Lo que nos facilita el análisis, el
diseño del algoritmo y desde luego su codificación. Además, puesto que cada módulo se
considera independiente, varios programadores pueden diseñar por separado las soluciones a
diferentes módulos, con lo cual se minimiza el trabajo o esfuerzo personal y el tiempo de diseño
para la solución completa.

Algunas ventajas de programar modularmente son:

• Disminuir la complejidad.
• Aumentar la claridad y fiabilidad.
• Posibilita 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 un
módulo, lo cual indica que un programa modular es fácil de mantener y modificar.
• Un programa modular es más fácil de escribir y depurar (ejecutar, probar y poner a punto).
• Un programa modular es más fácil de controlar. 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 los programadores con menos pericia o experiencia

2.5. Conceptos relacionados con programación modular

Variables o atributos de clase: Estas variables pueden ser referenciadas desde cualquier
módulo. Lo cual significa que podemos utilizar estas variables en todos los módulos, conservando
su valor en todas ellas; y, ese valor se puede cambiar en cualquier módulo dependiendo de su
accesibilidad. En la asignatura solamente se utilizarán variables locales.

22
Variables o atributos locales: Son variables que se declaran dentro de un módulo, y mantienen
su valor mientras este módulo se está ejecutando, es decir que cuando se ejecuta otro módulo
no existen en memoria, por lo tanto no se pueden utilizar, fuera del módulo donde fueron
declaradas.

Constantes: son valores que no cambian en el programa y serán definidas dentro de la clase
antes de cualquier método.

Sub algoritmo: Es un algoritmo que realiza una tarea específica dentro de la solución de un
problema, es decir que resuelve una parte de un problema; si se representa por medio de un
diagrama se le conoce como subflujograma

Parámetros: Los parámetros o argumentos de un módulo son los datos que son parte de la
entradas del mismo, pero dentro éste no se leen, deben de pasarse en la invocación al módulo
según la definición del mismo. Una función puede tener o no parámetros. Los parámetros se
comportan como variables locales, creándose al entrar al módulo y destruyéndose al finalizar su
ejecución, es decir que, los parámetros reciben sus valores del módulo que invoca al módulo en
cuestión, y con estos valores se trabajara en él.

Valor de retorno: Se conoce como valor de retorno aquel que se genera en el módulo y se envía
al módulo desde donde se invocó.

2.6. Ejemplo de solución de problemas aplicando modularidad

Al aplicar el método solucionador de problemas iremos considerando de una vez que estamos
diseñando soluciones para C#.

Ejemplo 2.6.1: Elabore una solución que simule una calculadora que realice las operaciones
aritméticas básicas: suma, resta, multiplicación y división, para dos números leídos.

Planteamiento general del problema

Entrada Salida
Proceso
dos números resultado de la operación
suma
resta
multiplicacion
division

TOP-DOWN

23
El tener una idea de lo que vamos a hacer ayuda mucho a decidir cuántos módulos vamos a
diseñar y la relación que existe entre ellos; por lo tanto, las grandes cosas o pasos que se deben
realizar son:

1. Leer datos
2. Llamar a suma, resta, multiplicación y división
3. Mostrar resultado retornado de cada submódulo llamado

De aquí que podemos decir que vamos a tener un módulo para cada operación aritmética;
además el modulo principal va a leer los datos y es necesario validarlos, luego los envía a los
módulos y recibe los valores retornados por estos. El top-down queda así:

Planteamiento, análisis y diseño de la solución por módulo.

Módulo principal

¿Qué hace principal?: Lee dos números y llama a los módulos suma, resta, multiplicacion y
division , recibe los resultados y los muestra en pantalla

Suma Resta Multiplica Division

Planteamiento del sub-problema

Entrada Proceso Salida

dos números a operar Muestra el resultado de las


operaciones (suma, resta mul

Análisis del sub-problema

a) Definición de variables de salida

Nombre Tipo Descripción

24
rSuma Real Resultado de la suma

rResta Real Resultado de la resta

rMulti Real Resultado de la multiplicación

rDivi Real Resultado de la división

b) Definición de Datos de entrada

Nombre Tipo Descripción

A Real Primer operando

B Real Segundo operando.

Constantes : No hay

c) Restricciones:
b debe ser mayor que 0, ya que será divisor cuando se invoque al respectivo método.
b>0
d) Proceso

Leer a,b
Sumar (a, b)
Restar (a, b)
Multiplica(a, b)
Division (a, b)
Mostrar resultados

Diseño de la solución

Principal

25
Lee dos números y llama a los módulos: Suma, Resta, Multiplica y Division para hacer los
cálculos y mostrarlos en pantalla

Inicio

n1,n2
“Digite dos números
(el segundo deber ser
mayor que cero)”

rSuma=Suma(a,b)

rResta=Resta(a,b)

rMulti=Multiplica(a,b)

rDivi=Division(a,b)

“Los números2, a “y “ b,
“dan como resultados
suma “, rSuma, “Resta “,
rResta, “Multiplicación “,
rMulti, “Division “, rDivi

Fin

a. Módulo Suma

¿Qué hace suma?:

Recibir por parámetro dos números, los suma y retorna el resultado al módulo principal

Diseño de la solución

26
Suma(n1,n2) Codificación
Código C#
public static double Suma(double n1, double n2)
sum = n1 + n2 {
double sum;
sum = n1 + n2;
return sum;
Retorna sum }

b. Módulo Resta

¿Qué hace Resta?: Resta dos números que recibe como parámetro y retorna el resultado.

No hay variables de salida, ya que no muestra el resultado al usuario, solo devuelve el valor del
resultado de restar n1 y n2 (res) que es de tipo real.

No hay lecturas de datos, solo se reciben los parámetros.

Diseño de la solución

Resta(n1,n2) Codificación
Código C#

res = n1 - n2 Public static double Resta(double n1, double n2)


{
double res;
res = n1 - n2;
Retorna res
return res;
}

c. Módulo Multiplica

¿Qué hace Multiplica?: multiplica dos números que recibe como parámetro y retorna el
resultado.

Diseño de la solución

27
Codificación
Multiplica(n1,n2) Código C#
public static double Multiplica(double n1, double n2)
{
mul = n1 + n2 doublemul;
mul = n1 * n2;
return mul;
Retornar
Retornar mul
mul }

d. Módulo Division

¿Qué hace Division?: Divide dos números que recibe como parámetro y retorna el resultado.

Diseño de la solución Division(n1,n2)

div = n1 + n2

Retornar
Retornar div
div

Codificación
Código C#

public static double Division(double n1, double n2)


{
double div;
div = n1 / n2;
return div;
}

Codificación del programa completo en C#


Regularmente el diseño de la solución de cada módulo debería llegar hasta el pseudocódigo,
de tal forma que la codificación se hará al final. El programa queda así:

28
using System;
namespace Ejemplo1
{
class Program
{
static void Main(string[] args)
{
double a, b, rSuma,rResta,rMulti,rDivi;
a=double.Parse(Console.ReadLine());
b=double.Parse(Console.ReadLine());

rSuma=Suma(a,b);
rResta= Resta(a,b);
rMulti=Multiplica (a,b)
rDivi= Division(a,b)

Console.WriteLine("La suma de los números “ a “ y ” b “dan los resultados ”


Console.WriteLine("La suma es", rSuma(a, b));
Console.WriteLine("La resta es", rResta(a, b));
Console.WriteLine("La multiplicación es", rMultiplica(a, b));
Console.WriteLine("La division es ", rDivision(a, b));
Console.ReadKey();
}

static double Suma(double n1, double n2)


{
double sum;
sum = n1 + n2;
return sum;
}
static double Resta(double n1, double n2)
{
double res;
res = n1 - n2;
return res;
}
static double Multiplica(double n1, double n2)
{
doublemul;
mul = n1 * n2;
return mul;
}
static double Division(double n1, double n2)
{
double div;
div = n1 / n2;
return div;
}
}}

29

También podría gustarte