Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Gestione biblioteca in c mi da errori

    Si vuole simulare la gestione automatizzata di una biblioteca. Si suppone di avere un
    archivio di massimo 20 libri identificati da un titolo, nome dell’autore o autori (massimo
    5), da un codice identificativo e da un prezzo di prestito. Un libro può essere presente
    nell’archivio o in prestito.
    Permettere all’utente di:

    1. Inserire un nuovo libro nell'archivio se è possibile (automaticamente gli viene assegnato un codice)
    2. Richiedere un libro tramite il titolo (verificare se esso è presente e non è in prestito)
    3.
    Richiedere un libro tramite il codice (verificare se esso è presente e non è in prestito)
    4. Restituire un libro tramite il codice
    5. Cercare nell'archivio il libro più costoso( usando un approccio ricorsivo)

    Il codice C che ho sviluppato è il seguente:


    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <time.h>
    
    
    /* Creazione di un array di struct libro contenente 5 campi*/
        struct libro{
            char titolo[30];
            char nome_autori[5][20];
            int codice_identificativo;
            int prezzo_di_prestito;
            int status;   /* Status indica se il libro è presente(1) oppure è in prestito(0)*/
            };
    typedef struct libro Libro;
    
    
    int main ()
        {
    
    
    int var;     /*Questa variabile sarà utilizzata nella switch per decidere che cosa fare...*/
    int i,max;   /* Variabili utilizzate per inserire un nuovo libro nell'archivio */
    int flag=2;
    char titolo_richiesto [30]; /* Le variabili flag e titolo_richiesto sono utilizzate per richiedere un libro tramite il codice */
    int cod_id;  /* Variabile utilizzata per richiedere un libro tramite il codice*/
    int id;      /* Variabile utilizzata per restituire un libro tramite codice*/
    int maxi;    /* Variabile utilizzata per cercare il libro più costoso */
    
    
    /* Inizializzazione della libreria */
    Libro libreria [] =
    {
            {"Il signore degli anelli","James Redfield","Silvestrone",5,1,1},
            {"Harry Potter","Paulo Coelho",7,1,2},
            {"La bibbia","Marco Bianchi",8,0,3},
            {"Piccole donne","Piero Mozzi",60,0,4},
            {"Guarnizione","Napoleton Hill",1,0,5},
            {"Il nome della rosa","Louise",10,1,6},
            {"Via col vento","Jerry Ford",3,1,7},
            {"Odissea","Rhonda Bryne","Galano","Loius Scott","Trent",40,1,8},
            {"Cuore","Fabio Marchesi",12,1,9},
            {"Malavoglia","Valeria Soglia",4,0,10},
            {"Siddharta","Still",2,1,11},
            {"Lolita","Moccia","Crail Wilcox",12,0,12},
            {"Amabili resti","Wagner","Pone Raffy",35,1,13},
            {"Sulla strada","Boldi",1,1,14},
            {"Possession","Esposito Faby",25,1,15},
            {"Germinale","Fabio Beatrice",10,0,16},
            {"Il piccolo principe","Siani",24,1,17},
            {"Un uomo","Finucci Genny",14,1,18},
            {"Amleto","Ohls","Ylenia Star",23,0,19}
                            };
    
    
        /* Inizializzazione biblioteca  */
     do
     {
        printf("* * * * * * * * * * * * * * * * * * * * * * *\nBenvenuto nel programma di gestione biblioteca\n* * * * * * * * * * * * * * * * * * * * * * *\n");
        printf("Premere:\n       1. Per inserire un nuovo libro;\n       2. Per richiedere libro tramite titolo;\n       3. Per richiedere un libro tramite codice;\n       4. Per restituire un libro;\n       5. Per cercare libro piu costoso;\n       0. Per uscire.\n");
    
    
        scanf("%d",&var);     /*Viene inserito nella variabile var il numero inserito dall'utente e di conseguenza inserito nel ciclo Switch*/
      switch (var)  /* Creo uno switch con 5 case, uno per ogni possibile scelta */
      {
    
    
        case 1 :  /* Se l'utente preme tasto 1 si attiva questo case per inserire un nuovo libro nell'archivio */
    
    
        i=0;
        max=0;
            for(i=0;i<30;i++)
            {
            if(libreria[i].codice_identificativo>max){
        max=libreria[i].codice_identificativo;}
            }
        printf("Inserire titolo del libro:\n ");
        scanf("%s",&libreria[max+1].titolo);
        printf("Inserire nome dell'autore:\n");
        scanf("%d",&libreria[max+1].nome_autori);
        printf("Inserire 1 se il libro e' disponibile oppure 0 se è in prestito:\n");
        scanf("%d",&libreria[max+1].status);
        libreria[max+1].codice_identificativo=max+1;
        printf("Grazie!! Il libro e' stato inserito nell'archivio correttamente\n");
        break;
    
    
        case 2 : /* Se l'utente preme il tasto 2 vuole richjedere un libro tramite il titolo*/
    
    
        i=0;
        printf("Inserire il titolo del libro da richiedere:\n");
        scanf("%s",&titolo_richiesto);
            while(flag!=0 && i<30){
            if(strcmp(titolo_richiesto , libreria[i].titolo)==0){
        flag=0;
            if(libreria[i].status==1){
        printf("\nIl libro e' presente nell'archivio ed e' disponibile.\n");
        libreria[i].status=0;
        printf("\nSuddetto libro le e' appena stato ceduto in prestito.\nArrivederci e Grazie!");}
            else{
        printf("\nIl libro e' presente nell'archivio ma attualmente e' in prestito\n");}
            }
            else{
        i=i+1;}}
            if(flag!=0){
        printf("\nIl libro non e' presente nell'archivio!!\n");} break;
    
    
        case 3 : /* Premendo il tasto 3 l'utente vuole richiedere un libro tramite il titolo*/
    
    
        i=0;
        printf("Inserire il codice identificativo del libro da richiedere: \n");
        scanf("%d",&cod_id);
            while(flag!=0 && i<30){
            if(cod_id==libreria[i].codice_identificativo){
        flag=0;
            if(libreria[i].status==1){
        printf("\nIl libro e' presente nell'archivio ed e' disponibile.\n");
        libreria[i].status==0;
        printf("\nSuddetto libro le e' appena stato ceduto in prestito: %s.\nArrivederci e Grazie!\n", libreria[i].titolo);}
            else{
        printf("\nIl libro e' presente nell'archivio ma attualmente e' in prestito\n");}
            }
            else{
        i=i+1;}}
            if(flag!=0){
        printf("\nL'archivio non dispone di alcun libro avente questo codice identificativo\nArrivederci e Grazie!\n");}
        break;
    
    
        case 4 :  /* Case costruito per restituire un libro tramite codice*/
    
    
        i=0;
        printf("Inserire il codice identificativo del libro da restituire: \n");
        scanf("%d",&id);
            while(flag!=0 && i<30){
            if(id==libreria[i].codice_identificativo){
        flag=0;
            if(libreria[i].status==1){
        printf("\nErrore: Il libro e' gia' disponibile.\nArrivederci e Grazie.\n");}
            else{
        libreria[i].status=1;
        printf("\nSuddetto libro e' appena stato restituito: %s\nLa ringraziamo per la serieta'. Arrivederci!\n",libreria[i].titolo);}
            }
            else{
        i=i+1;}}
            if(flag!=0){
        printf("\nL'archivio non dispone di alcun libro avente questo codice identificativo\nArrivederci e Grazie!");}
        break;
    
    
        case 5: /* Si vuole cercare il libro più costoso nell'archivio */
    
    
         maxi = 0;
        for(i=1;i<20;i++)
        {
            if(libreria[i].prezzo_di_prestito > libreria[maxi].prezzo_di_prestito)
            {
                maxi = i;
            }
        }
        printf("\n\nIl libro col prezzo massimo e': %s", libreria[maxi].titolo);
        return 0; break;
    
    
        case 0 :
    
    
            printf("Hai deciso di uscire dalla libreria!! Ciao!!\n"); break;
    
    
        default:printf("Inserimento Errato\nRiprovare: \n:");break; /*Se l'utente sbaglia ad inserire il numero*/
      } /* Fine switch */
     }  /* Fine do */
        while (var>5);
        system("Pause");
    }
    Il programma mi dà diversi errori... al punto 1 non mi fa inserire il libro nell'archivio e mi dà errore...
    anke il punto 2-3 non mi fa richiedere libro... cioè da risultati strani...Aiutatemi a correggere questo programma grazie a tutti...
    Ultima modifica di MItaly; 21-10-2013 a 14:48 Motivo: Aggiunti tag [CODE] ... [/CODE]

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    1) Usa i tag CODE altrimenti non si capisce molto ...

    2) La correzione va fatta, problema per problema, indicandoli esattamente ... non lasciare a chi ti risponde tutto il compito ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    controlla intanto
    codice:
      if(libreria[i].codice_identificativo>max){ 
           max=libreria[i].codice_identificativo;}  
       }
    max a me ritorna un valore strano...controlla ad ogni iterazione il suo valore...
    per gli altri errori spiegati meglio.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    max a me ritorna un valore strano...controlla ad ogni iterazione il suo valore...
    Semplicemente perché la for va da 0 a 29 ma non esistono tutti questi libri nel vettore ...

    In generale, ci sono problemi con gli indici usati nelle for ... da 0 a 30 ... da 1 a 20 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    E' vero...ma l'ultimo programma in C l'ho fatto 3 anni fà , prima di cominciare con c# e java,
    ma cmq ancora qlcs ricordo
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    E' vero...ma l'ultimo programma in C l'ho fatto 3 anni fà , prima di cominciare con c# e java,
    Era solo una spiegazione a quanto avevi scritto, non una critica :-)

    E anche in C# non puoi andare con gli indici oltre gli elementi allocati in un vettore ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  7. #7
    Si lo so ma in tali linguaggi non mi pongo il problema....[nomearray].length in java e sono a posto.

    qui a quanto ho letto per determinare la grandezza di un vettore si fa
    codice:
    int n = sizeof(a) / sizeof(int);
    dove 'a' è il vettore e 'n' il numero di elementi.
    Ultima modifica di schumy2000; 23-10-2013 a 17:43
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  8. #8
    Innanzi tutto ti consiglio di fare una modifica alla struct libro, e sostituire l'intero con un enum, questo aggiunge una maggiore chiarezza e può evitare eventuali futuri errori
    codice:
    Enum Book_status {Sconosciuto=0, Presente=1, InPrestito=2}
    struct libro{
            char titolo[30];
            char nome_autori[5][20];
            int codice_identificativo;
            int prezzo_di_prestito;
            //int status;/* Status indica se il libro è presente(1) oppure è in prestito(0)*/
            Book_status status;
    };
    

    Salvati inoltre il numero di libri effettivamente presenti nel vettore.
    Magari inizializza tutti gli spazi vuoti del vettore effettivamente a valori nulli.
    Per quanto riguarda il caso 1 (inserisci un nuovo libro) ti consiglio di procedere in questo modo:
    - crea una funzione di ricerca in base al titolo (o altri parametri che ritieni validi)
    - quando l'utente inserisce il titolo controlla 1)che tu abbia spazio per inserire nuovi libri 2)che il libro non sia già presente. In uno di questi due casi dagli una notifica
    - crea un nuovo dato di tipo Libro e poi assegnalo nella posizione giusta.

    Fai tutte queste operazioni con delle funzioni specifiche, perchè poi potrai chiamarle quando ti servono senza dover riscrivere il codice. Inoltre renderai molto più leggibile ciò che avviene in questo switch-case

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.