Come creare una biblioteca?

di il
11 risposte

Come creare una biblioteca?

Salve a tutti,
sto cercando di creare un programma che:
1)Permetta di inserire nuovi libri
2)Permetta di trovarli(usando la ricerca binaria)
3)Li stampi su schermo e mi permetta di ritirarli e segnali che non sono più disponibili nel caso uno li richieda ancora.

Il difficile(almeno per me ) è che lo voglio fare su un file.
Posto il programma senza file che sono riuscito a fare ma che ha la deplorabile seccatura di dover inserire tutte le volte a mano i libri e non li mette in ordine(anche se per quello so usare il bubblesort).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct libro{         //Già che ci siete mi potete spiegare la differenza tra il
                char titolo[40];//mettere "libro" dopo struct o metterlo dopo le graffe?      
                char autore[40];
                char disponibile[15];
                };

int rcrcbnr(libro biblioteca[], int i, char ricerca[]){                        

    int inizio, fine, centro;
    inizio = 0; fine = i - 1;
    
    printf("\n%s%d\n", ricerca, i);//Stampa a titolo indicativo
    
    while(inizio <= fine){
                 centro = (inizio + fine) / 2;
                 printf("\nCentro:%d\nInizio:%d\nFine:%d", centro, inizio, fine); /*Stampa a titolo                              indicativo*/
                 if(!(strcmp(biblioteca[centro].titolo,ricerca)))
                 return centro;
                 if(strcmp(biblioteca[centro].titolo,ricerca) < 0)
                 inizio = centro + 1;
                 if(strcmp(biblioteca[centro].titolo,ricerca) > 0)
                 fine = centro - 1;
                 }
    return -1;
}

