CYBERRRR Posted April 24, 2009 at 07:12 PM Report #258875 Posted April 24, 2009 at 07:12 PM 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:(
TheDark Posted April 27, 2009 at 11:28 AM Report #259338 Posted April 27, 2009 at 11:28 AM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now