Ragazzi, chiedo aiuto per questa "particolare funzione". La traccia del mio progetto è questa:
Gestione di un centro sportivo.
Archivi da creare:
· Corsi
· soci
· Iscrizioni e relativi pagamenti
· Ingressi al centro (orario di entrata ed uscita del socio)
Al momento dell’ingresso al centro, occorre verificare se il socio è in regola coi pagamenti.[/i][/u]
Ho creato gli archivi richiesti dalla traccia, ma non so assolutamente fare quel pezzo della traccia. Necessito di un aiuto per implementarla.
Allego il codice di riferimento:
INGRESSI
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define max 20
struct Ingressi
{
int numero;
char nome[20];
char cognome[20];
char data_ingresso[20];
char ora_ingresso[20];
char ora_uscita[20];
int cancellato;
};
struct Indice
{
char chiave[30];
int valore;
};
struct IndiceCodice
{
int chiave;
int valore;
};
int RicercaBin(char i[],int n,int searched,int *inIndice);
void OrdinaIndiceCodici(IndiceCodice in[],int n);
void crea_fileingressi();
void apri_fileingressi();
void inserisci_ingresso();
void visualizzaIngresso(Ingressi e);
void modifica_ingresso();
void elimina_ingresso();
int cerca_ingresso();
void leggi_fileingressi();
char ingressoAperto[20];
char indiceAperto[20];
char indiceCodiciAperto[20];
int main()
{
int scelta;
strcpy(ingressoAperto,"VUOTO");
strcpy(indiceCodiciAperto,"VUOTO");
do
{
system("CLS");
printf("\t AREA INGRESSI AL CENTRO \t\n\n");
printf("\t1- Crea nuovo file ingressi\n");
printf("\t2- Apri file ingressi\n");
printf("\t3- Inserisci ingresso\n");
printf("\t4- Modifica ingresso\n");
printf("\t5- Cancella ingresso\n");
printf("\t6- Cerca ingresso\n");
printf("\t7- Visualizza file ingressi\n");
printf("\t8- Esci dal programma\n");
printf("\nCosa vuoi fare? : ");
scanf("%d", &scelta);
int e1;
switch(scelta)
{
case 1:
crea_fileingressi();
break;
case 2:
apri_fileingressi();
break;
case 3:
inserisci_ingresso();
break;
case 4:
modifica_ingresso();
break;
case 5:
elimina_ingresso();
break;
case 6:
e1 = cerca_ingresso();
if(e1 == -1)
{
printf("\nIngresso non trovato\n");
}
break;
case 7:
leggi_fileingressi();
break;
}
system("PAUSE");
}while(scelta != 8);
return 0;
}
void OrdinaIndiceCodici(IndiceCodice in[],int n)
{
IndiceCodice temp;
int top;
int scambio;
int ultimoscambio;
int i;
top = 0;
do
{
scambio = 0;
for(i = n-1;i > top; i--)
{
if(in[i].chiave < in[i - 1].chiave)
{
temp = in[i];
in[i] = in[i - 1];
in[i - 1] = temp;
scambio = 1;
ultimoscambio = i;
}
}
top = ultimoscambio;
}while(scambio != 0);
}
int RicercaBin(char i[],int n,int cercato,int *inIndice)
{
int left = 0;
int mid;
int right = n-1;
FILE *indice;
indice = fopen(i,"rb");
do
{
mid = (left + right)/2;
IndiceCodice x;
fseek(indice,mid * sizeof(IndiceCodice),0);
fread(&x,sizeof(IndiceCodice),1,indice);
if(cercato == x.chiave)
{
//esci = 1;
*inIndice = mid;
fclose(indice);
return x.valore; //restituisco la posizione nel file corso
}
else
{
if(cercato > x.chiave)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
}while(left <= right);
*inIndice = -1;
return -1;
}
void crea_fileingressi()
{
system("CLS");
FILE *f;
char nomeFile[20];
char nomeIndice[20];
char nomeIndiceCod[20];
printf("Inserire il nome del file: ");
scanf("%s", &nomeFile);
Ingressi e;
strcpy(e.nome,"VUOTO");
strcpy(e.cognome,"VUOTO");
strcpy(e.data_ingresso,"VUOTO");
strcpy(e.ora_ingresso,"VUOTO");
strcpy(e.ora_uscita,"VUOTO");
e.numero = -1;
e.cancellato = 1;
strcpy(nomeIndice,nomeFile);
strcat(nomeIndice,".txt");
strcpy(nomeIndiceCod,nomeIndice);
strcat(nomeIndiceCod,"e");
strcat(nomeFile,".date");
f = fopen(nomeFile,"rb");
if(f == NULL)
{
fclose(f);
f = fopen(nomeFile,"wb");
int i;
for(i=0;i<max;i++)
{
fwrite(&e,sizeof(Ingressi),1,f);
}
fclose(f);
printf("File scritto correttamente!\n");
FILE *indice;
Indice x;
strcpy(x.chiave,"VUOTO");
indice = fopen(nomeIndice,"wb");
for(i=0;i<max;i++)
{
x.valore = i;
fwrite(&x,sizeof(Indice),1,indice);
}
fclose(indice);
printf("File indice del corso scritto correttamente\n");
indice = fopen(nomeIndiceCod,"wb");
IndiceCodice y;
y.chiave = -1;
y.valore = -1;
for(i=0;i<max;i++)
{
fwrite(&y,sizeof(IndiceCodice),1,indice);
}
fclose(indice);
}
else
{
char s;
printf("File già esistente. Vuoi sovrascriverlo? (s/n): ");
scanf("%s", &s);
if(s == 's' || s == 'S')
{
f = fopen(nomeFile,"wb");
int i;
for(i=0;i<max;i++)
{
fwrite(&e,sizeof(Ingressi),1,f);
}
fclose(f);
printf("File scritto correttamente!\n");
FILE *indice;
Indice x;
strcpy(x.chiave,"VUOTO");
indice = fopen(nomeIndice,"wb");
for(i=0;i<max;i++)
{
x.valore = i;
fwrite(&x,sizeof(Indice),1,indice);
}
fclose(indice);
printf("File indice del corso scritto correttamente\n");
indice = fopen(nomeIndiceCod,"wb");
IndiceCodice y;
y.chiave = -1;
y.valore = -1;
for(i=0;i<max;i++)
{
fwrite(&y,sizeof(IndiceCodice),1,indice);
}
fclose(indice);
}
}
printf("Operazione completata\n");
}
void apri_fileingressi()
{
char nomeFile[20];
char nomeIndice[20];
char nomeIndiceCod[20];
FILE *f;
FILE *fI;
do
{
/**/
printf("Nome del file da aprire: ");
scanf("%s", &nomeFile);
strcpy(nomeIndice,nomeFile);
strcat(nomeIndice,".txt");
strcat(nomeFile,".date");
strcpy(nomeIndiceCod,nomeIndice);
strcat(nomeIndiceCod,"e");
f = fopen(nomeFile,"r+b");
if(f == NULL)
{
printf("Errore nell'apertura del file\n");
}
else
{
printf("File aperto correttamente!\n");
strcpy(ingressoAperto,nomeFile);
fI = fopen(nomeIndice,"r+b");
if(fI == NULL)
{
printf("Errore nell'apertura dell'indice\n");
}
else
{
strcpy(indiceAperto,nomeIndice);
printf("Indice Aperto correttamente!\n");
fclose(fI);
}
fI = fopen(nomeIndiceCod,"r+b");
if(fI == NULL)
{
printf("Errore nell'apertura dell'indice\n");
}
else
{
strcpy(indiceCodiciAperto,nomeIndiceCod);
printf("Indice Aperto correttamente!\n");
fclose(fI);
}
}
}while(f == NULL || fI == NULL);
fclose(f);
}
void inserisci_ingresso()
{
Ingressi e;
Ingressi eTemp;
FILE *fIng; //file corso
FILE *fInd; //file indice del corso
printf("Numero: ");
scanf("%d", &e.numero);
printf("Nome: ");
scanf("%s", &e.nome);
printf("Cognome: ");
scanf("%s", &e.cognome);
printf("Data: ");
scanf("%s", &e.data_ingresso);
printf("Ora di ingresso(HH:MM): ");
scanf("%s", &e.ora_ingresso);
printf("Ora di uscita(HH:MM): ");
scanf("%s", &e.ora_uscita);
e.cancellato = 0;
int cont = 0;
fIng = fopen(ingressoAperto,"r+b");
fread(&eTemp,sizeof(Ingressi),1,fIng);
while(eTemp.cancellato != 1)
{
fread(&eTemp,sizeof(Ingressi),1,fIng);
cont++;
}
int posInIngresso = cont;
fseek(fIng,cont * sizeof(Ingressi),0);
fwrite(&e,sizeof(Ingressi),1,fIng);
fclose(fIng);
Indice x;
Indice xTemp;
strcpy(x.chiave,e.cognome);
x.valore = e.numero;
fInd = fopen(indiceAperto,"r+b");
cont = 0;
fread(&xTemp,sizeof(Indice),1,fInd);
while(strcmp(xTemp.chiave,"VUOTO") != 0)
{
fread(&xTemp,sizeof(Indice),1,fInd);
cont++;
}
fseek(fInd,cont * sizeof(Indice),0);
fwrite(&x,sizeof(Indice),1,fInd);
fclose(fInd);
IndiceCodice y;
IndiceCodice yTemp;
y.chiave = e.numero;
y.valore = posInIngresso;
fInd = fopen(indiceCodiciAperto,"r+b");
cont = 0;
fread(&yTemp,sizeof(IndiceCodice),1,fInd);
while(yTemp.chiave != -1)
{
fread(&yTemp,sizeof(IndiceCodice),1,fInd);
cont++;
}
fseek(fInd,cont * sizeof(IndiceCodice),0);
fwrite(&y,sizeof(IndiceCodice),1,fInd);
fclose(fInd);
IndiceCodice ind[max];
fInd = fopen(indiceCodiciAperto,"rb");
int i;
for(i = 0; i < max; i++)
{
fread(&ind[i],sizeof(IndiceCodice),1,fInd);
}
fclose(fInd);
OrdinaIndiceCodici(ind,max);
fInd = fopen(indiceCodiciAperto,"wb");
for(i = 0; i < max; i++)
{
fwrite(&ind[i],sizeof(IndiceCodice),1,fInd);
}
fclose(fInd);
printf("Aggiornamento indici completato.\n");
}
void modifica_ingresso()
{
char cognome[20];
FILE *f;
Indice cognLetto;
printf("Cognome: ");
scanf("%s", &cognome);
f = fopen(indiceAperto,"r+b");
fread(&cognLetto,sizeof(Indice),1,f);
int posCogn = 0;
while(!feof(f) && strcmp(cognLetto.chiave,cognome) != 0)
{
fread(&cognLetto,sizeof(Indice),1,f);
posCogn++;
}
if(feof(f))
{
printf("\n\nIngresso non trovato\n\n");
fclose(f);
}
else
{
Indice x;
printf("Inserire nuovo cognome: ");
scanf("%s", &x.chiave);
x.valore = cognLetto.valore;
fseek(f,posCogn * sizeof(Indice),0);
fwrite(&x,sizeof(Indice),1,f);
fclose(f);
f = fopen(indiceCodiciAperto,"r+b");
int nellIndice;
int posizione = RicercaBin(indiceCodiciAperto,max,cognLetto.valore,&nellIndice);
if(posizione > -1)
{
f = fopen(ingressoAperto,"r+b");
fseek(f,posizione * sizeof(Ingressi),0);
Ingressi e;
fread(&e,sizeof(Ingressi),1,f);
visualizzaIngresso(e);
printf("\nInserire i nuovi dati: \n");
strcpy(e.cognome, x.chiave);
printf("\nNumero: ");
scanf("%d", &e.numero);
printf("\nNome: ");
scanf("%s", &e.nome);
printf("\nData ingresso: ");
scanf("%s", &e.data_ingresso);
printf("\nOra ingresso: ");
scanf("%s", &e.ora_ingresso);
printf("\nOra uscita: ");
scanf("%s", &e.ora_uscita);
e.numero = cognLetto.valore;
e.cancellato = 0;
fseek(f,posizione * sizeof(Ingressi),0);
fwrite(&e,sizeof(Ingressi),1,f);
fclose(f);
printf("\n\nIngresso aggiornato con successo\n");
}
else
{
printf("\n\nIngresso NON trovato\n\n");
fclose(f);
}
}
}
void elimina_ingresso()
{
char cognome[20];
FILE *f;
Indice cognLetto;
printf("Cognome: ");
scanf("%s", &cognome);
f = fopen(indiceAperto,"r+b");
fread(&cognLetto,sizeof(Indice),1,f);
int posCogn = 0;
while(!feof(f) && strcmp(cognLetto.chiave,cognome) != 0)
{
fread(&cognLetto,sizeof(Indice),1,f);
posCogn++;
}
if(feof(f))
{
printf("\n\nIngresso non trovato\n\n");
fclose(f);
}
else
{
Indice x;
strcpy(x.chiave,"VUOTO");
x.valore = posCogn;
fseek(f,posCogn * sizeof(Indice),0);
fwrite(&x,sizeof(Indice),1,f);
fclose(f);
f = fopen(indiceCodiciAperto,"r+b");
int nellIndice;
int posizione = RicercaBin(indiceCodiciAperto,max,cognLetto.valore,&nellIndice);
if(posizione > -1)
{
fseek(f,nellIndice * sizeof(IndiceCodice),0);
IndiceCodice k;
k.chiave = -1;
k.valore = -1;
fwrite(&k,sizeof(IndiceCodice),1,f);
fclose(f);
FILE *fInd;
IndiceCodice ind[max];
fInd = fopen(indiceCodiciAperto,"rb");
int i;
for(i=0;i<max;i++)
{
fread(&ind[i],sizeof(IndiceCodice),1,fInd);
}
fclose(fInd);
OrdinaIndiceCodici(ind,max);
fInd = fopen(indiceCodiciAperto,"wb");
for(i=0;i<max;i++)
{
fwrite(&ind[i],sizeof(IndiceCodice),1,fInd);
}
fclose(fInd);
f = fopen(ingressoAperto,"r+b");
fseek(f,posizione * sizeof(Ingressi),0);
Ingressi e;
strcpy(e.cognome,"VUOTO");
strcpy(e.nome,"VUOTO");
strcpy(e.data_ingresso,"VUOTO");
strcpy(e.ora_ingresso,"VUOTO");
strcpy(e.ora_uscita,"VUOTO");
e.numero = -1;
e.cancellato = 1;
fwrite(&e,sizeof(Ingressi),1,f);
fclose(f);
printf("\nIngresso cancellato con successo\n");
}
else
{
printf("\n\nIngresso NON trovato\n\n");
fclose(f);
}
}
}
void visualizzaIngresso(Ingressi e)
{
printf("\n");
printf("Numero: %d\n", e.numero);
printf("Nome: %s\n", e.nome);
printf("Cognome: %s\n", e.cognome);
printf("Data ingresso: %s\n", e.data_ingresso);
printf("Ora ingresso: %s\n", e.ora_ingresso);
printf("Ora uscita: %s\n", e.ora_uscita);
printf("\n");
}
int cerca_ingresso()
{
char cognome[20];
FILE *f;
Indice cognomeLetto;
printf("Cognome: ");
scanf("%s", &cognome);
f = fopen(indiceAperto,"rb");
fread(&cognomeLetto,sizeof(Indice),1,f);
while(!feof(f) && strcmp(cognomeLetto.chiave,cognome) != 0)
{
fread(&cognomeLetto,sizeof(Indice),1,f);
}
fclose(f);
if(feof(f))
{
return -1;
}
else
{
IndiceCodice x;
f = fopen(indiceCodiciAperto,"rb");
int aCaso;
int posizione = RicercaBin(indiceCodiciAperto,max,cognomeLetto.valore,&aCaso);
if(posizione > -1)
{
f = fopen(ingressoAperto,"rb");
fseek(f,posizione * sizeof(Ingressi),0);
Ingressi e;
fread(&e,sizeof(Ingressi),1,f);
fclose(f);
visualizzaIngresso(e);
return posizione;
}
else
{
return -1;
}
}
}
void leggi_fileingressi()
{
FILE *f;
f = fopen(ingressoAperto,"rb");
int i;
Ingressi e;
for(i=0;i<max;i++)
{
fread(&e,sizeof(Ingressi),1,f);
if(e.cancellato != 1)
{
visualizzaIngresso(e);
}
}
}