Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

CYBERRRR

Ordenar Array Bidimensional

Mensagens Recomendadas

CYBERRRR    0
CYBERRRR

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
TheDark    0
TheDark

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.

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


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade