Domanda [RISOLTO] - [C] Progetto Biblioteca

Stato
Discussione chiusa ad ulteriori risposte.

-Chuck-

Utente Bronze
18 Febbraio 2017
23
4
1
28
Ultima modifica:
Salve a tutti! Mi dispiace presentarmi e subito pubblicare un mio problema, spero non ve la prendiate. Comunque quel che sto cercando di fare è:

Gestire l'archivio di una biblioteca (di massimo 100 libri) i cui libri libri siano identificati da titolo, autore, prezzo e disponibilità (quindi se in prestito o meno). Il programma deve permettere:
  1. -di inserire un libro (a cui venga assegnato automaticamente un codice di riconoscimento).
  2. -cercare un libro tramite codice
  3. -cercare il libro più costoso.
Ho creato lo scheletro del programma per poi procedere di punto in punto ma sono già fermo al primo. Sono riuscito a realizzare l'inserimento dei libri ma non capisco come fare per il codice.
Non so come assegnare alla variabile 'codice', presente nell'array di struct, un valore che sia diverso per ogni libro, nei miei tentativi riscontro spesso l'errore "assignment to expression with array type". Come faccio?

So che magari non sono riuscito a spiegarmi al meglio, ditemi almeno cosa non va (a parte altre cose come puts o gets che so che dovrei evitare, ma per ora voglio solo che funzioni e poi correggo tutto nei minimi dettagli).

Grazie in anticipo a tutti, chiarisco che non cerco qualcuno che lavori al posto mio, ma qualche consiglio per proseguire. Piuttosto mi auguro che il programma sia leggibile, è il progetto più "grande" a cui ho lavorato fin ora, quindi mi rendo conto che sia un po' disordinato.

C:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
typedef struct{
    char    titolo[40];
    char    autore[20];
    int     prezzo;
    int     codice;
    int     stato; //disponibilità, quindi se il libro è in prestito o meno
}lib;
int L=100;
int m=0;
int confronta(const void* a, const void* b){
    lib* sa = (lib*)a;
    lib* sb = (lib*)b;
    return (strcmp(sa->titolo,sb->titolo));
}
int main(){
    lib v[100];
    int t;
    char buffer[40];
    int i=0;
    int j=0;
    int codice;
    while(1){
        puts("Specificare un'operazione");
        puts("1- Aggiungi un nuovo libro");
        puts("2- Ricerca per codice");
        puts("3- Stampa l'archivio");
        puts("4- Cerca libro più costoso")
        puts("0- Esci dal programma");
        scanf("%d\n",&t);
        switch(t){
        case 0:
            return 0;
     
        case 1:
            for(;i<L;i++)
            {
                printf("Inserisci il titolo: ");
                fflush(stdin);
                fgets(v[i].titolo, sizeof(v[i].titolo), stdin);

                printf("Inserisci l'autore: ");
                fflush(stdin);
                fgets(v[i].autore, sizeof(v[i].autore), stdin);

                printf("Inserisci il prezzo: ");
                fflush(stdin);
                fgets(v[i].prezzo, sizeof(v[i].prezzo), stdin);
                fflush(stdin);

                printf("Inserisci il stato (1 o 0): "); /*per lo stato dovrei ancora inserire finire, con un if magari, ma ci                    penso dopo*/
                fflush(stdin);
                fgets(v[i].stato, sizeof(v[i].stato), stdin);
                fflush(stdin);

               /*qui è dove ho il mio problema*/
          
                v[i].codice = ++;
                fflush(stdin);
                printf("Il codice del libro e': %d", v[i].codice);

                puts("Aggiungere un altro libro?");
                scanf("%1s",buffer);
                fflush(stdin);
                if((buffer[0]=='n')||(buffer[0]=='N'))
                {
                    i++;
                    break;
                }
            }
            continue;
     
        case 2:
            puts("Inserisci il codice da cercare");
            scanf("%d",codice);
            for (j=0;j<L;j++){
                if(strstr((v+j)->codice,codice)){
                    puts("Corrispondenza trovata");
                    printf("%s\n %s\n",v[j].titolo, v[j].codice);
                }
            }
            continue;
     
        case 3:
            qsort(v,i,sizeof(lib),confronta);
            for(j=0;j<i;j++){
                printf("%s %s\n",v[j].titolo, v[j].codice);
            }
            continue;
        default:
            puts("Errore di input. Riprova");
            continue;
        }
    }
    return 0;
}
 
