Passa al tema normale
Discussioni su argomenti di Informatica

Regole del forum

Consulta il nostro regolamento e la guida per scrivere le formule
Rispondi al messaggio

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

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.
Rispondi al messaggio


Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000— Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.