Difficoltà implementazione funzione

di il
23 risposte

Difficoltà implementazione funzione

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);
      }
   }
}

23 Risposte

  • Re: Difficoltà implementazione funzione

    Mi sembra un gran "mischione".
    Per cominciare
    1) strutture che iniziano per maiuscola? e perchè?
    2) gestione stringhe di lunghezza fissa senza controlli (male)
    3) ora e data ingresso codificate in modo strano
    4) usi strcpy, stranamente, usualmente si usa sprintf per la certezza dello 0 finale (ma è un dettaglio)
    5) nelle funzioni non si capisce un granchè su quali siano i parametri e quali le variabili locali.
    usualmente (ma è una regoletta, non una cosa scritta sulla pietra) si mettono
    i_nomevariabile e o_nomevariabile i parametri rispettivamente in input e (se ci sono) di output, in modo da distinguerli dalle
    variabili locali.
    6) dichiari un singolo char preso da tastiera, ma con scanf di una stringa etc.

    OK per tornare al punto: cosa ti turba, di preciso?
    O vuoi un controllo su tutto il sorgente?

    Perchè riguardo ai pagamenti, non mi sembra proprio ci siano.
    Metti quindi un flag, o meglio ancora un pagamento_data, nell'iscrizione.
    magari potresti anche mettere (normalmente lo faresti) pagamento_tipo e pagamento_importo.
    Nel mondo "normale" faresti una tabella collegata (normalizzata) per gestire la possibilità di pagamenti multipli
    (es. acconti, un tot al mese, saldo e così via)
  • Re: Difficoltà implementazione funzione

    Hai ragione pubblico la parte di programma che riguarda le iscrizioni
    ISCRIZIONI
    struct Iscrizioni
    {
    	char cognome[20];
    	int codice;
    	char data[20];
    	int prezzo;
    	int cancellato;
    };
    
    struct Indice_iscrizioni
    {
    	char chiave[30];
    	int valore;
    };
    
    struct IndiceCodice_iscrizioni
    {
    	int chiave;
    	int valore;
    };
    
    void creaIscrizione();
    void apriIscrizione();
    void inserisciIscrizione();
    void visualizzaIscrizione(Iscrizioni r);
    int cercaIscrizione();
    void cancellaIscrizione();
    void modificaIscrizione();
    void leggiIscrizione();
    int RicercaBin(char i[],int n,int cercato,int *inIndice);
    void OrdinaIndiceCodici(IndiceCodice_iscrizioni in[],int n);
    
    char IscrizioniAperto[20];
    char indiceAperto_iscrizioni[20];
    char indiceCodiciAperto_iscrizioni[20];
    
    int main()
    {
    	int scelta;
    	strcpy(IscrizioniAperto,"VUOTO");
    	strcpy(indiceAperto_iscrizioni,"VUOTO");
    	
    	do
    	{
    		system("CLS");
    		
    		printf("\t AREA ISCRIZIONI/PAGAMENTI \t\n\n");
    		
    		printf("\t1- Crea file iscrizione\n");
    		printf("\t2- Apri file iscrizione\n");
    		printf("\t3- Inserisci iscrizione\n");
    		printf("\t4- Modifica iscrizione\n");
    		printf("\t5- Cancella iscrizione\n");
    		printf("\t6- Cerca iscrizione\n");
    		printf("\t7- Visualizza file iscrizione\n");
    		printf("\t8- Esci dal programma\n");
    		
    		printf("\nCosa vuoi fare? : ");
    		scanf("%d", &scelta);
    		
    		int r1;
    		switch(scelta)
    		{
    			case 1:
    				creaIscrizione();
    				break;
    			case 2:
    				apriIscrizione();
    				break;
    			case 3:
    				inserisciIscrizione();
    				break;
    			case 4:
    				modificaIscrizione();
    				break;
    			case 5:
    				cancellaIscrizione();
    				break;
    			case 6:
    				
    				r1 = cercaIscrizione();
    				if(r1 == -1)
    				{
    					printf("\nIscrizione non trovata\n");
    				}
    				break;
    			case 7:
    				leggiIscrizione();
    				break;
    		}
    		system("PAUSE");
    	}while(scelta != 8);
    	
    	return 0;
    }
    
    void creaIscrizione()
    {
    	system("CLS");
    	FILE *f;
    	char nomeFile[20];
    	char nomeIndice[20];
    	char nomeIndiceCod[20];
    	
    	printf("Nome del file da creare: ");
    	scanf("%s", &nomeFile);
    	
    	Iscrizioni r;
    	
    	strcpy(r.cognome,"VUOTO");
    	strcpy(r.data,"VUOTO");
    	r.codice = -1;
    	r.prezzo = -1;
    	r.cancellato = 1;
    	
    	strcpy(nomeIndice,nomeFile);
    	strcat(nomeIndice,".txt");
    	strcpy(nomeIndiceCod,nomeIndice);
    	strcat(nomeIndiceCod,"i");
    	
    	strcat(nomeFile,".dati");
    	
    	f = fopen(nomeFile,"rb");
    	
    	if(f == NULL)
    	{
    		fclose(f);
    		f = fopen(nomeFile,"wb");
    		int i;
    		for(i=0;i<max;i++)
    		{
    			fwrite(&r,sizeof(Iscrizioni),1,f);
    		}
    		fclose(f);
    		printf("File scritto correttamente\n");
    		
    		FILE *indice;
    		Indice_iscrizioni x;
    		
    		strcpy(x.chiave,"VUOTO");
    		
    		indice = fopen(nomeIndice,"wb");
    		for(i=0;i<max;i++)
    		{
    			x.valore = i;
    			fwrite(&x,sizeof(Indice_iscrizioni),1,indice);
    		}
    		fclose(indice);
    		printf("File indice del corso scritto correttamente\n");
    		
    		indice = fopen(nomeIndiceCod,"wb");
    		IndiceCodice_iscrizioni y;
    		y.chiave = -1;
    		y.valore = -1;
    		for(i=0;i<max;i++)
    		{
    			fwrite(&y,sizeof(IndiceCodice_iscrizioni),1,indice);
    		}
    		fclose(indice);
    	}
    	else
    	{
    		char s;
    		printf("File gia' 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(&r,sizeof(Iscrizioni),1,f);
    			}
    			fclose(f);
    			printf("File scritto correttamente!\n");
    			
    			FILE *indice;
    			Indice_iscrizioni x;
    			
    			strcpy(x.chiave,"VUOTO");
    			
    			indice = fopen(nomeIndice,"wb");
    			for(i=0;i<max;i++)
    			{
    				x.valore = i;
    				fwrite(&x,sizeof(Indice_iscrizioni),1,indice);
    			}
    			fclose(indice);
    			printf("File indice dei soci scritto correttamente\n");
    			
    			indice = fopen(nomeIndiceCod,"wb");
    			IndiceCodice_iscrizioni y;
    			y.chiave = -1;
    			y.valore = -1;
    			for(i=0;i<max;i++)
    			{
    				fwrite(&y,sizeof(IndiceCodice_iscrizioni),1,indice);
    			}
    			fclose(indice);
    		}
    	}
    	printf("Operazione completata\n");
    }
    
    void apriIscrizione()
    {
    	char nomeFile[20];
    	char nomeIndice[20];
    	char nomeIndiceCod[20];
    	FILE *f;
    	FILE *fI;
    	do
    	{
    		/**/
    		
    		printf("Nome file da aprire: ");
    		scanf("%s", &nomeFile);
    		
    		strcpy(nomeIndice,nomeFile);
    		strcat(nomeIndice,".txt");
    		strcat(nomeFile,".dati");
    		strcpy(nomeIndiceCod,nomeIndice);
    		strcat(nomeIndiceCod,"i");
    		
    		f = fopen(nomeFile,"r+b");
    		if(f == NULL)
    		{
    			printf("Errore nell'apertura del file\n");
    		}
    		else
    		{
    			printf("File iscrizione aperto correttamente!\n");
    			strcpy(IscrizioniAperto,nomeFile);
    			
    			fI = fopen(nomeIndice,"r+b");
    			if(fI == NULL)
    			{
    				printf("Errore nell'apertura dell'indice\n");
    			}
    			else
    			{
    				strcpy(indiceAperto_iscrizioni,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_iscrizioni,nomeIndiceCod);
    				printf("Indice aperto correttamente.\n");
    				fclose(fI);
    			}
    		}
    	}while(f == NULL || fI == NULL);
    	fclose(f);
    }
    
    void inserisciIscrizione()
    {
    	Iscrizioni r;
    	Iscrizioni rTemp;
    	FILE *fIsc;
    	FILE *fInd;
    	
    	printf("Cognome: ");
    	scanf("%s", &r.cognome);
    	printf("Codice: ");
    	scanf("%d", &r.codice);
    	printf("Data: ");
    	scanf("%s", &r.data);
    	printf("Prezzo: ");
    	scanf("%d", &r.prezzo);
    	r.cancellato = 0;
    	
    	int cont = 0;
    	
    	fIsc = fopen(IscrizioniAperto,"r+b");
    	
    	fread(&rTemp,sizeof(Iscrizioni),1,fIsc);
    	
    	while(rTemp.cancellato != 1)
    	{
    		fread(&rTemp,sizeof(Iscrizioni),1,fIsc);
    		cont++;
    	}
    	
    	int posInIsc = cont;
    	
    	fseek(fIsc,cont * sizeof(Iscrizioni),0);
    	fwrite(&r,sizeof(Iscrizioni),1,fIsc);
    	fclose(fIsc);
    	
    	Indice_iscrizioni x;
    	Indice_iscrizioni xTemp;
    	
    	strcpy(x.chiave,r.cognome);
    	x.valore = r.codice;
    	
    	fInd = fopen(indiceAperto_iscrizioni,"r+b");
    	
    	cont = 0;
    	fread(&rTemp,sizeof(Indice_iscrizioni),1,fInd);
    	
    	while(strcmp(xTemp.chiave,"VUOTO") != 0)
    	{
    		fread(&xTemp,sizeof(Indice_iscrizioni),1,fInd);
    		cont++;
    	}
    	
    	fseek(fInd,cont * sizeof(Indice_iscrizioni),0);
    	fwrite(&x,sizeof(Indice_iscrizioni),1,fInd);
    	fclose(fInd);
    	
    	IndiceCodice_iscrizioni y;
    	IndiceCodice_iscrizioni yTemp;
    	
    	y.chiave = r.codice;
    	y.valore = posInIsc;
    	
    	fInd = fopen(indiceCodiciAperto_iscrizioni,"r+b");
    	
    	cont = 0;
    	fread(&yTemp,sizeof(IndiceCodice_iscrizioni),1,fInd);
    	
    	while(yTemp.chiave != -1)
    	{
    		fread(&yTemp,sizeof(IndiceCodice_iscrizioni),1,fInd);
    		cont++;
    	}
    	
    	fseek(fInd,cont * sizeof(IndiceCodice_iscrizioni),0);
    	fwrite(&y,sizeof(IndiceCodice_iscrizioni),1,fInd);
    	fclose(fInd);
    	
    	IndiceCodice_iscrizioni ind[max];
    	fInd = fopen(indiceCodiciAperto_iscrizioni,"rb");
    	
    	int i;
    	for(i = 0; i < max; i++)
    	{
    		fread(&ind[i],sizeof(IndiceCodice_iscrizioni),1,fInd);
    	}
    	
    	fclose(fInd);
    	
    	OrdinaIndiceCodici(ind,max);
    	
    	fInd = fopen(indiceCodiciAperto_iscrizioni,"wb");
    	
    	for(i = 0; i < max; i++)
    	{
    		fwrite(&ind[i],sizeof(IndiceCodice_iscrizioni),1,fInd);
    	}
    	fclose(fInd);
    	printf("Aggiornamento indici completato.\n");
    }
    
    void modificaIscrizione()
    {
    	char cognomeIscritto[20];
    	FILE *f;
    	Indice_iscrizioni cognomeLetto;
    	
    	printf("Cognome: ");
    	scanf("%s", &cognomeIscritto);
    	
    	f = fopen(indiceAperto_iscrizioni,"r+b");
    	fread(&cognomeLetto,sizeof(Indice_iscrizioni),1,f);
    	
    	int posCognome = 0;
    	while(!feof(f) && strcmp(cognomeLetto.chiave,cognomeIscritto) != 0)
    	{
    		fread(&cognomeLetto,sizeof(Indice_iscrizioni),1,f);
    		posCognome++;
    	}
    	
    	if(feof(f))
    	{
    		printf("\n\nIscrizione non trovata\n\n");
    		fclose(f);
    	}
    	else
    	{
    		Indice_iscrizioni x;
    		printf("Inserire nuovo cognome: ");
    		scanf("%s", &x.chiave);
    		
    		x.valore = cognomeLetto.valore;
    		
    		//Modifico record da indice nomi
    		
    		fseek(f,posCognome * sizeof(Indice_iscrizioni),0);
    		fwrite(&x,sizeof(Indice_iscrizioni),1,f);
    		fclose(f);
    		
    		f = fopen(indiceCodiciAperto_iscrizioni,"r+b");
    		
    		int inIndice;
    		int posizione = RicercaBin(indiceCodiciAperto_iscrizioni,max,cognomeLetto.valore,&inIndice);
    		if(posizione > -1)
    		{	
    			f = fopen(IscrizioniAperto,"r+b");
    			fseek(f,posizione * sizeof(Iscrizioni),0);
    			
    			Iscrizioni r;
    			fread(&r,sizeof(Iscrizioni),1,f);
    			visualizzaIscrizione(r);
    			
    			printf("\nInserire i nuovi dati: \n");
    			strcpy(r.cognome, x.chiave);
    			
    			printf("\nCodice: ");
    			scanf("%d", &r.codice);
    			
    			printf("\nData: ");
    			scanf("%s", &r.data);
    			
    			printf("\nPrezzo: ");
    			scanf("%d", &r.prezzo);
    			
    			r.codice = cognomeLetto.valore;
    			r.cancellato = 0;
    			
    			fseek(f,posizione * sizeof(Iscrizioni),0);			
    			fwrite(&r,sizeof(Iscrizioni),1,f);
    			fclose(f);
    
    			printf("\nIscrizione aggiornata con successo\n");
    		}
    		else
    		{
    			printf("\n\nIscrizione NON trovata\n\n");
    			fclose(f);
    		}	
    	}
    }
    
    void cancellaIscrizione()
    {
    	char cognomeIscritto[20];
    	FILE *f;
    	Indice_iscrizioni cognomeLetto;
    	
    	printf("Cognome: ");
    	scanf("%s", &cognomeIscritto);
    	
    	f = fopen(indiceAperto_iscrizioni,"r+b");
    	fread(&cognomeLetto,sizeof(Indice_iscrizioni),1,f);
    	
    	int posCognome = 0;
    	while(!feof(f) && strcmp(cognomeLetto.chiave,cognomeIscritto) != 0)
    	{
    		fread(&cognomeLetto,sizeof(Indice_iscrizioni),1,f);
    		posCognome++;
    	}
    	
    	if(feof(f))
    	{
    		printf("Cognome non trovato\n\n");
    		fclose(f);
    	}
    	else
    	{
    		Indice_iscrizioni x;
    		strcpy(x.chiave,"VUOTO");
    		x.valore = posCognome;
    		
    		fseek(f,posCognome * sizeof(Indice_iscrizioni),0);
    		fwrite(&x,sizeof(Indice_iscrizioni),1,f);
    		fclose(f);
    		
    		f = fopen(indiceCodiciAperto_iscrizioni,"r+b");
    		
    		int nellIndice;
    		int posizione = RicercaBin(indiceCodiciAperto_iscrizioni,max,cognomeLetto.valore,&nellIndice);
    		if(posizione > -1)
    		{
    			fseek(f,nellIndice * sizeof(IndiceCodice_iscrizioni),0);
    			IndiceCodice_iscrizioni k;
    			k.chiave = -1;
    			k.valore = -1;
    			fwrite(&k,sizeof(IndiceCodice_iscrizioni),1,f);
    			fclose(f);
    			
    			FILE *fInd;
    			IndiceCodice_iscrizioni ind[max];
    			fInd = fopen(indiceCodiciAperto_iscrizioni,"rb");
    			
    			int i;
    			for(i = 0; i < max; i++)
    			{
    				fread(&ind[i],sizeof(IndiceCodice_iscrizioni),1,fInd);
    			}
    			
    			fclose(fInd);
    			
    			OrdinaIndiceCodici(ind,max);
    			
    			fInd = fopen(indiceCodiciAperto_iscrizioni,"wb");
    			for(i = 0; i < max; i++)
    			{
    				fwrite(&ind[i],sizeof(IndiceCodice_iscrizioni),1,fInd);
    			}
    			fclose(fInd);
    			
    			f = fopen(IscrizioniAperto,"r+b");
    			fseek(f,posizione * sizeof(Iscrizioni),0);
    			Iscrizioni r;
    			
    			strcpy(r.cognome,"VUOTO");
    			strcpy(r.data,"VUOTO");
    			r.codice = -1;
    			r.prezzo = -1;
    			r.cancellato = 1;
    			
    			fwrite(&r,sizeof(Iscrizioni),1,f);
    			fclose(f);
    			
    			printf("\nIscrizione cancellata con successo\n");
    		}
    		else
    		{
    			printf("\n\nIscrizione non trovata\n\n");
    			fclose(f);
    		}
    	}
    }
    
    int cercaIscrizione()
    {
    	char cognomeIscritto[20];
    	FILE *f;
    	Indice_iscrizioni cognomeLetto;
    	
    	printf("Cognome: ");
    	scanf("%s", &cognomeIscritto);
    	
    	f = fopen(indiceAperto_iscrizioni,"rb");
    	fread(&cognomeLetto,sizeof(Indice_iscrizioni),1,f);
    	
    	while(!feof(f) && strcmp(cognomeLetto.chiave,cognomeIscritto) != 0)
    	{
    		fread(&cognomeLetto,sizeof(Indice_iscrizioni),1,f);
    	}
    	fclose(f);
    	
    	if(feof(f))
    	{
    		return -1;
    	}
    	else
    	{
    		IndiceCodice_iscrizioni x;
    		f = fopen(indiceCodiciAperto_iscrizioni,"rb");
    		
    		int aCaso;
    		int posizione = RicercaBin(indiceCodiciAperto_iscrizioni,max,cognomeLetto.valore,&aCaso);
    		if(posizione > -1)
    		{
    			f = fopen(IscrizioniAperto,"rb");
    			fseek(f,posizione * sizeof(Iscrizioni),0);
    			Iscrizioni r;
    			fread(&r,sizeof(Iscrizioni),1,f);
    			fclose(f);
    			visualizzaIscrizione(r);
    			return posizione;
    		}
    		else
    		{
    			return -1;
    		}
    	}
    }
    
    void leggiIscrizione()
    {
    	FILE *f;
    	f = fopen(IscrizioniAperto,"rb");
    	
    	int i;
    	Iscrizioni r;
    	
    	for(i = 0; i < max; i++)
    	{
    		fread(&r,sizeof(Iscrizioni),1,f);
    		if(r.cancellato != 1)
    		{
    			visualizzaIscrizione(r);
    		}
    	}
    }
    
    void visualizzaIscrizione(Iscrizioni r)
    {
    	printf("\n");
    	printf("Cognome: %s\n", r.cognome);
    	printf("Codice: %d\n", r.codice);
    	printf("Data: %s\n", r.data);
    	printf("Prezzo: %d\n", r.prezzo);
    	printf("\n");
    }
    
    void OrdinaIndiceCodici(IndiceCodice_iscrizioni in[],int n)
    {
    	IndiceCodice_iscrizioni 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_iscrizioni x;
    		fseek(indice,mid * sizeof(IndiceCodice_iscrizioni),0);
    		fread(&x,sizeof(IndiceCodice_iscrizioni),1,indice);
    		
    		if(cercato == x.chiave)
    		{
    			*inIndice = mid;
    			fclose(indice);
    			return x.valore;
    		}
    		else
    		{
    			if(cercato > x.chiave)
    			{
    				left = mid + 1;
    			}
    			else
    			{
    				right = mid - 1;
    			}
    		}
    	}while(left <= right);
    	*inIndice = -1;
    	return -1;
    }
  • Re: Difficoltà implementazione funzione

    Ma che roba è "struct IndiceCodice_iscrizioni" ?
    Un tentativo di modellazione di una decomposizione funzionale?
  • Re: Difficoltà implementazione funzione

    No.......non li contare quelle struct indice.....sono una richiesta precisa del professore......
  • Re: Difficoltà implementazione funzione

    Andrea9214! ha scritto:


    No.......non li contare quelle struct indice.....sono una richiesta precisa del professore......
    Evabbè ma devo andare "a casaccio"?

    Sto uscendo, cosa ti turba? Come detto nel caso banale metti 2 o 3 campi nella struct dell'iscrizione che compilerai coi dati del pagamento,
    punto e basta.

    Ovviamente puoi mettere un banale int flagpagato e buonanotte, vedi te.
  • Re: Difficoltà implementazione funzione

    Ah ok......grazie....provo così
  • Re: Difficoltà implementazione funzione

    Ne avevamo parlato in questo chilometrico thread

    https://www.iprogrammatori.it/forum-programmazione/cplusplus/programma-database-t27764-75.html

    e avevi detto che usavi questa struttura

    struct Iscrizioni_Pagamenti
    {
    int numero_tessera[50];
    char datadinascita[50];
    double quota[50];
    char data_pagamento[50];
    };

    ovviamente sbagliata (usavi vettori al posto di singoli elementi ...) ma in cui memorizzavi il pagamento. Era quella che ti avevo suggerito di usare ... come è finita ?
  • Re: Difficoltà implementazione funzione

    Ho rifatto tutto daccapo e adesso il programma funziona......a parte la funzione particolare
  • Re: Difficoltà implementazione funzione

    E quindi la struttura in cui ci sono i pagamenti qual è adesso ?

    La funzione deve lavorare sui dati. Se i dati non sono ben definiti, non si può iniziare a parlare di una funzione che li controlli ...
  • Re: Difficoltà implementazione funzione

    Il programma crea i file e riesce a leggere da lì perfettamente.....
  • Re: Difficoltà implementazione funzione

    Non sto riuscendo a farla.....@oregon puoi aiutarmi?
    #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);
    		}
    	}
    }
  • Re: Difficoltà implementazione funzione

    Come nell'altro thread, non si riesce a farsi capire ... ti avevo chiesto ...

    "E quindi la struttura in cui ci sono i pagamenti qual è adesso ?" ????

    Se non rispondi, non posso fare miracoli ...
  • Re: Difficoltà implementazione funzione

    Ah si scusa non avevo capito. Allego il codice relativo all'iscrizione con la struct
    #include <stdlib.h>
    #include <string.h>
    #include <stdio.h>
    
    #define max 20
    
    struct Iscrizioni
    {
    	char cognome[20];
    	int codice;
    	char data[20];
    	int prezzo;
    	int cancellato;
    };
    
    struct Indice_iscrizioni
    {
    	char chiave[30];
    	int valore;
    };
    
    struct IndiceCodice_iscrizioni
    {
    	int chiave;
    	int valore;
    };
    
    void creaIscrizione();
    void apriIscrizione();
    void inserisciIscrizione();
    void visualizzaIscrizione(Iscrizioni r);
    int cercaIscrizione();
    void cancellaIscrizione();
    void modificaIscrizione();
    void leggiIscrizione();
    int RicercaBin(char i[],int n,int cercato,int *inIndice);
    void OrdinaIndiceCodici(IndiceCodice_iscrizioni in[],int n);
    
    char IscrizioniAperto[20];
    char indiceAperto_iscrizioni[20];
    char indiceCodiciAperto_iscrizioni[20];
    
    int main()
    {
    	int scelta;
    	strcpy(IscrizioniAperto,"VUOTO");
    	strcpy(indiceAperto_iscrizioni,"VUOTO");
    	
    	do
    	{
    		system("CLS");
    		
    		printf("\t AREA ISCRIZIONI/PAGAMENTI \t\n\n");
    		
    		printf("\t1- Crea file iscrizione\n");
    		printf("\t2- Apri file iscrizione\n");
    		printf("\t3- Inserisci iscrizione\n");
    		printf("\t4- Modifica iscrizione\n");
    		printf("\t5- Cancella iscrizione\n");
    		printf("\t6- Cerca iscrizione\n");
    		printf("\t7- Visualizza file iscrizione\n");
    		printf("\t8- Esci dal programma\n");
    		
    		printf("\nCosa vuoi fare? : ");
    		scanf("%d", &scelta);
    		
    		int r1;
    		switch(scelta)
    		{
    			case 1:
    				creaIscrizione();
    				break;
    			case 2:
    				apriIscrizione();
    				break;
    			case 3:
    				inserisciIscrizione();
    				break;
    			case 4:
    				modificaIscrizione();
    				break;
    			case 5:
    				cancellaIscrizione();
    				break;
    			case 6:
    				
    				r1 = cercaIscrizione();
    				if(r1 == -1)
    				{
    					printf("\nIscrizione non trovata\n");
    				}
    				break;
    			case 7:
    				leggiIscrizione();
    				break;
    		}
    		system("PAUSE");
    	}while(scelta != 8);
    	
    	return 0;
    }
    
    void creaIscrizione()
    {
    	system("CLS");
    	FILE *f;
    	char nomeFile[20];
    	char nomeIndice[20];
    	char nomeIndiceCod[20];
    	
    	printf("Nome del file da creare: ");
    	scanf("%s", &nomeFile);
    	
    	Iscrizioni r;
    	
    	strcpy(r.cognome,"VUOTO");
    	strcpy(r.data,"VUOTO");
    	r.codice = -1;
    	r.prezzo = -1;
    	r.cancellato = 1;
    	
    	strcpy(nomeIndice,nomeFile);
    	strcat(nomeIndice,".txt");
    	strcpy(nomeIndiceCod,nomeIndice);
    	strcat(nomeIndiceCod,"i");
    	
    	strcat(nomeFile,".dati");
    	
    	f = fopen(nomeFile,"rb");
    	
    	if(f == NULL)
    	{
    		fclose(f);
    		f = fopen(nomeFile,"wb");
    		int i;
    		for(i=0;i<max;i++)
    		{
    			fwrite(&r,sizeof(Iscrizioni),1,f);
    		}
    		fclose(f);
    		printf("File scritto correttamente\n");
    		
    		FILE *indice;
    		Indice_iscrizioni x;
    		
    		strcpy(x.chiave,"VUOTO");
    		
    		indice = fopen(nomeIndice,"wb");
    		for(i=0;i<max;i++)
    		{
    			x.valore = i;
    			fwrite(&x,sizeof(Indice_iscrizioni),1,indice);
    		}
    		fclose(indice);
    		printf("File indice del corso scritto correttamente\n");
    		
    		indice = fopen(nomeIndiceCod,"wb");
    		IndiceCodice_iscrizioni y;
    		y.chiave = -1;
    		y.valore = -1;
    		for(i=0;i<max;i++)
    		{
    			fwrite(&y,sizeof(IndiceCodice_iscrizioni),1,indice);
    		}
    		fclose(indice);
    	}
    	else
    	{
    		char s;
    		printf("File gia' 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(&r,sizeof(Iscrizioni),1,f);
    			}
    			fclose(f);
    			printf("File scritto correttamente!\n");
    			
    			FILE *indice;
    			Indice_iscrizioni x;
    			
    			strcpy(x.chiave,"VUOTO");
    			
    			indice = fopen(nomeIndice,"wb");
    			for(i=0;i<max;i++)
    			{
    				x.valore = i;
    				fwrite(&x,sizeof(Indice_iscrizioni),1,indice);
    			}
    			fclose(indice);
    			printf("File indice dei soci scritto correttamente\n");
    			
    			indice = fopen(nomeIndiceCod,"wb");
    			IndiceCodice_iscrizioni y;
    			y.chiave = -1;
    			y.valore = -1;
    			for(i=0;i<max;i++)
    			{
    				fwrite(&y,sizeof(IndiceCodice_iscrizioni),1,indice);
    			}
    			fclose(indice);
    		}
    	}
    	printf("Operazione completata\n");
    }
    
    void apriIscrizione()
    {
    	char nomeFile[20];
    	char nomeIndice[20];
    	char nomeIndiceCod[20];
    	FILE *f;
    	FILE *fI;
    	do
    	{
    		/**/
    		
    		printf("Nome file da aprire: ");
    		scanf("%s", &nomeFile);
    		
    		strcpy(nomeIndice,nomeFile);
    		strcat(nomeIndice,".txt");
    		strcat(nomeFile,".dati");
    		strcpy(nomeIndiceCod,nomeIndice);
    		strcat(nomeIndiceCod,"i");
    		
    		f = fopen(nomeFile,"r+b");
    		if(f == NULL)
    		{
    			printf("Errore nell'apertura del file\n");
    		}
    		else
    		{
    			printf("File iscrizione aperto correttamente!\n");
    			strcpy(IscrizioniAperto,nomeFile);
    			
    			fI = fopen(nomeIndice,"r+b");
    			if(fI == NULL)
    			{
    				printf("Errore nell'apertura dell'indice\n");
    			}
    			else
    			{
    				strcpy(indiceAperto_iscrizioni,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_iscrizioni,nomeIndiceCod);
    				printf("Indice aperto correttamente.\n");
    				fclose(fI);
    			}
    		}
    	}while(f == NULL || fI == NULL);
    	fclose(f);
    }
    
    void inserisciIscrizione()
    {
    	Iscrizioni r;
    	Iscrizioni rTemp;
    	FILE *fIsc;
    	FILE *fInd;
    	
    	printf("Cognome: ");
    	scanf("%s", &r.cognome);
    	printf("Codice: ");
    	scanf("%d", &r.codice);
    	printf("Data: ");
    	scanf("%s", &r.data);
    	printf("Prezzo: ");
    	scanf("%d", &r.prezzo);
    	r.cancellato = 0;
    	
    	int cont = 0;
    	
    	fIsc = fopen(IscrizioniAperto,"r+b");
    	
    	fread(&rTemp,sizeof(Iscrizioni),1,fIsc);
    	
    	while(rTemp.cancellato != 1)
    	{
    		fread(&rTemp,sizeof(Iscrizioni),1,fIsc);
    		cont++;
    	}
    	
    	int posInIsc = cont;
    	
    	fseek(fIsc,cont * sizeof(Iscrizioni),0);
    	fwrite(&r,sizeof(Iscrizioni),1,fIsc);
    	fclose(fIsc);
    	
    	Indice_iscrizioni x;
    	Indice_iscrizioni xTemp;
    	
    	strcpy(x.chiave,r.cognome);
    	x.valore = r.codice;
    	
    	fInd = fopen(indiceAperto_iscrizioni,"r+b");
    	
    	cont = 0;
    	fread(&rTemp,sizeof(Indice_iscrizioni),1,fInd);
    	
    	while(strcmp(xTemp.chiave,"VUOTO") != 0)
    	{
    		fread(&xTemp,sizeof(Indice_iscrizioni),1,fInd);
    		cont++;
    	}
    	
    	fseek(fInd,cont * sizeof(Indice_iscrizioni),0);
    	fwrite(&x,sizeof(Indice_iscrizioni),1,fInd);
    	fclose(fInd);
    	
    	IndiceCodice_iscrizioni y;
    	IndiceCodice_iscrizioni yTemp;
    	
    	y.chiave = r.codice;
    	y.valore = posInIsc;
    	
    	fInd = fopen(indiceCodiciAperto_iscrizioni,"r+b");
    	
    	cont = 0;
    	fread(&yTemp,sizeof(IndiceCodice_iscrizioni),1,fInd);
    	
    	while(yTemp.chiave != -1)
    	{
    		fread(&yTemp,sizeof(IndiceCodice_iscrizioni),1,fInd);
    		cont++;
    	}
    	
    	fseek(fInd,cont * sizeof(IndiceCodice_iscrizioni),0);
    	fwrite(&y,sizeof(IndiceCodice_iscrizioni),1,fInd);
    	fclose(fInd);
    	
    	IndiceCodice_iscrizioni ind[max];
    	fInd = fopen(indiceCodiciAperto_iscrizioni,"rb");
    	
    	int i;
    	for(i = 0; i < max; i++)
    	{
    		fread(&ind[i],sizeof(IndiceCodice_iscrizioni),1,fInd);
    	}
    	
    	fclose(fInd);
    	
    	OrdinaIndiceCodici(ind,max);
    	
    	fInd = fopen(indiceCodiciAperto_iscrizioni,"wb");
    	
    	for(i = 0; i < max; i++)
    	{
    		fwrite(&ind[i],sizeof(IndiceCodice_iscrizioni),1,fInd);
    	}
    	fclose(fInd);
    	printf("Aggiornamento indici completato.\n");
    }
    
    void modificaIscrizione()
    {
    	char cognomeIscritto[20];
    	FILE *f;
    	Indice_iscrizioni cognomeLetto;
    	
    	printf("Cognome: ");
    	scanf("%s", &cognomeIscritto);
    	
    	f = fopen(indiceAperto_iscrizioni,"r+b");
    	fread(&cognomeLetto,sizeof(Indice_iscrizioni),1,f);
    	
    	int posCognome = 0;
    	while(!feof(f) && strcmp(cognomeLetto.chiave,cognomeIscritto) != 0)
    	{
    		fread(&cognomeLetto,sizeof(Indice_iscrizioni),1,f);
    		posCognome++;
    	}
    	
    	if(feof(f))
    	{
    		printf("\n\nIscrizione non trovata\n\n");
    		fclose(f);
    	}
    	else
    	{
    		Indice_iscrizioni x;
    		printf("Inserire nuovo cognome: ");
    		scanf("%s", &x.chiave);
    		
    		x.valore = cognomeLetto.valore;
    		
    		//Modifico record da indice nomi
    		
    		fseek(f,posCognome * sizeof(Indice_iscrizioni),0);
    		fwrite(&x,sizeof(Indice_iscrizioni),1,f);
    		fclose(f);
    		
    		f = fopen(indiceCodiciAperto_iscrizioni,"r+b");
    		
    		int inIndice;
    		int posizione = RicercaBin(indiceCodiciAperto_iscrizioni,max,cognomeLetto.valore,&inIndice);
    		if(posizione > -1)
    		{	
    			f = fopen(IscrizioniAperto,"r+b");
    			fseek(f,posizione * sizeof(Iscrizioni),0);
    			
    			Iscrizioni r;
    			fread(&r,sizeof(Iscrizioni),1,f);
    			visualizzaIscrizione(r);
    			
    			printf("\nInserire i nuovi dati: \n");
    			strcpy(r.cognome, x.chiave);
    			
    			printf("\nCodice: ");
    			scanf("%d", &r.codice);
    			
    			printf("\nData: ");
    			scanf("%s", &r.data);
    			
    			printf("\nPrezzo: ");
    			scanf("%d", &r.prezzo);
    			
    			r.codice = cognomeLetto.valore;
    			r.cancellato = 0;
    			
    			fseek(f,posizione * sizeof(Iscrizioni),0);			
    			fwrite(&r,sizeof(Iscrizioni),1,f);
    			fclose(f);
    
    			printf("\nIscrizione aggiornata con successo\n");
    		}
    		else
    		{
    			printf("\n\nIscrizione NON trovata\n\n");
    			fclose(f);
    		}	
    	}
    }
    
    void cancellaIscrizione()
    {
    	char cognomeIscritto[20];
    	FILE *f;
    	Indice_iscrizioni cognomeLetto;
    	
    	printf("Cognome: ");
    	scanf("%s", &cognomeIscritto);
    	
    	f = fopen(indiceAperto_iscrizioni,"r+b");
    	fread(&cognomeLetto,sizeof(Indice_iscrizioni),1,f);
    	
    	int posCognome = 0;
    	while(!feof(f) && strcmp(cognomeLetto.chiave,cognomeIscritto) != 0)
    	{
    		fread(&cognomeLetto,sizeof(Indice_iscrizioni),1,f);
    		posCognome++;
    	}
    	
    	if(feof(f))
    	{
    		printf("Cognome non trovato\n\n");
    		fclose(f);
    	}
    	else
    	{
    		Indice_iscrizioni x;
    		strcpy(x.chiave,"VUOTO");
    		x.valore = posCognome;
    		
    		fseek(f,posCognome * sizeof(Indice_iscrizioni),0);
    		fwrite(&x,sizeof(Indice_iscrizioni),1,f);
    		fclose(f);
    		
    		f = fopen(indiceCodiciAperto_iscrizioni,"r+b");
    		
    		int nellIndice;
    		int posizione = RicercaBin(indiceCodiciAperto_iscrizioni,max,cognomeLetto.valore,&nellIndice);
    		if(posizione > -1)
    		{
    			fseek(f,nellIndice * sizeof(IndiceCodice_iscrizioni),0);
    			IndiceCodice_iscrizioni k;
    			k.chiave = -1;
    			k.valore = -1;
    			fwrite(&k,sizeof(IndiceCodice_iscrizioni),1,f);
    			fclose(f);
    			
    			FILE *fInd;
    			IndiceCodice_iscrizioni ind[max];
    			fInd = fopen(indiceCodiciAperto_iscrizioni,"rb");
    			
    			int i;
    			for(i = 0; i < max; i++)
    			{
    				fread(&ind[i],sizeof(IndiceCodice_iscrizioni),1,fInd);
    			}
    			
    			fclose(fInd);
    			
    			OrdinaIndiceCodici(ind,max);
    			
    			fInd = fopen(indiceCodiciAperto_iscrizioni,"wb");
    			for(i = 0; i < max; i++)
    			{
    				fwrite(&ind[i],sizeof(IndiceCodice_iscrizioni),1,fInd);
    			}
    			fclose(fInd);
    			
    			f = fopen(IscrizioniAperto,"r+b");
    			fseek(f,posizione * sizeof(Iscrizioni),0);
    			Iscrizioni r;
    			
    			strcpy(r.cognome,"VUOTO");
    			strcpy(r.data,"VUOTO");
    			r.codice = -1;
    			r.prezzo = -1;
    			r.cancellato = 1;
    			
    			fwrite(&r,sizeof(Iscrizioni),1,f);
    			fclose(f);
    			
    			printf("\nIscrizione cancellata con successo\n");
    		}
    		else
    		{
    			printf("\n\nIscrizione non trovata\n\n");
    			fclose(f);
    		}
    	}
    }
    
    int cercaIscrizione()
    {
    	char cognomeIscritto[20];
    	FILE *f;
    	Indice_iscrizioni cognomeLetto;
    	
    	printf("Cognome: ");
    	scanf("%s", &cognomeIscritto);
    	
    	f = fopen(indiceAperto_iscrizioni,"rb");
    	fread(&cognomeLetto,sizeof(Indice_iscrizioni),1,f);
    	
    	while(!feof(f) && strcmp(cognomeLetto.chiave,cognomeIscritto) != 0)
    	{
    		fread(&cognomeLetto,sizeof(Indice_iscrizioni),1,f);
    	}
    	fclose(f);
    	
    	if(feof(f))
    	{
    		return -1;
    	}
    	else
    	{
    		IndiceCodice_iscrizioni x;
    		f = fopen(indiceCodiciAperto_iscrizioni,"rb");
    		
    		int aCaso;
    		int posizione = RicercaBin(indiceCodiciAperto_iscrizioni,max,cognomeLetto.valore,&aCaso);
    		if(posizione > -1)
    		{
    			f = fopen(IscrizioniAperto,"rb");
    			fseek(f,posizione * sizeof(Iscrizioni),0);
    			Iscrizioni r;
    			fread(&r,sizeof(Iscrizioni),1,f);
    			fclose(f);
    			visualizzaIscrizione(r);
    			return posizione;
    		}
    		else
    		{
    			return -1;
    		}
    	}
    }
    
    void leggiIscrizione()
    {
    	FILE *f;
    	f = fopen(IscrizioniAperto,"rb");
    	
    	int i;
    	Iscrizioni r;
    	
    	for(i = 0; i < max; i++)
    	{
    		fread(&r,sizeof(Iscrizioni),1,f);
    		if(r.cancellato != 1)
    		{
    			visualizzaIscrizione(r);
    		}
    	}
    }
    
    void visualizzaIscrizione(Iscrizioni r)
    {
    	printf("\n");
    	printf("Cognome: %s\n", r.cognome);
    	printf("Codice: %d\n", r.codice);
    	printf("Data: %s\n", r.data);
    	printf("Prezzo: %d\n", r.prezzo);
    	printf("\n");
    }
    
    void OrdinaIndiceCodici(IndiceCodice_iscrizioni in[],int n)
    {
    	IndiceCodice_iscrizioni 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_iscrizioni x;
    		fseek(indice,mid * sizeof(IndiceCodice_iscrizioni),0);
    		fread(&x,sizeof(IndiceCodice_iscrizioni),1,indice);
    		
    		if(cercato == x.chiave)
    		{
    			*inIndice = mid;
    			fclose(indice);
    			return x.valore;
    		}
    		else
    		{
    			if(cercato > x.chiave)
    			{
    				left = mid + 1;
    			}
    			else
    			{
    				right = mid - 1;
    			}
    		}
    	}while(left <= right);
    	*inIndice = -1;
    	return -1;
    }
  • Re: Difficoltà implementazione funzione

    Quindi, quando risulta iscritto un cliente e quando risulta che ha pagato?
Devi accedere o registrarti per scrivere nel forum
23 risposte