PROBLEMA Problema C++

davide1998

Nuovo Utente
82
0
Salve e tutti,
Per scuola sto realizzando un programma in C++ (una cosa semplice che tratta solo l'argomento delle funzioni e dei vettori). Il livello richiesto per aiutarmi è di base.
Gentilmente chiedo se c'è qualcuno che possa darmi una mano a capire dove ho sbagliato e correggere.
Vi posto il mio id skype così che possiate aggiungermi: benetton1998
Ho allegato il txt delle righe di codice.

Grazie per l'aiuto

Codice:
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

//DICHIARAZIONE STRUTTURA
struct libro 
       {
       string titolo;
       string autore;
       int anno_edizione;
       bool presente;
       };

//DICHIARAZIONE VARIABILI
int posizione = 0;
int i = 0;
bool trovato;
const int dim = 100;
libro libreria[dim];
int scelta = 0;
int contalibri = 0;

//FUNZIONI
       //INIZIALIZZAZIONE DI BOOL PRESENTE
       void inizializza(libro vettore[])
       {
            for (int i=0; i<dim; i++)
            { vettore[i].presente = false; }
       }
       
       // DISPLAY MENU
       int displaymenu(int &scelta)
       {
            cout << "Le azioni possibili sono: " << endl;
            cout << "1) Inserisci una scheda " << endl << "2) Eliminare una scheda " << endl << "3) Modificare una scheda " << endl << "4) Visualizzare libri inseriti " << endl << "5) Uscire dal programma " << endl;
            cout << "Inserisci il numero dell'azione da svolgere: "; cin >> scelta;       cout << endl;
            return scelta;
       }
       
       void errore()
       {
            cout << "Errore " << endl;
       }
       
       void inserimento(libro vettore[])
       {
            fflush(stdin);
            cout << "Inserisci il titolo del libro: "; getline(cin, vettore[i].titolo);
            cout << "Inserisci il nome dell'autore: "; getline(cin, vettore[i].autore);
            cout << "Inserisci l'anno di edizione: "; cin >> vettore[i].anno_edizione;
            vettore[i].presente = true;
       }
       
       int primalibera(libro vettore[])
       {
            int i = 0;
            while ((vettore[i].presente == true) && (i<dim)) 
            {i++;}
            return i;
       }
       
       bool cercalibro(libro vettore[])
       {
            trovato = false;
            string nomelibro; fflush(stdin);
            cout << "Inserisci il nome del libro da cercare: "; 
            getline (cin, nomelibro);
            cout << endl;
            for (int i=0; i<dim; i++)
            {
                 if (nomelibro == vettore[i].titolo && vettore[i].presente==true)
                    {
                     trovato = true;
                    }
            }
            return trovato;
       }
       
       void stampalibreria(libro vettore[])
       {
                cout << "I libri inseriti sono " << endl;
                for (int i=0; i<contalibri; i++)
                    {
                         if (libreria[i].presente == true)
                            {
                              cout << "Titolo: " << vettore[i].titolo << endl;
                              cout << "Autore: " << vettore[i].autore << endl;
                              cout << "Anno Edizione: " << vettore[i].anno_edizione << endl << endl;
                            }
                    }
       } 
       
       //INSERISCI SCHEDA
       void inserisci(libro vettore[])
       {
            primalibera(vettore);
            if (i == dim) 
               errore();
            else
            {
            fflush(stdin);
            inserimento(libreria);
            contalibri++;
            }
       }
       
       //ELIMINA SCHEDA
       void elimina(libro vettore[])
       {
            if (contalibri == 0)
               { errore(); }
            else
            {
            cercalibro(libreria);
            if (trovato == true)
            {                
            vettore[i].presente = false;
            cout << "Scheda eliminata. " << endl;
            contalibri--;
            }

            }
       }
       
       //MODIFICA SCHEDA
       void modifica(libro vettore[])
       {
            if (contalibri == 0)
               {  errore(); }
            else
            {
                cercalibro(libreria);
                if (trovato == true)
                {
                            inserimento(libreria);
                }
                else
                {  errore();  }
            }
       }
           
       //STAMPA SCHEDE
       void stampa(libro vettore[])
       {
            if (contalibri == 0)
                errore();
            else
                stampalibreria(libreria);
       }
       
       //ESCI DAL PROGRAMMA
       void esci()
       {
            cout << "Il programma viene terminato. " << endl;
            system ("pause");
       }
       
     
//MAIN       
int main ()
{
inizializza(libreria);

while (scelta!=5)
{
      displaymenu(scelta);
      switch (scelta)
      {
             case 1:      inserisci(libreria); break;
             case 2:      elimina(libreria); break;
             case 3:      modifica(libreria); break;
             case 4:      stampa(libreria); break;
             case 5:      esci(); break;
             default:     cout << "Numero non corrispondente. " << endl;
      }
      cout << endl;     
}
return 0;
}
 

Allegati

  • Libreria1.txt
    5 KB · Visualizzazioni: 87
Ultima modifica:

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Cosa non funziona?
 

davide1998

Nuovo Utente
82
0
Il programma serve per creare un vettore di strutture.
Esso consente di inserire, modificare, eliminare dei libri e di visualizzarli a video.

Non dà errori ma quando lo si fa girare presenta dei problemi.
Ad esempio se io inserisco due libri per es. A e B e chiedo di stamparli stampa solo B, oppure se dico di eliminare A non la elimina, ma elimina B
Non dà errori precisi, bisogna provarlo per capirlo.
 
Ultima modifica:

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Oltre ad essere scritto abbastanza male, GCC mi avverte che le funzioni modifica e stampa prendono un parametro che non viene però mai utilizzato. Sicuro che la logica sia corretta?
Codice:
 cercalibro(libreria);
                if (trovato == true)
è sinceramente inguardabile. Poi perché usare due variabili "i" una globale ed una locale?
fflush(stdin) ANSI C - Stack Overflow . Usa cin.ignore().
Quel programma potrebbe essere scritto molto meglio usando std::vector o std::list.
 

davide1998

Nuovo Utente
82
0
Sono consapevole che il programma fa schifo visto da un esperto, ma sono in seconda superiore e quindi non so granchè :D:D
Per le soluzioni std::vector o std::list non so cosa siano...
Poi non ho capito il perchè quella parte di codice sia "inguardabile".
Potreste farmi capire le parti dove ho sbagliato e perchè e postare la correzione?
Grazie infinite
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
SPoi non ho capito il perchè quella parte di codice sia "inguardabile".
Perché
Codice:
bool found = cercaLibro(...); // bool cercalibro(...){ ... }
if (found)
 // trovato
else
 // non trovato
è molto più leggibile ed intuitivo.
 

davide1998

Nuovo Utente
82
0
si ok, ma restano comunque i problemi.
Ad esempio prova a inserire due libri e stamparli.
Il programma te ne stampa solo 1.
L'errore che ho commesso si risolve così?


Codice:
       void elimina(libro vettore[])
       {
            if (contalibri == 0)
               { errore(); }
            else
            {
            bool found = cercalibro(libreria);
            if (found == true)
            {                
            vettore[i].presente = false;
            cout << "Scheda eliminata. " << endl;
            contalibri--;
            }
            if (found == false)
            errore();
            }
       }
 
Ultima modifica:

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10

davide1998

Nuovo Utente
82
0
Il parametro lo ho controllato.
Il problema resta lo stesso: la stampa, la modifica e l'eliminazione di libri quando ne inserisci più di uno.
Praticamente il se inserisco due libri e li stampo il compilatore mi stampa solo l'ultimo mentre il primo sparisce...

- - - Updated - - -

Ho cercato di correggerlo ma non sono riuscito.
Ti chiedo cortesemente se puoi allegarmi il txt del programma corretto, perché ho una certa urgenza.
Grazie infinite
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Forse non è chiaro, ma qui non svolgiamo compiti per casa o simili (o almeno io). Puoi pregarmi quanto vuoi, non sono un santo, però.
Posso consigliarti di debuggare attentamente il programma: sai dove l'algoritmo fallisce.
 

davide1998

Nuovo Utente
82
0
Ok ma se uno non riesce a comprendere l'errore e viene qui a chiedere si aspetta che qualcuno risponda con un minimo di soluzione.
Il problema del programma è che quando si inseriscono due libri non stampa, modifica o elimina il primo libro.
Gradirei avere una mano.
 

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili