[RISOLTO]Ordinamento matrice rispetto a una colonna?!

di il
45 risposte

[RISOLTO]Ordinamento matrice rispetto a una colonna?!

Salve, mi servirebbe un aiuto su questo particolare tipo di problema. In pratica richeide : Ordina le righe della matrice in modo che l’ultima colonna risulti ordinata in senso crescente. Se devo ordinare la matrice o un vettore non ho problemi, ma se devo ordinare rispetto a qualcosa si, ad esempio in questo caso rispetto all'ultima colonna. matrice originale: (nella matrice da creare c'è una colonna in più, si deve aggiugere la media, ma ho già risolto per questo). Nel codice come ripotarto,fatto da me, riesco ad ordinare in modo crescente l'ultima colonna, ma non "si spostano le righe", invece quest'ultime dovrebbero cambiarsi di ordine appunto in base all 'ordinamento della colonna. N.B la matrice matrix già contiene ogni riga ordinata, ad esempio: 0 1 2 3,
2 3 6 7 e cosi via

0 2.4 3 4 0

3 0 5 10 2

1 0 2 1 3

8 0 0 0 0

matrice da creare:

0 1 1 1.4 2 3

0 0 1.8 2.4 3 4

0 0 0 0 1.6 8

0 2 3 4 5 10

int temp;
    for(int i=0;i<r-1;i++)
    {
        for(int j=i+1;j<r;j++)
        {
            if(matrix[i][c-1]>matrix[i+1][c-1])
            {
                temp=matrix[i][c-1];
                matrix[i][c-1]=matrix[i+1][c-1];
                matrix[i+1][c-1]=temp;

            }
        }
    }
     for(int i=0;i<r;i++)
    {
        printf("\n");
        for(int j=0;j<c;j++)
        {
           printf(" %d ",matrix[i][j]);
        }
    }

