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 original
Module 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