Ok, sono riuscito a sbloccarmi. Ho corretto così, nella maniera più stupida possibile. Non capisco perché prima non ci riuscivo...

C:
                    ++m;
                    v[i].codice=m;
                    printf("Il codice del libro e': %d", v[i].codice);

Però finché non finisco preferirei tenere la discussione aperta (se i moderatori consentono), se avete consigli da darmi li accetto volentieri.
 
Ok, sono riuscito a sbloccarmi. Ho corretto così, nella maniera più stupida possibile. Non capisco perché prima non ci riuscivo...

C:
                    ++m;
                    v[i].codice=m;
                    printf("Il codice del libro e': %d", v[i].codice);

Però finché non finisco preferirei tenere la discussione aperta (se i moderatori consentono), se avete consigli da darmi li accetto volentieri.
Non ho provato il tuo codice, ma da una lettura superficiale potresti usare la variabile i invece di dichiarare m ed incrementarla.
 
Ultima modifica:
Non ho provato il tuo codice, ma da una lettura superficiale potresti usare la variabile i invece di dichiarare m ed incrementarla.

Eh ci avevo pensato. Però dopo che finisco di inserire i libri e torno al menu, se volessi inserirne altri ' i ' verrebbe reinizializzata a zero al rientro nel ciclo for. Mi troverei libri con lo stesso codice.
Almeno credo.
 
Ultima modifica:
Sto continuando a lavorarci. Sono arrivato a questo punto:
L'opzione 1 di inserimento pare funzionare (devo solo sistemare la funzione della disponibilità o meno dei libri).
Ma mi trovo ancora fermo, stavolta per l'opzione 2 di ricerca di libri per codice che sto cercando di far funzionare in questa maniera ma non va, mi sa che non ho capito qualche meccanismo.

C:
 printf("\nInserisci il codice del libro da cercare: ");
  scanf("%d", &cerca);
  for(n=0;n<100;++n) //100 è il limite di libri che possono stare in archivio
  {
     if(cerca!=v[i].codice)
     {
         break;
      }
      if(cerca==v[i].codice)
      {
         printf("%s %s %d %d\n", v[i].titolo,v[i].autore,v[i].prezzo,v[i].stato);
         break;
     }
  }



Invece quello che segue ora è l'aspetto complessivo attuale:
C:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
typedef struct{
    char    titolo[40];
    char    autore[20];
    int     prezzo;
    int     stato; //disponibilità, quindi se il libro è in prestito o meno
    int     codice;
}lib;

int L=100;
int m=0;
int confronta(const void* a, const void* b){
    lib* sa = (lib*)a;
    lib* sb = (lib*)b;
    return (strcmp(sa->titolo,sb->titolo));
}
int main()
{
    lib v[100];
    int t;
    char buffer[40];
    int i;
    int j=0;
    int codice;
    int cerca;
    int n, pos, trovato;
    while(1){

        puts("\n----- BIBLIOTECA -----\n");
        puts("Specificare un'operazione\n");
        puts("1 - Aggiungi un nuovo libro");
        puts("2 - Ricerca per codice");
        puts("3 - Stampa l'archivio");
        puts("4 - Cerca libro piu' costoso");
        puts("0 - Esci dal programma");
        scanf("%d",&t);
        fflush(stdin);

        switch(t)
        {
            case 0:
                return 0;

            case 1:
                for(i=0;i<L;i++)
                {
                    puts("Inserisci il titolo");
                    scanf("%40s",v[i].titolo);
                    fflush(stdin);

                    puts("Inserisci l'autore");
                    scanf("%20s",v[i].autore);
                    fflush(stdin);

                    puts("Inserisci il prezzo");
                    scanf("%d",&v[i].prezzo);
                    fflush(stdin);

                    puts("Inserisci lo stato");
                    scanf("%d",&v[i].stato);
                    fflush(stdin);

                    ++m;
                    v[i].codice=m;
                    printf("Il codice del libro e': %d\n",v[i].codice);

                    puts("Aggiungere un'altro numero?");
                    scanf("%s",buffer);
                    fflush(stdin);

                    if((buffer[0]=='n')||(buffer[0]=='N'))
                    {
                        i++;
                        break;
                    }
                }
                continue;

            case 2:
                printf("\nInserisci il codice del libro da cercare: ");
                scanf("%d", &cerca);
                for(n=0;n<100;++n) //100 è il limite di libri che possono stare in archivio
                {
                    if(cerca!=v[i].codice)
                    {
                        break;
                    }
                    if(cerca==v[i].codice)
                    {
                        printf("%s %s %d %d\n", v[i].titolo,v[i].autore,v[i].prezzo,v[i].stato);
                        break;
                    }

                }
                continue;

            case 3:
                qsort(v,i,sizeof(lib),confronta);
                for(j=0;j<i;j++)
                {
                    printf("%s %s\n",v[j].titolo, v[j].codice);
                }
                continue;
            default:
            puts("Errore di input. Riprova");
            continue;
        }
    }
    return 0;
}
 
