C++ problem z programem funkcja nie wykonuje tego co powinna


(karton16) #1

Zaczełem pisać aplikację dla biblioteki, nie taką z prawdziwego zdarzenia, tylko taką do próby, i w czasie pisania napotkałem parę problemów.

O to mój program:

#include 

#include 

#include 

#include 

#include 


using namespace std;




class zbiory

{

      protected:


      string tytul;

      string autor;

      string rokwydania;

      string wydawnictwo;


             fstream import1;





      public:


             zbiory(string t, string a, string r, string w )

             {

                           tytul = t;

                           autor = a;

                           rokwydania = r;

                           wydawnictwo = w;


                     }





             void opis_add()

             {

              ofstream import1;

    import1.open("biblioteka/ksiazki.txt",ios::app | ios::out);




                                       import1 <<"." <
                                       import1 << tytul ;

                                       import1 <
                                       import1 << autor ;

                                       import1 << endl;

                                       import1 << rokwydania ;

                                       import1 <
                                       import1 << wydawnictwo ;

                                       import1 <



                                       import1.close();






              }

              void opis_del()

              {

                   string str;

                   fstream import2;

                   fstream temp;

                   import2.open("biblioteka/ksiazki.txt",ios::in );

                   temp.open("biblioteka/tmp.txt", ios::out | ios::trunc);

                   if(import2.good() && temp.good())

                   {

                   do

                   {

                                        import2 >> str;



                                        if(str != tytul)

                                        {

                                                temp << str <
                                                }


                                                    if(str != autor)

                                                    {

                                                           temp << str <
                                                           }


                                                               if(str != rokwydania)

                                                               {

                                                                      temp << str <
                                                                      }


                                                                          if(str != wydawnictwo)

                                                                          {

                                                                                 temp << str <
                                                                                 }






                                                        } 


                                                while(!import2.eof() );

                                        temp.close();

                                        import2.close();

                                        }


               }

               void edytuj_opis()

               {


                }

                void lista1()

                {

                 }

                 void listawypozyczonych()

                 {

                  }

                  void lista_w_bibliotece()

                  {

                   }

                   void exportl()

                   {



                    }

                    ~zbiory()

             {

                    cout <<"Obiekt usuniety";

                    }


                     private:

                             void wypozyczone()

                             {

                              }

                              void zwrot()

                              {

                               }



};

class czytelnicy

{

      };


string tyt, aut,wyd;

string rok;


void menu2_opis_add()

{

     system("cls");

     cout <<"Podaj tytul >>";

                                 cin >>tyt;

                                 cout <
                                 cout <<"Podaj autora >>";

                                 cin >>aut;

                                 cout <
                                 cout <<"Podaj rok wydania >>";

                                 cin >>rok;

                                 cout <<"Podaj wydawnictwo >>";

                                 cin >>wyd;

                                 zbiory *zbio = new zbiory(tyt,aut,rok,wyd);

                                 zbio -> opis_add();

                                 zbio -> ~zbiory();


 }

 void menu2_opis_del()

 {

     system("cls");

     cout <<"Podaj tytul >>";

                                 cin >>tyt;

                                 cout <
                                 cout <<"Podaj autora >>";

                                 cin >>aut;

                                 cout <
                                 cout <<"Podaj rok wydania >>";

                                 cin >>rok;

                                 cout <<"Podaj wydawnictwo >>";

                                 cin >>wyd;

                                 zbiory *zbio = new zbiory(tyt,aut,rok,wyd);

                                 zbio -> opis_del();

                                 zbio -> ~zbiory();

  }


int main()

{



    menu:

    system("cls");


    cout <<"MENU"<
    cout <<""<
    cout <<"[1] Zbiory"<
    cout <<"[2] Czytelnicy"<
    cout <<"[3] Wyjscie" <

    int a;

    cout <<">>";

    cin >>a;


    switch(a)

    {

             case 1:

                  menu2:

                  system("cls");

                  cout <<"[1] + opis"<
                  cout <<"[2] - opis" <
                  cout <<"[3] edytuj opis" <
                  cout <<"[4] lista" <
                  cout <<"[5] lista wypozyczonych" <
                  cout <<"[6] lista w bibliotece" <
                  cout <<"[7] wypozyczenie"<
                  cout <<"[8] zwrot" <
                  cout <<"[9] export do pliku" <
                  cout <<"[10] import do pliku" <
                  cout <<"[11] powrot"<
                  cout <<""<
                  cout <<">>";

                  cin >>a;


                  switch(a)

                  {

                           case 1:

                                 menu2_opis_add();

                                 goto menu2;

                                break;


                           case 2:

                                menu2_opis_del();

                                goto menu2;

                                break;

                           case 3:

                                break;

                           case 4:

                                break;

                           case 5:

                                break;

                           case 6:

                                break;

                           case 7:

                                break;

                           case 8:

                                break;

                           case 9:

                                break;

                           case 10:

                                break;

                           case 11:

                                goto menu;

                                break;

                           default:

                                   cout <<"Wybrales nieprawidlowa wartosc";

                                   getch();

                                   goto menu2;

                                   break;


                  }


                  case 2:

                       menu3:

                       system("cls");

                       cout <<"[1] + opis"<
                       cout <<"[2] - opis"<
                       cout <<"[3] edytuj opis"<
                       cout <<"[4] lista"<
                       cout <<"[5] lista wypozyczonych"<
                       cout <<"[6] lista w bibliotece"<
                       cout <<"[7] export do pliku" <
                       cout <<"[8] import do pliku" <
                       cout <<"[9] powrot" <
                       cout <<""<
                       cout <<">>";

                       cin >> a;

                       switch(a)

                       {

                        case 1:

                             break;

                        case 2:

                             break;

                        case 3:

                             break;

                        case 4:

                             break;

                        case 5:

                             break;

                        case 6:

                             break;

                        case 7:

                             break;

                        case 8:

                             break;

                        case 9:

                             goto menu;

                             break;

                        default:

                                cout <<"Wybrales nieprawidlowa wartosc"<
                                getch();

                                goto menu3;

                                break;


                       }

                       break;

                       case 3:



                            break;


                  default:

                          cout <<"Wybrales nieprawidlowa wartosc"<
                          getch();

                          goto menu;

                          break;


    }


}

Mój problem ma miejsce w tym fragmencie:

void opis_del()

              {

                   string str;

                   fstream import2;

                   fstream temp;

                   import2.open("biblioteka/ksiazki.txt",ios::in );

                   temp.open("biblioteka/tmp.txt", ios::out | ios::trunc);

                   if(import2.good() && temp.good())

                   {

                   do

                   {

                                        import2 >> str;



                                        if(str != tytul)

                                        {

                                                temp << str <
                                                }


                                                    if(str != autor)

                                                    {

                                                           temp << str <
                                                           }


                                                               if(str != rokwydania)

                                                               {

                                                                      temp << str <
                                                                      }


                                                                          if(str != wydawnictwo)

                                                                          {

                                                                                 temp << str <
                                                                                 }






                                                        } 


                                                while(!import2.eof() );

                                        temp.close();

                                        import2.close();

                                        }


               }

Ten fragment kodu powinien w pliku tem przenieść tylko te elementu, które nie mają takiej samego tytułu, ani nazy autora itd, jednak nie działa poprawnie Oto przykładowa zawartość pliku ksiazki.txt:

.

Lalka

Boleslaw_Pusa

2013

Operon

.

Zbrodnia_i_kara

Oskar_Polok

2013

Operon

A o to wynik działania progranu w pliku temp.txt:

.

.

.

.

Lalka

Lalka

Lalka

Boleslaw_Prus

Boleslaw_Prus

Boleslaw_Prus

2013

2013

2013

Operon

Operon

Operon

.

.

.

.

Zbrodnia_i_kara

Zbrodnia_i_kara

Zbrodnia_i_kara

Zbrodnia_i_kara

Oskar_Polok

Oskar_Polok

Oskar_Polok

Oskar_Polok

2013

2013

2013

Operon

Operon

Operon

Operon

Operon

Operon

Proszę o propozycje modyfikacji tego kodu


#2

karton16 , proszę zapoznaj się z tą stroną oraz tym tematem, a następnie, używając przycisku image.php?album_id=20&image_id=4038


(Razi) #3

Formatuj kod czytelniej, będzie bardziej zrozumiały:

void opis_del()

{

	string str;

	fstream import2;

	fstream temp;

	import2.open("biblioteka/ksiazki.txt",ios::in );

	temp.open("biblioteka/tmp.txt", ios::out | ios::trunc);

	if(import2.good() && temp.good())

	{

		do

		{

			import2 >> str;

			if(str != tytul)

			{

				temp << str <
			}


			if(str != autor)

			{

				temp << str <
			}


			if(str != rokwydania)

			{

				temp << str <
			}


			if(str != wydawnictwo)

			{

				temp << str <
			}

		}

		while(!import2.eof() );

		temp.close();

		import2.close();

	}

}

Teraz widać, że nie ma tu żadnych zagnieżdżeń warunków, tylko są sprawdzane niezależnie.

Co te warunki miały sprawdzać? Bo biorąc to na samą logikę, wczytany string będzie zapisany do pliku wyjściowego minimum 3 razy, ‘str’ nie może być równe 4 różnym napisom jednocześnie. Wczytujesz tylko jedną linijkę (a raczej: stringa) i porównujesz ją do zmiennych klasowych.

Tu nie ma co modyfikować kod, tylko całkowicie zmienić cały zamysł rozwiązania problemu.

Zacznijmy od tego że trzymanie całej bazy na dysku to jego zabójstwo, a w tak niezorganizowanej bazie bardzo łatwo o błąd.

Najłatwiej będzie po prostu wczytać wszystkie wpisy, zorganizować je w jakiejś strukturze, potem nadpisać plik z tymi wpisami, które chcesz, czyli sprawdzasz czy dany wpis się nadaje do wpisania i jeśli tak — wpisujesz go, jeśli nie — ignorujesz.


(etam) #4

Razi dobrze gada.

A poza tym:

  1. Widzę zło:

    zbiory *zbio = new zbiory(tyt,aut,rok,wyd);

     zbio -> opis_add();
    
     zbio -> ~zbiory();
    

To jest złe z kilku powodów: a) Zrobiłeś obiekt z czegoś co nie jest obiektem. opis_add i opis_del powinny być zwykłymi funkcjami.

opis_add(tyt, aut, rok, wyd);

b) Poprawne użycie dynamicznej alokacji wygląda tak:

Foo *foo = new Foo(params);

foo->bar();

delete foo;

delete wywoła destruktor i zwolni zaalokowaną przez new pamięć. Wywołanie destruktora nie zwolni pamięci. W ogóle, jeżeli wywołujesz destruktor to znaczy, że robisz to źle. c) W takich przypadkach dynamiczna alokacja jest zbędna.

Foo foo(params);

foo.bar();

Obiekt foo jest automatycznie niszczony (tzn. wywoływany destruktor) przy wyjściu z funkcji. d) Przypominam punkt a: Klasa “zbiory” jest dziwnym tworem próby upchnięcia w klasę czegoś co nie jest klasą. 2) Źle:

string tyt, aut,wyd;

string rok;

void menu2_opis_add()

Dobrze:

void menu2_opis_add(const string& tyt, const string& aut, const string& wyd, const string& rok)

https://pl.wikibooks.org/wiki/C%2B%2B/Referencje3) Nie gotuj. Znaczy nie używaj “goto”. http://www.xkcd.com/292/http://susepaste.org/233083324)

ofstream file;

file.open("file.txt", ios::app | ios::out);

file << "foo";

file << endl;

file.close();

Powyższe nie jest złe, ale można trochę zwięźlej:

ofstream file("file.txt", ios::app);

file << "foo" << endl;

a) ofstream nie potrzebuje ios::out, tak samo jak ifstream nie potrzebuje ios::in. Te flagi są potrzebne tylko do fstream.

b) Przy wyjściu z funkcji obiekt file jest niszczony. Destruktor zamyka plik.


(karton16) #5

Tak wiem, że nien urzywa się goto tylko ten program jest na zajęcia i nauczyciel powiedział, że można zrobić w goto


(kostek135) #6

To jeszcze ja ci trochę dołożę, a co :stuck_out_tongue:

Generalnie zaaplikuj wszystkie porady od etam , bo dobrze mówi. Moje będą bardziej dotyczyły logiki twojej aplikacji oraz sposobów projektowania. Widzę klasę czytelnik (ty ją nazwałeś czytelnicy). Rozumiem, że w przyszłości ten “system” miałby umożliwiać rejestrowanie wypożyczeń etc. Aby zrozumieć poniższe porady - “czemu tak?” musisz zainteresować się taką dziedziną informatyki jak inżynieria oprogramowania. Co powinieneś zrobić:

  1. Klasy powinny być budowane tak, aby reprezentowały 1 obiekt, ponieważ klasa jest to pewien zbiór metadanych o obiekcie. Dlatego napisałem “czytelnik” - jeden obiekt. Natomiast referencje do wszystkich obiektów przechowywać w ekstensji klasy. Ją można zaimplementować na wiele sposobów, najprostszym będzie statyczny vector. Wtedy każda metoda o zasięgu obiektu będzie modyfikować obiekt, a metody klasowe przez ekstensję, będą miały dostęp do wszystkich obiektów.

  2. Generalnie nie wiem jak zamierzasz rozplanować klasy, ale wiedz, że wybrałeś jeden z trudniejszych przykładów, bibliotekę. Przede wszystkim wyrzuciłbym klasę zbiory. Zamiast niej wstawiłbym:

Książka (tytuł, autor, rokwydania, wydawnictwo, …) - reprezentuje książkę jako byt w rozumieniu utworu literackiego (Np. Lalka B. Prusa).

Egzemplarz/Wolumin (id, instacja_książki*) - reprezentacja fizycznego nośnika danych z okładką i w ogóle, taki namacalny co sobie możesz potrzymać.

Wypożyczenie (od, do, instancja_woluminu*, instancja_czytelnika*)

Czytelnik (nr_karty, imie, nazwisko, vector )

Więc tak, dużo osób popełnia błąd mając tylko jedną klasę do reprezentacji zasobów biblioteki. Nie wiedzieć czemu zamiast powyższego rozbicia, które jest jakby nie patrzeć 1:1 odzwierciedleniem świata rzeczywistego obserwuje często jakieś karkołomne operacje, typu, umieszczenie ilości sztuk w książce i ilości sztuk wypożyczonych, jakiegoś zbioru osób wypożyczających, co to nawet nie wiadomo, kto wypożyczył jaki egzemplarz.

Np. bez klasy egzemplarz zrobienie historii wypożyczeń danego woluminu byłoby uciążliwe.

PS

Przykrego (nie znajduje lepszego słowa) masz nauczyciela. Nie mniej używanie go to świadczy tylko o tym, że masz tzw. bad smells w kodzie (głównie za sprawą złego planowania) i nie radzisz sobie z ich rozwiązaniem. Lekcje chyba powinny uczyć poprawnego pisania aplikacji?


(karton16) #7

Zgadzam się z waszymi propozycjami jednak wykonanie tej aplikacji jest narzucone przez nauczyciela.

Zmieniłem ten fragment kodu:

void opis_del()

                  {

                       string str;

                       fstream import2;

                       fstream temp;

                       import2.open("biblioteka/ksiazki.txt",ios::in );

                       temp.open("biblioteka/tmp.txt", ios::out | ios::trunc);

                       if(import2.good() && temp.good())

                       {

                       do

                       {

                                            import2 >> str;



                                            if(str != tytul)

                                            {

                                                    temp << str <
                                                    }


                                                        if(str != autor)

                                                        {

                                                               temp << str <
                                                               }


                                                                   if(str != rokwydania)

                                                                   {

                                                                          temp << str <
                                                                          }


                                                                              if(str != wydawnictwo)

                                                                              {

                                                                                     temp << str <
                                                                                     }






                                                            }


                                                    while(!import2.eof() );

                                            temp.close();

                                            import2.close();

                                            }


                   }

Na następujący:

void opis_del()

              {

                   string str;

                   fstream import2;

                   fstream temp;

                   import2.open("biblioteka/ksiazki.txt",ios::in );

                   temp.open("biblioteka/tmp.txt", ios::out | ios::trunc);

                   if(import2.good() && temp.good())

                   {

                   do

                   {

                                        import2 >> str;



                                        if(str != tytul)

                                        {

                                                temp << str <
                                        }

                                        else

                                        {


                                        if(str != autor)

                                        {

                                        temp << str <
                                        }

                                        else          

                                        {      

                                        if(str != rokwydania)

                                        {

                                        temp << str <
                                        }

                                        else

                                        {


                                        if(str != wydawnictwo)

                                        {

                                        temp << str <
                                        }


                                        } 

                                        }

                                        }   


                                        } 


                                        while(!import2.eof() );

                                        temp.close();

                                        import2.close();

                                        }


               }

I teraz otrzymuję przy takiej zawartości pliku ksiazki.txt:

.

Lalka

Boleslaw_Prus

2013

Operon

.

Zbrodnia_i_kara

Dostojewski

2013

Operon

taki wynik w pliku temp.txt:

.

Lalka

Boleslaw_Prus

2013

Operon

.

Zbrodnia_i_kara

Dostojewski

2013

Operon

Operon

([alex]) #8

A na jakiej zasadzie chcesz usuwać?

Co ma się stać jeżeli podano:

Titul = Lalka

Autor = Dostojewski

Wynik ma być taki:

.

Boleslaw_Prus

2013

Operon

.

Zbrodnia_i_kara

2013

Operon

? Podwaja ostatni wiersz ponieważ eofbit jest ustawiany dopiero po próbie odczytu poza końcem pliku. Zamień:

