Page 176
Image_2118_0
Manejo de datos con arrays. Funciones Ubound y Lbound en Visual Basic. Ejemplos.
__rendered_path__3
Nos indican que se trata de extraer datos de un archivo existente en “paquetes” de 100 unidades. Si el
número de datos extraídos con valor superior a 600 y menor de 700 es mayor de 100, se debe mostrar
el mensaje “Se cumple lo previsto”, indicando el número de datos que se extrajeron cumpliendo los
requisitos frente al total extraído. En caso contrario, continuar extrayendo paquetes de datos (se
consideran ilimitados). Considerar que los datos se encuentran en un archivo creado previamente.
SOLUCIÓN
Para generar una simulación del archivo con los datos vamos a usar el siguiente código (atención a
poner una ruta de archivo correcta, donde queramos guardar el archivo):
Código versiones menos recientes de VB: Código versiones más recientes de VB
Image_2154_0
‘Curso VB aprenderaprogramar.com
REM Curso Visual Basic aprenderaprogramar.com
Image_2153_0
Option Explicit
Option Explicit On
Dim Canal As Integer
Public
Class
Form1
Dim i As Integer
Private Sub Form1_Load(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
Private Sub Form_Load()
MyBase.Load
Canal = FreeFile
Dim myFileToWrite As New
Open "C:\misdatos.dat" For Output As Canal
System.IO.
osnet.dat"
StreamWriter
,
False
)
(
"C:\Users\Asus\Desktop\misdat
For i = 1 To 300
For i = 1 To 300
Randomize
Randomize()
Write #Canal, Int((750 - 550 + 1) * Rnd + 550)
myFileToWrite.WriteLine(Int((750 - 550 +
Next i
1) * Rnd() + 550))
Close
myFileToWrite.Close()
Next
i
Label1 = “Datos generados correctamente”
Label1.Text = "Datos generados correctamente"
End Sub
End Sub
End Class
Image_2119_0
__rendered_path__53Image_2121_0
__rendered_path__72
Hemos establecido un rango de datos entre 550 y 750 para provocar que los datos estén en el entorno
de los valores esperados. En caso contrario se puede producir que no exista un número suficiente de
datos válidos y se genere un error al tratar de extraer más datos de los realmente existentes en el
archivo. El programa se muestra a continuación:
__rendered_path__1
© 2006-2029 aprenderaprogramar.com

Page 177
Manejo de datos con arrays. Funciones Ubound y Lbound en Visual Basic. Ejemplos.
Código versiones menos recientes de VB: Código versiones más recientes de VB
en aprenderaprogramar.com
http://www.aprenderaprogramar.com/index.php?opti
__rendered_path__3
'Curso VB aprenderaprogramar.com
‘[Extracción datos p100]
Option Explicit
Dim Canal As Integer
Dim i%, j%, n As Integer
Dim Esperado As Boolean
Dim Dato() As Integer
Private Sub Form_Load()
Form1.Caption = "Extracción datos p100"
LabelResultado.Alignment = 2
LabelResultado.FontBold = True
n = 1
Canal = FreeFile
Open "C:\misdatos.dat" For Input As Canal
Do While Esperado = False
ReDim Dato(n + 99)
For i = n To n + 99
Input #Canal, Dato(i)
If Dato(i) > 600 And Dato(i) < 700 Then
j = j + 1
End If
Next i
If j > 100 Then
Esperado = True
End If
If Esperado = True Then
LabelResultado = "Se cumple lo previsto
habiendo cumplido " & j & " datos de un total
de " & n + 99 & " datos extraidos"
Else
MsgBox("Extracción de un nuevo paquete")
n = n + 100
End If
Loop
Close
End Sub
Gráficamente:
Image_2165_0
Próxima entrega: CU00344A
Acceso al curso completo
© 2006-2029 aprenderaprogramar.com
Image_2118_0
Image_2163_0
REM Curso Visual Basic aprenderaprogramar.com
Image_2162_0
Option Explicit On
Public Class Form1
Private Sub Form1_Load(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
Dim i, j, n As Integer
Dim Esperado As Boolean
Dim Dato() As Integer
Me.Text = "Extracción datos p100"
LabelResultado.Font = New Font("Arial", 12,
FontStyle.Bold)
LabelResultado.TextAlign =
ContentAlignment.MiddleCenter
n = 1
Dim myFileToRead As New
System.IO.StreamReader("C:\Users\Asus\Desktop\misdat
osnet.dat", False)
Do While Esperado = False
ReDim Dato(n + 99)
For i = n To n + 99
Dato(i) = myFileToRead.ReadLine()
If Dato(i) > 600 And Dato(i) < 700 Then
j = j + 1
End If
Next i
If j > 100 Then
Esperado = True
End If
If Esperado = True Then
LabelResultado.Text = "Se cumple lo
previsto habiendo cumplido " & j & " datos de un
total de " & n + 99 & " datos extraidos"
Else
MsgBox("Extracción de un nuevo paquete")
n = n + 100
End If
Loop
myFileToRead.Close()
End Sub
End Class
Image_2164_0Image_2119_0
-- > Cursos, o en la dirección siguiente:
__rendered_path__1__rendered_path__21__rendered_path__27Image_2121_0__rendered_path__71
on=com_content&view=category&id=37&Itemid=61

Page 178
Image_2174_0
Ejemplos de manejo de datos con arrays en Visual Basic. Límites Ubound y Lbound.
__rendered_path__5
EJERCICIO RESUELTO
Generar el código correspondiente al siguiente ejercicio, relativo al cálculo de un valor medio a partir
de una serie de datos que terminan en un señalero (centinela).
En un fichero tenemos las notas de un grupo de alumnos de una clase en un array Nota(1), Nota(2), ...,
Nota(n – 1), establecidas entre 0 y 10. El último dato es un señalero con valor – 50. Se desea crear un
programa que determine la nota media usando un array para almacenar las notas extraídas del fichero
que inicialmente tenga índice máximo 10 y se amplíe a 20 en caso de que llegue a completarse el
número de elementos admitidos en el array (y en caso de llegar al índice 20 se amplíe a 30 y así
sucesivamente.
SOLUCIÓN
Consideraremos que el fichero notas.dat contiene los siguientes datos que nos servirán para probar el
programa: 5, 7, 2, 3, 9, 5, 6, 8, - 50 (cada dato estará en una línea distinta, aquí los ponemos separados
por comas por motivo de espacio).
Usaremos un label denominado Labelfinal para mostrar los resultados.
Código versiones VB menos recientes: Código versiones VB más recientes:
Image_2178_0
'[Curso VB aprenderaprogramar.com]
REM Curso Visual Basic aprenderaprogramar.com
Image_2176_0
'[Determinación de media]
Option Explicit On
Public
Class
Form1
Option Explicit
Dim Canal As Integer
Dim i%, Suma As Single
Private
System.
MyBase
Object
.Load
Sub
Form1_Load(
,
ByVal
e
ByVal
As
System.
sender
As
EventArgs
)
Handles
Dim Nota() As Single
Dim
i
As
Integer
Dim Media As Single
Dim
Dim
Suma
Nota()
As
As
Single
Single
Dim Media As Single
Private Sub Form_Load()
Form1.Caption = "Nota media"
Labelfinal.Alignment = 2
Labelfinal.FontBold = True
ReDim Nota(10)
Labelfinal.Font =
FontStyle
.Bold)
Labelfinal.TextAlign =
ReDim
Nota(10)
Me
.Text =
"Nota media"
New
Font
(
"Arial"
ContentAlignment
, 12,
.MiddleCenter
Canal = FreeFile
Dim
myFileToRead
As
New
System.IO.
StreamReader
Open "C:\notas.dat"
i = 1
For Input As Canal
(
i = 1
Nota(i) = myFileToRead.ReadLine()
"C:\Users\Asus\Desktop\notas2.dat"
,
False
)
Input #Canal, Nota(i)
Do While Nota(i) > = 0
Suma = Suma + Nota(i)
Suma = Suma + Nota(i)
Do
While
Nota(i) >= 0
If UBound(Nota) = i Then ReDim Preserve
If
UBound(Nota) = i
Then
ReDim Preserve
Nota(i + 10)
Nota(i + 10)
i = i + 1
i = i + 1
Nota(i) = myFileToRead.ReadLine()
Input #Canal, Nota(i)
Loop
Media = Suma / (i - 1)
Close
Labelfinal = "La nota media de la clase es " &
Media = Suma / (i - 1)
myFileToRead.Close()
Labelfinal.Text =
clase es "
& Media
End
Sub
Loop
"La nota media de la
Media
End Class
End Sub
__rendered_path__1Image_2177_0__rendered_path__65Image_2175_0__rendered_path__100
© 2006-2029 aprenderaprogramar.com

Page 179
Image_2174_0
Ejemplos de manejo de datos con arrays en Visual Basic. Límites Ubound y Lbound.
__rendered_path__5
El aspecto gráfico resultado al ejecutar el programa será similar a este:
Image_2198_0
Comentarios: En este caso, se establece una extracción de paquetes de datos de 10 en 10. Fijémonos
en una línea: If UBound(Nota) = i Then ReDim Preserve Nota(i + 10)
Aquí establecemos que si el número de elementos que se extraen coincide con el tamaño máximo del
vector nota que está recibiendo los datos del archivo, dicho vector se amplía en otros diez elementos.
Cuando se llega al señalero de terminación es posible que cierto número de elementos del array, entre
uno y diez, queden vacíos. Cuanto más grande hagamos el intervalo asociado a cada
redimensionamiento, menor número de procesos es necesario. En cambio, mayor cantidad de
elementos del array corremos el riesgo de que queden vacíos.
EJERCICIO RESUELTO
Generar el código para un programa que pide un número impar y realiza cálculos numéricos. En
concreto el programa presentará las siguientes opciones:
a) Introducir un valor entero impar comprendido entre 1 y 19
b) Calcular la serie numérica 1 + 3 + 5 + ··· + n
c) Calcular 1 * 3 * 5 * ··· * n
d) Salir del programa.
Nota: Los cálculos se han de realizar a través de un vector que almacene los valores impares
comprendidos entre 1 y n.
El pseudocódigo es el siguiente:
__rendered_path__78
PROGRAMA IMPARES01 Curso Visual Basic aprenderaprogramar.com
__rendered_path__77__rendered_path__80
__rendered_path__55__rendered_path__79
Variables
__rendered_path__55__rendered_path__77
Enteras: E, Dato, Cantidad, Valor()
__rendered_path__59
__rendered_path__59
1. Inicio
__rendered_path__59
2. Mientras E <> 4 Hacer
__rendered_path__59
2.1 Si E = 1 Entonces
__rendered_path__59
Llamar Genera
__rendered_path__59
FinSi
__rendered_path__59
2.2 Si E = 2 y Dato <> 0 Entonces
__rendered_path__59
Llamar CalculaSuma(Cantidad) PorValor
__rendered_path__59
FinSi
__rendered_path__1__rendered_path__54__rendered_path__59__rendered_path__59__rendered_path__81Image_2200_0__rendered_path__81Image_2199_0
© 2006-2029 aprenderaprogramar.com

