[C] ordinamento da file
Salve ha tutti, ho un grosso problema non riesco a fare un programma che ordini dei dati presi da un file.txt, ho provato ha buttare giu un codice se avete dei suggerimenti li accetto volentieri:
MI sono anche bloccato nella main.....
/***********************************************/ /* Programma per l'ordinamento di dati da file */ /***********************************************/ /*****************************/ /* Inclusione delle librerie */ /*****************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> /************************/ /* Definizione dei tipi */ /************************/ typedef struct persona { char cognome [10]; int matricola [4]; int voto [2];} persona_t; /********************************/ /* Dichiarazione delle funzioni */ /********************************/ void qsort(); /******************************/ /* Definizioni delle funzioni */ /******************************/ void qsort(const char *p, const char a, const char b) { char i; char j; char pivot; if (a strcmp b) { i=a; j=b; pivot=p[(a+b)/2]; while (a[i] strcmp pivot) i++; while (a[j] strcmp pivot) j--; if (i <= j){ swap( &p[i], &p[j] ); i++; i--; } qsort(p,a,j); qsort(p,i,b); } } void main(){ int n FILE *cognome, *matricola, *voto; /* Aprire il file */ file_DB = fopen("DB.txt", "r"); printf("Digita 1 se vuoi ordinare in base alla chiave primaria (Cognome), digita 2 se vuoi ordinare con le chiavi secondarie (Matricola, voto): "); scanf("%d", &n); if (n==1)
MI sono anche bloccato nella main.....

Risposte
Un problema è senz'altro che hai chiamato una tua funzione come una funzione di libreria contenuta in stdlib... che presumo faccia la stessa cosa...
Comincia con il rinominarla...
Per il main non capisco dove sia il problema... In ogni caso avrai bisogno di un puntatore per poter costruire un array dinamico.
Comincia con il rinominarla...
Per il main non capisco dove sia il problema... In ogni caso avrai bisogno di un puntatore per poter costruire un array dinamico.
"vict85":
Un problema è senz'altro che hai chiamato una tua funzione come una funzione di libreria contenuta in stdlib... che presumo faccia la stessa cosa...
Comincia con il rinominarla...
Cioè?
ho modificato qualcosa..... ma per il discorso della qsort... non ho capito bene...
/***********************************************/ /* Programma per l'ordinamento di dati da file */ /***********************************************/ /*****************************/ /* Inclusione delle librerie */ /*****************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> /************************/ /* Definizione dei tipi */ /************************/ typedef struct persona { char cognome [10]; unsigned int matricola; unsigned int voto; } persona_t; /********************************/ /* Dichiarazione delle funzioni */ /********************************/ void qsort(); /******************************/ /* Definizioni delle funzioni */ /******************************/ void qsort(const char *p, const char a, const char b) { char i; char j; char pivot; if (strcmp(a,b) < 0) { strcpy(i,a); strcpy(j,b); pivot=p[(a+b)/2]; while (strcmp(a[i],pivot) < 0 ) i++; while (strcmp(a[j],pivot) > 0) j--; if (i <= j){ swap( &p[i], &p[j] ); i++; i--; } qsort(p,a,j); qsort(p,i,b); } } void main(){ int n FILE *cognome, *matricola, *voto; /* Aprire il file */ file_DB = fopen("DB.txt", "r"); printf("Digita 1 se vuoi ordinare in base alla chiave primaria (Cognome), digita 2 se vuoi ordinare con le chiavi secondarie (Matricola, voto): "); scanf("%d", &n); if (n==1){ fscanf(cognome, "%s", &persona_t); qsort(*cognome); printf("Ordninamento in chiave primaria: %s\n", cognome); } else (n==2){ fscanf(matricola, "%d" &persona_t); qsort(*matricola); printf("Ordinamento in chiave secondaria: %d\n", matricola); } fclose(file_DB); return(0); }
yoghi nn preoccuparti prendi pure qualke spunto da me, se nn l'avrai già fatto, come dice segio, ma ti ricordo ke quella implementazione è fatta in modo da essere risolta con gli array...e nn con liste, alberi o grafi...!!!...buon lavoro...ciao
non hai specificato in che formato sono memorizzati i dati nel file...supponiamo che Nome Matricola Voto siano separati da uno spazio allora se non conosci a priori il numero di righe del file o estrai i vari record e li metti in una lista oppure prima scorri il file, conta quanti record ci sono e poi allochi dinamicamente un vettore di record e alla fine ordini i record in base al nome o alla mat o al voto...
"yoghi87":
ho modificato qualcosa..... ma per il discorso della qsort... non ho capito bene...
Nel C non c'è l'overloading di funzioni e quindi non puoi chiamare due funzioni con lo stesso nome. Nel C++ potresti farlo dato che il tuo qsort non ha gli stessi argomenti della qsort.
P.S: ma dividere definizione e dichiarazione serve solo se la definizione non segue la dichiarazione... Cioè se la definizione è messa sotto il main.