Modularización de algoritmos
Imaginá que tu liceo de Salto organiza una feria y hay que armar un programa para todo: cargar notas, calcular promedios, contar quiénes salvaron y mostrar un resumen. Si lo escribís todo en un único bloque, se vuelve larguísimo y difícil de corregir. ¿Cómo lo hacen los programadores para no perderse? Dividen el problema en piezas pequeñas. Eso se llama modularizar.
Qué es un subprograma
Un subprograma (o módulo) es un trozo de algoritmo con nombre propio que resuelve una tarea concreta. Se escribe una vez y se puede llamar todas las veces que haga falta desde el programa principal.
Es como una receta dentro de un libro de cocina: el menú del día (programa principal) dice «hacer la salsa» y vos vas a la página de la salsa (subprograma), la seguís y volvés.
Explicá con tus palabras qué es un subprograma (o módulo) en un algoritmo y nombrá dos ventajas de dividir un programa en módulos en lugar de escribirlo todo en un único…
Explicá con tus palabras qué es un subprograma (o módulo) en un algoritmo y nombrá dos ventajas de dividir un programa en módulos en lugar de escribirlo todo en un único bloque.
Funciones y subprocesos en PSeInt
PSeInt tiene dos tipos de subprogramas:
-
Función: hace un cálculo y devuelve un valor (un resultado que se puede guardar o usar).
-
SubProceso (procedimiento): realiza una tarea, como mostrar un mensaje, pero no devuelve nada.
Funcion r <- doble(x)
r <- x * 2
FinFuncion
SubProceso saludar(nombre)
Escribir "Hola, ", nombre
FinSubProceso
En la función, doble es el nombre, x es el parámetro (dato de entrada) y r es la variable cuyo valor se devuelve. El subproceso saludar recibe un parámetro pero no devuelve nada.
| Función | SubProceso | |
|---|---|---|
| ¿Devuelve valor? | Sí | No |
| Se usa para | calcular | hacer una acción |
| Ejemplo | area(base, altura) |
mostrarMenu() |
En PSeInt existen dos tipos de subprogramas: las funciones y los procedimientos (llamados también subprocesos sin valor de retorno). Indicá cuál es la diferencia…
En PSeInt existen dos tipos de subprogramas: las funciones y los procedimientos (llamados también subprocesos sin valor de retorno). Indicá cuál es la diferencia principal entre ambos y dá un ejemplo de tarea que resolverías con cada uno.
Observá esta función escrita al estilo de PSeInt: Indicá cuál es el nombre de la función, cuál es su parámetro, qué valor devuelve y qué resultado se obtiene al llamarla…
Observá esta función escrita al estilo de PSeInt:
Funcion r <- doble(x)
r <- x * 2
FinFuncion
Indicá cuál es el nombre de la función, cuál es su parámetro, qué valor devuelve y qué resultado se obtiene al llamarla con doble(8).
Parámetros, argumentos y llamadas
El parámetro es el nombre que usa el subprograma para el dato que recibe (n en esPar(n)). El argumento es el valor concreto con el que lo llamás (7 en esPar(7)). El parámetro es como una casilla vacía; el argumento es lo que le ponés adentro cada vez.
Funcion r <- esPar(n)
Si n MOD 2 = 0 Entonces
r <- Verdadero
SiNo
r <- Falso
FinSi
FinFuncion
El operador MOD da el resto de la división entera: 7 MOD 2 = 1 y 10 MOD 2 = 0. Un número es par si el resto al dividir por 2 es 0.
Dada esta función: a) Explicá qué hace el operador MOD y qué resultado devuelve esPar(7) y esPar(10). b) Escribí un fragmento de algoritmo principal que lea un número y,…
Dada esta función:
Funcion r <- esPar(n)
Si n MOD 2 = 0 Entonces
r <- Verdadero
Sino
r <- Falso
FinSi
FinFuncion
- a) Explicá qué hace el operador
MODy qué resultado devuelveesPar(7)yesPar(10). - b) Escribí un fragmento de algoritmo principal que lea un número y, usando esta función, muestre «par» o «impar».
- c) Explicá qué diferencia hay entre el parámetro
ny el valor con el que se llama a la función.
Descomponer un problema en módulos
Para modularizar, seguí estos pasos:
-
Escribí en una frase qué tiene que hacer el programa.
-
Separalo en tareas más chicas, cada una con un solo objetivo.
-
Para cada tarea, definí qué recibe (entrada) y qué devuelve (salida).
-
Decidí si es función (devuelve valor) o subproceso (solo actúa).
-
Definí el orden en que el programa principal las llama.
Camila quiere hacer un programa que calcule el área de un rectángulo, de un triángulo y de un círculo, según lo que elija el usuario en un menú. a) Proponé una división…
Camila quiere hacer un programa que calcule el área de un rectángulo, de un triángulo y de un círculo, según lo que elija el usuario en un menú.
- a) Proponé una división en módulos: nombrá cada subprograma, indicá qué parámetros recibe y qué devuelve.
- b) Explicá qué tendría que hacer el programa principal.
- c) Indicá qué ventaja tiene esta organización si más adelante se quiere agregar el área del trapecio.
Un liceo de Salto necesita un programa para procesar las notas de un grupo. Hay que: (1) cargar las notas de los estudiantes, (2) calcular el promedio del grupo, (3)…
Un liceo de Salto necesita un programa para procesar las notas de un grupo. Hay que: (1) cargar las notas de los estudiantes, (2) calcular el promedio del grupo, (3) contar cuántos estudiantes salvaron (nota mayor o igual que 6) y (4) mostrar un resumen.
- a) Descomponé el problema en subprogramas y completá una tabla con columnas: nombre del módulo, datos de entrada y datos de salida.
- b) Indicá en qué orden los llamaría el programa principal.
- c) Señalá cuál de los módulos podría reutilizarse en otro programa distinto y por qué.
Probar y comparar soluciones
Un módulo se prueba con una prueba de escritorio: se eligen valores de entrada y se sigue el algoritmo a mano, anotando cómo cambian las variables.
Modularizar mejora las pruebas: si mayor(a, b, c) está en una función, se prueba con muchos casos (iguales, crecientes, decrecientes) sin tocar el resto. Una función mayor que sirva para cualquier combinación podría ser así:
Funcion m <- mayor(a, b, c)
m <- a
Si b > m Entonces
m <- b
FinSi
Si c > m Entonces
m <- c
FinSi
FinFuncion
Se parte suponiendo que a es el mayor y se corrige si b o c lo superan; por eso funciona aunque haya valores iguales.
Se quiere hacer un programa para un kiosco que registre ventas. Cada venta tiene un producto con su precio unitario y una cantidad. Si el total de la compra supera los…
Se quiere hacer un programa para un kiosco que registre ventas. Cada venta tiene un producto con su precio unitario y una cantidad. Si el total de la compra supera los 1.000 pesos, se aplica un descuento del 10 %. Al final del día se muestra el total recaudado.
- a) Diseñá la modularización: indicá al menos cuatro subprogramas, con nombre, parámetros y valor devuelto, distinguiendo funciones de procedimientos.
- b) Escribí en pseudocódigo la función que calcula el total de una venta con el descuento.
- c) Hacé la prueba de escritorio de esa función con un precio unitario de 400 pesos y una cantidad de 3, y con un precio de 150 pesos y una cantidad de 2.
- d) Justificá por qué conviene que el cálculo del descuento esté en un módulo separado y no repetido dentro del programa principal.
Dos estudiantes, Santiago y Lucía, resolvieron el mismo problema: leer tres números y mostrar cuál es el mayor y cuál es el menor. Santiago escribió todo el código en un…
Dos estudiantes, Santiago y Lucía, resolvieron el mismo problema: leer tres números y mostrar cuál es el mayor y cuál es el menor. Santiago escribió todo el código en un único bloque, con muchas condiciones repetidas. Lucía escribió dos funciones, mayor(a, b, c) y menor(a, b, c), y un programa principal que las llama.
- a) Comparalos desde el punto de vista de la legibilidad, el mantenimiento y las pruebas.
- b) Escribí en pseudocódigo la función
mayor(a, b, c), de modo que funcione con cualquier combinación de valores. - c) Si luego se pidiera lo mismo para cinco números, explicá qué cambios habría que hacer en cada versión y cuál resulta más conveniente.
- d) Explicá qué es una variable local y por qué ayuda a que los módulos no se interfieran entre sí.
Volvé al principio: la feria del liceo se resuelve con módulos cargarNotas, promedio, contarSalvados y mostrarResumen, coordinados por un programa principal que los llama en orden.
Resumen
-
Un subprograma o módulo es un trozo de algoritmo con nombre que resuelve una tarea y se llama desde el programa principal.
-
Modularizar da reutilización, legibilidad, mantenimiento fácil y pruebas por separado.
-
En PSeInt, la Función devuelve un valor; el SubProceso realiza una acción sin devolver nada.
-
El parámetro es el nombre del dato en la definición; el argumento es el valor de cada llamada.
-
Para dividir un problema: una tarea por módulo, definir entradas y salidas y fijar el orden de las llamadas.
-
Cada módulo se verifica con una prueba de escritorio, incluyendo casos límite.