RISOLTO [C] Esercizio gestione biblioteca

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
Hai corretto tutti gli errori che ti avevo segnalato all'inizio? Una volta apportate tutte le correzioni, posta il codice completo ma, per favore, indentato e spaziato correttamente.
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100
[B]struct[/B] libri{
[B]char[/B] titolo[30];
[B]char[/B] autore[30];
  [B]int[/B] cod_id;
[B]struct[/B] libri *next;
};
[B]typedef[/B] [B]struct[/B] libri* List;
[B]typedef[/B] [B]struct[/B] {
[B]struct[/B] libri elementi[100];
[B]int[/B] num_libri;
}Libro;

[B]void[/B] ricerca ([B]struct[/B] libri *l);
[B]int[/B] menu([B]void[/B]);
[B]struct[/B] libri *leggiFile(FILE *fp, [B]struct[/B] libri *lista);
[B]void[/B] scriviLista([B]struct[/B] libri *lista);
[B]void[/B] scriviFile(FILE *fp, [B]struct[/B] libri *lista);
[B]struct[/B] libri *nuovoNodo([B]char[/B] *titolo,[B]char[/B] *autore, [B]int[/B] cod_id);
[B]void[/B] gestioneErrore([B]void[/B]);
[B]void[/B] stampaLista([B]struct[/B] libri *top);
List insertHead(List L, [B]char[/B] titolo[30] ,[B]char[/B][30], [B]int[/B] cod_id);
[B]struct[/B] libri *inserisciLista([B]struct[/B] libri *nodo, [B]struct[/B] libri *lista);

[B]int[/B] main(){
[B]int[/B] scelta;
FILE *fp;
[B]struct[/B] libri *lista=[B]NULL[/B];
[B]char[/B] titolo;
[B]char[/B] autore;
[B]int[/B] id;

fp = fopen("Libri.txt","r");
[B]   if[/B] (fp == [B]NULL[/B]) gestioneErrore();
      lista = leggiFile(fp, lista);
fclose(fp);
[B]while[/B]((scelta = menu())){
[B]switch[/B] (scelta) /* Creo uno switch con 5 case, uno per ogni possibile scelta */
{
[B]case[/B] 1: /*stampa lista*/
       scriviLista(lista);
    [B]break[/B];
   [B]case[/B] 2: /* 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);
       [B]break[/B];

[B]case[/B] 3: /* Case costruito per restituire un libro tramite codice*/
     [B]break[/B];
         printf("Inserisci il titolo del libro da restituire: ");
         scanf("%s", &titolo);
         printf("Inserisci autore del libro da restituire: ");
         scanf("%s", &autore);
         printf("Inserisci il codice del libro da restituire: ");
         scanf("%d", &id);
        lista =insertHead(lista, &titolo , &autore, id);
[B]case[/B] 4: /*esegui richiesta*/
     [B]break[/B] ;
[B]case[/B] 5: /*Se l'utente vuole uscire dalla biblioteca*/
printf("Grazie per aver scelto il servizio di gestione della biblioteca, torna a trovarci!\n");
       [B]break[/B];
[B]default[/B]: /*Se l'utente sbaglia ad inserire il numero*/
        printf("Questo tasto non consente di effetuare scelte! Riprova!\n");
        [B]break[/B];
      } /*Fine switch*/
   } /*Fine do*/
    [B]return[/B] 0;
} /*Fine main*/


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


}

[B]struct[/B] libri *nuovoNodo([B]char[/B] *titolo,[B]char[/B] *autore, [B]int[/B] cod_id)
{

  [B]struct[/B] libri *nodo;
  nodo = ([B]struct[/B] libri *) malloc([B]sizeof[/B]([B]struct[/B] libri));
  [B]if[/B] (nodo == [B]NULL[/B]) [B]return[/B] [B]NULL[/B];
strcpy(nodo->titolo,titolo);
strcpy(nodo->autore, autore);
nodo->cod_id =cod_id;
  nodo->next = [B]NULL[/B];
  [B]return[/B] nodo;
}

[B]void[/B] gestioneErrore()
{

printf("Errore\n");
  exit(0);
}


