Sortowanie według imienia

0

Witam, mam do napisania program, który posortuję strukturę według imienia i spotykam się z niespotykanym dla mnie błędem.

//Header.h
#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);

#endif 
 #include "Header.h"

void sortowanie( indeks* o, int &n)
{
	indeks zmienna;
	for(int i=1; i<=n; i++)
	{
		for(int j=0; j<3; j++)
		{
			if (o[i].imie[j]<o[i-1].imie[j])		
			{
				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;
	cout<<"Podaj ile ocen chcesz pobrac: ";
	cin >> ile;
	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;
	}
}

#include "Header.h"


int main()
{
	int ile;
	int n=0;
	char wybor;
	indeks indeksy[30];
	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]);
				n++;
				system("cls");
			}
			break;
		case '2':
			{
				int ile;	
				cout<<"Podaj ile przedmiotow chcesz wyswietlic: ";
				cin>>ile;
				for (int j=0; j<=n-1; j++)
				{	
					wyswietl(indeksy[j], ile);
				}
				system("pause");
			} break;
		case '3':
			{
				sortowanie(&indeksy[n-1], n);
				system("cls");
			}break;
		default:
			exit(0);
		}

	}
	system("cls");
} 
3

swietnie. A my mamy wszystko analizowac, bo Tobie nie chcialo sie

  1. podac scenariusza kiedy sie wywala
  2. podac linijki gdzie sie wywala (mozna to sprawdzic pod debuggerem)
  3. opisac szerzej problem

to co powinienes uzyc to
std::vector
http://en.cppreference.com/w/cpp/container/vector
i std::sort z wlasna funkcja
http://en.cppreference.com/w/cpp/algorithm/sort

3

Ja bym to zrobił tak:

#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;

class students{
private:
    struct grade{
        string subject;
        float value;
        grade(const string& subject, float value) :
            subject(subject), value(value) { }
    };

    struct person{
        string name;
        string surname;
        vector<grade> grades;
        int index;
        person(const string& name, const string& surname, int index) :
            name(name), surname(surname), index(index) { }
    };

    vector<person> persons;

public:
    void addPerson(const string& name, const string& surname, int index){
        this->persons.push_back(person(name, surname, index));
    }

    void addGrade(int personIndex, const string& subject, float value){
        for_each(this->persons.begin(), this->persons.end(), [&](person& obj){
            if(obj.index == personIndex)
                obj.grades.push_back(students::grade(subject, value));
        });
    }

    void sortBySurname(){
        sort(this->persons.begin(),this->persons.end(),
             [](const person& obj1, const person& obj2){
            return obj1.surname.compare(obj2.surname);
        });
    }

    void print(){
        for_each(this->persons.begin(), this->persons.end(), [&](const person& obj){
            cout << "Person: " << obj.name << " " << obj.surname << ": " << obj.index << endl;
            for_each(obj.grades.begin(), obj.grades.end(), [](const grade& grd){
                cout << "Subject: " << grd.subject << ": " << grd.value << endl;
            });
            cout << endl;
        });
    }
};

int main(){
    students persons;
    persons.addPerson("Grzegorz","Kowalski",31);
    persons.addGrade(31,"Matematyka",3.5);
    persons.addGrade(31,"Fizyka",4.5);

    persons.addPerson("Katarzyna","Iksinska",32);
    persons.addGrade(32,"Matematyka",3.5);
    persons.addGrade(32,"Fizyka",2.5);

    persons.addPerson("Magdalena","Ygrekowska",33);
    persons.addGrade(33,"Matematyka",4.5);
    persons.addGrade(33,"Fizyka",4.5);

    persons.addPerson("Magdalena","Adamowska",34);
    persons.addGrade(34,"Matematyka",4.0);
    persons.addGrade(34,"Fizyka",4.1);

    persons.sortBySurname();
    persons.print();
    return 0;
}
3
static bool compareSurnames(const person& obj1, const person& obj2){
    set<string> cmpset;
    cmpset.insert(obj1.surname);
    cmpset.insert(obj2.surname);
 
    set<string>::iterator it = cmpset.begin();
    if((*it) == obj1.surname) return true;
    return false;
}

Może ja czegoś nie widzę, ale w czym to jest lepsze od

obj1.surname == obj2.surname
0

Dziękuje wszystkim za pomoc, ale bardzo mi zależy, aby było to wykonane tylko na strukturach oraz chciałbym poznać bliżej istotę tego błędu. Jeśli ktoś ma czas i ochotę, proszę o wyjaśnienia, wsparcie w uporaniu się z tym :)

1

Odpal debugger i przejdź się po kodzie, nikt tego za Ciebie nie zrobi.

Na zachętę masz tu jeden z potencjalnych błędów:

sortowanie(&indeksy[n], n);

Jeśli masz n elementów, to przecież pod indeksy[n] nie ma żadnego poprawnego elementu. Ostatni element który wczytałeś miał indeks n-1.

1

Proszę oto wersja ze strukturą.

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <boost/range/algorithm/sort.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <boost/range/adaptor/transformed.hpp>

struct foo {
    std::string bar;
};

int main() {
    std::vector<foo> bar { {"c"}, {"b"}, {"a"} };
    boost::copy(
        boost::range::sort(bar, [](auto&& x, auto&& y) { return x.bar < y.bar; }) | boost::adaptors::transformed([](auto&& x) { return x.bar; }),
        std::ostream_iterator<std::string>(std::cout, ","));
}
0

Debugger nic nie wykrywa, a problem pozostaje ten sam
Funkcja nie sortuje oraz po zastosowaniu jej ostatni element nie wyświetla się
Mam do dyspozycji tylko sposób w jaki ja to rozwiązuje
Ktoś wie jak pomóc? ;)

0

Problem rozwiązany, dzięki wszystkim za łopatologiczne wytłumaczenia. Dziękuje!

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