Practico 0. Ejercicio 6. Ordenar arreglo

Practico 0. Ejercicio 6. Ordenar arreglo

de Alan Leonel Placeres Ruiz Diaz -
Número de respuestas: 1

Buenas e implementado la siguiente linea de código en el problema

#include <stdio.h>

#include <cmath>


#define LARGOLISTA 5


void intercambio(int & A, int & B) {

    int aux;

    aux = A;

    A = B;

    B = aux;

}


void OrdenarArreglo(int *ListaEnteros) {

    int i,j;

    for (i=2; (i<=LARGOLISTA); i++) {

        j=i;

        while (j>=2 && (ListaEnteros[j]<ListaEnteros[i])) {

            intercambio(ListaEnteros[j],ListaEnteros[j-1]);

        }

        j--;

    }

}


main () {

    int arr[LARGOLISTA];

    int valores;

    printf("Ingrese %d enteros positivos: ",LARGOLISTA+1);

    //scanf("%d",&valores);

    for (int m=0; m<=LARGOLISTA; m++) {

        scanf("%d",&valores);

        arr[m]=valores;

    }

    OrdenarArreglo(&arr[LARGOLISTA]);

    printf("El arreglo de enteros ordenados es el siguiente:\n");

        for (int m=0; m<=LARGOLISTA; m++) {

        printf("%d ",arr[m]);

    }

    return 0;

}


Cuando quiero imprimir el arreglo ordenado en el programa principal no lo modifica, por lo que me pregunto si los pasajes son correctos, mi idea es que en ambos void, ambos estén pasados por referencia así se modifica el arreglo, si se encuentra un error les agradecería mucho hacérmelo saber.


Saludos!

En respuesta a Alan Leonel Placeres Ruiz Diaz

Re: Practico 0. Ejercicio 6. Ordenar arreglo

de Fernando Fernandez -
Hola Alan.
Hay varios problemas.
  • Los índices de los arreglos en C empiezan en 0, por lo que deberías trabajar con índices entre 0 y  LARGOLISTA -1. El índice LARGOLISTA está fuera del rango.
  • El parámetro que estás pasando, &arr[LARGOLISTA], es la dirección de memoria de la casilla de índice LARGOLISTA] de arr. O sea que estarías ordenando algo que está después del arreglo. Lo que tendrías que pasar es arr.
  • Usás una diferencia de 1 entre el tamaño del arreglo y la cantidad de elementos. Tal vez hayas visto algo así, pero relaconado con strings, y es al revés, el tamaño del arreglo debe ser mayor que el largo del string. Esto es porque las bibliotecas estándar de C usan un caracter centinela, el '\0', como indicador del fin del string. Pero de todas formas esto no se aplica a los arreglos de enteros, porque en general no podemos asumir que hay un valor imposible.
  • En cuanto al algoritmo OrdenarArreglo tenés que volver a revisar los valores de inicio y de control que les das a i y j teniendo en cuenta el tema mencionado más arriba del rango de los índices en C.
  • Nunca se ejecuta el cuerpo del while porque como antes de empezarlo i y j son iguales, el segundo operando del and no se cumple.  No es ListaEnteros[i] lo que debe ir ahí.
  • Aún si se entrara al cuerpo del while, como el j-- está fuera de ese cuerpo, es posible que se cuelgue haciendo intercambios entre ListaEnteros[j] y ListaEnteros[j-1] .
Fijate si teniendo en cuenta algo de esto la ejecución del programa emipieza a tener efectos.