Gestione Biblioteca

di il
9 risposte

Gestione Biblioteca

Si vuole simulare la gestione automatizzata di una biblioteca. Si suppone di
avere un archivio di massimo 100 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:
• Inserire un nuovo libro nell’archivio (automaticamente gli viene
assegnato un codice).
• Richiedere un libro tramite il codice (verificare se esso è presente o
non è in prestito).
• Cercare nell’archivio il libro più costoso (usare un approccio divide-etimpera)
Implementare l’algoritmo per la simulazione della biblioteca ed effettuare almeno
un test per ognuna delle opzioni richieste dall’utente.


Quando scelgo l'opzione 3 crasha, come mai?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "list.h"

    /* Inizio programma*/

    int main ()

    {
    /*Dichiarazione variabili*/
    srand(time(NULL));
    int i; /*Contatore del ciclo for che scorrerà l'indice dei libri contenuti nell'array di struct*/
    int id; /*Variabile d'appoggio nella quale sarà inserito il codice che l'utente inserirà da tastiera nel case 2*/
    int trovato; /*La variabile servirà per trovare il libro nell'archivo tramite codice nel case 2 e verificarne lo status*/
    char titolo_richiesto,autori; /*Variabili a cui avrà accesso la scanf nel momento in cui l'utente digiterà
    titolo e autori del nuovo libro da inserire nell'archivio*/
    int prezzo; /*Come sopra, solo che sceglierà il prezzo*/
    int status_new; /*Infine qui deciderà se il libro è in prestito o meno*/
    int ultimo_id = 12; /*Viene dichiariato l'ultimo id corrispondente all'ultimo libro inserito in archivio e viene
    incrementato "causalmente" (più in avanti nel main), in modo da assegnare un nuovo codice ai libri inseriti*/
    int scelta;  /*Variabile di controllo dello switch*/
    int a[12]={15,13,10,12,7,9,18,17,14,13}; /*Array "fantasma" che riporta i prezzi utlizzati nella function
    "libro_costoso_DI" (vedi function.c)*/
    int max_libro; /*Variabile usata per indicare il libro con il costo massimo*/
    int libri_presenti=0;  /*Variabile che sarà utilizzata come puntatore per accedere ai libri presenti nell'array di struct*/
     /* Inizializzazione della libreria */
    Libro libreria [] =
    {
    {"Crypto","Dan Brown",1,15,0},
    {"Steve Jobs","Walter Isaacson",2,13,1},
    {"Il centenario che salto' dalla finestra e scomparve", "Jonas Jonasson",3,10,1},
    {"Il trono di spade I", "George R. R. Martin",4,12,0},
    {"Il trono di spade II", "George R. R. Martin",5,7,1},
    {"Il trono di spade III", "George R. R. Martin",6,9,0},
    {"Il trono di spade IV", "George R. R. Martin",7,18,0},
    {"Harry Potter e la pietra filosofale", "J.K.Rowling",8,17,0},
    {"Harry Potter e la camera dei segreti", "J.K.Rowling",9,14,1},
    {"Harry Potter e il prigioniero di Azkaban", "J.K.Rowling",10,13,1},
    {"Inferno","Dan Brown",11,12,1},
    {"Cinquanta sfumature di grigio","E.L. James",12,14,0},
    };
do
    {
printf("\nBenvenuto nel programma di gestione biblioteca Parthenope!\n");
printf ("Cosa vuoi fare?\n 1) Inserisci un nuovo libro nell'archivio\n 2) Richiedi un libro tramite il codice\n 3) Cerca il libro piu' costoso\n 4) Esci dalla biblioteca\n");
scanf("%d",&scelta); /*L'utente fa la sua scelta*/
/*Inizio switch*/
switch (scelta) {

case 1:
printf("Inserisci il titolo del libro da inserire:\n");
scanf("%s", &titolo_richiesto);
while(getchar() != '\n');
printf("Inserisci il nome dell'autore o degli eventuali autori:\n");
scanf ("%s", &autori);
while(getchar() != '\n');
printf("Inserisci il prezzo:\n");
scanf("%d", &prezzo);
printf("Vuoi che il libro venga aggiunto nella lista dei prestiti? Digita 1 se vuoi, altrimenti digita 0.\n");
scanf ("%d", &status_new);
if (status_new==1)
{
printf ("Il libro e' stato inserito correttamente nella biblioteca,nella lista prestiti. Il suo codice identificativo e': %d", ultimo_id=1+rand()%50);
}
else
{
printf ("Il libro e' stato inserito correttamente nella biblioteca. Il suo codice identificativo e': %d", ultimo_id=1+rand()%50);
}
break;

case 2: /*L'utente richiede un libro tramite codice identificativo*/

printf("\nInserisci il codice identificativo del libro da richidere:\n");
scanf ("%d", &id);
trovato=0;
for (i=0;i<=12;i++)
{
if (id==libreria[i].codice_identificativo)
{
trovato=1;

if(libreria[i].status==1){
    printf("\Come da lei richiesto,%s le sara' dato in prestito!\n",libreria[i].titolo);
    }
    else if (libreria[i].status==0)
    {
    printf("\nCi dispiace, %s, al momento e' in prestito.\n", libreria[i].titolo);}
}
}
if (trovato==0)
    {
    printf("\nIl libro non e' presente nei nostri archivi.\n");}
    break;

    case 3: /* L'utente vuole cercare il libro più costoso nell'archivio */


    {           copialibri(a,libreria,&libri_presenti);
                prezzo = libro_costoso_DI(a,libri_presenti);
                max_libro = ricercaprezzo(libreria,prezzo,libri_presenti);
                printf(" Il libro più costoso è:\n%s,\n",libreria[max_libro].titolo);
    }
break;


    case 4 : /*Se l'utente vuole uscire dalla biblioteca*/
    printf("Grazie per aver scelto il servizio di gestione della biblioteca, torna a trovarci!\n");
    break;



    default: /*Se l'utente sbaglia ad inserire il numero*/
    printf("Questo tasto non consente di effetuare scelte! Riprova!\n");break;


} /*Fine switch*/
} /*Fine do*/
  while (scelta!=4);
  return 0;
  } /*Fine main*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "list.h"

void copialibri(int a[],Libro libreria[],int *libro)
{ int i;
for (i=0;i<*libro;i++)
{ a[i]=libreria[i].prezzo_prestito;
}
}
int ricercaprezzo(Libro libreria[],int chiave,int n){
    int i;
    for(i=0;i<n;i++){
        if(chiave==libreria[i].prezzo_prestito){
            return i;
        }
    }
    return -1;
}
int max_I(int a,int b){
    if (a>b){
        return a;
    }else{
        return b;
    }
}
int libro_costoso_DI(int libreria[],int n)
{
int mediano;
if(n==1)
return libreria[0];
else
{
mediano = (n-1) /2;
return max_I(libro_costoso_DI(libreria,mediano+1),libro_costoso_DI(libreria+mediano+1,n-mediano-1));
}
}


I commenti di queste function/procedure li ho salvati su una pendrive nella quale ho la relazione del progetto, se dovessero servire me li procuro.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

/*Struct di 5 campi per libro*/
/*Lo status indica se il libro è disponibile per il prestito (1) oppure no (0)*/

