Programa de ordenamiento de múltiple propósito que utiliza apuntadores a funciones

#include <stdio.h>
#define TAMANIO 10
 
/* prototipos */
void burbuja( int trabajo[], const int tamanio, 
             int (*compara)( int a, int b ) );
int ascendente( int a, int b );
int descendente( int a, int b );
 
int main()
{
   int orden;   /* 1 para el orden ascendente o 2 para el orden descendente */
   int contador; /* contador */
 
   /* inicializa el arreglo a */
   int a[ TAMANIO ] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 };
 
   printf( "Introduzca 1 para ordenar en forma ascendente,n" 
           "Introduzca 2 para ordenar en forma descendente: " );
   scanf( "%d",  &orden );
 
   printf( "nElementos de datos en el orden originaln" );
 
   /* muestra el arreglo original */
   for ( contador = 0; contador < TAMANIO; contador++ ) {
      printf( "%5d", a[ contador ] );
   } /* fin de for */
 
   /* clasifica el arreglo en orden ascendente; pasa la función ascendente como un
     argumento para especificar el orden ascendente */
   if ( orden == 1 ) {
      burbuja( a, TAMANIO, ascendente );
      printf( "nElementos de datos en orden ascendenten" );
   } /* fin de if */ 
   else { /* pasa la función descendente */
      burbuja( a, TAMANIO, descendente );
      printf( "nElementos de datos en orden descendenten" );
   } /* fin de else */
 
   /* muestra el arreglo ordenado */
   for ( contador = 0; contador < TAMANIO; contador++ ) {
      printf( "%5d", a[ contador ] );   
   } /* fin de for */
 
   printf( "n" );
 
   return 0; /* indica terminación exitosa */
 
} /* fin de main */
 
/* ordenamiento burbuja de múltiple propósito; el parámetro compara es un apuntador a
   la función de comparación que determina el tipo de ordenamiento */
void burbuja( int trabajo[], const int tamanio, int (*compara)( int a, int b ) )
{
   int pasada;  /* contador de pasadas */
   int cuenta;  /* contador de comparaciones */
 
   void intercambia( int *ptrElemento1, int *ptrElemento2 ); /* prototipo */
 
   /* ciclo para controlar las pasadas */
   for ( pasada = 1; pasada < tamanio; pasada++ ) {
 
      /* ciclo para controlar el número de comparaciones por pasada */
      for ( cuenta = 0; cuenta < tamanio - 1; cuenta++ ) {
 
         /* si los elementos adyacentes no se encuentran en orden, los intercambia */
         if ( (*compara)( trabajo[ cuenta ], trabajo[ cuenta + 1 ] ) ) {
            intercambia( &trabajo[ cuenta ], &trabajo[ cuenta + 1 ] );
         } /* fin de if */
 
      } /* fin de for */
 
   } /* fin de for */
 
} /* fin de la función burbuja */
 
/* intercambia los valores en las ubicaciones en memoria a los cuales apunta ptrElemento1 y 
   ptrElemento2 */
void intercambia( int *ptrElemento1, int *ptrElemento2 )
{
   int almacena; /* variable de almacenamiento temporal */
 
   almacena = *ptrElemento1;
   *ptrElemento1 = *ptrElemento2;
   *ptrElemento2 = almacena;
} /* fin de la función intercambia */
 
/* determina si los elementos están en desorden para el
    ordenamiento ascendente */
int ascendente( int a, int b )
{
   return b < a;   /* intercambia si b es menor que a */
 
} /* fin de la función ascendente */
 
/* determina si los elementos están en desorden para el
    ordenamiento descendente */
int descendente( int a, int b )
{
   return b > a;   /* intercambia si b es mayor que a */
 
} /* fin de la función descendente */
 

¿Has encontrado algún error? ¿Tienes la solución? Dejame tu correción ;-)

Antes de comentar: Gran parte de los ejercicios propuestos no tienen librerías debido a que Wordpress las eliminó al verlas como etiquetas HTML. Si sabes/tienes/conoces las librerías que hacen falta, déjalo en los comentarios. Y lo mas importante: Todos los ejemplos fueron realizados por personas con únicamente conocimiento básico del lenguaje, no de programación.

Otro punto importante: Si vas a sugerir un segmento de código en algún lenguaje debes hacerlo así:

  • Si es lenguaje C [c]Código en C[/c]
  • Si es lenguaje Pascal [pascal]Aquí dentro el código de Pascal[/pascal].

De esta manera el código coloreas el código.

Otro punto importante para muchos que sienten que se les ignora: Todos los comentarios los reviso y en su debido momento los apruebo, pero ojo con el con lo siguiente:

Me reservo el derecho de alterar, publicar o no los comentarios as´ como cambiar mis condiciones en el momento que así lo requiera.

¿estas de acuerdo? entonces adelante que ya te he quitado bastante tiempo leyendo esta basura de advertencias :)