[RISOLTO]Ordinamento matrice rispetto a una colonna?!

di il
45 risposte

45 Risposte - Pagina 2

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

    StandardOil ha scritto:


    Per antragorn:
    io ho provato, e quell'algoritmo funziona
    Non so che dirti...
    Cmq entrambi i tuoi codici non girano ma in questo caso, a mio avviso, dipende da qualche settaggio. Tra gli errori mi dice infatti:
    [Error] 'for' loop initial declarations are only allowed in C99 mode
    [Note] use option -std=c99 or -std=gnu99 to compile your code
    [Error] 'for' loop initial declarations are only allowed in C99 mode
    e cose così. Si blocca su for(int i = 0; i < r - 1 ; i++)

    Cmq a parte questo che mi sembra, ripeto, qualcosa legato al settaggio (che brutta parola) del DEV C++ non capisco due cose di quelle che mi hai scritto (e che apprezzo tantissimo):
    1)
    notrai che per non entrare troppo nei dettagli per la stampa sono passato per puntatori, per evitare di "star troppo a pensare"
    Non capisco perché! Non è più comoda una stampa come quelal che faccio io? Tipo:
    for(i=0; i<10; i++)
        {
            printf("\n");
    for(j=0; j<10; j++)
    printf("%5d ",mat[i][j]);
    2) Cos'è questo?
     printf("%2d ", * (matrice + i * colonne + j));
    La stampa a video di un intero che proviene da un puntatore di qualcosa che non capisco?
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Domani...
    Stasera troppo tardi
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Raga ma buttatelo via sto benedetto DEV-C++. C'è un motivo se l'hanno abbandonato. Che senso ha imparare a guidare su una macchina rotta?

    Comunque c'è scritto cosa devi fare per farlo compilare: imparare a impostare le flag del compilatore è una delle cose che bisogna imparare a fare prima o poi
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Non entro nel merito di dev-c++ , non ne ho le competenze
    Io uso geany come IDE sotto Linux Ubuntu, compilatore gcc

    La possibilità di inizializzare variabili ovunque serva, in particolare dentro ad un for mi sembra che venga proprio dall'edizione 1999 del linguaggio,

    Se antragorn ha interesse può spostare l'inizializzazione delle variabili all'inizio della funzione, come in 'C' storico
    Però capire come impostare l'uso del C99 (almeno) se non C18 secondo me serve (anche a me peraltro)

    Invece per la domanda esplicita:

    Come fai tu è più semplice ma meno flessibile
    Mi spiego:
    Se tu passi per una funzione per stampare la matrice tale funzione deve per forza avere un prototipo del tipo
    
    void stampa(int matrice[][3])....)
    Se provi a non specificare il secondo indice non compila
    Lascio a te lo studio del perché
    Se non puoi fare così usi alcune particolarità del C

    1
    Gli tutti gli elementi di un array sono scritti impaccati uno dopo l'altro (garantito da K&R)
    2
    Alle funzioni viene passato non l'array ma il puntatore all'array
    3
    Aggiungere uno ad un puntatore non lo fa puntare al byte successivo ma all'elemento successivo, qualunque sia la dimensione dell'elemento

    Quindi io in stampa ricevo un puntatore
    Conoscendo riga, colonna e dimensioni dello array calcolo il puntatore
    Uso il valore calcolato per accedere direttamente all'elemento

    E funziona per qualunque array bidimensionale (anche tri o poli)
    Sia esso statico, VLA o allocato dinamicamente

    Puoi usare questa caratteristica anche per leggere bidimensionale un array mono o poli dimensionale
    Purché il numero di elementi non cambi, puoi leggere un array di 4 come un 2x2 oppure un 16 come 4x4 2x8 2x2x4 2x2x2x2,
    Sono stato chiaro?
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    antragorn ha scritto:


    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]);
    }
    
    }
    
    Ma no figurati ahahah,chiedevo solo perchè il codice completo non era commentato ed era scritto un pò a cavolo, quindi magari sarebbe risultato difficile da capire. Comunque grazie mille della risposta, il tuo algoritmo risulta anche più semplice del mio,utilizzerò quello!
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    StandardOil ha scritto:


    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
    Grazie mille davvero!
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    StandardOil ha scritto:


    ...
    E funziona per qualunque array bidimensionale (anche tri o poli)
    Sia esso statico, VLA o allocato dinamicamente
    ...
    In caso di array multidimensionali allocati dinamicamente non credo proprio!
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Sicuro?

    Hai visto il mio main di prova?

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

    Gli array sparsi in memoria non godono di quella proprietà... possono stare ovunque quindi se allochi dinamicamente non funziona. Occhio
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Cosa state dicendo?

    malloc restituisce un (1) puntatore, quindi un (1) solo blocco di memoria, quindi memoria contigua

    che sia in testa, in fondo in mezzo, nello heap, nello stack o dove gli pare non cambia che è contigua e che l'aritmetica dei puntatori continua a funzionare
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Nippolo ha scritto:


    In caso di array multidimensionali allocati dinamicamente non credo proprio!
    Quello nel main è un array monodimensionale.
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Che viene stampato bi-dimensionale......... esattamente come ho detto io

    scusa, ma a che gioco stiamo giocando?
    gli array mono-bi tri poli dimensionali, statici, VLA o ottenuti con una malloc sono sempre contugui e ordinati con l'ultimo indice che corre più veloce
    quindi sempre si possono trattare come un array con un differente numero di "dimensioni" (purchè il numero degli "elementi" non cambi)
    se concordiamo su questo la tua obiezione non ha senso (e non offendo la tua intelligenza spiegandoti perché)
    se non concordiamo.......
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    o ottenuti con una malloc sono sempre contugui
    Non è vero per quelli non monodimensionali
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    #include <stdio.h>
    #include <stdlib.h>
    
    #define RIGHE 2
    #define COLONNE 5
    
    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 **m = (int**)malloc(RIGHE * sizeof(int*));
       for(unsigned int i = 0; i < RIGHE; ++i)
       {
           m[i] = (int*)malloc(COLONNE * sizeof(int));
           for(unsigned int j = 0; j < COLONNE; ++j)
           {
               m[i][j] = i * COLONNE + j;
           }
       }
       stampamatrice(m[0], RIGHE, COLONNE);
    }
  • Re: [RISOLTO]Ordinamento matrice rispetto a una colonna?!

    Nippolo ha scritto:


    #include <stdio.h>
    #include <stdlib.h>
    
    #define RIGHE 2
    #define COLONNE 5
    
    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 **m = (int**)malloc(RIGHE * sizeof(int*));
       for(unsigned int i = 0; i < RIGHE; ++i)
       {
           m[i] = (int*)malloc(COLONNE * sizeof(int));
           for(unsigned int j = 0; j < COLONNE; ++j)
           {
               m[i][j] = i * COLONNE + j;
           }
       }
       stampamatrice(m[0], RIGHE, COLONNE);
    }
    Ok questo può generare un array sparso. Ma la malloc unica è garantita contigua. Almeno così è negli os che ho controllato
Devi accedere o registrarti per scrivere nel forum
45 risposte