• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sortowanie struktury

Object Storage Arubacloud
0 głosów
785 wizyt
pytanie zadane 12 lutego 2020 w C i C++ przez Xementis Nowicjusz (120 p.)

Witam. Na starcie napiszę że jestem początkującym programistą i sie dopiero uczę. Mam napisaną baze danych w c++ bazującą na strukturach i plikach tekstowych. Mój program ma uruchomić funkcje która sortuje mi tą baze i wyświetla alfabetycznie względem imienia i nazwiska. 
Próbuje to zrobić używając funkcji sort(), ale ona nie działa. Wyskakują błędy w stylu:
Błąd    C2672    „operator __surrogate_func”: nie znaleziono zgodnej przeciążonej funkcji
Poniżej fragmentu kodu przepisujący jedną strukture do drugiej (w celu nienaruszenia jednej z nich ponieważ jedna bedzie posortowana)
 

            for (int a = 0; a <= uczniowie - 1; a++)
            {

                osoba_sort[a].imie_nazwisko = osoba[a].nazwisko + " " + osoba[a].imie;
                osoba_sort[a].wiek = osoba[a].wiek;
       }
sort(osoba_sort, osoba_sort + uczniowie -1);


 

2 odpowiedzi

0 głosów
odpowiedź 12 lutego 2020 przez tangarr Mędrzec (154,860 p.)
https://en.cppreference.com/w/cpp/algorithm/sort
Kompilator nie wie w jaki sposób ma porównywać elementy twojej struktury.
Musisz napisać operator< dla tej struktury lub przekazać funkcję porównującą elementy jako trzeci argument funkcji.
0 głosów
odpowiedź 12 lutego 2020 przez profesorek96 Szeryf (91,420 p.)
komentarz 12 lutego 2020 przez Xementis Nowicjusz (120 p.)

Wymyśliłem coś ale mimo wszystko nie wiem dlaczego nie działa.
 

struct student_sort
{
    string imie_nazwisko;
    int wiek;
};
bool porownanie(student_sort a, student_sort b)
{
    if (a.imie_nazwisko < b.imie_nazwisko) return 1;
    return 0;
}
   sort(osoba_sort, osoba_sort + uczniowie - 1, porownanie);

1) To moja struktura
2) funkcja porownania
3) wywołanie sortowanie z porownaniem 
Mimo to funkcja nie sortuje :/
 

komentarz 12 lutego 2020 przez profesorek96 Szeryf (91,420 p.)
Funkcja sort przyjmuje jako pierwszy argument wskaźnik na początek tablicy, drugi to wskaźnik na koniec zaś 3 jest opcjonalny i jest to wskaźnik do funkcji porównującej.
komentarz 12 lutego 2020 przez Xementis Nowicjusz (120 p.)
    student_sort osoba_sort[20];

no to mam zdeklarowaną tablice struktur.
w tej oto tablicy mam element string na podstawie którego ma być wykonany sort.
Mam jeszcze zmienną uczniowie która określa ilu uczniów mam w bazie aktualnie i sort działa do tego momentu. No i używam tej funkcji opcjonalnej żeby to sie uporządkowało wzgledem imienia i nazwiska i nie działa. Nic się nie przestawia.

komentarz 12 lutego 2020 przez profesorek96 Szeryf (91,420 p.)
Masz biblioteke algorithm ?

Powinieneś to wywołąć

sort(osoba_sort,osoba_sort+20,porownanie);
komentarz 12 lutego 2020 przez Xementis Nowicjusz (120 p.)
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;

