Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Programma biblioteca in c
Forum - C/C++ - Programma biblioteca in c

Avatar
roccop9 (Normal User)
Newbie


Messaggi: 2
Iscritto: 29/01/2016

Segnala al moderatore
Postato alle 18:54
Venerdì, 29/01/2016
Questo topic è stato chiuso dal moderatore

Salve ragazzi ho un problema con questo progetto e vi supplico per un aiuto :(
l'intestazione è:
Si vuole simulare la gestione automatizzata di una biblioteca. Si suppone di avere un archivio di massimo 100 libri identificati da un titolo, nome dell’autore o autori massimo 5, da un codice identificativo e da un prezzo di prestito. Un libro può essere presente nell’archivio o in prestito.
Permettere all’utente di:
• Inserire un nuovo libro nell’archivio (automaticamente gli viene assegnato un codice).
• Richiedere un libro tramite il codice (verificare se esso è presente o non è in prestito).
• Cercare nell’archivio il libro più costoso (usare un approccio divide-etimpera) Implementare l’algoritmo per la simulazione della biblioteca ed effettuare almeno un test per ognuna delle opzioni richieste dall’utente.

Ora quello che sono riuscito a fare e questo:
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <conio.h>
  5. int main()
  6. {
  7. int i=0;
  8. struct Libro{
  9. char titolo[20];
  10. char nome_autore[20];
  11. int codice_identificativo;
  12. int prezzo_di_prestito;
  13. };
  14. typedef struct Libro libro;
  15.  
  16. int var=0;
  17. libro biblioteca[10];
  18. strcpy(biblioteca[0].titolo, "\n");
  19. printf("%s",biblioteca[0].titolo); /*for(i=0;i<20;i++){} */
  20.  
  21. printf(" ***********************************************************************\n");
  22. printf(" *         Benvenuto nel sistema per la gestione della biblioteca      *\n");
  23. printf(" ***********************************************************************\n");
  24. printf(" *         Premere 1 per inserire un nuovo libro                       *\n");
  25. printf(" *         Premere 2 per richiedere un libro tramite il titolo         *\n");
  26. printf(" *         Premere 4 per restituire un libro tramite codice            *\n");
  27. printf(" *         Premere 5 per cercare nell'archivio il libro piu' costoso   *\n");
  28. printf(" *         Premere 0 per uscire                                        *\n");
  29. printf(" ***********************************************************************\n");
  30. scanf("%d",&var);
  31. return 0;
  32. }


qualcuno puo darmi una mano a completarlo? Vi sarei infinitamente grato :hail:

PM
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:11
Venerdì, 29/01/2016
Beh, non hai fatto quasi nulla... Mi sa che è una richiesta fuori luogo.

Parti dal primo punto da risolvere, tenta di affrontarlo e poni qui i tuoi dubbi, ma solo su quel primo punto...


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM
Avatar
roccop9 (Normal User)
Newbie


Messaggi: 2
Iscritto: 29/01/2016

Segnala al moderatore
Postato alle 20:43
Venerdì, 29/01/2016
Allora ho cambiato un po di cose :
Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6.  
  7. /* Creazione di un array di struct libro contenente 5 campi*/
  8.  
  9. struct libro{
  10. char titolo[30];
  11. char nome_autori[5][20];
  12. int codice_identificativo;
  13. int prezzo_di_prestito;
  14. int status; /* Status indica se il libro è presente(1) oppure è in prestito(0)*/
  15. };
  16. typedef struct libro Libro;
  17.  
  18.  
  19. int main ()
  20. {
  21.  
  22.  
  23. int var; /*Questa variabile sarà utilizzata nella switch per decidere che cosa fare...*/
  24. int i,max; /* Variabili utilizzate per inserire un nuovo libro nell'archivio */
  25. int flag=2;
  26. char titolo_richiesto [30]; /* Le variabili flag e titolo_richiesto sono utilizzate per richiedere un libro tramite il codice */
  27. int cod_id; /* Variabile utilizzata per richiedere un libro tramite il codice*/
  28. int id; /* Variabile utilizzata per restituire un libro tramite codice*/
  29. int maxi; /* Variabile utilizzata per cercare il libro più costoso */
  30.  
  31.  
  32. /* Inizializzazione della libreria */
  33. Libro libreria [] =
  34. {
  35. {"Il signore degli anelli","James Redfield","Silvestrone",5,1,1},
  36. {"Harry Potter","Paulo Coelho",7,1,2},
  37. {"La bibbia","Marco Bianchi",8,0,3},
  38. {"Piccole donne","Piero Mozzi",60,0,4},
  39. {"Guarnizione","Napoleton Hill",1,0,5},
  40. {"Il nome della rosa","Louise",10,1,6},
  41. {"Via col vento","Jerry Ford",3,1,7},
  42. {"Odissea","Rhonda Bryne","Galano","Loius Scott","Trent",40,1,8},
  43. {"Cuore","Fabio Marchesi",12,1,9},
  44. {"Malavoglia","Valeria Soglia",4,0,10},
  45. {"Siddharta","Still",2,1,11},
  46. {"Lolita","Moccia","Crail Wilcox",12,0,12},
  47. {"Amabili resti","Wagner","Pone Raffy",35,1,13},
  48. {"Sulla strada","Boldi",1,1,14},
  49. {"Possession","Esposito Faby",25,1,15},
  50. {"Germinale","Fabio Beatrice",10,0,16},
  51. {"Il piccolo principe","Siani",24,1,17},
  52. {"Un uomo","Finucci Genny",14,1,18},
  53. {"Amleto","Ohls","Ylenia Star",23,0,19}
  54. };
  55.  
  56.  
  57. /* Inizializzazione biblioteca */
  58. do
  59. {
  60. printf("* * * * * * * * * * * * * * * * * * * * * * *\nBenvenuto nel programma di gestione biblioteca\n* * * * * * * * * * * * * * * * * * * * * * *\n");
  61. printf("Premere:\n 1. Per inserire un nuovo libro;\n 2. Per richiedere libro tramite titolo;\n 3. Per richiedere un libro tramite codice;\n 4. Per restituire un libro;\n 5. Per cercare libro piu costoso;\n 0. Per uscire.\n");
  62.  
  63.  
  64. scanf("%d",&var); /*Viene inserito nella variabile var il numero inserito dall'utente e di conseguenza inserito nel ciclo Switch*/
  65. switch (var) /* Creo uno switch con 5 case, uno per ogni possibile scelta */
  66. {
  67.  
  68.  
  69. case 1 : /* Se l'utente preme tasto 1 si attiva questo case per inserire un nuovo libro nell'archivio */
  70.  
  71.  
  72. i=0;
  73. max=0;
  74. for(i=0;i<19;i++)
  75. {
  76. if(libreria[i].codice_identificativo>max){
  77. max=libreria[i].codice_identificativo;}
  78. }
  79. printf("Inserire titolo del libro:\n ");
  80. scanf("%s",&libreria[max+1].titolo);
  81. printf("Inserire nome dell'autore:\n");
  82. scanf("%d",&libreria[max+1].nome_autori);
  83. printf("Inserire 1 se il libro e' disponibile oppure 0 se e' in prestito:\n");
  84. scanf("%d",&libreria[max+1].status);
  85. libreria[max+1].codice_identificativo=max+1;
  86. printf("Grazie!! Il libro e' stato inserito nell'archivio correttamente\n");
  87. break;
  88.  
  89.  
  90. case 2 : /* Se l'utente preme il tasto 2 vuole richjedere un libro tramite il titolo*/
  91.  
  92.  
  93. i=0;
  94. printf("Inserire il titolo del libro da richiedere:\n");
  95. scanf("%s",&titolo_richiesto);
  96. while(flag!=0 && i<19){
  97. if(strcmp(titolo_richiesto , libreria[i].titolo)==0){
  98. flag=0;
  99. if(libreria[i].status==1){
  100. printf("\nIl libro e' presente nell'archivio ed e' disponibile.\n");
  101. libreria[i].status=0;
  102. printf("\nSuddetto libro le e' appena stato ceduto in prestito.\nArrivederci e Grazie!");}
  103. else{
  104. printf("\nIl libro e' presente nell'archivio ma attualmente e' in prestito\n");}
  105. }
  106. else{
  107. i=i+1;}}
  108. if(flag!=0){
  109. printf("\nIl libro non e' presente nell'archivio!!\n");} break;
  110.  
  111.  
  112. case 3 : /* Premendo il tasto 3 l'utente vuole richiedere un libro tramite il titolo*/
  113.  
  114.  
  115. i=0;
  116. printf("Inserire il codice identificativo del libro da richiedere: \n");
  117. scanf("%d",&cod_id);
  118. while(flag!=0 && i<19){
  119. if(cod_id==libreria[i].codice_identificativo){
  120. flag=0;
  121. if(libreria[i].status==1){
  122. printf("\nIl libro e' presente nell'archivio ed e' disponibile.\n");
  123. libreria[i].status==0;
  124. printf("\nSuddetto libro le e' appena stato ceduto in prestito: %s.\nArrivederci e Grazie!\n", libreria[i].titolo);}
  125. else{
  126. printf("\nIl libro e' presente nell'archivio ma attualmente e' in prestito\n");}
  127. }
  128. else{
  129. i=i+1;}}
  130. if(flag!=0){
  131. printf("\nL'archivio non dispone di alcun libro avente questo codice identificativo\nArrivederci e Grazie!\n");}
  132. break;
  133.  
  134.  
  135. case 4 : /* Case costruito per restituire un libro tramite codice*/
  136.  
  137.  
  138. i=0;
  139. printf("Inserire il codice identificativo del libro da restituire: \n");
  140. scanf("%d",&id);
  141. while(flag!=0 && i<19){
  142. if(id==libreria[i].codice_identificativo){
  143. flag=0;
  144. if(libreria[i].status==1){
  145. printf("\nErrore: Il libro e' gia' disponibile.\nArrivederci e Grazie.\n");}
  146. else{
  147. libreria[i].status=1;
  148. printf("\nSuddetto libro e' appena stato restituito: %s\nLa ringraziamo per la serieta'. Arrivederci!\n",libreria[i].titolo);}
  149. }
  150. else{
  151. i=i+1;}}
  152. if(flag!=0){
  153. printf("\nL'archivio non dispone di alcun libro avente questo codice identificativo\nArrivederci e Grazie!");}
  154. break;
  155.  
  156.  
  157. case 5: /* Si vuole cercare il libro più costoso nell'archivio */
  158.  
  159.  
  160. maxi = 0;
  161. for(i=1;i<19;i++)
  162. {
  163. if(libreria[i].prezzo_di_prestito > libreria[maxi].prezzo_di_prestito)
  164. {
  165. maxi = i;
  166. }
  167. }
  168. printf("\n\nIl libro col prezzo massimo e': %s", libreria[maxi].titolo);
  169. return 0; break;
  170.  
  171.  
  172. case 0 :
  173.  
  174.  
  175. printf("Hai deciso di uscire dalla libreria!! Ciao!!\n"); break;
  176.  
  177.  
  178. default:printf("Inserimento Errato\nRiprovare: \n:");break; /*Se l'utente sbaglia ad inserire il numero*/
  179. } /* Fine switch */
  180. } /* Fine do */
  181. while (var>5);
  182. system("Pause");
  183. }



Ci sono alcune cose che non tornano le scelte me le fa fare ma c'e sempre qualcosa che non funziona :
quando scelgo
1 se metto come nome del libro una singola parola mi fa passare alla seconda scelta ma quando metto il nome autore mi fa passare direttamente alla fine.
2 quando metto il nome del libro vale la stessa cosa se e di una singola parola mi accetta la soluzione ma il libro e sempre in prestito , se metto un nome composto da piu parole non e mai presente nella libreria.
3 quando metto il codice per il libro dice sempre che non e presente
4 stessa cosa non posso restituire un libro perche dice sempre che non esiste quel codice
5 mi porta il signiore degli anelli come piu costoso ma dubito anche di questo ora
0 l'unica cosa che funziona ......

Ultima modifica effettuata da roccop9 il 29/01/2016 alle 21:10
PM
Avatar
Template (Member)
Pro


Messaggi: 175
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 22:41
Venerdì, 29/01/2016
Il programma, così come l'hai scritto, ha vari problemi, ed il codice è praticamente illeggibile (non ti hanno spiegato l'importanza dell'indentazione?)... ma andiamo con ordine: intanto rispondo alle tue domande.


Testo quotato

Postato originariamente da roccop9:
1 se metto come nome del libro una singola parola mi fa passare alla seconda scelta ma quando metto il nome autore mi fa passare direttamente alla fine.
2 quando metto il nome del libro vale la stessa cosa se e di una singola parola mi accetta la soluzione ma il libro e sempre in prestito , se metto un nome composto da piu parole non e mai presente nella libreria.
3 quando metto il codice per il libro dice sempre che non e presente
4 stessa cosa non posso restituire un libro perche dice sempre che non esiste quel codice
5 mi porta il signiore degli anelli come piu costoso ma dubito anche di questo ora
0 l'unica cosa che funziona ......




1 - Questo avviene a causa del funzionamento della funzione scanf: quando tu le chiedi di leggere una stringa, la funzione di fatto legge tutti i caratteri fino al primo "carattere speciale" (un newline, uno spazio, un TAB...), e quindi finisce per leggerti solo la prima parola; in seguito, le successive scanf trovano nello stream le altre parole scritte prima, e prendono quelle invece di chiederti ulteriori inserimenti.
Per leggere un intero titolo (o, in generale, qualsiasi stringa di lunghezza massima nota e composta da più parole), una funzione più adatta sarebbe gets ( http://www.cplusplus.com/reference/cstdio/gets/ ), la quale legge tutti i caratteri nell'input stream finchè non trova un carattere di newline.

2 - Idem come al punto 1

3 - Intanto, l'istruzione
Codice sorgente - presumibilmente Plain Text

  1. libreria[i].status==0;

non ha senso... o almeno, un senso ce l'ha, ma sicuramente non è quello che volevi dargli tu: l'assegnamento si fa usando l'operatore "=", non "==" (che è un operatore di confronto). Quindi, avresti dovuto scrivere
Codice sorgente - presumibilmente Plain Text

  1. libreria[i].status=0;

.
Ancora: tu non hai, evidentemente, la minima idea di come si inizializzino i valori di una matrice: se tu scrivi una cosa del genere:

Codice sorgente - presumibilmente Plain Text

  1. {"Il signore degli anelli","James Redfield","Silvestrone",5,1,1},



Nella matrice degli autori ci stai mettendo solo "James Redfield", perchè il secondo nome è stato scritto come se fosse il campo successivo della struct. Il modo corretto di scrivere quest'istruzione è:

Codice sorgente - presumibilmente Plain Text

  1. {"Il signore degli anelli",{"James Redfield","Silvestrone"},5,1,1},



Con le parentesi graffe a delimitare i valori inseriti nella matrice.

4 - Idem come il punto 3.

5 - Dai dati che hai scritto, pare che riporti il risultato corretto.


Bene... detto questo, un paio di domande voglio fartele io:

1 - Che formazione hai, in materia di programmazione? Sei autodidatta (e se si, da quanto), la studi a scuola o all'università, hai seguito un corso?
2 - Hai mai letto una sola pagina di un libro di programmazione decente? Nel tuo codice (lasciando stare la questione "stilistica", che si commenta da sola) ci sono scritture allucinanti!


Già che ci sono, ne approfitto per farti notare una cosa: non ha senso scrivere:


Codice sorgente - presumibilmente C/C++

  1. while(flag!=0 && i<19)
  2. {
  3.      if(...)
  4.      {
  5.            if(quello_che_deve_succedere)
  6.            {
  7.                flag = 0;
  8.                ...
  9.            }
  10.      }
  11.      else
  12.      {
  13.          i=i+1;
  14.      }
  15. }



Quando puoi benissimo scrivere:

Codice sorgente - presumibilmente C/C++

  1. for(i = 0; i < 19; i++)
  2. {
  3.    if(...)
  4.    {
  5.        ...
  6.        if (quello_che_deve_succedere)
  7.            break; /*Che sortisce lo stesso effetto di tutto quel casino con il flag*/
  8.    }
  9. }



O, se proprio ti piace il flag:

Codice sorgente - presumibilmente C/C++

  1. for(i = 0; i < 19, flag != 0; i++)
  2. {
  3.    if(...)
  4.    {
  5.        ...
  6.        if (quello_che_deve_succedere)
  7.        {
  8.             flag = 0;
  9.             ...
  10.        }
  11.    }
  12. }




Ah, e un'ultima cosa: main() è una funzione di tipo int, quindi DEVE RITORNARE UN VALORE. Deve finire così:

Codice sorgente - presumibilmente C/C++

  1. int main()
  2. {
  3.     ...
  4.     system("Pause");
  5.     return UN_NUMERO;
  6. }



Non così:

Codice sorgente - presumibilmente C/C++

  1. int main()
  2. {
  3.     ...
  4.     system("Pause");
  5. }


Ultima modifica effettuata da Template il 30/01/2016 alle 16:00


"Nel curriculum scrivete quello che sapete fare... e anche quello che non sapete fare! Tipo: "Già vescovo di Cracovia, partecipai alla Coppa America, vincendola!""
[...]
"Sto giocando al piccolo Dio e mi sta venendo pure alla grande."
PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6109
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:12
Sabato, 30/01/2016
Testo quotato

Postato originariamente da roccop9:

Allora ho cambiato un po di cose :



Più che altro, ho copiato un pò le cose. http://forum.html.it/forum/showthread/t-2897753.html

:nono:

Un corso universitario non si passa così. Non troverai nessuno che ti fa il compito per te in questo forum, possiamo spiegarti i concetti e aiutarti a scrivere la soluzione, ma se non hai le basi del linguaggio per capire cosa ti stiamo spiegando, stiamo tutti sprecando tempo.

Ultima modifica effettuata da pierotofy il 30/01/2016 alle 16:14


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM
Avatar
Template (Member)
Pro


Messaggi: 175
Iscritto: 09/12/2015

Segnala al moderatore
Postato alle 17:19
Sabato, 30/01/2016
Testo quotato

Postato originariamente da pierotofy:

Più che altro, ho copiato un pò le cose. http://forum.html.it/forum/showthread/t-2897753.html




Sono senza parole... che schifo... :grr:


"Nel curriculum scrivete quello che sapete fare... e anche quello che non sapete fare! Tipo: "Già vescovo di Cracovia, partecipai alla Coppa America, vincendola!""
[...]
"Sto giocando al piccolo Dio e mi sta venendo pure alla grande."
PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6109
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:00
Sabato, 30/01/2016
Questo topic è in violazione di una o più norme del regolamento: http://www.pierotofy.it/pages/extras/forum/9/3839-regolame ... .
    
Dopo averlo letto riapri un nuovo topic assicurandoti di aver rispettato le regole. Grazie per la tua pazienza.


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM