|
sms200705_C++.cpp
|
|
1 #include <iostream> // cin és cout parancsok
2 #include <fstream> // fájlkezelés
3 #include <vector> // vector adattípushoz
4 #include <map> // szótár adattípushoz
5 #include <set> // szótár adattípushoz
6 #include <algorithm> // sort, find és count_if függvények
7
8 using namespace std;
9
10 int betu_kodja(vector<char> b,char betu) // adott betű kódjának meghatározása
11 {
12 auto it=find(b.begin(), b.end(), betu); // megkeressük a betű "indexét" a vektorban
13 if(it!=b.end()) // ha megtaláljuk, akkor
14 return it-b.begin(); // vissza adjuk az indexet
15 }
16
17 string szo_kodja(vector<char> b,vector<int> k,string sz) // adott szó kódja
18 {
19 string s=""; // stringként építjük fel a kódot
20 for(auto betu:sz) // a szó betűire alkalmazzuk a betu_kodja függvényt
21 {
22 s+=to_string(k[betu_kodja(b,betu)]); // to_string: kódot stringre alakítja pl. 4 --> "4"
23 }
24 return s;
25 }
26
27 void kodhoz_tartozo_szavak(vector<string> szk,vector<string> szk_kodja,string keresett_kod,map<string,vector<string>> &kod_es_szavai)
28 {
29
30 for(int i=0;i<szk_kodja.size();i++)
31 {
32 if(szk_kodja[i]==keresett_kod)
33 kod_es_szavai[keresett_kod].push_back(szk[i]);
34 }
35 }
36
37 void F1(vector<char> b,vector<int> k)
38 {
39 cout << "1. feladat" << endl;
40 char betu;
41 cout << "Kérek egy betűt: (a-z) ";
42 cin >> betu;
43 cout << "A betű kódja: " << k[betu_kodja(b,betu)] << endl;
44 }
45
46 void F2(vector<char> b,vector<int> k)
47 {
48 cout << "1. feladat" << endl;
49 string szo;
50 cout << "Kérek egy szót: ";
51 cin >> szo;
52 cout << "A szó kódja: " << szo_kodja(b,k,szo) << endl;
53 }
54
55 void F3(vector<string> &szk)
56 {
57 cout << "3. feladat - szavak.txt (input)" << endl;
58 string tmp;
59 ifstream fbe;
60 fbe.open("szavak.txt");
61 while(fbe>>tmp)
62 {
63 szk.push_back(tmp);
64 }
65 fbe.close();
66 }
67
68 bool hossz_szerint(string a, string b) // ez az alternatív rendezési megoldáshoz kell, ha úgy akarjuk rendezni a szavakat...
69 {
70 return a.size() > b.size();
71 }
72
73 void F4(vector<string> szk)
74 {
75 cout << "4. feladat" << endl;
76 vector<string> tmp;
77 tmp=szk;
78 // rendezés csökkenő sorrendbe C++-os "lambda-kifejezéssel" szavak hossza szerint
79 sort(tmp.begin(),tmp.end(),[](string a, string b) {return a.size() > b.size();});
80 // vagy, alternatív megoldás:
81 // sort(tmp.begin(),tmp.end(),hossz_szerint);
82 cout << "A leghosszabb szó: " << tmp[0] << ", hossza: " << tmp[0].size() << " karakter" << endl;
83 }
84
85 void F5(vector<string> szk)
86 {
87 cout << "5. feladat" << endl;
88 // count_if itt kiválóan használható (itt is "lambda-kifejezést" használunk, mint a rendezésnél...)
89 cout << "Rövid szavak száma: " << count_if(szk.begin(),szk.end(), [](string item) {return (item.size()<=5);}) << endl;
90 }
91
92 void F6(vector<char> b,vector<int> k,vector<string> szk,vector<string> &szk_kodja)
93 {
94 cout << "6. feladat - kodok.txt (output)" << endl;
95 ofstream fki;
96 string tmp;
97 fki.open("kodok.txt");
98 for(int i=0;i<szk.size();i++) // végigmegyünk a szavak vektoron
99 {
100 tmp=szo_kodja(b,k,szk[i]); // előállítjuk az aktuális szó kódját
101 fki << tmp << endl; // kiírjuk a fájlba
102 szk_kodja.push_back(tmp); // elhelyezzük a szavak_kodja vektorban
103 }
104 fki.close();
105 }
106
107 void F7_8_9(vector<string> szk,vector<string> szk_kodja)
108 {
109 cout << "7. feladat" << endl;
110 string kod; // ezt a kódot adja majd meg a felhasználó
111 cout << "Kérek egy kódot: ";
112 cin >> kod;
113 // szótár: kulcs a kód, szótárbejegyzés a szavak vektora, amik a kódhoz tartoznak (egy vagy több szó vektora)
114 map<string,vector<string>> kod_es_szavai;
115 set<string> kodhalmaz(szk_kodja.begin(),szk_kodja.end()); // a szavak kódja vektorból halmazt készítünk, ismétlődő kódok miatt
116 for(auto k:kodhalmaz) // a halamzon megyünk végig és veszünk egy-egy kódot
117 {
118 kodhoz_tartozo_szavak(szk,szk_kodja,k,kod_es_szavai); // összeállítjuk a szótárbejegyzést (kulcs:kód, bejegyzés: vektor a szavaiból)
119 }
120 // 7. feladat kiírása
121 cout << kod << ": ";
122 for(auto szo:kod_es_szavai[kod]) // a kod kulcsú szótárelem kiírása a 7. feladathoz
123 cout << szo << " ";
124 cout << endl;
125 cout << "8. feladat" << endl;
126 int maxh=0; // 9. feladathoz kell, a legtöbb szóvt tartalmazó szótárelemhez
127 map<string,vector<string>> maxi; // ebben a szótárban lesz a legtöbb szóval rendelkező kód, mint kulcs és a szavak (mint érték a kulcshoz)
128 string maxi_kod; // a legtöbb szóval rendelkező kód
129 for(auto elem:kod_es_szavai) // 111. sorban összeállított szótár bejárása
130 {
131 if(elem.second.size()>1) // csak azokkal a szótárelemekkel foglalkozunk, ahol egy kódhoz több szó is tartozik
132 {
133 if(elem.second.size()>maxh) // itt keressük a maximális szószámmal rendelkező szótárelemet
134 {
135 // 9. feladat
136 maxh=elem.second.size();
137 maxi_kod=elem.first;
138 maxi[maxi_kod]=elem.second; // a szavak vektora a maxi_kodhoz rendelődik, mint kulcshoz
139 }
140 for(auto e:elem.second) // egy szótárbejegyzés kiírása (ne feldjük, hogy ez egy vektor
141 {
142 cout << e << " : " << elem.first << "; "; // szó majd a kulcs (kód) kiírása, mint a mintában...
143 }
144 }
145 }
146 cout << endl;
147 cout << "9. feladat" << endl;
148 cout << "Legtöbb szóhoz kapcsolódó kód: " << maxi_kod << endl; // 9. feladat kiírási része
149 cout << "Szavak: ";
150 for(auto e:maxi[maxi_kod]) {cout << e << " ";}
151 cout << endl;
152 }
153
154 int main()
155 {
156 setlocale(LC_ALL,"");
157 vector<int> kodok={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};
158 vector<char> betuk;
159 vector<string> szavak, szavak_kodja;
160 for(int i=97;i<123;i++) betuk.push_back(char(i));
161 F1(betuk,kodok);
162 F2(betuk,kodok);
163 F3(szavak);
164 F4(szavak);
165 F5(szavak);
166 F6(betuk,kodok,szavak,szavak_kodja);
167 F7_8_9(szavak,szavak_kodja);
168 return 0;
169 }