Jump to content

Ordenar Array Bidimensional


Recommended Posts

Posted

Estava a pensar em usar a função bubblesort tratando o meu array como um array unidimensional de ponteiros, como está feito no "scanf" quando peço para preencher o array.

Mas na parte onde começo a ordenar os valores, algo nao esta bem porque o programa chega aí e fica parado.

Aqui está o código:

#include <stdio.h>

int main(){
    int l,c,*p,*q,i,j,m;

    printf("Dimensoes da matriz\n\n");
    printf("Linhas: ");
    scanf("%d",&l);
    printf("Colunas: ");
    scanf("%d",&c);

    int a[l][c];
    printf("\nInsira os %d valores a preencher: ",l*c);

    for(p=&a[0][0];p<=&a[l-1][c-1];p++) scanf("%d",p);

    printf("\n\nMatriz Original\n");
    for (i=0;i<l;i++){
        for(j=0;j<c;j++) printf(" %d   ",a[i][j]);
        printf("\n");
    }

    for (p=&a[0][0];p<&a[l][c]; p++){  //sei que o erro
        for (q=&a[l-1][c-1];q>=p;q++){ //esta aqui
            if (a[j-1]> a[j]){
                m=p[j-1];       //penso que aqui
                p[j-1]=p[j];    //devia estar um *
                p[j]=m;         //antes de cada p
            }
        }
    }
    printf("\n\nMatriz Ordenada\n");
    for (i=0;i<l;i++){
        for(j=0;j<c;j++) printf("%d\t",a[i][j]);
        printf("\n");
    }

    return 0;
}

A função de bubblesort que tenho é a seguinte:

void bubblesort(int a[], int n){
   int i;
   int j;
   int m;
   for (i=0; i<n; i++){
      for (j=n-1;j>=i;i++){
         if (a[j-1]> a[j]){
            m=a[j-1];
            a[j-1]=a[j];
            a[j]=m;
         }
       }
   }
}

Qualquer ajuda/comentário é agradecido.

PS: reparei agora que meto um ponteiro no segundo for, que deve ser uma grande asneira, mas já estou farto de pensar e de alterar e não sei como fazer correctamente:(

Posted

Repara no seguinte:

    for (p=&a[0][0];p<&a[l][c]; p++){  //p inicia no 1º elemento da matriz
        for (q=&a[l-1][c-1];q>=p;q++){ //q inicia no último elemento da matriz

estás a incrementar q e a sair da memória alocada à matriz, quando devias decrementar q de forma a ir ao encontro de p. Ao fazeres q++, a condição do for só será falsa quando percorreres todo o espaço de endereçamento do teu programa (que num sistema a 32 bits são 4GB, e como int ocupa 4 bytes, são mais de 1000 milhões de endereços).

Depois, estás a ser inconsistente nos ciclos for:

    for (p=&a[0][0];p<&a[l][c]; p++){  //sei que o erro
        for (q=&a[l-1][c-1];q>=p;q++){ //esta aqui
            if (a[j-1]> a[j]){
                m=p[j-1];       //penso que aqui
                p[j-1]=p[j];    //devia estar um *
                p[j]=m;         //antes de cada p
            }
        }
    }

estás a construí-lo com apontadores, e depois utilizas indexação para aceder aos elementos, além de que no if utilizas a[] e na troca de valores utilizas p.

Eu deveria continuar esta explicação, mas neste momento não posso. Se mais ninguém lhe pegar entretanto, num futuro próximo termino eu.

Desaparecido.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.