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át107 }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 lesz149 150 for(auto elem:s)151 {152 if(elem.d!="NI") // ismert a vetítés dátuma153 {154 e=atoi(elem.d.substr(0,4).c_str()); // dátum "mező" elemekre bontása és egészre konvertálása155 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ése160 }161 }162 163 }164 if(filmcim.size()==0)165 cout << "Az adott napon nem kerül adásba sorozat." << endl;166 else167 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ése176 int epizodok_szama=0, hossz; // összesítéshez, számolásokhoz177 for(auto elem:s) // minden elemet vizsgálunk a vektorban178 {179 if(elem.c==akt_cim) // ha cím azonos a kiemelttel, akkor...180 {181 epizodok_szama++; // számláló növelése182 hossz=elem.h; // adott sorozat epizódjainak a hossza183 }184 else185 {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 kiemelt188 hossz=elem.h; // ez a hossza189 epizodok_szama=1; // és egy epizód már van is belőle190 }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 }