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?

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:
    1
    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:
    1
    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:
    1
    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:
    1
    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.