lunes, 5 de marzo de 2012

Ejercicio "Cambio"

Realizar una aplicación que recoja por teclado la cantidad total a pagar y la cantidad que se ha entregado. La aplicación debe calcular el cambio correspondiente con el menor número de monedas y/o billetes posibles.

Module Module1

    Sub Main()
        Dim total, entregado, vuelta As Double
        Dim billetes() As Single = {500, 200, 100, 50, 20, 10, 5}
        Dim monedas() As Single = {200, 100, 50, 20, 10, 5, 2, 1}
        Dim resultado(14) As Integer

        Console.Write("Introduzca la cantidad total: ")
        total = Console.ReadLine
        Console.Write("Introduzca la cantidad entregada: ")
        entregado = Console.ReadLine

        Console.WriteLine()

        'Comprobamos las cantidades
        If (total > entregado) Then
            Console.WriteLine("Las cantidades no son correctas.")
            Console.WriteLine("La cantidad entregada debe ser mayor o igual al total.")
        ElseIf (total = entregado) Then
            Console.WriteLine("Ha entregado la cantidad exacta. No tiene cambio.")
        Else
            'Calculamos la vuelta
            vuelta = entregado - total

            Console.WriteLine("Su vuelta es: " & vuelta & " Euros.")

            ' 1º con los billetes
            Dim i As Integer = 0
            For Each cantidad As Single In billetes
                ' \ división entera
                resultado(i) = vuelta \ cantidad
                ' Lo que queda es el resto
                vuelta = vuelta Mod cantidad
                i += 1
            Next

            ' Me daba error si cogía el valor de las monedas con decimales
            ' Así que multipliqué tanto el valor de estas como lo que queda de vuelta por 100
            vuelta = vuelta * 100

            ' 2º con las monedas
            For Each cantidad As Single In monedas
                resultado(i) = vuelta \ cantidad
                vuelta = vuelta Mod cantidad
                i += 1
            Next

            Dim j As Integer = 0
            For i = 0 To 6
                If (resultado(j) <> 0) Then
                    Console.WriteLine(resultado(j) & " billetes de " & billetes(i) & " Euros.")
                End If
                j += 1
            Next

            For i = 0 To 7
                If (resultado(j) <> 0) Then
                    Console.WriteLine(resultado(j) & " monedas de " & (monedas(i) / 100) & " Euros.")
                End If
                j += 1
            Next

        End If

        Console.ReadKey()
    End Sub

End Module

sábado, 3 de marzo de 2012

"While... End" y "Do... Loop"

A continuación se muestra un sencillísimo ejemplo de todas las variantes de estos bucles:

Module Module1

    Sub Main()
        DoLoop()
        Console.ReadKey()
    End Sub

    Sub DoLoop()
        Dim a As Integer = 1

        ' While
        While (a < 10)
            a += 1
        End While

        ' Equivalente al while
        Do While (a < 10)
            a += 1
        Loop

        ' Evalúa la condición al final
        ' Por lo tanto el bloque se ejecutará al menos una vez
        Do
            a += 1
        Loop While (a <= 10)

        ' Se ejecuta "hasta que", no "mientras"
        Do Until (a > 10)
            a += 1
        Loop

        ' Lo mismo, pero el bloque se ejecuta al menos una vez
        Do
            a += 1
        Loop Until (a > 10)
    End Sub

End Module

Ejercicio "Ecuación de 2º grado"

Realizar una aplicación que calcule las raíces de una ecuación de segundo grado y las muestre, una vez que ha recogido los coeficientes por teclado.

Imports System.Math

