You are on page 1of 20

PROCEDIMIENTOS O SUBRUTINAS

Un procedimiento es un contenedor que guarda un


conjunto de lneas de cdigo que luego puede ser llamado
por el programa en cualquier punto y en cualquier
momento. No devuelve valores a no ser que se especifique
un parmetro por referencia ByRef. La sintaxis es como
sigue:


mbito: el procedimiento puede ser
Private.- donde se puede llamar solamente en el mdulo dnde se est
ejecutando
Public.- donde se puede llamar desde cualquier mdulo y static.
Static.- conserva sus valores una vez terminada su ejecucin
Nombre del procedimiento: es el nombre que identifica al procedimiento.
Parmetros: son los parmetros que se pueden pasar al procedimiento.

Veamos un ejemplo prctico. A continuacin declararemos un procedimiento y
lo llamaremos desde el programa principal. No le pasaremos ningn parmetro
por el momento. Este procedimiento llamado suma, sumar 2 variables y
mostrar por pantalla el resultado.

Las subrutinas tienen un principio y un fin y estas pueden tener distinto tipo de
alcance, o sea pueden ser de tipo private, pblic o static.
Procedimiento Esttico
Para que las variables de un procedimiento se conserven una vez terminada su
ejecucin, ste debe definirse como Esttico:
Static Sub Procedimiento(Argumento1,Argumento2,.....)
[Sentencias]
End Sub
La sentencia Sub y End Sub son obligatorias al definir cualquier procedimiento.
Los argumentos y las sentencias Private, Public y Static son opcionales. Es
importante mencionar que al definir un procedimiento sin ninguna de las sentencias
anteriores, por defecto ste se define como Pblico, es decir:
Sub Procedimiento(argumento1,argumento2,.....)
[Sentencias]
End Sub
Es equivalente a :

Public Sub Procedimiento(argumento1,argumento2,.....)
[Sentencias]
End Sub

Existe una instruccin que permite terminar la ejecucin de un procedimiento, sta es la
instruccin Exit Sub. Por ejemplo, si tenemos el siguiente procedimiento:

Sub Procedimiento(argumento1,argumento2,.....)
[Sentencias]
Exit Sub
[Sentencias]
End Sub


















Module Module1
Sub Main()
suma()
Console.ReadLine()
End Sub

Private Sub suma()
Dim i As Integer
Dim x As Integer
Dim resu As Integer
i = 5
x = 21
resu = x + i
Console.Write(resu)
End Sub

End Module
PARMETROS EN VISUAL BASIC


Parmetro: datos que son pasados cuando se llama a una
funcin o procedimiento. Son datos que son sustituidos por los
argumentos y variables reales que los invocan.

Ejemplo:

Sub Raiz (N As Double, F As Double) '- En este caso tenemos 2 parmetros
If N < 0 Then
Exit Sub 'Se mandara un mensaje de error
Else
F = Sqr(N)
End If
End Sub

Call Raiz(N, F) '.. En este caso tenemos 2 argumentos, que se sustituyen
Raiz(N,F)

Los argumentos son un lista de constantes, variables
o expresiones separadas por comas que son pasadas
a la funcin. En principio, el nmero de argumentos
debe ser igual al nmero de parmetros de la
funcin. Los tipos de los argumentos deben coincidir
con los tipos de sus correspondientes parmetros, de
lo contrario puede haber fallos importantes en la
ejecucin del programa.

Bien, que tal si ahora le pasamos un parmetro. el siguiente programa suma 6 variables y la
suma se la pasa a un procedimiento que calcula el promedio y luego imprime el resultado.
Deben saber que el procedimiento no devuelve el resultado final al programa principal, solo
calcula el promedio y lo imprime. ya pronto veremos cmo devolverle un valor al programa
Main.




















Module Module1
Sub Main()
Dim a, b, c, d, e, f, suma As Integer
a = 12
b = 54
c = 34
d = 65
e = 34
f = 23
suma = a + b + c
suma1= d + e + f
calcula_promedio(suma,suma1)
Console.ReadLine()
End Sub

