Sortowanie po imieniu
Ostatnio zmodyfikowano 2015-12-08 20:56
Garniturek Temat założony przez niniejszego użytkownika |
Sortowanie po imieniu » 2015-12-06 19:30:40 Witam, mam do napisania program, który posortuje mi dane ze struktur po imieniu, program kompiluje się normalnie, ale sortowanie wykonuje się źle. program nie sortuje oraz po 'sortowaniu' nie wyświetla się ostatni element. Pomocy :) #ifndef Header.h #define Header_h #include <iostream> #include <stdio.h> #include <string>
using namespace std;
struct ocena { string przedmiot; float wartosc; };
struct indeks { string imie; string nazwisko; ocena oceny[ 15 ]; int n; }; void sortowanie( indeks * o, int & n ); void wyswietl( const indeks & o, int & ile ); void pobierz( indeks * o, int & ile ); #endif void sortowanie( indeks * o, int & n ) { cout << n << endl; for( int i = 1; i < n - 1; i++ ) { for( int j = 0; j < 4; j++ ) { if( o[ i ].imie[ j ] < o[ i - 1 ].imie[ j ] ) { indeks zmienna; zmienna = o[ i ]; o[ i ] = o[ i - 1 ]; o[ i - 1 ] = zmienna; break; } else if( o[ i ].imie[ j ] > o[ i - 1 ].imie[ j ] ) break; } } } void pobierz( indeks * o, int & ile ) { cout << "Podaj imie i nazwisko: "; cin >> o->imie >> o->nazwisko; o->n = 0; for( int i = 0; i < ile; i++ ) { cout << "Najpierw przedmiot, potem ocena "; cin >> o->oceny[ o->n ].przedmiot >> o->oceny[ o->n ].wartosc; o->n++; } } void wyswietl( const indeks & o, int & ile ) { cout << o.imie << " " << o.nazwisko; cout << endl; int a = o.n - 1; for( int i = 0; i < ile; i++ ) { cout << o.oceny[ a ].przedmiot << " " << o.oceny[ a ].wartosc; a--; cout << endl; } }
int main() { int ile; int n = 1; char wybor; indeks indeksy[ 30 ]; cout << "Podaj ile przedmiotow chcesz brac pod uwage: "; cin >> ile; for(;; ) { cout << "Aby pobrac dane wcisnij: 1" << endl; cout << "Aby wyswietlic dane wcisnij: 2" << endl; cout << "Aby posortowac wedlug imienia: 3" << endl; cout << "Twoj wybor to: "; cin >> wybor; switch( wybor ) { case '1': { system( "cls" ); pobierz( & indeksy[ n ], ile ); n++; system( "cls" ); } break; case '2': { system( "cls" ); for( int j = 1; j <= n - 1; j++ ) { wyswietl( indeksy[ j ], ile ); } } break; case '3': { system( "cls" ); sortowanie( & indeksy[ n - 1 ], n ); } break; |
|
pepe450 |
» 2015-12-06 22:02:40 czemu akurat drugi for ma j<4? for( int j = 0; j < 4; j++ ) możesz pokazać cały kod ? :)
czytałeś o algorytmach sortujących? możesz zaimplementować np sortowanie przez wybór bądź wstawianie ewentualnie babelkowe zakładając że masz mało danych do sortowania |
|
ArgonZapan |
» 2015-12-06 23:58:26 for( int i = 1; i < n - 1; i++ ) <- W kolejnej pętli sprawdzasz do tyłu, więc tutaj nie musisz odejmować tej jedynki
|
|
Garniturek Temat założony przez niniejszego użytkownika |
» 2015-12-07 07:51:35 Drugi for ma j<4, ponieważ nie mogłem zbadać długości imienia przez strlen(), także założyłem odgórnie 4. Wiem słabe rozwiązanie, ale skupiłem się na działaniu(zresztą też bez skutku :P) Dokleiłem funkcję pobierz i wyświetl, co tłumaczy dlaczego jest tam n-1. Przepraszam, że nie zwróciłem wam na to uwagi wcześniej Jako, iż jest to zadanie treningowe nie mogę używać funkcji sortujących, ani vectorów itp. :) |
|
Garniturek Temat założony przez niniejszego użytkownika |
» 2015-12-07 07:55:24 Miałem też pomysł, aby to sortowanie napisać w ten sposób, dzięki czemu uniknąłbym ten nieszczęsnej pętli for(j=0; j<4; j++), ale mam błąd, zresztą chyba ten sam co przy użyciu strlen(); :) error C2664: 'strncmp' : cannot convert parameter 1 from 'std::string' to 'const char *' void sortowanie( indeks * o, int & n ) { int licznik = 1; cout << n << endl; for( int i = 1; i < n - 1; i++ ) { if( o[ i ].imie[ licznik ] < o[ i - 1 ].imie[ licznik ] ) { indeks zmienna; zmienna = o[ i ]; o[ i ] = o[ i - 1 ]; o[ i - 1 ] = zmienna; break; } else if( o[ i ].imie[ licznik ] > o[ i - 1 ].imie[ licznik ] ) break; else if( strncmp( o[ i ].imie, o[ i - 1 ].imie, licznik ) == 0 ) { licznik++; i--; } } |
|
carlosmay |
» 2015-12-07 10:36:06 cannot convert parameter 1 from 'std::string' to 'const char *' |
Funkcja std::strncmp oraz std::strcmp() porównują łańcuchy w starym cstring. Klasa std::string ma zdefiniowane operatory relacji. Algorytm sortujący będzie taki sam jak dla tablicy liczb. Polecam std::vector oraz std::sort() . Łatwo i szybko. |
|
Garniturek Temat założony przez niniejszego użytkownika |
» 2015-12-07 11:51:20 Napisałem to sortowanie tak jak dla normalnych tablic liczb, a mimo to mam gdzieś błąd :( Nie mogę używać metod tego typu jeszcze :) |
|
darko202 |
» 2015-12-07 12:35:51 |
|
« 1 » 2 |