do

  {

   import2 >> str;

  } while(!import2.eof());

Na:

string xpoint,xtytul,xautor,xrokwydania,xwydawnictwo;

while(import2>>xpoint>>xtytul>>xautor>>xrokwydania>>xwydawnictwo)

  {

   // tu masz wczytano całość, decydujesz czy zapisywać:

   if(coś_tam)

     {

      temp<
     }

  }

Ot cała filozofia.


(karton16) #9

Ok wykonałem tak jak [alex] napisałeś i działa, lecz po dodaniu nowych lini kodu ( kopijący dane z pliku tmp do pliku ksiazki) program w ogóle już nie tworzy tych plików

O to mój aktualny kod:

#include 

#include 

#include 

#include 

#include 


using namespace std;




class zbiory

{

      protected:


      string tytul;

      string autor;

      string rokwydania;

      string wydawnictwo;


             fstream import1;





      public:


             zbiory(string t, string a, string r, string w )

             {

                           tytul = t;

                           autor = a;

                           rokwydania = r;

                           wydawnictwo = w;


                     }





             void opis_add()

             {

              ofstream import1;

    import1.open("biblioteka/ksiazki.txt",ios::app | ios::out);




                                       import1 <<"." <
                                       import1 << tytul ;

                                       import1 <
                                       import1 << autor ;

                                       import1 << endl;

                                       import1 << rokwydania ;

                                       import1 <
                                       import1 << wydawnictwo ;

                                       import1 <



                                       import1.close();






              }

              void opis_del()

              {

                   string str;

                   fstream import2;

                   fstream temp;

                   import2.open("biblioteka/ksiazki.txt",ios::in );

                   temp.open("biblioteka/tmp.txt", ios::out | ios::trunc);

                   if(import2.good() && temp.good())

                   {

                  string xpoint,xtytul,xautor,xrokwydania,xwydawnictwo;

while(import2>>xpoint>>xtytul>>xautor>>xrokwydania>>xwydawnictwo)

  {

   // tu masz wczytano ca?os'c', decydujesz czy zapisywac':

   if(tytul != xtytul)

     {

      temp<
     }

  }


                                        import2.close();

                                        temp.close();


                                        fstream import3, temp1;

                                        import3.open("biblioteka/ksiazki.txt", ios::trunc);

                                        temp1.open("biblioteka/tmp.txt", ios::in);


                                        if(import3.good()&&temp1.good())

                                        {

                                        }

                                        else

                                        {

                                            cout <<"Blad"<
                                            getch();

                                        }


                                        }


               }

               void edytuj_opis()

               {


                }

                void lista1()

                {

                 }

                 void listawypozyczonych()

                 {

                  }

                  void lista_w_bibliotece()

                  {

                   }

                   void exportl()

                   {



                    }

                    ~zbiory()

             {

                    cout <<"Obiekt usuniety";

                    }


                     private:

                             void wypozyczone()

                             {

                              }

                              void zwrot()

                              {

                               }



};

class czytelnicy

{

      };


string tyt, aut,wyd;

string rok;


void menu2_opis_add()

{

     system("cls");

     cout <<"Podaj tytul >>";

                                 cin >>tyt;

                                 cout <
                                 cout <<"Podaj autora >>";

                                 cin >>aut;

                                 cout <
                                 cout <<"Podaj rok wydania >>";

                                 cin >>rok;

                                 cout <<"Podaj wydawnictwo >>";

                                 cin >>wyd;

                                 zbiory *zbio = new zbiory(tyt,aut,rok,wyd);

                                 zbio -> opis_add();

                                 zbio -> ~zbiory();


 }

 void menu2_opis_del()

 {

     system("cls");

     cout <<"Podaj tytul >>";

                                 cin >>tyt;

                                 cout <
                                 cout <<"Podaj autora >>";

                                 cin >>aut;

                                 cout <
                                 cout <<"Podaj rok wydania >>";

                                 cin >>rok;

                                 cout <<"Podaj wydawnictwo >>";

                                 cin >>wyd;

                                 zbiory *zbio = new zbiory(tyt,aut,rok,wyd);

                                 zbio -> opis_del();

                                 zbio -> ~zbiory();

  }


int main()

{



    menu:

    system("cls");


    cout <<"MENU"<
    cout <<""<
    cout <<"[1] Zbiory"<
    cout <<"[2] Czytelnicy"<
    cout <<"[3] Wyjscie" <

    int a;

    cout <<">>";

    cin >>a;


    switch(a)

    {

             case 1:

                  menu2:

                  system("cls");

                  cout <<"[1] + opis"<
                  cout <<"[2] - opis" <
                  cout <<"[3] edytuj opis" <
                  cout <<"[4] lista" <
                  cout <<"[5] lista wypozyczonych" <
                  cout <<"[6] lista w bibliotece" <
                  cout <<"[7] wypozyczenie"<
                  cout <<"[8] zwrot" <
                  cout <<"[9] export do pliku" <
                  cout <<"[10] import do pliku" <
                  cout <<"[11] powrot"<
                  cout <<""<
                  cout <<">>";

                  cin >>a;


                  switch(a)

                  {

                           case 1:

                                 menu2_opis_add();

                                 goto menu2;

                                break;


                           case 2:

                                menu2_opis_del();

                                goto menu2;

                                break;

                           case 3:

                                break;

                           case 4:

                                break;

                           case 5:

                                break;

                           case 6:

                                break;

                           case 7:

                                break;

                           case 8:

                                break;

                           case 9:

                                break;

                           case 10:

                                break;

                           case 11:

                                goto menu;

                                break;

                           default:

                                   cout <<"Wybrales nieprawidlowa wartosc";

                                   getch();

                                   goto menu2;

                                   break;


                  }


                  case 2:

                       menu3:

                       system("cls");

                       cout <<"[1] + opis"<
                       cout <<"[2] - opis"<
                       cout <<"[3] edytuj opis"<
                       cout <<"[4] lista"<
                       cout <<"[5] lista wypozyczonych"<
                       cout <<"[6] lista w bibliotece"<
                       cout <<"[7] export do pliku" <
                       cout <<"[8] import do pliku" <
                       cout <<"[9] powrot" <
                       cout <<""<
                       cout <<">>";

                       cin >> a;

                       switch(a)

                       {

                        case 1:

                             break;

                        case 2:

                             break;

                        case 3:

                             break;

                        case 4:

                             break;

                        case 5:

                             break;

                        case 6:

                             break;

                        case 7:

                             break;

                        case 8:

                             break;

                        case 9:

                             goto menu;

                             break;

                        default:

                                cout <<"Wybrales nieprawidlowa wartosc"<
                                getch();

                                goto menu3;

                                break;


                       }

                       break;

                       case 3:



                            break;


                  default:

                          cout <<"Wybrales nieprawidlowa wartosc"<
                          getch();

                          goto menu;

                          break;


    }


}

