Libreria in C

di il
16 risposte

16 Risposte - Pagina 2

  • Re: Libreria in C

    Vi prego di darmi una mano perchè ho la consegna entro domani e non riesco proprio a venirne a capo. questo è il programma per intero fatto e sistemato seguendo i vostri consigli:
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define max 500
    
    typedef struct dati_libro{
        int codice;
        char autore[20];
        char titolo[20];
        char chiave[5][50];
    }dati_libro;
    
    typedef struct nodo{
        dati_libro *ele;
    	struct nodo *next;
    }nodo;        
    
    typedef struct biblioteca{
        nodo *lista;
    }biblioteca;
            
    void inserisci_testa(nodo **testa, dati_libro *libro){
    	nodo *new = malloc(sizeof(nodo)); //creazione del nuovo nodo
    	new->ele = libro;
    	new->next = *testa;               //aggancio in testa
    	*testa = new;                     //aggiornamento del puntatore alla testa
    }
    	 
    biblioteca dati;                                
    
    int inserisci_libro(){                               //funzione per inserire i dati del libro
    	int aggiungi, i;
    	
      	dati_libro *libro = malloc(sizeof(dati_libro));
        printf("aggiungi dati libro\n");
        printf("inserire codice libro :\n");
    	scanf("%d", &libro->codice);
        printf("inserire autore:");
        while(getchar() != '\n');
        fgets(libro->autore, 20, stdin);
        printf("inserire titolo:");
      //  while(getchar() != '\n');
        fgets(libro->titolo, 20, stdin);
      
        printf("inserire 5 parole chiave\n");
        for(i=0;i<5;i++){                                                //ciclo for per inserire 5 parole chiavi per ogni libro inserito
      	    printf("inserire parola chiave numero %d:\n", i+1);
            scanf("%s", libro->chiave[i]);
            printf("hai inserito: %s\n", libro->chiave[i]);
        }
    	inserisci_testa(&dati.lista, libro);
    	free(libro);
    
    	return aggiungi;
    }
                    
    int inserisci(){
        int aggiungi;
        do{
    	    aggiungi = inserisci_libro();
        } while(aggiungi!=0);
    }
    
    void stampa(dati_libro *libro){                      
        printf("codice del libro e': %d\n", libro->codice);
    	printf("il titolo del libro e': %s\n", libro->titolo);
    	printf("l'autore e': %s\n", libro->autore);
    	printf("\n");
    }
    
    void visualizza3(){
     	char parola[3][20];
        int a, b, c;
        int count;
        nodo *p;
    	printf("per visualizzare il libro cercato inserire 3 parole chiave\n");
        for(a=0;a<3;a++){
            printf("inserire la %d parola chiave\n", a+1);
    	    scanf("%s", parola[a]);
        }
    	for(p=dati.lista; p!=NULL; p=p->next){ //scorro la lista
    	    count=0;
            for(b=0; b<3; b++) //ogni parola chiave cercata
                for(c=0; c<5; c++) //viene confrontata con le 5 parole chiave del libro
                //se la parola corrisponde incremento count e passo alla prossima parola chiave da cercare
                    if(strcmp(parola[b], p->ele->chiave[c]) == 0){ 
    	                count++; 
    	                break;
    	            }
            if(count==3) //tutte e tre le parole sono state trovate
                stampa(p->ele);
    	 }
    }
    
    
    void visualizza1(){   //funzione per inserire 3 parole chiavi per cercare il libro 
     	char parola[3][20];
        int a, b, c;
        int count;
        nodo *p;
    	printf("per visualizzare il libro cercato inserire 3 parole chiave\n");
    	for(a=0;a<3;a++){
            printf("inserire la %d parola chiave\n", a+1);
    	    scanf("%s", parola[a]);
    	}
    	for(p=dati.lista; p!=NULL; p=p->next){
    	    count=0;
            for(b=0; b<3; b++){
                for(c=0; c<5; c++){
                    if(strcmp(parola[b], p->ele->chiave[c])==0){
    			  //se una parola corrisponde metto count = 1 e termino il for interno
    	                count=1;
    				    break;
                    }
    	        }
    		    if(count == 1){
    		 		  //se count == 1 stampo i dati e termino il for intermedio
    	 		    stampa(p->ele);
    		        break;
    		    }         
            }
        }
    }
    
    void visualizza_tutto(){   //funzione per visualizzare l'intera libreria 
    
        nodo *p;
    	
    	for(p=dati.lista; p!=NULL; p=p->next){
    	 		    stampa(p->ele);
    		    }       
            }
    	
    
    
    void rimuovi_lista(int codice){ //funzione per rimuovere il libro
    	nodo *p, *q = NULL;
    	for(p=dati.lista; p!=NULL && p->ele->codice != codice; p=p->next)
    	    q = p;
        if(p == NULL) //se il libro non è presente nella biblioteca stampo:"..."
            printf("il libro non e' presente nella biblioteca\n");
        else{       //nel caso in cui trovo il libro nella biblioteca tramite la funzione "free" rimuovo il libro dalla biblioteca
            if(q == NULL)
                dati.lista = p->next;
            else
    		    q->next = p->next;
    		free(p);
    		printf("libro #%d rimosso con successo\n", codice);
    	}
    }
    
    void rimuovi(){
        int codice;
        printf("inserisci il codice del libro da rimuovere: ");
        scanf("%d", &codice);
        rimuovi_lista(codice);
    }
    
    void salva(){
    	FILE *file = fopen("save.txt","w");  //qui salvo il file in scrittura
    	nodo *p;
    	for(p=dati.lista; p!=NULL; p=p->next){                            
    	    fprintf(file, "%d %s %s %s %s %s %s %s\n", p->ele->codice, p->ele->autore, p->ele->titolo, p->ele->chiave[0], p->ele->chiave[1], p->ele->chiave[2], p->ele->chiave[3], p->ele->chiave[4]);
    	}
    	fclose(file); 
    }
    
    void carica(){
    	FILE *file;
    	dati_libro *ele;         
    	int esito;
        dati.lista = NULL;
        file = fopen("save.txt","r");
    	if(file == NULL)
    	    return;
    	while(1){                            
            ele = malloc(sizeof(dati_libro));
    	    esito = fscanf(file, "%d %s %s %s %s %s %s %s\n", &ele->codice, ele->autore, ele->titolo, ele->chiave[0], ele->chiave[1], ele->chiave[2], ele->chiave[3], ele->chiave[4]);
    	    if(esito == EOF)
    	        break;
            inserisci_testa(&dati.lista, ele);
    	}
    	fclose(file); 
    	free(ele);
    }
    
    int menu()
    {
       int k = 0;
       int result = 0;
       char svuota[100];
       do
       {
          printf("\n\t|1.inserire libro.|\n");
          printf("\t|2.rimuovere libro.|\n");
          printf("\t|3.visualizza libro con almeno una parola chiave uguale.|\n");
          printf("\t|4.visualizza libro con 3 parole chiave uguali.|\n");
    	  printf("\t|5.visualizza tutta la libreria.|\n"); 
          printf("\t|6.termina|\n\n");
          fflush(stdout);
          result = scanf("%d", &k);
          if(result != 1)
          {
             printf("Input non corretto (si  accettano solo numeri), riprova!!!!\n\n");
             scanf("%s",svuota);
             continue;
          }
          switch(k)
          {
             case 1:
                inserisci_libro();
                salva();
                menu();
                
             break;
             case 2:
             	carica();
                rimuovi();
                menu();
                salva();
             break;
             case 3:
                carica();
                visualizza1();
                menu();
             break;
             case 4:
             	carica();
                visualizza3();
                menu();
             break;
             case 5:
             	carica();
             	visualizza_tutto();
             	menu();
             break;
             case 6:
             	carica();
             	salva();
             	break;
    			exit(0);
             	default:
             {
                printf("Input non corretto, inserire numeri da 1 a 6, riprova.\n\n");
             }
             break;
          }
       }while(k != 6);
       return k;
    }
    /*
    void salva(){
    	FILE *file = fopen("save.txt","w");  //qui salvo il file in scrittura
    	nodo *p;
    	for(p=dati.lista; p!=NULL; p=p->next){                            
    	    fprintf(file, "%d %s %s %s %s %s %s %s\n", p->ele->codice, p->ele->autore, p->ele->titolo, p->ele->chiave[0], p->ele->chiave[1], p->ele->chiave[2], p->ele->chiave[3], p->ele->chiave[4]);
    	}
    	fclose(file); 
    }
    
    void carica(){
    	FILE *file;
    	dati_libro *ele;         
    	int esito;
        dati.lista = NULL;
        file = fopen("save.txt","r");
    	if(file == NULL)
    	    return;
    	while(1){                            
            ele = malloc(sizeof(dati_libro));
    	    esito = fscanf(file, "%d %s %s %s %s %s %s %s\n", &ele->codice, ele->autore, ele->titolo, ele->chiave[0], ele->chiave[1], ele->chiave[2], ele->chiave[3], ele->chiave[4]);
    	    if(esito == EOF)
    	        break;
            inserisci_testa(&dati.lista, ele);
    	}
    	fclose(file); 
    }
    */
    int main(){          
        menu();
    
        return 0;
    } 
    il programma ha qualche problema nella funzione inserisci_libro con le fgets poiche quando poi vado a stampare non sempre stampa ad esempio il titolo o l'autore e mentre inserisco il titolo mi considera anche come carattere l'invio.
    problema ancora più grande la funzione carica poichè quando la utilizza mi si riempie tutta la ram e gran parte della memoria del disco rigido.
    spero mi possiate aiutare grazie mille
  • Re: Libreria in C

    La

    free(libro);

    nella inserisci_libro è un grave errore in quanto deallochi la memoria per i dati che hai appena inserito; devi eliminarla.

    In più, la funzione inserisci dovrebbe restituire un intero oppure deve essere di tipo void.

    E infine, l'opzione 6 non termina il programma.

    Non ho fatto altri controlli ...
Devi accedere o registrarti per scrivere nel forum
16 risposte