Stampare totale oggetti item con attributo in una lista

di il
6 risposte

Stampare totale oggetti item con attributo in una lista

Ho una lista contenente item nel formato <anno , tempo , nome , luogo> e devo scrivere un codice che per ciascun <luogo> presente nella lista (senza ripetizioni) stampi il numero totale di atleti che hanno quel <luogo> come attributo.

per esempio avendo L1 < (2009,9.58,Usain Bolt,Berlin) (2012,9.63,Usain Bolt,London) (2008,9.69,Usain Bolt,Beijing) (2007,9.74,Asafa
Powell,Rieti) (2014,9.56,Usain Bolt,London)| >

dovrei ottenere
London 2 -
Beijing 1
Berlin 1
Rieti 1

mentre io ottengo , con il codice che riporto qui sotto , < | ( London , 5 ) , ( Rieti , 4) , (Beijing , 3 ) , ( London , 2 ) , (Berlin , 1 ) >


la mia idea era quella di:
1) scorrere la lista L1 ( fatta di Item nel formato ANNO,TEMPO,NOME,LUOGO )
2) estrarre a mano a mano 2 item
3) se i due item estratti hanno campo 'luogo' uguale allora incremento un contatore
diversamente passo all'elemento di confronto successivo
4) memorizzo il luogo e contatore e li inserisco in l2 come elementi del tipo della classe conteggio , che riporto qui sotto



Item it1;
	Item it2;
	conteggio i;
	int conta = 0;
	LList<conteggio> L2;
	string luogo;


	for (L1.moveToStart(); L1.currPos() < L1.length(); L1.next()) {
		it1 = L1.getValue();
		it2 = L1.getValue();
		

		if (it1.getluogo() == it2.getluogo())  // Found 
		{

			conta++;
			luogo = it1.getluogo();

		}
		else L1.next();
	

			// in it inserisco conta e luogo
			conteggio i(luogo , conta);
		
	        L2.insert(i);


}

	cout << endl;
	cout << " LISTA L2: " << endl;

	lprint(L2);



la classe Item funziona senza problemi , qui sotto riporto la classe conteggio che ho creato successivamente. ho pensato di inserire in una seconda lista l2 elementi del tipo ( luogo , totale ) così ho creato questa classe :




class conteggio {
private:
    string luogo;
    int totale;
public:
    conteggio() { }
    conteggio(string l, int t) { totale = t   ; luogo = l; }

    int gettotale() const { return totale; }
    string getluogo() const { return luogo; }
};


