UNIDAD #05
Modularización:
Procedimientos y Funciones
Modularización:
Procedimientos y Funciones
Bienvenido a la unidad 5 de Programación Básica, al finalizar el estudio de esta
unidad tendrás un conocimiento y adquirirás habilidades de los siguientes temas:
5.1. – Introducción:
Como ya vimos en unidades anteriores, cuando necesitamos resolver un
problema, es muy útil -y a veces la única forma de resolverlo-, plantearlo con un enfoque Cuando llamamos a un
procedimiento o
descendente, dividiéndolo en varios problemas más pequeños. Los lenguajes de función, se transfiere el
programación modernos nos brindan la posibilidad de definir procedimientos y control a la primer
funciones (podemos usar el término subrutina para referirnos a ambos en forma sentencia de dicha
genérica). subrutina, se ejecuta
esta completamente y
Las subrutinas son porciones de código que se programan para resolver algún luego se transfiere el
control a la sentencia
problema determinado, por ejemplo podemos tener un procedimiento que se encargue siguiente a aquella en
de realizar la validación de una palabra clave ingresada por el usuario o una función que la que se realizó la
calcule alguna expresión matemática compleja y nos retorne un valor. llamada.
• de Evento
• Generales
• de Propiedad
ó nombre_procedimiento parametros
A continuación vemos como luce una pequeña aplicación de ejemplo que codificamos
para explicar la utilización de los procedimientos:
A continuación vemos como luce una pequeña aplicación de ejemplo que codificamos
para explicar la utilización de las funciones en VB:
La función factorial, la hemos codificado dentro de un módulo estándar, para que pueda
ser llamada por todos los módulos y formularios de nuestra aplicación. Su código luce
como se ve a continuación:
Muchas veces las
Public Function Factorial(N As Integer) As Long funciones que
Dim T As Long definimos además de
Dim I As Integer retornar un valor
' Fact(n) = 1 * 2 * ... * (n-1) * n realizan otros procesos
(por ejemplo sobre
T=1 variables globales).
For I = 1 To N Podemos llamar a las
T=T*I funciones mediante
Next I Call para no tener
necesidad de asignar
Factorial = T el valor retornado a
End Function una variable. Es decir
que llamar a una
Observaciones: función mediante Call,
permite que la misma
- Como la función factorial crece rápidamente definimos como Long el tipo de se comporte como si
datos que retorna. Igualmente si ingresamos valores altos para N, esta fuera un
procedimiento,
función puede producir un error de desbordamiento (valor demasiado descartando su valor
grande para el tipo de datos). de retorno.
Siempre debemos recordar asignar el valor que nos retorna una función a una variable
del mismo tipo, o realizar la conversión necesaria.
Con las funciones también podemos salir de forma anticipada, la instrucción que Cuando utilicemos Exit
nos permite lograr esto es Exit Sub: Function para salir de
una función recordemos
siempre asignarle en
Function DivisionStr( Operador1 As Integer, Operador2 As Integer) As String forma previa a la función
Dim Resultado As Double un valor de retorno.
If Operador2 = 0 Then
DivisionStr = “Error”
Exit Function
End If
Resultado = Operador1 / Operador2
DivisionStr = Str(Resultado)
End Sub
Cuando pasamos un parámetro por referencia, la variable con la que trabaja el Es importante recordar
que en VB el
procedimiento (también denominada parámetro formal) y la variable original (parámetro mecanismo de paso de
actual), hacen referencia a la misma zona de memoria. Podemos decir que ambas son parámetros por
la misma variable identificada con dos nombres diferentes en distintas partes del default es por
programa. referencia, a diferencia
de lo que sucede en
muchos otros
Para pasar un parámetro por referencia se puede utilizar la palabra clave ByRef antes lenguajes de
del nombre del argumento en la cabecera del procedimiento, pero como este programación en los
mecanismo es el mecanismo por default no es necesario escribirlo. cuales el mecanismo
por default es por
valor.
Pasar argumentos por referencia le da al procedimiento acceso al contenido real de la
variable en su ubicación de dirección de memoria. Como resultado, el procedimiento al
que se ha pasado el valor de la variable se puede modificar de forma permanente. La
forma predeterminada de pasar valores en Visual Basic es por referencia.
Sub ProcedimientoLlamador ()
Dim X As Integer
X = 345
Llamado(X)
End Sub
En muchas ocasiones no nos interesa que los datos que recibe un procedimiento, si son
modificados, repercutan en las variables originales (parámetros actuales). Si pasamos
los parámetros por valor, VB pasa como argumentos una copia de los valores
originales, y el procedimiento trabaja sobre dicha copia. Por lo tanto los valores
originales quedan resguardados de cualquier modificación que puedan sufrir dentro del
procedimiento.
Para indicarle a VB que el paso de parámetros es por valor debemos utilizar la palabra
reservada ByVal, antes del nombre del parámetro formal, en la cabecera del
procedimiento.
Nuestro tercer ejemplo nos ayudará a clarificar esta cuestión de los mecanismos de
paso de parámetros.
La aplicación tiene dos botones de comando, mediante uno genera dos números al azar
para inicializar las dos variables y con el otro las intercambia. Cómo el botón de
intercambiar ejecuta el procedimiento Intercambio, codificado en un módulo estándar, el
paso de parámetros se tiene que hacer por referencia.
Podríamos haber escrito las llamadas a los procedimientos habiendo hecho uso de Call,
con el mismo resultado:
Las funciones y los procedimientos pueden recibir parámetros que sean del tipo
array. Este concepto es muy potente pero es fácil de visualizar mediante un ejemplo. El
siguiente trozo de código implementa una función que recibe un parámetro vector y
retorna la sumatoria de sus elementos:
Sumatoria = total
End Function
For I = 0 To 10
vector(I) = I
Next I
Prom = Sumatoria(vector)
MsgBox Prom, , "Sumatoria"
Es muy cómodo poder utilizar funciones que retornen arreglos dinámicos, las
mismas pueden ser llamadas desde procedimientos donde se declaren arreglos
dinámicos, y van a permitir una asignación del resultado de esta función a alguna
variable que sea un arreglo dinámico.
ReDim vector(n)
vector(0) = c
For i = 1 To n
vector(i) = vector(i - 1) + s
Next i
VectorNumeros = vector
End Function
Recibe tres parámetros enteros, y genera un vector que contiene una secuencia
de n+1 componentes (del 0 al n) que comienza con el elemento c y va creciendo con
incrementos de s. Observemos en la cabecera de la función que indicamos como As
Integer() el valor retornado por la función, que es del tipo array. Dentro de la función
declaramos un vector dinámico, lo dimensionamos (con Redim) según el primer
parámetro, y luego de generarlo, se lo asignamos a la función como valor de retorno.
También es posible retornar TDUs como resultado de una función. Puede ser
útil codificar una función que retorne un valor del tipo TDU deseado, con los campos
inicializados con su contenido por default.
P = Inicializa
End Sub
Observemos:
- que al escribir As Persona, en la cabecera de la función estamos
especificando que la función retornará un tipo de datos que es un TDU, por
eso dentro de la función podemos especificar cada uno de los elementos del
TDU con notación de punto.
- que podemos hacer P = Inicializa, y que en este caso la llamada a la
función se evalúa y retorna un valor del tipo Persona, que se asigna a P.
q La ventana Locales nos permite visualizar el estado de todas las variables que
se encuentran definidas en el ambiente de la instrucción que se está ejecutando
cuando estamos en modo depuración.
Para visualizar esta ventana ejecutamos el menú Ver (View), opción Call Stack
(Pila de Llamadas), o simplemente pulsamos Ctrl-L.
Aplicación Objetivo
proEjemploProcedimientoGeneral1 Un procedimiento sencillo, definido en un módulo.
proEjemploFuncion1 Una función sencilla: cálculo del factorial de un
número.
proEjemploPasodeParametros Ejemplo de paso de parámetros por valor y por
referencia: procedimiento Intercambio.
Las aplicaciones de esta unidad tienen un objetivo principal que consiste en que
veas cómo se pueden organizar de una manera cómoda y prolija, la estructura de los
programas, mediante el uso de funciones, procedimientos y módulos.