#include <iostream>
#include <fstream>
#include <iomanip>

using namespace std;

struct adat
{
    string kod;
    string valasz;
    int pontszam;       //A 6.feladatnál kap értéket, 7-ben rendezzük majd!
}teszt[500];

string megoldas;    //A forrásfájl elso sora
int N;              //A fájlban lévo adatok száma

void kiir(string sz)
{
    cout << "-----------------------------------------------" << endl;
    cout << sz << endl;
    cout << "-----------------------------------------------" << endl;
}

void F1_F2()
{
    kiir("1. feladat");
    cout << "Fájl beolvasása..." << endl;
    ifstream fbe;
    fbe.open("valaszok.txt");
    fbe >> megoldas;
    int i=0;
    while(!fbe.eof())
    {
        fbe >> teszt[i].kod;
        fbe >> teszt[i].valasz;
        i++;
    }
    kiir("2. feladat");
    N=i-1;  //-1 a fájl utolsó üres sora miatt!!
    cout << "A vetélkedon " << N << " versenyzo indult." << endl;
    fbe.close();
}

void F4(string s);

void F3()
{
    //KIVÁLASZTÁS
    kiir("3. feladat");
    string v_kod;
    cout << "A versenyzo azonosítója = ";
    cin >> v_kod;
    int i=0;
    while(teszt[i].kod!=v_kod)  //Kiválasztás, mert biztosan megvan ez a kód
    {
        i++;
    }
    cout << teszt[i].valasz << " (a versenyzo válasza)" << endl;
    F4(teszt[i].valasz);
}

void F4(string s)
{
    //A 3. feladatból, F3()-ból indítjuk, ezért definiáltam F3() elott
    //Csak, hogy ilyent is lássunk :)
    kiir("4. feladat");
    cout << megoldas << endl;
    for(int i=0;i<s.length();i++)
    {
        if(s[i]==megoldas[i])
        {
            cout << '+';
        }
        else
        {
            cout << " ";
        }
    }
    cout << endl;
}

void F5()
{
    kiir("5. feladat");
    //MEGSZÁMLÁLÁS
    int fszama;
    cout << "A feladat sorszáma = ";
    cin >> fszama;
    char jo=megoldas[fszama-1];     //A megadott feladatsorszámnak megfelelo betu
    int jo_megoldas=0;
    for(int i=0;i<N;i++)
    {
        if(teszt[i].valasz[fszama-1]==jo) jo_megoldas++;
    }
    float szazalek=(float)jo_megoldas/(float)N*100; //"instant" konvertálás floattá! :)
    //Szerkesztési okokból lesz két soros a kiírás
    cout << "A feladatra " << jo_megoldas << " fo, a versenyzok ";
    cout  << setprecision(4) << szazalek << "%-a adott helyes választ." << endl;
}

void F6()
{
    //ÖSSZEGZÉS
    kiir("6. feladat");
    //Elokészítjük a 7. feladatot is!
    cout << "A versenyzok pontszámának meghatározása..." << endl;
    int pontok[14]={3,3,3,3,3,4,4,4,4,4,5,5,5,6};
    for(int i=0;i<N;i++) teszt[i].pontszam=0;
    ofstream fki;
    fki.open("pontok.txt");

    for(int i=0;i<N;i++)    //Versenyzonként
    {
        for(int j=0;j<14;j++)   //A versenyzo 14 karakteres megoldásának vizsgálata
        {
            if(teszt[i].valasz[j]==megoldas[j])
            {
                teszt[i].pontszam+=pontok[j];
            }
        }
        fki << teszt[i].kod << " " << teszt[i].pontszam << endl;
    }
    fki.close();
}

void F7()
{
    kiir("7. feladat");
    int helyezes=1;     //1 elso díjas biztosan lesz
    //RENDEZÉS
    for(int i=0;i<N-1;i++)
        for(int j=i+1;j<N;j++)
            if(teszt[i].pontszam<teszt[j].pontszam) swap(teszt[i],teszt[j]);

    cout << helyezes << ". díj (" << teszt[0].pontszam << " pont) :" << teszt[0].kod << endl;
    int i=1;
    //KIVÁLOGATÁS(?)
    while(helyezes<3)   //Maximum 3. helyezésig megyünk
    {
        if(teszt[i].pontszam<teszt[i-1].pontszam)
        {
            helyezes++;     //Csak akkor ugorjon a helyezés, ha eltéro pontszám jön
        }
        cout << helyezes << ". díj (" << teszt[i].pontszam << " pont) :" << teszt[i].kod << endl;
        i++;
    }
}

int main()
{
    setlocale(LC_ALL, "hun");
    F1_F2();
    F3();
    F5();
    F6();
    F7();
    return 0;
}