Private Sub calcula_promedio(ByVal p_suma, ByVal p_suma1)
Dim promedio As Double
promedio =(p_suma+ p_suma) / 6
Console.WriteLine(" el promedio es {0}", promedio)
End Sub

End Module
Ahora veremos cmo hacer que nuestro procedimiento le devuelva un valor al programa
Main y sea ste quien lo imprima por pantalla.





































Module Module1
Sub Main()
Dim a, b, c, suma As Integer
Dim promedio As Double
a = 9
b = 54
c = 36
suma = a + b + c
calcula(suma, promedio)
promedio= promedio +a
Console.WriteLine("El promedio es: {0}", promedio)
Console.ReadLine()
End Sub
Private Sub calcula_promedio(ByVal su, ByRef pro)
pro = su / 6
End Sub

End Module

Module Module1
Sub Main()
Dim a, b, c, suma As Integer
Dim promedio As Double = 9
a = 3
b = 6
c = 9
suma = a + b + c
calcula(suma, promedio) ' regresa 9
promedio = promedio + a 'promedio le suma 3
Console.WriteLine("El promedio es: {0}", promedio) 'Imprime 12
Console.ReadLine()
End Sub

Private Sub calcula(ByVal su, ByRef pro)
su = su + pro
pro = su / 3
End Sub
End Module



Con la palabra clave ByRef, le decimos al procedimiento que el valor que recibir en ese
parmetro, deber devolverlo a la llamada desde el programa principal.















Existen 2 tipos de parmetros, POR VALOR y POR REFERENCIA:
EJEMPLOS:




POR VALOR

Ejemplo:
Module Module1
Sub Main()
Dim dato1 As Integer

dato1 = 1000
Call miProcedimiento(dato1)
' miProcedimiento(dato1)

MsgBox(dato1)
End Sub


Sub miProcedimiento(ByVal X As
Integer)
' Calculamos el doble de X
X = X * 2
MsgBox(X)
End Sub
End Module
POR REFERENCIA

Ejemplo:
Module Module1
Sub Main()
Dim dato1 As Integer

dato1 = 1000
' Call miProcedimiento(dato1)
miProcedimiento(dato1)
MsgBox(dato1)
End Sub


Sub miProcedimiento(ByRef X As
Integer)
' Calculamos el doble de X
X = X * 2
MsgBox(X)
End Sub
End Module



La nica diferencia entre estos 2 ltimos ejemplos es la palabra reservada
ByVal























Module Module1 Cuadratica con subrutina
Sub Main()
Dim prueba As Double
Dim a, b, c, x1, x2 As Integer
Console.WriteLine("teclee a")
a = Console.ReadLine()
Console.WriteLine("teclee b")
b = Console.ReadLine()
Console.WriteLine("teclee c ")
c = Console.ReadLine()
prueba = b * b - (4 * a * c)
If (prueba < 0) Then
Console.WriteLine("El resultado esta en los numeros complejos")
Console.ReadLine()
End
End If
calcula(a, b, c, x1, x2)
Console.WriteLine("El valor de x1 {0:F2} ", x1)
Console.WriteLine("El valor de x2 {0:F2} ", x2)
Console.ReadLine()
End Sub
Private Sub calcula(ByVal a, ByVal b, ByVal c, ByRef x1, ByRef x2)
Dim raiz As Double
raiz = Math.Sqrt((b * b) - 4 * a * c)
x1 = (-b + raiz) / (2 * a)
x2 = (-b - raiz) / (2 * a)
End Sub
End Module

Module Module1 Cuadratica con subrutina entrada,proceso,salida
Sub Main()
Dim prueba As Double
Dim a, b, c, x1, x2 As Integer
entrada(a, b, c)
prueba = b * b - (4 * a * c)
If (prueba < 0) Then
Console.WriteLine("El resultado esta en los numeros complejos")
Console.ReadLine()
End
End If
Proceso(a, b, c, x1, x2)
Salida(x1, x2)
Console.ReadLine()
End Sub
Private Sub Entrada(ByRef a, ByRef b, ByRef c)
Console.WriteLine("teclee a")
a = Console.ReadLine()
Console.WriteLine("teclee b")
b = Console.ReadLine()
Console.WriteLine("teclee c ")
c = Console.ReadLine()
End Sub
Private Sub Proceso(ByVal a, ByVal b, ByVal c, ByRef x1, ByRef x2)
Dim raiz As Double
raiz = Math.Sqrt((b * b) - 4 * a * c)
x1 = (-b + raiz) / (2 * a)
x2 = (-b - raiz) / (2 * a)
End Sub
Private Sub Salida(ByVal x1, ByVal x2)
Console.WriteLine("El valor de x1 {0:F2} ", x1)
Console.WriteLine("El valor de x2 {0:F2} ", x2)
End Sub
End Module
FUNCIONES
Una funcin es un contenedor que guarda un conjunto de lneas de
cdigo que luego puede ser llamado por el programa en cualquier
punto y en cualquier momento. Las funciones devuelven un solo
valor sobre su nombre.

<Ambito> Function<Nom de la funcin>(<parmetros>) as <Tipo de Dato>
<Sentencias>
Nombre de la funcin =Valor
End Sub

mbito: la funcin puede ser:
Private, donde puede se puede llamar solamente en el mdulo dnde se
est ejecutando y Public donde se puede llamar desde cualquier mdulo,
tambin puede ser
Static. Nombre del la funcin: es el nombre que identifica a la funcin.
Parmetros: son los parmetros que se pueden pasar a la funcin. Tipo de
Dato: es el tipo de dato que la funcin puede tomar, como ser, Boolean,
Integer, Double, etc.

Continuando con el ejemplo anterior, esta vez usaremos una funcin para
realizar el ejercicio.
















Module Module1
Sub Main()
Dim a, b, c, d, e, f, suma As Integer
a = 16
b = 24
c = 25
d = 15

suma = a + b + c + d
Console.WriteLine("El promedio es: {0}", calcula(suma))
Console.ReadLine()
End Sub
Private Function calcula(ByVal su) As Double
calcula = su / 4
End Function
End Module

Module Module1
Private Function AreaCirculo(ByVal Radio As Double) As Double
AreaCirculo = Radio * Radio * 3.1415
End Function
Private Function LongitudCirculo(ByVal Radio As Double) As Double
LongitudCirculo = Radio * 2 * 3.1415
End Function

Sub Main()
Dim Radio As Double
Console.WriteLine("Clculo del rea y longitud de un circulo")
Radio = Console.ReadLine
Console.WriteLine("Area de radio {0} es {1} ", Radio,
AreaCirculo(Radio))
Console.WriteLine("Longitud radio {0} es {1} ", Radio,
LongitudCirculo(Radio))
Console.ReadKey()
End Sub
End Module


Module Module1
Sub Main()
Dim a, b, c, d, suma As Integer
a = 16
b = 24
c = 25
d = 15
suma = a + b + c + d
Dim calc As Double = calcula(suma)
Console.WriteLine("El promedio es: {0}", calc)
Console.ReadLine()
End Sub
Private Function calcula(ByVal su) As Double
calcula = su / 4
End Function
End Module























Flujos de Entrada Y Salida De Consola En Visual
Basic.Net y 2005

En este post hablare de los flujos de entrada y de salida en Consola, todo el
cdigo est escrito para Visual Basic.Net o Visual Basic 2005.
Los flujos de Entrada son los siguientes:
System.Console.Read()
System.Console.Readline()
Cul es la diferencia entre el Read y el Readline?
Que el Readline lee toda una lnea de texto mientras para el Read podemos usar
conversiones para que leamos por ejemplo son un carcter.
Los flujos de Salida son los siguientes:
System.Console.Writeline()
System.Console.Write()
Estos mtodos se ocupan de la siguiente manera:
System.Console.Writeline(La programacin es lo mejor)
System.Console.Write (La programacin es lo mejor)
Cul es la diferencia entre el Writeline y el Write?
Bueno la diferencia es que el Write escribe y no pasa a la lnea siguiente, mientras
que Writeline escribe toda la lnea pasando a la lnea siguiente un ejemplo es el
siguiente:
Dim Nombre as String
System.Console.Writeline(Digite Su Nombre: )
Nombre = System.Console.Readline
Entonces esto a nivel de consola quedara as:
Digite Su nombre:
Jose Benjamin Zepeda Portillo
Mientras que si ocupo el Write seria as:
Dim Nombre as String
System.Console.Write (Digite Su Nombre: )
Nombre = System.Console.Readline
Tomando la variable nombre el String = Jose Benjamin Zepeda Portillo
Entonces esto a nivel de consola quedara as:
Digite Su nombre: Jose Benjamin Zepeda Portillo
Tomando la variable nombre el String = Jose Benjamin Zepeda Portillo
Qu son los flujos de salida con formato?
Un flujo con formato no sera ms que el siguiente ejemplo:
Dim Nombre as String = Benjamin

