Giudizio per Rubrica su file

di il
21 risposte

21 Risposte - Pagina 2

  • Re: Giudizio per Rubrica su file

    Grazie mille skynet, preziosissimi consigli!!
  • Re: Giudizio per Rubrica su file

    Ecco il programma completo.
    Cancella il tuo file della rubrica perché viene creato da zero. Metti anche il path giusto.
    
    #include <stdio.h>
    #include <string.h>
    
    #define MAX_ELEMENTI 100
    
    #define MAX_LEN_NOME 20
    #define MAX_LEN_COGNOME 20
    #define MAX_LEN_PHONE 12
    
    struct dati {                                               //STRUTTURA DATI RUBRICA
        char nome[MAX_LEN_NOME];
        char cognome[MAX_LEN_COGNOME];                                       
        char telefono[MAX_LEN_PHONE];
    };
    
    struct _rubrica
    {
    	struct dati elenco[MAX_ELEMENTI];
    	int indiciUsati[MAX_ELEMENTI];
    	int indiceCorrente;
    };
    
    //Legge da file e salva in rubrica, ritorna il numero di elementi letti
    int LeggiFile(FILE * f, struct _rubrica *rubrica)
    {
    	while(fread(&(rubrica->elenco[rubrica->indiceCorrente]),sizeof(struct dati),1,f))
    	{
    		rubrica->indiciUsati[rubrica->indiceCorrente] = 1;
    		rubrica->indiceCorrente++;
    	}
    	return rubrica->indiceCorrente;
    }
    
    //Scrive su file leggendo da rubrica, ritorna il numero di elementi scritti
    int ScriviFile(FILE * f, struct _rubrica *rubrica)
    {
    	int i;
    	int scritti = 0;
    	for(i = 0; i < rubrica->indiceCorrente; i++)
    	{
    		if(rubrica->indiciUsati[i] == 1)
    		{
    			if(fwrite(&(rubrica->elenco[i]),sizeof(struct dati),1,f))
    				scritti++;
    		}
    	}
    	return scritti;
    }
    
    
    //Trova la prima posizione libera
    int TrovaPosizione(struct _rubrica *rubrica)
    {
    	int i;
    	for(i = 0; i < MAX_ELEMENTI; i++)
    	{
    		if(rubrica->indiciUsati[i] == 0)
    			return i;
    	}
    	return -1;
    }
    
    
    //FUNZIONE INSERIMENTO
    void InserisciElemento (struct _rubrica *rubrica)
    {
    	int pos = TrovaPosizione(rubrica);
    	if(pos != -1)
    	{
    		printf("Inserisci nome:\t");							//inserimento dati
    		scanf(" %s",rubrica->elenco[rubrica->indiceCorrente].nome);
    		printf("Inserisci cognome:\t");                   
    		scanf(" %s",rubrica->elenco[rubrica->indiceCorrente].cognome);
    		printf("Inserisci il telefono:\t ");
    		scanf(" %s",rubrica->elenco[rubrica->indiceCorrente].telefono);
    		rubrica->indiciUsati[pos] = 1;
    		if(pos == rubrica->indiceCorrente)						
    			rubrica->indiceCorrente++;		
    		// posizione vuota coincide con elemento massimo
    		// se non coincide significa che ho usato una poszione 
    		// prima occupato da un dato eliminato
    	}
    	else
    	{
    		printf("\nRubrica piena!!!\n");
    	}
    }
    
    int CercaElemento(struct _rubrica *rubrica, const char * telefono)
    {
    	int i;
    	for(i = 0; i < rubrica->indiceCorrente; i++)
    	{
    		if((rubrica->indiciUsati[i]) != 0 && (!strcmp(rubrica->elenco[i].telefono,telefono)))
    		{
    			return i;
    		}
    	}
    	return -1;
    }
    
    int EliminaElemento (struct _rubrica *rubrica)
    {
    	char telefono[MAX_LEN_PHONE] = {0};
    	int i = -1;
        printf("Inserire il numero di telefono:\t");
    	scanf(" %s",telefono);
    	i = CercaElemento(rubrica,telefono);
    	if(i != -1)
    	{
    		rubrica->indiciUsati[i] = 0;
    	}
    	else
    	{
    		printf("L\'elemento non esiste.");
    	}
    }
    
    //FUNZIONE MODIFICA
    int ModificaElemento (struct _rubrica *rubrica)
    {
        char telefono[MAX_LEN_PHONE] = {0};
    	int i = -1;
        printf("\nNumero telefonico delcontatto da modificare? ");         
    	scanf(" %s",telefono);                                           
        i = CercaElemento(rubrica,telefono);
    	if(i != -1)
    	{
    		printf("\nRiscrivi nome e cognome ");
    		scanf(" %s",rubrica->elenco[i].nome);                                 
    		scanf(" %s",rubrica->elenco[i].cognome);
    		printf("Inserisci il telefono ");
    		scanf(" %s",rubrica->elenco[i].telefono);
    	}
    	else
    	{
    		printf("L\'elemento non esiste.");
    	}
    }
    
    //FUNZIONE STAMPA
    void StampaElenco (struct _rubrica *rubrica)
    {
        int i;
    	for(i = 0; i < rubrica->indiceCorrente; i++)
    	{
    		if(rubrica->indiciUsati[i] == 1)
    		{
    			printf("%s %s : %s\n",rubrica->elenco[i].nome, rubrica->elenco[i].cognome,rubrica->elenco[i].telefono);
    		}
    	}
    }
    
    int main (void)                                         //PROGRAMMA RUBRICA
    {
    	
    	struct _rubrica rubrica;
    	
    	FILE *f;
        int scelta = 0;
         
    	int i;
    	for(i = 0; i < MAX_ELEMENTI; i++)
    		rubrica.indiciUsati[i] = 0;
    	rubrica.indiceCorrente = 0;
    
    	if ((f = fopen( "rubrica.txt", "rb" )) != NULL )
    	{
    		LeggiFile(f,&rubrica);
    		fclose(f);
    	}
    
        printf("RUBRICA TELEFONICA\n");
       
        while (scelta!=5){
       
            printf("\nMenu\':\n1)Inserisci Contatto\n2)Elimina Contatto\n3)Modifica Contatto\n4)Stampa Rubrica\n5)Esci\n");
            printf("Scelta: ");
            scanf(" %d",&scelta);
           
    		switch(scelta)
    		{
    			case 1: InserisciElemento(&rubrica); break;
    			case 2: EliminaElemento(&rubrica); break;
    			case 3: ModificaElemento(&rubrica); break;
    			case 4: StampaElenco(&rubrica); break;
    			case 5:
    			{
    				if ((f = fopen( "rubrica.txt", "w+b" )) != NULL )
    				{	
    					ScriviFile(f,&rubrica);
    					fclose(f);
    				}
    				
    	            printf("Chiusura programma in corso...");
    				printf("\nTerminato");
    			}
    			break;
    		}
        }
    }
    
  • Re: Giudizio per Rubrica su file

    Grazie skynet, me lo studio per capirlo in modo approfondito!!
  • Re: Giudizio per Rubrica su file

    Ho modificato una funzione perché errata.
    
    //FUNZIONE INSERIMENTO
    void InserisciElemento (struct _rubrica *rubrica)
    {
    	int pos = TrovaPosizione(rubrica);
    	if(pos != -1)
    	{
    		printf("Inserisci nome:\t");							//inserimento dati
    		scanf(" %s",rubrica->elenco[pos].nome);
    		printf("Inserisci cognome:\t");                   
    		scanf(" %s",rubrica->elenco[pos].cognome);
    		printf("Inserisci il telefono:\t ");
    		scanf(" %s",rubrica->elenco[pos].telefono);
    		rubrica->indiciUsati[pos] = 1;
    		if(pos == rubrica->indiceCorrente)						
    			rubrica->indiceCorrente++;		
    		// posizione vuota coincide con elemento massimo
    		// se non coincide significa che ho usato una poszione 
    		// prima occupato da un dato eliminato
    	}
    	else
    	{
    		printf("\nRubrica piena!!!\n");
    	}
    }
    
  • Re: Giudizio per Rubrica su file

    Ah volevo chiederti, dici di cercare se esiste già una funzione che fa quello che mi serve prima di crearla di sana pianta...
    ma come faccio a fare una ricerca del genere?
  • Re: Giudizio per Rubrica su file

    Cerca su internet e pian pianino ti fai la collezione di pezzi di programma che fanno determinate cose. Poi se nel futuro trovi un pezzo migliore lo sostituisci. In questo modo ti crei una mini libreria. Ti consiglerei poi in futuro di buttarti sul C++ ci sono delle librerie e algoritmi giá pronti molto più potenti di quelli del C.
  • Re: Giudizio per Rubrica su file

    Grazie skynet,
    in realtà sto studiando c per passare all'objective c
    farò delle ricerche su google e metterò da parte quello che trovo realizzando un mio archivio
Devi accedere o registrarti per scrivere nel forum
21 risposte