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

Sortowanie po imieniu

Ostatnio zmodyfikowano 2015-12-08 20:56
Autor Wiadomość
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 :)

C/C++
#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
C/C++
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;
    }
}
C/C++
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;
P-141524
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
P-141548
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

P-141556
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. :)
P-141559
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 *'

C/C++
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--;
        }
       
    }
P-141560
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.
P-141561
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 :)
P-141563
darko202
» 2015-12-07 12:35:51
przeczytaj proponowane na
http://cpp0x.pl/forum/temat/​?id=17081&p=2
linki

http://cpp0x.pl/kursy​/Kurs-C++​/Struktury-danych/303
http://cpp0x.pl/dokumentacja​​/standard-C++/vector/819
http://cpp0x.pl/dokumentacja​​/standard-C++/sort/350
 ew. http://www.cplusplus.com​​/reference/algorithm/sort/
http://cpp0x.pl/kursy​/Kurs-C++​/Obsluga-plikow/305


i z
http://www.gamedev.pl/forum​/c-sortowanie-wg-kolejnosci-alfabetycznej:]
C/C++
bool alpha_pred( const string & a, const string & b )
{
    // założenie: a i b równej długości; łatwo rozszerzalne
    for( size_t i = 0; i < a.size(); ++i )
         if( a[ i ] < b[ i ] ) return true;
   
    return false;
}
...
vector < string > napisy; // wektor napisów do sortowania
// sortowanie
sort( napisy.begin(), napisy.end(), alpha_pred ); // profit!
P-141564
« 1 » 2
  Strona 1 z 2 Następna strona