Esercitazioni di Informatica e Sistemi

La classe Vector.

Gestione di una biblioteca.

Creare una cartella e salvare un nuovo progetto: Biblioteca.dev.

Aggiungere un nuovo file al progetto:
libro.h

#ifndef LIBROH
#define LIBROH

    #include <iostream>
    #include <string>

    using namespace std;

    class libro {
    protected:  // proprietà del libro
      string inventario; // numero univoco per distinguere copie multiple dello stesso volume
      string argomento; // proprietà del libro
      string titolo;
      string autore;
      double prezzo; // serve per eventuale addebito all'utente che non restituisce
      long IDUtente; // utente che ha prelevato il libro
      bool inPrestito;
    public: // operazioni sui dati della classe
      libro() {
        inPrestito = false;
        IDUtente = -1;
      }
      friend ostream& operator<<(ostream&, const libro&);
      bool insLibro();
      string getInv() const {
        return inventario;
      }
      string getArgomento() const {
        return argomento;
      }
      bool prestato();
      bool restituito();
    };
#endif

Aggiungere un nuovo file al progetto:
libro.cpp

#include <iostream>
#include "libro.h"

using namespace std;

// l'operatore di scorrimento, applicato alla classe Libro viene ridefinito per stampare tutti i campi del libro.
  ostream& operator << (ostream& mostraLibro, const libro& volume) {
    mostraLibro << volume.inventario << ": " << volume.argomento << " - "
                << volume.autore << " - " << volume.titolo << " - " 
                << volume.prezzo << endl;
    if(volume.inPrestito)
      cout << "Libro in prestito" << endl;
    return mostraLibro;
  };
  bool libro::insLibro() {
    bool esito = true;
    cout << "Nuovo libro:" << endl;
    cout << "Numero di Inventario: ";
    getline(cin, inventario);
    if(inventario.empty()) // inventario è una stringa, possiede il metodo isEmpty()
      esito = false;
    else{
      cout << "Classificazione: ";
      getline(cin, argomento); // getline legge caratteri da cin e li memorizza in un oggetto string.
      cout << "Autore: ";
      getline(cin, autore);
      cout << "Titolo: ";
      getline(cin, titolo);
      cout << "prezzo: ";
      cin >> prezzo;
      cin.ignore();
    };
    return esito;
  };
  bool libro::prestato() {
    bool fatto=false;
    if (!inPrestito) {
      inPrestito = true;
      fatto = true;
    }
    return fatto;
  }
  bool libro::restituito() {
    bool fatto = false;
    if (inPrestito) {
      inPrestito = false;
      fatto = true;
    }
    return fatto;
  }

Nel file main.cpp scrivere le istruzioni per usare la classe:

#include <iostream.h>
#include "libro.h"

using namespace std;

int main() {
    libro volume;
    volume.insLibro();
    cout << volume;
    return 0;
}

Compilare ed eseguire il programma per verificarne la funzionalità

Nei passi successivi si utilizzerà un vettore di oggetti di classe libro per simulare le operazioni di inserimento e ricerca di libri


Utilizzo della classe Libro: vettori di oggetti

Vector

La classe template Vector rappresenta un array che può cambiare in dimensione.

Gli elementi di un'istanza della classe template Vector vengono memorizzati in locazioni di memoria contigue, come in un array, ma mentre la dimensione di un array viene fissata al momento della dichiarazione e non può più essere modificata, la dimensione di un'istanza di Vector può venire modificata dinamicamente, in fase di esecuzione.

Se il numero di elementi aumenta, il ridimensionamento di un Vector potrebbe richiedere operazioni di copia degli elementi in un'altra area di memoria, per fare spazio ai nuovi elementi inseriti.

I Vector operano con efficienza se le operazioni di inserimento ed estrazione avvengono alla fine del vettore. Se queste operazioni sono richieste su elementi centrali conviene ricorrere alle Liste.

Il seguente programma dispone i libri in un vettore, presenta un menù per gestire alcune operazioni sui libri:

Aggiungere un nuovo file al progetto:
libreria.h

#ifndef LIBRERIAH
#define LIBRERIAH
#include <string>
#include <vector>

#include "libro.h"

using namespace std;

class libreria{
  protected:
    vector<libro> catalogo;
    vector<libro>::iterator it;
  public:
    libreria() {
        it = catalogo.end();
    }
    bool cercaLib(string);
    libro getLibro() const {
        return *it;
    }
    bool aggiorna(libro);
    bool vuoto() const {
        return !catalogo.empty();
    }
    void primo() {
        it=catalogo.begin();
    }
    bool prossimo() const {
        return (it<catalogo.end());
    }
    libreria cercaArg(string) const;
    void insLibri();
    void mostraLibri();
    void visInvLibro();
    void cercaPerArg();
    void Prestito();
    void Restituzione();
  private:
    bool aggiungiLibro(libro);
    libro prossimoLibro();
  };
