#include <iostream>
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>
#include <cmath>

using namespace std;

#define ellenoriz(x) if (x) pont++; else cout << "a feltetel nem teljesult a " << __LINE__ << ". sorban" << endl

// innentol...

struct Auto {
    string nev;
    float maxtank, uzemanyag, megtettkm, fogyasztas;
};

void tankol(Auto& a, float uzemanyag) {
    a.uzemanyag += uzemanyag;
    if (a.uzemanyag > a.maxtank)
        a.uzemanyag = a.maxtank;
}

void halad(Auto& a, float megtettkm) {
    if (a.uzemanyag < (megtettkm / 100) * a.fogyasztas) {
        a.megtettkm += a.uzemanyag / a.fogyasztas * 100;
        a.uzemanyag = 0;
    } else {
        a.uzemanyag -= (megtettkm / 100) * a.fogyasztas;
        a.megtettkm += megtettkm;
    }
}

Auto tavverseny_azaz_addig_mennek_amig_ki_nem_fogynak_de_elotte_lenullazzak_a_kilometerorat(vector<Auto>& autok) {
	float legtobb_km = 0;
	unsigned hol = -1;
	for (unsigned i = 0; i < autok.size(); i++) {
		autok[i].megtettkm = autok[i].uzemanyag / autok[i].fogyasztas * 100;
        autok[i].uzemanyag = 0;
		if (autok[i].megtettkm > legtobb_km) {
			legtobb_km = autok[i].megtettkm;
			hol = i;
		}
	}
	return autok[hol];
}

// ...idaig lehet irni

int main() {
    srand(time(0));
    int pont = 0;

    Auto a;
    a.nev = "Ferrari";      // A jármű típusa
    a.maxtank = 86;         // Az üzemanyag tartály mérete
    a.uzemanyag = 13.5;     // Az aktuális üzemanyag mennyiség
    a.megtettkm = 0;        // Az eddig megtett km-rek száma
    a.fogyasztas = 13.3;    // A jármű fogyasztása l/100km-ben megadva
    //fabs(): valós számok abszolútértéke
    ellenoriz( a.nev == "Ferrari" && a.maxtank == 86 && fabs(a.uzemanyag-13.5)<0.01 && a.megtettkm == 0 && fabs(a.fogyasztas-13.3)<0.01 );

    tankol( a, 50 );
    ellenoriz( fabs(a.uzemanyag-63.5) < 0.01 );

    halad( a, 350 );
    ellenoriz( a.megtettkm == 350 && fabs(a.uzemanyag-16.95) < 0.01 );

    tankol( a, 100 );
    ellenoriz( a.uzemanyag == 86 );

    halad( a, 1000 );
    ellenoriz( fabs(a.megtettkm-996.617) < 0.01 && a.uzemanyag == 0 );

    vector<Auto> autok;
    Auto a1; a1.nev="Opel";         a1.maxtank=40; a1.uzemanyag=35; a1.megtettkm=10525; a1.fogyasztas=10.1;
    Auto a2; a2.nev="Toyota";       a2.maxtank=50; a2.uzemanyag=45; a2.megtettkm=5671;  a2.fogyasztas=8.6;
    Auto a3; a3.nev="Volkswagen";   a3.maxtank=35; a3.uzemanyag=30; a3.megtettkm=36715; a3.fogyasztas=6.3;
    autok.push_back( a1 );
    autok.push_back( a2 );
    autok.push_back( a3 );
    Auto gyoztes = tavverseny_azaz_addig_mennek_amig_ki_nem_fogynak_de_elotte_lenullazzak_a_kilometerorat( autok );
    ellenoriz( gyoztes.nev == a2.nev && autok[0].uzemanyag == 0 && autok[1].uzemanyag == 0 && autok[2].uzemanyag == 0 );

    // Ha az elozot jol kiszamoltad, akkor ez automatikusan teljesulni fog. Direkt bonyolult, hogy ne lehessen kitalalni ebbol, hanem rendesen ki kelljen szamolni az elozot. Ne akarj ebbol rajonni, hogy mi kell legyen az eredmeny.
    float titok = sqrt(float(int(autok[2].megtettkm+0.5)));
    titok -= floor(titok);
    ellenoriz( fabs(titok-0.817) < 0.001 );

    cout << "\n" << pont << "/7 pont" <<endl;
    return 0;

}