Page 180
Ejemplos de manejo de datos con arrays
Vamos a plantear un programa donde inicialmente
por título “Introducir valor” y que permitirá establecer
1+3+5…” que hará que se ejecute el cálculo con el val
1*3*5…” con igual función para obtener el valor de
que permitirá salir del programa.
© 2006-2029 aprenderaprogramar.com
__rendered_path__5
__rendered_path__74
__rendered_path__78
SOLUCIÓN
Image_2174_0
en Visual Basic. Límites Ubound y Lbound.
Image_2217_0
2.3 Si E = 3 y Dato <> 0 Entonces
__rendered_path__76Image_2216_0
Llamar CalculaMult(Cantidad) PorValor
__rendered_path__8__rendered_path__74
FinSi
__rendered_path__8
2.4 Mostrar “Elija opción: 1. Introducir dato
__rendered_path__8
2. Calcular 1 + 3 + 5 + ··· + n
__rendered_path__8
3. Calcular 1 * 3 * 5 * ··· * n
__rendered_path__8
4. Salir”
__rendered_path__8
Pedir E
__rendered_path__8
Repetir
__rendered_path__8
3. Fin
__rendered_path__8
__rendered_path__8
Módulo Genera
__rendered_path__22
Variables
__rendered_path__8
Enteras: Impar, i
__rendered_path__8
Booleanas: Par
__rendered_path__8
1. Dato = 0
__rendered_path__8
2. Mientras Dato <= 0 ó Dato > 19 ó Par = Verdadero Hacer
__rendered_path__8
Par = Falso
__rendered_path__8
Mostrar “Introduzca un número impar entre 1 y 19”
__rendered_path__8
Pedir Dato
__rendered_path__8
Si Dato mod 2 = 0 Entonces
__rendered_path__8
Par = Verdadero : Mostrar “El número debe ser impar”
__rendered_path__8
FinSi
__rendered_path__8
Repetir
__rendered_path__8
3. Impar = 1 : i = 0
__rendered_path__8
4. Hacer
__rendered_path__8
i = i + 1
__rendered_path__8
Impar = Impar + 2
__rendered_path__8
Redimensionar Valor(i)
__rendered_path__8
Valor(i) = Impar
__rendered_path__8
Repetir Mientras Impar < Dato
__rendered_path__8
5. Cantidad = i
__rendered_path__8
FinMódulo
__rendered_path__8
__rendered_path__8
Módulo CalculaSuma(Numero: Enteros)
__rendered_path__22
Variables
__rendered_path__8
Enteras: i, Suma
__rendered_path__8
1. Suma = 0
__rendered_path__8
2. Desde i = 1 hasta Numero Hacer
__rendered_path__8
Suma = Suma + Valor(i)
__rendered_path__8
Siguiente
__rendered_path__8
3. Mostrar “La suma 1 + 3 + 5 + ··· + n vale”, Suma
__rendered_path__8
FinMódulo
__rendered_path__8
__rendered_path__8
Módulo CalculaMult(Cifra: Enteros)
__rendered_path__8
Variables
__rendered_path__8
Enteras: i, Acumulado
__rendered_path__8
1. Acumulado = 1
__rendered_path__8
2. Desde i = 1 hasta Cifra Hacer
__rendered_path__8
Acumulado = Acumulado * Valor(i)
__rendered_path__8
Siguiente
__rendered_path__22
3. Mostrar “El producto 1 * 3 * 5 * ··· * n vale”, Acumulado
__rendered_path__8
FinMódulo
__rendered_path__7__rendered_path__8
se nos mostrarán cuatro botones: uno que llevará
__rendered_path__8
el valor de n, otro denominado “Calcular serie
__rendered_path__79
or de n existente, otro denominado “Calcular serie
__rendered_path__1__rendered_path__78__rendered_path__80
las multiplicaciones, y finalmente un botón “Salir”

