RISOLTO [C] Esercizio gestione biblioteca

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
Si infatti la eliminerò e aggiungo lo studente...no perché pensavo che forse la funzione di ricerca non mi funziona perché i dati del file non sono sincronizzati con la lista
Se la funzione di ricerca è uguale a quella che hai postato per ultimo non funziona per il motivo che ti ho spiegato qualche post fa, e cioè che la stringa 'titolo', sulla base della quale dovrebbe essere fatta la ricerca, non viene avvalorata, cioè non chiedi all'utente di digitare il titolo da cercare.
 
Se la funzione di ricerca è uguale a quella che hai postato per ultimo non funziona per il motivo che ti ho spiegato qualche post fa, e cioè che la stringa 'titolo', sulla base della quale dovrebbe essere fatta la ricerca, non viene avvalorata, cioè non chiedi all'utente di digitare il titolo da cercare.
Si lo chiedo
--- i due messaggi sono stati uniti ---
case2: /* Se l'utente preme il tasto 2 si cerca se c'e il libro e richiedere un libro tramite il codice*/

printf("Inserisci il titolo del libro da cercare: ");
scanf("%s", &titolo);
ricerca(lista);
break;
 
Fa' vedere il codice (se non riesci a formattarlo bene è meglio che fai uno screenshot e lo metti sotto spoiler, dal menù da dove si scrivono i post, icona con i tre puntini '...' seguiti da una freccia).
case2: /* Se l'utente preme il tasto 2 si cerca se c'e il libro e richiedere un libro tramite il codice*/

printf("Inserisci il titolo del libro da cercare: ");
scanf("%s", &titolo);
ricerca(lista);
break;
e ho messo
Struct libri* lista = null
--- i due messaggi sono stati uniti ---
case2: /* Se l'utente preme il tasto 2 si cerca se c'e il libro e richiedere un libro tramite il codice*/

printf("Inserisci il titolo del libro da cercare: ");
scanf("%s", &titolo);
ricerca(lista);
break;
e ho messo
Struct libri* lista = null

void ricerca (structlibri *lista){
int trovato = 0 ;
char titolo;
char nome;
char matricola;
while (lista != NULL && trovato != 1) {
if(strcmp(lista->titolo, &titolo)==0) {
printf("\nIl libro cercato e' presente nell'archivio ed il libro e' disponibile");
trovato=1;
printf("\nInserisci nome:");
scanf("%s", &nome);
printf("\nInserisci matricola:");
scanf("%s", &matricola);
}
lista = lista->next;
}

if(trovato != 1)
printf("\n Libro non trovato");
}
La funzione. Si blocca quando ho l’in en while
--- i due messaggi sono stati uniti ---
case2: /* Se l'utente preme il tasto 2 si cerca se c'e il libro e richiedere un libro tramite il codice*/

printf("Inserisci il titolo del libro da cercare: ");
scanf("%s", &titolo);
ricerca(lista);
break;
e ho messo
Struct libri* lista = null
--- i due messaggi sono stati uniti ---


void ricerca (structlibri *lista){
int trovato = 0 ;
char titolo;
char nome;
char matricola;
while (lista != NULL && trovato != 1) {
if(strcmp(lista->titolo, &titolo)==0) {
printf("\nIl libro cercato e' presente nell'archivio ed il libro e' disponibile");
trovato=1;
printf("\nInserisci nome:");
scanf("%s", &nome);
printf("\nInserisci matricola:");
scanf("%s", &matricola);
}
lista = lista->next;
}

if(trovato != 1)
printf("\n Libro non trovato");
}
La funzione. Si blocca quando ho l’in en while
Eh in realtà ora sono da cellulare domani controllo tutto
--- i due messaggi sono stati uniti ---
case2: /* Se l'utente preme il tasto 2 si cerca se c'e il libro e richiedere un libro tramite il codice*/

printf("Inserisci il titolo del libro da cercare: ");
scanf("%s", &titolo);
ricerca(lista);
break;
e ho messo
Struct libri* lista = null
--- i due messaggi sono stati uniti ---