Puoi usare un solo if nella ricerca:
C++:
printf("\nInserisci il codice del libro da cercare: ");
scanf("%d", &cerca);
for(n=0;n<100;++n) //100 è il limite di libri che possono stare in archivio
{
    if(cerca==v[i].codice)
    {
        //libro trovato
        printf("%s %s %d %d\n", v[i].titolo,v[i].autore,v[i].prezzo,v[i].stato);
        break;
    }
}
//nessun libro trovato
 
Puoi usare un solo if nella ricerca:
C++:
printf("\nInserisci il codice del libro da cercare: ");
scanf("%d", &cerca);
for(n=0;n<100;++n) //100 è il limite di libri che possono stare in archivio
{
    if(cerca==v[i].codice)
    {
        //libro trovato
        printf("%s %s %d %d\n", v[i].titolo,v[i].autore,v[i].prezzo,v[i].stato);
        break;
    }
}
//nessun libro trovato

Si mi sembra giusto ma non capisco perché non funziona.
Seleziono dal menu la ricerca del codice, inserisco il codice e mi riporta al menu senza dirmi nulla.
 
Probabilmente perchè l'array v in "v.codice" viene scandito utilizzando i al posto di n "v[n].codice".
 
Ultima modifica:
Scusatemi, vi chiedo ancora una cosa e ho finito. Sto completando l'ultimo punto, quindi la ricerca del libro più costoso. La sintassi è corretta, ma l'output è incomprensibile.
Magari il codice che ho inserito per la ricerca del massimo non si può applicare per gli array di struct ma solo per gli array normali, è così? Nel caso fosse così cos'è che devo correggere?

C:
       max=v[0].prezzo;
       for(n=0;n<100;++n)
       {
          if(v[n].prezzo>max)
          {
               max=v[n].prezzo;
          }
       }
      printf("%s %s %d %d\n", v[n].titolo,v[n].autore,v[n].prezzo,v[n].stato);

Questo è l'output del menu e dell'opzione 4 (dopo aver inserito dei libri)
 
Ultima modifica:
Io non riesco a capire perché passando da un'opzione all'altra del programma si resettano man mano i libri, scomparendo dall'archivio. Cosa può essere?
Credo che entrando e uscendo dai cicli for avvenga qualcosa che faccia perdere le "memorie" degli array. Come posso risolvere?
Questa è l'ultima versione del programma:
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
    char    titolo[40];
    char    autore[20];
    int     prezzo;
    int     stato;/*disponibilità, quindi se è in prestito o meno. Lo stato è solo un abbozzo*/
    int     codice;
}lib;

int L=100;
int m=0;
    lib v[100];
    int t;
    char buffer[40];
    int i;
    int j=0;
    int codice;
    int cerca;
    int n, pos, trovato, h;
    int max;
 
int main()
{

    while(1){

        puts("\n----- BIBLIOTECA -----\n");
        puts("Specificare un'operazione\n");
        puts("1 - Aggiungi un nuovo libro");
        puts("2 - Ricerca per codice");
        puts("3 - Cerca libro piu' costoso");
        puts("0 - Esci dal programma");
        scanf("%d",&t);
        fflush(stdin);

        switch(t)
        {
            case 0:
                return 0;

            case 1:
                for(i=0;i<L;i++)
                {
                    puts("Inserisci il titolo");
                    scanf("%40s",v[i].titolo);
                    fflush(stdin);

                    puts("Inserisci l'autore");
                    scanf("%20s",v[i].autore);
                    fflush(stdin);

                    puts("Inserisci il prezzo");
                    scanf("%d",&v[i].prezzo);
                    fflush(stdin);

                    puts("Inserisci lo stato");
                    scanf("%d",&v[i].stato);
                    fflush(stdin);

                    ++m;
                    v[i].codice=m;
                    printf("Il codice del libro e': %d\n",v[i].codice);

                    puts("Aggiungere un altro libro?");
                    scanf("%s",buffer);
                    fflush(stdin);

                    if((buffer[0]=='n')||(buffer[0]=='N'))
                    {
                        i++;
                        break;
                    }
                }
                continue;

            case 2:
                printf("\nInserisci il codice del libro da cercare: ");
                scanf("%d", &cerca);
                for(n=0;n<L;++n) //100 è il limite di libri che possono stare in archivio
                    {
                        if(cerca==v[n].codice)
                        {
                            //libro trovato
                            printf("%s %s %d %d\n", v[n].titolo,v[n].autore,v[n].prezzo,v[n].stato);
                            break;
                        }
                    }
                continue;

            case 3:
                max=v[h].prezzo;
                for(h=0;h<L;++h)
                {
                    if(v[h].prezzo>max)
                    {
                        max=v[h].prezzo;
                    }
                printf("%s %s %d %d\n", v[h].titolo,v[h].autore,v[h].prezzo,v[h].stato);
                break;
                }
            continue;
            default:
            puts("Errore di input. Riprova");
            continue;
        }
    }
    return 0;
}
 
Io non riesco a capire perché passando da un'opzione all'altra del programma si resettano man mano i libri, scomparendo dall'archivio. Cosa può essere?
Credo che entrando e uscendo dai cicli for avvenga qualcosa che faccia perdere le "memorie" degli array. Come posso risolvere
Immagino succeda quando inserisci un nuovo libro dopo aver già fatto la prima serie di inserimenti. Infatti ricominci a ciclare sempre da 0 quando aggiungi un libro:
C:
for(i=0;i<L;i++)
{
    /* Inserimento dati libro */
}
Immagino tu voglia quindi togliere l'inizializzazione della variabile i.
 
Ultima modifica:
Immagino succeda quando inserisci un nuovo libro dopo aver già fatto la prima serie di inserimenti. Infatti ricominci a ciclare sempre da 0 quando aggiungi un libro:
Immagino tu voglia quindi togliere l'inizializzazione della variabile i.
Si esatto, ora non "perdo" i libri.
Però ho notato un altro problema, l'opzione che dovrebbe trovare il libro più costoso in realtà si fermava senza finire il ciclo e stampava semplicemente il primo libro. Ho cercato di aggiustare così ma ancora non va:
C:
            case 3:
                max=v[0].prezzo;
                for(;j<L;j++)
                {
                    if(v[j].prezzo>max)
                    {
                        max=v[j].prezzo;
                    }
                }
                for(;h<L;++h)
                {
                    if(max==v[h].prezzo)
                    {
                        printf("%s %s %d %d\n", v[h].titolo,v[h].autore,v[h].prezzo,v[h].stato);
                    }
                }
            continue;
Ho pensato di cercare il prezzo maggiore e poi di usare quel valore per trovare il libro con quel prezzo ma niente... continua a stampare solo il primo libro.
Se metto il printf dopo il for non stampa nulla, se lo metto dentro stampa il primo libro.
Cosa devo cambiare?
 
Ultima modifica:
Ok ho risolto finalmente. Ora dovrei aver finito.
Ringrazio tutti quelli che mi hanno risposto, gentilissimi! ;D

Ecco come ho risolto.
C:
            case 3:
                max=v[j].prezzo;
                for(j=0;j<L;j++)
                {
                    if(v[j].prezzo>max)
                    {
                        max=v[j].prezzo;
                    }
                }
                for(h=0;h<L;++h)
                {
                    if(max==v[h].prezzo)
                    {
                        printf("%s %s %d %d\n", v[h].titolo,v[h].autore,v[h].prezzo,v[h].stato);
                    }
                }
                L=100;
            continue;
 
Ecco come ho risolto.
Immagino che l'intenzione di max=v[j].prezzo fosse quella di max=v[0].prezzo. Infatti dalla seconda volta che entri nel terzo caso dello switch la variabile j avrà il vecchio valore, ovvero 100. Quindi di fatto stai inizializzando max con un valore fuori dall'array che, se ti va bene, è 0, altrimenti potrebbe essere qualunque cosa (o meglio, dipende da cosa c'è dopo nello stack).
Ricorda comunque che se non è ancora presente nessun libro ci saranno problemi sia nella terza che seconda opzione del programma.

Inoltre, per tua fortuna, le variabili che hai dichiarato globali sono statiche e quindi inizializzate a 0 dal compilatore. Però fare programmi con sole variabili globali non è certamente il modo corretto di procedere. Ricordati sempre di inizializzare le variabili con valori ben definiti da te.

Benché, poi, ci siano solo 100 elementi e scorrere due volte l'array non sia particolarmente dispendioso, ti conviene salvare in max l'indice dell'array in cui hai trovato il libro con prezzo maggiore. In questo modo poi potrai solo stampare direttamente le informazioni che ti servono senza dover scorrere di nuovo tutto.

Infine, settare di nuovo L=100 è inutile.

P.S.
fflush(stdin) non è definito dallo standard, su Windows pulisce il buffer di input, su altri sistemi e quindi implementazioni non lo sai. Sarebbe meglio scorrere manualmente i caratteri rimasti e scartarli. Particolare la scelta di usare continue invece del classico break.
 
Ultima modifica:
Si è vero, sono stato frettoloso quando ho risposto. Comunque sono d'accordo su tutto, solo sulle variabili globali ho qualche dubbio. Ho cambiato il programma in modo che: prima avevo scritto un grosso main, ora ho diviso tutto in più file:
- function.c : c'ho messo tutte le function
- header.h : prototipi e struct "libro"
- main.c : le variabili (messe prima del main) e poi il main con il menu che fa da hub per le chiamate delle function.
Eppure nonostante abbia messo le variabili prima del main, quindi dovrebbero essere globali, il programma sembra non "aggiornare" i valori delle variabili, in caso di cambi o incrementi, passando da una function all'altra.
C:
#include "header.h"

    int L=100;
    int m;
    lib v[100];
    int t;
    char buffer[1];
    int i;
    int j;
    int codice;
    int cerca;
    int n;
    int h;
    int max;

int main()
{
while(t!=4){


        puts("\n----- BIBLIOTECA -----\n");
        puts("Specificare un'operazione\n");
        puts("1 - Aggiungi un nuovo libro");
        puts("2 - Ricerca per codice");
        puts("3 - Cerca libro piu' costoso");
        puts("4 - Esci dal programma\n");
        scanf("%d",&t);
        fflush(stdin);

        switch(t)
        {
            case 1:
                aggiunta_librif(i,L,m,v,buffer);
                continue;
            case 2:
                ricerca_codicef(v,n,L,cerca);
                continue;
            case 3:
                ricerca_prezzof(j,h,max,L,v);
                continue;
            case 4:
                return 0;
        }
    }    fflush(stdin);
}
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
    char    titolo[50];
    char    autore[25];
    int     prezzo;
    int     stato;
    int     codice;
}lib;

void aggiunta_librif(int i,int L, int m, lib v[], char buffer[]);
void ricerca_codicef(lib v[],int n, int L, int cerca);
void ricerca_prezzof(int j, int h, int max, int L, lib v[]);
C:
#include "header.h"

void aggiunta_librif(int i,int L, int m, lib v[], char buffer[])
{
                for(i;i<L;++i)
                {
                    puts("\nInserisci il titolo:\n");
                    gets(v[i].titolo);

                    puts("\nInserisci l'autore:\n");
                    gets(v[i].autore);

                    puts("\nInserisci il prezzo:\n");
                    scanf("%d",&v[i].prezzo);
                    fflush(stdin);

                    puts("\nDefinire se il libro e' disponibile o in presito (1/0):\n");
                    scanf("%d",&v[i].stato);
                    fflush(stdin);

                    ++m;
                    v[i].codice=m;
                    printf("\nIl codice del libro e': %d\n",v[i].codice);

                    puts("\nAggiungere un altro libro? (Y/N)\n");
                    scanf("%s",buffer);
                    fflush(stdin);
                    if((buffer[0]=='n')||(buffer[0]=='N'))
                    {
                        break;
                    }
                }
}

