Minomic, oragon. Il programma l' ho finito, l' ho fatto così.
magari potete darmi qualche consiglio, oppure se c'è qualcosa che si può evitare per semplificarlo ulteriormente, fatemi sapere. Grazie mille.
Questo è il programma terminato:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
*
*/
// Grandezze
#define LUNG_STRINGA 13
// Grandezze archivi
#define MAX_AUTORI 10
#define MAX_LIBRI 100
#define LISTA_CLIENTI 100
#define MAX_PRESTITI 50
// Errori
#define ARCHIVIO_PIENO -1
#define ARCHIVIO_VUOTO -2
#define NON_TROVATO -3
#define OPERAZIONE_INVALIDA -4
// MENU
#define ESCI 0
#define INSERISCI_LIBRO 1
#define INSERISCI_CLIENTE 2
#define PRESTA_LIBRO 3
#define MOSTRA_PRESTITI 4
#define MOSTRA_LIBRI 5
typedef struct {
char nome[LUNG_STRINGA];
char cognome[LUNG_STRINGA];
char nazione[LUNG_STRINGA];
} autore;
typedef struct {
char ISBN[LUNG_STRINGA];
char titolo[LUNG_STRINGA];
autore autori[MAX_AUTORI];
int num_autori;
int copie;
} libro;
typedef struct {
libro libri[MAX_LIBRI];
int num_libri;
} archivio_libri;
typedef struct {
int codice_cliente;
char nome[LUNG_STRINGA];
char cognome[LUNG_STRINGA];
char libri_prestati[MAX_PRESTITI][LUNG_STRINGA]; /*Invertite MAX_RENTS e MAX_STRING*/ //Per la lista dei libri prestati ho scelto un vettore di stringhe
int num_libri_prestati; //in cui vengono salvati solo gli ISBN dei libri al fine di evitare
} cliente; //di avere una ridondanza di dati uguali. Al momento della chiamata della
typedef struct { //funzione che mostra i libri prestati verra' creata una corrispondenza
cliente clienti[LISTA_CLIENTI]; //con l'archivio dei libri, mostrando quindi anche il nome
int num_clienti;
} archivio_clienti;
// Logiche di presentazione
libro leggi_libro(); //Lettura dati per libri
cliente leggi_cliente(); //e clienti
// Logica applicativa
void iniz_libri(archivio_libri *); //Inizializzazione degli archivi
void iniz_clienti(archivio_clienti *); //
int inserisci_libro(libro, archivio_libri*); //Inserimento di elementi
int inserisci_cliente(cliente, archivio_clienti*); //all'interno degli archivi
int inserisci_prestito(cliente*, libro*); //
int cerca_libro(char[], archivio_libri); //Ricerca di elementi
int cerca_cliente(int, archivio_clienti); //all'interno degli archivi
int mostra_libri(archivio_libri); //Output specifici richiesti
int mostra_prestiti(cliente, archivio_libri); //dalla traccia
int main(int argc, char** argv) {
archivio_libri archivio_libri;
iniz_libri(&archivio_libri);
archivio_clienti archivio_clienti;
iniz_clienti(&archivio_clienti);
libro nuovo_libro;
cliente nuovo_cliente;
int scelta, risultato;
char conferma;
int pos_libro, pos_cliente;
int codice_cliente;
char ISBN_libro[LUNG_STRINGA];
do {
printf("***********MENU BIBLIOTECA***********\n\n");
printf("1) Inserisci nuovo libro\n");
printf("2) Inserisci nuovo cliente\n");
printf("3) Effettua un prestito\n");
printf("4) Mostra prestiti di un cliente\n");
printf("5) Mostra archivio libri\n");
printf("0) Esci\n");
printf("*************************************\n");
printf("\tScelta: ");
scanf("%d", &scelta);
printf("-------------------------------------\n");
switch (scelta) {
case ESCI:
printf("Arrivederci\n");
break;
case INSERISCI_LIBRO:
nuovo_libro = leggi_libro();
risultato = inserisci_libro(nuovo_libro, &archivio_libri);
switch (risultato) {
case ARCHIVIO_PIENO:
printf("Errrore: archivio libri pieno!\n");
break;
case OPERAZIONE_INVALIDA:
printf("Errore: ISBN gia' presente\n");
break;
default:
printf("Inserimento avvenuto con successo\n");
break;
}
break;
case INSERISCI_CLIENTE:
nuovo_cliente = leggi_cliente();
risultato = inserisci_cliente(nuovo_cliente, &archivio_clienti);
if (risultato == ARCHIVIO_PIENO)
printf("Errore: archivio clienti pieno!\n");
else
printf("Codice generato: %d\nInserimento avvenuto con successo\n", risultato);
break;
case PRESTA_LIBRO:
printf("ISBN libro: ");
scanf("%s", &ISBN_libro);
pos_libro = cerca_libro(ISBN_libro, archivio_libri);
if (pos_libro == NON_TROVATO)
printf("Errore: ISBN non trovato\n");
else {
printf("Codice cliente: ");
scanf("%d", &codice_cliente);
pos_cliente = cerca_cliente(codice_cliente, archivio_clienti);
if (pos_cliente == NON_TROVATO)
printf("Errore: codice cliente non trovato\n");
else {
printf("Continuare? [s/n]: ");
fflush(stdin);
scanf("%c", &conferma);
if (conferma == 's') {
risultato = inserisci_prestito(&archivio_clienti.clienti[pos_cliente], &archivio_libri.libri[pos_libro]);
switch (risultato) {
case ARCHIVIO_PIENO:
printf("Errore: archivio prestiti pieno per questo cliente!\n"); /*corretto vuoto con pieno*/
break;
case OPERAZIONE_INVALIDA:
printf("Errore: copie del libro esaurite\n");
break;
default:
printf("Prestito effettuato con successo\n");
break;
}
} else
printf("Operazione annullata\n");
}
}
break;
case MOSTRA_PRESTITI:
printf("Codice cliente: ");
scanf("%d", &codice_cliente);
pos_cliente = cerca_cliente(codice_cliente, archivio_clienti);
if (pos_cliente == NON_TROVATO)
printf("Errore: codice cliente non trovato\n");
else {
risultato = mostra_prestiti(archivio_clienti.clienti[pos_cliente], archivio_libri);
if (risultato == ARCHIVIO_VUOTO)
printf("Errore: archivio prestiti vuoti per questo cliente\n");
}
break;
case MOSTRA_LIBRI:
risultato = mostra_libri(archivio_libri);
if (risultato == ARCHIVIO_VUOTO)
printf("Errore: archivio libri vuoto!\n");
break;
default:
printf("Errore: scegli un'opzione valida\n");
break;
}
printf("-------------------------------------\n");
} while (scelta != ESCI);
return (EXIT_SUCCESS);
}
void iniz_libri(archivio_libri *_arc_libri) {
_arc_libri->num_libri = 0;
}
void iniz_clienti(archivio_clienti *_arc_clienti) {
_arc_clienti->num_clienti = 0;
}
libro leggi_libro() {
int i;
libro nuovo_libro;
printf("ISBN: ");
scanf("%s", nuovo_libro.ISBN);
printf("Titolo: ");
scanf("%s", nuovo_libro.titolo);
printf("Numero di autori: ");
scanf("%d", &nuovo_libro.num_autori);
for (i = 0; i < nuovo_libro.num_autori; i++) {
printf("\nAutore n%d\n", i + 1);
printf("Nome: ");
scanf("%s", nuovo_libro.autori[i].nome);
printf("Cognome: ");
scanf("%s", nuovo_libro.autori[i].cognome);
printf("Nazione: ");
scanf("%s", nuovo_libro.autori[i].nazione);
}
printf("Numero di copie: ");
scanf("%d", &nuovo_libro.copie);
return nuovo_libro;
}
cliente leggi_cliente() {
cliente nuovo_cliente;
printf("Nome: ");
scanf("%s", nuovo_cliente.nome);
printf("Cognome: ");
scanf("%s", nuovo_cliente.cognome);
return nuovo_cliente;
}
int inserisci_libro(libro _nuovo_libro, archivio_libri *_arc_libri) {
if (_arc_libri->num_libri < MAX_LIBRI) {
if (cerca_libro(_nuovo_libro.ISBN, *_arc_libri) == NON_TROVATO) {
_arc_libri->libri[_arc_libri->num_libri] = _nuovo_libro;
_arc_libri->num_libri++;
return _arc_libri->num_libri - 1;
} else
return OPERAZIONE_INVALIDA;
} else
return ARCHIVIO_PIENO;
}
int inserisci_cliente(cliente _nuovo_cliente, archivio_clienti *_arc_clienti) {
if (_arc_clienti->num_clienti < LISTA_CLIENTI) {
_nuovo_cliente.codice_cliente = _arc_clienti->num_clienti + 1;
_nuovo_cliente.num_libri_prestati = 0;
_arc_clienti->clienti[_arc_clienti->num_clienti] = _nuovo_cliente;
_arc_clienti->num_clienti++;
return _nuovo_cliente.codice_cliente;
} else
return ARCHIVIO_PIENO;
}
int cerca_libro(char _ISBN[], archivio_libri _arc_libri) {
int i = 0;
while (i < _arc_libri.num_libri && strcmp(_ISBN, _arc_libri.libri[i].ISBN) != 0)
i++;
if (i < _arc_libri.num_libri)
return i;
else
return NON_TROVATO;
}
int cerca_cliente(int codice_cliente, archivio_clienti _arc_clienti) {
int i = 0;
while (i < _arc_clienti.num_clienti && codice_cliente != _arc_clienti.clienti[i].codice_cliente)
i++;
if (i < _arc_clienti.num_clienti)
return i;
else
return NON_TROVATO;
}
int inserisci_prestito(cliente *_cliente, libro *_libro) {
if (_cliente->num_libri_prestati < MAX_PRESTITI)
if (_libro->copie > 0) {
_libro->copie--;
strcpy(_cliente->libri_prestati[_cliente->num_libri_prestati], _libro->ISBN);
_cliente->num_libri_prestati++;
return _cliente->num_libri_prestati;
} else
return OPERAZIONE_INVALIDA;
else
return ARCHIVIO_PIENO;
}
int mostra_libri(archivio_libri _arc_libri) {
if (_arc_libri.num_libri > 0) {
int i;
for (i = 0; i < _arc_libri.num_libri; i++) {
printf("\nISBN: %s\n", _arc_libri.libri[i].ISBN);
printf("Titolo: %s\n", _arc_libri.libri[i].titolo);
}
return _arc_libri.num_libri;
} else
return ARCHIVIO_VUOTO;
}
int mostra_prestiti(cliente _arc_clienti, archivio_libri _arc_libri) {
if (_arc_clienti.num_libri_prestati > 0) {
int i, pos_libro;
printf("Nome: %s\n", _arc_clienti.nome);
printf("Cognome: %s\n\n", _arc_clienti.cognome);
for (i = 0; i < _arc_clienti.num_libri_prestati; i++) {
printf("ISBN: %s\n", _arc_clienti.libri_prestati[i]);
pos_libro = cerca_libro(_arc_clienti.libri_prestati[i], _arc_libri);
printf("Titolo: %s\n", _arc_libri.libri[pos_libro].titolo);
}
return _arc_clienti.num_libri_prestati;
} else
return ARCHIVIO_VUOTO;
}