3 - Guia Subprogramas 2020

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 15

CURSO DE PROGRAMACIÓN FULL STACK

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”.

Este método de diseñar la solución de un problema principal obteniendo las soluciones


de sus subproblemas se conoce como diseño descendente (top-down). Se denomina
descendente, ya que se inicia en la parte superior con un problema general y el diseño
específico de las soluciones de los subproblemas. Luego, las partes en que se divide un
programa deben poder desarrollarse independientemente entre sí.

Las soluciones de un diseño descendente pueden implementarse fácilmente en lenguajes


de programación y se los denomina subprogramas o sub-algoritmos si se emplean desde
el concepto algorítmico.

El problema principal se soluciona por el correspondiente programa o algoritmo principal y


la solución de los subproblemas mediante subprogramas, conocidos como procedimientos
o funciones. Un subprograma recibe datos desde el programa y le devuelve resultados.

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

Un programa con diferentes niveles de subprogramas

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

Funcion variable_de_retorno <- Nombre (lista de parámetros formales)


Definir variable_de_retorno como Tipo de Dato
<acciones> //cuerpo de la función
Fin Funcion

• Argumentos (parámetros formales); uno o más argumentos de la siguiente forma:


(parámetro 1 [Por Valor/Por Referencia], parámetro 2 [Por Valor/Por Referencia],…]).

• Nombre asociado con la función, que será un nombre de identificador válido.

• <acciones> instrucciones que constituyen la definición de la función y que debe


contener alguna instrucción mediante la cual se asigne un valor a la
variable_de_retorno.

• variable_de_retorno contiene el resultado que devuelve la función que debe


coincidir con el tipo de dato de retorno.

INVOCACIÓN A LAS FUNCIONES

Una función puede ser llamada de la siguiente forma:

nombre_función (lista de parámetros actuales)

• nombre_función: función que va a llamar

• lista de parametros actuales: constantes, variables, expresiones.

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.

Una llamada a la función implica los siguientes pasos:

1. A cada parámetro formal se le asigna el valor real de su correspondiente parámetro


actual.

2. Se ejecuta el cuerpo de acciones de la función.

3. Se devuelve el valor de la función y se retorna al punto de llamada.

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.

Un procedimiento es un subprograma que ejecuta un proceso específico. Ningún valor


está asociado con el nombre del procedimiento; por consiguiente, no puede ocurrir en una
expresión. Un procedimiento se llama escribiendo su nombre. Cuando se invoca el
procedimiento, los pasos que lo definen se ejecutan y a continuación se devuelve el
control al programa que le llamó.

SINTAXIS

SubProceso Nombre (lista de parámetros formales)


<acciones>
FinSubProceso

Los parámetros formales tienen el mismo significado que en las funciones.

INVOCACIÓN A UN SUBPROGRAMA

Un procedimiento puede ser llamado de la siguiente forma:

nombre [(lista de parámetros actuales)]

• nombre_procedimiento: procedimiento que se va a llamar


• lista de parametros actuales: constantes, variables, expresiones.

La lista de parámetros, formales en el procedimiento o actuales (reales) en la llamada se


conoce como lista de parámetros.

ÁMBITO: VARIABLES LOCALES Y GLOBALES

Las variables utilizadas en los programas principales y subprogramas se clasifican en dos


tipos: variables locales y variables globales.

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.

4
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.

Una variable local a un subprograma no tiene ningún significado en otros subprogramas. Si


un subprograma asigna un valor a una de sus variables locales, este valor no es accesible a
otros programas, es decir, no pueden utilizar este valor. A veces, también es necesario que
una variable tenga el mismo nombre en diferentes subprogramas. Por el contrario, las
variables globales tienen la ventaja de compartir información de diferentes subprogramas
sin una correspondiente entrada en la lista de parámetros.

COMUNICACIÓN CON SUBPROGRAMAS: PASO DE PARÁMETROS

Cuando un programa llama a un subprograma, la información se comunica a través de la


lista de parámetros y se establece una correspondencia automática entre los parámetros
formales y actuales. Los parámetros actuales son “sustituidos” o “utilizados” en lugar de los
parámetros formales.

La declaración del subprograma se hace con

Subproceso nombre (F1, F2,…, Fn)


<acciones>
FinSubproceso

y la llamada al subprograma con:

nombre (A1, A2, ..., An)

donde F1, F2, ..., Fn son los parámetros formales y A1, A2, ..., An los parámetros actuales o
reales.

Los métodos más empleados para realizar el paso de parámetros son:

Paso por Valor

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.

5
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.

Paso por Referencia