#endif

Aggiungere un nuovo file al progetto:
libreria.cpp

#include <iostream>
#include "libreria.h"
void libreria::insLibri() {
  libro tmp;
  cout << endl << "Inserimento libri (Inventario vuoto per finire)" << endl;
  while(tmp.insLibro()){
    if(!aggiungiLibro(tmp))
      cout << "Num. Inv. duplicato ripetere" << endl;
  }
}
void libreria::mostraLibri() {
  if(vuoto()){
    primo();
    while(prossimo())
      cout << prossimoLibro();
  } else
    cout << "Non ci sono libri" << endl;
}
  // cerca il libro associato a un inventario
  bool libreria::cercaLib(string invLib) {
    bool trovato = false;
    for(it = catalogo.begin(); it != catalogo.end(); it++)
      if(it->getInv() == invLib){
        trovato = true;
        break;
      }
    return trovato;
  }
  // aggiunge un libro alla libreria
  bool libreria::aggiungiLibro (libro volume) {
    bool aggiunto=true;
    if(cercaLib(volume.getInv()))
      aggiunto = false;
    else
      catalogo.push_back(volume);
    return aggiunto;
  }
  // aggiorna i dati del libro attuale
  bool libreria::aggiorna(libro volume) {
    bool aggOK = true;
    if(it!=catalogo.end())
      *it = volume;
    else
      aggOK = false;
    return aggOK;
  }
  // passa al prossimo libro
  libro libreria::prossimoLibro() {
    vector<libro>::iterator itTmp;
    itTmp = it++; // prima assegna e poi incrementa
    return *itTmp;
  }
void libreria::visInvLibro() {
  string inv;
  cout << "Ricerca libro per inventario" << endl;
  cout << "inventario (vuoto per finire) ";
  getline(cin, inv);
  while(!inv.empty()){	/*1*/
    if(cercaLib(inv))	/*2*/
      cout << getLibro();	/*3*/
    else
      cout << "Inventario inesistente" << endl;
    cout << "Inventario (vuoto per finire): ";
    getline(cin, inv);
  }
}
void libreria::cercaPerArg() {
  libreria elencoArg;
  string argRicerca;
  cout << "Argomento di ricerca: ";
  getline(cin, argRicerca);
  elencoArg = cercaArg(argRicerca);
  elencoArg.mostraLibri();
}
  libreria libreria::cercaArg(string materia) const {
    libreria biblio;
    vector<libro>::const_iterator its;
    for(its=catalogo.begin();its!=catalogo.end();its++)
      if(its->getArgomento()==materia)
        biblio.aggiungiLibro(*its);
    return biblio;
  }
void libreria::Prestito() {
  string inv;
  libro lib;
  cout << "Inventario libro per prestito ";
  getline(cin, inv);
  if(!cercaLib(inv))
    cout << "inventario inesistente" << endl;
  else {
    lib = getLibro();
    cout << lib;
    if(lib.prestato()){
      cout << "Operazione effettuata" << endl;
      aggiorna(lib);
    }
    else
      cout << "Operazione non possibile" << endl;
  }
}
void libreria::Restituzione() {
  string inv;
  libro lib;
  cout << "Codice libro per restituzione ";
  getline(cin, inv);
  if(!cercaLib(inv))	/*1*/
    cout << "Codice inesistente" << endl;
  else {
    lib = getLibro();
    cout << lib;
    if(lib.restituito()){
      cout << "Operazione effettuata" << endl;
      aggiorna(lib);
    }
    else
      cout << "Operazione non possibile" << endl;
  }
}

Sostituire il file
main.cpp:

#include <iostream>
#include "libro.h"
#include "libreria.h"

using namespace std;

int main() {
  libreria biblio;
  int scelta;

  do {
    cout << "Gestione Biblioteca" << endl;
    cout << "1 - Inserimento Libri" << endl;
    cout << "2 - Visualizza Libri" << endl;
    cout << "3 - Cerca Libro per Inventario" << endl;
    cout << "4 - Seleziona per Argomento" << endl;
    cout << "5 - Prestito" << endl;
    cout << "6 - Restituzione" << endl;
    cout << "0 - Fine" << endl;
    cout << "Operazione? ";
    cin >> scelta;
    cin.ignore();
    switch(scelta){
      case 0:
        break;
      case 1:
        biblio.insLibri();
        break;
      case 2:
        cout << endl << "Consultazione Libri:" << endl;
        biblio.mostraLibri();
        break;
      case 3:
        biblio.visInvLibro();
        break;
      case 4:
        biblio.cercaPerArg();
        break;
      case 5:
        biblio.Prestito();
        break;
      case 6:
        biblio.Restituzione();
        break;
      default:
        cout << "Scelta non ammessa" << endl;
    }
  } while (scelta);
  return 0;
}