struct libro
{ char titolo[50];
  char nome_autori[5];
  int codice_identificativo;
  int prezzo_prestito;
  int status;
};
typedef struct libro Libro;

/*La typedef permetterà di creare un array di struct nel corpo nel main attraverso cui inserire dei
libri con le caratteristiche descritte sopra nella struct*/

int max_I(int a,int b); /*Function che cerca il massimo tra due interi*/
void copialibri(int a[],Libro libreria[],int *libro);/*Procedura per copiare i libri dall'array principale della biblioteca all'array "fantasma".*/
int ricercaprezzo(Libro libreria[],int chiave,int n); /*Funzione per la ricerca sequenziale del prezzo*/
int libro_costosoDI(int libreria[],int n); /*Function ricorsiva per la ricerca del
massimo con approccio divide et impera*/

Grazie mille a chi mi aiuterà!

9 Risposte

  • Re: Gestione Biblioteca

    Comincia ad identificare in quale linea o funzione avviene il crash con il debugger
  • Re: Gestione Biblioteca

    oregon ha scritto:


    Comincia ad identificare in quale linea o funzione avviene il crash con il debugger

    Il crash avviene qua.

    case 3: /* L'utente vuole cercare il libro più costoso nell'archivio */


    { copialibri(a,libreria,&libri_presenti);
    prezzo = libro_costoso_DI(a,libri_presenti);
    max_libro = ricercaprezzo(libreria,prezzo,libri_presenti);
    printf(" Il libro più costoso è:\n%s,\n",libreria[max_libro].titolo);
    }
    break;

    Il debugger non da errori di compliazione, dato che il programma viene eseguito. L'unico problema sta nel crash di questo case. Forse è dovuto a qualche errore nella function, qualche restitutizione di valori nel main sbagliata, non so.
  • Re: Gestione Biblioteca

    Così non rispondi... Non ti avevo chiesto il case ma la linea in cui avviene
  • Re: Gestione Biblioteca

    oregon ha scritto:


    Così non rispondi... Non ti avevo chiesto il case ma la linea in cui avviene
    Ah scusami non avevo capito bene la domanda. Visto che il problema lo ho in esecuzione dovrei fare un debug quando eseguo il programma, per poi riportare l'errore qua giusto?
  • Re: Gestione Biblioteca

    Si... Dovresti
  • Re: Gestione Biblioteca




    Ecco qua!
  • Re: Gestione Biblioteca

    Quando chiami la funzione

    libro_costoso_DI

    il parametro n all'ingresso è uguale a 0

    Che senso ha?

    Tra l'altro la lunghezza del campo titolo (50) e dell'autore (5) nella struttura sono insufficienti.
  • Re: Gestione Biblioteca

    oregon ha scritto:


    Quando chiami la funzione

    libro_costoso_DI

    il parametro n all'ingresso è uguale a 0

    Che senso ha?

    Tra l'altro la lunghezza del campo titolo (50) e dell'autore (5) nella struttura sono insufficienti.
    In che senso? Beh la function restituisce l'indirizzo base dell'array e poi perché la lunghezza di campo titolo ed autore sarebbero insufficienti?
  • Re: Gestione Biblioteca

    ManuEspo ha scritto:


    In che senso?
    Nell'unico senso possibile ... non credo di potermi spiegare meglio ...

    Il parametro n all'ingresso è uguale a 0
    perché la lunghezza di campo titolo ed autore sarebbero insufficienti?
    Non ti sei accorto che hai inizializzato il vettore con un titolo di 51 caratteri e autori ben più lunghi di 5 caratteri?
Devi accedere o registrarti per scrivere nel forum
9 risposte