Fecha y hora actual: Jueves 17 Ene 2019 05:08
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Curso VB .NET - Tema 1.12 - Funciones VB Studio 2005

Responder al Tema

Índice del Foro > Visual Basic .NET > Curso VB .NET - Tema 1.12 - Funciones VB Studio 2005

Autor Mensaje
Tesis
Administrador


Registrado: 04 Mar 2007
Mensajes: 3200
Ubicación: Valencia - España

Mensaje Publicado: Martes 25 Nov 2008 13:25

Título del mensaje: Curso VB .NET - Tema 1.12 - Funciones VB Studio 2005

Responder citando

Curso de programación en VB Studio 2005 - Tema 1.12

1. Funciones - VB Studio 2005
1.1 Objetivos del tema.

Vamos a ver en este tema las funciones en el lenguaje Visual Basic 2005.

1.2 Introducción.
La programación está basada en las estructuras.
Estructuras de datos y estructuras de programas.
Los programas son a su vez contenedores de estructuras de elementos individuales que ejecutan código.
El elemento más pequeño es la instrucción.
Después nos encontramos con procedimientos y funciones.
El siguiente nivel es la clase y por último el programa.

Los procedimientos y las funciones, dependiendo de la estructura del lenguaje utilizado, y del estilo de programación individual de cada uno, están bien en módulos independientes, de forma que son públicos para toda la aplicación, o de forma privada en el interior de un programa, o una clase.

En VB, las funciones son funciones y podrán o no pertenecer a una clase y ser un método, se albergará en el interior de una clase, haciendo referencia al mismo mediante el nombre de la clase y a continuación el de la función, método, o si está en el mismo nivel, con utilizar la función es suficiente, como vemos en el ejemplo.

Código:
Console.Writeline("Factorial de 3 es " ,FuncionFactorial(3))


Pero no toda la resolución de una clase se realiza mediante código que se pueda o se tenga que traducir en un método.

La programación además se basa en la división de un problema grande, en varios pequeños, aquello de divide y vencerás, por lo que por esa misma filosofía es imposible, e ilógico, que todo se convierta en métodos.

Los métodos son la parte lógica visible de una clase, lógica en cuanto a que es aquello que cara al usuario le ayuda a resolver un problema en pasos “ comprensibles “ para él.

Con las funciones sucede lo mismo, al fin y al cabo, no son nada más que otra de las herramientas de programación.

Para crear una función la sintaxis es la siguiente:

Código:
Private Function FuncionFactorial(ByVal n As Integer) As Integer


La función puede estar en el programa - Private
o en un módulo distinto - Public
La palabra reservada que indica que es una función - Function
Después lo que sigue es el nombre de la función - FuncionFactorial
Entre paréntesis los datos que se reciben, indicando el tipo de cada uno de ellos - (ByVal n as Integer)
El tipo de dato que se devuelve en la función - Integer
A continuación empieza el código de la función que acaba con la línea - End Function

Código:
Private Function FuncionFactorial(ByVal n As Integer) As Integer
  If (n <= 1) Then
    FuncionFactorial = 1
  Else
    FuncionFactorial = n * FuncionFactorial(n - 1)
  End If
End Function


En el ejemplo vemos la función, esta función calcula el factorial de un número, otro tema es que sea la mejor solución, pero es una función.

En el siguiente ejemplo se invierte el contenido de una variable de tipo string.

Código:
Public Function InvierteCadena(ByVal Cadena As String) As String
 Dim Result As String = ""
 Dim x As Integer
 While x <> Len(Cadena)
   x = x + 1
   Result = Mid(Cadena, x, 1) & Result
   End While
 InvierteCadena = Result
End Function


El uso de la función anterior puede quedar :

Código:
Cadena = InvierteCadena(Cadena)


1.3 Escribir la función.
Vemos el ejemplo de una función.
Como hemos comentado antes, primero se indica el ámbito de la función, público o privada, después la palabra que índica que es una función, no un procedimiento.

Código:
Public Function InvierteCadena(ByVal Cadena As String) As String
 Dim Result As String = ""
 Dim x As Integer
  While x <> Len(Cadena)
    x = x + 1
    Result = Mid(Cadena, x, 1) & Result
  End While
 InvierteCadena = Result
End Function


El nombre de la función “InvierteCadena” y los argumentos que va a recibir, Cadena como string, y se recibe por valor, en VB hay que indicarlo, por defecto aparecerá siempre por valor, ByVal.

Después se inicia el código de la función:

Código:
Dim Result As String = ""
Dim x As Integer
 While x <> Len(Cadena)
   x = x + 1
   Result = Mid(Cadena, x, 1) & Result
 End While


Finalizada la ejecución de la función se asigna su resultado a la misma.

Código:
InvierteCadena = Result


Y la función que finalizará con la línea

Código:
End Function


La devolución del resultado de la ejecución de la función se obtiene con la línea

Código:
InvierteCadena = Result


O bien como sigue:

Código:
FuncionFactorial = n * FuncionFactorial(n - 1)


En este ejemplo lo que se muestra es una utilización recursiva de la misma.
El nombre de la función es la encargada de recibir el valor que se va a devolver al punto de llamada de la misma, y el dato que se le asigna debe ser del mismo tipo que se declara en la función.

Código:
Private Function FuncionFactorial(ByVal n As Integer) As Integer


Código:
Public Function InvierteCadena(ByVal Cadena As String) As String


1.4 Envío y recepción de los datos.
La creación de procedimientos y funciones, conlleva la necesidad de envío y recepción de variables, de datos. Hay dos formas de enviar datos a un procedimiento:

    Por valor
    Por referencia


En el primero de los casos la variable que recibe el procedimiento, puede ser utilizada en el interior del mismo, pero los cambios que sufra, no podrán ser devueltos al programa que lo ha llamado, el procedimiento recibe el valor de la variable, pero no la variable.

Por referencia, sin embargo la variable recibida podrá ser utilizada y si ha sufrido cambio en su valor, éste podrá ser devuelto al programa que lo ha llamado, el procedimiento recibe una referencia a la variable, por lo tanto los cambios que se realicen a la misma, perduran a la finalización del procedimiento, o función.

En VB se puede recibir datos por valor, ByVal, y por referencia, ByRef, tanto en un procedimiento, SUB, o una función, Function.

Dicho de otra forma, podríamos enviar datos por referencia a una función y recibir datos devueltos en el nombre de la función y en la variable que nosotros consideremos adecuado.

Un ejemplo:

Código:
Private Function InvierteCadena(ByVal Cadena As String, ByRef R As String) As String
 Dim Result As String = ""
 Dim x As Integer
  While x <> Len(Cadena)
    x = x + 1
    Result = Mid(Cadena, x, 1) & Result
  End While
 InvierteCadena = Result
 R = Result
End Function


En este ejemplo, se ha añadido a la función la variable

Código:
, ByRef R As String)


Que podemos observar que es por referencia, ByRef, y después para probar que se puede utilizar:

Código:
R = Result


Al final de la función, y el resultado de ejecutar

Código:
Sub Main()
 Dim C As String = "ARROZ"
 Dim R As String
 Console.WriteLine("Valor por referencia en una función")
 Console.WriteLine("Cadena invertida {0} es {1} ", C, InvierteCadena("ARROZ", R))
 Console.WriteLine("La cadena invertida {0} es {1} ", C, R)
 Console.ReadKey()
End Sub


es el que sigue:

Código:
Valor por referencia en una función
La cadena invertida ARROZ es ZORRA
La cadena invertida ARROZ es ZORRA


Y como se puede comprobar, la función solo se ejecuta una vez.

Pero a pesar de eso, no debemos utilizar esta estrategia, una función debe devolver el dato en su nombre.

1.5 Conclusiones.
El paso de datos se puede hacer por valor y por referencia, Los datos han de enviarse en el mismo orden en el que se reciben en la función.
Han de ser del mismo tipo.
No tienen porque llamarse de la misma forma.
No hay valores opcionales.

1.6 Ejercicios propuestos.

    1. Hallar el área y la longitud de una circunferencia, solicitando el radio de la misma R .
    Código:
    Area = PI * R al cuadrado
    Longitud = 2 * PI * R

    2. Hallar el área de un triángulo.
    Código:
    Area = Base por Altura / 2

    3. Introducir un número A y visualizar si es o no primo.

    4. Introducir una calificación (entre cero y diez), e imprimir su equivalente alfabético, según la siguiente tabla.

    Código:
    De 3 -------> M.D.
    Desde 3 y menor que 5 -------> INS.
    Desde 5 y menor que 6 -------> SUF
    Desde 6 y menor que 7 -------> BIEN
    Desde 7 y menor que 9 -------> NOT.
    Desde 9 hasta 10 -------> SOB.

    5. Introducir un valor en metros y visualizar su valor en millas terrestres, marinas , yardas y leguas.

    Código:
    Milla terrestre = 1.609,34 m.
    Milla marina = 1.852,00 m.
    Yarda = 4.190 m.
    Legua = 0,9144 m.

    6. Introducir una fecha en pantalla con el formato día, mes y año en tres variables numéricas, validar la fecha y emitir el mensaje de fecha incorrecta o correcta.

    7. A partir de los siguientes valores de moneda extranjera, crear una función que a partir de un importe en pesetas devuelva su equivalente en la moneda que se indique.

    Código:
    1 Franco francés 25,2400 25,3920
    1 Lira 0,0859 0,0864
    1 Libra esterlina 245,5560 247,0340
    1 Dólar americano 150,2280 151,1320
    1 Marco alemán 84,6480 85,1570
    1 Franco suizo 101,7550 102,3670
    1 Florín holandés 5,1170 75,5690
    1 Escudo portugués 0,8262 0,8312