Dim Edad as Byte = 21

Dim Apellido as String = Zepeda

System.Console.Writeline(Su nombre completo es: {0} {1} y tiene {2} aos
,Nombre, Apellido, Edad)
Entonces esto a nivel de consola quedara as:
Su nombre completo es: Benjamin Zepeda y tiene 22 aos de edad
*Es de recordar que el orden debe ser el mismo, si le hemos aplicado al corchete
{0} {1} entonces la primer variable ira en el puesto 0, la segunda variable en el
puesto 1 y as sucesivamente.
Entonces:
Posicin: Posicin 0,1,2 y as sucesivamente.
Ancho (Opcional): Mnimo Numero de posiciones para la salida, pero si el ancho
se omite entonces o especificamos un valor mximo entonces el ancho incrementa
automticamente.
Tipo (Opcional): Es uno de los caracteres mostrado en la tabla de abajo.
Decimales (Opcional): Aqu se especifica el nmero de dgitos a mostrar en el caso
de enteros o de decimales en el c

aso de fraccionarios.
Cuando este se especifica se escribe a continuacin de tipo, sin espacios en blanco.




































InputBox
A travs de la funcin InputBox es posible manipular la entrada de
datos por parte del usuario, pudiendo almacenar en una variable
los datos ingresados por este.


Tipos de Datos
Los tipos de datos numricos en Visual Basic .NET se agrupan en
dos categoras:
enteros y de punto flotante.

Numricos a su vez se agrupan en, Byte, Short, Integer y Long.
Byte ocupar solamente 1 byte y nos permitir guardar un nmero
que est entre 0 y 255.
Punto flotante son Single y Double.
Char almacenan un slo caracter en formato Unicode.
String almacenan una secuencia de caracteres Unicode


Imports System.IO
Module Module1
Sub Main()
Dim N As Integer
N = 0 'Declara a N de tipo Objeto no de tipo entero
N = InputBox("Ingrese Un Numero ")
MsgBox("1 El Numero es " & N)
MsgBox("2 El Numero es " & N.ToString)
End Sub
End Module




Imports System.IO
Module Module1
Sub Main()
Dim cantidad As Integer
Dim numero, suma As Integer
cantidad = InputBox("Con cuntos nmeros desea trabajar?", "Mdulo de suma")
For cantidad = 1 To cantidad
numero = InputBox("Digite nmero " + Str(cantidad), "Digite nmeros")
suma = suma + numero
Next
MsgBox("El resultado de la suma es " + Str(suma))
End Sub
End Module


ARREGLOS
Son variables que permiten almacenar un conjunto de datos del mismo
tipo a la vez.

Si se quiere almacenar nombre y edad de 15 personas, con el mtodo
tradicional se ocuparan 30 variables o 30 componentes visuales, y solo
es nombre y edad de 15 personas, agregar ms datos y ms personas y
ya es tiempo de empezar a analizar otro tipo de variables y de
componentes.

VECTORES
Bueno, ahora veremos cmo declarar y usar arreglos. Comenzaremos con los
vectores, la forma de declararlos es la siguiente:



Dim Transportes(3) As String

Recuerden que el ndice de los arreglos parte en cero, por lo que un arreglo como ste,
declarado de 3 posiciones, en realidad tiene 4 elementos (0, 1, 2, 3).

Si deseamos inicializar los elementos del vector, no debemos declarar la dimensin del
vector. Lo hacemos de la siguiente manera.

Dim vector() As Integer = {0, 1, 2, 3, 4, 5}


