Piccola biblioteca: caricamento, stampa e ricerca testi

di il
8 risposte

Piccola biblioteca: caricamento, stampa e ricerca testi

Come da titolo, questo programma dovrebbe permettere l'inserimento di informazioni su dei testi, fa uso di un vettore di struct chiamato biblioteca. Ci sono innanzitutto due problemi: il ciclo while non funziona nella funzione caricamento dati, nel senso che quando l'utente inserisce come titolo "finito" dovrebbe terminare, mentre continua; inoltre se come titolo inserisco degli spazi, il programma va in crash: qualcuno ha qualche suggerimento? Grazie

#include <iostream>

using namespace std;
const int max_libri=50;
//definisco la struct che contiene i dati riguardanti il libro
struct libro
{
    int collocazione;
    float costo;
    string autore;
    string titolo;
};
//definisco un vettore di max_libri elementi di tipo libro
libro biblioteca[max_libri];

void caricamento_dati(libro biblioteca[], int max_num)
{
    for(int i=0;i<max_num;i++)
    {
        cout<<"Titolo libro: ";
        cin>>biblioteca[i].titolo;
        cout<<"Collocazione(ovvero il numero di libro inserito): ";
        cin>>biblioteca[i].collocazione;
        cout<<"Autore libro: ";
        cin>>biblioteca[i].autore;
        cout<<"Costo libro: ";
        cin>>biblioteca[i].costo;
    }

};

void stampa_dati(libro biblioteca[], int max_num)
{
    int i=0;
    while(biblioteca[i].titolo!="finito")
    {
        cout<<"Libro "<<i+1 <<" : ";
        cout<<endl;
        cout<<"Titolo: ";
        cout<<biblioteca[i].titolo;
        cout<<endl;
        cout<<"Autore: ";
        cout<<biblioteca[i].autore;
        cout<<endl;
        cout<<"Costo: ";
        cout<<biblioteca[i].costo;
        cout<<endl;
        cout<<endl;
        i=i+1;
    };

};

void titolo_autore_collocazione(libro biblioteca[], int max_num, string cercato)
{
    for(int i=0; i<max_num; i++)
    {
        if(biblioteca[i].titolo==cercato)
        {
            cout<<"\n\n L'autore di "<<cercato<<" e': "<<biblioteca[i].autore<<endl;
            cout<<"La sua collocazione e': "<<biblioteca[i].collocazione<<endl;
        }
    }
};

int main()
{
    cout<<"Questo programma ti consente di inserire una lista di libri a tuo piacimento, per un massimo di 50 testi."<<"\n"
    <<"Inserisci la parola finito come titolo quando hai terminato l'inserimento dei libri"
    <<endl;
    //caricamento informazioni sui libri
    caricamento_dati(biblioteca, max_libri);

    //stampa libri inseriti
    cout<<"Hai inserito i seguenti libri: ";
    stampa_dati(biblioteca, max_libri);

    //DAL TITOLO ALLA COLLOCAZIONE E AUTORE
    string cercato=" ";
    cout<<"Vuoi sapere l'autore di un certo testo e la sua collocazione nella biblioteca?";
    cout<<"\nInserisci titolo da cercare: "<<endl;
    cin>>cercato;
    titolo_autore_collocazione(biblioteca, max_libri, cercato);
}

8 Risposte

  • Re: Piccola biblioteca: caricamento, stampa e ricerca testi

    quando l'utente inserisce come titolo "finito" dovrebbe terminare
    E il while che ne sa che deve fermarsi quando viene inserito "finito"? ... mi sa che ti manca una if!
  • Re: Piccola biblioteca: caricamento, stampa e ricerca testi

    Questa while

    while(biblioteca.titolo!="finito")

    fa il controllo solo dopo tutti gli input non immediatamente dopo l'input del titolo.
  • Re: Piccola biblioteca: caricamento, stampa e ricerca testi

    E come andrebbe modificato il ciclo while per far sì che la prima volta che come titolo viene inserito "finito" termini?

    Ok ho rivisto un programmino simile: basta dichiarare una variabile stringa per far decidere all'utente se continuare a inserire libri e usare questa come condizione del ciclo, rimane però il problema del crash quando si inseriscono spazi nel titolo

    aggiornamento:

    non va nemmeno come detto sopra, che c'è che non va in questo codice:
    
    void caricamento_dati(libro biblioteca[], int max_num)
    {
        int i=0;
        char risposta=" ";
        while(risposta!="n")
        {
            cout<<"Titolo libro: ";
            cin>>biblioteca[i].titolo;
            cout<<"Collocazione(ovvero il numero di libro inserito): ";
            cin>>biblioteca[i].collocazione;
            cout<<"Autore libro: ";
            cin>>biblioteca[i].autore;
            cout<<"Costo libro: ";
            cin>>biblioteca[i].costo;
            cout<<"Vuoi inserire un altro libro?s/n?";
            cin>>risposta;
        }
    };
    
  • Re: Piccola biblioteca: caricamento, stampa e ricerca testi

        char risposta=" ";
        while(risposta!="n")
    
    Il problema è che una costante carattere la devi definire con apici singoli, non doppi.
  • Re: Piccola biblioteca: caricamento, stampa e ricerca testi

    candaluar ha scritto:


        char risposta=" ";
        while(risposta!="n")
    
    Il problema è che una costante carattere la devi definire con apici singoli, non doppi.
    Grazie mille, ora è ok, l'unico problema è che mettendo un titolo in cui vi è uno spazio va in crash, qualcuno sa dirmi il perché?
  • Re: Piccola biblioteca: caricamento, stampa e ricerca testi

    Per risolvere il problema devi prima individuare il punto del programma che va in crash; puoi utilizzare un debugger oppure puoi mettere delle scritture su cout che ti indicano i vari punti raggiunti dal programma.
  • Re: Piccola biblioteca: caricamento, stampa e ricerca testi

    Sto usando COde Blocks, vedo di imparare a fare il debug con questo IDE, grazie
  • Re: Piccola biblioteca: caricamento, stampa e ricerca testi

    Il problema è che l'istruzione cin>> si ferma al primo spazio inserito, per prendere anche spazi nelle stringhe occorre usare la funzione getline, con la seguente sintassi:

    getline(cin, nome_variabile_tipo_stringa)
Devi accedere o registrarti per scrivere nel forum
8 risposte