Module Module1

    Sub Main()

        Dim a, b, c As Integer
        Dim discriminante As Integer

        Console.WriteLine("ax^2 + bx + c = 0")
        Console.WriteLine("Introduce los valores de los coeficientes.")
        Console.Write("a: ")
        a = Console.ReadLine
        Console.Write("b: ")
        b = Console.ReadLine
        Console.Write("c: ")
        c = Console.ReadLine

        If (a = 0) Then
            Console.WriteLine("La ecuación no es de segundo grado.")
        Else
            discriminante = b ^ 2 - (4 * a * c)

            If (discriminante = 0) Then
                Dim raiz As Double
                raiz = -b / (2 * a)
                Console.WriteLine("La ecuación tiene un único resultado.")
                Console.WriteLine("Raíz: " & raiz)
            ElseIf (discriminante > 0) Then
                Dim raiz1, raiz2 As Double
                raiz1 = (-b + (Sqrt(discriminante))) / (2 * a)
                raiz2 = (-b - (Sqrt(discriminante))) / (2 * a)
                Console.WriteLine("La ecuación tiene dos resultados.")
                Console.WriteLine("Raíz 1: " & raiz1)
                Console.WriteLine("Raíz 2: " & raiz2)
            Else
                Console.WriteLine("La ecuación no tiene resultado para esos valores.")
            End If
        End If

        Console.ReadKey()

    End Sub

End Module

Instrucción Select... Case

La instrucción Select... Case es similar al Switch de Java, pero bastante más potente, ya que permite indicar intervalos, expresiones y varios valores en el mismo "Case".

EJEMPLO DE SELECT... CASE

Module Module1

    Sub Main()
        Menu()
        Console.ReadKey()
    End Sub

    Sub Menu()
        Dim opcion As Integer = 1
        While (opcion <> 0)
            Console.Clear()
            Console.WriteLine("Menú")
            Console.WriteLine("====")
            Console.WriteLine("1. Si introduce uno se ejecuta esta opción")
            Console.WriteLine("2-5. Si introduce un número entre 2 y 5 se ejecuta esta")
            Console.WriteLine("6, 9, 10. Si introduce 6, 9 o 10 se ejecuta esta")
            Console.WriteLine("Mayor de 15. Si es mayor de 15 se ejecuta esta")
            Console.WriteLine("0. Salir")
            Console.WriteLine()
            Try
                opcion = CInt(Console.ReadLine())
            Catch ex As InvalidCastException
                ' Sólo se ve desde el Visual Studio
                Debug.WriteLine("Error: " & ex.Message)
                opcion = 7
            Catch e As OverflowException
                ' lo que queramos hacer
            End Try

            Select Case opcion
                Case 1
                    Console.WriteLine("Ha seleccionado la opción 1")
                Case 2 To 5 ' Intervalo
                    Console.WriteLine("Ha seleccionado una opción entre 2 y 5")
                Case 6, 9, 10 ' Varios valores
                    Console.WriteLine("Ha seleccionado 6, 9 o 10")
                Case Is > 15 ' Expresión
                    Console.WriteLine("Ha seleccionado una opción mayor que 15")
                Case 0
                    Console.WriteLine("Ha elegido salir, ¡adiós!")
                Case Else ' Si no entra por las anteriores...
                    Console.WriteLine("Ha elegido una opción incorrecta")
            End Select

            ' vbCrLf -> constante que representa retorno de carro más salto de línea
            Console.WriteLine(vbCrLf & "Pulse ENTER para continuar")
            Console.ReadKey()

        End While
    End Sub

End Module

EJERCICIO
Realizar una aplicación que tenga un menú que permita elegir entre calcular el área de un círculo o un rectángulo. Dependiendo de lo que se elija, se pedirán los datos correspondientes y se mostrará el resultado.

Module Module1

    Sub Main()
        Const PI As Double = 3.14159265
        Dim opcion As Integer
        Dim ancho, alto As Double
        Dim radio As Double

        Do
            Menu()
            Console.Write("Elija una opción: ")
            opcion = Console.ReadLine
            Console.WriteLine()

            Select Case opcion
                Case 1
                    Console.Write("Ancho: ")
                    ancho = Console.ReadLine
                    Console.Write("Alto: ")
                    alto = Console.ReadLine
                    Console.WriteLine("Área del rectángulo: " & (ancho * alto) & " uds cuadradas")
                Case 2
                    Console.Write("Radio: ")
                    radio = Console.ReadLine
                    Console.WriteLine("Área del círculo: " & (PI * (radio ^ 2)) & " uds cuadradas")
                Case 3
                    Console.WriteLine("Ha elegido salir del programa.")
                Case Else
                    Console.WriteLine("Opción incorrecta.")
            End Select

            Console.WriteLine(vbCrLf & "Pulse ENTER para continuar")
            Console.ReadKey()

        Loop While opcion <> 3

    End Sub

    'Procedimiento que muestar el menú
    Sub Menu()
        Console.Clear()
        Console.WriteLine("CALCULAR ÁREA")
        Console.WriteLine()
        Console.WriteLine("1. Rectángulo")
        Console.WriteLine("2. Círculo")
        Console.WriteLine("3. Salir")
    End Sub