En numerosas ocasiones se requiere que ciertos parámetros sirvan como parámetros de


salida, es decir, se devuelvan los resultados al programa que llama. Este método se
denomina paso por referencia o también de llamada por dirección o variable. El programa
que llama pasa al subprograma la dirección del parámetro actual (que está en el ámbito
del programa que llama). Una referencia al correspondiente parámetro formal se trata
como una referencia a la posición de memoria, cuya dirección se ha pasado. Entonces una
variable pasada como parámetro real es compartida, es decir, se puede modificar
directamente por el subprograma.
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

Una función o procedimiento que se puede llamar a sí mismo se llama recursivo. La


recursión (recursividad) es una herramienta muy potente en algunas aplicaciones, sobre
todo de cálculo. La recursión puede ser utilizada como una alternativa a la repetición o
estructura repetitiva. El uso de la recursión es particularmente idóneo para la solución
de aquellos problemas que pueden definirse de modo natural en términos recursivos.
La escritura de un procedimiento o función recursiva es similar a sus homónimos no
recursivos; sin embargo, para evitar que la recursión continúe indefinidamente es preciso
incluir una condición de terminación.

6
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

2. En el paso de argumentos por valor se pueden utilizar:


a) Sólo variables
b) Sólo variables o expresiones
c) Sólo constantes o expresiones
d) Variables, constantes o expresiones

3. En el paso de argumentos por referencia se pueden utilizar:


a) Sólo variables
b) Variables, constantes o expresiones
c) Sólo variables o expresiones
d) Sólo constantes o expresiones

4. Una constante puede pasarse como argumento a una función:


a) Sólo por valor
b) Sólo por referencia
c) Por valor y por referencia
d) No puede pasarse

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

6. ¿Qué características tienen los elementos locales?


a) Son visibles en su ámbito y fuera
b) Son invisibles en su ámbito y fuera
c) Son invisibles en su ámbito y visibles fuera
d) Son visibles en su ámbito e invisibles fuera

7. ¿Qué características tienen los elementos globales?


a) Son visibles en su ámbito y fuera
b) Son invisibles en su ámbito y fuera
c) Son visibles en su ámbito e invisibles fuera
d) Son invisibles en su ámbito y visibles fuera

8. Una función de un programa siempre debe


a) Recibir al menos un parámetro
b) Ser llamado en el algoritmo principal
c) Ser recursivo
d) Ninguna de las anteriores

7
9. Cuando se escribe una función PSeInt
a) Es necesario definir el tipo de dato de la variable de retorno
b) No es necesario definir el tipo de dato de la variable de retorno
c) Es indiferente si el tipo de dato de la variable de retorno se define o no
d) Ninguna de 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.

VER VIDEO: Subprogramas: Funciones

1. Recordando el ejercicio 13 de la guía 2, ahora vamos a sumar una función que se


encargue de ver si la primera letra de nuestra frase y la ultima son la misma. La función
nos devolverá en mensaje de ‘Correcto’ o ‘Incorrecto’ para mostrarlo en nuestro
algoritmo.

2. Recordando el ejercicio 16 de la guía 2, ahora deberemos agregarle funciones a


nuestro ejercicio. Deberemos llamar una función para cada operación aritmética que
devuelva el resultado de dicha operación y en el algoritmo principal se mostrará el
resultado dependiendo de la operación.

3. 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.

4. Crea una función EsMultiplo que reciba los dos números pasados por el usuario,
validando que el primer numero sea mayor que el segundo y devuelva si el primer
numero es múltiplo del segundo.

5. 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.

6. Crear una funcion llamada “Login”, que recibe un nombre de usuario y una contraseña
y te devuelve Verdadero si el nombre de usuario es “usuario1” y la contraseña es
“asdasd”. Además la función calculara el número de intentos que se ha usado para
loguearse, tenemos solo 3 intentos para loguearnos, si nos quedamos sin intentos la
función devolverá Falso.

7. Realizar una función que calcule la suma de los dígitos de un numero.

Ejemplo: 25 = 2 + 5 = 7

Nota: Para obtener el último numero de un digito de 2 cifras o más debemos pensar en
el resto de una división entre 10. Recordar el uso de la función Mod y Trunc.

8. Realizar un programa que pida al usuario una frase y una letra a buscar en esa frase. La
función debe devolver la cantidad de veces que encontró la letra. Nota: recordar el uso
de la función Subcadena().

9
9. 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:

a) La tarifa de las horas diurnas es de $ 90


b) La tarifa de las horas nocturnas es de $ 125
c) En caso de ser feriado, la tarifa se incrementa en un 10% si el turno es diurno y
en un 15% si el turno es nocturno.

El programa debe solicitar la siguiente información al usuario: el nombre del


trabajador, el día de la semana, el turno (diurno o nocturno) y la cantidad de horas
trabajadas. Además, debemos preguntarle al usuario si el día de la semana (lunes,
martes, miércoles, etc.) era festivo o no, para poder calcular el jornal diario. Utilice
una función para realizar el cálculo.

10. Realizar una función que reciba un numero ingresado por el usuario y averigüe si el
numero es primo o no. Un número es primo cuando es divisible sólo por 1 y por sí
mismo, por ejemplo: 2, 3, 5, 7, 11, 13, 17, etc. Nota: recordar el uso del MOD.

11. Realizar una función que reciba un numero ingresado por el usuario y averigüe si el
número tiene todos sus dígitos impares (ejemplo: 333, 55, etc.). Para esto vamos a
tener que separar el numero en partes (si es un numero de más de un digito) y ver si
cada numero es par o impar. Nota: recordar el uso de la función Mod y Trunc(). No
podemos pasar el numero a cadena para realizar el ejercicio.

12. 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:

1, 1, 2, 3, 5, 8, 13, 21, 34, ...

Donde cada uno de los números se calcula sumando los dos anteriores a él. Por
ejemplo:

La sucesión del número 2 se calcula sumando (1+1)


Análogamente, la sucesión del número 3 es (1+2),
Y la del 5 es (2+3),
Y así sucesivamente…

La sucesión de Fibonacci se puede formalizar de acuerdo a la siguiente fórmula:

Fibonacci (n) = Fibonacci (n-1) + Fibonacci (n-2) para todo n > 1


Fibonacci (n) = 1 para todo n <= 1

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.

Para conocer más acerca de la serie de Fibonacci consultar el siguiente link:


https://quantdare.com/numeros-de-fibonacci/

10
VER VIDEO: Subprogramas: Procedimientos

13. Realizar un procedimiento que permita intercambiar el valor de dos variables de tipo
entero.

14. Realizar un subproceso que reciba una letra y muestre un mensaje si esa letra esta
entre las letras “M” y “T”. Recordar que Pseint les da un valor numérico a cada letra a
través del Código Ascii.

15. Crear una procedimiento que calcule la temperatura media de un día a partir de la
temperatura máxima y mínima. Crear un programa principal, que utilizando el
procedimiento anterior, vaya pidiendo la temperatura máxima y mínima de cada día y
vaya mostrando la media. El programa pedirá el número de días que se van a
introducir.

16. Crear un programa que dibuje una escalera de números, donde cada línea de números
comience en uno y termine en el número de la línea. Solicitar la altura de la escalera al
usuario al comenzar. Ejemplo: si se ingresa el número 3:

1
12
123

17. 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.

18. 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

@ # $ % *

11
Realice un subprograma que reciba una secuencia de caracteres y retorne la
codificación correspondiente. Utilice la estructura “según” para la transformación.

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.

NOTA: investigue el uso de la función concatenar de PSeInt para armar la palabra/frase.

VER VIDEO: Recursión

19. Escribir una función recursiva que devuelva la suma de los primeros N enteros.

20. 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.

21. 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.

12
EJERCICIOS DE APRENDIZAJE EXTRAS
Funciones

1. El número de combinaciones de m elementos tomados de n es:

! !!
( " ) = ("!(!%")!)

m
Diseñar una función que permita calcular el número combinatorio de ( n )
Nota: n debe ser mayor a 0 y menor que m.

2. Diseñar una función que reciba un numero en forma de cadena y lo devuelva como
numero entero. El programa podrá recibir números de hasta 3 dígitos. Nota: no poner
números con decimales

3. Realizar una función que reciba un numero ingresado por el usuario y averigüe si el
numero es capicúa o no (Por ejemplo: 12321). Nota: recordar el uso del MOD y el Trunc.
No podemos transformar el numero a cadena para realizar el ejercicio.

Procedimientos

4. 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).

5. 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.

6. Diseñar un procedimiento que reciba una frase, y el programa remueva todas las
vocales repetidas. Al final el procedimiento mostrará la frase final.

7. Crea un procedimiento “convertirEspaciado”, que reciba como parámetro un texto y


muestra una cadena con un espacio adicional tras cada letra.
Por ejemplo, “Hola, tú” devolverá “H o l a , t ú “. Crea un programa principal donde se
use dicho procedimiento.
Recursión

8. Realice nuevamente un programa que calcule la función de Fibonacci pero esta vez de
manera recursiva.

9. 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

13
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.

14

También podría gustarte