1.7 Solución a los ejercicios propuestos.
1.- Hallar el área y la longitud de una circunferencia, solicitando el radio de la misma R .
Código:
Area = PI * R al cuadrado
Longitud = 2 * PI * R


Código:
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("Cálculo 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


2.- Hallar el área de un triángulo.
Código:
Area = Base por Altura / 2


Código:
Module Module1
Private Function AreaTriangulo(ByVal Base As Double, ByVal Altura As Double) As Double
 AreaTriangulo = Base * Altura / 2
End Function

Sub Main()
 Dim Base As Double
 Dim Altura As Double
 Console.WriteLine("Cálculo del área de un triángulo")
 Console.WriteLine("Introducir Base")
 Base = Console.ReadLine
 Console.WriteLine("Introducir Altura")
 Altura = Console.ReadLine
 Console.WriteLine("Area triángulo de base {0} y altura {1} es {2} ", Base, Altura,
 AreaTriangulo(Base, Altura))
 Console.ReadKey()
End Sub
End Module


3.- Introducir un número A y visualizar si es o no primo.

Código:
Module Module1
Public Function Primos(ByVal Numero As Long) As Boolean
 Dim X As Integer = 3
 Dim Final As Long
 Dim Result As Boolean = True
 Select Case Numero Mod 2 <> 0
  Case True
    Final = CLng(Numero / 2) + 1
    While X < Final And Result
      Result = Numero Mod X <> 0
      X = X + 1
    End While
  Case Else
    If Numero > 2 Then Result = False
 End Select
 Primos = Result
End Function

Sub Main()
 Dim Numero As Integer
 Console.WriteLine("Números primos")
 Console.WriteLine("Introducir número")
 Numero = Console.ReadLine
 Select Case Primos(Numero)
  Case True
    Console.WriteLine("El número {0} es primo ", Numero)
  Case Else
    Console.WriteLine("El número {0} no es primo ", Numero)
 End Select
 Console.ReadKey()
End Sub
End Module


4.- Introducir una calificación (entre cero y diez), e imprimir su equivalente alfabético, según la siguiente tabla.

Código:
De 3 -------> M.D.
Desde 3 y menor que 5 -------> INS.
Desde 5 y menor que 6 -------> SUF
Desde 6 y menor que 7 -------> BIEN
Desde 7 y menor que 9 -------> NOT.
Desde 9 hasta 10 -------> SOB.


Código:
Module Module1
Private Function Calificacion(ByVal Nota As Single) As String
 Dim Texto As String = ""
 Select Case Nota
  Case 0 To 2.99
    Texto = "M.D."
  Case 3 To 4.99
    Texto = "Ins"
  Case 5 To 5.99
    Texto = "Suf"
  Case 6 To 6.99
    Texto = "Bien"
  Case 7 To 8.99
    Texto = "Not"
  Case 9 To 10.0
    Texto = "Sob"
  Case Else


    Texto = "Calificación erronea"
 End Select
 Calificacion = Texto
End Function

Sub Main()
 Dim Nota As Single
 Console.WriteLine("Introducir nota ")
 Nota = Console.ReadLine
 Console.WriteLine(Calificacion(Nota))
 Console.ReadKey()
End Sub
End Module


5.- Introducir un valor en metros y visualizar su valor en millas terrestres, marinas , yardas y leguas.

Código:
Milla terrestre = 1.609,34 m.
Milla marina = 1.852,00 m.
Yarda = 4.190 m.
Legua = 0,9144 m.


Código:
Module Module1
Private Function Conversion(ByVal M As Single, ByVal T As String) As Single
 Dim C As Single
 Select Case T
  Case "T"
    C = CSng(M / 1609.34)
  Case "M"
    C = CSng(M / 1852)
  Case "L"
    C = CSng(M / 4190)
  Case "Y"
    C = CSng(M / 0.9144)
 End Select
 Conversion = C
End Function

Sub Main()
 Dim Metros As Single
 Dim Tipo as String
 Console.WriteLine("Convertir distancia en metros ")
 Console.WriteLine("Introducir distancia en metros")
 Metros = Console.ReadLine
 Console.WriteLine("Introducir M/T/L/Y ")
 Tipo = Console.ReadLine
 Console.WriteLine(Conversion(Metros, Tipo))
 Console.ReadKey()
End Sub
End Module


6.- Introducir una fecha en pantalla con el formato día, mes y año en tres variables numéricas, validar la fecha y emitir el mensaje de fecha incorrecta o correcta.

Código:
Module Module1
Function Fecha(ByVal D As Integer, ByVal M As Integer, ByVal A As Integer) As Boolean
 Dim Fec As Boolean
 Select Case M
  Case 1, 3, 5, 7, 8, 10, 12
    Fec = D > 0 And D < 32
  Case 4, 6, 9, 11
    Fec = D > 0 And D < 31
  Case 2
    Select Case A Mod 100 = 0
      Case True
        Fec = (D > 0 And D < 29) Or (D = 29 And A Mod 400 = 0)
      Case Else
        Fec = (D > 0 And D < 29) Or (D = 29 And A Mod 4 = 0)
    End Select
 End Select
 Fecha = Fec
End Function

Sub Main()
 Dim Dia As Integer
 Dim Mes As Integer
 Dim Year As Integer
 Console.WriteLine("Comprobar fecha ")
 Console.WriteLine("Introducir dia")
  Dia = Console.ReadLine
 Console.WriteLine("Introducir mes")
 Mes = Console.ReadLine
 Console.WriteLine("Introducir año")
 Year = Console.ReadLine
 Select Case Fecha(Dia, Mes, Year)
  Case True
    Console.WriteLine("La fecha es correcta")
  Case Else
    Console.WriteLine("La fecha no es correcta")
 End Select
 Console.ReadKey()
End Sub
End Module


7.- A partir de los siguientes valores de moneda extranjera, crear una función que a partir de un importe en pesetas devuelva su equivalente en la moneda que se indique.

Código:
Module Module1
Function ConversionMoneda(ByVal Pesetas As Single, ByVal Moneda As String) As Single
 Dim Result As Single
 Select Case Moneda
  Case "F"
    Result = CSng(Pesetas / 25.24)
  Case "L"
    Result = CSng(Pesetas / 0.0859)
  Case "I"
    Result = CSng(Pesetas / 245.556)
  Case "D"
    Result = CSng(Pesetas / 150.228)
  Case "M"
    Result = CSng(Pesetas / 84.648)
  Case "S"
    Result = CSng(Pesetas / 101.755)
  Case "H"
    Result = CSng(Pesetas / 5.117)
  Case "P"
    Result = CSng(Pesetas / 0.826)
 End Select
 ConversionMoneda = Result
End function

Sub Main()
 Dim Pesetas As Integer
 Dim Moneda As Char
 Console.WriteLine("Convertir moneda ")
 Console.WriteLine("Introducir pesetas")
 Pesetas = Console.ReadLine
 Console.WriteLine("Introducir moneda F/L/I/D/M/S/H/P")
 Moneda = Console.ReadLine
 Console.WriteLine("El importe de {0} pesetas en la moneda {1} es {2} ",
 Pesetas, Moneda, ConversionMoneda(Pesetas, Moneda))
 Console.ReadKey()
End Sub
End Module


Las soluciones por las que se ha optado son mejorables, y solo pretenden ilustrar como abordar una función.

En estos ejercicios en algunos casos sería necesario añadir instrucciones del tipo:
Código:
T = Ucase(T)

Siendo T una variable de tipo char, que puede venir indistintamente en minúsculas o mayúsculas, de esa forma nos aseguramos su completo funcionamiento, convirtiéndola a mayúsculas.

También se ha optado por utilizar una variable auxiliar, y luego que la función reciba su valor, no siendo eso imprescindible, pero sin embargo si válido en cualquier lenguaje.

En función de cómo se tenga configurado VB, las líneas del tipo:
Código:
Result = CSng(Pesetas / 101.755)
C = CSng(M / 1609.34)

Pueden funcionar también con esta sintaxis.
Código:
Result = Pesetas / 101.755
C = M / 1609.34

CSng, CDbl, Cint, etc, son funciones de conversión de un valor numérico a un valor determinado, Single, doble, entero etc..
Ello viene obligado por la definición del parámetro Option Strict, para acceder al mismo
Proyecto -> Propiedades -> Compilar



Si está en off, no exige la conversión obligada de tipos, es fuente de posibles errores, si está en On, sí.
Su valor adecuado debería ser On, aunque obligue a la conversión de los datos.


Autor del curso: Casiopea


Normas del foro
Aprende a postear correctamente usando las etiquetas
Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Curso de PHP-WordPress avanzado

wordpressadict PHP 1 Domingo 27 Nov 2016 19:59 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Curso fundamentos de programación

Yaser Programación en general 0 Miércoles 18 May 2016 00:28 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Funciones con parámetros

barkalez C, C#, Visual C++ 2 Domingo 20 Mar 2016 00:07 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Curso de Desarrollo en Inteligencia Artificial

JL Iglesias Feria Programación de juegos o videojuegos 7 Miércoles 02 Dic 2015 18:20 Ver último mensaje
El foro no contiene ningún mensaje nuevo

SQL Express 2005 Base de datos dañada necesita ...

ramonmerin Programación en general 0 Miércoles 28 Oct 2015 12:22 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,