Kefirek Temat założony przez niniejszego użytkownika |
Sortowanie pola struktury (tab char) w wektorze » 2013-12-23 11:28:43 Witam forumowiczów Program prosi o wprowadzenie danych, następnie zapisuje te dane do pliku, potem odczyt z pliku do struktur vectora, następnie sortowanie funkcją sort(algorithm) Oto wynik sortowania po kilku razowym wprowadzeniu i sortowaniu danych: Angela Merker Abstract Tomasz Altman Angela Merker Borton Tomasz Bastek Jan Ceynowa Jan Cassio Products Don Kichot Dom Husker Don Englert Jan Fox J Jan Hus Kolejność alfabetyczna pierwszych liter jest zachowana natomiast po wprowadzeniu drugiej takiej samej nazwy Angela Merker nie wygląda już to dobrze, nie napawa też optymizmem kolejność Don Kichot Dom Husker. Proszę o jakieś sugestie. Poniżej zamieszczam część kodu odpowiedzialną za zapis do pliku oraz sortowanie danych: void Odczyt_do_ekranu() { ifstream do_ekranu( "Kontrahenci.txt", ios::in | ios::beg | ios::binary ); klient kup; cout << "Odczyt z pliku : " << endl; while( do_ekranu.read(( char * ) & kup, sizeof( kup ) ) ) { vektor.push_back( kup ); cout << vektor[ j ].nazwa << endl; cout << vektor[ j ].kg << endl; cout << vektor[ j ].price << endl; ++j; } sort( vektor.begin(), vektor.end(), Ksort ); cout << "Po sortowaniu :" << j << endl; for( int i = 0; i < j; i++ ) cout << vektor[ i ].nazwa << endl; }
bool Ksort( const klient & x, const klient & y ) { for( int i = 0; i < j; i++ ) return x.nazwa[ i ] < y.nazwa[ i ]; }
Pozdrawiam i życzę Wesołych Świąt Kefirek |
|
pekfos |
» 2013-12-23 14:58:00 Ksort() jest złe. Zwraca wynik w pierwszym obiegu. Zwracaj true w warunku w pętli i false na końcu funkcji (albo na odwrót). Możesz też użyć std::lexicographical_compare<>(), albo po prostu porównuj dwa stringi, przy użyciu, przeciążonych dla std::string, operatorów porównania. |
|
Kefirek Temat założony przez niniejszego użytkownika |
» 2013-12-23 22:30:05 Poprawiłem funkcję Ksort : bool Ksort( const klient & x, const klient & y ) { for( int i = 0; i < j; i++ ) if( x.nazwa[ i ] < y.nazwa[ i ] ) return true; else return false; }
kompilator podaje ostrzeżenie:"""""Ostrzeżenie 1 warning C4715: "Ksort” : niewszystkie ścieżki kodu zwracają wartość c:\users\dell\documents\visual studio 2012\projects\vektor\vektor\vektor.cpp 123""" Niestety nie pomogło, może gdzieś jest jeszcze błąd w Ksort???? Pozdrawiam Kefirek |
|
Adik80 |
» 2013-12-24 11:19:06 A co ta petla ma dokladnie robic? dostajesz referencje do 2 instancji, i masz stwierdzic ktora jest 'mniejsza' czyli jesli chesz posortowac po nazwie robisz { return x.nazwa<y.nazwa; } (lub jesli nie cehsz uwzgledniac wilkosci liter to tak jak napisal perfkos) |
|
pekfos |
» 2013-12-24 11:51:37 Teraz ta funkcja robi dokładnie to samo (co wcześniej). Usuń słowo else. Kto..? |
|
Adik80 |
» 2013-12-24 12:11:26 Nie calkiem. 'j' wyglada jak zmienna globalna przechowujaca ilosc klientow, wiec x.nazwa nie sprawdza calego stringu/wyjezdza poza dlugosc. Sorry za literowke. |
|
DejaVu |
» 2013-12-24 12:11:59 Jeszcze jedna porada: nie używaj zmiennej o nazwie 'j' w swoich programach. Używaj 'i' używaj 'k', używaj każdej innej litery, ale nie 'j'. Później źle się czyta kod w którym masz 'i' oraz 'j' i się zastanawiasz 'czy taka była intencja autora' oraz trudniej znaleźć przez to błąd w kodzie.
Niestety nazewnictwo zmiennych 'i' oraz 'j' zostało skutecznie rozpowszechnione, a tak na dobrą sprawę powinno się to zwalczać, bo po prostu źle się później analizuje wszelkie algorytmy, które używają tych dwóch nazw zmiennych.
/edit:
literka 'l' też nie jest trafionym pomysłem, więc 'j' oraz 'l' nie zalezam używać w swoim kodzie :) |
|
Kefirek Temat założony przez niniejszego użytkownika |
» 2013-12-24 12:53:41 Do Pekfos(sorry za błędne wpisanie Twojego nicka): Po poprawieniu czyli pozbyciu się "else" program wywala błąd : Debug assertation faild! ...i dalej Expression invalid operator < bool Ksort( const klient & x, const klient & y ) { for( int i = 0; i < j; i++ ) if( x.nazwa[ i ] < y.nazwa[ i ] ) return true; return false; }
czyli dalej coś nie tak...... |
|
« 1 » 2 3 |