Cosa rara... duda, duda, duda!!!
-
Hola Gente!!!
Tengo una duda... necesito ordenar una matriz que contiene los valores de unas ventas, y se ordena de la siguiente forma
Nro. Vendedor || Nro. Articulo || Cantidad total de unidades vendidas
hasta ahi todo bien... el problema empieza cuando ordeno!!!
para que se entienda mejor, hise un pequeño programita para que vean lo que pasa :O-o:Esto es de las cabernas...Código:#include
#include void main() { int Matriz[3][3] = {{2,7,6},{8,9,0},{5,3,1}}; int Vector1[3]; // Si aca pongo 4 recupero el 1er valor original de la matriz int Vector2[3]; int f, c; for (f=0; f<=3; f++) { for (c=0; c<=3; c++) { Vector1[c]=Matriz[f][c]; Vector2[c]=Matriz[f+1][c]; if (Vector1[0] > Vector2[0]) { Matriz[f][c]=Vector2[c]; Matriz[f+1][c]=Vector1[c]; } } } printf("Matriz Ordenada\n"); gotoxy(4,2); printf("Matriz 3 x 3: "); gotoxy(19,2); printf("%d , %d, %d", Matriz[0][0], Matriz[0][1], Matriz[0][2]); gotoxy(19,3); printf("%d , %d, %d", Matriz[1][0], Matriz[1][1], Matriz[1][2]); gotoxy(19,4); printf("%d , %d, %d", Matriz[2][0], Matriz[2][1], Matriz[2][2]); getch(); } pero es a modo de ejemplo, para que vean como me cambia los valores de la matriz.
Les dejo una imagen para que vean lo que me tira.
Salu2. -
Me limito a decir lo siguiente:
1- Si la matriz es de 3 x 3 el maximo elemento es el [2][2] y no el [3][3].
2- Te recomiendo que primero intentes hacerlo con un ejemplo a mano, luego pases a pseudo codigo, y recien al final escribas el codigo en el lenguaje. -
Ahora una cosa que no entiendo es por que campo se ordenan, si se ordenan por el primero, por el segundo o por el tercer campo de la matriz (campo en este caso seria la columna)
Lo que yo te diria es lo siguiente: Defini un tipo funcion que reciba dos punteros a int (para representar los vectores) y el tamaño del vector y que devuelva un int o un enum (-1 para izquierda menor que derecha, 0 para igual y 1 para izquierda mayor que derecha). A este tipo de funcion llamemosla con el alias compararVectores.
Luego te crees una funcion llamada ordenarMatriz que reciba un puntero a puntero a int (para representar la matriz de dos dimensioens) le pases las dimensiones (en fila y columnas) y a su vez le pases como tercer parametro un puntero a un tipo de funcion compararVectores esto es para que le parametrices la forma en que compara los vectores y lo puedas hacer generico.
La idea seria algo asi:
typedef int (*compararVectores)(int * vector1, int *vector2, int dimension);
void ordenarMatriz(int ** matriz, int filas, int columnas, compararVectores comparar) {
for( int contador = 0; contador < filas-1; contador ++) {
int* aux;
if(comparar(matriz[contador],matriz[contador+1] == -1) {
aux = matriz[contador];
matriz[contador] = matriz[contador+1];
matriz[contador+1] = aux;
}
}
}
luego definis alguna funcion que sea
int compararAsc(int *vector1, int *vector2, int dimension) {
if(dimension == 0)
return 0;
if(vector1[1] < vector2[1])
return -1
else if(vector1[1] == vector2[1])
return 0;
esle
return 1;
}
y la forma de operar seria:
int m[3][3] = {{0,1,1},{1,0,1},{1,0,0}};
ordenarMatriz(m,3,3 &compararAsc);
y listo
O sea tenes parametrizado la matriz que va a recibir, la dimension y la forma en que compara, es decir que si queres ordenar alguna otra matriz lo unico que tenes que hacer es definir la forma de comparar o sea creas una funcion que devuelva un entero -1 para izq menor que derecha, cero apra iguales y 1 izquierda mayor que derecha, que tome dos punteros a int o sea dos vectores de int, y que tome la dimension de los vectores (que van a ser iguales) entonces unicamente llamas a compararMatriz pasandole la matriz de dos dimensiones, ambas dimensiones y la direccion de memoria de la funcion que acabas de definir.
Saludos
PABLO -
Gracias a todos por responder tan rapido.
Tome un poco de lo que me dijeron todos, y pude ordenar mi matriz...
el codigo me quedo algo asi:Ahora hay algo que no logro entender por que lo hace... y es que al declarar la matriz tengo que dejar los primeros corchetes en blanco, si le doy valor me hace cualquier cosa...Código:int Matriz[][3] = {{2,7,6},{8,9,0},{5,3,1}}; int Vector1[3]; int Vector2[3]; int f, c, d = 0; for (f=0; f<3; f++) { for (c=0; c<3; c++) { Vector1[c]=Matriz[f][c]; Vector2[c]=Matriz[f+1][c]; if (Vector1[0] > Vector2[0]) { Matriz[f][c]=Vector2[c]; Matriz[f+1][c]=Vector1[c]; } } }
Acaso la matriz no seria como la siguiente imagen??
Salu2 -
Te recomiendo que leas un tutorial sobre C/C++ o al menos sobre punteros y/o manejo de memoria, seguis accediendo a memoria que no es tuya:
Código:int Matriz[][3] = {{2,7,6},{8,9,0},{5,3,1}}; int Vector1[3]; int Vector2[3]; int f, c, d = 0; for (f=0; f<3; f++) { for (c=0; c<3; c++) { Vector1[c]=Matriz[f][c]; Vector2[c]=Matriz[f+1][c]; //Cuando f == 2, f+1 == 3, y accedes a memoria que no debes... if (Vector1[0] > Vector2[0]) { Matriz[f][c]=Vector2[c]; Matriz[f+1][c]=Vector1[c]; //y aca aun peor, podes llegar a escribirla... } } } -
Podrias intentar trabajar con el concepto de matriz rala, es decir un vector que se conporte como una matriz, de esta forma podrias emplear los algoritmos de ordenamientos mas conocidos como el quit o el shell.
Esto se mejora mediante el empleo de un obj supongamos matriz, y que internamente opere como un vector, si es de tu interes te puedo pasar algo para solucionarlo mediante esta forma.
Hay que tener en cuenta que en la memoria todo se almacena en forma secuencial, la matriz solo es una abstraccion.