[B]struct[/B] libri *leggiFile(FILE *fp, [B]struct[/B] libri *lista)
{

  [B]char[/B] titolo[30], autore[30];
  [B]int[/B] cod_id;
  [B]struct[/B] libri *nodo;
[B]while[/B](fscanf(fp,"%s%s%d",titolo,autore,&cod_id)==3){
   nodo = nuovoNodo(titolo,autore,cod_id);
    [B]if[/B] (nodo == [B]NULL[/B])
  gestioneErrore();
  lista = inserisciLista(nodo, lista);
  }
[B]return[/B] lista;
}

[B]void[/B] scriviFile(FILE *fp, [B]struct[/B] libri *lista) {

[B]while[/B] (lista!=[B]NULL[/B]) {
   fprintf(fp,"%s %s %d \n",lista->titolo,lista->autore,lista->cod_id);
   lista = lista->next;

  }
}

[B]void[/B] stampaLista([B]struct[/B] libri *top)

{

   [B]if[/B] (top == [B]NULL[/B]) {
printf("\n--------------\n\n");
    }[B]else[/B]
   [B]if[/B] (top!=[B]NULL[/B] && top->titolo!=0) {
printf("%s %s %d", top->titolo,  top->autore, &top->cod_id);
stampaLista(top->next);
  }
}


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

  lista = lista->next;
   {
    printf("\n");
   }

  }

}

