C:\Users\Jose\Documents\Cuadernos\UTN Año Lectivo 2015

Anuncio
#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");
}
Descargar