3 - Guía Subprogramas 2020
3 - Guía Subprogramas 2020
3 - Guía Subprogramas 2020
SUBPROGRAMAS
CON PSEINT
GUÍA DE SUBPROGRAMAS
SUBPROGRAMAS
Un método muy útil para solucionar un problema complejo es dividirlo en subproblemas —
problemas más sencillos— y a continuación dividir estos subproblemas en otros más
simples, hasta que los problemas más pequeños sean fáciles de resolver. Esta técnica de
dividir el problema principal en subproblemas se suele denominar “divide y vencerás”.
Cada vez que el subprograma es llamado, el control retorna al lugar desde donde fue
hecha la llamada, y a su vez, un subprograma puede llamar a otros subprogramas.
1
Un programa con un subprograma: función y procedimiento
FUNCIONES
Matemáticamente una función es una operación que toma uno o más valores llamados
argumentos y produce un valor denominado resultado (valor de la función para los
argumentos dados).
Cada función se evoca utilizando su nombre en una expresión con los argumentos
actuales o reales encerrados entre paréntesis. A una función no se le llama explícitamente,
sino que se le invoca o referencia mediante un nombre y una lista de parámetros actuales.
El algoritmo o programa llama o invoca a la función con el nombre de esta última en una
expresión seguida de una lista de argumentos que deben coincidir en cantidad, tipo y
orden con los de la función que fue definida. La función devuelve un único valor.
DECLARACIÓN DE FUNCIONES
La declaración de una función requiere una serie de pasos que la definen. Una función
como tal subalgoritmo o subprograma tiene una constitución similar a los algoritmos, por
consiguiente, constará de una cabecera que comenzará con el tipo del valor devuelto por
la función, seguido de la palabra función y del nombre y argumentos de dicha función. A
continuación, irá el cuerpo de la función, que será una serie de acciones o instrucciones
cuya ejecución hará que se asigne un valor al nombre de la función. Esto determina el
valor particular del resultado que ha de devolverse al programa llamador.
2
SINTAXIS
Cada vez que se llama a una función desde el algoritmo principal se establece
automáticamente una correspondencia entre los parámetros formales y los parámetros
actuales. Debe haber exactamente el mismo número de parámetros actuales que de
parámetros formales en la declaración de la función y se presupone una correspondencia
uno a uno de izquierda a derecha entre los parámetros formales y los actuales.
3
PROCEDIMIENTOS
Aunque las funciones son herramientas de programación muy útiles para la resolución de
problemas, con frecuencia se requieren subprogramas que calculen varios resultados en
vez de uno solo, o que realicen la ordenación de una serie de números, etc. En estas
situaciones la función no es apropiada y se necesita disponer del otro tipo de
subprograma: el procedimiento.
SINTAXIS
INVOCACIÓN A UN SUBPROGRAMA
Los procedimientos y funciones son subprogramas cuyo diseño y misión son similares; sin
embargo, existen unas diferencias esenciales entre ellos.
4
2. Las funciones devuelven un valor, los procedimientos pueden devolver 0,1 o n
valores y en forma de lista de parámetros.
Una variable local es aquella que está declarada y definida dentro de un subprograma, en
el sentido de que está dentro de ese subprograma y es distinta de las variables con el
mismo nombre declaradas en cualquier parte del programa principal. El significado de una
variable se confina al procedimiento en el que está declarada. Cuando otro subprograma
utiliza el mismo nombre se refiere a una posición diferente en memoria. Se dice que tales
variables son locales al subprograma en el que están declaradas.
Una variable global es aquella que está declarada para el programa o algoritmo principal,
del que dependen todos los subprogramas. La parte del programa/algoritmo en que una
variable se define se conoce como ámbito o alcance (scope, en inglés).
El uso de variables locales tiene muchas ventajas. En particular, hace a los subprogramas
independientes, con la comunicación entre el programa principal y los subprogramas
manipulados estructuralmente a través de la lista de parámetros. Para utilizar un
procedimiento sólo necesitamos conocer lo que hace y no tenemos que estar
preocupados por su diseño, es decir, cómo están programados.
5
COMUNICACIÓN CON SUBPROGRAMAS: PASO DE PARÁMETROS
donde F1, F2, ..., Fn son los parámetros formales y A1, A2, ..., An los parámetros actuales o
reales.
Los parámetros se tratan como variables locales y los valores iniciales se proporcionan
copiando los valores de los correspondientes argumentos. Los parámetros formales
(locales a la función o procedimiento) reciben como valores iniciales los valores de los
parámetros actuales y con ello se ejecutan las acciones descritas en el subprograma.
Aunque el paso por valor es sencillo, tiene una limitación acusada: no existe ninguna otra
conexión con los parámetros actuales, y entonces los cambios que se produzcan por
efecto del subprograma no producen cambios en los argumentos originales y, por
consiguiente, no se pueden pasar valores de retorno al punto de llamada: es decir, todos
los parámetros son sólo de entrada. El parámetro actual no puede modificarse por el
subprograma. La llamada por valor no devuelve información al programa que llama.
En PSeInt todas las variables escalares que hemos visto hasta el momento pasan por
defecto “Por Valor” sino se especifica lo contrario explícitamente.
6
La característica de este método se debe a su simplicidad y su analogía directa con la idea
de que las variables tienen una posición de memoria asignada desde la cual se pueden
obtener o actualizar sus valores. El área de almacenamiento (direcciones de memoria) se
utiliza para pasar información de entrada y/o salida; en ambas direcciones.
En este método los parámetros son de entrada/salida y los parámetros se denominan
parámetros variables.
RECURSIÓN
PREGUNTAS DE APRENDIZAJE
1. Un subprograma es:
a) Un código especial que se utiliza para resolver distintos tipos de problemas.
b) Un método de solucionar un problema complejo dividiéndolo en subproblemas
c) Un método que siempre debe retornar algún resultado
d) Ninguna de las anteriores
7
5. Una variable puede pasarse como argumento a un subprograma:
a) Sólo por valor
b) Sólo por referencia
c) Por valor y por referencia
d) No puede pasarse como argumento
9. Un procedimiento puede
a) No devolver ningún resultado
b) Devolver n resultados
c) Devolver sólo un resultado
d) Todas las anteriores
8
EJERCICIOS DE APRENDIZAJE
Para cada uno de los siguientes ejercicios realizar el análisis del problema e indicar cuáles
son los datos de entrada y cuáles son los datos de salida. Escribir luego el programa en
PSeInt utilizando funciones y/o procedimientos.
1. Realizar una función que devuelva la longitud de una cadena pasada por parámetro.
Para realizar este ejercicio no podemos usar la función Longitud(). Nota: recordar el uso
de la funcion Subcadena().
2. Realizar una función que valide si un numero es impar o no. Si es impar la función debe
devolver un resultado, si no es impar debe devolver otro. Nota: la función no debe
tener mensajes que digan si es par o no, eso debe pasar en el Algoritmo.
3. Realizar una función que calcule y retorne la suma de todos los divisores del número n
distintos de n. El valor de n debe ser ingresado por el usuario.
Ejemplo: 25 = 2 + 5 = 7
5. Diseñar una función que permita obtener el máximo común divisor de dos números
mediante el algoritmo de Euclides. Si no conoce el algoritmo de Euclides puede
consultar el siguiente link:
https://www.superprof.es/apuntes/escolar/matematicas/aritmetica/divisibilidad/algorit
mo-de-euclides.html
6. Dos números 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
Escriba un programa que a través del uso de una función determine si dos números
ingresados por el usuario son amigos o no.
m
Diseñar una función que permita calcular el número combinatorio de ( )
n
9
8. Los empleados de una fábrica trabajan en dos turnos: Diurno y Nocturno. Se desea
calcular el jornal diario de acuerdo con las siguientes reglas:
9. Solicitar al usuario que digite un número y escriba un programa que a través del uso de
funciones determine lo siguiente:
10. Realizar una función que permita obtener el término n de la sucesión de Fibonacci. La
sucesión de Fibonacci es la sucesión de los siguientes números:
Donde cada uno de los números se calcula sumando los dos anteriores a él. Por
ejemplo:
Por lo tanto, si queremos calcular el término “n” debemos escribir una función que
reciba como parámetro el valor de “n” y que calcule la serie hasta llegar a ese valor.
10
VER VIDEO: Subprogramas: Procedimientos
11. Realizar un procedimiento que permita intercambiar el valor de dos variables de tipo
entero.
12. Realizar un procedimiento que permita realizar la división entre dos números y
obtenga el cociente y el resto utilizando el método de restas sucesivas.
Método de división por restas sucesivas: Restar el dividendo del divisor hasta obtener
un resultado menor que el divisor, este resultado es el residuo, y el número de restas
realizadas es el cociente. Por ejemplo: 50 / 13:
50 – 13 = 37 una resta realizada
37 – 13 = 24 dos restas realizadas
24 – 13 = 11 tres restas realizadas
dado que 11 es menor que 13, entonces: el residuo es 11 y el cociente es 3.
13. Diseñar un procedimiento que permita convertir coordenadas polares (radio, angulo)
en cartesianas (x,y). NOTA: x=radio*cos(angulo) e y=radio*sen(angulo).
14. Realice un algoritmo que solicite al usuario una fecha y muestre por pantalla la fecha
anterior. Para ello se deberá utilizar un procedimiento llamado diaAnterior que reciba
una fecha representada a través de tres enteros dia, mes y anio, y retorne la fecha
anterior. Puede asumir que dia, mes y anio representan una fecha válida. Realice
pruebas de escritorio para los valores dia=5, mes=10, anio=2012 y para dia=1, mes=3,
anio=2004.
15. Escribir un programa que procese una secuencia de caracteres ingresada por teclado
y terminada en punto (leídos de a uno por vez), y luego codifique la palabra o frase
ingresada de la siguiente manera: cada vocal se reemplaza por el carácter que se
indica en la tabla y el resto de los caracteres (incluyendo a las vocales acentuadas) se
mantienen sin cambios.
a e i o u
@ # $ % *
Por ejemplo, si el usuario ingresa: Ayer, lunes, salimos a las once y 10.
La salida del programa debería ser: @y#r, l*n#s, s@l$m%s @ l@s %nc# y 10.
11
VER VIDEO: Recursión
13. Escribir una función recursiva que devuelva la suma de los primeros N enteros.
14. Crear un programa que calcule la suma de los enteros positivos pares desde N hasta 2.
Chequear que si N es impar se muestre un mensaje de error.
15. Implemente de forma recursiva una función que le dé la vuelta a una cadena de
caracteres. NOTA: Si la cadena es un palíndromo, la cadena y su inversa coincidirán.
16. Realice nuevamente un programa que calcule la función de Fibonacci pero esta vez de
manera recursiva.
17. Escribir un programa que calcule el máximo común divisor (MCD) de dos enteros
positivos. Si M >= N una función recursiva para MCD es:
MCD = M, si N =0
MCD = MCD (N, M mod N), si N <> 0
El programa le debe permitir al usuario ingresar los valores para M y N. Una función
recursiva es entonces llamada para calcular el MCD. El programa debe imprimir el
valor para el MCD.
NOTA: Si el usuario ingresa un valor para M que es < que N entonces el programa es
responsable de intercambiar los valores para calcular el MCD.
12