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).