Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 19
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    106

    [C]Ordinamento crescente per riga di una matrice

    Ciao a tutti! Ho un problema con questo esercizio:
    Inserire una matrice di righe e colonne inserite dall'utente e ordinare in modo crescente per riga i suoi elementi.
    Ho sviluppato questo codice ma stampa la matrice così per come viene inserita e non fa lo scambio dei valori.
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    void gestione_matr();
    main()
    {
          gestione_matr();
          system("PAUSE");	
      return 0;
    }
    
    void gestione_matr()
    {
         int c,r,i,j,aux;
         printf("Inserisci il numero di righe della matrice: ");
         scanf("%d",&r);
         printf("Inserisci il numero di colonne della matrice: ");
         scanf("%d",&c);
         int matr[r][c];
         printf("\n");
         for(i=0;i<r;i++)
         for(j=0;j<c;j++){
                          printf("Inserisci l'elemento di posizione %d,%d: ",i+1,j+1);
                          scanf("%d",&matr[i][j]);
                          }
         printf("\nLa matrice inserita %c la seguente:\n",138);
         for(i=0;i<r;i++){
                          printf("|");
         for(j=0;j<c;j++){
                          printf(" %d ",matr[i][j]);
                          }
                          printf("|\n");
                          }
                          printf("\n");
         for(i=0;i<r;i++)
         for(j=0;j<c;j++){
                          if(matr[i][j]>matr[i][j++]){
                                                        aux=matr[i][j];
                                                        matr[i][j]=matr[i][j++];
                                                        matr[i][j++]=aux;
                                                        }
                          }
         printf("\nLa matrice ordinata %c la seguente:\n",138);
         for(i=0;i<r;i++){
                          printf("|");
         for(j=0;j<c;j++){
                          printf(" %d ",matr[i][j]);
                          }
                          printf("|\n");
                          }
                          printf("\n");
         
    }
    Qualche idea per risolvere il problema?? Grazie per l'aiuto.

  2. #2
    OS Unix-like?

    1) La matrice va allocata dinamicamente, devi quindi ricorrere alle relative funzioni di allocazione malloc() e deallocazione free().

    2) L'algoritmo di ordinamento è sbagliato, oltretutto l'hai mai provato perchè cosi si dovrebbe schiantare visto che oltrepassi la porzione di memoria (che comunque non hai allocato) della matrice con j.

    Prova a vedere questa soluzione, se puoi utilizzare la libreria standard, cosi come nel mio esempio, per l'ordinamento passi ogni riga della matrice (un vettore) a qsort(); diversamente devi implementarti tu l'algoritmo corretto. Dai un'occhiata su Wikipedia agli algoritmi: BubbleSort, InsertionSort, SelectionSort, HeapSort, MergeSort e QuickSort.

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int compare (const void * a, const void * b)
    {
      return ( *(int*)a - *(int*)b );
    }
    
    
    void fillMatrix(int **matrix, int r, int c)
    {
        int i, j;
    
        for(i = 0; i != r; ++i)
        {
            for(j = 0; j != c; ++j)
                matrix[i][j] = rand() % 256;
        }
    }
    
    
    void printMatrix(int **matrix, int r, int c)
    {
        int i, j;
    
        for(i = 0; i != r; ++i)
        {
            for(j = 0; j != c; ++j)
                printf("%d ", matrix[i][j]);
    
            putchar('\n');
        }
    }
    
    
    void sortMatrix(int **matrix, int r, int c)
    {
        int i;
    
        for(i = 0; i != r; ++i)
            qsort(matrix[i], c, sizeof(int), compare);
    }
    
    
    int main(int argc, char *argv[])
    {
        int c, r;
        int i;
        int **matrix;
    
        printf("Inserisci il numero di righe della matrice: ");
        scanf("%d*%c",&r);
        printf("Inserisci il numero di colonne della matrice: ");
        scanf("%d*%c",&c);
    
        matrix = (int **) malloc(r * sizeof(int*));
    
        for(i = 0; i != r; ++i)
            matrix[i] = (int *) malloc(c * sizeof(int));
    
        fillMatrix(matrix, r, c);
    
        printf("\nMatrice originale:\n");
        printMatrix(matrix, r, c);
    
        printf("\nMatrice ordinata:\n");
        sortMatrix(matrix, r, c);
        printMatrix(matrix, r, c);
    
        for(i = 0; i != r; ++i)
            free(matrix[i]);
    
        free(matrix);
    
        getchar();
        return 0;
    }
    Fracty - The Fractal Generator



    If you cannot choose a concise name that expresses what the method does, it is possible that your method is attempting to perform too many diverse tasks.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    106
    grazie per l'aiuto ma non ho capito niente di quello che hai risp...non capisco xkè c'è bisogno di allocare dinamicamente la matrice (mai fatto) e non capisco il perchè dell'utilizzo dei puntatori...non c'è qualcuno che mi sa spiegare perchè il mio ordinamento non funziona senza postarmi vostre soluzioni? vorrei correggere il mio .Grazie per l'aiuto.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Il problema è sicuramente in questa parte

    codice:
                          if(matr[i][j]>matr[i][j++]){
                                                        aux=matr[i][j];
                                                        matr[i][j]=matr[i][j++];
                                                        matr[i][j++]=aux;
                                                        }
    dato che tutte quelle j++ non fanno altro che aumentare l'indice in maniera che accedi ad elementi non corretti.

    Forse tu intendevi

    j+1

    che è cosa diversa
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    106
    Io con j++ (pensavo fosse giusto) voglio dire l'elemento dell stessa riga i (dato che resta uguale) ma della colonna successiva.
    ad esempio ho questa matrice:
    | 4 3 2 |
    | 7 6 3 |
    con matr[i][j] partendo da i=0 e j=0 intendo il numero 4 e con matr[i][j++] intendo il numero 3.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    106
    Ho corretto in questo modo il problema è che così mi ordina tutta la matrice e non solo le righe.
    (Puoi spiegarmi la differenza di mettere matr[i][j++] e matr[i][j+1] grazie.)
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    void gestione_matr();
    main()
    {
          gestione_matr();
          system("PAUSE");	
      return 0;
    }
    
    void gestione_matr()
    {
    
    /*INSERIMENTO VALORI*/
    
         int c,r,i,j;
         printf("Inserisci il numero di righe della matrice: ");
         scanf("%d",&r);
         printf("Inserisci il numero di colonne della matrice: ");
         scanf("%d",&c);
         int matr[r][c];
        
         printf("\n");
         for(i=0;i<r;i++)
         for(j=0;j<c;j++){
                          printf("Inserisci l'elemento di posizione %d,%d: ",i+1,j+1);
                          scanf("%d",&matr[i][j]);
                          }
    
    /*VISUALIZZAZIONE*/
    
         printf("\nLa matrice inserita %c la seguente:\n",138);
         for(i=0;i<r;i++){
                          printf("|");
         for(j=0;j<c;j++){
                          printf(" %d ",matr[i][j]);
                          }
                          printf("|\n");
                          }
                          printf("\n");
    
    /*ORDINAMENTO*/
         int aux,z;
         for(z=0;z<r;z++)
         for(i=0;i<r;i++){
                          for(j=0;j<c;j++){
                                           if(matr[i][j]>matr[i][j+1]){
                                                                       aux=matr[i][j];
                                                                       matr[i][j]=matr[i][j+1];
                                                                       matr[i][j+1]=aux;
                                                                       }
                                           }
                          }
                                           
         printf("\nLa matrice ordinata %c la seguente:\n",138);
         for(i=0;i<r;i++){
                          printf("|");
         for(j=0;j<c;j++){
                          printf(" %d ",matr[i][j]);
                          }
                          printf("|\n");
                          }
                          printf("\n");
         
    }

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    j++ modifica il valore di j, j+1 no
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    106
    Ok grazie e riguardo l'ordinamento della matrice nel modo che ho fatto adesso mi ordina tutta la matrice non solo le righe...come faccio a fare in modo che ordina solo le righe e non tutta la matrice? Grazie ancora.

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Che vuoi dire con "tutta la matrice" e "solo le righe"?

    Fammi un esempio pratico di una matrice 3x3
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    106
    OK allora facendo in quel modo che ti ho postato succede questo:
    Matrice originale:
    | 6 3 7 |
    | 3 7 6 |
    | 7 6 3 |

    A me succede questo:
    | 3 3 3 |
    | 6 6 6 |
    | 7 7 7 |

    Invece vorrei che succedesse questo:
    | 3 6 7 |
    | 3 6 7 |
    | 3 6 7 |

    Come faccio????

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.