1  #include <iostream>         // cin cout
  2  #include <fstream>          // fájlkezelés
  3  #include <sstream>          // stringstream F1 string darabolás
  4  #include <vector>           // vector adattípusokhoz
  5  #include <string>           // stringekhez stoi
  6  #include <set>              // set adattípusokhoz (halmazok --> utca és tulaj)
  7  
  8  using namespace std;
  9  
 10  // string szavakra "hasogatása" egy vectorba
 11  vector<string> split(string sor)
 12  {
 13      stringstream line(sor);         // ez olyasmi, mint az (i/o)fstream, ahol a sor a fájltartalom
 14      vector<string> split_sor;
 15      string temp;
 16      while(line>>temp)
 17      {
 18          split_sor.push_back(temp);
 19      }
 20      return split_sor;
 21  }
 22  
 23  void F1(vector<int> &es, vector<vector<string>> &t)
 24  {
 25      ifstream fbe;
 26      fbe.open("utca.txt");
 27  
 28      string sav,sor;             // fájl elsõ sora és a többi sor
 29      getline(fbe,sav);           // elsõ sor beolvasása ("800 600 100")
 30      stringstream savok(sav);    // 3 szóra bontáshoz kell ez az elõkészítés...
 31  
 32      int szam;
 33      while(savok>>szam)          // ...itt, és itt már egész számokként (es) kerülnek vectorba
 34          es.push_back(szam);     // {800, 600, 100}
 35      // for(auto e:es) cout << e << endl;
 36  
 37      string elvalaszto = " ";    // fájl soraiban a szavakat elválasztó karakter
 38      vector<string> v;           // ebbe a vectorba kerül a soronkénti 5 szó
 39      while(getline(fbe,sor))
 40      {
 41          v=split(sor);
 42          t.push_back(v);
 43      }
 44      /*
 45      for(auto i=0;i<t.size();i++)
 46      {
 47          for(auto j=0;j<5;j++)
 48              cout << t[i][j] << " ";
 49          cout << endl;
 50      }
 51      */
 52  
 53      fbe.close();
 54  }
 55  
 56  int F2(vector<vector<string>> t)
 57  {
 58      return t.size();            // a "mátrix" mérete
 59  }
 60  
 61  void F3(vector<vector<string>> t)
 62  {
 63      string adoszam;
 64      cout << "3. feladat. Egy tulajdonos adószáma: ";   //68396
 65      cin >> adoszam;
 66      for(auto i=0;i<t.size();i++)
 67      {
 68          if(t[i][0]==adoszam) cout << t[i][1] << " utca " << t[i][2] << endl;
 69      }
 70  }
 71  
 72  int ado(vector<int> ABC, string as, int nm)    // + az elõíráshoz képest az ABC vector (800,600,100)
 73  {                                              // as - adósáv pl.: "A", nm - négyzetméter
 74      int fizet;
 75      if(as=="A") fizet=ABC[0]*nm;
 76      if(as=="B") fizet=ABC[1]*nm;
 77      if(as=="C") fizet=ABC[2]*nm;
 78      if(fizet<10000) return 0; else return fizet;
 79  }
 80  
 81  void F5(vector<int> ABC, vector<vector<string>> t)
 82  {
 83      int ABC_db[3]={0,0,0};                      // minden adósávnak egy-egy nulla kezdõérték
 84      int ABC_ado[3]={0,0,0};                     // sávonkénti összegzéshez kezdõértékek
 85      int nm;                                     // nm- négyzetméter
 86      for(auto adat:t)                            // t vector "bejárása"
 87      {
 88          nm=stoi(adat[4]);                       // stringbõl int (stoi)
 89          if(adat[3]=="A")
 90          {
 91              ABC_db[0]++;
 92              ABC_ado[0]+=ado(ABC,"A",nm);
 93          }
 94          if(adat[3]=="B")
 95          {
 96              ABC_db[1]++;
 97              ABC_ado[1]+=ado(ABC,"B",nm);
 98          }
 99          if(adat[3]=="C")
100          {
101              ABC_db[2]++;
102              ABC_ado[2]+=ado(ABC,"C",nm);
103          }
104      }
105      cout << "5. feladat" << endl;
106      string abc[3]={"A","B","C"};                   // csak a kiírás miatt, hogy egy sorral el lehessen intézni
107      for(auto i=0;i<3;i++)
108      {
109          cout <<  abc[i] << " sávba " << ABC_db[i] << " telek esik, az adó " << ABC_ado[i] << " Ft." << endl;
110      }
111  }
112  
113  void F6(vector<vector<string>> t)
114  {
115      cout << "6. feladat. A több sávba sorolt utcák:" << endl;
116      set<string> utca;        // halmaz az utcaneveknek, csak egyedi értékek lehetnek benne, ez az elõnye
117      for(auto i=0;i<t.size();i++)
118      {
119          utca.insert(t[i][1]);   // halmaz "feltöltése" - egy utcanév, ugye, csak egyszer lesz benne...
120      }
121      set<string> savos;          // halmaz az "A" vagy "B" vagy "C" sávoknak
122      for(auto u:utca)            // utcanevek "végignézése"
123      {
124          savos.clear();          // sávok halmaz legyen üres
125          for(auto j=0;j<t.size();j++)    // telkek pörgetése
126          {
127              if(t[j][1]==u)              // adott utca van soron...
128              {
129                  savos.insert(t[j][3]);  // ...akkor az "A" vagy "B" vagy "C" megy a halmazba
130              }
131          }
132          if(savos.size()>1)              // ha egy adott utcánál két vagy több sáv is a halmazba került,...
133          {
134              cout << u << endl;          // ...akkor azt kiírjuk
135          }
136      }
137  }
138  
139  void F7(vector<int> ABC, vector<vector<string>> t)
140  {
141      set<string> tulaj;                  // halmaz a tulajdonosok adószámának
142      for(auto i=0;i<t.size();i++)
143      {
144          tulaj.insert(t[i][0]);          // halmaz "töltése"
145      }
146      ofstream fki;
147      fki.open("fizetendo.txt");
148      int adoFt;
149      for(auto tu:tulaj)                  // tulajdonosok, azaz adószámok "bejárása"
150      {
151          adoFt=0;
152          for(auto i=0;i<t.size();i++)    // telkek "böngészése"
153          {
154              if(t[i][0]==tu)             // ha éppen az adott tulaj jön...
155              {
156                  adoFt+=ado(ABC,t[i][3],stoi(t[i][4]));  // ...akkor számoljuk, összegezzük az adóját
157              }
158          }
159          fki << tu << " " << adoFt << endl;
160      }
161      fki.close();
162  }
163  
164  int main()
165  {
166      setlocale(LC_ALL,"hun");
167  
168      vector<int> ABC;                    // adósávok forintjai (800, 600, 100)
169      vector<vector<string>> telkek;      // telkek adatai 5 elemû vectorok vectora (listák listája --> Python)
170  
171      F1(ABC, telkek);
172  
173      // csak, hogy legyen egy nem void-os függvény is
174      cout << "2. feladat. A mintában " << F2(telkek) << " telek szerepel." << endl;
175  
176      F3(telkek);
177      F5(ABC,telkek);
178      F6(telkek);
179      F7(ABC,telkek);
180  
181      return 0;
182  }