[B]void[/B] ricerca ([B]struct[/B] libri *lista){
  [B]int[/B] trovato = 0 ;
[B]char[/B] titolo;
[B]char[/B] nome;
  [B]char[/B] matricola;
[B]while[/B] (lista != [B]NULL[/B] && trovato != 1) {
   [B]if[/B](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;
    }

  [B]if[/B](trovato != 1)
printf("\n Libro non trovato");
}

List initList([B]char[/B] titolo, [B]char[/B] autore, [B]int[/B] cod_id) {
List L = (List)malloc([B]sizeof[/B]([B]struct[/B] libri));
  strcpy(L->titolo, titolo);
strcpy(L->autore, autore);
   L->cod_id=cod_id;
L->next = [B]NULL[/B];
[B]return[/B] L;
}

List insertHead(List L, [B]char[/B] titolo[30] ,[B]char[/B] autore[30], [B]int[/B] cod_id) {

  [B]if[/B] (L != [B]NULL[/B]) {
List G = (List )malloc([B]sizeof[/B]([B]struct[/B] libri));
strcpy(G->titolo, titolo);
strcpy(G->autore, autore);
G->cod_id=cod_id;
G->next = L;
[B]return[/B] G;
}
[B]return[/B] initList(titolo, autore,cod_id);
}

[B]struct[/B] libri *inserisciLista([B]struct[/B] libri *nodo, [B]struct[/B] libri *lista)

{

  [B]if[/B] (lista==[B]NULL[/B]) [B]return[/B] nodo;
  lista->next = inserisciLista(nodo, lista->next);
  [B]return[/B] lista;
}
--- i due messaggi sono stati uniti ---
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100
struct libri{
char titolo[30];
char autore[30];
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);
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 *nuovoNodo(char *titolo,char *autore, int cod_id);
void gestioneErrore(void);
void stampaLista(struct libri *top);
List insertHead(List L, char titolo[30] ,char[30], int cod_id);
struct libri *inserisciLista(struct libri *nodo, struct libri *lista);

int main(){
int scelta;
FILE *fp;
struct libri *lista=NULL;
char titolo;
char autore;
int id;

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*/

printf("Inserisci il titolo del libro da cercare: ");
scanf("%s", &titolo);
ricerca(lista);
break;

case 3: /* Case costruito per restituire un libro tramite codice*/
break;
printf("Inserisci il titolo del libro da restituire: ");
scanf("%s", &titolo);
printf("Inserisci autore del libro da restituire: ");
scanf("%s", &autore);
printf("Inserisci il codice del libro da restituire: ");
scanf("%d", &id);
lista =insertHead(lista, &titolo , &autore, id);
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 0;
} /*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;
}

void gestioneErrore()
{

printf("Errore\n");
exit(0);
}


struct libri *leggiFile(FILE *fp, struct libri *lista)
{

char titolo[30], autore[30];
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 *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");
}

List initList(char titolo, char autore, 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;
}

List insertHead(List L, char titolo[30] ,char autore[30], int cod_id) {

if (L != NULL) {
List G = (List )malloc(sizeof(struct libri));
strcpy(G->titolo, titolo);
strcpy(G->autore, autore);
G->cod_id=cod_id;
G->next = L;
return G;
}
return initList(titolo, autore,cod_id);
}

struct libri *inserisciLista(struct libri *nodo, struct libri *lista)

{

if (lista==NULL) return nodo;
lista->next = inserisciLista(nodo, lista->next);
return lista;
}
--- i due messaggi sono stati uniti ---
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100
[B]struct[/B] libri{
[B]char[/B] titolo[30];
[B]char[/B] autore[30];
  [B]int[/B] cod_id;
[B]struct[/B] libri *next;
};
[B]typedef[/B] [B]struct[/B] libri* List;
[B]typedef[/B] [B]struct[/B] {
[B]struct[/B] libri elementi[100];
[B]int[/B] num_libri;
}Libro;

[B]void[/B] ricerca ([B]struct[/B] libri *l);
[B]int[/B] menu([B]void[/B]);
[B]struct[/B] libri *leggiFile(FILE *fp, [B]struct[/B] libri *lista);
[B]void[/B] scriviLista([B]struct[/B] libri *lista);
[B]void[/B] scriviFile(FILE *fp, [B]struct[/B] libri *lista);
[B]struct[/B] libri *nuovoNodo([B]char[/B] *titolo,[B]char[/B] *autore, [B]int[/B] cod_id);
[B]void[/B] gestioneErrore([B]void[/B]);
[B]void[/B] stampaLista([B]struct[/B] libri *top);
List insertHead(List L, [B]char[/B] titolo[30] ,[B]char[/B][30], [B]int[/B] cod_id);
[B]struct[/B] libri *inserisciLista([B]struct[/B] libri *nodo, [B]struct[/B] libri *lista);

[B]int[/B] main(){
[B]int[/B] scelta;
FILE *fp;
[B]struct[/B] libri *lista=[B]NULL[/B];
[B]char[/B] titolo;
[B]char[/B] autore;
[B]int[/B] id;

fp = fopen("Libri.txt","r");
[B]   if[/B] (fp == [B]NULL[/B]) gestioneErrore();
      lista = leggiFile(fp, lista);
fclose(fp);
[B]while[/B]((scelta = menu())){
[B]switch[/B] (scelta) /* Creo uno switch con 5 case, uno per ogni possibile scelta */
{
[B]case[/B] 1: /*stampa lista*/
       scriviLista(lista);
    [B]break[/B];
   [B]case[/B] 2: /* 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);
       [B]break[/B];

[B]case[/B] 3: /* Case costruito per restituire un libro tramite codice*/
     [B]break[/B];
         printf("Inserisci il titolo del libro da restituire: ");
         scanf("%s", &titolo);
         printf("Inserisci autore del libro da restituire: ");
         scanf("%s", &autore);
         printf("Inserisci il codice del libro da restituire: ");
         scanf("%d", &id);
        lista =insertHead(lista, &titolo , &autore, id);
[B]case[/B] 4: /*esegui richiesta*/
     [B]break[/B] ;
[B]case[/B] 5: /*Se l'utente vuole uscire dalla biblioteca*/
printf("Grazie per aver scelto il servizio di gestione della biblioteca, torna a trovarci!\n");
       [B]break[/B];
[B]default[/B]: /*Se l'utente sbaglia ad inserire il numero*/
        printf("Questo tasto non consente di effetuare scelte! Riprova!\n");
        [B]break[/B];
      } /*Fine switch*/
   } /*Fine do*/
    [B]return[/B] 0;
} /*Fine main*/


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


}

[B]struct[/B] libri *nuovoNodo([B]char[/B] *titolo,[B]char[/B] *autore, [B]int[/B] cod_id)
{

  [B]struct[/B] libri *nodo;
  nodo = ([B]struct[/B] libri *) malloc([B]sizeof[/B]([B]struct[/B] libri));
  [B]if[/B] (nodo == [B]NULL[/B]) [B]return[/B] [B]NULL[/B];
strcpy(nodo->titolo,titolo);
strcpy(nodo->autore, autore);
nodo->cod_id =cod_id;
  nodo->next = [B]NULL[/B];
  [B]return[/B] nodo;
}

[B]void[/B] gestioneErrore()
{

printf("Errore\n");
  exit(0);
}


