|
furdostat201705idny_C++.cpp
|
|
1 #include <iostream> // cin és cout parancsok
2 #include <fstream> // fájlkezelés
3 #include <map> // szótár adattípushoz
4 #include <set> // halmaz adattípushoz
5 #include <vector> // vector adattípushoz
6 #include <cstring> // strcpy parancs
7
8 using namespace std;
9
10 struct mozgas // vendégek mozgása
11 {
12 int reszleg; // adott részleg
13 int ki_be; // ki- vagy bemenetel
14 int o, p, mp; // mikor: óra perc másodperc
15 };
16
17 void F1(map<int,vector<mozgas>> &m)
18 {
19 ifstream fbe;
20 fbe.open("furdoadat.txt");
21 mozgas temp; // ebbe olvassuk be a fájl sorait ideiglenesen
22 int id; // ez lesz a szótárunk kulcsa: a vendég azonosítója
23 while(fbe>>id&&fbe>>temp.reszleg&&fbe>>temp.ki_be&&fbe>>temp.o&&fbe>>temp.p&&fbe>>temp.mp)
24 {
25 m[id].push_back(temp); // szótár feltöltése: a szótár "bejegyzése" egy vector, az adott vendég mozgásaiból áll
26 }
27 fbe.close();
28 /*
29 for(auto elem:m)
30 {
31 cout << elem.first << ":" << endl;
32 for(auto e:elem.second)
33 {
34 cout << e.reszleg << " " << e.ki_be << " " << e.o << " " << e.p << " " << e.mp << endl;
35 }
36 cout << "----------------------" << endl;
37 }
38 */
39 }
40
41 void F2_3(map<int,vector<mozgas>> m)
42 {
43 cout << "2. feladat" << endl;
44 int min_ora=24,min_perc,min_mp, max_ora=0,max_perc,max_mp; // maximum- és minimumkeresés lesz
45 mozgas temp;
46 int db=0; // számláló ---> 3. feladathoz
47 for(auto elem:m) // szótár "kiolvasása", bejárása
48 {
49 if(elem.second.size()==4) db++; // ha egy szótárbejegyzés csak 4 elemû, akkor csak egy részlegen járt a vendég
50 temp=elem.second[0]; // a szótárbejegyzés vektorának elsõ eleme tartalmazza az öltözõbõl kilépést a fürdõbe
51 if(temp.o<min_ora) // minimum óra keresése
52 {
53 min_ora=temp.o;
54 min_perc=temp.p;
55 min_mp=temp.mp;
56 }
57 if(temp.o>max_ora) // maximum óra keresése
58 {
59 max_ora=temp.o;
60 max_perc=temp.p;
61 max_mp=temp.mp;
62 }
63 }
64 printf("Az elsõ vendég %d:%d:%d-kor lépett ki az öltözõbõl.\n",min_ora,min_perc,min_mp);
65 printf("Az utolsó vendég %d:%d:%d-kor lépett ki az öltözõbõl.\n",max_ora,max_perc,max_mp);
66 cout << "3. feladat" << endl;
67 printf("A fürdõben %d vendég járt csak egy részlegen.\n",db);
68 }
69
70 int szamol(mozgas k, mozgas v)
71 {
72 return (v.o*3600+v.p*60+v.mp)-(k.o*3600+k.p*60+k.mp); // két óra:perc:mp közötti különbség másodpercekben
73 }
74 void F4(map<int,vector<mozgas>> m)
75 {
76 cout << "4. feladat" << endl;
77 int vendeg,ido,max_ido=0; // itt is lesz egy maximumkeresés
78 mozgas kezd,vege;
79 for(auto elem:m) // szótár "kiolvasása", bejárása
80 {
81 kezd=elem.second.front(); // minden vendég (kulcs) esetén az elsõ vektorbeli elem
82 vege=elem.second.back(); // és az utolsó vektorbeli elem kell
83 ido=szamol(kezd,vege); // másodpercekben a két idõpont különbsége (szamol fv.)
84 if(ido>max_ido) // maximumvizsgálat
85 {
86 vendeg=elem.first; // szótár kulcsa (first) és
87 max_ido=ido; // az eltöltött idõ "memorizálása"
88 }
89 }
90 cout << "A legtöbb idõt eltöltõ vendég:" << endl;
91 printf("%d. vendég %d:%d:%d\n",vendeg,max_ido/3600,max_ido%3600/60,max_ido%3600%60); // másodperc vissza óra:perc:mp-be
92 }
93
94 int stat_sum(map<int,int> s,int k,int v)
95 {
96 // 6-8, 9-15 és 16-19 intervallumok összesítése a stat szótár alapján
97 int sum=0;
98 for(int key=k;key<v;key++) sum+=s[key]; // megfelelõ intervallumok összesítése a szótár alapján
99 return sum;
100 }
101
102 void F5(map<int,vector<mozgas>> m)
103 {
104 cout << "5. feladat" << endl;
105 map<int,int> stat; // újabb szótár: 6-19 közötti kulcsokkal,
106 for(int key=6;key<20;key++) // és nulla kezdõértékekkel
107 {
108 stat[key]=0;
109 }
110 for(auto elem:m) // szótár "kiolvasása", bejárása
111 {
112 stat[elem.second.front().o]++; // stat szótár megfelelõ kulcsú elemének növelése
113 }
114 printf("6-9 óra között %d vendég\n",stat_sum(stat,6,9));
115 printf("9-16 óra között %d vendég\n",stat_sum(stat,9,16));
116 printf("16-20 óra között %d vendég\n",stat_sum(stat,16,20));
117 }
118
119 void F6(map<int,vector<mozgas>> m)
120 {
121 cout << "6. feladat" << endl;
122 // Fájlkezelés egy újabb "technikája", csak hogy használhassuk az fprintf parancsot is!
123 FILE *fki;
124 fki=fopen("szauna.txt","w");
125 int ido;
126 mozgas kezd,vege;
127 for(auto elem:m) // szótár "kiolvasása", bejárása
128 {
129 ido=0; // szaunában (2) eltöltött ideje egy adott vendégnek, ha járt ott
130 for(int i=0;i<elem.second.size()-1;i++) // -1, mert i és i+1 indexeket nézünk...
131 {
132 if(elem.second[i].reszleg==2&&elem.second[i].ki_be==0) // ha szauna és éppen bement oda...
133 {
134 kezd=elem.second[i]; // ... ebben az idõben és
135 vege=elem.second[i+1]; // ekkor jött onnan ki
136 ido+=szamol(kezd,vege); // a 4. feladatban már használt szamol fv.
137 }
138 }
139 if(ido>0)
140 {
141 // printf("%d %d:%d:%d\n",elem.first,ido/3600,ido%3600/60,ido%3600%60); // másodpercek vissza ó:p:mp-be
142 fprintf(fki,"%d %d:%d:%d\n",elem.first,ido/3600,ido%3600/60,ido%3600%60); // fprintf fájlbaírás
143 }
144 }
145 fclose(fki);
146 }
147
148 void F7(map<int,vector<mozgas>> m)
149 {
150 cout << "7. feladat" << endl;
151 // részlegek: 1,2,3,4
152 map<int,int> reszlegek={{1,0},{2,0},{3,0},{4,0}}; // részlegek látogatottsági összegzése egy újabb szótárba
153 map<int,string> nev={{1,"Uszoda"},{2,"Szaunák"},{3,"Gyógyvizes medencék"},{4,"Strand"}}; // részlegek megnevezése szótárban
154 // Ha az adott részleget valaki többször felkereste, akkor is csak egy esetnek számít, ezért kell az alábbi szótár is!
155 map<int,bool> megnemszamoltam={{1,true},{2,true},{3,true},{4,true}}; // Még nem számoltam az adott részleg meglátogatását
156 for(auto elem:m) // szótár "kiolvasása", bejárása
157 {
158 for(auto e:elem.second) // az adott "kulcshoz", vendéghez tartozó vektor bejárása
159 {
160 if(megnemszamoltam[e.reszleg]) // megnemszamoltam szótár kulcsa maga a részleg (1,2,3,4), ha igaz akkor
161 {
162 reszlegek[e.reszleg]++; // számolunk vele (reszlegek szótár kulcsa is maga a részleg (1,2,3,4)
163 megnemszamoltam[e.reszleg]=false; // megfelelõ kulcsú részt hamisra állítjuk
164 }
165 }
166 megnemszamoltam={{1,true},{2,true},{3,true},{4,true}}; // ha egy vendéggel végeztünk, mindent alaphelyzetbe állítunk
167 }
168 char str[20]; // printf miatt kell
169 for(int key=1;key<5;key++)
170 {
171 strcpy(str, nev[key].c_str()); // string másolása char tömbbe
172 printf("%s: %d\n",str,reszlegek[key]); // %s csak char tömbökkel mûködik
173 }
174 // VAGY - SZÓTÁR ÉS HALMAZZAL KOMBINÁCIÓVAL OLDHATJUK MEG
175 cout << "------------------ SZÓTÁR ÉS HALMAZ KOMBÓ -------------------" << endl;
176 map<int,set<int>> reszlegek2;
177 for(auto elem:m) // szótár "kiolvasása", bejárása
178 {
179 for(auto e:elem.second) // az adott "kulcshoz", vendéghez tartozó vektor bejárása
180 {
181 reszlegek2[e.reszleg].insert(elem.first);
182 }
183 }
184 for(int key=1;key<5;key++)
185 {
186 strcpy(str, nev[key].c_str()); // string másolása char tömbbe
187 printf("%s: %d\n",str,reszlegek2[key].size()); // %s csak char tömbökkel mûködik
188 }
189 }
190
191 int main()
192 {
193 setlocale(LC_ALL,"");
194 map<int,vector<mozgas>> mozgasok;
195 F1(mozgasok);
196 F2_3(mozgasok);
197 F4(mozgasok);
198 F5(mozgasok);
199 F6(mozgasok);
200 F7(mozgasok);
201 return 0;
202 }