martes, abril 18, 2006

Funciones y Subrutinas

EL SIGUIENTE PROGRAMA DEBERÁ CONTENER LOS TRES TIPOS DE FUNCIONES Y UNA SUBRUTINA LOS CUALES REALIZARAN LO SIGUIENTE:

1) Función sin argumentos que no devuelve nada
a. Realizará una pausa en el programa al ser llamada la función.
b. La función tendrá el nombre de pausa

2) Función con argumentos que no devuelve ningún valor
a. Le mandaras una cadena (un mensaje) y un valor numérico a la función
b. El mensaje se desplegará en pantalla tantas veces lo indique el valor numérico que recibe la función.
c. Mandará llamar la función pausa al terminar el ciclo
d. La función tendrá el nombre de Mensaje

3) Función con argumentos que recibe y regresa valor
a. Se le enviará dos cadenas y las comparará, si son iguales regresara un mensaje indicando: son iguales o son diferentes el cual desplegara fuera de la función.
b. Usar la función del sistema SrtComp (cad1, cad2)
c. La función tendrá el nombre de Compara

4) Subrutina que recibe argumentos y modifica el valor de la variable.
a. La subrutina recibirá dos variables y se modificará el contenido de ellas. Pero solamente una de las variables mantendrá su valor original al salir de la subrutina.
b. Mostrará en pantalla los valores desde programa principal y los valores desde la subrutina, demostrando así que fue solamente una variable modificada.
c. La Subrutina tendrá el nombre de Modifica.

5) Teórico (Explica y Contesta claramente lo que se pide)
a. ¿Porqué y cuando es necesario utilizar Procedimientos (Funciones o subrutinas)?
b. ¿Cuál es el error más común en un programador cuando no utiliza procedimientos?
c. Explicar como pasar argumentos a una subrutina o función, como son afectadas globalmente las variables dependiendo en la manera en que recibe, como se regresa un valor de un procedimiento y en que tipo es solamente permitido.




Module Module1

Sub Main()
Dim Num1 As Integer = 10, Num2 As Integer = 10
pausa()
Mensaje("hola", 2)
Console.WriteLine("Iguales o diferentes: {0}", Compara("mensaje1", "mensaje1"))
Console.WriteLine("antes de modificar: {0} {1}", Num1, Num2)
Modifica(Num1, Num2)
Console.WriteLine("Despues de modificar: {0} {1}", Num1, Num2)

pausa()

End Sub

‘Función sin argumentos que no devuelve nada
Function pausa()
Console.ReadLine()
End Function

‘Función con argumentos que no devuelve ningún valor
Function Mensaje(ByVal mens As String, ByVal num As Integer)
Dim x As Integer
For x = 1 To num
Console.WriteLine("{0}", mens)
Next
pausa()
End Function

‘Función con argumentos que recibe y regresa valor
Function Compara(ByVal cad1 As String, ByVal cad2 As String) As String
If StrComp(cad1, cad2) = 0 Then
Return "son iguales"
Else
Return "son diferentes"
End If
End Function
‘Subrutina que recibe argumentos y modifica el valor de la variable.
Sub Modifica(ByVal Num1 As Integer, ByRef Num2 As Integer)
Num1 = 0
Num2 = 0
Console.WriteLine("Los valores dentro de la subrutina: {0} {1}", Num1, Num2)
Mensaje("Presiona Enter para continuar", 1)
End Sub
End Module

5) Teórico (Explica y Contesta claramente lo que se pide)
a) ¿Porqué y cuando es necesario utilizar Procedimientos (Funciones o subrutinas)?
Habrá ocasiones en que el programa deberá ser partido en pequeñas unidades, llamados procedimientos, los cuales ejecutan una determinada tarea. Las razones para partir un programa es porque el programa puede convertirse muy grande para entenderse y, lo mas importante, puede haber partes del programa que hagan lo mismo (o una tarea muy similar) una y otra ves. Si se tiene un procedimiento que permite ejecutar una tarea específica, puedes llamar a este procedimiento cada ves que sea necesario.

b)¿Cuál es el error más común en un programador cuando no utiliza procedimientos?
Es actualmente uno de los errores mas usuales en programas reales. La técnica de duplicar porciones de código en diferentes lugares en el programa (con algunas diferencias) es conocido como la tecnica Copy-Paste. El error mas común relacionado al copy-paste es que modifican el código en algunos lugares y olvidan cambiarlo en otros.

c) Explicar como pasar argumentos a una subrutina o función, como son afectadas globalmente las variables dependiendo en la manera en que recibe, como se regresa un valor de un procedimiento y en que tipo es solamente permitido.
En la declaración de una subrutina o función se definen los tipos de argumentos que recibirá de igual forma el tipo de argumento que se regresara solo desde la función, ya que la subrutina no puede regresar valores. Los tipos de argumentos pueden ser del tipo de variable que va a recibir (Integer, String, Decimal …)

Argumentos multiples y ByVal versus ByRef
La palabra ByVal (By Value) le indica al compilador de una forma precisa como manejar los valores enviados a través de la subrutina. La alternativa es ByRef (By Referente). Como lo indica o sugiere el nombre (ByVal), el compilador envía el valor de la variable. Esto es, hará una copia de la variable, y lo pasara la copia a la subrutina. La subrutina puede cambiar el valor, pero cuando la subrutina termine, el valor de la variable original no va a cambiar.


‘Dentro del cuerpo del programa:
Modifica(Num1, Num2)


‘Subrutina que recibe argumentos y modifica el valor de la variable.
Sub Modifica(ByVal Num1 As Integer, ByRef Num2 As Integer)
Num1 = 0
Num2 = 0
Console.WriteLine("Los valores dentro de la subrutina: {0} {1}", Num1, Num2)
Mensaje("Presiona Enter para continuar", 1)
End Sub

En este ejemplo vemos como se manda llamar la subrutina y a la cual se le envían dos valores tipo Integer. La Subrutina (declarada al final de la subrutina principal) recibe dos parámetros, uno por valor y otro por referencia. El primero no modifica el espacio en memoria reservado para esa variable. Pero en cambio la segunda, al ser Referida, modifica la variable convirtiéndola en variable global.