[B]struct[/B] libri *leggiFile(FILE *fp, [B]struct[/B] libri *lista)
{

  [B]char[/B] titolo[30], autore[30];
  [B]int[/B] cod_id;
  [B]struct[/B] libri *nodo;
[B]while[/B](fscanf(fp,"%s%s%d",titolo,autore,&cod_id)==3){
   nodo = nuovoNodo(titolo,autore,cod_id);
    [B]if[/B] (nodo == [B]NULL[/B])
  gestioneErrore();
  lista = inserisciLista(nodo, lista);
  }
[B]return[/B] lista;
}

[B]void[/B] scriviFile(FILE *fp, [B]struct[/B] libri *lista) {

[B]while[/B] (lista!=[B]NULL[/B]) {
   fprintf(fp,"%s %s %d \n",lista->titolo,lista->autore,lista->cod_id);
   lista = lista->next;

  }
}

[B]void[/B] stampaLista([B]struct[/B] libri *top)

{

   [B]if[/B] (top == [B]NULL[/B]) {
printf("\n--------------\n\n");
    }[B]else[/B]
   [B]if[/B] (top!=[B]NULL[/B] && top->titolo!=0) {
printf("%s %s %d", top->titolo,  top->autore, &top->cod_id);
stampaLista(top->next);
  }
}


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

  lista = lista->next;
   {
    printf("\n");
   }

  }

}

[B]void[/B] ricerca ([B]struct[/B] libri *lista){
  [B]int[/B] trovato = 0 ;
[B]char[/B] titolo;
[B]char[/B] nome;
  [B]char[/B] matricola;
[B]while[/B] (lista != [B]NULL[/B] && trovato != 1) {
   [B]if[/B](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;
    }

  [B]if[/B](trovato != 1)
printf("\n Libro non trovato");
}

List initList([B]char[/B] titolo, [B]char[/B] autore, [B]int[/B] cod_id) {
List L = (List)malloc([B]sizeof[/B]([B]struct[/B] libri));
  strcpy(L->titolo, titolo);
strcpy(L->autore, autore);
   L->cod_id=cod_id;
L->next = [B]NULL[/B];
[B]return[/B] L;
}

List insertHead(List L, [B]char[/B] titolo[30] ,[B]char[/B] autore[30], [B]int[/B] cod_id) {

  [B]if[/B] (L != [B]NULL[/B]) {
List G = (List )malloc([B]sizeof[/B]([B]struct[/B] libri));
strcpy(G->titolo, titolo);
strcpy(G->autore, autore);
G->cod_id=cod_id;
G->next = L;
[B]return[/B] G;
}
[B]return[/B] initList(titolo, autore,cod_id);
}

[B]struct[/B] libri *inserisciLista([B]struct[/B] libri *nodo, [B]struct[/B] libri *lista)

{

  [B]if[/B] (lista==[B]NULL[/B]) [B]return[/B] nodo;
  lista->next = inserisciLista(nodo, lista->next);
  [B]return[/B] lista;
}
--- i due messaggi sono stati uniti ---
le "" non indicano nulla...nel codice non ci sono ma non so perché qui le inserisce
--- i due messaggi sono stati uniti ---
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100
[B]struct[/B] libri{
[B]char[/B] titolo[30];
[B]char[/B] autore[30];
  [B]int[/B] cod_id;
[B]struct[/B] libri *next;
};
[B]typedef[/B] [B]struct[/B] libri* List;
[B]typedef[/B] [B]struct[/B] {
[B]struct[/B] libri elementi[100];
[B]int[/B] num_libri;
}Libro;

[B]void[/B] ricerca ([B]struct[/B] libri *l);
[B]int[/B] menu([B]void[/B]);
[B]struct[/B] libri *leggiFile(FILE *fp, [B]struct[/B] libri *lista);
[B]void[/B] scriviLista([B]struct[/B] libri *lista);
[B]void[/B] scriviFile(FILE *fp, [B]struct[/B] libri *lista);
[B]struct[/B] libri *nuovoNodo([B]char[/B] *titolo,[B]char[/B] *autore, [B]int[/B] cod_id);
[B]void[/B] gestioneErrore([B]void[/B]);
[B]void[/B] stampaLista([B]struct[/B] libri *top);
List insertHead(List L, [B]char[/B] titolo[30] ,[B]char[/B][30], [B]int[/B] cod_id);
[B]struct[/B] libri *inserisciLista([B]struct[/B] libri *nodo, [B]struct[/B] libri *lista);

[B]int[/B] main(){
[B]int[/B] scelta;
FILE *fp;
[B]struct[/B] libri *lista=[B]NULL[/B];
[B]char[/B] titolo;
[B]char[/B] autore;
[B]int[/B] id;

fp = fopen("Libri.txt","r");
[B]   if[/B] (fp == [B]NULL[/B]) gestioneErrore();
      lista = leggiFile(fp, lista);
fclose(fp);
[B]while[/B]((scelta = menu())){
[B]switch[/B] (scelta) /* Creo uno switch con 5 case, uno per ogni possibile scelta */
{
[B]case[/B] 1: /*stampa lista*/
       scriviLista(lista);
    [B]break[/B];
   [B]case[/B] 2: /* 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);
       [B]break[/B];

[B]case[/B] 3: /* Case costruito per restituire un libro tramite codice*/
     [B]break[/B];
         printf("Inserisci il titolo del libro da restituire: ");
         scanf("%s", &titolo);
         printf("Inserisci autore del libro da restituire: ");
         scanf("%s", &autore);
         printf("Inserisci il codice del libro da restituire: ");
         scanf("%d", &id);
        lista =insertHead(lista, &titolo , &autore, id);
[B]case[/B] 4: /*esegui richiesta*/
     [B]break[/B] ;
[B]case[/B] 5: /*Se l'utente vuole uscire dalla biblioteca*/
printf("Grazie per aver scelto il servizio di gestione della biblioteca, torna a trovarci!\n");
       [B]break[/B];
[B]default[/B]: /*Se l'utente sbaglia ad inserire il numero*/
        printf("Questo tasto non consente di effetuare scelte! Riprova!\n");
        [B]break[/B];
      } /*Fine switch*/
   } /*Fine do*/
    [B]return[/B] 0;
} /*Fine main*/


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


}

