• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

CYBERRRR

Ordenar Array Bidimensional

2 mensagens neste tópico

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:(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora