PDA

Visualizza la versione completa : Gestione biblioteca in c mi da errori


giuseppe26
21-10-2013, 14:40
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:




#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...

oregon
21-10-2013, 14:46
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 ...

schumy2000
23-10-2013, 09:52
controlla intanto


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.

oregon
23-10-2013, 10:40
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 ...

schumy2000
23-10-2013, 11:16
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

oregon
23-10-2013, 11:30
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 ...

schumy2000
23-10-2013, 17:30
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


int n = sizeof(a) / sizeof(int);

dove 'a' il vettore e 'n' il numero di elementi.

MegaAlchimista
24-10-2013, 15:48
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


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

Loading