Codice:
void ricerca (struct libri *lista){
  int trovato = 0 ;
char titolo;
char nome;
  char matricola;
while (lista != NULL && trovato != 1) {
   if(strcmp(lista->titolo, &titolo)==0) {
printf("\nIl libro cercato e' presente nell'archivio ed il libro e' disponibile");
   trovato=1;
printf("\nInserisci nome:");
scanf("%s", &nome);
printf("\nInserisci matricola:");
  scanf("%s", &matricola);
   }
   lista = lista->next;
    }

  if(trovato != 1)
printf("\n Libro non trovato");
}
La funzione. Si blocca quando ho l’in en while
--- i due messaggi sono stati uniti ---

Eh in realtà ora sono da cellulare domani controllo tutto
 
La stringa 'titolo' che tu avvalori correttamente (a parte per &) nel main chiedendo all'utente non è la stessa che hai dichiarato nella funzione 'ricerca'. Sono due entità omonime (perché lo hai deciso tu) ma diverse! Se volevi che la funzione di ricerca utilizzasse la stringa 'titolo' avvalorata nel main dovevi passargliela come parametro, altrimenti farà riferimento a quella definita al suo interno che però non è avvalorata (avrà un valore grezzo casuale). Ti faccio un esempio così si capisce meglio.
Codice:
#include <stdio.h>

void foo(void)
{
    int a = 3;
    printf("%d", a); // Quale 'a'?
}

int main()
{
    int a = 5;
   
    foo();

    return 0;
}
Questo codice stampa 3, non 5! E se provi a cancellare o commentare la variabile dichiarata nella funzione foo() non compilerà, perché il compilatore non sa cos'è la variabile 'a' usata nella printf.
Questi sono concetti basilari, non hai un libro o delle slide o materiale didattico per studiare il C? Altrimenti procedi per tentativi e non è la cosa migliore.
 
La stringa 'titolo' che tu avvalori correttamente (a parte per &) nel main chiedendo all'utente non è la stessa che hai dichiarato nella funzione 'ricerca'. Sono due entità omonime (perché lo hai deciso tu) ma diverse! Se volevi che la funzione di ricerca utilizzasse la stringa 'titolo' avvalorata nel main dovevi passargliela come parametro, altrimenti farà riferimento a quella definita al suo interno che però non è avvalorata (avrà un valore grezzo casuale). Ti faccio un esempio così si capisce meglio.
Codice:
#include <stdio.h>

void foo(void)
{
    int a = 3;
    printf("%d", a); // Quale 'a'?
}

int main()
{
    int a = 5;
  
    foo();

    return 0;
}
Questo codice stampa 3, non 5! E se provi a cancellare o commentare la variabile dichiarata nella funzione foo() non compilerà, perché il compilatore non sa cos'è la variabile 'a' usata nella printf.
Questi sono concetti basilari, non hai un libro o delle slide o materiale didattico per studiare il C? Altrimenti procedi per tentativi e non è la cosa migliore.
Sisi li ho....nono non vado a tentativi
--- i due messaggi sono stati uniti ---
Sisi li ho....nono non vado a tentativi quindi tra i parametri della funzione ho anche titolo...giusto?
 
O lo passi per parametro o sposti la richiesta all'utente nella funzione, come vuoi.
 
Sisi li ho....nono non vado a tentativi quindi come parametro la funzione deve avere anche titolo...giusto?
--- i due messaggi sono stati uniti ---
--- i due messaggi sono stati uniti ---
Se lo passo come parametro la funzione è la stessa giusto?
--- i due messaggi sono stati uniti ---
Va bene domani lo faccio e correggo tutto
 
Ultima modifica da un moderatore:
@sare1234
usa il tag CODE e non postare a raffica ma edita il tuo ultimo messaggio se non ce ne sono altri.
Grazie
 
Ultima modifica:
O lo passi per parametro o sposti la richiesta all'utente nella funzione, come vuoi.
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100

struct libri{
    char titolo[100];
    char autore[100];
    int cod_id;
    struct libri *next;
};

typedef struct libri* List;

typedef struct {
    struct libri elementi[100];
   int num_libri;
}Libro;

