LISTE
BUONGIONO potete aiutarmi a realizzarle vi posto il codice
come faccio a stampare l'intera lista di libri...con la funzione di stampa mi permette di mostrare solo il primo e poi come posso fare per salvare la lista di libri non nel main e no fu file?
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #define MAXLEN 20 /* Creazione di un array di struct libro contenente 5 campi*/ struct libro{ char titolo[MAXLEN]; char nome_autori[MAXLEN]; int codice_identificativo; int prezzo_di_prestito; int status; /* Status indica se il libro è presente(1) oppure è in prestito(0)*/ struct node* next; }; typedef struct libro* list; typedef struct libro libri; void stampaLista(list L); /*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 main () { list L = NULL; int scelta; /*Questa variabile sarà utilizzata nella switch per decidere che cosa fare...*/ int i; /* Variabili utilizzate per inserire un nuovo libro nell'archivio */ int flag=2; char titolo_richiesto [MAXLEN]; /* 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*/ char nome; char matricola; int trovato; /* Inizializzazione della libreria */ struct 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("Inserisci nome Studente:\n"); scanf("%s", &nome); printf("Inserisci matricola studente:\n"); scanf("%s", &matricola); printf("Premere:\n 1. Stampa archivio\n 2. Richiedere libro tramite codice\n 3. Restituire un libro tramite codice\n 4. Esegui richiesta\n 5. Per uscire.\n"); printf("Inserisci il numero dell'operazione che vuoi effettuare:\n"); scanf("%d",&scelta); /*Viene inserito nella variabile var il numero inserito dall'utente e di conseguenza inserito nel ciclo Switch*/ switch (scelta) /* Creo uno switch con 5 case, uno per ogni possibile scelta */ { case 1: /*stampa lista*/ printf("l'archivio contiene i seguenti libri:\n"); stampaLista(libreria); case 2: /* Se l'utente preme il tasto 2 vuole richjedere un libro tramite il codice*/ case 3 : /* Case costruito per restituire un libro tramite codice*/ case 4: /*esegui irchiesta*/ case 5 : /*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); } /*Fine main*/ void stampaLista(list L) { if (L!= NULL) { printf("%s,%s,%d,%d,%d", L->titolo,L->nome_autori,L->codice_identificativo,L->prezzo_di_prestito,L->status); stampaLista(L->next); } }
come faccio a stampare l'intera lista di libri...con la funzione di stampa mi permette di mostrare solo il primo e poi come posso fare per salvare la lista di libri non nel main e no fu file?
Risposte
Hai un array di strutture, non una lista. I puntatori all'elemento successivo sono stati impostati a zero e lasciati invariati. Il mio consiglio è di crearti una funzione che aggiunge elementi all'inizio della lista e di usarla per creare la tua struttura (siccome immagino l'esercizio richieda l'uso di liste*).
* Altrimenti usa l'array e dimenticati dell'esistenza delle liste concatenate.
* Altrimenti usa l'array e dimenticati dell'esistenza delle liste concatenate.
"apatriarca":
Hai un array di strutture, non una lista. I puntatori all'elemento successivo sono stati impostati a zero e lasciati invariati. Il mio consiglio è di crearti una funzione che aggiunge elementi all'inizio della lista e di usarla per creare la tua struttura (siccome immagino l'esercizio richieda l'uso di liste*).
* Altrimenti usa l'array e dimenticati dell'esistenza delle liste concatenate.
Si devo usare le liste...volevo usare i file tipo la stampa del file la faccio così però mi servirebbe la funzione ricorsiva come posso crearla...sapresti aiutarmi?
fd=fopen("listaLibri.txt", "r"); if( fd==NULL ) { perror("Errore in apertura del file"); exit(1); } /* lettura linea per linea */ while(1) { res=fgets(libreria, 15, fd); if(res==NULL) break; if( libreria[0] != '#' ) printf("%s", libreria); } /* chiude il file */ fclose(fd); return 0;
Non è necessario usare una funzione ricorsiva per stampare o leggere la lista. Tuttavia come ti ho già detto il principale problema è il fatto che i nodi della tua lista non sono collegati tra di loro. Finché rimarranno scollegati non c'è granché che tu possa fare.
"apatriarca":
Non è necessario usare una funzione ricorsiva per stampare o leggere la lista. Tuttavia come ti ho già detto il principale problema è il fatto che i nodi della tua lista non sono collegati tra di loro. Finché rimarranno scollegati non c'è granché che tu possa fare.
in realtà ho modificato di molto il codice
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> #include "funzioni.h" #define MAXLEN int main() { int scelta; int j; int cod_id = 0; /* Variabile utilizzata per restituire un libro tramite codice*/ int trovato; //utilizzata per determinare se il libro è stato trovato o meno. int i;/* Variabili utilizzate per inserire un nuovo libro nell'archivio */ //FILE *fd; //char *res; char titolo[100]; int status; int anno; int presenza; Lista L; List l; FILE *fd; char *res; char libreria[15]; struct lista *top=NULL; FILE *fp=NULL; while((scelta = menu())){ switch (scelta) /* Creo uno switch con 5 case, uno per ogni possibile scelta */ { case 1: /*stampa lista*/ /* apre il file */ fd=fopen("listaLibri.txt", "r"); if( fd==NULL ) { perror("Errore in apertura del file"); exit(1); } /* legge e stampa ogni riga */ while(1) { res=fgets(libreria, 15, fd); if( res==NULL ) break; printf("%s", libreria); } /* chiude il file */ fclose(fd); break; case 2: /* Se l'utente preme il tasto 2 si cerca se c'e il libro e richiedere un libro tramite il codice*/ printf("\nInserisci titolo libro da richiedere:"); fflush(stdin); gets(titolo); presenza = Cerca_Libro(L,titolo); if(presenza!=-1) { printf("Il libro cercato è presente nell'archivio ed il libro e' disponibile\n"); l = Inserimento_Studente(); }else{ printf("Il libro cercato non e' presente nell'archivio ed il libro non e' disponibile\n"); } break; case 3: /* Case costruito per restituire un libro tramite codice*/ if(Cerca_Libro(L,titolo) ) Restituisci_libro(L, cod_id); //L = Inserimento_Libro(); // printf("\n"); //printf("Il libro e' appena stato restituito: %s\n La ringraziamo per la serieta'. Arrivederci!\n"); break; case 4: /*desegui richiesta*/ case 5: /*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*/ return scelta; } /*Fine main*/ List Inserimento_Studente() { List lista; int j; printf("\nQuanti libri vuoi restituire?:"); scanf("%d",&lista.num_studente); fflush(stdin); for(j=0; j <lista.num_studente; j++) { printf("\nInserisci nome: "); gets(&lista.element[j].nome); printf("\nInserisci cognome: "); gets(&lista.element[j].cognome); printf("\nInserisci matricola: "); scanf("%s", &lista.element[j].matricola); fflush(stdin); } return lista; } int Cerca_Libro(Lista list, char titolo[]) { int i; int presenza=-1; for(i=0; i <list.num_libri; i++) { if(strcmp(list.elementi[i].titolo, titolo)==0){ presenza=1; } } return presenza; } int Restituisci_libro(Lista list, int cod_id) { int i = 0; printf("Inserire id del libro da restituire: \n"); scanf("%d", &cod_id); int trovato = 0; while (trovato == 0 && i < 15) { if (cod_id == list.elementi[i].cod_id) { trovato = 1; if (list.elementi[i].status == 1) { printf("\nErrore: Il libro e' gia' disponibile.\nArrivederci e Grazie.\n"); } else { list.elementi[i].status = 1; printf("\nIl libro e' appena stato restituito: %s\nLa ringraziamo per la serieta'. Arrivederci!\n", list.elementi[i].titolo); } } else { i = i + 1; } } if (trovato == 0) { printf("\nL'archivio non dispone di alcun libro avente questo codice identificativo\nArrivederci e Grazie!"); } return 0; } int menu() { int scelta; /*Questa variabile sarà utilizzata nella switch per decidere che cosa fare...*/ char nome;//utilizzata per inserire il nome dell'utente char matricola;//utilizzata per inserire la matricola dello studente printf("* * * * * * * * * * * * * * * * * * * * * * *\nBenvenuto nel programma di gestione biblioteca\n* * * * * * * * * * * * * * * * * * * * * * *\n"); // printf("Inserisci il nome:"); // scanf("%s", &nome); //printf("Inserisci il matricola:"); // scanf("%s", &matricola); printf(" 1. Mostra archivio\n"); printf(" 2. Richiedi libro\n"); printf(" 3. Restituire libro\n"); printf(" 4. Esegui richiesta\n"); printf(" 5. Uscire\n"); printf("Inserisci scelta:"); scanf("%d",&scelta); /*Viene inserito nella variabile var il numero inserito dall'utente e di conseguenza inserito nel ciclo Switch*/ while(scelta<0 || scelta>4) { printf("Questo tasto non consente di effetuare scelte! Riprova!\n"); printf("Scelta: "); scanf("%d", &scelta); return scelta; } return scelta; }
#ifndef funzioni_h #define funzioni_h #define MAX 150 #define LEN 1000 typedef struct { char autore[MAX]; char titolo[MAX]; int anno; int status; int cod_id; struct Libro *next; }Libro; typedef struct { Libro elementi[LEN]; int num_libri; }Lista; typedef struct { char nome; char cognome; char matricola; struct Studente *next; }Studente; typedef struct { Studente element[LEN]; int num_studente; }List; int menu(); List Inserimento_Studente(); //void Stampa_Elenco(Lista list); int Cerca_Libro(Lista list, char autore[]); int Restituisci(Lista list, int cod_id); FILE *apriFile(FILE *fp); struct Libro *inserisciInCoda(struct Libro *top, FILE *fp); struct Libro *creaNodo(FILE *fp); void stampaLista(struct Libro *top); #endif /* funzioni_h */
la stampa mi funziona ma la richiesta e la sostituzione non mi funziona penso perché non trova il file..devo tipo includere pero non so come...poi aiutarmi?
Sarebbe utile se invece di scrivere tutto il codice da te scritto inserissi solo il codice relativo al tuo problema. Che cosa intendi dire che non trova il file? Quale file? Quello che contiene i valori della lista? Che cosa intendi dire con includere?
"apatriarca":
Sarebbe utile se invece di scrivere tutto il codice da te scritto inserissi solo il codice relativo al tuo problema. Che cosa intendi dire che non trova il file? Quale file? Quello che contiene i valori della lista? Che cosa intendi dire con includere?
Con non. Trova il file intendo che non c’è un collegamento tra file e lista infatti quando faccio la ricerca i valori del file non vengono trovati
Se vuoi che lista e file rimangano sincronizzati hai bisogno di salvare la lista su file dopo ogni cambiamento. In alternativa fai tutte le operazioni sulla lista e inserisci una operazione di salvataggio.
Perché la ricerca la fai sul file comunque e non sulla lista?
Perché la ricerca la fai sul file comunque e non sulla lista?
"apatriarca":
Se vuoi che lista e file rimangano sincronizzati hai bisogno di salvare la lista su file dopo ogni cambiamento. In alternativa fai tutte le operazioni sulla lista e inserisci una operazione di salvataggio.
Perché la ricerca la fai sul file comunque e non sulla lista?
In che senso realizzo una funzione di salvataggio?
c'e il mio problema e come collegare i dati sul file con la lista....perchè se tipo faccio la ricerca mi dice sempre che il libro è presente ma se metto un libro non presente nel file mi dice che il libro è presente...secondo me è perchè il file e la lista non sono collegati perché penso che la funzione di ricerca è corretta
int Cerca_Titolo(Libro list ,char titolo){ int j; int presenza=-1; for(j=0; j<list.num_libri; j++) { if(strcmp(list.elementi[j].titolo, titolo)==0){ presenza=1; } } return presenza; }