#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <vector>
#include <fstream>
using namespace std;

#define ellenoriz(felt, pont) if (felt) pont++; else cerr << "Nem teljesul a feltetel a " << __LINE__<< ". sorban." <<endl;

/* Szabályok:
    - csak az a beugró érvényes, amely nem tartalmaz semmilyen változtatást a main()-ben,
        és már nincs benne kommentezve semmi az "//idaig" sor után
    - az "ellenoriz"-en kívül nem tartalmaz #define sorokat, és azt sem szabad megváltoztatni
    - új #include megengedett a C/C++ standard könyvtárbeli elemek közül
*/

// Innentol
struct Sportolo {
    string nev;
    double egyeni_csucs;
    double aktualis_pont;
};

Sportolo uj_sportolo(string nev, double egyeni_csucs) {
    Sportolo kimenet = {nev, egyeni_csucs, 0};
    return kimenet;
}

void kap_pontot(Sportolo& s, double pont) {
    s.aktualis_pont += pont;
}

struct Verseny {
    vector<Sportolo> v;
};

void benevez(Verseny& verseny, Sportolo s) {
    verseny.v.push_back(s);
}

bool uj_egyeni_csucs(Sportolo s) {
    return s.aktualis_pont > s.egyeni_csucs;
}

vector<int> helyezesek(Verseny verseny) {
    vector<int> eredmeny(5);
    for (size_t i = 1; i <= verseny.v.size(); i++) {
        double maximum_hely = 0;
        for (size_t j = 1; j < verseny.v.size(); j++)
            if (verseny.v[j].aktualis_pont > verseny.v[maximum_hely].aktualis_pont)
                maximum_hely = j;
        eredmeny[maximum_hely] = i;
        verseny.v[maximum_hely].aktualis_pont = 0;
    }
    return eredmeny;
}
// Idaig

int main()
{
    int pont = 0;
    srand(time(0));

    Sportolo v1 = uj_sportolo("Kati", 53.5);
    ellenoriz(v1.nev == "Kati" && v1.egyeni_csucs == 53.5 && v1.aktualis_pont==0, pont);

    float v1pont = rand()%30/10.0+1;
    kap_pontot(v1, v1pont);
    ellenoriz(v1.aktualis_pont==v1pont, pont);

    Verseny v;
    benevez(v, uj_sportolo("A", 10));
    benevez(v, uj_sportolo("B", 20));
    benevez(v, uj_sportolo("C", 30));
    benevez(v, uj_sportolo("D", 40));
    benevez(v, uj_sportolo("E", 50));
    ellenoriz(v.v.size()==5 && v.v[0].nev=="A", pont);

    vector<float> randompont(5);
    for (int i=0; i<5; i++)
    {
        randompont[i] = rand()%20+20+i/5.0; //garantáltan nem lesz két egyforma pontszám
        kap_pontot(v.v[i], randompont[i]);  //a randompont tömbben megjegyezzük a pontszámot, hogy a pontszámokat átíró turpisságokat megelőzzük
    }
    ellenoriz(uj_egyeni_csucs(v.v[0]) && !uj_egyeni_csucs(v.v[4]), pont);

    vector<int> h = helyezesek(v);  //a legtöbb aktuális pontot kapó sportoló helyezése 1, a következőé 2, stb..
    vector<float> rp(5); //rp:rendezett pontszámok
    for (int i=0;i<5;i++)
    {
        rp[h[i]-1] = (v.v[i].aktualis_pont); // ha jól dolgoztál, az rp-ben rendezetten jellenek így meg a pontszámok.
    }
    // sorrend helyességének ellenőrzése:
    ellenoriz(rp[0] > rp[1] && rp[1] > rp[2] && rp[2] > rp[3] && rp[3] > rp[4], pont );
    // pontszám értékek megtartásának ellenőrzése:
    ellenoriz(v.v[0].aktualis_pont == randompont[0] && v.v[2].aktualis_pont == randompont[2] && v.v[4].aktualis_pont == randompont[4] , pont)

    cout << endl << pont << "/6 pont";
}