End Module

miércoles, 29 de febrero de 2012

Varios ejercicios

EJERCICIO 1
Hacer una aplicación que pida un nombre por teclado y luego salude a esa persona.

Module Module1

    Sub Main()
        Dim nombre As String

        Console.WriteLine("¿Cómo te llamas?")
        nombre = Console.ReadLine
        Console.WriteLine()
        Console.WriteLine("Hola " & nombre)

        Console.ReadKey()

    End Sub

End Module

EJERCICIO 2
Hacer una aplicación que recoja números desde teclado hasta que se introduzca vacío (cadena ""). Se deben sumar estos números y mostrar el resultado.

Module Module1

    Sub Main()
        Dim Numero As String
        Dim Resultado As Integer = 0

        Do
            Console.Write("Número: ")
            Numero = Console.ReadLine()
            Try
                Resultado = Resultado + CInt(Numero)
            Catch ex As InvalidCastException

            End Try
        Loop While Numero <> ""

        Console.WriteLine("Resultado final: " & Resultado)

        Console.ReadKey()

    End Sub

End Module

NOTA: por defecto, se realizan conversiones implícitas de datos, si quisiésemos desactivar esta opción (recomendable), tendremos que poner la siguiente línea al principio de nuestro código (antes de Module Nombre_del_Módulo)

Option Explicit On

En este caso, para realizar las conversiones, se utilizarán las funciones de conversión. Algunas de estas funciones son:

  • CDate(expresión): para convertir a tipo Date
  • CDbl(expresión): para convertir a tipo Double
  • CInt(expresión): para convertir a tipo Integer
  • CStr(expresión): para convertir a tipo String

EJERCICIO 3
Hacer una aplicación que pida por teclado el radio de una circunferencia y muestre su área y su perímetro.

Module Module1

    Sub Main()
        Dim Radio, Area, Perimetro As Double
        ' Definición de constantes en VB
        Const PI As Double = 3.14159265

        Console.Write("Radio de la circunferencia: ")
        Radio = Console.ReadLine

        Area = PI * (Radio ^ 2)
        Perimetro = 2 * PI * Radio

        Console.WriteLine("Área: " & Area & " uds cuadradas")
        Console.WriteLine("Perímetro: " & Perimetro & "uds")

        Console.ReadKey()

    End Sub

End Module

martes, 28 de febrero de 2012

Hola Mundo - Comenzando con VB.NET

Como no puede ser de otra manera, empezamos Visual Basic .NET con un "Hola Mundo":

Module MiModulo

    Sub Main()
        'Mostrar un mensaje en consola
        Console.WriteLine("Hola mundo")

        'Para que la consola se quede abierta,
        'A la espera de que pulsemos una tecla
        Console.ReadKey()
    End Sub

End Module

sábado, 18 de febrero de 2012

Desaparecida...

He estado "desaparecida" unas semanas. Se acerca la recta final, antes de la FCT (Formación en Centros de Trabajo) y no tengo mucho tiempo libre, por lo que no he podido dedicarme tanto al blog. Pero quería comentar que, finalmente, para el proyecto de Integración realizaré una aplicación web con JSP/Servlets, por lo que cuando vaya tomando forma, empezaré a colgar el código aquí y también la iré subiendo a Jelastic. Dejaré el enlace a mi sitio cuando haya subido la primera versión.

Mientras tanto, es probable (aunque no prometo nada), que dedique algunas entradas a Visual Basic .NET y a lo que vaya preparando para el proyecto, como por ejemplo, la hoja de estilos.

¡Felices carnavales!