lunes, 29 de septiembre de 2014

DISEÑO Y REALIZACIÓN DE SERVICIOS DE PRESENTACIÓN EN ENTORNOS GRÁFICOS EJERCICIOS UT2

EJERCICIOS CON LABELS, TEXTBOXES Y BOTONES EN VISUAL BASIC

Vamos a plantear el enunciado para una serie de ejercicios y posteriormente mostraremos la solución a los mismos.

EJERCICIO Nº1

Transformar el algoritmo que se indica a continuación, relativo a calculo de necesidades de combustible, en un programa de Visual Basic.

1.  Inicio
2.  [Definición de vehículos]
3.  Turismos = 32
4.  Todoterrenos = 11
5.  [Fin de definición de vehículos]
6.  [Definición de capacidad de depósitos]
7.  Capturismos = 40
8.  Captodot = 65
9.  [Fin de definición de capacidad de depósitos]
10.  [Cálculo de necesidades de combustible]
11.  Necesidadescom = Turismos * Capturismos + Todoterrenos * Captodot
12.  [Fin de cálculo de necesidades de combustible]
13.  Fin

SOLUCIÓN EJERCICIO Nº 1

El código será algo como lo que se muestra a continuación. Antes de escribir el código tenemos que crear los objetos (controles) a que vamos a hacer referencia en el código, en concreto crearemos 6 labels, 4 TextBox y un botón.

Código
Rem Curso Visual Basic aprenderaprogramar.com
Option Explicit
Rem Declaración de variables
Dim Turismos%, Todoterrenos As Integer
Dim Capturismos!, Captodot As Single
Dim Necesidadescom As Single

Rem Contenido del formulario
Private Sub Form_Load()
Form1.Caption = "Cálculo de necesidades combustible"
Label1(0) = "Por favor introduzca estos datos"
Label1(1) = "Número de turismos"
Label1(2) = "Número de todoterrenos"
Label1(3) = "Capacidad de turismos (litros)"
Label1(4) = "Capacidad de todoterrenos (litros)"
Command1.Caption = "Aceptar"
End Sub

Rem Cálculo y muestra resultados
Private Sub Command1_Click()
Label2.ForeColor = vbBlack
Label2.FontBold = True
Turismos = Val(Text1(0))
Todoterrenos = Val(Text1(1))
Capturismos = Val(Text1(2))
Captodot = Val(Text1(3))
Necesidadescom = Turismos * Capturismos + Todoterrenos * Captodot
Label2 = "Las necesidades totales de combustible son de " & Necesidadescom & " litros"
End Sub
  
Téngase en cuenta que se han declarado como código diversas órdenes que podrían haberse introducido desde el diseño de objetos previo. Ten en cuenta también que todos los objetos que invocamos en el código los hemos creado previamente sobre el formulario (menú Ver – Objeto); los nombres de los objetos los pone Visual Basic (como en este ejemplo) al crearlos, o los establecemos en la ventana Propiedades nosotros mismos si deseamos cambiarlos. Si tratas de invocar un objeto no definido o con un nombre equivocado te saldrá un mensaje de error.

En un pequeño programa como este en el que tenemos varios labels, podemos optar tanto por usar arrays de controles (en este caso los controles tendrán nombres como Label1(0), Label1(1), Label1(2), etc.) o simplemente distintos controles (en este caso los nombres serán como Label1, Label2, Label3, etc.). Lo mismo podemos decir en relación a las cajas de texto (TextBox). Recordar que en las versiones menos recientes de Visual Basic es más sencillo crear arrays de controles que en las más recientes, ya que basta copiar y pegar un control y Visual Basic pregunta directamente si queremos crear el array.
El resultado gráfico después de introducir los datos y pulsar aceptar será algo así:



EJERCICIO Nº2
Transformar en código el pseudocódigo que se muestra a continuación, relativo a proporcionar el volumen de un cilindro dados su altura y diámetro.
1.  Inicio
2.  Mostrar “Introduzca el diámetro, en metros” : Pedir D 
3.  Mostrar “Introduzca la altura, en metros” : Pedir H 
4.  R = D/2 : Pi = 3,141593
5.  V = Pi * (R ^ 2) * H
6.  Mostrar “El volumen del cilindro es de”, V, “metros cúbicos
7.  Fin


SOLUCIÓN EJERCICIO EJEMPLO Nº2
Creamos un formulario donde insertamos dos Labels (podemos usar arrays de controles como Label1(0) yLabel1(1)) ó simplemente dos controles como Label1 y Label2, dos TextBox (podemos decir lo mismo que para los labels)y un Label para resultados al que vamos a ponerle nosotros el nombre y que llamaremos (LabelResultados), así como un botón al que llamaremos ButtonCalcular. El primer Label mostrará el mensaje de solicitud del diámetro y el segundo Label el correspondiente a la altura. A través de los TextBox el usuario introducirá los datos solicitados y a través del Label de resultados mostraremos los resultados. El código será algo así:

Código
Rem Curso Visual Basic aprenderaprogramar.com
Option Explicit
Rem Declaración de variables
Const Pi As Single = 3.141592654
Dim R!, H!, V As Single

Rem Contenido del formulario
Private Sub Form_Load()
Form1.Caption = "Cálculo volumen cilindro"
ButtonCalcular.Caption = "Calcular Volumen"
Label1.Caption = "Introduzca aquí el diámetro, en metros"
Label2.Caption = "Introduzca aquí la altura, en metros"
End Sub

Rem Cálculo y muestra resultados
Private Sub ButtonCalcular_Click()
R = Val(Text1) / 2
H = Val(Text2)
V = Pi * (R ^ 2) * H
LabelResultados.FontSize = 10
LabelResultados.FontBold = True
LabelResultados.Alignment = 2
LabelResultados = "El volumen del cilindro es de " & V & " metros cúbicos"
End Sub


El resultado gráfico será similar a este:



EJERCICIO Nº3

Transformar en código el pseudocódigo que se indica a continuación, relativo a proporcionar el precio medio de un producto, calculado a partir del precio del mismo en tres establecimientos distintos.

1.  Inicio
2.  Mostrar “Introduzca el precio del producto en el establecimiento número 1, en euros” : Pedir Precio1
3.  Mostrar “Introduzca el precio del producto en el establecimiento número 2, en euros” : Pedir Precio2
4.  Mostrar “Introduzca el precio del producto en el establecimiento número 3, en euros” : Pedir Precio3
    5.  Media = (Precio1 + Precio2 + Precio3) / 3
  6.  Mostrar “El precio medio del producto es”, Media, “Euros” 
7.  Fin


SOLUCIÓN EJERCICIO Nº3

En el formulario insertamos tres Labels y tres TextBox para petición de datos, así como un botón y un Label para cálculo y muestra de resultados. El código será algo así:

Código
Rem Visual Basic aprenderaprogramar.com
Option Explicit
Rem Declaración de variables
Dim Precio1!, Precio2!, Precio3!, Media As Single

Rem Contenido del formulario
Private Sub Form_Load()
Form1.Caption = "Cálculo precio medio producto"
ButtonCalcular.Caption = "Calcular precio medio"
Label1.Caption = "Introduzca aquí el precio en establecimiento nº1, en euros"
Label2.Caption = "Introduzca aquí el precio en establecimiento nº2, en euros"
Label3.Caption = "Introduzca aquí el precio en establecimiento nº3, en euros"
End Sub

Rem Cálculo y muestra resultados
Private Sub ButtonCalcular_Click()
Precio1 = Val(Text1)
Precio2 = Val(Text2)
Precio3 = Val(Text3)
Media = (Precio1 + Precio2 + Precio3) / 3
LabelResultados.FontSize = 10
LabelResultados.FontBold = True
LabelResultados.Alignment = 2
LabelResultados = "El precio medio del producto es de " & Media & " euros"
End Sub


Para los controles podríamos haber usado arrays de controles si hubiéramos querido. Hemos usado controles independientes tipo Label1, Label2, Label3 y Text1, Text2 y Text3 en vez de arrays de controles. Si bien en líneas generales es ventajoso el uso de arrays cuando necesitamos automatizar procesos, para aplicaciones tan sencillas como ésta no tiene trascendencia hacerlo de una u otra manera.

El resultado gráfico será similar a este:


  EJERCICIO ECUACIÓN DE SEGUNDO GRADO (ECUACIÓN CUADRÁTICA)
Crear un programa que resuelva la ecuación cuadrática tipo ax2 + bx + c. El planteamiento del problema y su solución en forma de pseudocódigo se pueden encontrar en el curso “Bases de la programación nivel I” de aprenderaprogramar.com, dentro de los ejercicios relacionados con condicionales. Una vez creado el programa, hay que contrastar su correcto funcionamiento.

SOLUCIÓN
Usaremos tres Labels para pedir los parámetros a, b y c denominados Labela, Labelb y Labelc, y tres TextBox para que el usuario introduzca datos (Texta, Textb y Textc) además de un botón (ButtonCalcular). Nosotros hemos añadido además un mensaje de cabecera con un label (LabelTitulo). Mostraremos primero el código para versiones de Visual Basic más recientes y luego para versiones menos recientes. Ten en cuenta que la lógica de los programas es en ambos casos igual, lo único que varía son los detalles de la sintaxis.