([alex]) #10
import3.open("biblioteka/ksiazki.txt",ios::out | ios::trunc);

(etam) #11
  1. Robisz klasę z tego co nie jest klasą (klasa “zbiory”). Nie robisz klasy z tego co powinno być klasą (zamiast osobnych zmiennych “tytul”, “autor”, itp. powinieneś mieć klasę “ksiazka”).

  2. Zrób tak, żebyś nie miał zmiennych globalnych.

  3. Jaka jest wartość zmiennej “rozmiar” w momencie startu programu? Jakiego rozmiaru są tablice “tytul1”, “autor1”, itp? Może lepiej użyć wektora z STL?

  4. Zastosuj się do tego co napisałem wcześniej.

Najpierw przemyśl co chcesz zrobić, a potem pisz kod. Mam wrażenie, że robisz na odwrót.


(karton16) #12

Zaniechałem już tamtą koncepcję i zacząłem używać tablic dynamicznych, jestem na dobrej drodze, ale po dodaniu opisu do książki, chce dodać kolejny opis do książki to program się sypie, czy ktoś wie, gdzie tkwi teraz problem:

#include 

#include 

#include 

#include 

#include 


using namespace std;


int rozmiar,ld1=0;

string* tytul1 = new string[rozmiar];

string* autor1 = new string[rozmiar];

string* rok_wydania = new string[rozmiar];

string* wydawnictwo1 = new string[rozmiar];

string* wypozyczone = new string[rozmiar];


class zbiory

{

      protected:


      string tytul;

      string autor;

      string rokwydania;

      string wydawnictwo;


             fstream import1;





      public:







             void opis_add()

             {

              cout <<"Podaj tytul ksiazki >>";

              cin >> tytul;

              cout <
              cout <<"Podaj autora np.: Boleslaw_Prus >> ";

              cin >>autor;

              cout <
              cout <<"Podaj rok wydania >>";

              cin >> rokwydania;

              cout <
              cout <<"Podaj wydawnictwo >>";

              cin >> wydawnictwo;

              cout <
              tytul1[rozmiar] = tytul;

              autor1[rozmiar] = autor;

              rok_wydania[rozmiar] = rokwydania;

              wydawnictwo1[rozmiar] = wydawnictwo;

              rozmiar++;

              ld1++;


             }

              void opis_del()

              {    

                   int a;

                        for(int i = 0; i < rozmiar;i++)

                     {

                             cout <
                             }  

                             cout <<"Podaj index do usuniecia >>";

                             cin >> a;

                             tytul1[a-1]=tytul1[rozmiar];    

                             autor1[a-1]=autor1[rozmiar];

                             rok_wydania[a-1]=rok_wydania[rozmiar];

                             wydawnictwo1[a-1]= wydawnictwo1[rozmiar];   

               }

               void edytuj_opis()

               {


                }

                void lista1()

                {

                     system("cls");

                     for(int i = 0; i < rozmiar;i++)

                     {

                             cout <
                             }

                     getch();

                 }

                 void listawypozyczonych()

                 {

                  }

                  void lista_w_bibliotece()

                  {

                   }

                   void exportl()

                   {



                    }

                    ~zbiory()

             {

                    cout <<"Obiekt usuniety";

                    }


                     private:

                             void wypozyczone()

                             {

                              }

                              void zwrot()

                              {

                               }



};

class czytelnicy

{

      };


void opisadd()

{

     zbiory a;

     a.opis_add();



 }

 void lista1()

 {

      zbiory b;

      b.lista1();


  }



int main()

{




    menu:

    system("cls");


    cout <<"MENU"<
    cout <<""<
    cout <<"[1] Zbiory"<
    cout <<"[2] Czytelnicy"<
    cout <<"[3] Wyjscie" <

    int a;

    cout <<">>";

    cin >>a;


    switch(a)

    {

             case 1:

                  menu2:

                  system("cls");

                  cout <<"[1] + opis"<
                  cout <<"[2] - opis" <
                  cout <<"[3] edytuj opis" <
                  cout <<"[4] lista" <
                  cout <<"[5] lista wypozyczonych" <
                  cout <<"[6] lista w bibliotece" <
                  cout <<"[7] wypozyczenie"<
                  cout <<"[8] zwrot" <
                  cout <<"[9] export do pliku" <
                  cout <<"[10] import do pliku" <
                  cout <<"[11] powrot"<
                  cout <<""<
                  cout <<">>";

                  cin >>a;


                  switch(a)

                  {

                           case 1:

                                system("cls");

                                 opisadd();

                                 goto menu2;

                                break;


                           case 2:

                                lista1();

                                goto menu2;

                                break;

                           case 3:

                                break;

                           case 4:

                                lista1();

                                goto menu2;

                                break;

                           case 5:

                                break;

                           case 6:

                                break;

                           case 7:

                                break;

                           case 8:

                                break;

                           case 9:

                                break;

                           case 10:

                                break;

                           case 11:

                                goto menu;

                                break;

                           default:

                                   cout <<"Wybrales nieprawidlowa wartosc";

                                   getch();

                                   goto menu2;

                                   break;


                  }


                  case 2:

                       menu3:

                       system("cls");

                       cout <<"[1] + opis"<
                       cout <<"[2] - opis"<
                       cout <<"[3] edytuj opis"<
                       cout <<"[4] lista"<
                       cout <<"[5] lista wypozyczonych"<
                       cout <<"[6] lista w bibliotece"<
                       cout <<"[7] export do pliku" <
                       cout <<"[8] import do pliku" <
                       cout <<"[9] powrot" <
                       cout <<""<
                       cout <<">>";

                       cin >> a;

                       switch(a)

                       {

                        case 1:

                             break;

                        case 2:

                             break;

                        case 3:

                             break;

                        case 4:

                             break;

                        case 5:

                             break;

                        case 6:

                             break;

                        case 7:

                             break;

                        case 8:

                             break;

                        case 9:

                             goto menu;

                             break;

                        default:

                                cout <<"Wybrales nieprawidlowa wartosc"<
                                getch();

                                goto menu3;

                                break;


                       }

                       break;

                       case 3:



                            break;


                  default:

                          cout <<"Wybrales nieprawidlowa wartosc"<
                          getch();

                          goto menu;

                          break;


    }


}