int main(){
    
    int a;
    char lineanuova;
    printf("libri da inserire: ");
    scanf("%d", &a);
    scanf("%c", &lineanuova);      //A questo non fateci caso perchè non ha una funzione in sè
    
    libro biblio[a];
    int i;
    char ricerca[40];
    
    for(i = 0; i < a; i++){
    printf("\nInserire titolo%d: ", i+1);
    gets(biblio[i].titolo);
    printf("\nInserire autore%d: ", i+1);
    gets(biblio[i].autore);
    printf("\nInserire se è disponibile%d: ", i+1);
    gets(biblio[i].disponibile);
    }
    
    printf("\nInserire il titolo da ricercare: ");
    gets(ricerca);
    
    i = rcrcbnr(biblio,a,ricerca);
    
    if(i == (-1))
    printf("\nLibro non trovato\n");
    else
    printf("\nLibro trovato:\n%s\n%s\n%s\n", biblio[i].titolo, biblio[i].autore, biblio[i].disponibile);
    
if(biblio[i].disponibile == "si"){
   printf("Ritirare?: ");
   gets(scelta);
   
   if(scelta == "si")
   strcpy(biblioteca[i].disponibile,"no");
   }

    printf("\n");
    system("pause");
    return 0;
}
Sono comunque riuscito ad iniziare ma non so come scrivere i libri sul file perché restino ordinati così da usare la binaria...
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define MAXTITOLO 40
    #define MAXAUTORE 40
    #define MAXDISPONIBILE 15 //Permette l'inserimento di "disponibile" o "nondisponibile"
    
    int main(){

        FILE *archi;

        archi = fopen("BIBLIOTECA.txt","r+");

        if(!archi){
                   printf("Errore apertura database biblioteca");               
                   system("pause");
                   return 1;
                   }

        typedef struct{
                char titolo[MAXTITOLO];
                char autore[MAXAUTORE];                                                 
                char disponibile[MAXDISPONIBILE];
                }libro;

        char titolo[MAXTITOLO];
        char autore[MAXAUTORE];
        char scelta[MAXDISPONIBILE];
        int i, numlibri;

        fscanf(archi,"%d",&numlibri);                   //Prende il numero dei libri dal file

        printf("Benvenuti alla biblioteca\n\n");

        do{                          
                                     printf("Registrare un nuovo libro(si/no)? ");
                                     gets(scelta);
        }while(strcmp(scelta,"si") != 0 && strcmp(scelta,"Si") != 0 && strcmp(scelta,"no") != 0 && strcmp(scelta,"No") != 0);

        if(strcmp(scelta,"Si") == 0 || strcmp(scelta,"si") == 0){
                                                            
           printf("\nQuanti nuovi libri si devono registrare? ");
           scanf("%d", &i);
           numlibri += i;
                                                            
           rewind(archi);
           fprintf(archi,"%d          ",numlibri);  //Aggiorno il totale dei libri scrivendo sul file

           libro biblio[i]; //i rappresenta il numero di libri immessi mentre numlibri è il totale dei libri
           int j;
                                                            
                            for(j = 0; j < i; j++){

                               do{
                                  printf("\nTitolo: ");
                                  gets(biblio[j].titolo);
                                  printf("\nAutore: ");
                                  gets(biblio[j].autore);
                                  printf("\nDisponibilità(disponibile o nondisponibile): ");
                                  gets(biblio[j].disponibile);
                                  }while(strcmp(biblio[j].disponibile,"disponibile") != 0 && strcmp(biblio[j].disponibile,"nondisponibile") != 0);

        printf("\n\nVuoi cercare:per titolo, per autore o per entrambi(scrivere titolo o autore o titoloautore o no)?");

        do{
        printf("Ricerca: ");
        gets(scelta);
        }while(strcmp(scelta,"titolo") != 0 && strcmp(scelta,"autore") && 0 || strcmp(scelta,"titoloautore") != 0 && strcmp(scelta,"no") != 0 && strcmp(scelta,"No") != 0);
        
        
        
        if(!(strcmp(scelta,"titolo")){//Ecc...
Devo usare la funzione fseek? Se si come?
E come faccio ad inserire i titolo dei libri in modo che siano ordinati in ordine alfabetico?
Avevo pensato di strutturare il file di testo in questo modo:
3 //Numero dei libri presenti
Titolo
Autore
Disponibile
Titolo
Autore
Disponibile
Ecc...
Grazie in anticipo per le vostre risposte!

11 Risposte

  • Re: Come creare una biblioteca?

    Ridimensiono tutta la mia domanda perché credo che con tutti quei giri di parole abbiano allontanato da me le risposte quindi:
    1)Come si fa per scrivere su un file delle stringhe in modo da tenerle in ordine alfabetico? Dato che i file sono (correggetemi se sbaglio) delle sequele di dati, come faccio a creare un "vuoto" dove inserire nuovi dati nel mezzo?
    2)Se non si può, come si ovvia al problema? E' fattibile (e conveniente con una grande mole di dati) usare un file testo d'appoggio su cui riscrivere unendo i nuovi dati e quelli vecchi(è l'unico modo che mi viene in mente)?
    Attendo con ansia(si fa per dire) le vostre risposte .
    Grazie ancora per il vostro tempo.
  • Re: Come creare una biblioteca?

    Sai usare le strutture? Se si usali che ti sarano utili. Non puoi lasciare righe vuote su file in quanto sequenziali, ma puoi scrivere dati ordinati. Quindi anche strutture ordinate.
  • Re: Come creare una biblioteca?

    In questo caso ti conviene scrivere i dati nel file "accodandoli" (uno dopo l'altro) e riscrivere un file molto "leggero" con i numeri dei record mantenuti nell'ordine corretto (un file indice)
  • Re: Come creare una biblioteca?

    skynet ha scritto:


    Sai usare le strutture? Se si usali che ti saranno utili. Non puoi lasciare righe vuote su file in quanto sequenziali, ma puoi scrivere dati ordinati. Quindi anche strutture ordinate.
    Si le so usare, ma, il mio problema è connettere quello che so sullo scrivere sui file(per me nuovo) su quello cui sono abituato a fare, cioè:
    Se io ho un array di strutture(di libri) e lo devo conservare, ma devo all'occorrenza aggiungerne in modo ordinato direttamente sul file, a che cosa mi servono le strutture?
    Si può caricare sul file, invece che stringhe, direttamente delle strutture, forse aprendo il file in binario(non lo so sto sparando ...)?

    oregon ha scritto:


    In questo caso ti conviene scrivere i dati nel file "accodandoli" (uno dopo l'altro) e riscrivere un file molto "leggero" con i numeri dei record mantenuti nell'ordine corretto (un file indice)
    Credo di aver capito: la soluzione sarebbe di scrivere i dati su un file (in "a+") così come vengono e conservare le loro posizioni in un altro file in modo che siano ordinati?
    Tipo così:
    FILE1--------------------------------- FILE2
    Oliver Twist------------------------- 14
    I promessi sposi-------------------- 31
    Le idi di marzo--------------------- 0
    Se ho capito quello che volevi dirmi allora ti ringrazio perché mi sembra perfetto(come sempre le vostre risposte d'altronde )
  • Re: Come creare una biblioteca?

    Si può caricare sul file, invece che stringhe, direttamente delle strutture, forse aprendo il file in binario
    Si, vedi le funzioni fread e fwrite ma solo se usi strutture POD e cioè a dimensione fissa per i campi.
    cioè
    char nome[50];
    char descrizione[100]
    ecc...
  • Re: Come creare una biblioteca?

    skynet ha scritto:


    Si, vedi le funzioni fread e fwrite ma solo se usi strutture POD e cioè a dimensione fissa per i campi.
    Quelle due funzioni non mi sono proprio proprio chiare...Infatti coi blocchi ho poca dimestichezza...
    Cioè, ho provato a farmi un esempio per provare:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(){
        
        FILE *fp;
        
        fp = fopen("TESTPROVA","ab+");
        
        if(!fp){
                
                printf("ERRORE");
                return 1;
                }
        
        printf("File aperto\n\n");
        
        typedef struct libro{
                
                char titolo[30];
                char autore[30];
                int disponibile;
                };
        
        int a;
        char c;
        printf("Libri da inserire ");
        scanf("%d%c", &a, &c);
        
        libro biblio[a];
        libro letto[a];
        
        for(int i = 0; i < a; i++){
                
                printf("\nTitolo ");
                gets(biblio[i].titolo);
                printf("\nAutore ");
                gets(biblio[i].autore);
                printf("\nDisponibile ");
                scanf("%d%c", &biblio[i].disponibile, &c);
                }
        rewind(fp);
        fwrite(biblio, sizeof(biblio[0]), sizeof(biblio) / sizeof(biblio[0]),fp);
        
        rewind(fp);
        
        fread(letto, sizeof(letto[0]), sizeof(letto) / sizeof(letto[0]),fp);
        fclose(fp);
        
        for(int i = 0; i < a; i++){
                
                printf("\nTitolo ", letto[i].titolo);
                printf("\nAutore ", letto[i].autore);
                printf("\nDisponibile ", letto[i].disponibile);
                }
        
        system("pause");
        return 0;
    }
    Ma sicuramente c'è qualcosa di sbagliato nella fread perché non mi stampa niente , cos'è?
  • Re: Come creare una biblioteca?

    Alla fine, nelle printf manca qualcosa ... deve essere
    
                printf("\nTitolo %s", letto[i].titolo);
                printf("\nAutore %s", letto[i].autore);
                printf("\nDisponibile %d", letto[i].disponibile);
    
  • Re: Come creare una biblioteca?

     for(int i = 0; i < a; i++){
                   
                    printf("\nTitolo %s", letto[i].titolo);
                    printf("\nAutore %s", letto[i].autore);
                    printf("\nDisponibile %d", letto[i].disponibile);
                    }
    Controlla anche le definizioni degli array. Non tutti i compilatori supportano il VLA ovvero la definizione di array statici a runtime (vedi libro biblio[a] quando a non è costante.
  • Re: Come creare una biblioteca?

    Che errore da scemo , non me n'ero proprio accorto...

    skynet ha scritto:


    Controlla anche le definizioni degli array. Non tutti i compilatori supportano il VLA ovvero la definizione di array statici a runtime (vedi libro biblio[a] quando a non è costante.
    No, per quello non mi ha mai dato problemi, comunque (mi sembra) che il metodo dei due file: indice e archivio sia un po' lunghetto, perché (da come l'ho capito) deve comunque, quando scorre l'indice per inserire nuovi valori fare un controllo lineare, essendo molto scarno non so se possa impiegare lassi di tempo sensibile. Anche se effettivamente mi sembra l'unica soluzione possibile...
    Grazie mille per l'aiuto che date mettendo a servizio degli altri il vostro sapere!!!
  • Re: Come creare una biblioteca?

    Platone 2.0 ha scritto:


    No, per quello non mi ha mai dato problemi
    Perché molto probabilmente usi DevC++/mingw (che non sono raccomandabili).
    Con altri compilatori avresti i problemi indicati. Dovresti usare l'allocazione dinamica degli array.
    il metodo dei due file ... un controllo lineare
    Non dovresti controllare linearmente ma usare la "ricerca dicotomica" ...

    http://it.wikipedia.org/wiki/Ricerca_dicotomic
  • Re: Come creare una biblioteca?

    oregon ha scritto:



    Perché molto probabilmente usi DevC++/mingw (che non sono raccomandabili).
    Si infatti uso dev ...

    oregon ha scritto:


    Non dovresti controllare linearmente ma usare la "ricerca dicotomica" ...

    http://it.wikipedia.org/wiki/Ricerca_dicotomic
    Nono, ma io infatti la uso, dico solo che si deve comunque riscrivere tutto il file degli indici quando si inserisce qualcosa di nuovo. Intendo dal nuovo elemento in poi, in modo che siano in ordine:

    indice1\n
    indice2\n
    indicen\n
    ...
    Quando inserisco uno nuovo(che magari è indice1 < indicenuovo < indice2):

    indice1\n
    indicenuovo\n lo inserisco con fprintf(fp, "%d\n", ftell(biblioteca))
    Poi devo riscrivere indice2 al posto di indicen e così via fino alla fine del file.
    P.s
    biblioteca è il file dove tengo i libri e la descrizione ma non sono in ordine quindi uso un file dove tengo le posizioni dei cursori dei vari titoli in ordine come dicevo un paio di post fa.

    Platone 2.0 ha scritto:


    oregon ha scritto:


    In questo caso ti conviene scrivere i dati nel file "accodandoli" (uno dopo l'altro) e riscrivere un file molto "leggero" con i numeri dei record mantenuti nell'ordine corretto (un file indice)
    Credo di aver capito: la soluzione sarebbe di scrivere i dati su un file (in "a+") così come vengono e conservare le loro posizioni in un altro file in modo che siano ordinati?
    Tipo così:
    FILE1--------------------------------- FILE2
    Oliver Twist------------------------- 14
    I promessi sposi-------------------- 31
    Le idi di marzo--------------------- 0
    Se ho capito quello che volevi dirmi allora ti ringrazio perché mi sembra perfetto(come sempre le vostre risposte d'altronde )
Devi accedere o registrarti per scrivere nel forum
11 risposte