6 Risposte

  • Re: Stampare totale oggetti item con attributo in una lista

    Da un'occhiata veloce non mi sembra che tu abbia fornito tutti gli elementi per poterti dare una risposta precisa, in ogni caso voglio ribadire un concetto già espresso stamattina in un altro topic:
    ... non sarebbe meglio "tradurre" la questione in un esempio breve, semplice ed esemplificativo?! Per poi, una volta chiariti i propri dubbi, aggiornare in modo autonomo il codice da cui il problema era nato?!
    Detto ciò quello che farei è:
    1) scorrere la lista L1 (fatta di item nel formato ANNO,TEMPO,NOME,LUOGO);
    2) estrarre il LUOGO e cercare se esso è presente in una seconda lista L2 (fatta di item nel formato LUOGO,TOTALE);
    3) se non si trovano corrispondenze creare un nuovo nodo in L2 ed inizializzare il TOTALE ad 1;
    4) se invece si trova una corrispondenza incrementare il relativo campo TOTALE di 1;
    5) per ottimizzare la ricerca sarebbe utile impostare L2 come una lista ordinata (alfabeticamente) rispetto al campo LUOGO.
  • Re: Stampare totale oggetti item con attributo in una lista

    Nippolo ha scritto:


    Da un'occhiata veloce non mi sembra che tu abbia fornito tutti gli elementi per poterti dare una risposta precisa
    Ho notato anch'io questa tendenza al non fornire i dettagli. Non capiscono che è la cosa più importante di tutte la precisione e la pignoleria...
  • Re: Stampare totale oggetti item con attributo in una lista

    Dopo varie modifiche ottengo l'elenco corretto ma con le ripetizioni. il contatore segna sempre 1 , anche se ( contando le ripetizioni ) la somma sarebbe giusta.

    dovrei per esempio ottenere :
    Berlin 1
    London 2
    Beijing 1
    Rieti 1
    Doha 2
    Athens 3
    Eugene 1
    Atlanta 1

    mentre ottengo:
    Berlin 1
    London 1
    Beijing 1
    Rieti 1
    Doha 1
    Doha 1
    Athens 1
    London 1
    Athens 1
    Eugene 1
    Athens 1
    Atlanta 1


    non riesco a capire dove sbaglio adesso

    
    Item it1;
    	conteggio it2;
    	conteggio i;
    	conteggio l;
    	int conta = 0;
    	LList<conteggio> L2; 
    	string luogo;
    
    
    	
    	for (L1.moveToStart(), L2.moveToStart(); L1.currPos() < L1.length() && L2.currPos() < L2.length(); L1.next(), L2.next()) {
    		it1 = L1.getValue();
    		it2 = L2.getValue();
    
    			if (it1.getluogo() == it2.getluogo())   
    			{
    				luogo = it1.getluogo();
    				conta = conta + 1 ;
    				
    			}
    			else {
    				luogo = it1.getluogo();
    				conta = 1  ;
    				
    				
    				
    			}
    
                                    conteggio i(luogo, conta);
    				L2.insert(i);
    
    
    		}
    	
    for (; L1.currPos() < L1.length(); L1.next()) {
    		it1 = L1.getValue();
    		luogo = it1.getluogo();
    		if (it1.getluogo() == it2.getluogo())
    		{
    			conta = conta + 1;
    		
    		}
    		else { conta = 1; }
    		conteggio i(luogo, conta);
    		L2.append(i);
    	}
    
    
  • Re: Stampare totale oggetti item con attributo in una lista

    A costo di essere ripetitivo, ma ci vuole tanto a mettere momentaneamente da parte il programma a cui si sta lavorando e trasferire il problema in un codice più semplice e conciso (e che compila) in modo da invogliare e da aiutare gli altri ad aiutarvi?!

    Con il seguente codice spero di chiarire cosa intendo con quanto appena detto, oltre ovviamente ad illustrare l'algoritmo che avevo descritto nel precedente post:
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    struct nodo
    {
        string luogo;
        unsigned int cont;
        nodo *next;
    };
    
    void aggiungi_in_testa(nodo **p, const string &LUOGO)
    {
        nodo *nuovo = new nodo;
        nuovo->luogo = LUOGO;
        nuovo->cont = 1;
        nuovo->next = *p;
        *p = nuovo;
    }
    
    void stampa_lista(nodo *p)
    {
        while(p)
        {
            cout << p->luogo << " " << p->cont << endl;
            p = p->next;
        }
        cout << endl;
    }
    
    int main()
    {
        nodo *L1 = nullptr;
        nodo *L2 = nullptr;
    
        aggiungi_in_testa(&L1, "Atlanta");
        aggiungi_in_testa(&L1, "Athens");
        aggiungi_in_testa(&L1, "Eugene");
        aggiungi_in_testa(&L1, "Athens");
        aggiungi_in_testa(&L1, "London");
        aggiungi_in_testa(&L1, "Athens");
        aggiungi_in_testa(&L1, "Doha");
        aggiungi_in_testa(&L1, "Doha");
        aggiungi_in_testa(&L1, "Rieti");
        aggiungi_in_testa(&L1, "Beijing");
        aggiungi_in_testa(&L1, "London");
        aggiungi_in_testa(&L1, "Berlin");
    
        for(nodo *p1 = L1, **p2; p1; p1 = p1->next)
        {
            int comp;
            for(p2 = &L2; *p2 && (comp = (*p2)->luogo.compare(p1->luogo)) < 0; p2 = &(*p2)->next);
            if(*p2 && !comp)
            {
                ++(*p2)->cont;
            }
            else
            {
                aggiungi_in_testa(p2, p1->luogo);
            }
        }
    
        stampa_lista(L1);
        stampa_lista(L2);
    }
  • Re: Stampare totale oggetti item con attributo in una lista

    Sicuramente per chi legge il post , o il codice che ho scritto , non è facile aiutarmi , questo non lo metto in dubbio. Sul fatto che ci siano spesso errori nel codice che scrivo, questo non lo metto assolutamente in discussione , voi ne sapete certo più di me. Ma il modo in cui lo scrivo , spesso lungo ripetitivo e non efficiente dal punto di vista della programmazione, è il modo in cui sto imparando a fare certe cose , lo stesso utilizzato nelle slides dove studio. Se non metto da parte il programma su cui sto lavorando è proprio perchè quello è il modo che a lezione stanno utilizzando per farmi comprendere certe cose. Mi rendo conto di non invogliare le persone ad aiutarmi in questo modo , ma preferisco rimanere fedele al metodo utilizzato a lezione. Ti ringrazio per L’ algoritmo che hai scritto, non metto in dubbio che sia più chiaro di quello da me abbozzato , il problema è che , per le conoscenze che ho è al momento troppo difficile per me comprenderlo. Prima di scrivere codici così devo prima capire quello che non va nel mio.. non cerco di avere soluzioni da copiare ed incollare, anche se senza dubbio perfette , vorrei capire dove sbaglio.
  • Re: Stampare totale oggetti item con attributo in una lista

    Il cuore del codice che ho postato è il for innestato presente nel main(), quindi presumo sia quella la parte che non hai capito.

    In ogni caso ci sta pure essere abituati a fare le cose in un certo modo, ma una comprensione effettiva degli argomenti dovrebbe anche consentire una certa dimestichezza ed elasticità nel trattare la materia. Per esempio partendo da una semplice base di questo tipo
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    struct nodo
    {
        string luogo;
        unsigned int cont;
        nodo *next;
    };
    
    void aggiungi_in_testa(nodo **p, const string &LUOGO)
    {
        nodo *nuovo = new nodo;
        nuovo->luogo = LUOGO;
        nuovo->cont = 1;
        nuovo->next = *p;
        *p = nuovo;
    }
    
    void stampa_lista(nodo *p)
    {
        while(p)
        {
            cout << p->luogo << " " << p->cont << endl;
            p = p->next;
        }
        cout << endl;
    }
    
    int main()
    {
        nodo *L1 = nullptr;
        nodo *L2 = nullptr;
    
        aggiungi_in_testa(&L1, "Atlanta");
        aggiungi_in_testa(&L1, "Athens");
        aggiungi_in_testa(&L1, "Eugene");
        aggiungi_in_testa(&L1, "Athens");
        aggiungi_in_testa(&L1, "London");
        aggiungi_in_testa(&L1, "Athens");
        aggiungi_in_testa(&L1, "Doha");
        aggiungi_in_testa(&L1, "Doha");
        aggiungi_in_testa(&L1, "Rieti");
        aggiungi_in_testa(&L1, "Beijing");
        aggiungi_in_testa(&L1, "London");
        aggiungi_in_testa(&L1, "Berlin");
    
        //codice per ricavare L2
    
        stampa_lista(L1);
        stampa_lista(L2);
    }
    (e volendo puoi anche modificare la funzione aggiungi_in_testa() a tuo piacimento), come faresti per ottenere L2? Come si tradurrebbe in questo caso l'algoritmo che hai provato ad implementare?
    Se mi vieni incontro sono pure disposto ad aiutarti, altrimenti aspetta qualche altro utente di buona volontà disposto a ragionare sul frammento di codice che hai postato in precedenza.
Devi accedere o registrarti per scrivere nel forum
6 risposte