Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Sortowanie pola struktury (tab char) w wektorze

Ostatnio zmodyfikowano 2013-12-24 13:58
Autor Wiadomość
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:

C/C++
void Odczyt_do_ekranu() //wczytanie z pliku do pól struktury i odczyt na ekran
{
   
    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
P-99916
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.
P-99939
Kefirek
Temat założony przez niniejszego użytkownika
» 2013-12-23 22:30:05
Poprawiłem funkcję Ksort :

C/C++
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
P-100015
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)
P-100023
pekfos
» 2013-12-24 11:51:37
Teraz ta funkcja robi dokładnie to samo (co wcześniej). Usuń słowo else.

perfkos
Kto..?
P-100024
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.
P-100030
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 :)
P-100031
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 <

C/C++
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......
P-100032
« 1 » 2 3
  Strona 1 z 3 Następna strona