Scambio righe matrice, secondo un criterio

di il
3 risposte

Scambio righe matrice, secondo un criterio

Buon pomeriggio, innanzi tutto un saluto a tutti. Ringrazio in anticipo gli amministratori del forum per il loro costante aiuto nei confronti di "noialtri" inesperti di programmazione; già in diverse occasioni ho trovato molto utili le argomentazioni e i suggerimenti riportati in questo forum. Tuttavia, per motivi di lavoro, mi sono imbattuto in una questione un po' spinosa per me e son qui per chiedere aiuto.
Premetto che, da (quasi) neolaureato in ingegneria, non ho molta dimestichezza con la programmazione, ma leggendo su libri e internet cerco di cavarmela! Quindi pregherei chiunque vorrà rispondere, di aver pazienza nell'esporre il suo contributo con la chiarezza che vi contraddistingue, non dando mai nulla per scontato.
Dunque, la posizione è la seguente: parto da un file txt di soli numeri (interi e decimali), distribuiti su un numero noto di colonne ma incognito di righe:

1	1	2	2	360	19.921013	5.533615
1	3	1	2	288	17.322231	6.014664
1	2	0	0	0	0.971580	0.000000
2	1	1	2	288	23.181135	8.049006
2	3	1	2	288	7.206733	2.502338
2	2	0	0	0	0.602330	0.000000
...	...	...	...	...	...		...
Il problema da risolvere è il seguente: tenendo fisso l'indice della prima colonna, riordinare le righe in modo da porre in ordine crescente gli indici della seconda colonna. Cioè in questo modo:

1	1	2	2	360	19.921013	5.533615
1	2	0	0	0	0.971580	0.000000
1	3	1	2	288	17.322231	6.014664
2	1	1	2	288	23.181135	8.049006
2	2	0	0	0	0.602330	0.000000
2	3	1	2	288	7.206733	2.502338
...	...	...	...	...	...		...
Cosa ho pensato di fare: immaginando fosse possibile scambiare tra loro le righe di una matrice secondo un determinato criterio, ho innanzi tutto allocato dinamicamente la matrice di numeri (facendo riferimento ad un'altra discussione presente sul forum):

#include <stdio.h>
#include <stdlib.h>
int conta_righe ();
float **malloc2dr(int max_r,int max_c);
void acquisisci_matrice(float **matrix,int max_r,int max_c,FILE*fp);

int main()
{
    float **matrix;
    int max_r, max_c;
    int i=0, j=0;
    max_c=7;
    FILE *fp;   														
    fp=fopen("dati.txt","r");
    if (fp==NULL)
	{
        printf("ERRORE: FILE NON TROVATO\n");
        return 0;
    }
    													
    											
    max_r = conta_righe ();    													
    matrix=malloc2dr(max_r,max_c);
	acquisisci_matrice(matrix,max_r,max_c,fp);		//allocazione dinamica
    fclose(fp);
    return 0;
}

int conta_righe ()
{
	
FILE *fp;										// FILE = nome predisposto dal sistema (struttura dati) per lavorare sui file , fp =nome della variabile (a scelta)
int max_r; 									// contatore che conta quante righe ci sono nel file
char str[255]; 									// Stringa di appoggio						
												
if ((fp = fopen("dati.txt", "r"))==NULL)				// Controllo se il file esiste 
	{
printf("ERRORE");
	}
	else
		{
		while((fgets(str,255,fp))!=NULL) 			// fgets usa NULL per vedere se la lettura e' andata a buon fine, quindi a fine di ogni riga
		max_r++;
		}
fclose(fp); 
return max_r; 									
}


float **malloc2dr(int max_r,int max_c)
{
    int i;
    float **matrix;
    												
    matrix=(float**)malloc(max_r*sizeof *matrix);		//allocazione dinamica del vettore di puntatori a interi
    
    for(i=0;i<max_r;i++)
	{								
        *(matrix+i)=(float*)malloc(max_c*sizeof(int));		//allocazione dinamica del vettore di interi
    }
    return matrix;
}

void acquisisci_matrice(float **matrix,int max_r,int max_c,FILE*fp)
{
    int i,j;
    for(i=0;i<max_r;i++)
	{
        for(j=0;j<max_c;j++)
		{
            fscanf(fp,"%f",&matrix[i][j]);
            printf("%f ",matrix[i][j]);
        }
         printf("\n");
    }
}
A questo punto però mi sono piantato, ragionando con carta e penna sul da farsi. Molto probabilmente si dovrebbero innescare dei controlli tra gli elementi della matrice in seconda colonna accomunati dallo stesso indice di prima colonna, in modo tale da scambiare verso l'alto o verso il basso le righe della matrice. Per esempio: fissato l'indice di colonna 1 al valore 1, si confronta l'indice di colonna 2 con gli indici adiacenti (nella stessa colonna) e in base al risultato di tale confronto scambiare le righe opportune.
Mi trovo in difficoltà però nell'impostare il problema dal punto di vista della programmazione in C. Quindi, qualunque consiglio, dritta, suggerimento, esempio sarebbe ben gradito.
Vi ringrazio per la pazienza e la collaborazione.
N.B. : il valore massimo in seconda colonna non è detto che sia sempre 3 (come nei due casi riportati).

3 Risposte

  • Re: Scambio righe matrice, secondo un criterio

    Non è chiaro come devi ordinare: nell'esempio vedo in realtà ordini solo parzialmente sulla seconda colonna.
    Ad ogni modo, per l'ordinamento ti consiglio di utilizzare la qsort() fornendole in input una funzione che scriverai per testare gli array.
  • Re: Scambio righe matrice, secondo un criterio

    candaluar ha scritto:


    Non è chiaro come devi ordinare: nell'esempio vedo in realtà ordini solo parzialmente sulla seconda colonna.
    Ad ogni modo, per l'ordinamento ti consiglio di utilizzare la qsort() fornendole in input una funzione che scriverai per testare gli array.
    Intanto grazie per la tempestività!
    Si, essenzialmente il riordino deve avvenire esclusivamente sulla base dell'indice di seconda colonna, all'interno di ciascun sottogruppo di righe accomunato dallo stesso indice di prima colonna.
    Comunque, potresti essere più specifico quando parli di "funzione per testare gli array"? Grazie
  • Re: Scambio righe matrice, secondo un criterio

    La qsort si attende il puntatore ad una funzione che devi scrivere tu. Questa funzione de testare due elementi dell'array confrontandoli tra lori e deve restituire un risultato.

    Per i dettagli studia la documentazione della qsort
Devi accedere o registrarti per scrivere nel forum
3 risposte