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  }