1. Ta strona wykorzystuje ciasteczka (cookies) w celu: utrzymania sesji zalogowanego Użytkownika, gromadzenia informacji związanych z korzystaniem z serwisu, ułatwienia Użytkownikom korzystania z niego, dopasowania treści wyświetlanych Użytkownikowi oraz tworzenia statystyk oglądalności czy efektywności publikowanych reklam.Użytkownik ma możliwość skonfigurowania ustawień cookies za pomocą ustawień swojej przeglądarki internetowej. Użytkownik wyraża zgodę na używanie i wykorzystywanie cookies oraz ma możliwość wyłączenia cookies za pomocą ustawień swojej przeglądarki internetowej. Dowiedz się więcej.
  2. Rejestracja na forum zamknięta, dostęp tylko przez zaproszenia. Gdzie znajdę zaproszenia?

  3. Zamknij zawiadomienie

Program C++ (ksiazka telefoniczna oparta na klasach + zapis/odczyt do .txt)

Temat na forum 'Problemy rozwiązane' rozpoczęty przez Ramirez, Czerwiec 16, 2012.

Status Tematu:
Zamknięty.
  1. Ramirez

    Ramirez Podporucznik
    Konsul Podporucznik

    Dołączył:
    Wrzesień 28, 2007
    Posty:
    462
    Polubienia:
    2
    Witam

    Zrobiłem program który ma spełniać funkcję książki telefonicznej oparty na klasie. Problem w tym, że wyszukiwanie osoby po nazwisku nie działa tak jakbym chciał. Gdy dodam więcej niż 1 osobę to program podczas wyszukiwania widzi tylko 1 dodaną osobę, a resztę olewa tzn. jeżeli np. 1 osoba miała na nazwisko Kowalski to program bezbłędnie, tak jak zamierzałem podaje imię i nazwisko oraz telefon danej osoby, a jeżeli ten Kowalski byłby dodany jako 2gi to przeleciałby cały plik tekstowy i wyświetlił komunikat "Blednie podano nazwisko. Sprobuj ponownie!". Może coś pochrzaniłem w tych operacjach na plikach (najbardziej prawdopodobne, że coś w case 2 jest źle (część kodu odpowiedzialna za wyszukiwanie)).

    Kod:
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    class ksiazka
    {
     public:
             char imie[20];
             char nazwisko[20];
             int  numer;
             
             void dodaj (void);
             void wyswietl (void);
             ~ksiazka(void); //destruktor
    };
    
    void ksiazka::dodaj(void)
    {
     cout << "Podaj imie: ";
     cin >> imie;
     cout << "Podaj nazwisko: ";
     cin >> nazwisko;
     cout << "Podaj numer telefonu: ";
     cin >> numer;
     cout << endl;
    };
    
    void ksiazka::wyswietl (void)
    {
     system ("cls");
     cout << "Znaleziona osoba to: \n\n" << imie << " " << nazwisko << endl;
     cout << "Telefon: " << numer << endl << endl;
    }
    
    ksiazka::~ksiazka(void)
    {
     delete[] imie;
     delete[] nazwisko;
    }
    
    int main(int argc, char *argv[])
    {   
        int a, miejsce, length;
        char szukaj[20];
        bool exit = false;
        ksiazka osoba;
        
        do
        {
         cout << "Ksiazka telefoniczna by Ramirez\n\n";
         cout << "-----------------MENU----------\n\n";
         cout << "1. Dodaj nowa osobe\n";
         cout << "2. Wyszukaj osobe po nazwisku\n";
         cout << "3. Wyjdz\n\n";
         cout << "-------------------------------\n";
         
         int wybierz = 0;
         cout << "Wybierz dzialanie: ";
         cin >> wybierz;
        
         if (wybierz >= 1 && wybierz <=3)
         {
          system("cls");
          switch (wybierz)
          {
           case 1:
                {             
                 system("cls");
                 osoba.dodaj();
                 
                 fstream plik;
                 plik.open( "ksiazka_telefoniczna.txt", ios::in | ios::out );
                 if( plik.good() == true )
                 {
                  //tu operacje na pliku (zapis/odczyt)
                  plik.seekg(0, ios::end);
                  plik.write((const char*)&osoba, sizeof(osoba));
                  
                  plik.close();
                 }
     
                 system ("pause");
                 system ("cls");
                 break;
                }
           case 2:
                {
                 cout << "Podaj nazwisko szukanej osoby: ";
                 cin >> szukaj;
                 
                 fstream plik;
                 plik.open( "ksiazka_telefoniczna.txt", ios::in | ios::out );
                 if( plik.good() == true )
                 {
                  //tu operacje na pliku (zapis/odczyt)
                  plik.seekg(0, ios::end);
                  length = plik.tellg();
                  miejsce = length/sizeof(osoba);
                  plik.seekg(0, ios::beg);
                 
         		 for(a=0;a<miejsce;a++)
    		     {
                  plik.read((char*)&osoba, sizeof(osoba));
                  if(!strcmp(osoba.nazwisko,szukaj))
    			  {
                   osoba.wyswietl();
                   system("pause");
                   system("cls");
                   break;
                  } 
                  plik.close();
                 }
                 
                }
     
                 if(a==miejsce)
    		     {
    			  cout << "Blednie podano nazwisko. Sprobuj ponownie!" << endl;
    			  getchar();
    			  getchar();
    			  system ("cls");
                 }
    		
                 break;
                }
           case 3:
                system ("cls");
                cout << "Program konczy dzialanie.\n\n";
                exit = true;
                break;
          }
         }
         else
         {
          system ("cls");
          cout << "Wprowadziles bledny numer.\n";
          
          cout << "Czy chcesz wyjsc z programu?(t/n)\n";
          char wybor[1];
          cin >> wybor[0];
          if (wybor[0] == 't')
          {
           system ("cls");
           cout << "Program konczy dzialanie.\n\n";
           exit = true;
          }
          else if (wybor [0] == 'n') 
          {
           system ("cls");
          }
          else
          {
           system ("cls");
           cout << "Wprowadziles zla cyfre :(\n";
           cout << "Program konczy dzialanie.\n\n";
           exit = true;
          }
         }
               
        } while (exit!=true);
        
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    
    Tutaj lepiej widać: http://wklej.org/hash/f025ee8f2e8/
    Jeżeli ktoś się na tym zna i miałby chwilę wolnego czasu to proszę o pomoc :rolleyes:
     
    #1 Ramirez, Czerwiec 16, 2012
    Ostatnia edycja: Czerwiec 16, 2012
  2. Sympatyczny

    Sympatyczny Kapitan
    Programista Kapitan

    Dołączył:
    Lipiec 15, 2006
    Posty:
    9804
    Polubienia:
    30
    Nie przeczytałem kodu, na C++ się nie znam, ale problem wygląda tak, jakbyś miał problemy rekurencyjne ;)
    Funkcja szukająca nazwisko musi/powinna być rekurencyjna.

    Jeżeli jest, to sorry ;)
     
    #2 Sympatyczny, Czerwiec 16, 2012
    Ostatnia edycja: Czerwiec 16, 2012
  3. Ramirez

    Ramirez Podporucznik
    Konsul Podporucznik

    Dołączył:
    Wrzesień 28, 2007
    Posty:
    462
    Polubienia:
    2
    A bardziej na chłopski rozum? :D
     
  4. Sympatyczny

    Sympatyczny Kapitan
    Programista Kapitan

    Dołączył:
    Lipiec 15, 2006
    Posty:
    9804
    Polubienia:
    30
    Chyba jednak się pomyliłem, bo widzę, że ty tam czytasz linijka po linijce z pliku (?)

    a funkcja rekurencyjna, to taka, co wywołuje się sama.
    Przykład - Rekurencyjna definicja silni:
    Kod:
    def silnia(n):
        if n == 0: return 1
        else: return n* silnia(n-1)
    
    Jest jeszcze iteracyjna definicja:
    Kod:
    def silnia(n):
        k = 1
        for i in range(1,n+1):
            k*=i
        return k
    
    Myślałem, że pomogę, myliłem się ;) może znajdzie się ktoś od c++ ;)
     
  5. Ramirez

    Ramirez Podporucznik
    Konsul Podporucznik

    Dołączył:
    Wrzesień 28, 2007
    Posty:
    462
    Polubienia:
    2
    Powyrzucałem trochę zbędnego kodu:

    Kod:
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <cstring>
    
    using namespace std;
    
    class ksiazka
    {
        public:
            char imie[20];
            char nazwisko[20];
            int  numer;   
            void dodaj();
            void wyswietl();
    };
    
    void ksiazka::dodaj(void)
    {
        cout << "Podaj imie: ";
        cin >> imie;
        cout << "Podaj nazwisko: ";
        cin >> nazwisko;
        cout << "Podaj numer telefonu: ";
        cin >> numer;
    };
    
    void ksiazka::wyswietl (void)
    {
        system ("cls");
        cout << "Znaleziona osoba to: \n\n" << imie << " " << nazwisko << "\n";
        cout << "Telefon: " << numer << "\n\n";
    }
    
    int main()
    {   
        int a, miejsce, length;
        char szukaj[20];
        bool exit = false;
        ksiazka osoba;
        
        do
        {
            cout << "Ksiazka telefoniczna by Ramirez\n\n";
            cout << "-----------------MENU----------\n\n";
            cout << "1. Dodaj nowa osobe\n";
            cout << "2. Wyszukaj osobe po nazwisku\n";
            cout << "3. Wyjdz\n\n";
            cout << "-------------------------------\n";
         
            int wybierz = 0;
            cout << "Wybierz dzialanie: ";
            cin >> wybierz;
        
            if (wybierz >= 1 && wybierz <=3)
            {
                system("cls");
                switch (wybierz)
                {
                        case 1:
                        {   
                                      
                            system("cls");
                            osoba.dodaj();
                                                    
                            fstream plik;
                            plik.open( "ksiazka_telefoniczna.txt", ios::in | ios::out );
                            if( plik.good() )
                            {
                                //tu operacje na pliku (zapis/odczyt)
                                plik.seekg(0, ios::end);
                                plik.write((const char*)&osoba, sizeof(osoba));
                                plik << endl;
                                
                                plik.close();
                            }
    
                
                            system ("pause");
                            system ("cls");
                            break;
                        }
                        case 2:
                        {
                            cout << "Podaj nazwisko szukanej osoby: ";
                            cin >> szukaj;
                 
                            fstream plik;
                            plik.open( "ksiazka_telefoniczna.txt", ios::in | ios::out );
                            if( plik.good() )
                            {
                                
                                //tu operacje na pliku (zapis/odczyt)
                                plik.seekg(0, ios::end);
                                length = plik.tellg();
                                miejsce = length/sizeof(osoba);
                                plik.seekg(0, ios::beg);
                 
         		                for(a=0;a<miejsce;a++)
    		                    {
                                    plik.read((char*)&osoba, sizeof(osoba));
                                 
    							    if(!strcmp(osoba.nazwisko,szukaj))
    			                    {
                                        osoba.wyswietl();
                                        system("pause");
                                        system("cls");
                                        break;
                                    } 
                                    plik.close();
                                }
                 
                            }
     
                            if(a==miejsce)
    		                {
    			                cout << "Blednie podano nazwisko. Sprobuj ponownie!\n";
    			                getchar();
    			                getchar();
    			                system ("cls");
                            }
    		
                            break;
                        }
                        case 3:
                            system ("cls");
                            exit = true;
                            break;
                        }
            }
            else
            {
                system ("cls");
                cout << "Wprowadziles bledny numer.\n";
          
                cout << "Czy chcesz wyjsc z programu?(t/n)\n";
                char wybor;
                cin >> wybor;
                
                if (wybor == 't')
                {
                    system ("cls");
                    exit = true;
                }
                else if (wybor == 'n') 
                {
                    system ("cls");
                }
                else
                {
                    system ("cls");
                    exit = true;
                }
            }       
        } while (exit!=true);
        
        return EXIT_SUCCESS;
    }
    
    
    I już wiem na czym polega mój błąd.

    Dane z imieniem i nazwiskiem Jan Kowalski wraz z numerem telefonu 123456789 i Adam Nowak z numerem telefonu 987654321 zapisywane są tak:

    Kod:
    Jan   >     ژŘtćů2ŔKowalski    î¨Â´ţ˙˙˙Í[
    Adam  >     ژŘtćů2ŔNowak ki    î¨Â´ţ˙˙˙±hŢ:
    
    Jak można zauważyć dane nadpisują się w tablicy. Nie wiem już co mam z tym zrobić - czy zrobić to na wskaźnikach żeby zarezerwować tyle pamięci ile na daną zmienną potrzeba, czy próbować jakoś oczyścić dane z klasy po każdym dodaniu nowej osoby.
    Help :p
     
  6. Ramirez

    Ramirez Podporucznik
    Konsul Podporucznik

    Dołączył:
    Wrzesień 28, 2007
    Posty:
    462
    Polubienia:
    2
    Dobra poradziłem sobie sam. Temat można zamknąć.

    Kod jak ktoś jest ciekawy:
    Kod:
    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <cstring>
    
    using namespace std;
    
    class ksiazka
    {
        public:
            char imie[20];
            char nazwisko[20];
            int  numer;   
            void dodaj();
            void wyswietl();
    };
    
    void ksiazka::dodaj(void)
    {
        strcpy(imie, "                   ");
        strcpy(nazwisko, "                   ");
        cout << "Podaj imie: ";
        cin >> imie;
        cout << "Podaj nazwisko: ";
        cin >> nazwisko;
        cout << "Podaj numer telefonu: ";
        cin >> numer;
    };
    
    void ksiazka::wyswietl (void)
    {
        system ("cls");
        cout << "Znaleziona osoba to: \n\n" << imie << " " << nazwisko << "\n";
        cout << "Telefon: " << numer << "\n\n";
    }
    
    int main()
    {   
        int a, miejsce, length;
        char szukaj[20];
        bool exit = false;
        ksiazka osoba;
        
        do
        {
            cout << "Ksiazka telefoniczna by Ramirez\n\n";
            cout << "---------------------------------\n\n";
            cout << "1. Dodaj nowa osobe\n";
            cout << "2. Wyszukaj osobe po nazwisku\n";
            cout << "3. Wyjdz\n\n";
            cout << "---------------------------------\n";
         
            int wybierz = 0;
            cout << "Wybierz dzialanie: ";
            cin >> wybierz;
        
            if (wybierz >= 1 && wybierz <=3)
            {
                system("cls");
                switch (wybierz)
                {
                        case 1:
                        {   
                                      
                            system("cls");
                            osoba.dodaj();
                                                    
                            fstream plik("ksiazka_telefoniczna.txt", ios::out | ios::app);
                            if( plik.good() )
                            {                        
                                plik.write((const char*)&osoba, sizeof(osoba));
                                plik.close();
                            } 
                            
                            system ("pause");
                            system ("cls");
                            break;
                        }
                        case 2:
                        {
                            cout << "Podaj nazwisko szukanej osoby: ";
                            cin >> szukaj;
                 
                            fstream plik;
                            plik.open( "ksiazka_telefoniczna.txt", ios::in);
                            if( plik.good() )
                            {
                                
                                //tu operacje na pliku (zapis/odczyt)
                                plik.seekg(0, ios::end);
                                length = plik.tellg();
                                miejsce = length/sizeof(osoba);
                                plik.seekg(0, ios::beg);
                                
                                for(a=0;a<miejsce;a++)
                                {
                                    plik.read((char*)&osoba, sizeof(osoba));
                                 
    							    if(!strcmp(osoba.nazwisko,szukaj))
    			                    {
                                        osoba.wyswietl();
                                        system("pause");
                                        system("cls");
                                        break;
                                    }  
                                }
                                plik.close(); 
                                
                            }
     
                            if(a==miejsce)
    		                {
    			                cout << "Blednie podano nazwisko. Sprobuj ponownie!\n";
    			                getchar();
    			                getchar();
    			                system ("cls");
                            }
    		
                            break;
                        }
                        case 3:
                            system ("cls");
                            exit = true;
                            break;
                        }
            }
            else
            {
                system ("cls");
                cout << "Wprowadziles bledny numer.\n";
          
                cout << "Czy chcesz wyjsc z programu?(t/n)\n";
                char wybor;
                cin >> wybor;
                
                if (wybor == 't')
                {
                    system ("cls");
                    exit = true;
                }
                else if (wybor == 'n') 
                {
                    system ("cls");
                }
                else
                {
                    system ("cls");
                    exit = true;
                }
            }       
        } while (exit!=true);
        
        return EXIT_SUCCESS;
    }
    
    
     
Wczytywanie...
Status Tematu:
Zamknięty.