#include <iostream>
#include <cstdlib>
#include <fstream>
#include <sstream>

using namespace std;

struct jarmu{
    int ora, perc, mperc, utido;
    char varos;

}egyjarmu[2000];

int db;

int secido(jarmu j);        ///megadja, hogy egy jármű hanyadik másodpercben éri el az útszakaszt

int kiido(jarmu j);         ///megadja, hogy egy jármű hanyadik másodpercben érné el az útszakasz végét

string kiido(int mperc);    ///óra perc mperc alakban adja vissza

int main()
{
    setlocale(LC_ALL, "hun");
    ///1. feladat
    cout << "1. feladat: Beolvasás " << endl;
    ifstream be;
    be.open("forgalom.txt");
    if(be.fail()){
        cout << "A fájl olvasása sikertelen.";
        cin.get();
        exit(-1);
    }
    int i=0;
    be >> db;
    while(!be.eof()){
        be >> egyjarmu[i].ora >> egyjarmu[i].perc >> egyjarmu[i].mperc >> egyjarmu[i].utido >> egyjarmu[i].varos;
        i++;
    }
    be.close();

    ///2. feladat
    cout << "2. feladat: Adjon meg egy számot 1 és " << db << " között: ";
    int n;
    cin >> n;
    if(egyjarmu[n-1].varos=='F') cout << "A(z) " << n << ". jármű Alsó város felé halad." << endl;
    else cout << "A(z) " << n << ". jármű Felső város felé halad." << endl;

    ///3. feladat
    cout << "3. feladat: Felső város irányába tartó két utolsó jármű ";
    ///melyik az utolsó?
    i=db-1;
    int utolso=0;
    while(!utolso && i) {
        if(egyjarmu[i].varos=='A') utolso=i;
    i--;
    }
    ///melyik az utolsó előtti?
    int utolsoelott=0;
    i=utolso-1;
    while(!utolsoelott && i) {
        if(egyjarmu[i].varos=='A') utolsoelott=i;
    i--;
    }
    cout << secido(egyjarmu[utolso])-secido(egyjarmu[utolsoelott]) << " másodperc különbséggel érik el az útszakasz kezdetét." << endl;

    ///4. feladat
    cout << "4. feladat: Óránként az útszakaszhoz érkező járművek száma: " << endl;
    int ora=egyjarmu[0].ora;
    int dbA=0, dbF=0;
    for(int i=0; i<db; i++) {
        if(egyjarmu[i].varos=='A') dbA++;
        if(egyjarmu[i].varos=='F') dbF++;
        ///ha változik az óra, akkor kiíratjuk a darabszámokat, átállítjuk az órát és nullázzuk a darabszámokat
        if(egyjarmu[i].ora!=egyjarmu[i+1].ora) {
            cout << ora << " " << dbA << " " << dbF << endl;
            ora=egyjarmu[i+1].ora;
            dbA=0;
            dbF=0;
        }

    }

    ///5. feladat
    cout << "5. feladat: Az első tíz leggyorsabb jármű: " << endl;
    ///kigyűjtjük a tíz legrövidebb útidőt
    int ido[10];
    int minIdo=egyjarmu[0].utido;
    for(int i=0; i<db; i++) {
            if(egyjarmu[i].utido<minIdo){
                    minIdo=egyjarmu[i].utido;
            }
        }

            ido[0]=minIdo;

    int j=1;
    while(j<10){
    minIdo=ido[j-1];
    int minT=egyjarmu[0].utido;
        for(int i=1; i<db; i++) {
            if(egyjarmu[i].utido>minIdo){  ///különböző idő legyen az előzőtől!
                if(egyjarmu[i].utido<minT){
                    minT=egyjarmu[i].utido;
                }
            }
        }

        ido[j]=minT;
        j++;

    }
    ///az első 10 leggyorsabb jármű
    j=1;
    while(j<=10) {
        int k=0;
        while(k<10 && j<=10){
        int i=0;
           while(i<db && j<=10) {
                if(egyjarmu[i].utido==ido[k]) {
                    cout << egyjarmu[i].ora << ":" << egyjarmu[i].perc << ":" << egyjarmu[i].mperc << " ";
                    if(egyjarmu[i].varos=='A') cout << "Alsó ";
                    else cout << "Felső ";
                    printf("%.1f",1000/(double)ido[k]);
                    cout << " m/s" << endl;
                    j++;

                }
           i++;
           }
        k++;
        }

    }///5. feladat
    cout << "5. feladat: Az első tíz leggyorsabb jármű: " << endl;
    cout << "Az első tíz legnagyobb sebességhez tartozó egy-egy jármű: " << endl;
    for(int k=0; k<10; k++){
        int i=0;
        bool talal=false;
        while(!talal){
            if(egyjarmu[i].utido==ido[k]){
                talal=true;
                cout << egyjarmu[i].ora << ":" << egyjarmu[i].perc << ":" << egyjarmu[i].mperc << " ";
                        if(egyjarmu[i].varos=='A') cout << "Alsó ";
                        else cout << "Felső ";
                        printf("%.1f",1000/(double)ido[k]);
                        cout << " m/s" << endl;
            }
            i++;
        }
    }
    ///6. feladat
    cout << "6. feladat: Az Alsó város felé tartók adatainak kiírása fájlba. " << endl;
    ///először megkeressük az első Alsó város felé haladó járművet
    int k=0;
    while(egyjarmu[k].varos!='F'){
        k++;
    }
    ofstream ki;
    ki.open("also.txt");
    if(ki.fail()){
        cout << "A fájl olvasása sikertelen";
        cin.get();
        exit(-1);
    }

    ki << kiido(kiido(egyjarmu[k])) << endl;
    int utolsoido=kiido(egyjarmu[k]);
    for(i=k+1; i<db; i++){
        if(egyjarmu[i].varos=='F'){
            if(kiido(egyjarmu[i])<kiido(egyjarmu[i-1])) {
               utolsoido=kiido(egyjarmu[i-1]);
            }else {
               utolsoido=kiido(egyjarmu[i]);
            }

        ki << kiido(utolsoido) << endl;
        }
    }
    ki.close();
    cout << "A fájlbaírás megtörtént.";
    cin.get();
    return 0;
}

int secido(jarmu j){
///megadja, hogy egy jármű hanyadik másodpercben éri el az útszakaszt
    return j.ora*3600+j.perc*60+j.mperc;

}

int kiido(jarmu j){
///megadja, hogy egy jármű hanyadik másodpercben érné el az útszakasz végét
    return secido(j)+j.utido;

}

string kiido(int mperc){
///óra perc mperc alakban adja vissza
    stringstream ido;
    int h, m, s;
    h=mperc/3600;
    m=mperc%3600/60;
    s=mperc%60;
    ido << h << " " << m << " " << s;
    return ido.str();

}