CÓDIGO (PARA VERSIONES DE VISUAL BASIC MENOS RECIENTES)
Rem Curso Visual Basic aprenderaprogramar.com

Option Explicit
Rem Declaración de variables
Dim a!, b!, c!, d!, e As Single

Rem Contenido del formulario
Private Sub Form_Load()
Form1.Caption = "Ecuación cuadrática"
CommandCalcular.Caption = "Calcular x"
LabelTítulo = "Parámetros a, b y c para ecuación tipo a*x^2 + b*x + c = 0"
Labela.Caption = "Valor parámetro a"
Labelb.Caption = "Valor parámetro b"
Labelc.Caption = "Valor parámetro c"
End Sub

Rem Cálculo y muestra de resultados
Private Sub CommandCalcular_Click()
LabelResultado.FontSize = 10
LabelResultado.FontBold = True
a = Val(Texta)
b = Val(Textb)
c = Val(Textc)
d = b ^ 2 - 4 * a * c
e = 2 * a
If d = 0 Then
    LabelResultado = "x1 = x2 = " & - b / e
Else
    If d > 0 Then
        LabelResultado = "x1 = " & (-b + Sqr(d)) / e
        LabelResultado = LabelResultado & vbCrLf & "x2 = " & (-b - Sqr(d)) / e
    Else
        LabelResultado = "x1 = " & -b / e & " + " & Sqr(-d) / e & " * i"
        LabelResultado = LabelResultado & vbCrLf & "x2 = " & -b / e & " - " & Sqr(-d) / e & " * i"
    End If
End If
End Sub

COMENTARIOS
El programa (ambas versiones de código) "funciona", si bien tiene sus limitaciones. Prueba a introducir los siguientes datos:   a = 0, b = 3 y c = 1 . Te aparecerán resultados extraños (o un error como "Error 6 en tiempo de ejecución. Desbordamiento"). El motivo para esos resultados extraños o errores es que si a = 0 implica que e = 0 y al encontrarnos con una operación del tipo  (-b + Sqr(d)) / edonde el denominador vale cero... ¡operación matemática no permitida! Esto ocurrirá mientras no preparemos el programa para detectar este tipo de situaciones y darles un tratamiento adecuado, cosa que veremos más adelante.
Estamos construyendo programas sencillos que en líneas generales responden bien cuando se dan las circunstancias previstas pero que fallan ante situaciones extrañas. Esto no debe preocuparnos por el momento, ya que a medida que progresemos como programadores iremos construyendo programas cada vez más sólidos.
Aspecto gráfico:




EJEMPLOS CON IF THEN ELSE EN VISUAL BASIC: PARADOJA DEL SI BURLADO POR UN INTERVALO
Reflexiona sobre el significado y prueba los siguientes códigos en tu ordenador:

Código 1 (versionesVB menos recientes)

Rem Curso Visual Basic aprenderaprogramar.com
Option Explicit
Dim A%
                                                                         
Private Sub Form_Load()
A = 160
If 50 < A < 75 Then
    MsgBox ("Arabia")
Else
    MsgBox ("Eusebio")
End If
End Sub

 

Código 2 (versionesVB menos recientes)

Rem Curso Visual Basic aprenderaprogramar.com
Option Explicit
Dim A%
                                                                         
Private Sub Form_Load()
A = 160
If A > 50 And A < 75 Then
    MsgBox ("Arabia")
Else
    MsgBox ("Eusebio")
End If
End Sub

 


Si bien podría esperarse obtener el mismo resultado con ambos códigos, al ejecutar el código 1 obtenemos como resultado que se muestre en pantalla "Arabia", mientras que al ejecutar el código 2 se muestra "Eusebio". La razón: Visual Basic no admite comparaciones dobles del tipo x < y < z. Ante este tipo de escritura, sólo es evaluada la primera condición de las dos pretendidas. ¿Solución? No usar comparaciones dobles.
Este “resultado inesperado” puede ocasionar un buen quebradero de cabeza, ya que en un programa extenso no será nada fácil detectar este error. Como remedio, usaremos siempre la escritura de condiciones una detrás de otra y no de forma múltiple.

EJERCICIO EJEMPLO CON IF THEN ELSE EN VISUAL BASIC
Crear un programa que pida un número entero distinto de cero y nos muestre en pantalla un mensaje indicándonos si el número es par o impar.
Nota: El procedimiento a emplear será basado en el uso del operador Mod.
SOLUCIÓN
Crearemos un Label de solicitud del número, un Textbox de entrada, un Button (Command Button en las versiones menos recientes de Visual Basic) y un Label para el cálculo y el resultado. Le ponemos los nombres y organizamos los controles en pantalla como nos parezca correcto (no tiene por qué coincidir con lo que ponemos aquí). Los nombres que hemos empleado nosotros son: LabelPideNum, TextNentero, ButtonHallar yLabelResultado.

