Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    211

    C++ struttura dati insieme con lista non ordinata

    ciao a tutti, ho creato la struttura dati insieme con una lista non ordinata. nel test dei metodi dell'insieme mi dà un errore nella struttura insiemel.h. posto i codici

    insieme.h
    codice:
    #ifndef insieme_h
    #define insieme_h
    
    #include<iostream>
    #include<stdlib.h>
    
    using namespace std;
    
    template<class tipoelem>
    class insieme
    {
       public:
          virtual void creainsieme() = 0;
          virtual bool insiemevuoto() = 0;
          virtual bool appartiene(tipoelem) = 0;
          virtual void inserisci(tipoelem) = 0;
          virtual void cancella(tipoelem) = 0;
          //virtual void unione(insieme<tipoelem> *, insieme<tipoelem> *) = 0;
          //virtual void intersezione(insieme<tipoelem> *, insieme<tipoelem> *) = 0;
          //virtual void differenza(insieme<tipoelem> *, insieme<tipoelem> *) = 0;
          
          void test();
    };
    
    #endif
    
    template<class tipoelem>
    void insieme<tipoelem>::test()
    {
       cout << "                  ***test del metodo CREAINSIEME***\n\n";
       cout << "il metodo CREAINSIEME crea un insieme privo di elementi. per provare il metodo\n";
       cout << "basta utilizzare il metodo INSIEMEVUOTO.\n\n";
       cout << "   insiemevuoto() = " << this->insiemevuoto() << "\n\n";
       system("pause");
       system("cls");
       
       cout << "                  ***test del metodo INSIEMEVUOTO***\n\n";
       cout << "il metodo INSIEMEVUOTO testa se l'insieme e' privo o meno di elementi.\n\n";
       cout << "   test del metodo su insieme privo di elementi:\n";
       cout << "      insiemevuoto() = " << this->insiemevuoto() << "\n";
       cout << "   test del metodo su insieme con almeno un elemento:\n";
       cout << "      inserimento di un valore nell'insieme: a = ";
       tipoelem a;
       cin >> a;
       this->inserisci(a);
       cout << "      insiemevuoto() = " << this->insiemevuoto() << "\n\n";
       system("pause");
       system("cls");
       
       cout << "                  ***test del metodo APPARTIENE***\n\n";
       cout << "il metodo APPARTIENE testa se il valore fornito come argomento e' presente\n";
       cout << "o meno tra i valori dell'insieme.\n\n";
       cout << "   test con esito positivo:\n";
       cout << "      appartiene(a) = " << this->appartiene(a) << "\n";
       cout << "   test con esito negativo:\n";
       cout << "      b = ";
       tipoelem b;
       cin >> b;
       cout << "      appartiene(b) = " << this->appartiene(b) << "\n\n";
       system("pause");
       system("cls");
    }
    insiemel.h
    codice:
    #ifndef insiemel_h
    #define insiemel_h
    
    #include<iostream>
    #include<stdlib.h>
    #include "listap.h"
    //#include "insieme.h"
    using namespace std;
    
    template<class tipoelem>
    class insiemel : public insieme<tipoelem>
    {
       public:
          insiemel();
          
          void creainsieme();
          bool insiemevuoto();
          bool appartiene(tipoelem);
          void inserisci(tipoelem);
          void cancella(tipoelem);
          void unione(&insiemel<tipoelem>, &insiemel<tipoelem>);
          void intersezione(&insiemel, &insiemel);
          void differenza(&insiemel, &insiemel);
          
          tipoelem getelem(typename listap<tipoelem>::posizione);
          typename listap<tipoelem>::posizione getsuc(typename listap<tipoelem>::posizione);
          typename listap<tipoelem>::posizione primo();
          
          int card;
       private:
          listap<tipoelem> *set;
    };
    
    #endif
    
    template<class tipoelem>
    tipoelem insiemel<tipoelem>::getelem(typename listap<tipoelem>::posizione pos)
    {
       return(set->leggilista(pos));
    }
    
    template<class tipoelem>
    typename listap<tipoelem>::posizione insiemel<tipoelem>::getsuc(typename listap<tipoelem>::posizione pos)
    {
       return(set->suclista(pos));
    }
    
    template<class tipoelem>
    typename listap<tipoelem>::posizione insiemel<tipoelem>::primo()
    {
       return(set->primolista());
    }
    
    template<class tipoelem>
    insiemel<tipoelem>::insiemel()
    {
       this->creainsieme();
    }
    
    template<class tipoelem>
    void insiemel<tipoelem>::creainsieme()
    {
       set = new listap<tipoelem>;
       card = 0;
    }
    
    template<class tipoelem>
    bool insiemel<tipoelem>::insiemevuoto()
    {
       return(set->listavuota());
    }
    
    template<class tipoelem>
    bool insiemel<tipoelem>::appartiene(tipoelem elem)
    {
       typename listap<tipoelem>::posizione p = set->primolista();
       bool trovato = false;
       while(!set->finelista(p) && !trovato)
       {
          if(set->leggilista(p) == elem)
             trovato = true;
          else
             p = set->suclista(p);
       }
       return trovato;
    }
    
    template<class tipoelem>
    void insiemel<tipoelem>::inserisci(tipoelem elem)
    {
       if(!this->appartiene(elem))
          set->inslista(set->primolista(), elem);
       card++;
    }
    
    template<class tipoelem>
    void insiemel<tipoelem>::cancella(tipoelem elem)
    {
       typename listap<tipoelem>::posizione p = set->primolista();
       bool trovato = false;
       while(!set->finelista(p) && !trovato)
       {
          if(this->getelem(p) == elem)
          {
             set->canclista(p);
             trovato = true;
             card--;
          }
          else
             p = set->suclista(p);
       }
    }
    
    template<class tipoelem>
    void insiemel<tipoelem>::unione(insiemel<tipoelem>::insiemel &A, insiemel<tipoelem>::insiemel &B)
    {
       typename listap<tipoelem>::posizione p = A.primolista();
       int cardA = A.card;
       while(cardA > 0)
       {
          this->inserisci(A.getelem(p));
          p = A.getsuc(p);
          cardA--;
       }
       p = B.primo();
       int cardB = B.card;
       while(cardB > 0)
       {
          this->inserisci(B.getelem(p));
          p = B.getsuc(p);
          cardB--;
       }
    }
    
    template<class tipoelem>
    void insiemel<tipoelem>::intersezione(insiemel<tipoelem> &A, insiemel<tipoelem> &B)
    {
       typename listap<tipoelem>::posizione p = A.primo();
       int cardA = A.card;
       while(cardA > 0)
       {
          if(B.appartiene(A.getelem(p)))
             this->inserisci(A.getelem(p));
          p = A.getsuc(p);
          cardA--;
       }
    }
    
    template<class tipoelem>
    void insiemel<tipoelem>::differenza(insiemel<tipoelem> &A, insiemel<tipoelem> &B)
    {
       typename listap<tipoelem>::posizione p = A.primo();
       int cardA = A.card;
       while(cardA > 0)
       {
          if(!B.appartiene(A.getelem(p)))
             this->inserisci(A.getelem(p));
          p = A.getsuc(p);
          cardA--;
       }
    }
    testinsieme.cpp
    codice:
    #include "insieme.h"
    #include "insiemev.h"
    #include "insiemel.h"
    #include<iostream>
    #include<stdlib.h>
    
    using namespace std;
    
    int main()
    {
       cout << "                ***test insieme con vettore***\n\n";
       int dim = 10;                  
       insiemev<int> ins(dim);
       ins.inserisci(2);
       ins.test();
       cout << "                ***test metodo UNIONE***\n\n";
       cout << "ins = {";
       ins.visualizzains();
       cout << "}\n";
       int dim2 = 5;
       insiemev<int> ins2(dim2);
       ins2.inserisci(4);
       ins2.inserisci(2);
       cout << "ins2 = {";
       ins2.visualizzains();
       cout << "}\n";
       int card3 = dim + dim2;
       insiemev<int> ins3(card3);
       cout << "ins3 = unione(ins, ins2) = {";
       ins3.unione(ins, ins2);
       ins3.visualizzains();
       cout << "}\n\n";
       cout << "                ***test metodo INTERSEZIONE***\n\n";
       int dim4 = dim;
       insiemev<int> ins4(dim4);
       ins4.intersezione(ins, ins2);
       cout << "ins4 = intersezione(ins, ins2) = {";
       ins4.visualizzains();
       cout << "}\n\n";
       cout << "               ***test metodo DIFFERENZA***\n\n";
       int dim5 = dim;
       insiemev<int> ins5(dim5);
       ins5.differenza(ins, ins2);
       cout << "ins5 = differenza(ins, ins2) = {";
       ins5.visualizzains();
       cout << "}\n\n";
          
       system("pause");
       return 0;
    }
    l'errore che mi viene visualizzato è il seguente:
    21 C:\Dev-Cpp\Strutture\Insiemi\insiemel.h variable or field `unione' declared void

    lo so che il metodo unione non restituisce nessun valore. perchè me lo ricorda e me lo segnala come errore?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Scusa ... ma questa

    void unione( &insiemel<tipoelem>, &insiemel<tipoelem> );

    non dovrebbe essere così

    void unione( insiemel<tipoelem> &, insiemel<tipoelem> & );

    ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2010
    Messaggi
    211
    si, grazie per la risposta ma poi mi sono accorto, subito dopo aver postato l'aiuto, di aver fatto orrore che ho fatto. stavo impazzendo e non me ne accorgevo. grazie ancora

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.