Estás en: Inicio >> Foros >> Informática >> Programación
Programación /

[Borland C] Cosa rara... duda, duda, duda!!!

Participa en el tema [Borland C] Cosa rara... duda, duda, duda!!! en el foro Programación.
Hola Gente!!! Tengo una duda... necesito ordenar una matriz que contiene los valores de unas ...

Buscar en este tema:
 
  •  
    #1 [Borland C] 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:

    Código:
    #include <stdio.h>
    #include <conio.h>
    
    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();
    }
    
    Esto es de las cabernas... 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.
    +
     
    0
    Me gusta
     
    | Más
  • #2 Re: Cosa rara... duda, duda, duda!!!

    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.
    Me gusta este mensaje
  • #3 Re: Cosa rara... duda, duda, duda!!!

    en otras palabras
    for (f=0;f<=3;f++)
    y

    for (c=0;c<=3;c++)

    tendrian que ser

    for (f=0;f<3;f++)

    for (f=0;f<3;f++)

    O sea que ocupas los elementos
    00 01 02
    10 11 12
    20 21 22
    Me gusta este mensaje
  • #4 Re: Cosa rara... duda, duda, duda!!!

    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
    Me gusta este mensaje
  • #5 Re: Cosa rara... duda, duda, duda!!!

    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:
    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]; 
          }
       }
    }
    
    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...

    Acaso la matriz no seria como la siguiente imagen??



    Salu2
    Me gusta este mensaje
  • #6 Re: Cosa rara... duda, duda, duda!!!

    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...
          }
       }
    }
    
    Me gusta este mensaje
  • #7 Re: Cosa rara... duda, duda, duda!!!

    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.
    Me gusta este mensaje
Estás en: Inicio >> Foros >> Informática >> Programación


Estadísticas del tema
  • 6 RESPUESTAS
  • 3558 VISTAS
  • 5 USUARIOS RESPONDIERON
 
Ir arriba
Contacto | Acerca de | Ayuda | Términos Legales | privacidad | Pautas de convivencia | Mapa de los foros | TrabajÁ con nosotros
©2008 Psicofxp.com S.A. - Todos los derechos reservados
Certifica IAB