45 Risposte

  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Gentilmente, posta tutto il codice. Già così faccio fatica a capire.
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    antragorn ha scritto:


    Gentilmente, posta tutto il codice. Già così faccio fatica a capire.
    Ciao,se è necessario lo posto,ma a me interessava solo capire come ordinare una genirica matrice rispetto all'ultima colonna, cioè solo quella parte di algoritmo.
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Scrivi il codice che ordina correttamente una colonna e poi amplialo in seguito scambiando le intere righe al posto del singolo elemento
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    oregon ha scritto:


    Scrivi il codice che ordina correttamente una colonna e poi amplialo in seguito scambiando le intere righe al posto del singolo elemento
    Ciao grazie della risposta. Il codice che ho scritto va bene per ordinare una colonna? Perchè si mi ordina solo l'ultima, ma appunto poi non so come ampliare per "fargli portare dietro" le rispettive righe
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Pensa questo:
    una riga è "attraversata" da tante colonne
    tu ordini solo l'ultima, forse è il caso che pensi a come fare la stessa cosa anche alle precedenti
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    StandardOil ha scritto:


    Pensa questo:
    una riga è "attraversata" da tante colonne
    tu ordini solo l'ultima, forse è il caso che pensi a come fare la stessa cosa anche alle precedenti
    Ma così facendo ordino anche le altre colonne o no? Invece a me serve ordinare tutto rispetto all'ultima tipo:
    4 5 2
    2 3 1
    7 8 0

    7 8 0
    2 3 1
    4 5 2
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Devi dividere tra loro i lavori
    già non è propriamente bello che stampi nella stessa parte di codice dove ordini, o ordini o stampi
    ma se ci pensi per ordinare tu fai due cose:
    1) trovi il maggiore
    2) eventualmente scambi tra loro ..........

    io ti consiglio di passare per una funzione ausiliaria, che ti permetta di ordinare (e basta)
    poi ognuno scrive come preferisce.........
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Che è quasi esattamente come ti ho detto, ma mi lascia un dubbio
    funziona?
    anche per matrici di 3 o più colonne?
    hai provato esaustivamente?
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Che fine ha fatto il tuo post, al quale rispondevo?
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    StandardOil ha scritto:


    Che fine ha fatto il tuo post, al quale rispondevo?
    Si, l'avevo eliminato perchè appunto non funziona per matrici con più di 3 colonne e non capisco come mai, ma ripropongo
    
    int temp;
     int flag;
    
     int temp2;
        for(int i=0;i<r-1;i++)
        {
            for(int j=i+1;j<r;j++)
            {
                flag=0;
                if(mat[i][c-1]>mat[i+1][c-1])
                {
                    temp=mat[i][c-1];
                    mat[i][c-1]=mat[i+1][c-1];
                    mat[i+1][c-1]=temp;
                    flag=1;
                    if(flag==1)
                    {
                    temp2=mat[i][c-1-j];
                    mat[i][c-1-j]=mat[i+1][c-1-j];
                    mat[i+1][c-1-j]=temp2;
                    }
    
                }
            }
        }
    
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Pensaci al perchè non funziona,
    quanti scambi fai?
    e quanti scambi servono per N colonne?

    casomai ci risentiamo dopo cena
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    StandardOil ha scritto:


    Pensaci al perchè non funziona,
    quanti scambi fai?
    e quanti scambi servono per N colonne?

    casomai ci risentiamo dopo cena
    Facendo così funziona, credo di aver risolto
    
     int temp;
    int s=0;
        for(int i=0;i<r-1;i++)
        {
            for(int j=i+1;j<r;j++)
            {
    
                if(mat[i][c-1]>mat[i+1][c-1])
                {
                    while(s<c){
                    temp=mat[i][c-1-s];
                    mat[i][c-1-s]=mat[i+1][c-1-s];
                    mat[i+1][c-1-s]=temp;
                    s++;
                    }
                    s=0;
                }
            }
        }
        stampa(mat,r,c);
    
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Ultimo00 ha scritto:


    antragorn ha scritto:


    Gentilmente, posta tutto il codice. Già così faccio fatica a capire.
    Ciao,se è necessario lo posto,ma a me interessava solo capire come ordinare una genirica matrice rispetto all'ultima colonna, cioè solo quella parte di algoritmo.
    Sono uno studente, non volevo impossessarmi di nessun codice. Lo dicevo perché sto cercando di dare un contributo alla comunità e non limitarmi solo a chiedere aiuto quando un esercizio "non mi esce". E non capendo al volo come gli altri ti ho chiesto il codice. Tutto qui.

    Cmq a me, il tuo ultimo algoritmo non funziona e non capisco bene perché non capendo bene tutte le variabili che hai utilizzato.
    Io cmq ho risolto così:

    Questo l'algoritmo:
       for (i=0; i<9; i++){
    		for (j=0; j<9; j++){
    			if (mat[j][9]>mat[j+1][9]) {
    				tmp=mat[j][9]; 
    				mat[j][9]=mat[j+1][9];
    				mat[j+1][9]=tmp;
    				
    	}}}
    	
    Questo tutto il codice (pieno di variabili che non servono e printf che mi aiutano a "seguire" il programma).
    //Autore
    #include <stdio.h>
    main()
    {
    int temp=0;
    int tmp=0;
    int r=10;
    int i;
    int j;
    int c=10;
    int mat[r][c];
    int s=0;
    
    for(i=0; i<10; i++)
    for(j=0; j<10; j++)
    mat[j][i]=i+(j*10);
    
    
    mat[0][9]=996;
    mat[1][9]=997;
    mat[7][6]=998;
    mat[2][9]=999;
    
    for(i=0; i<10; i++)
        {
            printf("\n");
    for(j=0; j<10; j++)
    printf("%5d ",mat[i][j]);
    }
    
    
    /*
        for(i=0;i<r-1;i++)
        {
            for(j=i+1;j<r;j++)
            {
    
                if(mat[i][c-1]>mat[i+1][c-1])
                {
                    while(s<c){
                    temp=mat[i][c-1-s];
                    mat[i][c-1-s]=mat[i+1][c-1-s];
                    mat[i+1][c-1-s]=temp;
                    s++;
                    }
                    s=0;
                }
            }
        }
       
     */
       
       for (i=0; i<9; i++){
    		for (j=0; j<9; j++){
    			if (mat[j][9]>mat[j+1][9]) {
    				tmp=mat[j][9]; 
    				mat[j][9]=mat[j+1][9];
    				mat[j+1][9]=tmp;
    				
    	}}}
    	
    	
    	
    	
    	
            printf("\n");        printf("\n");
    
    for(i=0; i<10; i++)
        {
            printf("\n");
    for(j=0; j<10; j++)
    printf("%5d ",mat[i][j]);
    }
    
    }
    
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Per antragorn:

    io ho provato, e quell'algoritmo funziona

    naturalmente ho dovuto costruirci intorno un main minimale
    eccolo:
    #include <stdio.h>
    #include <stdlib.h>
    #define r 3
    #define c 4
    int mat[r][c];
    
    
    
    void stampa(int * matrice, int righe, int colonne)
    {
       for(int i = 0; i < righe; i++)
       {
          printf("riga %d -> ", i);
    
          for(int j = 0; j < colonne; j++)
          {
             printf("%2d ", * (matrice + i * colonne + j));
          }
    
          printf("\n");
       }
    }
    
    int main(int argc, char ** argv)
    {
       for(int i = 0; i < r; i++)
       {
          for(int j = 0; j < c; j++)
          {
             mat[i][j] = random() % 99;
          }
       }
    
       stampa((int *)mat, r, c);
       int temp;
       int s = 0;
    
       for(int i = 0; i < r - 1; i++)
       {
          for(int j = i + 1; j < r; j++)
          {
             if(mat[i][c - 1] > mat[i + 1][c - 1])
             {
                while(s < c)
                {
                   temp = mat[i][c - 1 - s];
                   mat[i][c - 1 - s] = mat[i + 1][c - 1 - s];
                   mat[i + 1][c - 1 - s] = temp;
                   s++;
                }
    
                s = 0;
             }
          }
       }
    
       stampa((int *)mat, r, c);
    }
    
    notrai che per non entrare troppo nei dettagli per la stampa sono passato per puntatori, per evitare di "star troppo a pensare"
    un consiglio per lo OP
    in futuro, non mettere spezzoni di programma che non compilano da soli, ammenocche non siano proprio cortissimi
    mi hai costetto a costruire un main apposta per collaudare il tuo programma, questa volta va bene ma in futuro non lo farò più

    fatto per fatto ormai posto la mia versione
    completamente parametrica, che può ordinare per qualsiasi colonna, una matrice con qualsiasi numero di righe e qualsiasi numero di colonne
    #include <stdio.h>
    #include <stdlib.h>
    #define RIGHE 5
    #define COLONNE 5
    
    void ordinamatrice(int * matrix, int r, int c, int colonna)
    {
       // ordina una matrice in ordine strettamente crescente
       // analizzando la colonna indicata in 4° parametro
       // occhio, nessun controllo di correttezza dell'input
       int temp = 0;
       int scambio = 0;
    
       do
       {
          scambio = 0;
    
          for(int i = 0; i < r - 1 ; i++)
          {
             if(*(matrix + i * c + colonna) > * (matrix + (i + 1)*c + colonna))
             {
                scambio = 1;
    
                for(int k = 0; k < c; k++)
                {
                   temp = * (matrix + i * c + k);
                   *(matrix + i * c + k) = *(matrix + (i + 1) * c + k);
                   *(matrix + (i + 1)*c + k) = temp;
                }
             }
          }
       }
       while(scambio);
    }
    void stampamatrice(int * matrix, int r, int c)
    {
       for(int i = 0; i < r; i++)
       {
          printf("\n");
    
          for(int j = 0; j < c; j++)
          {
             printf(" %2d ", *(matrix + i * c + j));
          }
       }
    }
    
    int main(int argc, char ** argv)
    {
       int * matrice = malloc(sizeof(int) * RIGHE * COLONNE);
    
       for(int i = 0 ; i < RIGHE * COLONNE; i++)
       {
          *(matrice + i) = random() % 99;
       }
    
       printf("Matrice originale:\n");
       stampamatrice(matrice, RIGHE, COLONNE);
       printf("\n\n");
    
       for(int i = 0;  i < COLONNE; i++)
       {
          ordinamatrice(matrice, RIGHE, COLONNE, i);
          printf("Matrice ordinata secondo colonna %d\n", i);
          stampamatrice(matrice, RIGHE, COLONNE);
          printf("\n\n");
       }
    
       printf("programma terminato\n");
    }
    
    ho usato pesantamente i puntatori, per poter usare matrici di ogni dimensione

    nella main ho usato una malloc per creare la matrice, e una serie di random per popolarla
    ma potete usare anche matrici statiche, provare per credere
Devi accedere o registrarti per scrivere nel forum
45 risposte