Error Ejercicio de Arreglo Dinamico

Iniciado por palacio29, 21 Octubre 2016, 20:09 PM

0 Miembros y 1 Visitante están viendo este tema.

palacio29

Hola

Tengo el siguiente ejercicio:

Desarrollar una funcion ordenarArr que reciba como parámetro un arreglo dinámico del tipo t_persona.
La función deberá ordenar el arreglo por número de categoría en forma descendente. El números de categoría
se encuentra dentro del unsigned char cat en los cuatro bit mas significativos (los de la izquierda).
El prototipo de la función que deberá utilizar es:

void ordenarArr(t_persona* arr);


Lo que hice fue lo siguiente

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

///Estructura

struct s_persona
{
    long int dni;
    unsigned char cat;
    char *nombre;
};
typedef struct s_persona t_persona;

void ordenarArr(t_persona* arr);
int categoria(unsigned char);
void imprimirArr(t_persona*);

int main()
{
    t_persona *arreglo=NULL;

    arreglo=malloc(4*sizeof(t_persona));

    (arreglo)->dni=746;
    (arreglo)->cat='j';
    (arreglo)->nombre="Marisol";

    (arreglo+1)->dni=159;
    (arreglo+1)->cat='f';
    (arreglo+1)->nombre="Juan Martin";

    (arreglo+2)->dni=691;
    (arreglo+2)->cat='z';
    (arreglo+2)->nombre="Griselda";

    (arreglo+3)->dni=489;
    (arreglo+3)->cat='e';
    (arreglo+3)->nombre="Romeo";

    imprimirArr(arreglo);

    ordenarArr(arreglo);

    imprimirArr(arreglo);

    return 0;
}

void imprimirArr(t_persona* arreglo)
{
    int i;
    printf("\nImpresion:\n");
    for(i=0;i<4;i++)
    {
        printf("\nDNI = %li",(arreglo+i)->dni);
        printf("\nCat = %c - %d",(arreglo+i)->cat,(arreglo+i)->cat);
        printf("\nNombre = %s",(arreglo+i)->nombre);
        printf("\n\n");
    }
}

///FUNCION QUE ME PIDEN


void ordenarArr(t_persona* arr)
{
    int i,j;
    t_persona aux;
    for(i=0;(arr+i)->dni!=0;i++)
    {
        for(j=i+1;(arr+j)->dni!=0;j++)
        {
            if(((((arr+i)->cat)>>4)&15)<((((arr+j)->cat)>>4)&15))
            {
                aux=*(arr+i);
                *(arr+i)=*(arr+j);
                *(arr+j)=aux;
            }
        }
    }
}



El problema es que hace cualquier cosa menos ordenar y tira error de ejecucion. Nose que hacer.

MAFUS

Te falla porqué no puedes hacer (arr+i)->dni!=0 y (arr+j)->dni!=0para controlar el bucle de ordenarArr, básicamente porqué lo has llenado de datos y ninguno de ellos es la condición de parada. Deberías usar la misma condición de parada que las otras funciones: contar mientras que i y j sean menores a 4.

Te faltó, en tu línea tu printf de la línea 57, desplazar 4 bits a la derecha para ver el código usado para ordenar, por eso no ves los datos ordenados:
printf("\nCat = %c - %d",(arreglo+i)->cat,(arreglo+i)->cat>>4);