void ricerca (struct libri *l);
List initList(char titolo[30],char autore[30],int cod_id);
int menu(void);
struct libri *leggiFile(FILE *fp, struct libri *lista);
void scriviLista(struct libri *lista);
void scriviFile(FILE *fp, struct libri *lista);
struct libri *inserisciLista(struct libri *nodo, struct libri *lista);
struct libri *nuovoNodo(char *titolo,char *autore, int cod_id);
void gestioneErrore(void);
void freeLista(struct libri *lista);
void stampaLista(struct libri *top);
List insertTail(List L, char titolo, char autore ,int cod_id);
int main() {
    int scelta;
    FILE *fp;
    struct libri *lista=NULL;
    struct lista *top = NULL;
    int cod_id;
    char titolo = '\0';
    char autore;
    struct libri L;
    int presenza;
    Libro l;
    char nome;
    char cognome;
    char matricola;
   int id = 0;
    int n ;
    int trovato;

fp = fopen("Libri.txt","r");
if (fp == NULL) gestioneErrore();
lista = leggiFile(fp, lista);
fclose(fp);

while((scelta = menu())){
switch (scelta) /* Creo uno switch con 5 case, uno per ogni possibile scelta */
{
case 1: /*stampa lista*/
  scriviLista(lista);
    break
    case 2: /* Se l'utente preme il tasto 2 si cerca se c'e il libro e richiedere un libro tramite il codice*/
        ricerca(lista);
        break;
case 3: /* Case costruito per restituire un libro tramite codice*/
           printf("Inserire titolo \n");
           scanf("%s", &titolo);
           printf("Inserire autore' \n");
           scanf("%s", &autore);
           printf("Inserire codice' \n");
           scanf("%d", &id);
        lista=insertTail(lista,titolo,autore,id);
        break;
case 4: /*esegui richiesta*/
        break ;
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*/

int menu(){
int scelta; /*Questa variabile sarà utilizzata nella switch per decidere che cosa fare...*/

    printf("* * * * * * * * * * * * * * * * * * *  \nBenvenuto nel programma di gestione biblioteca\n* * * * * * * * * * * * * * * * * * *  \n");

    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>5) {     printf("Questo tasto non consente di effetuare scelte! Riprova!\n");
        printf("Scelta: ");
        scanf("%d", &scelta);
      return scelta;
}

  return scelta;
}

struct libri *nuovoNodo(char *titolo,char *autore, int cod_id)
{
  struct libri *nodo;

  nodo = (struct libri *) malloc(sizeof(struct libri));

  if (nodo == NULL) return NULL;
  strcpy(nodo->titolo,titolo);
  strcpy(nodo->autore, autore);
  nodo->cod_id =cod_id;
  nodo->next = NULL;
  return nodo;
}

struct libri *inserisciLista(struct libri *nodo, struct libri *lista)
{
  if (lista==NULL) return nodo;
  lista->next = inserisciLista(nodo, lista->next);
  return lista;
}

void gestioneErrore()
{
  printf("Errore\n");
  exit(0);
}

struct libri *leggiFile(FILE *fp, struct libri *lista)
{
  char titolo[256], autore[256];
  int cod_id;
  struct libri *nodo;

  while(fscanf(fp,"%s%s%d",titolo,autore,&cod_id)==3){
    nodo = nuovoNodo(titolo,autore,cod_id);
    if (nodo == NULL)
        gestioneErrore();
    lista = inserisciLista(nodo, lista);
  }
  return lista;
}

void scriviFile(FILE *fp, struct libri *lista) {
  while (lista!=NULL) {
    fprintf(fp,"%s %s %d \n",lista->titolo,lista->autore,lista->cod_id);
    lista = lista->next;
  }
}

void stampaLista(struct libri *top)
{
    if (top == NULL) {
        printf("\n--------------\n\n");
    }else
       if (top!=NULL && top->titolo!=0) {
printf("%s %s %d", top->titolo,  top->autore, &top->cod_id);
    stampaLista(top->next);
    }
}

void scriviLista(struct libri *lista) {
    while (lista!=NULL) {
    printf("%s %s %d\n",lista->titolo,lista->autore,lista->cod_id);
    lista = lista->next;
    {
    printf("\n");
      }
   }
}

void ricerca (struct libri *l){
  int trovato = 0 ;
    char titolo[30];
    char nome;
    char matricola;
    char cognome;
    printf("\nInsersici il titolo del codice da cercare:");
    scanf("%s", &titolo);

while (l != NULL && trovato != 1) {
    if(strcmp(l->titolo, &titolo)==0) {
printf("\nIl libro cercato e' presente nell'archivio ed il libro e' disponibile");
        printf("\nInserisci nome: ");
        scanf("%s", &nome);
        printf("\nInserisci cognome: ");
        scanf("%s", &cognome);
        printf("\nInserisci matricola: ");
        scanf("%s", &matricola);
        printf("\nOperazione effettuata con successo\n");
        trovato=1;
   }
    l = l->next;
  }

    if(trovato != 1)
        printf("\nIl libro cercato non e' presente nell'archivio ed il libro non e' disponibile\n");
   }

List insertTail(List L, char titolo, char autore ,int cod_id) {
    if (L != NULL) {
        L->next = insertTail(L->next, titolo, autore, cod_id);
    }
    else{
        L = initList(titolo,autore,cod_id);
    }
    return L;
}

List initList(char titolo[30] ,char autore[30] ,int cod_id) {
    List L = (List)malloc(sizeof(struct libri));
    strcpy(L->titolo,&titolo);
    strcpy(L->autore,&autore);
    L->cod_id= cod_id;
    L->next = NULL;
    return L;
}
ciao, ancora non ho eliminato i vari warning però sta facendo la scelta di restituzione del libro e ho utilizzato l'inserimento in coda mi funziona ma mi stampa solo il codice correttamente, perchè...come risolvo?
 
Ultima modifica:
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100

struct libri{
    char titolo[100];
    char autore[100];
    int cod_id;
    struct libri *next;
};

typedef struct libri* List;

typedef struct {
    struct libri elementi[100];
   int num_libri;
}Libro;

void ricerca (struct libri *l);
List initList(char titolo[30],char autore[30],int cod_id);
int menu(void);
struct libri *leggiFile(FILE *fp, struct libri *lista);
void scriviLista(struct libri *lista);
void scriviFile(FILE *fp, struct libri *lista);
struct libri *inserisciLista(struct libri *nodo, struct libri *lista);
struct libri *nuovoNodo(char *titolo,char *autore, int cod_id);
void gestioneErrore(void);
void freeLista(struct libri *lista);
void stampaLista(struct libri *top);
List insertTail(List L, char titolo, char autore ,int cod_id);
int main() {
    int scelta;
    FILE *fp;
    struct libri *lista=NULL;
    struct lista *top = NULL;
    int cod_id;
    char titolo = '\0';
    char autore;
    struct libri L;
    int presenza;
    Libro l;
    char nome;
    char cognome;
    char matricola;
   int id = 0;
    int n ;
    int trovato;

fp = fopen("Libri.txt","r");
if (fp == NULL) gestioneErrore();
lista = leggiFile(fp, lista);
fclose(fp);

while((scelta = menu())){
switch (scelta) /* Creo uno switch con 5 case, uno per ogni possibile scelta */
{
case 1: /*stampa lista*/
  scriviLista(lista);
    break
    case 2: /* Se l'utente preme il tasto 2 si cerca se c'e il libro e richiedere un libro tramite il codice*/
        ricerca(lista);
        break;
case 3: /* Case costruito per restituire un libro tramite codice*/
           printf("Inserire titolo \n");
           scanf("%s", &titolo);
           printf("Inserire autore' \n");
           scanf("%s", &autore);
           printf("Inserire codice' \n");
           scanf("%d", &id);
        lista=insertTail(lista,titolo,autore,id);
        break;
case 4: /*esegui richiesta*/
        break ;
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*/

int menu(){
int scelta; /*Questa variabile sarà utilizzata nella switch per decidere che cosa fare...*/

    printf("* * * * * * * * * * * * * * * * * * *  \nBenvenuto nel programma di gestione biblioteca\n* * * * * * * * * * * * * * * * * * *  \n");

    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>5) {     printf("Questo tasto non consente di effetuare scelte! Riprova!\n");
        printf("Scelta: ");
        scanf("%d", &scelta);
      return scelta;
}

  return scelta;
}

struct libri *nuovoNodo(char *titolo,char *autore, int cod_id)
{
  struct libri *nodo;

  nodo = (struct libri *) malloc(sizeof(struct libri));

  if (nodo == NULL) return NULL;
  strcpy(nodo->titolo,titolo);
  strcpy(nodo->autore, autore);
  nodo->cod_id =cod_id;
  nodo->next = NULL;
  return nodo;
}

struct libri *inserisciLista(struct libri *nodo, struct libri *lista)
{
  if (lista==NULL) return nodo;
  lista->next = inserisciLista(nodo, lista->next);
  return lista;
}

void gestioneErrore()
{
  printf("Errore\n");
  exit(0);
}

struct libri *leggiFile(FILE *fp, struct libri *lista)
{
  char titolo[256], autore[256];
  int cod_id;
  struct libri *nodo;

  while(fscanf(fp,"%s%s%d",titolo,autore,&cod_id)==3){
    nodo = nuovoNodo(titolo,autore,cod_id);
    if (nodo == NULL)
        gestioneErrore();
    lista = inserisciLista(nodo, lista);
  }
  return lista;
}

void scriviFile(FILE *fp, struct libri *lista) {
  while (lista!=NULL) {
    fprintf(fp,"%s %s %d \n",lista->titolo,lista->autore,lista->cod_id);
    lista = lista->next;
  }
}

void stampaLista(struct libri *top)
{
    if (top == NULL) {
        printf("\n--------------\n\n");
    }else
       if (top!=NULL && top->titolo!=0) {
printf("%s %s %d", top->titolo,  top->autore, &top->cod_id);
    stampaLista(top->next);
    }
}

void scriviLista(struct libri *lista) {
    while (lista!=NULL) {
    printf("%s %s %d\n",lista->titolo,lista->autore,lista->cod_id);
    lista = lista->next;
    {
    printf("\n");
      }
   }
}

void ricerca (struct libri *l){
  int trovato = 0 ;
    char titolo[30];
    char nome;
    char matricola;
    char cognome;
    printf("\nInsersici il titolo del codice da cercare:");
    scanf("%s", &titolo);

while (l != NULL && trovato != 1) {
    if(strcmp(l->titolo, &titolo)==0) {
printf("\nIl libro cercato e' presente nell'archivio ed il libro e' disponibile");
        printf("\nInserisci nome: ");
        scanf("%s", &nome);
        printf("\nInserisci cognome: ");
        scanf("%s", &cognome);
        printf("\nInserisci matricola: ");
        scanf("%s", &matricola);
        printf("\nOperazione effettuata con successo\n");
        trovato=1;
   }
    l = l->next;
  }

    if(trovato != 1)
        printf("\nIl libro cercato non e' presente nell'archivio ed il libro non e' disponibile\n");
   }

List insertTail(List L, char titolo, char autore ,int cod_id) {
    if (L != NULL) {
        L->next = insertTail(L->next, titolo, autore, cod_id);
    }
    else{
        L = initList(titolo,autore,cod_id);
    }
    return L;
}

List initList(char titolo[30] ,char autore[30] ,int cod_id) {
    List L = (List)malloc(sizeof(struct libri));
    strcpy(L->titolo,&titolo);
    strcpy(L->autore,&autore);
    L->cod_id= cod_id;
    L->next = NULL;
    return L;
}
l'inserimento in coda mi funziona ma quando inserisco titolo autore e id..l'id viene inserito correttamente mentre i titolo ed l'autore no perche? cosa ho sbagliato?
 
Ultima modifica da un moderatore:
Mi intrometto solo per farti notare una cosa, mi è caduto subito l'occhio lì...

C:
    char nome;
    char matricola;
    char cognome;
    printf("\nInsersici il titolo del codice da cercare:");
    scanf("%s", &titolo);

while (l != NULL && trovato != 1) {
    if(strcmp(l->titolo, &titolo)==0) {
printf("\nIl libro cercato e' presente nell'archivio ed il libro e' disponibile");
        printf("\nInserisci nome: ");
        scanf("%s", &nome);
        printf("\nInserisci cognome: ");
        scanf("%s", &cognome);
        printf("\nInserisci matricola: ");
        scanf("%s", &matricola);
        printf("\nOperazione effettuata con successo\n");
        trovato=1;
   }
    l = l->next;
  }

Se stai usando un char per un cognome ed un nome, come puoi leggere una stringa? :)
Stesso discorso per la matricola, che non sarà solo 1 carattere.
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top