Option Strict On ' Mas adelante en este apunte explica que es
' exige que nuestro cdigo este correcto
' Option Strict Off vb puede aceptar cdigo incorrecto
Module Example

Sub Main()

Dim array(5) As Integer

array(0) = 3
array(1) = 2
array(2) = 1
array(3) = 5
array(4) = 6

For i As Integer = 0 To array.Length-1
Console.WriteLine(i)
Next

End Sub

End Module

Ahora veremos cmo llenar el vector con un ciclo FOR que le pide al usuario ingresar los
elementos, y luego los mostraremos por pantalla:
















Module Module1

Sub Main()
'llenamos el vector con elementos ingresados por teclado
Dim vector(5) As Integer
For i = 0 To 5
Console.WriteLine("ingrese un numero para el indice {0}", i)
vector(i) = Console.ReadLine
Next

'recorremos el vector y mostramos su contenido
For i = 0 To 5
Console.Write(vector(i))
Next
Console.ReadLine()
End Sub

End Module






Ahora les mostrar como dimensionar un vector en tiempo de ejecucin, haciendo que el
usuario introduzca la cantidad de elementos que el vector tendr:



























Module Module1

Sub Main()
Dim cantidad As Integer
Console.WriteLine("cuantos elementos tendra el vector?")
cantidad = Console.ReadLine()

'restaremos 1 a la cantidad ingresada por el usuario porque si el ingresa 5
'el vector tendra 6 elementos, y el usuario quiere 5 solamente.

cantidad = cantidad - 1
'ahora declaramos el vector con la dimension ingresada por el usuario

Dim vector(cantidad) As Integer

For i = 0 To cantidad 'llenamos el vector de elemntos
Console.WriteLine("ingrese un numero para el indice {0}", i)
vector(i) = Console.ReadLine
Next

'recorremos el vector y mostramos su contenido
For i = 0 To cantidad
Console.Write(vector(i))
Next
Console.ReadLine()
End Sub

End Module

Y qu tal si queremos llenar un vector con elementos randmicos?, pues lo hacemos de la
siguiente manera:






















Module Module1

Sub Main()
Dim random As New Random
Dim i As Integer
Dim vector(5) As Integer

'llenamos el vector con numneros al azar comprendidos entre 1 y 100
For i = 0 To 5
vector(i) = random.Next(1, 100)
Next

'imprimimos el vector
For i = 0 To 5
Console.Write(vector(i))
Console.Write("-")
Next
Console.ReadLine()
End Sub

End Module

ORDENAR UN VECTOR
Bueno, ordenar un vector es una tarea bastante recurrente en los centros de estudio. Pues
bien, Visual basic nos facilita el trabajo entregndonos una clase que lo hace por nosotros,
pero tambin podemos usar el clsico mtodo de ordenamiento conocido como "La
burbuja". A continuacin ambas posibilidades, primero la clase de visual y luego la burbuja:



Array.Sort(vector)











For k = 1 To n 'mtodo de burbuja N es el tamao del vector
For i = 0 To (n - k)
If vector(i) > vector(i + 1) Then
aux = vector(i)
vector(i) = vector(i + 1)
vector(i + 1) = aux
End If
Next
Next

MATRICES
En esta parte ser breve ya que todo lo explicado con los vectores es aplicable a
las matrices, solo depende de su lgica e imaginacin. Para el
siguiente ejemplo usaremos una matriz de 3 filas y 5 columnas que se llenar
con nmeros al azar entre 1 y 100, luego se imprimir en pantalla. Las matrices
las declaramos y las recorremos de la siguiente manera:


















Module Module1

Sub Main()
Dim matriz(3, 5) As Integer
Dim i As Integer
Dim random As New Random
For i = 0 To 3
Console.WriteLine()
For k = 0 To 5
matriz(i, k) = random.Next(1, 100)
Console.Write("{0} ", matriz(i, k))
Next
Next
Console.ReadLine()
End Sub

End Module










Precio de la madera se captura