(Drobok) #13
  1. Na początek karygodne błędy które popełniłeś:

(karton16) #14

Ok wszystko fajnie, ale czy możesz mi wytłumaczyć na czym polegają struktury i jak je używać, bo tak daleko z programowania jeszcze nie jestem.


(Drobok) #15

Struktura to typ zmiennej zawierającej kilka zmiennych (na chłopski rozum)

piszesz sobie

strukt nazwa_struktury{

  int i; 

  float b;

}; //(koniecznie średnik na końcu

/*tutaj jakis kod (np funkcja glowna*/

nazwa_struktury nazwa_zmiennej;//deklarujesz jakby nazwa_struktury byla zmienną np int

nazwa_zmniennej.i; //<-to zmienna w twojej strukturze (nazwa zmiennej w strukturze po . uzywasz jej jak by byla zwykla zmienną

(kostek135) #16

@karton16

W praktyce w C++, struktura to klasa, tylko domyślnie publiczna, aby zachować kompatybilność wsteczną z C. Na dobrą sprawę jeśli zastąpisz ją

class T {

public:

    ...

};

to nie odczujesz żadnej istotnej różnicy.


(karton16) #17

Ok zrobiłem tak jak drobek pisałeś, ale nie wiem czy dobrze, bo debugger wyrzucił błąd

#include 

#include 

#include 

#include 

#include 


using namespace std;




class zbiory

{

      protected:


      string tytul;

      string autor;

      string rokwydania;

      string wydawnictwo;



             struct ksiazka

             {

                    int rozmiar,ld1;

                    string* tytul1 = new string[rozmiar];

string* autor1 = new string[rozmiar];

string* rok_wydania = new string[rozmiar];

string* wydawnictwo1 = new string[rozmiar];

string* wypozyczone = new string[rozmiar];


                    }





      public:







             void opis_add()

             {

              cout <<"Podaj tytul ksiazki >>";

              cin >> tytul;

              cout <
              cout <<"Podaj autora np.: Boleslaw_Prus >> ";

              cin >>autor;

              cout <
              cout <<"Podaj rok wydania >>";

              cin >> rokwydania;

              cout <
              cout <<"Podaj wydawnictwo >>";

              cin >> wydawnictwo;

              cout <
              ksiazka a;

              a.tytu1[rozmiar]=tytul;

              a.autor1[rozmiar]=autor;

              a.rok_wydania[rozmiar]=rokwydania;

              a.wydawnictwo1[rozmiar]=wydawnictwo;


             }

              void opis_del()

              {    

                   int a;

                        for(int i = 0; i < rozmiar;i++)

                     {

                             cout <
                             }  

                             cout <<"Podaj index do usuniecia >>";

                             cin >> a;

                             tytul1[a-1]=tytul1[rozmiar];    

                             autor1[a-1]=autor1[rozmiar];

                             rok_wydania[a-1]=rok_wydania[rozmiar];

                             wydawnictwo1[a-1]= wydawnictwo1[rozmiar];   

               }

               void edytuj_opis()

               {


                }

                void lista1()

                {

                     system("cls");

                     for(int i = 0; i < rozmiar;i++)

                     {

                             cout <
                             }

                     getch();

                 }

                 void listawypozyczonych()

                 {

                  }

                  void lista_w_bibliotece()

                  {

                   }

                   void exportl()

                   {



                    }

                    ~zbiory()

             {

                    cout <<"Obiekt usuniety";

                    }


                     private:

                             void wypozyczone()

                             {

                              }

                              void zwrot()

                              {

                               }



};

class czytelnicy

{

      };


void opisadd()

{

     zbiory a;

     a.opis_add();



 }

 void lista1()

 {

      zbiory b;

      b.lista1();


  }



int main()