Código

Rem Curso Visual Basic aprenderaprogramar.com
Option Explicit

Dim Num As Integer
Dim Res As Integer

Private Sub Form_Load()
Form1.Caption = "Determina naturaleza par o impar"
ButtonHallar.Caption = "Determinar"
LabelPideNum = "Introduzca un nº entero"
End Sub
                                                               
Private Sub ButtonHallar_Click()
Num = Val(TextNentero)
Res = Num Mod 2
LabelResultado.FontSize = 10
LabelResultado.FontBold = True
If Res = 0 Then
    LabelResultado = "El número es par"
Else
    LabelResultado = "El número es impar"
End If
End Sub

 

Gráficamente:



Hemos escrito el If ... Then – Else como un bloque en vez de como una única línea. El motivo para ello es que aporta mayor claridad y facilidad de interpretación.


EJERCICIO
Transformar en código de Visual Basic el siguiente enunciado: crear un programa que pida al usuario un número de día y un número de mes, evalúe si la entrada es correcta y en caso de que así sea calcule el día del año que es, considerando un año no bisiesto.

SOLUCIÓN
Crearemos tres labels a los que denominaremos Label1, Label2 y LabelResultado. Label1 servirá para mostrar un mensaje solicitando que se introduzca el número de día, Label2 servirá para mostrar un mensaje solicitando que se introduzca el número de mes y LabelResultado servirá para mostrar el resultado.
Crearemos dos TextBoxes denominados Text1 y Text2. El primero de ellos servirá para que el usuario introduzca el dato de número de día y el segundo el dato de número de mes.
Finalmente tendremos un botón denominado ButtonCalcular que servirá para mostrar los resultados una vez el usuario haya introducido el dato de número de día y número de mes.

Código 
Rem Curso Visual Basic aprenderaprogramar.com
Rem [Cálculo del día del año]
Option Explicit
Dim Ndía%, Nmes%, DDA As Integer

Private Sub Form_Load()
Form1.Caption = "Cálculo día del año"
Label1.Caption = "Introduzca aquí el número del día"
Label2.Caption = "Introduzca aquí el número del mes"
ButtonCalcular.Caption = "Determinar día del año"
End Sub

Private Sub ButtonCalcular_Click()
Ndía = Val(Text1)
Nmes = Val(Text2)
LabelResultado.FontSize = 10
LabelResultado.FontBold = True
If Ndía >= 1 And Ndía <= 31 And Nmes >= 1 And Nmes <= 12 Then
    Select Case Nmes
        Case 1
            DDA = Ndía '[DDA es día del año]
        Case 2
            DDA = Ndía + 31
        Case 3
            DDA = Ndía + 59
        Case 4
            DDA = Ndía + 90
        Case 5
            DDA = Ndía + 120
        Case 6
            DDA = Ndía + 151
        Case 7
            DDA = Ndía + 181
        Case 8
            DDA = Ndía + 212
        Case 9
            DDA = Ndía + 243
        Case 10
            DDA = Ndía + 273
        Case 11
            DDA = Ndía + 304
        Case 12
            DDA = Ndía + 334
    End Select
    LabelResultado = "El " & Ndía & " del " & Nmes & " es el día " & DDA & " del año"
Else
    LabelResultado = "Datos proporcionados no válidos"
End If
End Sub



Aspecto gráfico:




EJERCICIO
Transformar en código el siguiente planteamiento: queremos generar un programa que pida un número del 1 al 10 y nos muestre la “tabla de multiplicar” correspondiente.


SOLUCIÓN
Hemos realizado la pregunta relativa al número cuya tabla se desea conocer utilizando un InputBox. Igualmente válido hubiera sido hacerlo con un Label contenedor de la pregunta y un TextBox donde el usuario introduce la información. La tabla la mostramos sobre un Label denominado LabelTabla.

Código 

Rem Curso Visual Basic aprenderaprogramar.com
Option Explicit
Dim T As Integer
Dim i As Integer
                                             
Private Sub Form_Load()
Form1.Caption = "Tabla"
T = Val(InputBox("¿Qué tabla quiere conocer?" & vbCrLf & _
"(Introduzca un número de 1 a 10)", "¿Número?"))
LabelTabla.FontBold = True
LabelTabla.Alignment = 2
LabelTabla = "TABLA DEL " & T & vbCrLf & vbCrLf

For i = 1 To 10
    LabelTabla = LabelTabla & T & " * " & i & " = " & T * i & vbCrLf
Next i
End Sub

Aspecto gráfico:











No hay comentarios:

Publicar un comentario