Option Strict.
Nunca es tarde para entender cmo funciona y la importancia que tiene sobre
nuestros programas y nuestro estilo de programacin. Bien, pasemos a la teora.
Option Strict puede ser nuestra segunda lnea de cdigo en los programas que
desarrollemos en VB.Net En pocas palabras, lo que hace es:
Option Strict on
Exige que la conversin de tipos de datos (y la declaracin de variables) sea
explcita
Qu significa lo anterior?
Eres de las personas que declara una variable y que no le asigna un tipo de
dato?
Si la opcin Option Strict se encuentra en el valor Off no tendrs ningn
problema, automticamente la variable tomar un tipo Object y en tu cdigo
podrs hacer uso de ella. Pero si tienes activada la opcin Option Strict (en el
valor On) te topars con un error (ni siquiera advertencia) similar al siguiente:
Dim Numero
Option Strict On
requiere que todas las declaraciones de variables tengan una clusula As.
Desde aqu ya vemos que nuestro estilo de programacin se va a corregir por
que ser necesario asignarle un tipo de dato a cada una de nuestras variables.
Lo correcto en nuestro caso pudiera ser declarar nuestra variable de la siguiente
forma:

Dim Numero as integer
O la otra opcin (que no recomiendo) es asignarle directamente un tipo que
almacenar. Por ejemplo, si nuestra variable Nmero almacenar Nmeros,
pudiramos hacer la declaracin de la siguiente forma:

Dim Numero = 0
De esta forma el compilador asumir que guardars un valor numrico y le
asignar un tipo de dato Integer.
Porqu no recomiendo que el compilador asigne automticamente el tipo de
dato?. A veces la eleccin que hace de forma automtica puede no ser la
recomendable. Pongamos un ejemplo. Queremos una variable para guardar la
edad de nuestro perro. Si declaramos de la siguiente forma, el tipo de datos que
define el compilador ser Integer:

Dim EdadDeMascota = 2
Revisando la tabla de Tipos de datos de Visual Basic observamos que una
variable de tipo Integer ocupar 4 bytes de memoria, y en ella pudieramos
almacenar un nmero que est entre -2,147,483,648 y 2,147,483,647. Se me hace
exagerado para guardar la edad de nuestra mascota. En este caso yo
recomendara definirle un tipo a nuestra variable de la siguiente forma:

Dim EdadDeMascota as Byte
Una variable de tipo Byte nos ocupar solamente 1 byte y nos permitir guardar
un nmero que est entre 0 y 255. Creo que es ms que suficiente para
almacenar la edad de nuestra mascota :)
Es todo lo que nos exige Option Strict?
No, otro punto importante es que debemos realizar una conversin explcita de
nuestros datos para poder trabajar con ellos (los que no son del mismo tipo).
Pongamos un ejemplo:
Vamos a declarar una variable para almacenar la edad de nuestra mascota. A
continuacin vamos a asignarle el valor de 2 y vamos a mostrarlo en una caja de
texto (textbox). Quedara algo as:



Dim EdadDeMascota As Byte
EdadDeMascota = 2
TextBox1.Text = EdadDeMascota
Sin Option Strict este cdigo funcionara, pero con Option Strict activado
tendramos un error como el siguiente:
Option Strict On no permite la conversin implcita de Byte en String.
El mismo Intellisense nos sugiere una forma para solucionar el Error. Es realizar
la conversin del tipo Byte al tipo String para poder asignarla a la caja de texto.
Pudiramos seguir el consejo de Intellisense y nos quedara as el cdigo:



Dim EdadDeMascota As Byte
EdadDeMascota = 2
TextBox1.Text = CStr(EdadDeMascota)
Cmo puedo activar Option Strict en mi cdigo?
Cmo lo comentbamos, puede ser de nuestras primeras lneas en cada uno de
nuestros mdulos y clases. Quedara de esta forma:

Option Strict On
Otra forma es activarlo desde las propiedades de nuestro proyecto:

Archivos

Option Strict On

Imports System.IO

Module Example

Sub Main()
Try
Dim sw As StreamWriter

sw = File.CreateText("cars")

sw.WriteLine("Toyota")
sw.WriteLine("Skoda")
sw.WriteLine("BMW")
sw.WriteLine("Volkswagen")
sw.WriteLine("Volvo")

sw.Close()
Catch e As IOException
Console.WriteLine("IO error")
End Try

End Sub

End Module

You might also like