Algoritmo database

di il
2 risposte

Algoritmo database

Ciao a tutti sono nuovo... Avrei un problema cn un esercizio sugli algoritmi ed è questo:
Sia dato un semplice database che rappresenta un elenco di studenti che hanno sostenuto un esame.
Il database è organizzato sotto forma di file di testo su 3 colonne contenenti informazioni relative
a (Cognome, Matricola, Voto) come ad esempio:

COGNOME MATRICOLA VOTO
Bianchi 212 21
Rossi 128 30
Verdi 54 22

Scrivere un programma ANSI C che acquisisce il database da file, ne effettua un ordinamento
in base alla chiave primaria (Cognome) o alle chiavi secondarie (Matricola, Voto) sulla base della
scelta dell'utente e produce in uscita il database ordinato. L'ordinamento sulle chiavi secondarie
deve conservare l'ordine relativo prodotto dalla chiave primaria.

Io ho già un'implemantazione ma dovrei modificarla ci sto sbattendo da tempo ma nn ci riesco.. L'output può essere stampato a video nn è necessario su file..
Ecco il codice

/*****************************/
/* Inclusione delle librerie */
/*****************************/

#include <stdio.h>
#include <string.h>  
#include <stdlib.h>  

/****************************/
/* definizione di struttura */
/****************************/

struct archivio 
{

  char cognomi[20];
  int matricole;
  int voti;

};


/****************************************/
/* dichiarazione di funzione insertsort */
/****************************************/

void insertsort(int *,
                int);


/***********************************/
/* definizione della funzione main */
/***********************************/

int main()
{
FILE *file_archivio; /* puntatore al file di input */

struct archivio d[3], *p; /* input: struttura dati */


int matricola_1, /* output: matricole */
    matricola_2,
    matricola_3;

char cognome_1[20], /* output: cognomi */
     cognome_2[20],
     cognome_3[20];

int voto_1, /* output: voti */
    voto_2,
    voto_3;

int n = 3, i, m[3], v[3]; /* input: numero degli elementi array inizializzati */


/* Apertura del file contenente i dati */
file_archivio = fopen("archivio.csv", "r");


/* acquisizione dei 10 cognomi con rispettive matricole e voti */
fscanf(file_archivio, "\%s %d %d", cognome_1, &matricola_1, &voto_1);
fscanf(file_archivio, "\%s %d %d", cognome_2, &matricola_2, &voto_2);
fscanf(file_archivio, "\%s %d %d", cognome_3, &matricola_3, &voto_3);



/* assegnare ai campi delle strutture dichiarate i valori di fscanf */
strcpy(d[0].cognomi, cognome_1);
       d[0].matricole = matricola_1;
       d[0].voti = voto_1;

strcpy(d[1].cognomi, cognome_2);
       d[1].matricole = matricola_2;
       d[1].voti = voto_2;

strcpy(d[2].cognomi, cognome_3);
       d[2].matricole = matricola_3;
       d[2].voti = voto_3;


/*ciclo for per visualizzare gli elementi della struct */
for(p = d; p < d+3; ++p)
printf("%s %d %d\n", p->cognomi, p->matricole, p->voti);

/* associa a m[3] i valori matricole e gli indirizzi voti */
m[0] = matricola_1;
m[1] = matricola_2;
m[2] = matricola_3;

v[0] = voto_1;
v[1] = voto_2;
v[2] = voto_3;

/* ordinamento per matricola */
for(i = 0; i < n; ++i)
   
   fscanf(file_archivio, "\%d", m[i]);
   insertsort(m, n);

   for(i = 0; i < n; ++i)
       printf("\n%d\n", m[i]);

   return(0);
}

/* definizione di funzione: insertsort */
void insertsort(int a[],
int n)
{
  int valore_acquisito,
                     i,
                     j;

  for (i = 1;
     (i < n);
        i++)
  {
    for (valore_acquisito = a[i], j = i - 1;
        ((j >= 0) && (a[j] > valore_acquisito));
        j--)
        a[j + 1] = a[j];

    if (j+ 1 != i)
        a[j + 1] = valore_acquisito;
   }
}
Mi potete dare un aiuto o consigli su come fare???? Grazie 1000 a tutti!!!!!!!!

