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à!