[C con Clase] Capítulo 17, problema 2

marcelinux marcelinator en gmail.com
Dom Feb 14 22:23:48 CET 2016


El pasado 2016-02-12 22:58:14, Salvador Pozo escribió:
 
SP> Dos pistas:
SP> - Pon atención a la función de ordenar.
SP> - La función de ordenar y el array de floats deben tener el mismo ámbito,
SP> ambas globales o ambas locales de la misma función.

No soy capaz de imaginar cómo relacionar el array de float con el de enteros dentro de la función de comparación.

Esta es mi propuesta. Puedo ordenar los valores float pero no se cómo "emparejarlos" con su índice.
/****************************************************************************
 * Capítulo 17. Problema 2.
 * http://c.conclase.net/curso/index.php?cap=017#inicio
 * Por ejemplo, si el array dado contiene los valores:
 * 1.32, 4.21, 2.33, 0.23, 8.35, 2.32, se debe crear un segundo array de
 * enteros dinámico, que una vez ordenado debe contener los valores:
 * 3, 0, 5, 2, 1, 4.
 * Para ordenar el array de enteros se debe usar la función qsort.
 ****************************************************************************/
#include <cstdlib>
#include <iostream>

#define NVAL 6

// Array de float
float valores[NVAL] = { 1.32, 4.21, 2.33, 0.23, 8.35, 2.32 };
// Array dinámico de int
int *indices;

int comparar(const void *val1, const void *val2) {
	if(*(float *)val1 < *(float *)val2) return -1;
	else if(*(float *)val1 > *(float *)val2) return 1;
	else return 0;
}

void mostrar_valores(const char *mensaje) {
	std::cout << mensaje << std::endl;
	for(int i = 0; i < NVAL; i++)
		std::cout << valores[i] << "\t";
	std::cout << std::endl;
}

void mostrar_indices() {
	for(int i = 0; i < NVAL; i++)
		std::cout << indices[i] << "\t";
	std::cout << std::endl;
}

int main() {
	mostrar_valores("Valores iniciales");

	// Con el mismo número de elementos que el array de float
	indices = new int[NVAL];
	// Asignar el índice para cada elemento
	for(int i = 0; i < NVAL; i++)
	{
		indices[i] = i;
	}

	// Ordenar
	qsort(indices, NVAL, sizeof(indices[0]), comparar);
//	qsort(valores, NVAL, sizeof(valores[0]), comparar);

	mostrar_valores("Valores ordenados");
	mostrar_indices();

	// Eliminar puntero
	indices = 0;
	delete[] indices;

	return 0;
}


Más información sobre la lista de distribución Cconclase