Re: [C++] Programma C++ con classi non funziona bene.

Messaggioda Daniele_97 » 22/01/2019, 23:45

vict85 ha scritto:Due considerazioni aggiuntive:
  1. Gran parte dei dati che memorizzi e che calcoli non li usi per calcolare la reputazione finale degli utenti. Per capirci, questo codice è equivalente al tuo:
    Codice:
    #include <array>
    #include <iostream>
    #include <fstream>

    #include <cstdlib>

    class Utente
    {
    public:
       constexpr Utente() noexcept : m_reputazione{ 0.5f } {};

       constexpr float reputazione() const { return m_reputazione; }

       constexpr void aggiorna_repuntazione(float recensione, float reputazione_compratore) noexcept
       {
          const float factor = (reputazione_compratore < 0.5f)
             ? reputazione_compratore * reputazione_compratore * reputazione_compratore
             : reputazione_compratore * reputazione_compratore;
          m_reputazione = m_reputazione * (1 - factor) + factor * recensione;
       }

       constexpr bool imbroglia() noexcept { return m_reputazione < 0.5f; }

    private:
       float m_reputazione;
    };

    int main()
    {
       constexpr unsigned int NUMERO_UTENTI = 100;
       std::array< Utente, NUMERO_UTENTI > utenti;

       std::ifstream ifile("transaction1.dat", std::ios::in);
       if (!ifile) {
          std::cerr << "File transaction1.dat could not be opened" << std::endl;
          exit(EXIT_FAILURE);
       }

       for (;;)
       {
          int mittente = 0, destinatario = 0;
          float voto = 0.0f;
          {
             float valore_da_ignorare = 0.0f;
             ifile >> mittente >> destinatario >> valore_da_ignorare >> voto;
          }
          if (!ifile)
          {
             ifile.close();
             break;
          }
          if ( mittente == destinatario
             || mittente < 0 || mittente >= NUMERO_UTENTI
             || destinatario < 0 || destinatario >= NUMERO_UTENTI
             || voto < 0.0f || voto > 1.0f )
          {
             std::cerr << "Transazione invalida: "
                << mittente << " -> " << destinatario
                << " feed=" << voto << std::endl;
             ifile.close();
             exit(EXIT_FAILURE);
          }
          Utente& utente_mittente = utenti[mittente];
          Utente& utente_destinatario = utenti[destinatario];
          utente_destinatario.aggiorna_repuntazione(voto, utente_mittente.reputazione());
       }

       for (int i = 0; i != utenti.size( ); ++i)
       {
          if (utenti[i].imbroglia())
          {
             std::cout << i << std::endl;
          }
       }
    }

  2. Al fine di avere un risultato attendibile, ogni utente deve essere il destinatario di un numero sufficiente di transazioni. Di fatto stai usando un numero piuttosto basso di transazioni.

Grazie ancora, ho fatto tante prove con 10000 transazioni, 9000, 8000 ecc...e ho visto come variava il numero di imbroglioni trovati in funzione del numero di transazioni. Ho riportato questi dati su un grafico e su una tabella perché il prof. mi ha dato da fare una relazione su questo lavoro. Ci sono dati che memorizzo ma non uso perché il professore che mi ha assegnato questo lavoro mi ha dato da calcolare la reliability e il trust, però io ho scelto di non utilizzarli per trovare gli imbroglioni perché variano da utente a utente ed è più facile utilizzare solo la reputation.
Daniele_97
Junior Member
Junior Member
 
Messaggio: 37 di 102
Iscritto il: 10/12/2016, 19:38

Precedente

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite