Problem z sortowaniem struktury

0

Cześć. Mam pewien problem. Napisałem bazę danych działającą na pliku tekstowym na zaliczenie na studia. Lecz stoję na ostatniej funkcji a mianowicie program ma wyświetlić posortowane elementy struktury alfabetycznie i zmienić litery na wielkie. A więc przepisałem moją większa strukturę do drugiej na której będzie wykonywane sortowanie.
zmienna uczniowie zawiera ilość elementów struktury.
Porownanie to napisana funkcja ktora porownuje stringi (uczyłem sie jej pisać z neta, niby zgodna jest)
Uruchamiam na dole funkcje sort (osoba_sort, osoba sort +uczniowie -1, porownianie) i następnie w petli probuje wyświetlić tą strukturę którą posortowałem ale ona w dalej sie nie zmienia , dlaczego ?
w switchu case ('L') to miejsce w którym aktualnie stoję. to już końcówka programu i jak to zrobię to mogę oddać jako zaliczony.

#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;
}
0

Co ma transform do sortowania?

0

to wymóg jednej z funkcji. Program ma zmieniać znaki na duże. No ale wracając do tematu to jak wyświetlam strukturę osoba_sort.imie_nazwisko w pętli to nic sie nie zmiania po użyciu funkcji sortującej. Jakieś sugestie ?

0

Dokumentacja sort: http://www.cplusplus.com/reference/algorithm/sort/ , Postaraj się odtworzyć dokładnie to samo co tam jest w przykładzie.

3
sort(osoba_sort, osoba_sort + uczniowie-1, porownanie);

masz off-by-one - drugi parametr to wskaźnik na element jeden za ostatnim, a więc w Twoim przypadku, powinno to być osoba_sort + uczniowie (gdybyś iterował od a=0 do a < rozmiar to byś być może nie pomyślał o tym odejmowaniu jeden).

0

Dzięki wielkie! W końcu działa. Nie wpadłem na to :D

1

Czytałeś cokolwiek o sortowaniu, otworzyłeś help o standardowych algorytmach, zanim zacząłeś strzelać kod "może trafię" ? Chyba nie. Twoja funkcja porównująca jest kaleka.
Przemieszczanie (bo nie nazwijmy tego swapowaniem) po polu, zamiast całymi strukturami, również.

Edit: Wynalezienie dwóch struktur student i student_sort chyba tylko, żeby samemu sobie rzucać kłody pod nogi.

0

Przy porównaniu wystarczy:

bool porownanie(student_sort a, student_sort b)
{
    return a.imie_nazwisko<b.imie_nazwisko;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1