Funzione ordinamento matrice

di il
4 risposte

Funzione ordinamento matrice

Ragazzi,mi serve un aiutino con una funzione che dovrebbe ordinare una matrice in ordine decrescente rispetto alla somma delle righe.Il codice che ho provato è questo:

void MaxSommaRighe(int Matrice[][Max_colonne],int n_riga,int n_colonna)
{
while(){
for(int i=0;i<n_riga;i++)
{
   if(Sommarighe[i]<Sommarighe[i+1])
   {
      for(int j=0;j<n_colonna;j++)
      {   int tmp;

          tmp=Matrice[i][j];
         Matrice[i][j]=Matrice[i+1][j];
         Matrice[i+1][j]=tmp;

      }

   }

}
}
}
Tralasciate un attimo il while senza condizione.
Inizialmente avevo provato con i due soli cicli for e ovviamente non ha funzionato,visto che in questo modo c'è un confronto solo tra righe adiacenti e non avrei quindi modo di sapere se due righe scambiate in precedenza siano nell'ordine giusto.Per questo avevo pensato ad un ciclo while che racchiudesse i due for,che quindi ripetesse le istruzioni finchè la matrice non fosse realmente in ordine.Tuttavia sorgono due problemi:
1° non sono riuscito a pensare ad una condizione di uscita per il while...avevo pensato che visto che se la matrice è ordinata l'if non è mai verificato,potrei mettere un else che prevede l'aumento di una variabile contatore e porre come condizione di uscita l'uguaglianza di tale variabile con il numero di righe - 1(azzerandola ogni volta che si entrava nel while);tuttavia l'idea(oltre ad essere un tantino artificiosa..xD) non funziona...
2°Volendo verificare se il ragionamento di fondo fosse esatto ho voluto provare ad usare un terzo ciclo for che ripetesse una sola volta le istruzioni,poichè nel mio caso sarebbe bastata una sola iterazione,eppure la matrice non si è ordinata...:S
(per farvi capire,avevo una matrice del tipo:
1 2 3 4
5 6 7 8
9 10 11 12
Dopo i due for diventa ==>

5 6 7 8
9 10 11 12
1 2 3 4

Quindi la prima riga è riuscita ad arrivare al posto giusto,ma non potendo confrontare la seconda con la prima non è possibile ordinarla nel modo corretto con solo due cicli(almeno credo..xD).Però sarebbe dovuto bastare una semplice ripetezione del codice per arrivare al risultato voluto...perchè rimane invariata??:S

Ah quasi dimenticavo..xD,Sommarighe era stata calcolata in precedenza e sono sicuro della sua correttezza.

4 Risposte

  • Re: Funzione ordinamento matrice

    Ciao,
    se ho capito bene, quello che vuoi fare è una specie di bubble sort sulle righe. Si può fare benissimo: ti posto una sorta di pseudo-codice
    
    bool ricontrollare = true;
    while(ricontrollare)
    {
        ricontrollare = false;
        for(ciclo_sulle_righe)
        {
            if(somma_di_questa < somma_della_prossima)
            {
                     < scambio le righe >
                     ricontrollare = true;
            }
        }
    }
    
  • Re: Funzione ordinamento matrice

    Ok,forse sono stato un po frettoloso a postare la domanda..xD
    Mi sono accorto dell'errore...io scambiavo le righe,ma non i valori del vettore sommarighe,di conseguenza quando andavo a ripetere i due cicli for,mi andava a confrontare i valor della sommarighe vecchia...quindi mi è bastato aggiungere due righe:
    tmp=Matrice[j];
    Matrice[j]=Matrice[i+1][j];
    Matrice[i+1][j]=tmp;
    tmp1=Sommarighe;
    Sommarighe=Sommarighe[i+1];
    Sommarighe[i+1]=tmp1;

    Eheh sono stato un po frettoloso xD

    Cmq proverò a fare anche come tu mi hai suggerito,grazie ^^
  • Re: Funzione ordinamento matrice

    Se dovesse interessare, lascio qui una realizzazione con il metodo che avevo proposto.
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define bool int
    #define FALSE 0
    #define TRUE !FALSE
    #define RIGHE 3
    #define COLONNE 4
    
    int matrice[RIGHE][COLONNE]= {{1, 2, 3, 4}, {5, 6, 7, 8}, {0, 0, 1, 2}};
    
    int somma_riga(int riga)
    {
        int i, somma = 0;
        for(i=0; i<COLONNE; i++)
        {
            somma += matrice[riga][i];
        }
        return somma;
    }
    
    void scambia_righe(int prima, int seconda)
    {
        int appoggio;
        int i;
        for(i=0; i<COLONNE; i++)
        {
            appoggio = matrice[prima][i];
            matrice[prima][i] = matrice[seconda][i];
            matrice[seconda][i] = appoggio;
        }
    }
    
    void stampa_matrice()
    {
        int i, j;
        for(i=0; i<RIGHE; i++)
        {
            for(j=0; j<COLONNE; j++)
            {
                printf("%d  ", matrice[i][j]);
            }
            printf("\n");
        }
    }
    
    int main()
    {
        stampa_matrice();
    
        bool ricontrollare = TRUE;
        int i;
    
        while(ricontrollare)
        {
            ricontrollare = FALSE;
            for(i=0; i<RIGHE-1; i++)
            {
                /* per cambiare l'ordinamento (crescente
                o decrescente) basta modificare questa riga */
                if(somma_riga(i) < somma_riga(i+1))
                {
                    ricontrollare = TRUE;
                    scambia_righe(i, i+1);
                }
            }
        }
    
        printf("\n\n\n");
        stampa_matrice();
    
        return 0;
    }
    
  • Re: Funzione ordinamento matrice

    Gentilissimo
Devi accedere o registrarti per scrivere nel forum
4 risposte