void ricerca_codicef(lib v[],int n, int L, int cerca)
{
                puts("\nInserisci il codice del libro da cercare:\n");
                scanf("%d", &cerca);
                fflush(stdin);
                for(n=1;n<L;n++)
                    {
                        if(cerca==v[n].codice)
                        {
                            printf("\nTitolo: %s\nAutore: %s\nPrezzo: %d\n", v[n].titolo,v[n].autore,v[n].prezzo);
                            break;
                        }
                    }
                if(cerca!=v[n].codice)
                {
                    puts("\nIl libro non e' in archivio\n");
                }
                if(v[n].stato==1)
                {
                    puts("\nIl libro e' disponibile\n");
                }
                else if(v[n].stato!=0)
                {
                    puts("\nIl libro non e' disponibile\n");
                }
}

void ricerca_prezzof(int j, int h, int max, int L, lib v[])
{
                max=v[0].prezzo;
                for(j=0;j<L;j++)
                {
                    if(v[j].prezzo>max)
                    {
                        max=v[j].prezzo;
                    }
                }
                for(h=0;h<L;++h)
                {
                    if(max==v[h].prezzo)
                    {
                        printf("\nTitolo: %s\nAutore: %s\nPrezzo: %d\n", v[h].titolo,v[h].autore,v[h].prezzo);
                        break;
                    }
                }
}
(Non ho ancora modificato la ricerca del più costoso, con i tuoi consigli, perché voglio prima risistemare l'inserimento dei libri, senza libri non posso fare test.)
 
Ultima modifica:
Ho tolto gli altri file, ho ricompattato come prima in un solo file main, prima mi ero complicato la vita da solo. Ma il problema delle variabili che non si aggiornano e dei libri che non restano vengono memorizzati resta. Non ce la faccio più co sto coso, sto provando qualsiasi cosa e una volta sembra andare e poi no.
Questa è l'ultima versione:
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct{
    char    titolo[50];
    char    autore[25];
    int     prezzo;
    int     stato;
    int     codice;
}lib;

    int L=100;
    int m;
    lib v[100];
    int t;
    char buffer[1];
    int i;
    int j;
    int codice;
    int cerca;
    int n;
    int h;
    int max;

void aggiunta_librif(int i,int L, int m, lib v[], char buffer[]);
void ricerca_codicef(lib v[],int n, int L, int cerca);
void ricerca_prezzof(int j, int h, int max, int L, lib v[]);

int main()
{
while(t!=4)
{


        puts("\n----- BIBLIOTECA -----\n");
        puts("Specificare un'operazione\n");
        puts("1 - Aggiungi un nuovo libro");
        puts("2 - Ricerca per codice");
        puts("3 - Cerca libro piu' costoso");
        puts("4 - Esci dal programma\n");
        scanf("%d",&t);
        fflush(stdin);

        switch(t)
        {
            case 1:
                aggiunta_librif(i,L,m,v,buffer);
                continue;
            case 2:
                ricerca_codicef(v,n,L,cerca);
                continue;
            case 3:
                ricerca_prezzof(j,h,max,L,v);
                continue;
            case 4:
                return 0;
        }
    }
}

void aggiunta_librif(int i,int L, int m, lib v[], char buffer[])
{
                for(;i<L;++i)
                {
                    puts("\nInserisci il titolo:\n");
                    gets(v[i].titolo);

                    puts("\nInserisci l'autore:\n");
                    gets(v[i].autore);

                    puts("\nInserisci il prezzo:\n");
                    scanf("%d",&v[i].prezzo);
                    fflush(stdin);

                    puts("\nDefinire se il libro e' disponibile o in presito (1/0):\n");
                    scanf("%d",&v[i].stato);
                    fflush(stdin);

                    ++m;
                    v[i].codice=m;
                    printf("\nIl codice del libro e': %d\n",v[i].codice);

                    puts("\nAggiungere un altro libro? (Y/N)\n");
                    scanf("%s",buffer);
                    fflush(stdin);
                    if((buffer[0]=='n')||(buffer[0]=='N'))
                    {
                        break;
                    }
                }
}

void ricerca_codicef(lib v[],int n, int L, int cerca)
{
                puts("\nInserisci il codice del libro da cercare:\n");
                scanf("%d", &cerca);
                fflush(stdin);
                for(n=1;n<L;n++)
                    {
                        if(cerca==v[n].codice)
                        {
                            printf("\nTitolo: %s\nAutore: %s\nPrezzo: %d\n", v[n].titolo,v[n].autore,v[n].prezzo);
                            break;
                        }
                    }
                if(cerca!=v[n].codice)
                {
                    puts("\nIl libro non e' in archivio\n");
                }
                if(v[n].stato==1)
                {
                    puts("\nIl libro e' disponibile\n");
                }
                else if(v[n].stato!=0)
                {
                    puts("\nIl libro non e' disponibile\n");
                }
}

void ricerca_prezzof(int j, int h, int max, int L, lib v[])
{
                max=v[0].prezzo;
                for(j=0;j<L;j++)
                {
                    if(v[j].prezzo>max)
                    {
                        max=v[j].prezzo;
                    }
                }
                for(h=0;h<L;++h)
                {
                    if(max==v[h].prezzo)
                    {
                        printf("\nTitolo: %s\nAutore: %s\nPrezzo: %d\n", v[h].titolo,v[h].autore,v[h].prezzo);
                        break;
                    }
                }
}
PS: ho pensato che il problema potesse essere come le procedure leggono le variabili, le ho cambiate in funzioni, ma è lo stesso. In teoria funziona senza procedure e function, usando solo il main, ma mi è stato detto di usarle. Se però non si può fare tolgo le function.
 
Stavolta, se vuoi migliorare tutto il codice, non possiamo tralasciare parecchie modifiche strutturali. Una revisione completa sarebbe molto lunga da scrivere quindi proverò a rimanere sui punti più cruciali.

Supponiamo di voler spostare tutte le variabili all'interno del main. A questo punto le uniche che ti servono sono:
C:
int main(void)
{
    lib v[L] = { 0 };
    int t = 0;

    /* switch, etc.. */
}
Mentre, per questioni di praticità, lascerei globale m e definirei L usando il preprocessore del C in modo da renderla una vera e propria costante e senza la necessità di portarcela dietro:
C:
#define L (100)
int m = 0;

I prototipi delle funzioni diventerebbero semplicemente:
C:
void aggiunta_librif(lib v[]);
void ricerca_codicef(lib v[]);
void ricerca_prezzof(lib v[]);

Al cui interno dichiari e inizializzi le variabili che ti servono man mano. E' anche inutile portarsi dietro tantissimi nomi diversi per indicizzare l'array, usa sempre quello o poco altro:
C:
void aggiunta_librif(lib v[])
{
    char buffer[1] = { 'n' };
    int i = 0;
    /* ... */
}

void ricerca_codicef(lib v[])
{
    int i = 0;
    int cerca = 0;
    /* ... */
}

void ricerca_prezzof(lib v[])
{
    int max = v[0].prezzo;
    int i = 0;
    int max_index = 0;
    /* ... */
}

Inoltre ricorda di fare i controlli di cui ti parlavo nell'inserimento e ricerca riguardo la mancanza di libri, ad esempio:
C:
if (m == 0) {
    puts("\nNon ci sono libri nell'archivio\n");
    return;
}

Tornando al main, nel quarto caso ritorni direttamente. Ti conviene lasciare niente (o un break se sei lungimirante, insieme anche a un caso default) e ritornare a fine del main. Altrimenti la condizione del while non ti serve proprio.

Se usi questi suggerimenti ricordati anche di inizializzare i a m quando inserisci i libri:
C:
for (i = m; i < L; ++i) {
    /* Insert... */
}
Di fatto potresti proprio eliminare i qui ma evito di confonderti ulteriormente.

Nota: l'uso di gets() è largamente deprecato e per ottime ragioni (buffer overflow). Se proprio vuoi utilizzare questa "famiglia" di funzioni allora la scelta deve ricadere su fgets():
C:
fgets(v[i].titolo, 50, stdin);

P.S.
Non so perché tu abbia aggiunto "f" ai nomi delle tue funzioni, però se l'idea viene da printf(), scanf() e simili allora sappi che in quel contesto la "f" sta per "formatted".
 
  • Mi piace
Reazioni: killaemo
GRAZIE!!! Mi dispiace averti fatto perdere tutto questo tempo appresso ai miei problemi ma almeno ha funzionato! Ora è perfetto!!! ;D
 
Stato
Discussione chiusa ad ulteriori risposte.