{




    menu:

    system("cls");


    cout <<"MENU"<
    cout <<""<
    cout <<"[1] Zbiory"<
    cout <<"[2] Czytelnicy"<
    cout <<"[3] Wyjscie" <

    int a;

    cout <<">>";

    cin >>a;


    switch(a)

    {

             case 1:

                  menu2:

                  system("cls");

                  cout <<"[1] + opis"<
                  cout <<"[2] - opis" <
                  cout <<"[3] edytuj opis" <
                  cout <<"[4] lista" <
                  cout <<"[5] lista wypozyczonych" <
                  cout <<"[6] lista w bibliotece" <
                  cout <<"[7] wypozyczenie"<
                  cout <<"[8] zwrot" <
                  cout <<"[9] export do pliku" <
                  cout <<"[10] import do pliku" <
                  cout <<"[11] powrot"<
                  cout <<""<
                  cout <<">>";

                  cin >>a;


                  switch(a)

                  {

                           case 1:

                                system("cls");

                                 opisadd();

                                 goto menu2;

                                break;


                           case 2:

                                lista1();

                                goto menu2;

                                break;

                           case 3:

                                break;

                           case 4:

                                lista1();

                                goto menu2;

                                break;

                           case 5:

                                break;

                           case 6:

                                break;

                           case 7:

                                break;

                           case 8:

                                break;

                           case 9:

                                break;

                           case 10:

                                break;

                           case 11:

                                goto menu;

                                break;

                           default:

                                   cout <<"Wybrales nieprawidlowa wartosc";

                                   getch();

                                   goto menu2;

                                   break;


                  }


                  case 2:

                       menu3:

                       system("cls");

                       cout <<"[1] + opis"<
                       cout <<"[2] - opis"<
                       cout <<"[3] edytuj opis"<
                       cout <<"[4] lista"<
                       cout <<"[5] lista wypozyczonych"<
                       cout <<"[6] lista w bibliotece"<
                       cout <<"[7] export do pliku" <
                       cout <<"[8] import do pliku" <
                       cout <<"[9] powrot" <
                       cout <<""<
                       cout <<">>";

                       cin >> a;

                       switch(a)

                       {

                        case 1:

                             break;

                        case 2:

                             break;

                        case 3:

                             break;

                        case 4:

                             break;

                        case 5:

                             break;

                        case 6:

                             break;

                        case 7:

                             break;

                        case 8:

                             break;

                        case 9:

                             goto menu;

                             break;

                        default:

                                cout <<"Wybrales nieprawidlowa wartosc"<
                                getch();

                                goto menu3;

                                break;


                       }

                       break;

                       case 3:



                            break;


                  default:

                          cout <<"Wybrales nieprawidlowa wartosc"<
                          getch();

                          goto menu;

                          break;


    }


}

(Drobok) #18

W poprzednim poście napisałem że korzystając z struktury nie kaleczyłbyś swego programu 5tablicami do tego samego, a ty w strukturze bezmyślnie skopiowałeś te 5 tablic.

Użyj struktury jako typu zmiennej do tablicy :stuck_out_tongue:

Rób jak chcesz, ale nie mój że zrobiłeś jak ktoś mówił jak olałeś go zupełnie i zrobiłeś po swojemu :stuck_out_tongue:


(etam) #19

@karton16

Odpowiedz mi na pytania:

  1. Czego spodziewałbyś się po obiekcie klasy “ksiazka”?

  2. Jak powinna wyglądać tablica obiektów klasy “ksiazka”?

  3. Co reprezentują twoje klasy “zbiory” i “ksiazka”?


(karton16) #20

Wiem, wiem znowu zmieniłem koncepcję i w końcu ruszyłem się dalej, ale teraz mam problem z importem, gdyż importuje mi nie potrzebnie puste miejsca

#include 

#include 

#include 

#include 

#include 

using namespace std;

int indexz = 0; //index nastepnego elementu w tablicy zbiorow

int indexcz = 0; //i czytelnikow

int licznik = 0;


class zbiory

{

      public:

      string tytul;

      string autor;

      int rok_wydania;

      float cena;

      public:


                       void dodaj()

                       {

                            system("cls");

                            cout << "Podaj tytul:" << endl;

                            cin >> this->tytul;

                            cout << "Podaj autora ksiazki:" << endl;

                            cin >> this->autor;

                            cout << "Podaj rok wydania:" << endl;

                            cin >> this->rok_wydania;

                            cout << "Podaj cene:" << endl;

                            cin >> this->cena;

                        }

                        void usun_opis()

                        {

                         }

                         void edytuj_opis()

                         {

                          }

                          void listowanie()

                          {

                               cout << "Tytul: " << this->tytul << endl;

                               cout << "Autor: " << this->autor << endl;

                               cout << "Rok wydania: " << this->rok_wydania << endl;

                               cout << "Cena: " << this->cena << endl;

                               cout << "" << endl;

                           }

                           void lista_wypozyczen()

                           {

                            }

                            void lista_w_bibliotece()

                            {

                             }

                             void wypozyczenie()

                             {

                              }

                              void zwrot()

                              {

                               }


                };

class czytelnicy

{

      protected:

                string imie;

                string nazwisko;

                int klasa;

                public:

                       void dodajcz()

                       {

                            system("cls");


                                          cout << "Podaj imie: " << endl;

                                          cin >> this->imie;

                                          cout << "Podaj nazwisko: " << endl;

                                          cin >> this->nazwisko;

                                          cout << "Podaj klase: " << endl;

                                          cin >> this->klasa;

                                          }

                                          void listacz()

                                          {

                                               cout << "Imie: " << this->imie << endl;

                                               cout << "Nazwisko: " << this->nazwisko << endl;

                                               cout << "Klasa: " << this->klasa << endl;

                                               cout << " " << endl;

                                               }



                                        };

//int wielkosc;

zbiory *z[1000];   

czytelnicy *cz[1000];  


int main()

