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  }