sorozatok202010C++.cpp
  1  #include <iostream>             // cin, cout
  2  #include <fstream>              // fájlkezelés
  3  #include <vector>               // vector adattípushoz
  4  #include <set>                  // set (halmaz) adattípushoz
  5  #include <cstdlib>              // atoi (integerré konvertál stringeket
  6  
  7  using namespace std;
  8  
  9  class sorozat
 10  {
 11  public:
 12      string d;   // dátum - pl.: 2017.07.16
 13      string c;   // sorozat címe - pl.: Games
 14      string e;   // évad és epizód - pl.: 7x01
 15      int h;      // epizódok hossza - pl.: 60
 16      int m;      // megnézte már vagy nem - pl.: 1 (vagy 0)
 17  };
 18  
 19  // Ez igazából nem kellene, csak gyakoroljuk vele a class használatát
 20  // Lehetne az adatok kezelése egy egyszerű struktúrával és mátrix segítségével
 21  // Most vectorral dolgozunk, aminek vectorok az elemei és azok egy osztály objektumai
 22  // Ez a modul (convert_class) a szövegesen kezelt forrásadatokat alakítja a class-ban megadott típusokra
 23  // Később ez egyszerűsíti a dolgokat, de most túl bonyolultnak látszik... :)
 24  void convert_class(vector<sorozat> &s, vector<vector<string>> ts)
 25  {
 26      sorozat temp;
 27      for(int i=0;i<ts.size();i++)
 28      {
 29          for(int j=0;j<ts[i].size();j++)
 30          {
 31              switch(j)
 32              {
 33                  case 0:
 34                      temp.d=ts[i][j];                    // dátum, ami szöveges marad
 35                      break;
 36                  case 1:
 37                      temp.c=ts[i][j];                    // cím, ami szöveges marad
 38                      break;
 39                  case 2:
 40                      temp.e=ts[i][j];                    // évadXepizód, ami szöveges marad
 41                  case 3:
 42                      temp.h=atoi(ts[i][j].c_str());      // epizód hossza, ami integer lesz
 43                      break;
 44                  case 4:
 45                      temp.m=atoi(ts[i][j].c_str());      // megnézte vagy nem, ami integer lesz
 46                      break;
 47              }
 48  
 49          }
 50          s.push_back(temp);
 51      }
 52  }
 53  // s - sorozat objektumok vektora, ts - szöveges vektorok vektora <--- ebbe olvassuk a fájlt
 54  // majd konvertáljuk sorozat objektumok vektorává
 55  void F1(vector<sorozat> &s, vector<vector<string>> &ts)
 56  {
 57      ifstream fbe;
 58      fbe.open("lista.txt");
 59      string sor;
 60      vector<string> temp;            // Ebbe kerül 5 sor a fájlból (ezek az összetartozó adatok)
 61      int i=1;                        // i segítségével számoljuk a sorokat
 62      while(getline(fbe,sor))         // A címek miatt kell a getline, mert azokban lehet szóköz is
 63      {
 64          temp.push_back(sor);        // beolvasott sor megy az átmenti vektorba
 65          if(i==5)                    // ha megvan az 5 sor, akkor...
 66          {
 67              ts.push_back(temp);     // megy a ts-be
 68              temp.clear();           // átmeneti listát "ürítjük" a következő 5 sor számára
 69              i=0;
 70          }
 71          i++;
 72      }
 73      fbe.close();
 74      convert_class(s,ts);            // ts ---> s
 75  }
 76  
 77  void F2(vector<sorozat> s)
 78  {
 79      cout << "2. feladat" << endl;
 80      int db=0;
 81      for(auto elem:s)
 82      {
 83          if(elem.d!="NI") db++;          // dátum "mező"
 84      }
 85      printf("A listában %d db vetítési dátummal rendelkező epizód van.\n", db);
 86  }
 87  
 88  void F3(vector<sorozat> s)
 89  {
 90      cout << endl << "3. feladat" << endl;
 91      int db=0;
 92      for(auto elem:s)
 93      {
 94          if(elem.m==1) db++;             // megnézte-e "mező"
 95      }
 96      float arany=(float) db/(float) s.size()*100;
 97      printf("A listában lévő epizódok %.2f%s-át látta.\n",arany,"%");
 98  }
 99  
