#include <iostream>
#include <conio.h>
#include <iomanip>//para usar el setw
using std::setw;
using namespace std;
//Prototipos de función
void ordenarArreglo(int [], const int , bool (*)( int, int ) );
void intercambiar( int * const , int * const );
void imprimirArreglo( const int * const , const int );
bool ascendente( int , int );
bool descendente( int , int );
int main()
{
//Se inicializa el arreglo
const int tamanioArreglo = 4;
int a[ tamanioArreglo ] = {54, 2 , 46 , 7};
int orden;
//Imprimir el arreglo original
cout<<"\nArreglo original: ";
for(int i = 0; i < tamanioArreglo; i++ )
cout<<setw(5)<<a[i];
cout<<endl<<endl;
//Pedir el orden al usuario
cout<<"Digita 1 para ascendente, 2 descendente: ";
cin>>orden;
//Seleccionar el orden
/*
El tercer parámetro en la función ordenar arreglo hace referencia a la función bool
ascendente o descendente. La operación de esta función se realiza a través del apuntador
bool declarado en la función void ordenarArreglo.
*/
if( orden == 1 )
{
ordenarArreglo( a, tamanioArreglo, ascendente );
cout<<"Arreglo en forma ascendente: "<<endl;
}
else
{
ordenarArreglo( a, tamanioArreglo, descendente );
cout<<"Arrego en forma descendente: "<<endl;
}
imprimirArreglo( a, tamanioArreglo );
getch();
return 0;
}
/*
Función ordenar Arreglo:
Esta función recibe el arreglo y su tamaño. Se utilizan
arreglos para operar estos valores, los cuales llegan por referencia.
*/
void ordenarArreglo(int arreglo[], const int tamanio, bool (*compara)( int, int ) )
{
int menor_mayor; //almacena el subíndice del valor minimo ( o máximo)
for(int i = 0; i < tamanio ; i++ )//recorre todo el arreglo desde la posición inicial hasta el final
{
menor_mayor = i; //se asume que el subíndice del valor mínimo o máximo es el primer valor
for( int j = i + 1; j < tamanio; j++)//recorre el arreglo desde una posición siguiente al inicio
if( !( *compara )( arreglo[ menor_mayor ], arreglo[ j ] ))
menor_mayor = j;
/*
La instrucción ( *compara )( arreglo[ menor_mayor ], arreglo[ j ] ) hace un llamado a la función ascendente
o descentente, dependiendo del caso. El apuntador compara se desreferencia para hacer llamado a la función respectiva,
pasando como parámetros un valor del arreglo y su valor anterior. Si la función regresa un valor verdadero, significa que
el arreglo está ordenado y no se requiere un intercambio de valores. Si la función refresa un valor falso, se niega este
falso, haciendo que se ejecute la instrucción menor_mayor = j; , lo cual conlleva al intercambio de valores.
*/
intercambiar( &arreglo[i ] , &arreglo[menor_mayor] ); //intercambio de valores del arreglo
}
}
/*
void intercambiar: Intercambia los valores de entrada a través de apuntadores
constantes a datos no constantes
*/
void intercambiar( int * const aPtr, int * const bPtr)
{
int aux = *aPtr;//uso de un auxiliar para el intercambio de los valores
*aPtr = *bPtr;
*bPtr = aux;
}
//Compara si un valor es mayor que su anterior, como en una secuencia ascendente
bool ascendente( int a, int b )
{
return a < b;
}
//Compara si un valor es menor que su anterior, como en una secuencia descendente
bool descendente( int a, int b )
{
return a > b;
}
//Imprime el arreglo final
void imprimirArreglo( const int * const a, const int tamanioArreglo)
{
cout<<endl<<endl<<"Arreglo final: ";
for(int i = 0; i < tamanioArreglo; i++ )
cout<<setw(5)<<a[i];
cout<<endl<<endl;
}
Comentarios sobre la versión: 1.0 (0)
No hay comentarios