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

Sortowanie po cenie ze struktury.

Ostatnio zmodyfikowano 2013-02-07 13:24
Autor Wiadomość
tomipnh
Temat założony przez niniejszego użytkownika
Sortowanie po cenie ze struktury.
» 2013-02-06 23:25:37
staram się wyświetlić wartości ze struktury w kolejności od największej cenowo do najmniejszej. Jednak mam głupi problem z przeniesieniem jednej liczby do drugiej.

C/C++
void pocenie() {
    ksiega inwentarz;
    float max, lastMax = 9999;
    fstream plik( "kinwentarzowa.dat", ios::binary | ios::in );
   
   
    for(;; ) {
        plik.read( reinterpret_cast < char *>( & inwentarz ), sizeof( inwentarz ) );
        max = 0;
       
        if( lastMax == inwentarz.cena ) {
            cout << "Numer inwentarzowy: " << inwentarz.nrinw << endl;
            cout << "Nazwa towaru: " << inwentarz.nazwa << endl;
            cout << "Rodzaj: " << inwentarz.rodzaj << endl;
            cout << "Ilosc: " << inwentarz.ilosc << endl;
            cout << "Cena: " << inwentarz.cena << endl;
            cout << "Dostawca: " << inwentarz.dostawca << endl;
            cout << "Data przyjecia: " << inwentarz.data << endl;
            cout << endl << "---------------------------------------------------" << endl;
        }
       
        if(( inwentarz.cena < lastMax ) &&( inwentarz.cena > max ) ) { cout << "przypisalem max"; max = inwentarz.cena; }
        if( plik.eof() ) { cout << "cykl"; lastMax = max; }
       
        if( lastMax = 0 ) { cout << "koniec"; break; }
    }
   
    getch();
    system( "cls" );
}

Zasadniczo chcialem zrobic proste sortowanie, zdaje sobie sprawę że to potwornie nie optymalne i brzydkie, ale takie miałem wymagania. Wszystko byłoby fajnie gdyby nie to, że na plik.eof() staje i dostaje spam 'cykli' zamiast zmienic wartosc i ruszyć dalej. Jak inaczej sprawdzić czy cykl miał miejsce bez większego utrudniania kodu?
P-75881
jsc
» 2013-02-06 23:28:54
Zazwyczaj sizeof sprawdza się pętli while lub do-while
P-75883
tomipnh
Temat założony przez niniejszego użytkownika
» 2013-02-06 23:58:38
próbowałem z przenosić się na początek pliku ale to nic nie daje, nadal mam spam
P-75885
krzyk
» 2013-02-07 09:36:03
Jeśli inwentarz.nazwa to string a przypuszczam że jest to sizeof niezwróci jego długości.
C/C++
std::string a;
std::cout << sizeof( a ) << std::endl;
a = "bardzo długi tekst";
std::cout << sizeof( a ) << std::endl;

Musisz "ręcznie" pobierać każdy element z pliku lub użyć
char nazwa[ dlugosc ];
P-75894
tomipnh
Temat założony przez niniejszego użytkownika
» 2013-02-07 12:26:33
mi chodzi o samo przeniesienie się do początku pliku, do ponownego przemielenia pliku albo zainicjowanie ponownego cyklu, po całym pliku.

Próbowalem seekg do początku pliku robić ale nadal stoje z zamazanym ekranem, continue też mi nic nie dało. Identyczny sposób na tablicach działał, na strukturze stoi. Cholera mnie trafia, nie mogę wczytać tego do tablicy i tam sobie posortować, muszę robić wszystko na pliku.

W związku z tym chciałem przemielić plik, znajdując max, którego potem przypisuje dla lastMax i miele ponownie cały plik do znalezenia kolejnego max ale mniejszego od lastMax tak by wyświetlić całość sortując po cenie. Ale przypisanie wartości z max do lastMax musi się odbywać po przejechaniu pętlą po całym pliku, przed przeczytaniem 1 wartości ponownie.
P-75897
krzyk
» 2013-02-07 12:54:48
eof sprawdzaj zaraz po read bo teraz operujesz na danych które nie zostały odczytane.
C/C++
plik.read( reinterpret_cast < char *>( & inwentarz ), sizeof( inwentarz ) );
if( plik.eof() ) {
    plik.clear();
    plik.seekg( 0 );
    // cos tam cos tam
    continue;
}
P-75898
tomipnh
Temat założony przez niniejszego użytkownika
» 2013-02-07 13:24:02
To bez znaczenia czy tego ifa mam na początku czy to mój 3ci if, dla każdego zakręcenia pętli sprawdzane są wszystkie warunki.
przestawiłem linie    
if( plik.eof() ) { cout << "zakonczylem cykl"; plik.clear(); plik.seekg( 0, ios::beg ); lastMax = max; continue; }
            na początek

Nadal jednak dostaje nieskończoną ilość zakonczylem cykl


----
Jak zwykle pierdoła, zasadniczo winą była zmiana maxa przy każdym ruchu pętli, przypisując 0 do maxa wewnatrz warunku na eofa wszystko działa.
P-75899
« 1 »
  Strona 1 z 1