Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: palacio29 en 21 Octubre 2016, 20:09 pm



Título: Error Ejercicio de Arreglo Dinamico
Publicado por: palacio29 en 21 Octubre 2016, 20:09 pm
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

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4.  
  5. ///Estructura
  6.  
  7. struct s_persona
  8. {
  9.    long int dni;
  10.    unsigned char cat;
  11.    char *nombre;
  12. };
  13. typedef struct s_persona t_persona;
  14.  
  15. void ordenarArr(t_persona* arr);
  16. int categoria(unsigned char);
  17. void imprimirArr(t_persona*);
  18.  
  19. int main()
  20. {
  21.    t_persona *arreglo=NULL;
  22.  
  23.    arreglo=malloc(4*sizeof(t_persona));
  24.  
  25.    (arreglo)->dni=746;
  26.    (arreglo)->cat='j';
  27.    (arreglo)->nombre="Marisol";
  28.  
  29.    (arreglo+1)->dni=159;
  30.    (arreglo+1)->cat='f';
  31.    (arreglo+1)->nombre="Juan Martin";
  32.  
  33.    (arreglo+2)->dni=691;
  34.    (arreglo+2)->cat='z';
  35.    (arreglo+2)->nombre="Griselda";
  36.  
  37.    (arreglo+3)->dni=489;
  38.    (arreglo+3)->cat='e';
  39.    (arreglo+3)->nombre="Romeo";
  40.  
  41.    imprimirArr(arreglo);
  42.  
  43.    ordenarArr(arreglo);
  44.  
  45.    imprimirArr(arreglo);
  46.  
  47.    return 0;
  48. }
  49.  
  50. void imprimirArr(t_persona* arreglo)
  51. {
  52.    int i;
  53.    printf("\nImpresion:\n");
  54.    for(i=0;i<4;i++)
  55.    {
  56.        printf("\nDNI = %li",(arreglo+i)->dni);
  57.        printf("\nCat = %c - %d",(arreglo+i)->cat,(arreglo+i)->cat);
  58.        printf("\nNombre = %s",(arreglo+i)->nombre);
  59.        printf("\n\n");
  60.    }
  61. }
  62.  
  63. ///FUNCION QUE ME PIDEN
  64.  
  65.  
  66. void ordenarArr(t_persona* arr)
  67. {
  68.    int i,j;
  69.    t_persona aux;
  70.    for(i=0;(arr+i)->dni!=0;i++)
  71.    {
  72.        for(j=i+1;(arr+j)->dni!=0;j++)
  73.        {
  74.            if(((((arr+i)->cat)>>4)&15)<((((arr+j)->cat)>>4)&15))
  75.            {
  76.                aux=*(arr+i);
  77.                *(arr+i)=*(arr+j);
  78.                *(arr+j)=aux;
  79.            }
  80.        }
  81.    }
  82. }


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


Título: Re: Error Ejercicio de Arreglo Dinamico
Publicado por: MAFUS en 21 Octubre 2016, 20:49 pm
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:
Código
  1. printf("\nCat = %c - %d",(arreglo+i)->cat,(arreglo+i)->cat>>4);