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 }