Hilo
vector ordenado (Ana) 2017-01-07 10:29:55
Hola me podrian decir que es lo que falla en este procedimiento? Es que
solo me ordena los dos primeros el resto se los deja y no encuentro el
fallo
Gracias
void FicheroOrdenado (persona p[TAM], short num)
{
short i, j, k;
persona orden, ordenado[TAM];
if (num > 1)
{
for (i = 0; i < num; i++)
{
ordenado[i] = p[i];
if (i > 0)
{
for ( j = i; j > 0; j--)
{
if (ordenado[j].nombre < p[j - 1].nombre)
{
orden = ordenado[j];
ordenado[j] = ordenado[j - 1];
ordenado[j - 1] = orden;
}
}
}
}
}
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
Re: vector ordenado (Daniel de Dios) 2017-01-11 00:14:49
Hola Ana:
¡¡Uffff!! Mucho ha cambiado el C, o yo no he sabido C, en mi vida. He visto tan raro tu código que lo he tenido que probar para ver si era factible que "eso" funcionara. Pues si que compilaba, y hasta se podía ejecutar y todo. Ordenaba mal, pero eso era lo de menos.
En mis tiempos los parámetros se pasaban por valor, y no por referencia. Y los miembros de una estructura u objeto se tenían que copiar uno a uno, o en el caso de objetos, hacer un constructor de copia.
Bueno, bueno, menos literatura, y vamos al grano. el error lo tienes en esta línea siguiente.
if (ordenado[j].nombre < p[j - 1].nombre)
La tienes que corregir así:
if (ordenado[j].nombre < ordenado[j - 1].nombre)
La tabla p[], hasta el momento, sigue con los valores originales. Aprovechando el pase por referencia de la tabla, en el programa que te envío, también he creado otra función que ordena al contrario, y que prescinde de la tabla "ordenado", y de la asignación final de "ordenado" a "p", si quieres puedes reconvertir tu función de la misma manera.
Saludos
Daniel de Dios "El Ignorado"
________________________________
De: Cconclase <cconclase-bounces@listas.conclase.net> en nombre de Ana Pallares Vilar <anapallares20@gmail.com>
Enviado: sábado, 7 de enero de 2017 11:42
Para: Lista de correo sobre C y C++
Asunto: [C con Clase] vector ordenado
Hola me podrian decir que es lo que falla en este procedimiento? Es que solo me ordena los dos primeros el resto se los deja y no encuentro el fallo
Gracias
void FicheroOrdenado (persona p[TAM], short num)
{
short i, j, k;
persona orden, ordenado[TAM];
if (num > 1)
{
for (i = 0; i < num; i++)
{
ordenado[i] = p[i];
if (i > 0)
{
for ( j = i; j > 0; j--)
{
if (ordenado[j].nombre < p[j - 1].nombre)
{
orden = ordenado[j];
ordenado[j] = ordenado[j - 1];
ordenado[j - 1] = orden;
}
}
}
}
}
#include <cstdlib>
#include <iostream>
using namespace std;
struct persona {
string nombre;
int edad;
};
#define TAM 3
void FicheroOrdenado ( persona p[ TAM ], short num );
void OrdenadoFichero ( persona p[ TAM ], short num );
int main(int argc, char *argv[])
{
char Buff[ 50 ];
persona pru[ TAM ];
pru[ 0 ].nombre = "Daniel";
pru[ 0 ].edad = 58;
pru[ 1 ].nombre = "Antonio";
pru[ 1 ].edad = 56;
pru[ 2 ].nombre = "Braulio";
pru[ 2 ].edad = 20;
for ( int x = 0 ; x < TAM ; x++ ) {
cout << pru[ x ].nombre << " " << pru[ x ].edad << endl;
}
cout << "Despues de la ordenación aparecen así ..." << endl;
FicheroOrdenado ( pru , TAM );
for ( int x = 0 ; x < TAM ; x++ ) {
cout << pru[ x ].nombre << " " << pru[ x ].edad << endl;
}
cout << "Despues de la ordenación contraria aparecen así ..." << endl;
OrdenadoFichero ( pru , TAM );
for ( int x = 0 ; x < TAM ; x++ ) {
cout << pru[ x ].nombre << " " << pru[ x ].edad << endl;
}
cout << "Press the enter key to continue ...";
cin.get();
return EXIT_SUCCESS;
}
void FicheroOrdenado (persona p[ TAM ], short num)
{
short i, j, k;
persona orden, ordenado[ TAM ];
if (num > 1)
{
for (i = 0; i < num; i++)
{
ordenado[i] = p[i];
if (i > 0)
{
for ( j = i; j > 0; j--)
{
if (ordenado[j].nombre < ordenado[j - 1].nombre)
{
orden = ordenado[j];
ordenado[j] = ordenado[j - 1];
ordenado[j - 1] = orden;
}
}
}
}
}
for (k = 0; k < num; k++)
{
p[k] = ordenado[k];
}
}
void OrdenadoFichero (persona p[ TAM ], short num)
{
// Ordenación contraria
short i, j, k;
persona orden;
if (num > 1)
{
for (i = 0; i < num; i++)
{
if (i > 0)
{
for ( j = i; j > 0; j--)
{
if (p[j].nombre > p[j - 1].nombre)
{
orden = p[j];
p[j] = p[j - 1];
p[j - 1] = orden;
}
}
}
}
}
}
_______________________________________________
Lista de correo Cconclase Cconclase@listas.conclase.net
http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