#include <condefs.h> #pragma hdrstop //--------------------------------------------------------------------------#pragma argsused #include <stdio.h> #include <stdlib.h> #include <math.h> /* PROCEDIMIENTO DE LIBRERIA qsort Este procedimiento está declarado en el archivo de cabecera stdlib.h que realiza el método de ordenamiento quicksort para vectores con cualquier tipo de datos y criterio de ordenamiento. Esto se implementa mediante el movimiento e intercambio de n bloques de memoria de b bytes de tamaño. El criterio que se va a utilizar para el ordenamiento se lo pasará como parámetro mediante un puntero a una función. La sintaxis del procedimiento de librería es el siguiente: void qsort(void *base, size_t nelem, size_t width,int (_USERENTRY *fcmp) (const void *, const void *)); PARÁMETROS base = Dirección de memoria del término cero del vector. nelem = Cantidad de elementos que tiene el vector. width = Cantidad de bytes que tiene cada elemento del vector. fcmp = Dirección de memoria (puntero) a una función creada por el usuario que devuelve un valor de tipo int y que posee dos argumentos de tipo const void *. El valor de retorno será: Si el criterio de comparación del parámetro de la izquierda es mayor que el del parámetro de la derecha el retorno será > 0 Si el criterio de comparación del parámetro de la izquierda es menor que el del parámetro de la derecha el retorno será > 0 Si los criterios de comparación son iguales el valor de retorno debe ser 0. En el ejemplo de abajo haremos un programa que primero va a ordenar un vector de estructuras punto en el sentido creciente de las x, y luego ordenará al mismo vector en el sentido sentido creciente de las distancias al origen de cada punto aplicando el procedimiento de librería qsort. */ struct punto {//declaración de la estructura double x,y; }; double dist( punto p ) { //función auxiliar que calcula la distancia de un punto al origen return sqrt( pow(p.x, 2) + pow(p.y,2) ); } void mostrar( punto * p, int l, int r ) { //función para mostrar una parte del vector a l=inicio, r=final int i; for( i = l; i <= r; i++ ) {//muestra la coordenada, la absisa y la distancia al origen de cada //uno de los elementos del rango del vector printf("p[%d] x = %lf y = %lf d = %lf \n ", i, p[i].x , p[i].y, dist(p[i])); } printf("\n"); } int xcreciente(const void * a, const void * b) {//función creada por el usuario para pasar como parámetro al procedimiento //qsort para ordenar los puntos en el sentido creciente de las x; punto pa, pb; pa = *((punto *)a); pb = *((punto *)b); if( pa.x > pb.x ) { return 1; } if( pa.x < pb.x ) { return -1; } return 0; } int distcreciente( const void * a, const void * b) { //función creada por el usuario para pasar como parámetro al procedimiento //qsort para ordenar los puntos en el sentido creciente de las distancias //al origen punto pa, pb; pa = *((punto *)a); pb = *((punto *)b); if( dist(pa) > dist(pb) ) {//se llama a la funcion auxiliar dist return 1; } if( dist(pa) < dist(pb) ) { return -1; } return 0; } main() { punto p[10], q[10]; //como vamos a hacer dos ordenamientos utilizamos el vector p para llenarlo //de números aleatorios. Luego copiamos a q los valores del vector y los //ordenamos int i; for( i = 0; i < 10; i++ ) {//asignamos valores aleatorios a p p[i].x = random(1000); p[i].y = random(1000); } mostrar(p, 0, 9 ); //copiamos en q los valores de p y los ordenamos en el sentido creciente //de las x memcpy(q, p, sizeof(punto)*10 ); qsort( q, 10, sizeof(punto), xcreciente ); printf("\n\n***VECTOR ORDENADO EN EL SENTIDO CRECIENTE DE LOS VALORES " "DE X***\n\n" ); mostrar( q, 0, 9 ); //copiamos en q los valores de p y ahora los ordenamos en el sentido //creciente de las distancias al origen memcpy(q, p, sizeof(punto)*10 ); qsort( q, 10, sizeof(punto), distcreciente ); printf("\n\n***VECTOR ORDENADO EN EL SENTIDO CRECIENTE " "DE LA DISTANCIA AL ORIGEN***\n\n" ); mostrar( q, 0, 9 ); system("pause"); }