2 Risposte

  • Re: Algoritmo database

    Ciao, ho visto solo stasera il tuo post e quindi non so se ti è ancora utile la soluzione, ma siccome non
    c'era niente in tv ho provato lo stesso a risolvere il tuo problema...
    Ti allego il sorgente che dovrebbe ( se non ho capito male ) soddisfare la tua richiesta, anche se non ho
    capito bene cosa intendevi con la frase: " L'ordinamento sulle chiavi secondarie
    deve conservare l'ordine relativo prodotto dalla chiave primaria."
    Be eventualmente rivedi il sorgente e correggilo tu !

    Ciao!
        
    #include <stdio.h>
    #include <string.h> 
    #include <stdlib.h> 
    
     /****************************/
        /* definizione di struttura */
        /****************************/
    
    typedef struct tarchivio
    {
    	char cognomi[20];
    	int matricole;
    	int voti;
    } archivio ;
    
    
    //comparazione chiave primaria
    int cognomi_cmp(archivio const * rec1,archivio const * rec2)
    {
    	return strcmp(rec1->cognomi,rec2->cognomi);	
    }
    
    //comparazione chiave matricola
    int matricole_cmp(archivio const * rec1,archivio const * rec2)
    {
    	if ( rec1->matricole < rec2->matricole )
    		return -1;
    	if ( rec1->matricole > rec2->matricole )
    		return 1;
    	return 0;
    }
    
    //comparazione chiave voto
    int voti_cmp(archivio const * rec1,archivio const * rec2)
    {
    	if ( rec1->voti < rec2->voti )
    		return -1;
    	if ( rec1->voti > rec2->voti )
    		return 1;
    	return 0;
    }
    
    void stampa(archivio * db, int dim)
    {
    	printf("***\n");
    	for(int i=0; i<dim; i++)
    		printf("%s %d %d\n", db[i].cognomi, db[i].matricole, db[i].voti);
    	printf("\n");
    }
    
    const int ARCHIVIO_SIZE = 3;
    
    /***********************************/
    /* definizione della funzione main */
    /***********************************/
    int main(int argc, char* argv[])
    {
       FILE *file_archivio; /* puntatore al file di input */
    
        archivio d[ARCHIVIO_SIZE], *p; /* input: struttura dati */
    
    
        int matricola_1, /* output: matricole */
            matricola_2,
            matricola_3;
    
        char cognome_1[20], /* output: cognomi */
             cognome_2[20],
             cognome_3[20];
    
        int voto_1, /* output: voti */
            voto_2,
            voto_3;
    
        int n = ARCHIVIO_SIZE; /* input: numero degli elementi array inizializzati */
    
    
        /* Apertura del file contenente i dati */
        file_archivio = fopen("archivio.csv", "r");
    
    
        /* acquisizione dei 10 cognomi con rispettive matricole e voti */
        fscanf(file_archivio, "%s %d %d", cognome_1, &matricola_1, &voto_1);
        fscanf(file_archivio, "%s %d %d", cognome_2, &matricola_2, &voto_2);
        fscanf(file_archivio, "%s %d %d", cognome_3, &matricola_3, &voto_3);
    
    
        /* assegnare ai campi delle strutture dichiarate i valori di fscanf */
        strcpy(d[0].cognomi, cognome_1);
               d[0].matricole = matricola_1;
               d[0].voti = voto_1;
    
        strcpy(d[1].cognomi, cognome_2);
               d[1].matricole = matricola_2;
               d[1].voti = voto_2;
    
        strcpy(d[2].cognomi, cognome_3);
               d[2].matricole = matricola_3;
               d[2].voti = voto_3;
    
    
        /*ciclo for per visualizzare gli elementi della struct */
        for(p = d; p < d+ARCHIVIO_SIZE; ++p)
    		printf("%s %d %d\n", p->cognomi, p->matricole, p->voti);
    
    
    	char scelta = argv[1][1]; //supponendo i parametri -c, -m, -v
    
    	switch (scelta)
    	{
    		case 'c':
    			qsort(d,ARCHIVIO_SIZE,sizeof(archivio),(int (*)(void const *,void const *))cognomi_cmp);
    			stampa(d,n);
    		break;
    		case 'm':
    			qsort(d,ARCHIVIO_SIZE,sizeof(archivio),(int (*)(void const *,void const *))matricole_cmp);		
    			stampa(d,n);
    		break;
    		case 'v':
    			qsort(d,ARCHIVIO_SIZE,sizeof(archivio),(int (*)(void const *,void const *))voti_cmp);		
    			stampa(d,n);
    		break;
    	}
    
    	return(0);
    }
    
  • Re: Algoritmo database

    Ciao Beri75 ti ringrazio tantissimo per il tuo aiuto, purtroppo la consegna del progetto è già scaduta, ma nn preoccuparti apprezzo lo stesso il tuo aiuto vedrò di sistemarlo lo stesso il codice nel tempo libero appena ho concluso gli altri esami....
    Grazie 1000....

    Ciao!
Devi accedere o registrarti per scrivere nel forum
2 risposte