Page 181
en Visual Basic. Límites Ubound y Lbound.
Código versiones VB menos recientes: Código versiones VB más recientes:
Ejemplos de manejo de datos con arrays
__rendered_path__5
Image_2230_0
'[Curso VB aprenderaprogramar.com]
'[PROGRAMA IMPARES01]
Option Explicit
Dim Dato%, Cantidad%, Valor() As Integer
Private Sub Form_Load()
Form1.Caption = "Impares01"
LabelResultado.Alignment = 2
LabelResultado.FontBold = True
Command1.Caption = "Introducir valor"
Command2.Caption = "Calcular serie
1+ 3+ 5..."
Command3.Caption = "Calcular serie 1*3*5..."
Command4.Caption = "Salir"
End Sub
Private Sub Command1_Click()
Call Genera
End Sub
Private Sub Command2_Click()
If Dato < > 0 Then Call
CalculaSuma(Cantidad)
End Sub
Private Sub Command3_Click()
If Dato < > 0 Then Call CalculaMult(Cantidad)
End Sub
Private Sub Command4_Click()
Unload Form1
End
End Sub
Private Sub Genera()
Dim Impar%, i As Integer
Dim Par As Boolean
Dato = 0
Do While Dato < = 0 Or Dato > 19 Or Par =
True
Par = False
Dato = Val(InputBox("Introduzca un número
impar entre 1 y 19", "Impar"))
If Dato Mod 2 = 0 Then
Par = True
MsgBox("El número debe ser impar")
End If
Loop
'
Continúa…
© 2006-2029 aprenderaprogramar.com
Image_2174_0
REM Curso Visual Basic aprenderaprogramar.com
Image_2229_0
'[PROGRAMA IMPARES01]
Option Explicit On
Public Class Form1
Dim Dato, Cantidad, Valor() As Integer
Private Sub Form1_Load(ByVal sender As
System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Me.Text = "Impares01"
LabelResultado.Font = New Font("Arial", 12,
FontStyle.Bold)
LabelResultado.TextAlign =
ContentAlignment.MiddleCenter
Button1.Text = "Introducir valor"
Button2.Text = "Calcular serie 1+3+5..."
Button3.Text = "Calcular serie 1*3*5..."
Button4.Text = "Salir"
End Sub
Private Sub Button1_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs)
Handles Button1.Click
Call Genera()
End Sub
Private Sub Button2_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs)
Handles Button2.Click
If Dato <> 0 Then Call
CalculaSuma(Cantidad)
End Sub
Private Sub Button3_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs)
Handles Button3.Click
If Dato <> 0 Then Call
CalculaMult(Cantidad)
End Sub
Private Sub Button4_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs)
Handles Button4.Click
Me.Close()
End
End Sub
Private Sub Genera()
Dim Impar, i As Integer
Dim Par As Boolean
Dato = 0
Do While Dato <= 0 Or Dato > 19 Or Par = True
Par = False
Dato = Val(InputBox("Introduzca un
número impar entre 1 y 19", "Impar"))
If Dato Mod 2 = 0 Then
Par = True
MsgBox("El número debe ser impar")
End If
Loop
'Continúa…
__rendered_path__1Image_2177_0__rendered_path__59Image_2175_0__rendered_path__116

Page 182
Image_2174_0
Ejemplos de manejo de datos con arrays en Visual Basic. Límites Ubound y Lbound.
__rendered_path__5
'Continuación del código
Impar = -1: i = 0
'
Impar = -1 : i = 0
Continuación del código
Image_2235_0
Do
i = i + 1
i = i + 1
Impar = Impar + 2
Do
Image_2234_0
Impar = Impar + 2
ReDim Preserve Valor(i)
ReDim Preserve Valor(i)
Valor(i) = Impar
Loop While Impar < Dato
Cantidad = i
LabelResultado = " "
Valor(i) = Impar
Loop
While
Impar < Dato
Cantidad = i
LabelResultado.Text =
" "
End
Sub
End Sub
Private Sub CalculaSuma(ByVal Número As
Private
Suma = 0
Sub
Dim
CalculaSuma(
i, Suma
As
ByVal
Integer
Número
As
Integer
)
Integer)
Dim i%, Suma As Integer
Suma = 0
Suma = Suma + Valor(i)
Next
i
For
i = 1
To
Número
For i = 1 To Número
LabelResultado.Text = vbCrLf & "La suma
Suma = Suma + Valor(i)
1+3+5+...+n vale "
End
Sub
& Suma
Next i
LabelResultado = vbCrLf & "La suma
1+ 3+ 5+ ...+ n vale " & Suma
End Sub
Private Sub CalculaMult(ByVal Cifra As
Private
Acumulado = 1
To
i = 1
For
Sub
Dim
Dim
CalculaMult(
As
i
Integer
Acumulado
As
Cifra
ByVal
Single
Cifra
As
Integer
)
Integer)
Acumulado = Acumulado * Valor(i)
Dim i As Integer
Dim Acumulado As Single
LabelResultado.Text = vbCrLf &
producto 1*3*5*...*n vale "
& Acumulado
Next
i
"El
Acumulado = 1
For i = 1 To Cifra
Acumulado = Acumulado * Valor(i)
End
End
Sub
Class
Next i
LabelResultado = vbCrLf & "El producto
1*3*5*...*n vale " & Acumulado
End Sub
Image_2177_0
__rendered_path__69Image_2175_0
__rendered_path__107
Comentarios: Distintas variantes pueden ser introducidas respecto a lo planteado en pseudocódigo. Sin
embargo, hemos tratado de respetar en la medida de lo posible el esquema allí propuesto. La única
variación introducida es la definición de la variable Acumulado como tipo real (Single) en vez de entera
(Integer). A ello estamos obligados ya que el rango de valores admisible para un tipo Integer con Visual
Basic puede resultar insuficiente para los rangos numéricos con que se hace trabajar a esta variable,
que pueden ser muy grandes. Obviar este hecho puede dar lugar a que a partir de un valor introducido
igual o superior a cierto número se nos presente un mensaje de "Error 6 en tiempo de ejecución:
desbordamiento". Para solventar este problema definimos la variable como tipo Single.
Hemos usado Redim Preserve en lugar de Redim para conservar los valores anteriores del vector Valor.
Dicho vector se redimensiona en cada pasada del bucle, aunque podíamos haber optado por
redimensionarlo cada cierto número de pasadas o asignarle un valor grande inicialmente y reducirlo al
valor definitivo después. Estos y otros aspectos del programa se comentan en el curso “Bases de la
programación nivel I” de aprenderaprogramar.com, donde se explica la lógica para la creación del
programa y el diagrama de flujo del mismo.
__rendered_path__1
© 2006-2029 aprenderaprogramar.com

Page 183
Image_2174_0
Ejemplos de manejo de datos con arrays en Visual Basic. Límites Ubound y Lbound.
__rendered_path__5
El aspecto gráfico será algo así:
Image_2241_0
Próxima entrega: CU00345A
Acceso al curso completo en aprenderaprogramar.com -- > Cursos, o en la dirección siguiente:
http://www.aprenderaprogramar.com/index.php?option=com_content&view=category&id=37&Itemid=61
__rendered_path__1__rendered_path__24
© 2006-2029 aprenderaprogramar.com

Page 184
Crear el código correspondiente al siguiente
anteriormente) pero, en este caso, prescindiendo del uso de arrays.
Se trata de crear un programa con las siguientes opciones:
Introducir un valor entero impar comprendido entre 1 y 19
El formato gráfico será el mismo que para el prog
Código versiones VB menos recientes:
Código versiones VB más recientes:
Ejemplos resueltos Visual Basic. If Then, Do While, Val, Loop, etc.
__rendered_path__5
EJERCICIO RESUELTO VISUAL BASIC
a)
b) Calcular la serie numérica 1 + 3 + 5 + ··· + n
c) Calcular 1 * 3 * 5 * ··· * n
d) Salir del programa.
SOLUCIÓN
arrays.
Image_2252_0
'[Curso VB aprenderaprogramar.com]
'[PROGRAMA IMPARES02]
Option Explicit
Dim Dato As Integer
Private Sub Form_Load()
Form1.Caption = "Impares02"
LabelResultado.Alignment = 2
LabelResultado.FontBold = True
Command1.Caption = "Introducir valor"
Command2.Caption = "Calcular serie
1+ 3+ 5..."
Command3.Caption = "Calcular serie 1*3*5..."
Command4.Caption = "Salir"
End Sub
Private Sub Command1_Click()
Call EntrarDato
End Sub
Private Sub Command2_Click()
If Dato < > 0 Then Call CalculaSuma(Dato)
End Sub
'Continúa…
Image_2251_0
© 2006-2029 aprenderaprogramar.com
Image_2248_0
ejercicio (mismo ejercicio que hemos resuelto
rama anterior, aunque en este caso no hemos usado
Image_2250_0
REM Curso Visual Basic aprenderaprogramar.com
'[PROGRAMA IMPARES02]
Option Explicit On
Public Class Form1
Dim Dato As Integer
Private Sub Form1_Load(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
Me.Text = "Impares02"
LabelResultado.Font = New Font("Arial", 12,
FontStyle.Bold)
LabelResultado.TextAlign =
ContentAlignment.MiddleCenter
Button1.Text = "Introducir valor"
Button2.Text = "Calcular serie 1+3+5..."
Button3.Text = "Calcular serie 1*3*5..."
Button4.Text = "Salir"
End Sub
Private Sub Button1_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
Button1.Click
Call EntrarDato()
End Sub
Private Sub Button2_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
Button2.Click
If Dato <> 0 Then Call CalculaSuma(Dato)
End Sub
__rendered_path__1__rendered_path__94__rendered_path__95__rendered_path__95__rendered_path__96Image_2249_0__rendered_path__244__rendered_path__245__rendered_path__245__rendered_path__246
REM Continúa...

Page 185
Ejemplos resueltos Visual Basic. If Then, Do While, Val, Loop, etc.
__rendered_path__5
Image_2271_0
Private Sub Command3_Click()
If Dato < > 0 Then Call CalculaMult(Dato)
End Sub
Private Sub Command4_Click()
Unload Form1
End
End Sub
Private Sub EntrarDato()
Dim Par As Boolean
Dato = 0
Do While Dato < = 0 Or Dato > 19 Or Par = True
Par = False
Dato = Val(InputBox("Introduzca un número
impar entre 1 y 19", "Impar"))
If Dato Mod 2 = 0 Then
Par = True
MsgBox("El número debe ser impar")
End If
Loop
LabelResultado = "Dato aceptado"
End Sub
Private Sub CalculaSuma(ByVal Número As
Integer)
Dim Impar%, Suma As Integer
Impar = -1: Suma = 0
Do
Impar = Impar + 2
Suma = Suma + Impar
Loop While Impar < Número
LabelResultado = vbCrLf & "n= " & Dato & " La
suma 1+ 3+ 5+ ...+ n vale " & Suma
End Sub
Private Sub CalculaMult(ByVal Cifra As Integer)
Dim Impar As Integer
Dim Acumulado As Single
Impar = -1: Acumulado = 1
Do
Impar = Impar + 2
Acumulado = Acumulado * Impar
Loop While Impar < Cifra
LabelResultado = vbCrLf & "n= " & Dato & " El
producto 1*3*5*...*n vale " & _ Acumulado
End Sub
© 2006-2029 aprenderaprogramar.com
Image_2248_0
Private Sub Button3_Click(ByVal sender As
Image_2270_0
System.Object, ByVal e As System.EventArgs)
Handles Button3.Click
If Dato <> 0 Then Call CalculaMult(Dato)
End Sub
Private Sub Button4_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs)
Handles Button4.Click
Me.Close()
End
End Sub
Private Sub EntrarDato()
Dim Par As Boolean
Dato = 0
Do While Dato <= 0 Or Dato > 19 Or Par = True
Par = False
Dato = Val(InputBox("Introduzca un
número impar entre 1 y 19", "Impar"))
If Dato Mod 2 = 0 Then
Par = True
MsgBox("El número debe ser impar")
End If
Loop
LabelResultado.Text = "Dato aceptado"
End Sub
Private Sub CalculaSuma(ByVal Número As Integer)
Dim Impar, Suma As Integer
Impar = -1 : Suma = 0
Do
Impar = Impar + 2
Suma = Suma + Impar
Loop While Impar < Número
LabelResultado.Text = vbCrLf & "n= " &
Dato & " La suma 1+3+5+...+n vale " & Suma
End Sub
Private Sub CalculaMult(ByVal Cifra As Integer)
Dim Impar As Integer
Dim Acumulado As Single
Impar = -1 : Acumulado = 1
Do
Impar = Impar + 2
Acumulado = Acumulado * Impar
Loop While Impar < Cifra
LabelResultado.Text = vbCrLf & "n= " & Dato &
" El producto 1*3*5*...*n vale " & Acumulado
End Sub
End Class
__rendered_path__1Image_2251_0__rendered_path__100__rendered_path__101__rendered_path__101__rendered_path__102Image_2249_0__rendered_path__317__rendered_path__318__rendered_path__318__rendered_path__319

Page 186
Image_2248_0
Ejemplos resueltos Visual Basic. If Then, Do While, Val, Loop, etc.
__rendered_path__5
Aspecto gráfico de la ejecución del programa:
Image_2280_0
Próxima entrega: CU00346A
Acceso al curso completo en aprenderaprogramar.com -- > Cursos, o en la dirección siguiente:
http://www.aprenderaprogramar.com/index.php?option=com_content&view=category&id=37&Itemid=61
__rendered_path__1__rendered_path__19
© 2006-2029 aprenderaprogramar.com

Page 187
Ejercicio resuelto con Visual
EJERCICIO RESUELTO
Generar el código en Visual Basic correspondiente al siguiente pseudocódigo, relativo a un algoritmo
para el manejo de una lista de datos sobre la que
dato, conocer el total de datos, visua
Pseudocódigo:
© 2006-2029 aprenderaprogramar.com
__rendered_path__6
Image_2291_0
Basic. Lista de datos con Redim, InputBox, Val, etc.
se desea tener opción a añadir un dato, borrar un
lizar la lista de datos o finalizar.
__rendered_path__64
PROGRAMA DATOS01 [Curso Visual Basic aprenderaprogramar.com]
__rendered_path__63__rendered_path__66
__rendered_path__22__rendered_path__65
Variables
__rendered_path__22__rendered_path__63
Enteras: E
__rendered_path__22
Reales: Dato()
__rendered_path__22
__rendered_path__22
1. Inicio
__rendered_path__22
2. Mientras E <> 5 Hacer
__rendered_path__22
2.1 Si E = 1 Entonces
__rendered_path__22
Llamar Añadir
__rendered_path__22
FinSi
__rendered_path__35
2.2 Si E = 2 Entonces
__rendered_path__22
Llamar Borrar
__rendered_path__22
FinSi
__rendered_path__22
2.3 Si E = 3 Entonces
__rendered_path__22
Mostrar “El número de datos actualmente en la lista es de”,
__rendered_path__22
Limitesuperior(Dato)
__rendered_path__22
FinSi
__rendered_path__22
2.4 Si E = 4 Entonces
__rendered_path__22
Llamar Listar
__rendered_path__22
FinSi
__rendered_path__22
2.5 Mostrar “Elija una opción. 1. Añadir dato.
__rendered_path__22
2. Borrar dato.
__rendered_path__22
3. Conocer el total de datos.
__rendered_path__22
4. Mostrar Lista.
__rendered_path__22
5. Salir.”
__rendered_path__22
2.6 Pedir E
__rendered_path__22
Repetir
__rendered_path__22
3. Fin
__rendered_path__22
__rendered_path__1__rendered_path__21__rendered_path__22__rendered_path__22__rendered_path__22__rendered_path__67Image_2293_0__rendered_path__67Image_2292_0
[Continúa…]

Page 188
Ejercicio resuelto con Visual
© 2006-2029 aprenderaprogramar.com
__rendered_path__6
Image_2291_0
Basic. Lista de datos con Redim, InputBox, Val, etc.
__rendered_path__56Image_2310_0
Módulo Añadir
__rendered_path__11__rendered_path__58Image_2309_0
1. Redimensionar Dato(Limitesuperior(Dato) + 1)
__rendered_path__11__rendered_path__56
2. Mostrar “Introduzca valor a añadir”
__rendered_path__11
3. Pedir Dato(Limitesuperior(Dato))
__rendered_path__16
FinMódulo
__rendered_path__11
__rendered_path__11
Módulo Borrar
__rendered_path__11
Variables
__rendered_path__11
Enteras: i, Numborrar
__rendered_path__16
1. Si Limitesuperior(Dato) <> 0 Entonces
__rendered_path__11
1.1 Numborrar = 0
__rendered_path__11
1.2 Mientras Numborrar < 1 ó Numborrar > Limitesuperior(Dato) Hacer
__rendered_path__11
Mostrar “Introduzca el nº de dato a borrar”
__rendered_path__11
Pedir Numborrar
__rendered_path__11
Repetir
__rendered_path__16
1.3 Si Numborrar < Limitesuperior(Dato) Entonces
__rendered_path__11
Desde i = Numborrar hasta Limitesuperior(Dato) – 1
__rendered_path__11
Dato(i) = Dato(i + 1)
__rendered_path__11
Siguiente
__rendered_path__11
FinSi
__rendered_path__11
1.4 Redimensionar Dato(Limitesuperior(Dato) – 1)
__rendered_path__16
1.5 Mostrar “Dato borrado”
__rendered_path__11
FinSi
__rendered_path__11
2. Si Limitesuperior(Dato) = 0 Entonces
__rendered_path__11
Mostrar “La lista está vacía”
__rendered_path__11
FinSi
__rendered_path__16
FinMódulo
__rendered_path__11
__rendered_path__11
Módulo Listar
__rendered_path__11
Variables
__rendered_path__11
Enteras: i
__rendered_path__11
1. Desde i = 1 hasta Limitesuperior(Dato) Hacer
__rendered_path__16
Mostrar Dato(i)
__rendered_path__11
Siguiente
__rendered_path__11
FinMódulo
__rendered_path__1__rendered_path__10__rendered_path__11__rendered_path__60__rendered_path__61__rendered_path__60__rendered_path__62

Page 189
Basic. Lista de datos con
Código versiones menos recientes VB:
Código versiones más recientes VB:
'Curso Visual Basic aprenderaprogramar.com
Command3.Caption = "Conocer total de datos"
actualmente en la lista es de " & UBound(Dato)
ReDim Preserve Dato(UBound(Dato) + 1)
Val(InputBox("Introduzca valor a añadir",
Ejercicio resuelto con Visual
__rendered_path__6
SOLUCIÓN
Image_2318_0
'[PROGRAMA DATOS01]
Option Explicit
Dim Dato() As Single
Private Sub Form_Load()
Form1.Caption = "Datos01"
LabelResultado.Alignment = 2
LabelResultado.FontBold = True
LabelLista.Alignment = 2
LabelLista.FontBold = True
ReDim Dato(0)
Command1.Caption = "Añadir dato"
Command2.Caption = "Borrar dato"
Command4.Caption = "Mostrar lista"
Command5.Caption = "Salir"
End Sub
Private Sub Command1_Click()
Call Añadir
End Sub
Private Sub Command2_Click()
Call Borrar
End Sub
Private Sub Command3_Click()
LabelResultado = "El número de datos
End Sub
Private Sub Command4_Click()
Call Listar
End Sub
Private Sub Command5_Click()
Unload Form1
End
End Sub
Private Sub Añadir()
LabelResultado = " "
LabelLista = " "
Dato(UBound(Dato)) =
"Dato"))
End Sub
'Continúa…
© 2006-2029 aprenderaprogramar.com
Image_2291_0
Redim, InputBox, Val, etc.
Image_2316_0
REM Curso Visual Basic aprenderaprogramar.com
'[PROGRAMA DATOS01]
Option Explicit On
Public Class Form1
Dim Dato() As Single
Private Sub Form1_Load(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
MyBase.Load
Me.Text = "Datos01"
LabelResultado.Font = New Font("Arial", 12,
FontStyle.Bold)
LabelResultado.TextAlign = ContentAlignment.MiddleCenter
LabelLista.Font = New Font("Arial", 12, FontStyle.Bold)
LabelLista.TextAlign = ContentAlignment.MiddleCenter
ReDim Dato(0)
Button1.Text = "Añadir dato"
Button2.Text = "Borrar dato"
Button3.Text = "Conocer total de datos"
Button4.Text = "Mostrar lista"
Button5.Text = "Salir"
End Sub
Private Sub Button1_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button1.Click
Call Añadir()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button2.Click
Call Borrar()
End Sub
Private Sub Button3_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button3.Click
LabelResultado.Text = "El número de datos
actualmente en la lista es de " & UBound(Dato)
End Sub
Private Sub Button4_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button4.Click
Call Listar()
End Sub
Private Sub Button5_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles Button5.Click
Me.Close()
End
End Sub
Private Sub Añadir()
LabelResultado.Text = " "
LabelLista.Text = " "
ReDim Preserve Dato(UBound(Dato) + 1)
Dato(UBound(Dato)) = Val(InputBox("Introduzca
valor a añadir", "Dato"))
End Sub
'Continúa…
__rendered_path__1Image_2317_0__rendered_path__110__rendered_path__111__rendered_path__112__rendered_path__113Image_2315_0__rendered_path__376__rendered_path__111__rendered_path__377__rendered_path__378

Page 190
Ejercicio resuelto con Visual
Redim, InputBox, Val, etc.
Aspecto gráfico del programa:
© 2006-2029 aprenderaprogramar.com
__rendered_path__6
Basic. Lista de datos con
Private Sub Borrar()
Image_2328_0
Dim i%, Numborrar As Integer
LabelLista = " "
If UBound(Dato) <> 0 Then
Numborrar = 0
Do While Numborrar < 1 Or Numborrar >
UBound(Dato)
Numborrar = InputBox("Introduzca el
número de dato a borrar", "Borrar")
Loop
If Numborrar < UBound(Dato) Then
For i = Numborrar To UBound(Dato) - 1
Dato(i) = Dato(i + 1)
Next i
End If
ReDim Preserve Dato(UBound(Dato) - 1)
LabelResultado = "Dato borrado"
End If
If UBound(Dato) = 0 Then
LabelResultado = "La lista está vacía"
End If
End Sub
Private Sub Listar()
Dim i As Integer
LabelLista = "Lista" & vbCrLf
For i = 1 To UBound(Dato)
LabelLista = LabelLista & vbCrLf & Dato(i)
Next i
End Sub
Image_2291_0
Private Sub Borrar()
Image_2327_0
Dim i, Numborrar As Integer
LabelLista.Text = " "
If UBound(Dato) <> 0 Then
Numborrar = 0
Do While Numborrar < 1 Or Numborrar >
UBound(Dato)
Numborrar = InputBox("Introduzca el
número de dato a borrar", "Borrar")
Loop
If Numborrar < UBound(Dato) Then
For i = Numborrar To UBound(Dato) - 1
Dato(i) = Dato(i + 1)
Next i
End If
ReDim Preserve Dato(UBound(Dato) - 1)
LabelResultado.Text = "Dato borrado"
End If
If UBound(Dato) = 0 Then
LabelResultado.Text = "La lista está
vacía"
End If
End Sub
Private Sub Listar()
Dim i As Integer
LabelLista.Text = "Lista" & vbCrLf
For i = 1 To UBound(Dato)
LabelLista.Text = LabelLista.Text &
vbCrLf & Dato(i)
Next i
End Sub
End Class
__rendered_path__1Image_2329_0Image_2317_0__rendered_path__92__rendered_path__93__rendered_path__93__rendered_path__94Image_2315_0__rendered_path__219__rendered_path__220__rendered_path__220__rendered_path__221

Page 191
Image_2291_0
Ejercicio resuelto con Visual Basic. Lista de datos con Redim, InputBox, Val, etc.
__rendered_path__6
Comentarios: Visual Basic no admite pedir el límite superior de una matriz cuyo número de dimensiones no
ha sido definido. Por ello introducimos la línea ReDim Dato(0) cuando se carga el programa. De este modo,
con el primer dato a añadir ya podemos dar la orden de que se amplíe el límite superior del vector Dato en
una unidad, asignándose el primer valor introducido a Dato(1). ¿Qué ocurre con Dato(0)? Simplemente se
trata de un elemento auxiliar de un array que facilita la programación, sin otra funcionalidad. Se trata de una
decisión que adoptamos como programadores, aunque podríamos haber usado el elemento de índice cero
si hubiéramos querido.
Próxima entrega: CU00347A
Acceso al curso completo en aprenderaprogramar.com -- > Cursos, o en la dirección siguiente:
http://www.aprenderaprogramar.com/index.php?option=com_content&view=category&id=37&Itemid=61
__rendered_path__1__rendered_path__34
© 2006-2029 aprenderaprogramar.com