#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>
#include <sstream>

using namespace std;

string szavak[600];


string kod(string szo) {

    stringstream kodszo;
    for(unsigned int i=0; i<szo.length(); i++) {

        if(szo[i]=='a' || szo[i]=='b' || szo[i]=='c') kodszo << "2";
        if(szo[i]=='d' || szo[i]=='e' || szo[i]=='f') kodszo << "3";
        if(szo[i]=='g' || szo[i]=='h' || szo[i]=='i') kodszo << "4";
        if(szo[i]=='j' || szo[i]=='k' || szo[i]=='l') kodszo << "5";
        if(szo[i]=='m' || szo[i]=='n' || szo[i]=='o') kodszo << "6";
        if(szo[i]=='p' || szo[i]=='q' || szo[i]=='r' || szo[i]=='s') kodszo << "7";
        if(szo[i]=='t' || szo[i]=='u' || szo[i]=='v') kodszo << "8";
        if(szo[i]=='w' || szo[i]=='x' || szo[i]=='y' || szo[i]=='z') kodszo << "9";

    }
    return kodszo.str();

}

int main()
{
    setlocale(LC_ALL, "hun");
    //1. feladat
    cout << "1. feladat" << endl;
    string betu;
    cout << "Adjon meg egy betűt az angol ABC-ből: ";
    cin >> betu;
    cout << "A(z) " << betu << " betű kódja: " << kod(betu) << endl;

    //2. feladat
    cout << "2. feladat" << endl;
    string szo;
    cout << "Adjon meg egy szót az angol ABC betűiből: ";
    cin >> szo;
    cout << "A(z) " << szo << " szó kódja: " << kod(szo) << endl;

    //3. feladat: beolvasás
    cout << "3. feladat" << endl;
    ifstream be;
    be.open("szavak.txt");
    if(be.fail()) {

        cout << "A fájl nem nyitható meg";
        cin.get();
        exit(-1);
    }
    int i=0;
    while(be >> szavak[i]) {

        i++;

    }
    int db=i;
    be.close();
    cout << "A beolvasás sikerült." << endl;

    //4. feladat: a leghosszabb szó
    string leghosszabbszo=szavak[0];
    for(i=1; i<db; i++) {

        if(szavak[i].length()>leghosszabbszo.length()) leghosszabbszo=szavak[i];

    }
    cout << "4. feladat" << endl;
    cout << "A leghosszabb szó: " << leghosszabbszo << " ,amelynek hossza: " << leghosszabbszo.length() << endl;

    //5. feladat: rövid szavak száma.
    int darabszam=0;
    for(i=0; i<db; i++) {

        if(szavak[i].length()<6) darabszam++;

    }
    cout << "5. feladat" << endl;
    cout << "A rövid szavak száma: " << darabszam << endl;

    //6. feladat: kódok fájlba írása
    cout << "6. feladat" << endl;
    ofstream ki;
    ki.open("kodok.txt");
    if(ki.fail()) {

        cout << "A fájl nem nyitható meg";
        cin.get();
        exit(-1);
    }
    for(i=0; i<db; i++) {

        ki << kod(szavak[i]) << endl;

    }
    ki.close();
    cout << "A fájlba írás sikerült." << endl;

    //7. feladat: egy számsorhoz tartozó szó
    cout << "7. feladat" << endl;
    string szamsor;

    cout << "Adjon meg egy számsort: ";
    cin >> szamsor;
    bool van=false;
    for(i=0; i<db; i++) {

        if(kod(szavak[i])==szamsor) {
            cout << szavak[i] << endl;
            van=true;
        }
    }
    if(!van)  cout << "Nincs a számsornak megfelelő szó!" << endl;


    //8. feladat
    cout << "8. feladat" << endl;
    //egy struct típusba gyűjtjük a szavakat és a hozzájuk tartozó kódokat, majd sorbarendezzük a kódok szerint
    //A sorbarendezéskor egymás után kerülnek az egyforma kóduak
    struct egykod {

        string szo;
        string kodszo;

    }kodok[600];
    for(i=0; i<db; i++) {

        kodok[i].szo=szavak[i];
        kodok[i].kodszo= kod(szavak[i]);

    }

    for(i=0; i<db-1; i++) {

        for(int j=i+1; j<db; j++) {


            if(kodok[i].kodszo > kodok[j].kodszo) {

                egykod csere=kodok[i];
                kodok[i]=kodok[j];
                kodok[j]=csere;

            }

        }

    }

    int maximum=0;      //Legtöbb kódszó száma
    int szamlalo=1;     //Ismétlődő kódszavak száma
    string legtobbkod;  //A legtöbb azonos kód
    for(i=0; i<db-1; i++) {

        //kiiratjuk azt, ami után egy vele azonos következik (vagyis pl.: 4 egyforma közül az első hármat)
        if(kodok[i].kodszo==kodok[i+1].kodszo) {

            cout << kodok[i].szo << " : " << kodok[i].kodszo << "; " << endl;
            szamlalo++;
        }
        //és kiiratjuk azt, amely előtt egy vele egyenlő van, de utána már más (vagyis: 4 egyforma közül a negyediket)
        if(i>1 && kodok[i-1].kodszo==kodok[i].kodszo && kodok[i].kodszo!=kodok[i+1].kodszo) {

            cout << kodok[i].szo << " : " << kodok[i].kodszo << "; " << endl;
            szamlalo++;
        }

        if(szamlalo>maximum) {

            maximum=szamlalo;
            legtobbkod=kodok[i].kodszo;

        }
        if(kodok[i].kodszo!=kodok[i+1].kodszo) szamlalo=1; //Ha a következő kód különbözik a számlálót leállítjuk
    }

    //9. feladat
    cout << "8. feladat" << endl;
    cout << "A legtöbb szóhoz tartozó kód és szavak: " << legtobbkod << endl;

    for(i=0; i<db; i++) {

        if(kod(szavak[i])==legtobbkod) {
            cout << szavak[i] << endl;

        }
    }

    cin.get();
    return 0;
}