[B]struct[/B] libri *nuovoNodo([B]char[/B] *titolo,[B]char[/B] *autore, [B]int[/B] cod_id)
{

  [B]struct[/B] libri *nodo;
  nodo = ([B]struct[/B] libri *) malloc([B]sizeof[/B]([B]struct[/B] libri));
  [B]if[/B] (nodo == [B]NULL[/B]) [B]return[/B] [B]NULL[/B];
strcpy(nodo->titolo,titolo);
strcpy(nodo->autore, autore);
nodo->cod_id =cod_id;
  nodo->next = [B]NULL[/B];
  [B]return[/B] nodo;
}

[B]void[/B] gestioneErrore()
{

printf("Errore\n");
  exit(0);
}


[B]struct[/B] libri *leggiFile(FILE *fp, [B]struct[/B] libri *lista)
{

  [B]char[/B] titolo[30], autore[30];
  [B]int[/B] cod_id;
  [B]struct[/B] libri *nodo;
[B]while[/B](fscanf(fp,"%s%s%d",titolo,autore,&cod_id)==3){
   nodo = nuovoNodo(titolo,autore,cod_id);
    [B]if[/B] (nodo == [B]NULL[/B])
  gestioneErrore();
  lista = inserisciLista(nodo, lista);
  }
[B]return[/B] lista;
}

[B]void[/B] scriviFile(FILE *fp, [B]struct[/B] libri *lista) {

[B]while[/B] (lista!=[B]NULL[/B]) {
   fprintf(fp,"%s %s %d \n",lista->titolo,lista->autore,lista->cod_id);
   lista = lista->next;

  }
}

[B]void[/B] stampaLista([B]struct[/B] libri *top)

{

   [B]if[/B] (top == [B]NULL[/B]) {
printf("\n--------------\n\n");
    }[B]else[/B]
   [B]if[/B] (top!=[B]NULL[/B] && top->titolo!=0) {
printf("%s %s %d", top->titolo,  top->autore, &top->cod_id);
stampaLista(top->next);
  }
}


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

  lista = lista->next;
   {
    printf("\n");
   }

  }

}

