Salve a tutti, sono nuovo e spero di essere abbastanza chiaro. dovrei consegnare un programma entro una settimana ma non riesco proprio a venirne a capo quindi spero che voi mi possiate dare una mano.
#include<stdio.h>
#include<string.h>
#define max 500
typedef struct dati_libro{
int codice;
char autore[20];
char titolo[20];
char chiave[5][50];
}dati_libro;
typedef struct nodo{
dati_libro *ele;
struct nodo *next;
}nodo;
typedef struct biblioteca{
nodo *lista;
}biblioteca;
void inserisci_testa(nodo **testa, dati_libro *libro){
nodo *new = malloc(sizeof(nodo)); //creazione del nuovo nodo
new->ele = libro;
new->next = *testa; //aggancio in testa
*testa = new; //aggiornamento del puntatore alla testa
}
biblioteca dati;
int inserisci_libro(){ //funzione per inserire i dati del libro
int aggiungi, i;
dati_libro *libro = malloc(sizeof(dati_libro));
printf("aggiungi dati libro\n");
printf("inserire codice libro :\n");
scanf("%d", &libro->codice);
printf("inserire autore:\n");
scanf("%s", &libro->autore);
printf("inserire titolo:\n");
scanf("%s", &libro->titolo);
printf("inserire 5 parole chiave\n");
for(i=0;i<5;i++){ //ciclo for per inserire 5 parole chiavi per ogni libro inserito
printf("inserire parola chiave numero %d:\n", i+1);
scanf("%s", libro->chiave[i]);
printf("hai inserito: %s\n", libro->chiave[i]);
}
inserisci_testa(&dati.lista, libro);
printf("se vuoi altri dati digita '1', se vuoi terminare digita '0'\n");
scanf("%d", &aggiungi);
return aggiungi;
}
int inserisci(){
int aggiungi;
do{
aggiungi = inserisci_libro();
} while(aggiungi!=0);
}
void stampa(dati_libro *libro){
printf("il codice del libro e': %d\n", libro->codice);
printf("il titolo del libro e': %s\n", libro->titolo);
printf("l'autore e': %s\n\n", libro->autore);
}
void visualizza3(){
char parola[3][20];
int a, b, c;
int count;
nodo *p;
printf("per visualizzare il libro cercato inserire 3 parole chiave\n");
for(a=0;a<3;a++){
printf("inserire la %d parola chiave\n", a+1);
scanf("%s", parola[a]);
}
for(p=dati.lista; p!=NULL; p=p->next){ //scorro la lista
count=0;
for(b=0; b<3; b++) //ogni parola chiave cercata
for(c=0; c<5; c++) //viene confrontata con le 5 parole chiave del libro
//se la parola corrisponde incremento count e passo alla prossima parola chiave da cercare
if(strcmp(parola[b], p->ele->chiave[c]) == 0){
count++;
break;
}
if(count==3) //tutte e tre le parole sono state trovate
stampa(p->ele);
}
}
void visualizza1(){ //funzione per inserire 3 parole chiavi per cercare il libro
char parola[3][20];
int a, b, c;
int count;
nodo *p;
printf("per visualizzare il libro cercato inserire 3 parole chiave\n");
for(a=0;a<3;a++){
printf("inserire la %d parola chiave\n", a+1);
scanf("%s", parola[a]);
}
for(p=dati.lista; p!=NULL; p=p->next){
count=0;
for(b=0; b<3; b++){
for(c=0; c<5; c++){
if(strcmp(parola[b], p->ele->chiave[c])==0){
//se una parola corrisponde metto count = 1 e termino il for interno
count=1;
break;
}
}
if(count == 1){
//se count == 1 stampo i dati e termino il for intermedio
stampa(p->ele);
break;
}
}
}
}
void rimuovi_lista(int codice){ //funzione per rimuovere il libro
nodo *p, *q = NULL;
for(p=dati.lista; p!=NULL && p->ele->codice != codice; p=p->next)
q = p;
if(p == NULL) //se il libro non è presente nella biblioteca stampo:"..."
printf("il libro non e' presente nella biblioteca\n");
else{ //nel caso in cui trovo il libro nella biblioteca tramite la funzione "free" rimuovo il libro dalla biblioteca
if(q == NULL)
dati.lista = p->next;
else
q->next = p->next;
free(p);
printf("libro #%d rimosso con successo\n", codice);
}
}
void rimuovi(){
int codice;
printf("inserisci il codice del libro da rimuovere: ");
scanf("%d", &codice);
rimuovi_lista(codice);
}
int menu(){
int k;
printf("\n\t|1.inserire libro.|\n");
printf("\t|2.rimuovere libro.|\n");
printf("\t|3.visualizza libro con almeno una parola chiave uguale.|\n");
printf("\t|4.visualizza libro con 3 parole chiave uguali.|\n");
printf("\t|5.termina|\n\n");
scanf("%d", &k);
switch(k){
case 1:
inserisci();
menu();
break;
case 2:
rimuovi();
menu();
break;
case 3:
visualizza1();
menu();
break;
case 4:
visualizza3();
menu();
break;
case 5:
default:
break;
}
}
void salva(){
FILE *file = fopen("save.txt","w"); //qui salvo il file in scrittura
nodo *p;
for(p=dati.lista; p!=NULL; p=p->next){
fprintf(file, "%d %s %s %s %s %s %s %s\n", p->ele->codice, p->ele->autore, p->ele->titolo, p->ele->chiave[0], p->ele->chiave[1], p->ele->chiave[2], p->ele->chiave[3], p->ele->chiave[4]);
}
fclose(file);
}
void carica(){
FILE *file;
dati_libro *ele;
int esito;
dati.lista = NULL;
file = fopen("save.txt","r");
if(file == NULL)
return;
while(1){
ele = malloc(sizeof(dati_libro));
esito = fscanf(file, "%d %s %s %s %s %s %s %s\n", &ele->codice, ele->autore, ele->titolo, ele->chiave[0], ele->chiave[1], ele->chiave[2], ele->chiave[3], ele->chiave[4]);
if(esito == EOF)
break;
inserisci_testa(&dati.lista, ele);
}
fclose(file);
}
int main(){
carica();
menu();
salva();
return 0;
}
questo programma dovrebbe rappresentare una libreria, dove tramite il menu vengono inseriti e vari libri abbinando loro delle parole chiave per poter permettere la ricerca in un secondo momento. basta che lo avviate e capirete subito quello che fa. comunque devo sistemarlo poichè nel momento in cui mi chiede di inserire il nome dell'autore o del titolo posso scrivere solamente una parola, poichè utilizzo soltanto una scanf. e poi magari anche evitare che nel menù se l'utente inserisce una lettera dell'alfabeto il programma non termini così ma dica all'utente di inserire un numero.
L'ideale sarebbe che il programma possa ricevere questi dati all'interno:
Codice: 123456
Autore: Dan Brawn
Titolo: Il codice Da Vinci
Parole chiave: thriller romanzo massoneria bestseller 2003.
ps: anche una dritta su come fare una funzione che visualizzi tutti i libri presenti in libreria senza l'inserimento di parole chiavi. vi ringrazio in anticipo e spero di essere stato abbastanza chiaro.