Codificación aprenderaprogramar.com: CU00333A
EJERCICIOS EJEMPLOS RESUELTOS EN VISUAL BASIC
El objetivo de estos ejercicios es aplicar conocimientos sobre "Herramientas básicas para la programación" a un lenguaje como es Visual Basic. Para su realización debemos tener conocimientos básicos sobre algoritmia, uso de bucles o estructuras iterativas y apertura y cierre de archivos.
EJERCICIO EJEMPLO USO DE ARRAYS DE CONTROLES Y FUNCIÓN VAL
Desarrollar el código que dé respuesta al siguiente problema:
Un vivero forestal actualiza cada seis meses los precios de la planta que vende en función de los valores oficiales de inflación mensual. Desean desarrollar un programa que proporcione el precio actualizado a partir del precio anterior y los valores de inflación. Consideramos que una vez transcurre el mes el nuevo precio es:
Precio = Precio * ( inflación mes / 100 ) + Precio = Precio * ( 1 + inflación mes / 100)
El siguiente mes el precio a aplicar ya no es el inicial, sino el precio afectado por la inflación.
SOLUCIÓN
Vamos a trabajar con arrays (matrices) de controles. El código para las versiones menos recientes de Visual Basic sería el siguiente:
Rem Curso Visual Basic aprenderaprogramar.com '[Actualización de precios de planta] Option Explicit Dim i As Integer Dim Actual!, Nuevo As Single Dim inf(6) As Single Private Sub Form_Load() Show Form1.Caption = "Precios de planta" CommandCalcular.Caption = "Calcular precio" LabelPactual.Caption = "Introduzca aquí el precio actual" For i = 1 To 6 Label1(i).Caption = "Introduzca aquí la inflación del mes "& i Next End Sub Private Sub CommandCalcular_Click() Nuevo = Val(TextPactual) For i = 1 To 6 inf(i) = Val(Text1(i)) Nuevo = Nuevo * (1 + (inf(i)) / 100) Next i Labelfinal.Alignment = 2 Labelfinal.FontBold = True Labelfinal = vbCrLf & "El precio nuevo del producto debe ser "& Nuevo End Sub |
El resultado gráfico se muestra más abajo.
En el diseño del formulario deberemos haber creado un Label denominado LabelPactual y un textBox denominado TextPactual y haberlos situado en la parte superior. Además necesitaremos un botón que el usuario debe pulsar una vez introducidos los datos y un label para mostrar los resultados, que hemos denominado Labelfinal y que hemos situado en la parte inferior de la ventana.
Código para versiones más recientes de Visual Basic:
REM Curso Visual Basic aprenderaprogramar.com Public Class Form1 Dim LabelArray(6) As Label Dim TextBoxArray(6) As TextBox Dim Actual, Nuevo As Single Dim inf(6) As Single Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer Me.Text = "Precios de planta" ButtonCalcular.Text = "Calcular precio" LabelPactual.Text = "Introduzca aquí el precio actual" For i = 1 To 6 LabelArray(i) = New Label TextBoxArray(i) = New TextBox LabelArray(i).Text = "Introduzca aquí la inflación del mes " & i LabelArray(i).Width = 220 : TextBoxArray(i).Width = 100 LabelArray(i).Height = 30 : TextBoxArray(i).Height = 30 TextBoxArray(i).AutoSize = False LabelArray(i).TextAlign = ContentAlignment.MiddleCenter LabelArray(i).BorderStyle = BorderStyle.FixedSingle LabelArray(i).Location = New Point(100, i * 50 + 50) TextBoxArray(i).Location = New Point(360, i * 50 + 50) Me.Controls.Add(LabelArray(i)) : Me.Controls.Add(TextBoxArray(i)) Next End Sub Private Sub ButtonCalcular_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonCalcular.Click Dim i As Integer Nuevo = Val(TextPactual.Text) For i = 1 To 6 inf(i) = Val(TextBoxArray(i).Text) Nuevo = Nuevo * (1 + (inf(i)) / 100) Next Labelfinal.TextAlign = ContentAlignment.MiddleCenter Labelfinal.Font = New Font("Arial", 10, FontStyle.Bold) Labelfinal.Text = vbCrLf & "El precio nuevo del producto debe ser " & Nuevo End Sub End Class |
Comentarios: en lugar de arrays de controles podríamos haber usado controles simples como Label1, Label2, Label3, etc. pero en este caso no podríamos haber usado bucles para realizar los cálculos, sino que tendríamos que repetir los cálculos.
Gráficamente el resultado será similar a este:
EJERCICIO EJEMPLO USO DE GENERACIÓN DE NÚMEROS ALEATORIOS Y USO DE ARCHIVOS
Desarrollar el código que dé respuesta al siguiente problema:
En un complejo industrial se desea incentivar a los encargados de turnos de producción. A cada encargado le corresponde un turno. Hay 18 turnos, y por cada uno de ellos 40 operarios. Para evaluar a los encargados se ha hecho una encuesta entre los trabajadores. Se les ha pedido que evalúen a su encargado de 0 a 10 siendo el 5 el aprobado. Los resultados están almacenados en un array tipo Nota(turno, operario) donde turno indica el número de turno y operario el número de operario dentro del turno. Desarrollar un programa que determine en qué turnos todos los operarios del mismo han aprobado al encargado.
Nota: las notas las generaremos aleatoriamente en un fichero con un pequeño programa auxiliar.
SOLUCIÓN
Generaremos una simulación del archivo de evaluación. Para ello haremos una creación de datos con base aleatoria pero "dirigida". Sabiendo que cada turno tiene 40 empleados, dejaremos una generación aleatoria entre 0 y 10 para todos los turnos excepto los número 3 y 18 (asociados a los datos 81 a 120 y 681 a 720), en los que los datos generados “obligaremos” a que se encuentren entre 5 y 10, de modo que sabemos de antemano que todos los empleados de los turnos nº3 y nº18 "han aprobado" a su encargado. Los códigos para crear el archivo de evaluación y el programa serían los siguientes:
Código (versionesVB menos recientes) | Código (versiones VB más recientes) |
'Curso Visual Basic aprenderaprogramar.com '[Archivo de evaluación] Option Explicit Dim Canal As Integer Dim i As Integer Private Sub Form_Load() Show Canal = FreeFile Open "C:\evaluación.dat" For Output As Canal For i = 1 To 720 Randomize If i < 81 Or i > 120 And i < 681 Then Write #Canal, Int((11) * Rnd) Else Write #Canal, Int((10 - 5 + 1) * Rnd + 5) End If Next i Close End Sub |
REM Curso Visual Basic aprenderaprogramar.com Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer Button1.Text = "Generar archivo de datos" End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim myFileToWrite As New System.IO.StreamWriter("C:\Users\Toshiba\Desktop\evaluacion.dat", False) For i = 1 To 720 Randomize() If i < 81 Or i > 120 And i < 681 Then myFileToWrite.WriteLine(Int(11 * Rnd())) Else myFileToWrite.WriteLine(Int((10 - 5 + 1) * Rnd() + 5)) End If Next i myFileToWrite.Close() End Sub End Class |
'[Curso Visual Basic aprenderaprogramar.com] '[Evaluación de encargados] Option Explicit Dim Canal As Integer Dim i%, j As Integer Dim Nota(18, 40) As Integer Dim Haysuspensos As Boolean Private Sub Form_Load() Show Labelfinal.Alignment = 2 Labelfinal.FontBold = True Canal = FreeFile Open "C:\evaluación.dat" For Input As Canal For i = 1 To 18 For j = 1 To 40 Input #Canal, Nota(i, j) If Nota(i, j) < 5 Then Haysuspensos = True End If Next j If Haysuspensos = False Then Labelfinal = Labelfinal & vbCrLf & "Todos los operarios del turno " & i & _ " han aprobado al encargado" & vbCrLf End If Haysuspensos = False Next i Close End Sub |
REM Curso Visual Basic aprenderaprogramar.com Public Class Form1 Dim Nota(18, 40) As Integer Dim Haysuspensos As Boolean Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Labelfinal.TextAlign = ContentAlignment.MiddleCenter Labelfinal.Font = New Font("Arial", 10, FontStyle.Bold) Labelfinal.Text = "" Button1.Text = "Generar estadísticas" End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim i, j As Integer Dim myFileToRead As New System.IO.StreamReader("C:\Users\Toshiba\Desktop\evaluacion.dat", False) For i = 1 To 18 For j = 1 To 40 Nota(i, j) = myFileToRead.ReadLine() If Nota(i, j) < 5 Then Haysuspensos = True End If Next j If Haysuspensos = False Then Labelfinal.Text = Labelfinal.Text & vbCrLf & "Todos los operarios del turno " & i &" han aprobado al encargado" & vbCrLf End If Haysuspensos = False Next i myFileToRead.Close() End Sub End Class |
Gráficamente obtendríamos un mensaje al ejecutar el programa que nos indicaría en qué turnos todos los operarios han aprobado al encargado: