Muy buenas a ver si alguien me puede hechar una mano porque no entiendo varias cosas sobre un codigo que me han puesto.
Esto simplemente lo que hace es ordenar unos nº que introducire por pantalla, esta por ejemplo ordena de forma ascendente y aqui es donde empiezo a perderme, en la funcion ordenar en el for se le dice el tamaño del array -2, esto correjidme pero con-1 funcionaria de empezar el array en 1 pero al empezar en 0 se le quita 2 espacios dejando subindice 0,1,2,3 por ejemplo de 4 nº...? esque no lo entiendo, no se que hace.
Otra cosa es que si le doy los valores 6,8,5y3 lo que se esta haciendo no se si es recorrer el array parreglo con los valores 6,8,5,3 unas 2 veces una con j y otra con i con diferentes subindices ?, por lo que los 2 arrays tienen el mismo contenido? ¿en el primer bucle se recorre desde el subindice 0 hasta el 3 y en el 2º del subindice 1 hasta el 4? y se pregunta si el subindice 0 de parreglo(i) es > que el j con subindice 1?, osea si 6 > 6?, despues si es asi igualo los 2 arrays a 6?. A ver si alguien me puede hechar una mano con esto que no lo veo nada claro, y lo mejor de todo es que funciona correctamente pero sigo sin verlo, yo por ejemplo habria dado a comparar
Código VBnet:
Ver originalModule Module1
Sub Main()
Dim sdatoconsola As String
Dim N As Integer
Dim arrDatosConsola() As String
Dim arrOrdenado() As String
Dim sTipoOrdenamiento As String
Dim iCursorLeft, iCursorTop As Integer
While True
Console.Clear()
Console.Write("Escriba la cantidad de numeros entre 1 y 9: ")
sdatoconsola = Console.ReadLine
If sdatoconsola.Length = 0 Then 'salida al pulsar intro o no introducir nada
Exit Sub
End If
' Validamos si es numerico
If sdatoconsola < "1" Or sdatoconsola > "9" Then
Console.WriteLine("Error: valor numerico fuera de rango")
Console.ReadLine()
Continue While
End If
N = CInt(sdatoconsola) 'CInt convierte a entero
'desde el nº escrito de la cantidad hasta la cantidad puesta
Console.Write("Ordenamiento: A(Ascendente), D (Descendente)")
iCursorLeft = Console.CursorLeft
iCursorTop = Console.CursorTop
While True
'desplazamientos de cursor al escribir
sTipoOrdenamiento = Console.ReadLine()
If sTipoOrdenamiento.Length = 0 Then Exit While
If sTipoOrdenamiento.ToUpper = "A" Or sTipoOrdenamiento.ToUpper = "D" Then Exit While
Console.Beep()
Console.CursorTop = iCursorTop
Console.CursorLeft = iCursorLeft
Console.CursorLeft = iCursorLeft
End While
If sTipoOrdenamiento.Length = 0 Then Continue While
For i = 1 To N
Console.Write("Valores a ordenar: ")
sdatoconsola = Console.ReadLine
' Validamos si los nºs introducidos son correctos
ReDim Preserve arrDatosConsola(i - 1) 'Redim da dimension al array y declara subindice 0 empieza el bucle el array seria el arrDatosConsola(0),2º arrDatosConsola(1)...
'sin preserve se redimensionaria continuamente el ultimo pero al redimensionar te borra los anteriores y solo te queda el ultimo que te hizo
'con preserve preserva los anteriores.
arrDatosConsola(i - 1) = sdatoconsola 'se almacena en indice 0 aunque empecemos en i=1
Next
ReDim arrOrdenado(N)
arrOrdenado = arrDatosConsola
arrOrdenado = Ordenar(arrDatosConsola.Clone, sTipoOrdenamiento) 'copia que no cambia el original sino la copia
'con "A" Ascendente y "D" Descendente
Console.WriteLine()
Console.WriteLine("Original Ordenado")
For i = 0 To arrOrdenado.Length - 1
Console.WriteLine(arrDatosConsola(i) & " " & _
arrOrdenado(i))
Next
Console.ReadLine()
End While
End Sub
Function Ordenar(ByVal pArreglo As String(), ByVal pTipoOrden As String) As String()
'la funcion devuelve un array de contenidos string
Dim sauxiliar As String
If ValidarArrayNumerico(pArreglo) Then 'si validararraynumerico devuelve true... es numerico
For i As Integer = 0 To pArreglo.Length - 2
For j As Integer = i + 1 To pArreglo.Length - 1
If pTipoOrden.ToUpper = "A" Then
'transforma en mayuscula upper para evitar mayusculas y minusculas
If pArreglo(i) > pArreglo(j) Then
sauxiliar = pArreglo(i)
pArreglo(i) = pArreglo(j)
pArreglo(j) = sauxiliar
End If
Else 'si son cadenas
If pArreglo(i) < pArreglo(j) Then
sauxiliar = pArreglo(i)
pArreglo(i) = pArreglo(j)
pArreglo(j) = sauxiliar
End If
End If
Next
Next
Else
For i As Integer = 0 To pArreglo.Length - 2
For j As Integer = i + 1 To pArreglo.Length - 1
If CInt(pArreglo(i)) > CInt(pArreglo(j)) Then
If pArreglo(i) > pArreglo(j) Then
sauxiliar = pArreglo(i)
pArreglo(i) = pArreglo(j)
pArreglo(j) = sauxiliar
End If
Else
If pArreglo(i) > pArreglo(j) Then
sauxiliar = pArreglo(i)
pArreglo(i) = pArreglo(j)
pArreglo(j) = sauxiliar
End If
End If
Next
Next
End If
' -2 porque si hay 4 numeros hace falta recorrerlos, length da 4 elementos
' el for estando paradao en i recorre el resto.
Ordenar = pArreglo
End Function
Function ValidarArrayNumerico(ByVal pArreglo() As String) As Boolean
Dim sElementoArreglo As String
For i As Integer = 0 To pArreglo.Length - 1
sElementoArreglo = pArreglo(i)
For j As Integer = 0 To sElementoArreglo.Length - 1 'recorre las cadenas del array
'parar el bucle en cada caracter de la string y preguntar si es numerico con substring
If sElementoArreglo.Substring(j, 1) < "0" _
Or sElementoArreglo.Substring(j, 1) > "9" Then
ValidarArrayNumerico = False
' o tambien return fase
'si el elemento arreglo pilla la cadena que recorre j de un caracter
' y lo compara con <0 o > 9 entonces son caracteres
End If
Next
Next
ValidarArrayNumerico = True
'return true
End Function
End Module