/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Problema raro de ordenar Matriz con el metodo burbuja

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
fires



Registrado: 25 Dic 2006
Mensajes: 76
Ubicación: Asuncion

MensajePublicado: 22/08/2007 6:21 pm
Título: Problema raro de ordenar Matriz con el metodo burbuja

Hola...estoy haciendo un programa que se genera un numero comprendido entre 10 y 90 y se guarda en una matriz de 7 * 7.
Esto anda muy bien... Se imprime todo..etc...Pero siempre y cuando comente la funcion b]OrdenarMatrizBurbuja[[/b] porque osino se ejecuta pero sin sacar nada en pantalla..osea como si no tendria una pausa automatica....y nop se porque..ademas no me sale ningun error en el compilador ni al ejecutar...
el codigo es:


Código:

/*   9.Generar 49 números comprendidos entre 10 y 99.
     Cargar en una matriz. Ordenar e imprimir la matriz, y la diagonal.
*/

#include <stdio.h>
#include <stdlib.h>
#define TAMANIO_MATRIZ 7 //el tamaño de la matriz

/* Variables Globales */
int matriz[TAMANIO_MATRIZ][TAMANIO_MATRIZ];       // la matriz


// Funcion Ordenar MatrizBurbuja
void OrdenarMatrizBurbuja(void)
{
     //declarar las variables locales de la funcion Ordenar MatrizBurbuja
     int i,j;              //indices para la matriz
     int fila;             //indice auxiliar para las filas de las matrices
     int cont;             //contador
     int aux;              //auxiliar para poder cambiar las elementos de la matriz
     int veces;            //contador de las veces que se hace el metodo de la burbuja   
     
     //inicializar las variables
     i = 1;
     j = 1;
     fila = 1;
     cont = 1;
     veces = 0;
       
       
     while(veces < (TAMANIO_MATRIZ * TAMANIO_MATRIZ))
     {
         while(cont <= (TAMANIO_MATRIZ * TAMANIO_MATRIZ))
         {
              while(i < TAMANIO_MATRIZ)
              {
                  if(matriz[i][j] > matriz[i][j + 1])
                  {
                      aux = matriz[i][j];
                      matriz[i][j] = matriz[i][j + 1];
                      matriz[i][j + 1] = aux;
                  }
                  j++;
                  cont++;
              }
              fila++;
       
              if(cont <= (TAMANIO_MATRIZ * TAMANIO_MATRIZ))
              {
                  if(matriz[i][j] > matriz[fila][j])
                  {
                      aux = matriz[i][j];
                      matriz[i][j] = matriz[fila][j];
                      matriz[fila][j] = aux;
                  }
                  cont++;
              }
              i++;
       
              if(cont <= (TAMANIO_MATRIZ * TAMANIO_MATRIZ))
              {
                  while(j != 1)
                  {
                      if(matriz[fila][j] > matriz[fila][j - 1])
                      {
                            aux = matriz[fila][j];
                            matriz[fila][j] = matriz[fila][j - 1];
                            matriz[fila][j - 1] = aux;
                      }
                      j--; 
                      cont++;
                  }
                  fila++;   
              }
       
              if(cont <= (TAMANIO_MATRIZ * TAMANIO_MATRIZ))
              {
                  if(matriz[i][j] > matriz[fila][j])
                  {
                        aux = matriz[i][j];
                        matriz[i][j] = matriz[fila][j];
                        matriz[fila][j] = aux;
                  }
              }
              i++;
        }
        veces++;
    }   
}


// Funcion Imprimir Matriz
void ImprimirMatrizGeneral(void)
{
    // declarar e inicializar las variables locales de la funcion Imprimir Matriz General
    int i, j;
     
    for(i = 0; i < TAMANIO_MATRIZ; i++)
    {
          for(j = 0; j < TAMANIO_MATRIZ; j++)
          {
              printf("%d  ",matriz[i][j]);
          }
          printf("\n"); //salto de linea
    }
}

void GenerarNumerosAleatorios(void)
{   
     // declarar e inicializar las variables locales de la funcion Generar Numeros Aleatorios
     int i,j;                   // indices para la matriz
     int numero_generado;       // el numero que se genera atravez de rand
     
     
     //se generan los numeros aleatorios entre 10 y 90
     for (i = 0; i < TAMANIO_MATRIZ; i++)
     {
          for(j = 0; j < TAMANIO_MATRIZ; j++)
          {
              do
              {
                  numero_generado = rand();
              }while((numero_generado < 10) || (numero_generado > 91));
              matriz[i][j] = numero_generado;   
          }
     }
}

//Funcion Imprimir Diagonal
void ImprimirDiagonal(void)
{
     // declarar e inicializar las variables locales de la funcion Imprimir Diagonal
    int i, j;
   
    printf("\n\n\nLa diagonal es: \n");
    for(i = 0; i < TAMANIO_MATRIZ; i++)
    {
          for(j = 0; j < TAMANIO_MATRIZ; j++)
          {
              if(i == j)
                   printf("%d  ",matriz[i][j]);
          }
    } 
}


//Programa Principal
int main(void)
{
      GenerarNumerosAleatorios();
      printf("\n\n\nLa matriz Generada es: \n");
      ImprimirMatrizGeneral();
      OrdenarMatrizBurbuja();
      printf("\n\n\nLa matriz Ordenada es: \n");
      ImprimirMatrizGeneral();
      ImprimirDiagonal();
      getch();
      return(0);   
}



desde ya muchas gracias..Smile
_________________
Es mejor estar callado y parecer tonto, que hablar y despejar las dudas definitivamente.Smile
Volver arriba
mamntc02



Registrado: 30 Abr 2007
Mensajes: 242

MensajePublicado: 23/08/2007 12:56 am
Título:

Hola,

No sé cual es exactamente el problema, más q nada q no recuerdo nada de algoritmos de ordenación Wink, pero hay cosas q creo q no estan muy bien:
  • Es cierto q un for y un while son intercambiables, pero si existen ambos es por algo. Estos whiles q tienes en el método de ordenación lían mucho, pq necesitas varias instrucciones para hacer lo q en un for haces en una, además de quedar mucho más centralizados los incrementos de variables. Es decir, en mi opinión te recomendaría usar for.
  • No tienes ningún control sobre variables como j ó fila. De hecho ahí tienes un problema pq al ir aumentando j sin ningún control te acabas saliendo de los límites de la matriz. He hecho una prueba y llega a la posición [1][1059] de la matriz!!! Lo q me extraña es q no haga otro casque, pq te sales tres pueblos de la memoria.
  • Lo arrays (simples o multidimensionales) empiezan por la posición 0. No estoy seguro pero creo q nunca comparas con las posciones [0][0], [0][j], ni [i][0], y llegan hasta el tamaño -1. Es decir en tu ejemplo las filas corren desde 0 hasta TAMANIO_MATRIZ - 1, y lo mismo para las columnas. Ten en cuenta esto en las codiciones de los for ó while, y sobretodo al acceder a elementos del tipo [i][j+1].
  • Te has dado cuenta q siempre te genera la misma matriz? Wink

Saludos.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 24/08/2007 10:10 pm
Título:

Aparte de lo ya comentado por mamntc02 una parte que esta mal en tu programa es la generacion de los numeros aleatorios ya que este bloque es ineficiente:
Código:
/* se generan los numeros aleatorios entre 10 y 90 */
for (i = 0; i < TAMANIO_MATRIZ; i++){
   for(j = 0; j < TAMANIO_MATRIZ; j++){
      do {
         numero_generado = rand();
      }while (numero_generado < 10 || numero_generado > 91);
     
      matriz[i][j] = numero_generado;
   }
}


Para obtener numeros en el rango 10 a 90 solo tienes que utilizar "10 + rand() % 91", de esta forma:
Código:
/* se generan los numeros aleatorios entre 10 y 90 */
for (i = 0; i < TAMANIO_MATRIZ; i++)
   for(j = 0; j < TAMANIO_MATRIZ; j++)
      matriz[i][j] = 10 + rand() % 91;


Un programa sencillo de ejemplo que ordena un array mediante el metodo de la burbuja es (C estandar):
Código:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NUM_REGISTROS 16

typedef struct st_registro {
   int prin; /* campo principal  */
   int sec;  /* campo secundario */
} Registro;

int main(void)
{
   Registro reg[NUM_REGISTROS];
   Registro aux;
   int i, j, intercambio;
   
   srand((unsigned) time(NULL));
   
   puts("Registros ordenados en base al campo secundario:");
   for (i = 0; i < NUM_REGISTROS; i++){
      reg[i].prin = rand() % (NUM_REGISTROS / 2);
      reg[i].sec  = i + 1;
     
      printf("%02d.%02d\n", reg[i].prin, reg[i].sec);
   }
   
   /* Ordenacion mediante el metodo burbuja (BubbleSort) */
   for (i = NUM_REGISTROS - 1; i > 0; i--){
      intercambio = 0;
     
      for (j = 0; j < i; j++)
         if (reg[j].prin > reg[j + 1].prin){
            aux = reg[j];
            reg[j] = reg[j + 1];
            reg[j + 1] = aux;
           
            intercambio = 1;
         }
     
      if (!intercambio)
         break;
   }
   
   puts("----\nRegistros ordenados en base al campo principal:");
   for (i = 0; i < NUM_REGISTROS; i++)
      printf("%02d.%02d\n", reg[i].prin, reg[i].sec);
   
   return EXIT_SUCCESS;
}


Y un ejemplo un poco mas complicado implementando una funcion de ordenacion generica similar a la funcion qsort de la biblioteca estandar de C:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define NUM_REGISTROS 16

typedef struct st_registro {
   int prin; /* campo principal  */
   int sec;  /* campo secundario */
} Registro;

typedef int (*pfn_cmp)(void const *pa, void const *pb);

int cmp(void const *pa, void const *pb);
void bsort(void *elem, size_t num, size_t tam, pfn_cmp cmp);

int main(void)
{
   Registro reg[NUM_REGISTROS];
   int i;
   
   srand((unsigned) time(NULL));
   
   puts("Registros ordenados en base al campo secundario:");
   for (i = 0; i < NUM_REGISTROS; i++){
      reg[i].prin = rand() % (NUM_REGISTROS / 2);
      reg[i].sec  = i + 1;
     
      printf("%02d.%02d\n", reg[i].prin, reg[i].sec);
   }
   
   bsort(reg, NUM_REGISTROS, sizeof reg[0], cmp);
   
   puts("----\nRegistros ordenados en base al campo principal:");
   for (i = 0; i < NUM_REGISTROS; i++)
      printf("%02d.%02d\n", reg[i].prin, reg[i].sec);
   
   return EXIT_SUCCESS;
}

/*
** Funcion de soporte que compara los campos principales de dos registros
** y cuyo valor de retorno es positivo, cero o negativo, si el campo principal
** del primer registro (a) es mayor, igual o menor que el campo principal del
** segundo registro (b), respectivamente.
*/
int cmp(void const *pa, void const *pb)
{
   Registro const *p = pa;
   Registro const *q = pb;
   
   return (p->prin > q->prin) - (p->prin < q->prin);
}

/*
** Funcion que utiliza el algoritmo de ordenacion "Burbuja" (BubbleSort)
** para ordenar una lista de elementos sin importar su tipo, de forma similar
** a la funcion qsort de la biblioteca estandar de C.
*/
void bsort(void *elem, size_t num, size_t tam, pfn_cmp cmp)
{
   char *base = elem;
   void *aux;
   size_t i;
   size_t j;
   size_t num_bytes;
   int intercambio;
   
   if (base == NULL || num < 2 || tam == 0)
      return;
   if ((aux = malloc(tam)) == NULL)
      return;
   
   /* Numero total de bytes utilizados por el array a ordenar */
   num_bytes = num * tam;
   
   /* Ordenar los ultimos num-1 elementos */
   for (i = num_bytes - tam; i > 0; i -= tam){
      intercambio = 0;
     
      for (j = 0; j < i; j += tam)
         if (cmp(base + j, base + j + tam) > 0){
            memmove(aux, base + j, tam);
            memmove(base + j, base + j + tam, tam);
            memmove(base + j + tam, aux, tam);
           
            intercambio = 1;
         }
     
      if (!intercambio)
         break;
   }
   
   free(aux);
}


La idea es que tomes esos dos programados como orientacion para corregir tu programa, la parte mas engorrosa a modificar es el calculo en base a un solo contador (como en mis dos programas) de los indices de fila y columna de la "matriz" (como en tu programa), esto se soluciona utilizando los operadores de division y modulo.

Para explicarlo mejor con un ejemplo donde se utiliza un solo contador y en base a este se rellena una "matriz" de 5x5:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NUM_FILAS  5
#define NUM_COLS   (NUM_FILAS)

#define FILA(i)  ((i) / NUM_FILAS)
#define COL(i)  ((i) % NUM_COLS)

int main(void)
{
   int matriz[NUM_FILAS][NUM_COLS];
   int i;
   
   srand((unsigned) time(NULL));
   
   for (i = 0; i < NUM_FILAS * NUM_COLS; i++)
      matriz[FILA(i)][COL(i)] = rand() % (NUM_FILAS * NUM_COLS);
   
   for (i = 0; i < NUM_FILAS * NUM_COLS; i++){
      printf("%3d", matriz[FILA(i)][COL(i)]);
      putchar((i + 1) % NUM_FILAS != 0 ? ' ' : '\n');
   }

   return EXIT_SUCCESS;
}


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
fires



Registrado: 25 Dic 2006
Mensajes: 76
Ubicación: Asuncion

MensajePublicado: 27/08/2007 5:35 pm
Título:

logre hacer... aqui esta el codigo y sale...
use el ide dev c++.la ultima version

Código:

/*  9- Generar 49 números comprendidos entre 10 y 99. Cargar en una matriz.
    Ordenar e imprimir la matriz, el mayor, el menor, el promedio y la diagonal.
*/

#include <stdio.h>
#include <stdlib.h>
#define TAMANIO_MATRIZ 7 //el tamaño de la matriz

/* Variables Globales */
int matriz[TAMANIO_MATRIZ][TAMANIO_MATRIZ];       // la matriz


//Buscar el elemento mayor de la matriz
void BuscarElementoMayor(void)
{
      //declarar e inicializar las variables
      int i, j, mayor;
   
      mayor = matriz[TAMANIO_MATRIZ - 1][TAMANIO_MATRIZ - 1];   
       printf("\nEl mayor elemento de la matriz es: %d",mayor);
}


//Buscar el elemento menor de la matriz
void BuscarElementoMenor(void)
{
    //declarar e inicializar las variables
    int i, j, menor;
   
    menor = matriz[0][0];   
    printf("\nEl menor elemento de la matriz es: %d", menor);
}


// Funcion Ordenar MatrizBurbuja
void OrdenarMatrizBurbuja(void)
{
     //declarar las variables locales de la funcion Ordenar MatrizBurbuja
     int i,j;              //indices para la matriz
     int fila_aux;         //indice auxiliar para las filas de las matrices
     int cont;             //contador
     int aux;              //auxiliar para poder cambiar las elementos de la matriz
     int veces;            //contador de las veces que se hace el metodo de la burbuja   
     
     //inicializar las variables
     i = 0;
     j = 0;
     fila_aux = 0;
     cont = 0;
     veces = 0;
       
       
     while(veces < (TAMANIO_MATRIZ * TAMANIO_MATRIZ))
     {
         while(cont < (TAMANIO_MATRIZ * TAMANIO_MATRIZ))
         {
              while(j < (TAMANIO_MATRIZ - 1))
              {
                  if(matriz[i][j] > matriz[i][j + 1])
                  {
                      aux = matriz[i][j];
                      matriz[i][j] = matriz[i][j + 1];
                      matriz[i][j + 1] = aux;
                  }
                  j++;
                  cont++;
              }
              fila_aux++;
       
              if(cont < (TAMANIO_MATRIZ * TAMANIO_MATRIZ -1))
              {
                  if(matriz[i][j] > matriz[fila_aux][0])
                  {
                      aux = matriz[i][j];
                      matriz[i][j] = matriz[fila_aux][0];
                      matriz[fila_aux][0] = aux;
                  }
              }
              cont++;
              i++;
              j = 0;
       
              if(cont < (TAMANIO_MATRIZ * TAMANIO_MATRIZ))
              {
                  while(j < (TAMANIO_MATRIZ - 1))
                  {
                      if(matriz[i][j] > matriz[i][j + 1])
                      {
                            aux = matriz[i][j];
                            matriz[i][j] = matriz[i][j + 1];
                            matriz[i][j + 1] = aux;
                      }
                      j++; 
                      cont++;
                  }
                  fila_aux++;   
              }
       
              if(cont < (TAMANIO_MATRIZ * TAMANIO_MATRIZ))
              {
                  if(matriz[i][j] > matriz[fila_aux][0])
                  {
                        aux = matriz[i][j];
                        matriz[i][j] = matriz[fila_aux][0];
                        matriz[fila_aux][0] = aux;
                  }
              }
              i++;
              j = 0;
              cont++;
        }
        veces++;
        i = 0;
        j = 0;
        fila_aux = 0;
        cont = 0; 
    }   
}


void GenerarNumerosAleatorios(void)
{   
     // declarar e inicializar las variables locales de la funcion Generar Numeros Aleatorios
     int i,j;                   // indices para la matriz
     int numero_generado;       // el numero que se genera atravez de rand
     
     
     //se generan los numeros aleatorios entre 10 y 99
     for (i = 0; i < TAMANIO_MATRIZ; i++)
     {
          for(j = 0; j < TAMANIO_MATRIZ; j++)
          {
              do
              {
                  numero_generado = rand();
              }while((numero_generado < 10) || (numero_generado > 99));
              matriz[i][j] = numero_generado;   
          }
     }
}


// Funcion Imprimir Matriz
void ImprimirMatrizGeneral(void)
{
    // declarar e inicializar las variables locales de la funcion Imprimir Matriz General
    int i, j;
     
    for(i = 0; i < TAMANIO_MATRIZ; i++)
    {
          for(j = 0; j < TAMANIO_MATRIZ; j++)
          {
              printf("%d  ",matriz[i][j]);
          }
          printf("\n"); //salto de linea
    }
}


//Funcion Imprimir Diagonal
void ImprimirDiagonal(void)
{
     // declarar e inicializar las variables locales de la funcion Imprimir Diagonal
     int i, j;
   
     printf("\n\n\nLa diagonal es: \n");
     for(i = 0; i < TAMANIO_MATRIZ; i++)
     {
           for(j = 0; j < TAMANIO_MATRIZ; j++)
           {
                 if(i == j)
                      printf("%d  ",matriz[i][j]);
           }
     } 
}

//Funcion para hallar el promedio de los elementos de la matriz
float promedio_elementos_matriz(void)
{
      // declarar e inicializar las variables locales de la funcion Imprimir Diagonal
      int i, j;                 //indices de la matriz
      float promedio;           //promedio de los elementos de la matriz         
      int suma;                 //suma de los elementos de la matriz
      int cont;                 //contador de los elementos de la matriz           
     
      cont = 0;
      suma = 0;
      for(i = 0; i < TAMANIO_MATRIZ; i++)
      {
            for(j = 0; j < TAMANIO_MATRIZ; j++)
            {
                  suma += matriz[i][j];
                  cont++;
            }
      }
      promedio = (float)suma / cont;
      return (promedio);                       
}


//Programa Principal
int main(void)
{
      GenerarNumerosAleatorios();
      printf("\n\n\nLa matriz Generada es: \n");
      ImprimirMatrizGeneral();
      OrdenarMatrizBurbuja();
      printf("\n\n\nLa matriz Ordenada es: \n");
      ImprimirMatrizGeneral();
      ImprimirDiagonal();
      BuscarElementoMenor();
      BuscarElementoMayor();
      printf("\nEl promedio de los elementos de la matriz es: %.2f",promedio_elementos_matriz());
      getch();
      return(0);   
}


muchas gracias a todos por su ayuda...
acabo de ver lo que me pusiseron de ejemplo..y lo voy a tener en cuenta...muchas gracias..Smile
_________________
Es mejor estar callado y parecer tonto, que hablar y despejar las dudas definitivamente.Smile
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com