[B]void[/B] ricerca ([B]struct[/B] libri *lista){
  [B]int[/B] trovato = 0 ;
[B]char[/B] titolo;
[B]char[/B] nome;
  [B]char[/B] matricola;
[B]while[/B] (lista != [B]NULL[/B] && trovato != 1) {
   [B]if[/B](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;
    }

  [B]if[/B](trovato != 1)
printf("\n Libro non trovato");
}

List initList([B]char[/B] titolo, [B]char[/B] autore, [B]int[/B] cod_id) {
List L = (List)malloc([B]sizeof[/B]([B]struct[/B] libri));
  strcpy(L->titolo, titolo);
strcpy(L->autore, autore);
   L->cod_id=cod_id;
L->next = [B]NULL[/B];
[B]return[/B] L;
}

List insertHead(List L, [B]char[/B] titolo[30] ,[B]char[/B] autore[30], [B]int[/B] cod_id) {

  [B]if[/B] (L != [B]NULL[/B]) {
List G = (List )malloc([B]sizeof[/B]([B]struct[/B] libri));
strcpy(G->titolo, titolo);
strcpy(G->autore, autore);
G->cod_id=cod_id;
G->next = L;
[B]return[/B] G;
}
[B]return[/B] initList(titolo, autore,cod_id);
}

[B]struct[/B] libri *inserisciLista([B]struct[/B] libri *nodo, [B]struct[/B] libri *lista)

{

  [B]if[/B] (lista==[B]NULL[/B]) [B]return[/B] nodo;
  lista->next = inserisciLista(nodo, lista->next);
  [B]return[/B] lista;
}
--- i due messaggi sono stati uniti ---

--- i due messaggi sono stati uniti ---

le B tra parente non indicano nulla...nel codice non ci sono ma non so perché qui le inserisce
 
Quale di questi tre programmi è quello finale? Comunque, a parte che l'indentazione è sempre "confusa", e avresti dovuto sistemarla, ci sono i soliti errori di discordanza di tipo. In alcune parti del programma dichiari delle variabili char (come 'titolo' e 'autore') e le usi come se fossero stringhe. Una variabile di tipo char può contenere un carattere (uno solo, per l'esattezza pari a 1 byte), non una stringa! In C le stringhe si rappresentano con gli array di char (o con i puntatori con l'allocazione dinamica della memoria, ma per ora lasciamo perdere). Secondo me devi rivedere la teoria, perché altrimenti non faresti questi errori.
Nella funzione di ricerca hai fatto un po' di confusione: chiedi il titolo del libro da cercare nel main, il che fa supporre che tu lo voglia passare come parametro alla funzione. Ma non hai implementato così la funzione, che ha una variabile 'titolo' (che avrebbe dovuto essere un array) che non viene avvalorata ed è in base a quella che viene fatta la ricerca, ed è per questo che non funziona. La funzione di ricerca, dal canto suo, chiede all'utente nome e matricola, ma, a parte che lo fa nel ciclo (e non ho capito perché, dato che se questi parametri ti servono per la ricerca li dovevi chiedere prima del ciclo), non li usa mai, quindi sono inutili.
Ti invito a guardare gli errori e i warning che il compilatore ti segnala, è fondamentale per capire gli errori nel codice, ed è una cosa che devi acquisire al di là di questo esercizio.
 
Quale di questi tre programmi è quello finale? Comunque, a parte che l'indentazione è sempre "confusa", e avresti dovuto sistemarla, ci sono i soliti errori di discordanza di tipo. In alcune parti del programma dichiari delle variabili char (come 'titolo' e 'autore') e le usi come se fossero stringhe. Una variabile di tipo char può contenere un carattere (uno solo, per l'esattezza pari a 1 byte), non una stringa! In C le stringhe si rappresentano con gli array di char (o con i puntatori con l'allocazione dinamica della memoria, ma per ora lasciamo perdere). Secondo me devi rivedere la teoria, perché altrimenti non faresti questi errori.
Nella funzione di ricerca hai fatto un po' di confusione: chiedi il titolo del libro da cercare nel main, il che fa supporre che tu lo voglia passare come parametro alla funzione. Ma non hai implementato così la funzione, che ha una variabile 'titolo' (che avrebbe dovuto essere un array) che non viene avvalorata ed è in base a quella che viene fatta la ricerca, ed è per questo che non funziona. La funzione di ricerca, dal canto suo, chiede all'utente nome e matricola, ma, a parte che lo fa nel ciclo (e non ho capito perché, dato che se questi parametri ti servono per la ricerca li dovevi chiedere prima del ciclo), non li usa mai, quindi sono inutili.
Ti invito a guardare gli errori e i warning che il compilatore ti segnala, è fondamentale per capire gli errori nel codice, ed è una cosa che devi acquisire al di là di questo esercizio.
l'ultimo era quello "corretto"
--- i due messaggi sono stati uniti ---
l'ultimo era quello "corretto"
no ma la ricerca non e per l'utente e per cercare se il libro è presente nella lista se lo è allora 'utente lo richiede inserendo nome e matricola ma non è per la ricerca dello studente
 
no ma la ricerca non e per l'utente e per cercare se il libro è presente nella lista se lo è allora 'utente lo richiede inserendo nome e matricola ma non è per la ricerca dello studente
Non ho ben capito, potresti ripetere in maniera più precisa?
 
Non ho ben capito, potresti ripetere in maniera più precisa?
l'opzione è: richiedere un libro....cioè che uno studente che richiede di prendere un libro dalla biblioteca...quindi ho pensato che il libro che l'utente richiede viene cercato e se è presente allora l'utente inserisce il nome e la matricola altrimenti ho che il libro non si trova nell'archivio
--- i due messaggi sono stati uniti ---
l'opzione è: richiedere un libro....cioè che uno studente che richiede di prendere un libro dalla biblioteca...quindi ho pensato che il libro che l'utente richiede viene cercato e se è presente allora l'utente inserisce il nome e la matricola altrimenti ho che il libro non si trova nell'archivio
 
l'opzione è: richiedere un libro....cioè che uno studente che richiede di prendere un libro dalla biblioteca...quindi ho pensato che il libro che l'utente richiede viene cercato e se è presente allora l'utente inserisce il nome e la matricola altrimenti ho che il libro non si trova nell'archivio
Ma il nome e la matricola non vengono utilizzati dal programma, quindi a che servono? Sono 'finti'? Non mi pare sensato. Il programma lavora su una lista di libri, i dati dello studente non sono rappresentati.
 
l'opzione è: richiedere un libro....cioè che uno studente che richiede di prendere un libro dalla biblioteca...quindi ho pensato che il libro che l'utente richiede viene cercato e se è presente allora l'utente inserisce il nome e la matricola altrimenti ho che il libro non si trova nell'archivio
--- i due messaggi sono stati uniti ---
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100
struct libri{
char titolo[30];
char autore[30];

  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);


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 *nuovoNodo(char *titolo ,char *autore, int cod_id);


void gestioneErrore(void);


void stampaLista(struct libri *top);


struct libri *inserisciLista(struct libri *nodo, struct libri *lista);





int main() {


int scelta;


FILE *fp;


struct libri *lista=NULL;


char titolo;











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*/





      printf("Inserisci il titolo del libro da cercare: ");


      scanf("%s", &titolo);


       ricerca(lista);


       break;





case 3: /* Case costruito per restituire un libro tramite codice*/


     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;


}





void gestioneErrore()


{


printf("Errore\n");


  exit(0);


}





struct libri *leggiFile(FILE *fp, struct libri *lista)


{





  char titolo[30], autore[30];


  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 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[15];


    char matricola[7];


while (l != NULL && trovato != 1) {


    if(strcmp(l->titolo, &titolo[30])==0) {


printf("\nIl libro cercato e' presente nell'archivio ed il libro e' disponibile");


       trovato=1;


    printf("\nInserisci nome:");


     scanf("%s", &nome[15]);


     printf("\nInserisci matricola:");


      scanf("%s", &matricola[7]);


      }


    l = l->next;


    }





     if(trovato != 1)


        printf("\n Libro non trovato");





}





struct libri *inserisciLista(struct libri *nodo, struct libri *lista)


{


  if (lista==NULL) return nodo;


  lista->next = inserisciLista(nodo, lista->next);


  return lista;


}
ho fatto altre modifiche
--- i due messaggi sono stati uniti ---
Ma il nome e la matricola non vengono utilizzati dal programma, quindi a che servono? Sono 'finti'? Non mi pare sensato. Il programma lavora su una lista di libri, i dati dello studente non sono rappresentati.
si ma lo studente deve esserci....devo fare una struct di studente
 
Ultima modifica da un moderatore:
Te lo chiedo per pietà, quando posti il codice fallo utilizzando il tag CODE (selezionabile anche dal menù) e sistema indentazione e spaziatura, altrimenti è illeggibile (non è un puntiglio, io stesso non capirei codice scritto da me se non lo indentassi opportunamente). Aiutaci ad aiutarti.
scanf("%s", &nome[15]);
Sai cosa significa questo? Che tenti di memorizzare una stringa nel quindicesimo elemento dell'array 'nome'. Dovevi scrivere scanf("%s", nome);.
Ma il compilatore non ti dice nulla? È impossibile che ti faccia compilare questo codice. Leggi i messaggi del compilatore. E come dice @Andretti60 dovresti postare i messaggi d'errore altrimenti dobbiamo fare noi uno sforzo interpretativo per capire qual è il problema e diventa difficile aiutarti.
Purtroppo non ho mai usato Xcode ma immagino che non sia diverso dagli altri ambienti di sviluppo da questo punto di vista (anche perché Xcode non è un compilatore, ma si appoggia ad un compilatore esterno, credo Clang, che di sicuro produce i messaggi d'errore e i warning necessari).
 
Te lo chiedo per pietà, quando posti il codice fallo utilizzando il tag CODE (selezionabile anche dal menù) e sistema indentazione e spaziatura, altrimenti è illeggibile (non è un puntiglio, io stesso non capirei codice scritto da me se non lo indentassi opportunamente). Aiutaci ad aiutarti.

Sai cosa significa questo? Che tenti di memorizzare una stringa nel quindicesimo elemento dell'array 'nome'. Dovevi scrivere scanf("%s", nome);.
Ma il compilatore non ti dice nulla? È impossibile che ti faccia compilare questo codice. Leggi i messaggi del compilatore. E come dice @Andretti60 dovresti postare i messaggi d'errore altrimenti dobbiamo fare noi uno sforzo interpretativo per capire qual è il problema e diventa difficile aiutarti.
Purtroppo non ho mai usato Xcode ma immagino che non sia diverso dagli altri ambienti di sviluppo da questo punto di vista (anche perché Xcode non è un compilatore, ma si appoggia ad un compilatore esterno, credo Clang, che di sicuro produce i messaggi d'errore e i warning necessari).
dabbene ne sto utilizzando uno on line ma mi dice questo
10437133/source.c:49:15: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[30]’ [-Wformat=]
scanf("%s", &titolo);
perche?
--- i due messaggi sono stati uniti ---
si vabbene...ne sto utilizzando uno on line ma mi dice questo
10437133/source.c:49:15: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[30]’ [-Wformat=]
scanf("%s", &titolo);
perche?
 
dabbene ne sto utilizzando uno on line ma mi dice questo
10437133/source.c:49:15: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[30]’ [-Wformat=]
scanf("%s", &titolo);
perche?
--- i due messaggi sono stati uniti ---
Perché come ti ho scritto sin dal primo post di ieri sera non ci va la & con gli array.
 
Ma il collegamento tra lista e file e fatto bene?
In che senso? Se non ci sono errori di compilazione e warning e il programma funziona come desideri, si può concludere di sì. Poi se vogliamo discutere di scelte ingegneristiche e implementative è un altro discorso, nel senso che non c'è un solo modo giusto per fare una cosa ma tanti, ed è il programmatore a scegliere la strada che preferisce, entro certi limiti. Noto però che non hai ancora corretto varie cose (la funzione di ricerca, l'uscita dal programma, ecc.). Inoltre non hai mai usato la struct
Codice:
typedef struct {
    struct libri elementi[100];
    int num_libri;
}Libro;
Forse all'inizio volevi fare un array di libri anziché una lista puntata. Se non ti serve eliminala.
 
In che senso? Se non ci sono errori di compilazione e warning e il programma funziona come desideri, si può concludere di sì. Poi se vogliamo discutere di scelte ingegneristiche e implementative è un altro discorso, nel senso che non c'è un solo modo giusto per fare una cosa ma tanti, ed è il programmatore a scegliere la strada che preferisce, entro certi limiti. Noto però che non hai ancora corretto varie cose (la funzione di ricerca, l'uscita dal programma, ecc.). Inoltre non hai mai usato la struct
Codice:
typedef struct {
    struct libri elementi[100];
    int num_libri;
}Libro;
Forse all'inizio volevi fare un array di libri anziché una lista puntata. Se non ti serve eliminala.
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
--- i due messaggi sono stati uniti ---
Ah no in realtà mi serviva per andare ad inserire il libro nella scelta in cui si deve restituire il libro no perché pensavo che forse la funzione di ricerca non mi funziona perché i dati del file non sono sincronizzati con la lista
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top