Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C++] Lista połączona pobierajaca string jako tytuł pozycji

d-m-n 23 Kwi 2010 23:53 876 0
  • #1 23 Kwi 2010 23:53
    d-m-n
    Poziom 1  

    Witam wszystkich !! potrzebuje Waszej pomocy:

    Mam taki problem przy samodzielnej próbie napisania takiej listy połączonej (w C++):

    program ma pobierac od uzytkownika numer pozycji na liscie i tytul ksiazki (jako string) po czym przekazywac obiekt Ksiazka na odpowiednie miejsce na liscie wg numeru pozycji.

    I niby wszystko dziala OK jesli chodzi o same numerki... dopoki nie dorzucilem stringa do konstruktora i do programu. Teraz niby sie kompiluje (przez co nie bardzo wiem gdzie szukac bledu;) , ale podczas dzialania wykrzacza sie (podczas tworzenia WezlaWewn).

    Oto kod programu:

    Code:
    #include <iostream>
    
    #include <string>

    using namespace std;
    enum {Wieksze, Mniejsze, Rowne};

    // klasa przechowujaca dane o ksiazce (tytul , nr na liscie):
    class Ksiazka
    {
          public:
                 Ksiazka(int, const std::string &);
              //   Ksiazka(int);
                 ~Ksiazka(){};
                 void Pokaz();
                 int Porownaj(Ksiazka &);
                 int PodajNr() { return Nr; }
                 string PodajTytul() { return Tytul; }
          private:
                  int Nr;
                  string Tytul;
    };

    Ksiazka::Ksiazka(int nr, const std::string & tytul):
                         Nr(nr),
                         Tytul(tytul)
    {
     cout << "tworze ksiazke nr " << nr << endl;
     //dlugosc = strlen(tytul);
    }

    /*Ksiazka::Ksiazka(int nr)
    {
     cout << "zapisuje ksiazke nr " << nr << endl;
     Nr = nr;
    } */


    void Ksiazka::Pokaz()
    {
      cout << Nr << ". \"" << Tytul << "\"" << endl;
      //cout << Nr << endl;
    }

    int Ksiazka::Porownaj(Ksiazka & nowyTytul)
    {
        cout << "porownuje ksiazke nr " << Nr << " z ksiazka nr " << nowyTytul.PodajNr() << endl;
        if (Nr > nowyTytul.PodajNr())




           return Wieksze;
        if (Nr < nowyTytul.PodajNr())
           return Mniejsze;
    }

    //***************************************klasa bazowa

    class Wezel
    {
          public:
                 Wezel(){ cout << "konstruktor klasy Wezel\n"; }
                 virtual ~Wezel(){ cout << "destruktor klasy Wezel\n"; }
                 virtual Wezel* Dodaj(Ksiazka*tytulKs)=0;
                 virtual void Pokaz()=0;
          private:
    };

    //*********KLASA: WEZEL WEWNETRZNY****************

    class WezelWewn : public Wezel
    {
          public:
                 WezelWewn(Ksiazka*kniga, Wezel*wezel);
                 virtual ~WezelWewn(){ cout << "destruktor klasy WezelWewn...\n"; }
                 virtual Wezel* Dodaj(Ksiazka*tytulKs);
                 virtual void Pokaz() { mojTytul->Pokaz(); next->Pokaz(); }

          private:
                  Wezel * next;
                  Ksiazka * mojTytul;
    };

    WezelWewn::WezelWewn(Ksiazka*kniga, Wezel*wezel):
                                        next(wezel),
                                        mojTytul(kniga)
    {
     cout << "konstruktor klasy WezelWewn...\n";
    }

    Wezel * WezelWewn::Dodaj(Ksiazka*pKsiazka)
    {
          cout << "Uruchamiam funkcje WezelWewn::Dodaj()\n";
          int wynik = mojTytul->Porownaj(*pKsiazka);
          switch (wynik)
          {
                 case Rowne:
                 case Wieksze:
                      {
                       WezelWewn * nowyWezel = new WezelWewn(pKsiazka, this);
                       cout << "Tworze nowy WezelWewn gdyz nowa pozycja jest wyzej na liscie\n";
                       return  nowyWezel;
                      }
                 case Mniejsze:
                      {
                       cout << "Przekazuje ksiazke do kolejnego WezlaWewn. gdyz nowa pozycja jest nizej na liscie\n";
                       next = next->Dodaj(pKsiazka);
                       return this;
                      }
          return this;
          }
    }

    //**************KLASA: WEZEL OGONA:****************************

    class WezelOgona : public Wezel
    {
          public:
                 WezelOgona(){cout << "konstruktor klasy WezelOgona\n";}
                 virtual ~WezelOgona(){cout << "destruktor klasy WezelOgona\n";}
                 virtual Wezel * Dodaj(Ksiazka*tytulKs);
                 virtual void Pokaz(){}
    };

    Wezel * WezelOgona::Dodaj(Ksiazka*tytulKs)
    {
      WezelWewn * nowyWezel = new WezelWewn(tytulKs, this);
      return  nowyWezel;
    }

    //************KLASA: WEZEL GLOWY:*********************

    class WezelGlowy : public Wezel
    {
          public:
                 WezelGlowy();
                 virtual ~WezelGlowy(){ delete next; }
                 virtual Wezel * Dodaj(Ksiazka*pKsiazka);
                 virtual void Pokaz();
          protected:
                  Wezel * next;
    };

    WezelGlowy::WezelGlowy()
    {
     cout << "konstruktor klasy WezelGlowy\n";
     next = new WezelOgona;
    }

    Wezel * WezelGlowy::Dodaj(Ksiazka*pKsiazka)
    {
          cout << "Uruchamiam funkcje WezelGlowy::Dodaj()\n";
          next = next->Dodaj(pKsiazka);
    }

    void WezelGlowy::Pokaz()
    {
         next->Pokaz();
    }

    //***************************************


    class ListaKsiazek
    {
          public:
                 ListaKsiazek(){ cout << "konstruktor klasy ListaKsiazek\n"; pHead = new WezelGlowy; }
                 ~ListaKsiazek(){ delete pHead; }
                 void Pokaz() { pHead->Pokaz(); }
                 virtual Ksiazka Dodaj(Ksiazka*pKsiazka);
          private:
                  WezelGlowy * pHead;
    };

    Ksiazka ListaKsiazek::Dodaj(Ksiazka*pKsiazka)
    {
            cout << "Uruchamiam funkcje ListaKsiazek::Dodaj()\n";
            pHead->Dodaj(pKsiazka);
    }

    // *************************************

    int main()
    {
        Ksiazka * pKsiazka;
        int choice;
        int nr;
        ListaKsiazek LK;
        string bufor;
        while(choice!=0)
        {
                cout << "(1)Wprowadz nowa ksiazke\n(2)Wyswietl liste wprowadzonych\n(0)Wyjdz\n";
                cin >> choice;
                switch (choice)
                {     
                       case 1:
                            {
                             cout << "nr ksiazki?\n";
                             cin >> nr;
                             cout << "\ntytul?";
                             cin >> bufor;
                             pKsiazka = new Ksiazka(nr, bufor);
                             
                             LK.Dodaj(pKsiazka);
                             break;
                            }
                       case 2:
                            {
                             LK.Pokaz();
                             break;
                            }
                       case 0: break;
                       default: cout << "Nie ma takiej opcji ;)\n";
                       break;
                if (!choice)
                break;
                }
        }
        return 0;
    }

    0 0