Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C++]Ricavare posizione di un oggetto, ordinandolo secondo un parametro

    Salve a tutti, il titolo non è molto esplicativo del problema in questione, ma non mi veniva in mente niente di meglio per esprimere il concetto.
    Sto programmando in C++, in particolare (ma non è importante ai fini della soluzione) utilizzando le librerie Qt.
    Il mio programma esegue delle simulazioni di corse di auto, vengono creati n oggetti "Car", viene spezzettato il circuito in vari "tratti" elementari (curva, o rettilineo) e viene calcolato in un for il tempo di percorrenza di ogni tratto, per ogni oggetto Car, per n giri. Alla fine della simulazione devo inserire tutti i dati creati in una tabella di sqlite.
    Inserisco per maggiore comprensione il pezzo in cui si esegue il loop.
    (macchine è un vettore di oggetti car. Pensate ad un oggetto Car come un qualcosa che riceve in input delle informazioni sulla strada e da in output il tempo di percorrenza minimo imposto dai propri limiti fisici/costruttivi)
    codice:
    for(int lap=0;lap<=ngiri;lap++){
    for(int plt=0;plt<macchine.size();plt++){
    tmpGiro=QTime(0,0,0,0);
    for(int tr=0;tr<nTratti;tr++){
    if(tr==(nTratti-1))
    tmpTratto= macchine[plt].getTempo(autodromo.mappaCircuito.at(tr), autodromo.mappaCircuito.at(0),lap,m);
    else
    tmpTratto= macchine[plt].getTempo(autodromo.mappaCircuito.at(tr), autodromo.mappaCircuito.at(tr+1),lap,m); 
    tmpGiro=tmpGiro.addMSecs(qAbs(tmpTratto.msecsTo(QTime(0,0,0,0)))); }
    if(lap==0)
    mappatempi[macchine[plt].get_nomePilota()]=tmpGiro;
    if(lap>=1)
    mappatempi[macchine[plt].get_nomePilota()] =mappatempi[macchine[plt].get_nomePilota()].addMSecs(qAbs(tmpGiro.msecsTo(QTime(0,0,0,0)))); 
    
    s.append("SELECT " ""+QString::number(lap)+", " ""+QString::number(posizione)+", " "'"+macchine[(plt)].get_nomePilota()+"', "
     "'"+tmpGiro.toString("hh:mm:ss.zzz")+"', " "'"+mappatempi[macchine[plt].get_nomePilota()].toString("hh:mm:ss.zzz")+"', " ""+QString::number(deltat)+", " ""+QString::number(pit)+", " ""+QString::number(macchine[plt].getIncidente())+" " );
     if(plt!=(macchine.size()-1))
    s.append(" UNION ALL /"); 
    }
    if(lap!=(ngiri))
    s.append(" UNION ALL /");
     }
    query.exec(s)
    (scusate ma non capisco come formattare il codice)
    in questa tabella sostanzialmente devo scrivere:
    giro|posizione|pilota|tempo giro|tempo_totale|delta tempo rispetto a chi sta davanti| ->altri parametri.

    Calcolo il tempo di giro, sommando semplicemente tutti i tempi di ogni tratto che compone l'intera pista, poi per tener conto del tempo totale invece, avevo pensato di salvare tutto in una mappa, che è quella che vedete: mappatempi<QString, QTime>, che contiene come chiavi i nomi dei piloti (nomi unici, creati con un algoritmo), ed il loro tempo di percorrenza, al quale ogni fine giro aggiungo il tempo di giro.

    Veniamo finalmente al problema che non riesco a risolvere:
    non riesco a figurarmi un modo per trovare la posizione del pilota, intesa in modo che il pilota con il minor tempo totale è il 1°, e quello con il tempo totale più lungo è l'ultimo.
    Per il momento l'unica cosa che mi viene in mente è mettere a tutti quanti una posizione non valida (per esempio 0), e poi a fine simulazione fare una query di update, lo stesso dicasi per quanto riguarda la differenza di tempo con la macchina antecedente.
    Ma d'altro canto mi sento sicuro di avere a disposizione tutti i dati sufficienti per fare questi calcoli.
    Qualcuno ha qualche suggerimento in merito?

  2. #2
    Salve a tutti, anche non avendo ricevuto alcuna risposta volevo far partecipe il forum della soluzione che ho trovato: creare una classe container personalizzata, basata su una lista di pair (stringa, tempo) che però implementa tutto esattamente come una mappa: ovvero mantenendo tutte le stringhe uniche.
    Facendo in questo modo ho implementato vari metodi per accedere/ modificare tutti i valori, più altri metodi comodi come deltaTime(const QString fromKey, const QString toKey) che mi da in output la differenza di tempo fra due elementi, cercandoli per chiave, oppure (ovviamente) le due funzioni di sort che a mia scelta ordinano la lista per stringa o per tempo.

    Posto il codice, nel caso qualcosa di simile dovesse servire a qualche altro utente.
    Inserisco solo l'header per far capire come ho impostato il tutto, i metodi sono poi di facile implementazione, una volta avutaml'idea ho scritto tutto in un quarto d'ora circa.

    PairTimeList.h
    codice:
    #ifndef PAIRTIMELIST_H
    #define PAIRTIMELIST_H
    #include <QList>
    #include <QString>
    #include <QStringList>
    #include <QTime>
    #include <QPair>
    
    class PairTimeList
    {
    public:
        PairTimeList();
        PairTimeList( QList< QPair<QString, QTime> > list);
    
        bool contains(const QString key) const;
        bool contains(const QPair<QString, QTime> pair) const;
        bool insert(const QString str, const QTime t);
        bool insert(const QPair<QString, QTime> pair);
        bool erase(const QString key);
        bool erase(const QPair<QString, QTime> pair);
        bool erase(int position);
        void clear();
        void removeFirst();
        void removeLast();
        bool replace(int position, const QPair<QString, QTime> newpair);
        bool replace(const QString key, const QTime newTime);
        int position(const QString key) const; //torna -1se la stringa non è presente
        QPair<QString, QTime> data(int position) const;
        const QPair<QString, QTime> at(int position) const;
        QTime time(const QString key) const;  //torna il tempo associato a quella stringa
        QList<QTime> times() const;
        QStringList keys();
        QStringList keys(const QTime value);  //torna tutte le stringe associate a un tempo =value
        QStringList keysBetween(const QTime fromTime, const QTime toTime);
        const QList< QPair<QString, QTime> > sort_byTime() ;        //BubbleSort
        const QList< QPair<QString, QTime> > sort_byStrings();      //BubbleSort
        const QList< QPair<QString, QTime> > getList() const ;
        QString print();
        int size() const;
        void setTime(int position, QTime t);
        void setTime(int position, int h, int min, int sec=0, int msec=0);
        void setTime(const QString key, QTime t);
        void setTime(const QString key, int h, int min, int sec=0, int msec=0);
        void addSec(int position, int sectoAdd);
        void addSec(const QString key, int sectoAdd);
        void addMsec(int position, int msecToAdd);
        void addMsec(const QString key, int msecToAdd);
        QTime deltaTime(int from1, int to2);
        QTime deltaTime(const QString fromKey, const QString toKey);
        int msecBetween(int position1, int position2);
        int msecBetween(const QString key1, QString key2);
        int secBetween(int position1, int position2);
        int secBetween(const QString key1, QString key2);
    private:
       QList< QPair<QString, QTime> > mylist;
    };
    
    #endif // PAIRTIMELIST_H
    Have fun!
    Ps: non posso attuare modifiche. Vorrei chiedre ai moderatori di modificare il titolo di questo post con qualcosa di più appropriato, e soprattutto semanticamente più corretto come
    "Metodi per ordinare coppie di valori" (o simili)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.