100  void F4(vector<sorozat> s)
101  {
102      cout << endl << "4. feladat" << endl;
103      int szumma=0;
104      for(auto elem:s)
105      {
106          if(elem.m==1) szumma+=elem.h;   // ha megnézte, akkor összesítjük az epizódok hosszát
107      }
108      int nap=szumma/(24*60);
109      int ora=szumma%(24*60)/60;
110      int perc=szumma%(24*60)%60;
111      printf("Sorozatnézéssel %d napot %d órát és %d percet töltött.\n",nap,ora,perc);
112  }
113  
114  void F5(vector<sorozat> s)
115  {
116      cout << endl << "5. feladat" << endl;
117      string datum;
118      cout << "Adjon meg egy dátumot! Dátum= ";
119      cin >> datum;
120      for(auto elem:s)
121      {
122          if(elem.d<=datum&&elem.m==0)        // ha dátum jó és még nem nézte meg, akkor...
123          {
124              cout << elem.e << "\t" << elem.c << endl;       //... kiírjuk!
125          }
126      }
127  }
128  
129  string hetnapja(int ev, int ho, int nap)
130  {
131      string napok[7]={"v", "h", "k", "sze", "cs", "p", "szo"};
132      int honapok[12]={0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
133      if(ho<3)
134      {
135          ev--;
136      }
137      int index=(ev + ev/4 - ev/100 + ev/400 + honapok[ho-1] + nap) % 7;
138      return napok[index];
139  }
140  
141  void F7(vector<sorozat> s)
142  {
143      cout << endl << "7. feladat" << endl;
144      cout << "Adja meg a hét egy napját (például cs)! Nap= ";
145      string day;
146      cin >> day;
147      int e,h,n;
148      set<string> filmcim;            // halmazt használunk, így az ismétlődő filmcímekből csak egy lesz
149  
150      for(auto elem:s)
151      {
152          if(elem.d!="NI")            // ismert a vetítés dátuma
153          {
154              e=atoi(elem.d.substr(0,4).c_str());     // dátum "mező" elemekre bontása és egészre konvertálása
155              h=atoi(elem.d.substr(5,2).c_str());
156              n=atoi(elem.d.substr(8,2).c_str());
157              if(hetnapja(e,h,n)==day)
158              {
159                  filmcim.insert(elem.c);             // címek halmazba helyezése
160              }
161          }
162  
163      }
164      if(filmcim.size()==0)
165          cout << "Az adott napon nem kerül adásba sorozat." << endl;
166      else
167          for(auto cim:filmcim) cout << cim << endl;
168  }
169  
170  void F8(vector<sorozat> s)
171  {
172      cout << endl << "8. feladat" << endl;
173      ofstream fki;
174      fki.open("summa.txt");
175      string akt_cim=s[0].c;                          // az első filmcím kiemelése
176      int epizodok_szama=0, hossz;                    // összesítéshez, számolásokhoz
177      for(auto elem:s)                                // minden elemet vizsgálunk a vektorban
178      {
179          if(elem.c==akt_cim)                         // ha cím azonos a kiemelttel, akkor...
180          {
181              epizodok_szama++;                       // számláló növelése
182              hossz=elem.h;                           // adott sorozat epizódjainak a hossza
183          }
184          else
185          {
186              fki << akt_cim << " " << epizodok_szama*hossz << " " << epizodok_szama << endl;     // másik cím jön...
187              akt_cim=elem.c;                         // ez lesz az új kiemelt
188              hossz=elem.h;                           // ez a hossza
189              epizodok_szama=1;                       // és egy epizód már van is belőle
190          }
191      }
192      fki.close();
193  }
194  
195  int main()
196  {
197      setlocale(LC_ALL,"");
198      vector<sorozat> sorozatok;
199      vector<vector<string>> temp_sorozatok;
200      F1(sorozatok,temp_sorozatok);
201      F2(sorozatok);
202      F3(sorozatok);
203      F4(sorozatok);
204      F5(sorozatok);
205      F7(sorozatok);
206      F8(sorozatok);
207  
208      return 0;
209  }