Sheil Temat założony przez niniejszego użytkownika  | 
Proste zadanko na strukturach » 2013-06-16 18:49:09 Witam, mam problem z nastepującym zadaniem: Napisac strukture Figura zawierajaca nazwe, ilosc bokow i dlugosci tych bokow z czego funkcje maja wygladac tak jak w przedstawionym przeze mnie kodzie. Funkcje: wczytaj, sortuj (wedlug paradygmatu boolowskiego), usunac. (w zadaniu byly jeszce 2 funkcje ale ich nie ruszalem bo reszta i tak nie dziala) program się kompiluje ale nie dziala tak jak powinien, tworzy się jakaś nieskończona pętla albo problemy z pamiecią lub jeszce cos innego. Sam nie wiem, byłbym wdzięczny jakby ktos mnie nakierował w czym jest problem. #include <iostream> #include <string> #include <fstream>
  using namespace std;
 
  struct Figura {     string nazwa;     int ilosc;     int * dl_boku;      };
  bool wczytaj( const char * nazwa, Figura *& tablica, int & ilosc_figur ); void sortuj( Figura * tablica, int ilosc_figur, bool( * pred )( const Figura &, const Figura & ) ); bool pred( const Figura & a, const Figura & b ); int main( int argc, char ** argv ) {     Figura * tablica = 0;     int ilosc_figur = 0;     if( wczytaj( argv[ 1 ], tablica, ilosc_figur ) )     {         sortuj( tablica, ilosc_figur, pred );     }      } void sortuj( Figura * tablica, int ilosc_figur, bool( * pred )( const Figura &, const Figura & ) ); bool wczytaj( const char * nazwa, Figura *& tablica, int & ilosc_figur ) {     ifstream pwej;     pwej.open( nazwa );     if( !pwej )     {         cerr << "blad wczytania pliku";         return false;     }     pwej >> ilosc_figur;               tablica = new Figura[ ilosc_figur ];     for( int i = 0; i < ilosc_figur; i++ )     {         pwej >> tablica[ i ].nazwa >> tablica[ i ].ilosc;         tablica[ i ].dl_boku = new int[ tablica[ i ].ilosc ];                  for( int j = 0; j < tablica[ i ].ilosc; j++ )         {             pwej >> tablica[ i ].dl_boku[ j ];         }              }     pwej.close();     return true; } void sortuj( Figura * tablica, int ilosc_figur, bool( * pred )( const Figura &, const Figura & ) ) {     Figura pomoc;     int i = 0;     for(; i < ilosc_figur; i++ )     {         for( int j = 0; j < ilosc_figur; j++ )         {             if( pred );             else             {                 pomoc = tablica[ i ];                 tablica[ i ] = tablica[ j ];                 tablica[ j ] = pomoc;             }                      }              }     cout << "najwiekszy jest: " << tablica[ i ].nazwa;      } bool pred( const Figura & a, const Figura & b ) {     if( a.ilosc > b.ilosc ) return true;     else     {         return false;     }      } void usun( Figura *& tablica, int & liczba_figur ) {     for( int i = 0; i < liczba_figur; i++ )          delete[] tablica[ i ].dl_boku;          delete[] tablica;
  // EDIT  gapa jestem :) nie podalem jak powinien wygladac plik tekstowy: 5 // liczba figur trapez 4 2 2 1 1// kolejno nazwa, liczba bokow i dlugosci tych bokow prostokat 2 4 3 itp.  | 
 | 
zimniok  | 
Dla 3 figur » 2013-06-16 20:30:17 Przesyłam kod zmodyfikowany do wczytania 3 figur z pliku "figury.txt". W funkcji sortuj nie były podane argumenty dla funkcji porównującej pred. Na twoim miejscu stworzyłbym nową zmienną "największy" zamiast wywalać iterator przed pętle for. Moim zdaniem jest to nieintuicyjne i dlatego pojawiał się błąd - program próbował wywołać cout<< "najwiekszy jest: " << tablica[ i ].nazwa<<endl i tym samym wychodził poza zakres tablicy. Zawartość pliku figury.txt: 3 osmiokat 8 4 4 4 4 4 4 4 4 prostokat 4 2 2 1 1 trapez 4 2 3 1 1
  Zawartość pliku źródłowego: #include <iostream> #include <string> #include <fstream>
  using namespace std;
 
  struct Figura {     string nazwa;     int ilosc;     int * dl_boku;      };
  bool wczytaj( const char * nazwa, Figura *& tablica, int & ilosc_figur ); void sortuj( Figura * tablica, int ilosc_figur, bool( * pred )( const Figura &, const Figura & ) ); bool pred( const Figura & a, const Figura & b ); void wypisz( Figura * tablica, int ilosc_figur ) {     for( int i = 0; i < ilosc_figur; i++ )     {         cout << tablica[ i ].nazwa << endl;         cout << tablica[ i ].ilosc << ": ";         for( int j = 0; j < tablica[ i ].ilosc; j++ )              cout << tablica[ i ].dl_boku[ j ] << " ";                  cout << endl;     } } int main( int argc, char ** argv ) {     Figura * tablica;     int ilosc_figur = 2;     if( wczytaj( "figury.txt", tablica, ilosc_figur ) )     {         wypisz( tablica, ilosc_figur );         sortuj( tablica, ilosc_figur, pred );         wypisz( tablica, ilosc_figur );     }      } void sortuj( Figura * tablica, int ilosc_figur, bool( * pred )( const Figura &, const Figura & ) ); bool wczytaj( const char * nazwa, Figura *& tablica, int & ilosc_figur ) {     ifstream pwej;     pwej.open( nazwa );     if( !pwej )     {         cerr << "blad wczytania pliku";         return false;     }     pwej >> ilosc_figur;               tablica = new Figura[ ilosc_figur ];     for( int i = 0; i < ilosc_figur; i++ )     {         pwej >> tablica[ i ].nazwa >> tablica[ i ].ilosc;         tablica[ i ].dl_boku = new int[ tablica[ i ].ilosc ];         for( int j = 0; j < tablica[ i ].ilosc; j++ )         {             pwej >> tablica[ i ].dl_boku[ j ];         }              }     pwej.close();     return true; } void sortuj( Figura * tablica, int ilosc_figur, bool( * pred )( const Figura &, const Figura & ) ) {     Figura pomoc;     int i = 0;     for(; i < ilosc_figur; i++ )     {         for( int j = 0; j < ilosc_figur; j++ )         {             if( pred( tablica[ i ], tablica[ j ] ) );             else             {                 pomoc = tablica[ i ];                 tablica[ i ] = tablica[ j ];                 tablica[ j ] = pomoc;             }                      }              }     cout << "najwiekszy jest: " << tablica[ i - 1 ].nazwa << endl;      } bool pred( const Figura & a, const Figura & b ) {     if( a.ilosc > b.ilosc ) return true;     else     {         return false;     }      } void usun( Figura *& tablica, int & liczba_figur ) {     for( int i = 0; i < liczba_figur; i++ )          delete[] tablica[ i ].dl_boku;          delete[] tablica; }
      | 
 | 
Sheil Temat założony przez niniejszego użytkownika  | 
» 2013-06-16 22:18:45 Dziękuje ślicznie, zrozumiałem na czym mój błąd polegał :) Program mi się krzaczył ponieważ z mojego niedopatrzenia nie wpisałem tyle figur ile powinno być w pliku tekstowym, zamiast 5 jak to w moim pliku było, wpisałem 4 :) wtedy już bym zauważył inne błędy :)  | 
 | 
|  « 1 »  |