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 » |