struct student
{
    string nazwisko;
    string imie;
    int numer_albumu;
    int wiek;
    float srednia;
};
struct student_sort
{
    string imie_nazwisko;
    int wiek;
};
bool porownanie(student_sort a, student_sort b)
{
    if (a.imie_nazwisko < b.imie_nazwisko) return 1;
    return 0;
}
void czytaj_dane_z_klawiatury(student osoba[],int uczniowie)
{
    const string imiona[8] = { "Ola","Marek","Kasia","Arek","Bartek","Jakub","Marcin","Ewa", };
    if (uczniowie <= 19)
    {
        bool warunek = false;
        cout << "Wprowadz nazwisko=";
        cin >> osoba[uczniowie].nazwisko;
        while (warunek == false)
        {
            cout << "Imiona w bazie: Ola, Marek, Kasia, Arek, Bartek, Jakub, Marcin, Ewa" << endl;
            cout << "Przypiminamy ze wielkosc liter ma znaczenie" << endl;
            cout << "Wprowadz imie zgodne z lista dozwolonych imion w bazie=";
            cin >> osoba[uczniowie].imie;
            for (int a = 0; a <= 7; a++)
                if (osoba[uczniowie].imie == imiona[a])
                {
                    warunek = true;
                    cout << "Wpowadzono poprawne imie :)" << endl;
                    break;
                }
                else
                    if (a == 7)
                        cout << "Wpwowadzono niepoprawne imie :(" << endl;
        }
        cout << "Wprowadz numer albumu=";
        cin >> osoba[uczniowie].numer_albumu;
        cout << "Wprowadz wiek=";
        cin >> osoba[uczniowie].wiek;
        cout << "wprwoadz srednia=";
        cin >> osoba[uczniowie].srednia;
    }
    else
        cout << "Osiagnieto maksymalna liczbe studentow w bazie" << endl;
}
void zapisz_dane_do_pliku(student uczen[],int uczniowie)
{
    fstream dane;
    dane.open("baza_danych.txt", ios::out);
    if (dane.is_open())
    {
        dane << uczniowie << endl;
        for (int a=0; a<=uczniowie-1; a++)
        {
            
                
                dane << uczen[a].nazwisko << endl;
                dane << uczen[a].imie << endl;
                dane << uczen[a].numer_albumu << endl;
                dane << uczen[a].wiek << endl;
                dane << uczen[a].srednia << endl;
        }
    }
    dane.close();
}
void czytaj_dane_z_pliku(student uczen[],int &uczniowie)
{
    fstream dane;
    dane.open("baza_danych.txt", ios::in);
    if (dane.is_open())
    {
        string liczba;
        getline(dane, liczba);
        uczniowie = atoi(liczba.c_str());
        cout << "Liczba uczniow w bazie wynosi=" << uczniowie << endl;
        for (int a = 0; a <= uczniowie-1; a++)
        {
            string numer_albumu, wiek, srednia;
            
            
            cout << "Student: " << a + 1 << endl;
            cout << endl;
            
            getline(dane, uczen[a].nazwisko);
            cout << "Nazwisko ucznia="<< uczen[a].nazwisko << endl;
            
            getline(dane, uczen[a].imie);
            cout << "Imie ucznia=" << uczen[a].imie << endl;

            getline(dane, numer_albumu); 
            uczen[a].numer_albumu = atoi(numer_albumu.c_str());
            cout << "Numer albumu="<<uczen[a].numer_albumu << endl;

            getline(dane, wiek);
            uczen[a].wiek = atoi(wiek.c_str());
            cout << "Wiek="<<uczen[a].wiek << endl;

            getline(dane, srednia);
            uczen[a].srednia = atof(srednia.c_str());
            cout << "Srednia="<<uczen[a].srednia << endl;
            cout << endl;  
        }
    
        dane.close();
    }
}
int main()
{
    bool warunek = true;
    char wybor;
    int uczniowie = 0;
    int liczba_skasowanych = 0;

    student osoba[20];
    student_sort osoba_sort[20];
    if (ifstream("baza_danych.txt", ios::ate).tellg())
        czytaj_dane_z_pliku(osoba,uczniowie);
    else
        cout << "plik jest pusty" << endl;

    cout << "Menu wyboru funkcji programu" << endl;
    cout << "______________________________" << endl;
    while (warunek)
    {
        cout << "Nacisnij klawisz odpowiadajacy funkcji i wcisnij enter" << endl;
        cout << "Dodaj studenta                 - D" << endl;
        cout << "Skasuj studenta                - U" << endl;
        cout << "Zapisz dane i zamknij program  - K" << endl;

        cin >> wybor;
        switch (wybor)
        {

        case ('D'):
            system("cls");
            cout << "Uruchamiam procedure dodania studenta" << endl;
                    czytaj_dane_z_klawiatury(osoba,uczniowie);
                    cout << "Aktualna liczba uczniow w bazie wynosi=" << uczniowie+1 << endl;
                    uczniowie++;
            break;

        case ('U'):
            system("cls");
            cout << "Uruchamiam procedure kasowania studenta" << endl;
            
            for (int a = 0; a <= uczniowie - 1; a++)
                if (osoba[a].srednia < 2.5)
                    for (int j=a; j<=uczniowie-1; j++)
                { 
                    osoba[j].nazwisko = osoba[j + 1].nazwisko;
                    osoba[j].imie = osoba[j + 1].imie;
                    osoba[j].numer_albumu = osoba[j + 1].numer_albumu;
                    osoba[j].wiek = osoba[j + 1].wiek;
                    osoba[j].srednia = osoba[j + 1].srednia;
                    uczniowie--;
                    cout << "Usunieto studenta o numerze=" << a + 1 << endl;
                    liczba_skasowanych++;
                }
          
            cout << "Usunieto= " << liczba_skasowanych << " uczniow" << endl;
            break;
        case ('L'):
            for (int a = 0; a <= uczniowie - 1; a++)
            {
                osoba_sort[a].imie_nazwisko = osoba[a].nazwisko + " " + osoba[a].imie;
                osoba_sort[a].wiek = osoba[a].wiek;
                transform(osoba_sort[a].imie_nazwisko.begin(), osoba_sort[a].imie_nazwisko.end(), osoba_sort[a].imie_nazwisko.begin(), ::toupper);
            }
            sort(osoba_sort, osoba_sort + uczniowie -1 , porownanie);
            
            for (int a = 0; a <= uczniowie - 1; a++)
            {
                cout << osoba_sort[a].imie_nazwisko << endl;
                cout << osoba_sort[a].wiek << endl;
            }
            break;
        case ('K'):
            
            zapisz_dane_do_pliku(osoba,uczniowie);
            warunek = false;
            break;
        }

    }
    return 0;
}

To mój kod. Oczywiscie są tam też inne funkcje ale mianowicie. Z jednej struktury do drugiej przepisuje tylko imie , nazwisko i wiek. Mam za zadanie zmienić imie i nazwisko na wielkie litery. Wiec transform użyłem i sortuje z porównaniem i wywołuje na dole i lipa

Podobne pytania

0 głosów
2 odpowiedzi 182 wizyt
pytanie zadane 24 września 2019 w C i C++ przez Teslum_369 Gaduła (4,190 p.)
0 głosów
0 odpowiedzi 395 wizyt
pytanie zadane 1 stycznia 2019 w C i C++ przez Teslum_369 Gaduła (4,190 p.)
0 głosów
2 odpowiedzi 757 wizyt
pytanie zadane 24 czerwca 2018 w C i C++ przez siemasiema123.96 Początkujący (350 p.)

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...