#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <list>
#include <iterator>
#include <algorithm>
#include <numeric>
using namespace std;
// Fahreinheit-be átszámoló sima függvény
void ToFahreinheit(double& x) { x = x * 9 / 5 + 32; }
// Double számot kiíró függvény
void Kiir(double x) { cout << x << "\t"; }
// Celsius-ba átszámoló fgv objektum
class ToCelsius {
public:
// operátor ()-t el kell készíteni!
void operator()(double& x) { x = (x - 32) * 5 / 9; }
};
enum Lang{ L_HUN, L_ENG };
class Contact {
private:
string fname; //keresztnév
string lname; //vezetéknév
list<string> tel; //telefon
public:
static Lang lang; //statikus nyelv
Contact(string f, string l, string t = "") : fname(f), lname(l) //konstruktor
{
tel.push_back(t);
}
string GetFname() const { return fname; }
string GetLname() const { return lname; }
void SetFname(string s) { fname = s; }
void SetLname(string s) { lname = s; }
void AddTel(string n) { tel.push_back(n); tel.sort(); }
void Print() // nyelv szerinti megjelenítés
{
if (lang == L_HUN) cout << lname << " " << fname << " ";
else cout << fname << " " << lname << " ";
copy(tel.begin(), tel.end(), ostream_iterator<string>(cout, " | "));
cout << endl;
}
bool operator < (const Contact& b) { return fname < b.fname; } //sort keresztnevek
bool operator == (const Contact& b) { return fname == b.fname && lname == b.lname; }; //find nevek egyezése
};
Lang Contact::lang = L_ENG; //angol megjelenítés
class EngName {
public:
string operator()(const Contact& a) { return a.GetFname() + " " + a.GetLname(); }
};
int main()
{
vector<double> adatok; //vektor adatok számára / nincs megadva a mérete
ifstream fbe("adat.txt"); //soronként számokat tartalmazó szövegfájl
if (!fbe.is_open()) {
cout << "Nincs adat.txt!";
return -1;
}
while (!fbe.eof()) //fájl végéig, de nincs elõolvasás
{
string sor;
getline(fbe, sor);
if (!sor.empty()) //ezért meg kell vizsgálni, hogy sikerült-e beolvasni valamit
adatok.push_back(stod(sor)); // ha igen, akkor a vektor végéhez adja
}
fbe.close();
vector<double>::iterator it; // iterátor a vektor bejárásához
for (it = begin(adatok); it != adatok.end(); it++) // elejétõl a végéig
cout << *it << "\t"; // *it az iterátor által mutatott adat
it = min(adatok.begin(), adatok.end()); // csak két elem közül a kisebbet adja!!!
cout << "Min: " << *it << endl;
cout << "Max: " << *(max_element(adatok.begin(), adatok.end())) << endl; //teljes tartományban
cout << "konvertalas Fahreinheit-re:\n";
for_each(adatok.begin(), adatok.end(), ToFahreinheit); // fgv pointer használata
for_each(adatok.begin(), adatok.end(), Kiir); // fgv pointer használata
ofstream fki("adatF.txt"); // fájl megnyitása írásra
if (fki.is_open())
//double típusú adatok átmásolása a ostream_iterátor segítségével egy fájl kimenetre
copy(adatok.begin(), adatok.end(), ostream_iterator<double>(fki, "\n"));
fki.close();
cout << "\nkonvertalas Celsius-ra:\n";
for_each(adatok.begin(), adatok.end(), ToCelsius()); //átkonvertálás fgv. objektum segítségével
for_each(adatok.begin(), adatok.end(), Kiir);
double szum = 0;
for_each(adatok.begin(), adatok.end(),
[&szum](double x) {szum += x; }); //lambda kifejezés használata
double osszeg = accumulate(adatok.begin(), adatok.end(), 0.0); //numeric fajlécben
cout << "\nAtlag: " << szum / adatok.size() << endl;
cout << "Elemszam: " << adatok.size() << " Kapacitas: " << adatok.capacity() << endl;
// elemszám növelése
adatok.push_back(10);
cout << "Elemszam: " << adatok.size() << " Kapacitas: " << adatok.capacity() << endl;
// elemek rendezése, nincs sort tagfüggvénye a vectornak
// de van sort algoritmus tárolókra
sort(adatok.begin(), adatok.end()); //alapértelmezés szerint növekvő
cout << "Rendezes novekvo sorrendbe:" << endl;
for_each(adatok.begin(), adatok.end(), Kiir);
cout << endl;
// rendezés csökkenő sorrendbe functional használatával
sort(adatok.begin(), adatok.end(), greater<double>()); //csökkenő sorrend
cout << "Rendezes csokkeno sorrendbe:" << endl;
for_each(adatok.begin(), adatok.end(), Kiir);
cout << endl;
list<Contact> Reg; //Telefon regiszter
Reg.push_back(Contact("Kata", "Kiss", "1242423"));
Reg.push_back(Contact("Tamas", "Nagy", "4354543"));
Reg.back().AddTel("7897895"); // neki 2 telefonja is van
Reg.insert(next(Reg.begin(), 1), Contact("Antal", "Molnar", "536334")); //2. elem lesz
//elem keresése a listában
Contact sz = Contact("Tamas", "Nagy");
list<Contact>::iterator regit = find(Reg.begin(), Reg.end(), sz); //elem megkeresése == operátor
if (regit != Reg.end()) regit->AddTel("345679"); //ha megtalálta
cout << "Eng:" << endl;
Reg.sort(); //sorba rendezés angol < operátor
for (regit = Reg.begin(); regit != Reg.end(); regit++) regit->Print(); //kiíratás eng
cout << "Hun" << endl;
Contact::lang = L_HUN; //az összes osztályra érvényes átalakítása
// sorba rendezés lamdba kifejezés
Reg.sort([](const Contact& a, const Contact& b)->bool {return a.GetLname() < b.GetLname(); }); // sorba magyar
for (regit = Reg.begin(); regit != Reg.end(); regit++) regit->Print(); //kiíratás hun
//Átalakítás
vector<string> nevek(Reg.size());
transform(Reg.begin(), Reg.end(), nevek.begin(), [](Contact a)->string { return a.GetLname() + " " + a.GetFname(); });
cout << "Hun: " << endl;
for (auto nev : nevek) cout << nev << endl;
transform(Reg.begin(), Reg.end(), nevek.begin(), EngName());
cout << "Eng: " << endl; sort(nevek.begin(), nevek.end()); //növekvõ sorrend algoritmussal
for (auto nev : nevek) cout << nev << endl;
}