﻿#include <iostream>
#include <cstdlib>
#include <fstream>
#include <string>
#include <sstream>
#include <algorithm>



using namespace std;

string nyiltszoveg;
string nagybetusszoveg;


string atalakit(string nyiltszoveg) {

stringstream nagybetus;

 unsigned int i=0;
 while(i<nyiltszoveg.length() && i<256) {

    if(nyiltszoveg[i]=='á' || nyiltszoveg[i]=='Á') nyiltszoveg[i]='a';
    else if(nyiltszoveg[i]=='é' || nyiltszoveg[i]=='É') nyiltszoveg[i]='e';
    else if(nyiltszoveg[i]=='í' || nyiltszoveg[i]=='Í') nyiltszoveg[i]='i';
    else if(nyiltszoveg[i]=='ú' || nyiltszoveg[i]=='Ú' || nyiltszoveg[i]=='ü' ||
            nyiltszoveg[i]=='Ü' || nyiltszoveg[i]=='u' || nyiltszoveg[i]=='û' || nyiltszoveg[i]=='Û') nyiltszoveg[i]='u';
    else if(nyiltszoveg[i]=='ó' || nyiltszoveg[i]=='Ó' || nyiltszoveg[i]=='ö' ||
            nyiltszoveg[i]=='Ö' || nyiltszoveg[i]=='õ' || nyiltszoveg[i]=='Õ') nyiltszoveg[i]='o';

    if(toupper(nyiltszoveg[i])>='A' && toupper(nyiltszoveg[i])<='Z') {
        nagybetus << (char) toupper(nyiltszoveg[i]);
    }
    i++;
    }

    return nagybetus.str();


}

int main()
{
    setlocale(LC_ALL, "hun");


    ///1. feladat nyilt szöveg bekérése
    //getline(cin,nyiltszoveg);

    //cout << atalakit(nyiltszoveg) << endl;
    char nyiltszoveg[255];
    char kulcs[5];

    ///A nyílt szöveg átalakítása és kiíratása
    cout << "Adjon meg egy szöveget: " << endl;
    gets(nyiltszoveg);
    cout << atalakit(nyiltszoveg) << endl;

    ///A kód bekérése és átalakítása
    cout << "Adjon meg a kulcsot, amely legfeljebb 5 karakter hosszú: " << endl;
    gets(kulcs);
    cout << atalakit(kulcs) << endl;

    string kodolandoszoveg=atalakit(nyiltszoveg);   ///Kódolásnak megfelelõen
    string atalakitottkulcs=atalakit(kulcs);        ///Kódolás szabályának megfelelõen
    char hosszukulcs[kodolandoszoveg.length()];     ///A hosszú kulcs a kódolandó szöveggel egyforma hosszú
    unsigned int k=0;
    while(k!=kodolandoszoveg.length()) {

        int index=k%atalakitottkulcs.length();      ///Kulcs hosszának megfelelõen ismétlés
        cout << atalakitottkulcs[index];

        hosszukulcs[k]=atalakitottkulcs[index];
    k++;
    }
    cout << endl;

    ///kódolás
    ifstream be;
    be.open("Vtabla.dat");
    if(be.fail()) {

        cout << "A fájl nem nyitható meg.";
        cin.get();
        exit(-1);

    }
    char kod[26][26];
    for(int i=0; i<26; i++) {

        for(int j=0; j<26; j++) {

            be >> kod[i][j];


        }

    }
    be.close();
    ///Fájlba és képernyõre írás

    ofstream ki;
    ki.open("kodol.dat");
     if(ki.fail()) {

        cout << "A fájl nem nyitható meg.";
        cin.get();
        exit(-1);

    }

    for(k=0; k<kodolandoszoveg.length();k++) {
        bool oszlop=false, sor=false;
        int oszlopindex, sorindex;
        int o=0, s=0;
        while(!oszlop){

           if(kod[o][0]==kodolandoszoveg[k]) {

            oszlop=true;
            oszlopindex=o;

           }
           o++;
        }

        while(!sor){

           if(kod[0][s]==hosszukulcs[k]) {

            sor=true;
            sorindex=s;

           }
           s++;
        }
        cout << kod[oszlopindex][sorindex];
        ki << kod[oszlopindex][sorindex];
    }

    ki.close();
    cin.get();
    return 0;
}