{

    system("color 0a");

    menu:

    //Beep(3000,100);

    system("cls");

    cout << "Biblioteka" << endl;

    cout << "1. Zbiory" << endl;

    cout << "2. Czytelnicy" << endl;

    cout << "3. Wyjscie" << endl;

    int menu;

    int czytelnik;

    int zbior;

    int nrz;

    int nrcz;

    ofstream plik;

    ifstream plik2;

    cin >> menu;

    switch(menu)

    {

                 case 1:

                      zb:

                      system("cls");

                      cout << "Wybrales 'Zbiory'!" << endl;

                      cout << "1. Dodaj opis" << endl;

                      cout << "2. Usus opis" << endl;

                      cout << "3. Edytuj opis" << endl;

                      cout << "4. Lista" << endl;

                      cout << "5. Lista wypozyczen" << endl;

                      cout << "6. Lista w bibliotece" << endl;

                      cout << "7. Wypozyczenie" << endl;

                      cout << "8. Zwrot" << endl;

                      cout << "9. Eksport do pliku" << endl;

                      cout << "10. Import do pliku" << endl;

                      cout << "11. Powrot" << endl;

                      //Beep(3000,100);

                      cin >> zbior;

                      switch(zbior)

                      {

                                    case 1:

                                         //dodaj opis

                                         z[indexz] = new zbiory;

                                         z[indexz]->dodaj();

                                         indexz ++;

                                         goto zb;

                                         break;

                                         case 2:

                                              do

                                              {

                                              cout << "Podaj numer zbioru: " << endl;

                                              cin >> nrz;

                                              }

                                              while(nrz>indexz);

                                              delete z[nrz-1];

                                              z[nrz-1]=z[indexz-1];

                                              indexz--;

                                              goto zb;

                                              //usun opis

                                              break;

                                              case 3:

                                                   do

                                                   {

                                                   cout << "Podaj numer zbioru: " << endl;

                                                   cin >> nrz;

                                                   }

                                                   while(nrz>indexz);

                                                   delete z[nrz-1];

                                                   z[nrz-1]= new zbiory;

                                                   z[nrz-1]->dodaj();

                                                   goto zb;

                                                   //edytuj opis

                                                   break;

                                                   case 4:

                                                        //lista

                                                        system("cls");

                                                        for(int i = 0; i < indexz; i ++)

                                                        {

                                                                z[i]->listowanie();

                                                                }

                                                                getch();

                                                                goto zb;

                                                        break;

                                                        case 5:

                                                             //lista wypozyczen

                                                             break;

                                                             case 6:

                                                                  //lista w bibliotece

                                                                  break;

                                                                  case 7:

                                                                       //wypozyczenie

                                                                       break;

                                                                       case 8:

                                                                            //zwrot

                                                                            break;

                                                                            case 9:

                                                                                 //eksport do pliku


                                                                                 plik.open("zbior.txt");

                                                                                 for(int i = 0; i < indexz; i ++)

                                                                                 {


                                                                                         plik << z[i]->tytul << endl;


                                                                                         plik << z[i]->autor << endl;


                                                                                         plik << z[i]->rok_wydania << endl;


                                                                                         plik << z[i]->cena << endl;

                                                                                         cout << endl;


                                                                                         }


                                                                                         goto zb;

                                                                                 break;

                                                                                 case 10:

                                                                                      //import do pliku

                                                                                      indexz=0;

                                                                                      plik2.open("zbior.txt");

                                                                                      if(plik2.good())

                                                                                      {

                                                                                                       do {

                                                                                                                z[indexz] = new zbiory;

                                                                                                                plik2 >> z[indexz] ->tytul;

                                                                                                                plik2 >> z[indexz] ->autor;

                                                                                                                plik2 >> z[indexz] ->rok_wydania;

                                                                                                                plik2 >> z[indexz] ->cena;

                                                                                                                indexz++;   


                                                                                                                }

                                                                                                                while(!plik2.eof());


                                                                                                      }

                                                                                                      else

                                                                                                      {

                                                                                                          cout <<"Error";

                                                                                                      }

                                                                                                      goto zb;

                                                                                      break;

                                    case 11:

                                    system("cls");

                                         goto menu;

                                         break;

                                         default:

                                              system("cls");

                                              cout << "Wybrales nieodpowiedna opcje." << endl;

                                              getch();

                                              goto menu;

                                              break;

                                         }

                      break;

                      case 2:

                           cz:

                           system("cls");

                           cout << "Wybrales 'Czytelnicy'!" << endl;

                      cout << "1. Dodaj opis" << endl;

                      cout << "2. Usus opis" << endl;

                      cout << "3. Edytuj opis" << endl;

                      cout << "4. Lista" << endl;

                      cout << "5. Lista wypozyczen" << endl;

                      cout << "6. Lista w bibliotece" << endl;

                      cout << "7. Eksport do pliku" << endl;

                      cout << "8. Import do pliku" << endl;

                      cout << "9. Powrot" << endl;

                      //Beep(3000,100);

                      cin >> czytelnik;

                      switch(czytelnik)

                      {

                                        case 1:

                                         //dodaj opis

                                         cz[indexcz] = new czytelnicy;

                                         cz[indexcz]->dodajcz();

                                         indexcz ++;

                                         goto cz;

                                         break;

                                         case 2:

                                              do

                                              {

                                              cout << "Podaj numer zbioru: " << endl;

                                              cin >> nrcz;

                                              }

                                              while(nrcz>indexcz);

                                              delete cz[nrcz-1];

                                              cz[nrcz-1]=cz[indexcz-1];

                                              indexcz--;

                                              goto cz;

                                              //usun opis

                                              break;

                                              case 3:

                                                   do

                                                   {

                                                   cout << "Podaj numer czytelnika: " << endl;

                                                   cin >> nrcz;

                                                   }

                                                   while(nrcz>indexcz);

                                                   delete cz[nrcz-1];

                                                   cz[nrcz-1]= new czytelnicy;

                                                   cz[nrcz-1]->dodajcz();

                                                   goto cz;

                                                   //edytuj opis

                                                   break;

                                                   case 4:

                                                        //lista

                                                        system("cls");

                                                        for(int i = 0; i < indexcz; i ++)

                                                        {

                                                                cz[i]->listacz();

                                                                }

                                                                getch();

                                                                goto cz;

                                                        break;

                                                        case 5:

                                                             //lista wypozyczen

                                                             break;

                                                             case 6:

                                                                  //lista w bibliotece

                                                                  break;

                                                                  case 7:

                                                                       //eksport do pliku

                                                                       break;

                                                                       case 8:

                                                                            //import do pliku

                                                                            break;

                                        case 9:

                                             system("cls");

                                             goto menu;

                                             break;

                                             default:

                                              system("cls");

                                              cout << "Wybrales nieodpowiedna opcje." << endl;

                                              getch();

                                              goto menu;

                                              break;

                                             }


                           break;

                           case 3:

                                system("cls");

                                cout << "Wybrales 'Wyjscie'!" << endl;

                                //Beep(3000,100);

                                getch();

                                return 0;

                                break;

                                default:

                                              system("cls");

                                              cout << "Wybrales nieodpowiedna opcje." << endl;

                                              getch();

                                              goto menu;

                                }

                                getch();

                                return 0;

                                }