Para la solución de los ejercicios se ha creado una clase en la que se admite que se pueda crear el vector fuera de la clase y la reciba como argumento o en caso contrario se crea un vector por defecto de veinte elementos.
Public Class Vectores
Dim V() As Long
Dim Cuantos As Integer = 20
Private Sub New() ' se genera un vector por defecto
ReDim V(Cuantos)
End Sub
' Sobrecarga para un número determinado de elementos
Public Sub New(ByVal Elementos As Integer)
Select Case Elementos <> 0
Case True
ReDim V(Elementos)
Case Else
MsgBox("El número de elementos no es correcto", MsgBoxStyle.Critical)
End Select
Cuantos = Elementos
End Sub
End Class
Para facilitar la prueba de los ejercicios se ha creado un método que genera valores aleatorios de forma automática.
Public Sub Genera()
Dim X As Integer
' Inicializa el generador de números aleatorios
Randomize()
While X <> V.Length
' Genera un valor aleatorio entre 1 0 50
V(X) = CInt(Int((50 * Rnd()) + 1))
X = X + 1
End While
El control de los bucles se podría haber realizado con
While X <> V.Length
O bien con
While X <= Ubound(V)
El método Length devuelve un cual es el número de elementos del vector.
La función Ubound devuelve cual es el valor del índice del último elemento del vector.
Para un DIM V(10)
Length devuelve once.
Ubound(V) devuelve diez.
1. Crear un vector de 10 elementos numéricos enteros, cargarlo con datos y visualizar su contenido.
Public Class Vectores
Dim V() As Long
Dim Cuantos As Integer = 20
Private Sub New() ' se genera un vector por defecto
ReDim V(Cuantos)
End Sub
' Sobrecarga para un número determinado de elementos
Public Sub New(ByVal Elementos As Integer)
Select Case Elementos <> 0
Case True
ReDim V(Elementos)
Case Else
MsgBox("El número de elementos no es correcto", MsgBoxStyle.Critical)
End Select
Cuantos = Elementos
End Sub
Public Sub Genera()
Dim X As Integer
' Inicializa el generador de números aleatorios
Randomize()
While X <> V.Length
' Genera un valor aleatorio entre 1 0 50
V(X) = CInt(Int((50 * Rnd()) + 1))
X = X + 1
End While
End Sub
Public Sub Visualiza()
Dim X As Integer
While X <> V.Length
Console.WriteLine("Posición {0} Contenido {1}", X, V(X))
X = X + 1
End While
End Sub
End class
El programa principal.
Module Tema_34
Sub Main()
Dim Objeto As Vectores = New Vectores(10)
Objeto.Genera()
Objeto.Visualiza()
Console.Read()
End Sub
End Module
2. Crear un vector de 10 elementos alfanuméricos, cargarlo con datos y visualizar el contenido de los que están ocupando la posición par.
A la clase anterior añadimos el método que se puede ver en la solución.
Public Sub VisualizaPosicion(ByVal PosicionMultiplo As Integer)
Dim X As Integer
While X <> V.Length
Select Case X Mod PosicionMultiplo = 0
Case True
Console.WriteLine("Posición {0} Contenido {1}", X, V(X))
End Select
X = X + 1
End While
End Sub
Al hacer está pregunta, podemos visualizar cualquier posición múltiplo de un valor x, y si su valor es uno, visualiza todos los elementos del array.
El programa principal
Module Tema_34
Sub Main()
Dim Objeto As Vectores = New Vectores(10)
Objeto.Genera()
Objeto.VisualizaPosicion(2)
Console.Read()
End Sub
End Module
3. Crear una matriz de 3 x 3 numérica, cargar los datos y visualizarla dando la visión de matriz.
Private Sub GeneraMatriz(ByVal M(,) As Integer)
Dim X As Integer
Dim Y As Integer
Dim Filas As Integer = UBound(M, 1) ' M.GetLength(0) ' M.GetUpperBound(0)
Dim Columnas As Integer = UBound(M, 2) ' M.GetLength(1) ' M.GetUpperBound(1)
Randomize() ' inicializar el generador de números aleatorios
' generar la matriz
X = 0
Do
Y = 0
Do
M(X, Y) = CInt(Int((6 * Rnd()) + 1))
Y = Y + 1
Loop Until Y > Columnas ' M.GetUpperBound(1) ' UBound(M, 2)
X = X + 1
Loop Until X > Filas ' M.GetUpperBound(0) ' Ubound(M, 1)
End Sub
Private Sub VisualizaMatrizDetalle(ByVal M(,) As Integer)
Dim X As Integer
Dim Y As Integer
Dim Filas As Integer = UBound(M, 1)
Dim Columnas As Integer = UBound(M, 2)
Console.WriteLine("Visualizamos el contenido")
' Mostramos lo valores en detalle
X = 0
Do
Y = 0
Do
Console.WriteLine("Fila {0} Columna {1} Valor {2} ", X, Y, M(X, Y))
Y = Y + 1
Loop Until Y > Columnas
X = X + 1
Console.WriteLine()
Loop Until X > Filas
End Sub
Private Sub VisualizaMatriz(ByVal M(,) As Integer)
Dim X As Integer
Dim Y As Integer
Dim Filas As Integer = UBound(M, 1)
Dim Columnas As Integer = UBound(M, 2)
' Mostramos lo valores
X = 0
Do
Y = 0
Do
Console.Write(" " & M(X, Y))
Y = Y + 1
Loop Until Y > Columnas
X = X + 1
Console.WriteLine()
Loop Until X > Filas
End Sub
El programa principal sería
Module Tema_34
Private Sub Main()
' Declaración e inicialización
Dim M(2, 2) As Integer
GeneraMatriz(M)
VisualizaMatrizDetalle(M)
VisualizaMatriz(M)
Console.ReadLine()
End Sub
End Module
4. Crear una matriz de 3 x 3 numérica, cargar los datos, intercambiar los datos de la 1 fila con la tercera fila, y visualizarla dando la visión de matriz.
Private Sub Intercambio(ByVal M(,) As Integer, _
ByVal F1 As Integer, _
ByVal F2 As Integer)
Dim Y As Integer
Dim Columnas As Integer = UBound(M, 2)
Dim Aux As Integer
' Intercambio
Y = 0
Do
Aux = M(F2, Y)
M(F2, Y) = M(F1, Y)
M(F1, Y) = Aux
Y = Y + 1
Loop Until Y > Columnas
Console.WriteLine()
End Sub
El programa principal sería
Module Tema_34
Private Sub Main()
' Declaración e inicialización
Dim M(2, 2) As Integer
GeneraMatriz(M)
VisualizaMatriz(M)
Intercambio (M,0,2)
VisualizaMatriz(M)
Console.ReadLine()
End Sub
End Module
5. Tenemos un Vector V de cincuenta elementos, generar un vector P de cincuenta elementos de forma que:
P(1) = V(1)
P(2) = V(1)+V(2)
P(3) = V(1)+V(2)+V(3) .. / ..
P(50) = V(1) ...V(50)
A la clase anterior le podemos añadir este método
Public Sub Quinto(ByVal P() As Integer)
ReDim P(V.Length - 1)
Dim X As Integer
X = 1
P(0) = V(0)
While X < V.Length
P(X) = P(X - 1) + V(X)
X = X + 1
End While
V = P
End Sub
Como cada elemento es la suma del anterior más el nuevo, empezamos en la posición uno, pero hay que :
P(0) = V(0)
Para disponer de anterior.
P(X) = P(X - 1) + V(X)
Al final de la ejecución asignamos el nuevo vector al de la clase, así podemos utilizar los métodos ya escritos.
V = P
El programa principal sería:
Sub Main()
Dim Objeto As New Vectores(10)
Dim P(10) As Integer
Objeto.GeneraVector()
Objeto.VerVector()
Objeto.Quinto(P)
Objeto.VerVector()
Console.ReadKey()
End Sub
6. Introducir diez números y luego visualizarlos en orden inverso, al de entrada.
A la clase anterior podemos añadir el siguiente método.
Public Sub VisualizaInverso()
Dim X As Integer = V.Length
While X > 0
X = X - 1
Console.WriteLine(V(X))
End While
End Sub
Y el Main quedaría
Sub Main()
Dim Objeto As New Vectores(10)
Dim P(10) As Integer
Objeto.GeneraVector()
Objeto.VerVector()
Objeto.VisualizaInverso()
Objeto.VerVector()
Console.ReadKey()
End Sub
7. Introducir veinte números entre uno y cincuenta, y luego indicar cuales de esos cincuenta son los que se han utilizado.
Podemos resolver el ejercicio con este procedimiento.
El vector a utilizar es del tipo bolean, solo nos piden cuales han sido usados.
Sub Main()
Dim V(51) As Boolean
Dim X As Integer
Dim Numero As Integer
' Carga de números
While X < 20
Numero = CInt(Console.ReadLine)
Select Case Numero
Case 1 To 50
V(Numero) = True
End Select
X = X + 1
End While
' Visualizar números
X = 0
While X < 51
Select Case V(X)
Case True
Console.WriteLine("El número {0} ha sido utilizado ", X)
End Select
X = X + 1
End While
End Sub
8. Introducir veinte números entre uno y diez e indicar luego cuales han sido usados y el numero de veces que se ha usado cada numero.
Este ejercicio es igual que el anterior, pero en lugar de visualizar cuales además pide cuantas veces, pero el cambio es mínimo, en lugar de marcar número usado, contamos las veces que cada número ha sido usado.
Por lo tanto el vector no podrá ser de tipo booleano, si no que tendrá que ser entero, al menos.
V(Numero) = V(Numero) + 1
Y después el que sea mayor que cero, es el que ha sido usado.
Select Case V(X) > 0
Veamos el ejercicio.
Sub Main()
Dim V(11) As Integer
Dim X As Integer
Dim Numero As Integer
' Carga de números
While X < 10
Numero = CInt(Console.ReadLine)
Select Case Numero
Case 1 To 10
V(Numero) = V(Numero) + 1
End Select
X = X + 1
End While
' Visualizar números
X = 0
While X < 11
Select Case V(X) > 0
Case True
Console.WriteLine("El número {0} ha sido utilizado {1} veces ", X, V(X))
End Select
X = X + 1
End While
'
End Sub
9. Introducir veinte números entre uno y diez e indicar luego cuales han sido usados, el numero de veces que se ha usado cada numero, y el que más y el que menos se ha utilizado.
Private Sub Noveno()
Dim V(11) As Integer
Dim X As Integer
Dim Numero As Integer
Dim Mas As Integer
Dim Menos As Integer
' Carga de números
While X < 10
Numero = CInt(Console.ReadLine)
Select Case Numero
Case 1 To 10
V(Numero) = V(Numero) + 1
End Select
X = X + 1
End While
' Visualizar números
X = 0
Mas = 0
Menos = 1
While X < 11
Select Case V(X) > 0
Case True
If V(Mas) < V(X) Then Mas = X
If V(Menos) > V(X) Then Menos = X
Console.WriteLine("El número {0} ha sido utilizado {1} veces ", X, V(X))
End Select
X = X + 1
End While
Console.WriteLine()
Console.WriteLine("El número {0} es el más usado {1} veces ", Mas, V(Mas))
Console.WriteLine("El número {0} es el menos usado {1} veces",Menos, V(Menos))
End Sub
10. Introducir una fecha en tres variables, numéricas, día, mes y año. A esa fecha hay que sumarle 90 días reales, y visualizar la fecha resultante en el formato dia_en_letra de mes_en_letra de 20XX.
Sub Main()
Dim Dia As Integer
Dim Mes As Integer
Dim Year As Integer
Dim NvoDia As Integer
Dim Dias As Integer
Dim Y As Integer
' Creación y carga de vectores
Dim M() As Integer = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
Dim DiaLet() As String = {"", "UNO", "DOS", "TRES", "CUATRO", "CINCO", _
"SEIS", "SIETE", "OCHO", "NUEVE", "DIEZ", _
"ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIECISEIS", "DIECISIETE", _
"DIECIOCHO","DIECINUEVE","VEINTE","VEINTIUNO", "VEINTIDOS", "VEINTITRES", _
"VEINTICUATRO", "VEINTICINCO", "VEINTISEIS", "VEINTISIETE", "VEINTIOCHO", _
"VEINTINUEVE", "TREINTA", "TREINTA Y UNO"}
Dim MesLet() As String = {"", "ENERO", "FEBRERO", "MARZO", "ABRIL", "MAYO", _
"JUNIO", "JULIO", "AGOSTO", "SEPTIEMBRE", "OCTUBRE", _
"NOVIEMBRE", "DICIEMBRE"}
Console.WriteLine("Sumarle 90 días reales, y visualizar la fecha " & _
"en el formato dia_en_letra de mes_en_letra de XXXX")
' INTRODUCCION DE FECHA
Dia = CInt(Console.ReadLine())
Mes = CInt(Console.ReadLine())
Year = CInt(Console.ReadLine())
' Fecha a dias
Y = 0
Dias = 0
If Year Mod 4 = 0 Then M(2) = 29 Else M(2) = 28
While Y <> Mes - 1 ' Los dias del mes actual se suman al final
Y = Y + 1
Dias = Dias + M(Y)
End While
Dias = Dias + Dia + 90 ' Dias + 90 + Dias del mes actual.
' Dias a fecha
Y = 0
NvoDia = 0
While NvoDia + M(Y + 1) < Dias
Y = Y + 1 ' Contar los meses desde el principio
NvoDia = NvoDia + M(Y)
If Y = 12 Then ' Por el posible cambio de año
Y = 0
Year = Year + 1
If Year Mod 4 = 0 Then M(2) = 29 Else M(2) = 28
End If
End While
' Fecha final
Dia = Dias - NvoDia
Mes = Y + 1
Console.WriteLine("Nueva fecha {0} de {1} de {2} ", DiaLet(Dia), MesLet(Mes), Year)
End Sub
Los array se han definido con una posición en vacío al principio para forzar a que “Uno” esté en la posición uno, etc..
Dim DiaLet() As String = {"", "UNO",
De esa forma la posición cero queda salvada.
La validación de año bisiesto es circunstancial, es más compleja que dividir por cuatro.
La estructura del ejercicio es poco adecuada, como mínimo debería haberse utilizado una función para la conversión de las fechas en días.
Conviene probar al menos en un par de ejercicios estas opciones, para captar sus diferencias.
UBound(V) V.GetLength(0) V.GetUpperBound(0)
Síguenos en: Facebook Sobre aulaClic Política de Cookies