1 #include <iostream> // cin, cout
2 #include <fstream> // fájlkezelés
3 #include <string> // string (szövegek)
4 #include <vector> // vector adattípus
5 #include <algorithm> // max_element
6 #include <iomanip> // setw, setprecision
7
8 using namespace std;
9
10 vector<string> beolvas(string fajl)
11 {
12 vector<string> abra;
13 ifstream fbe;
14 fbe.open(fajl);
15 string sor;
16 while(getline(fbe, sor))
17 {
18 abra.push_back(sor);
19 }
20 fbe.close();
21 return abra;
22 }
23
24 bool hossz_szerint(string a, string b)
25 {
26 return a.size() < b.size();
27 }
28
29 void kiir(vector<string> abra, int ism, string fajl)
30 {
31 string sor, ende;
32 ofstream fki;
33 if(fajl != "")
34 fki.open(fajl);
35 if(ism == 1)
36 ende = "";
37 else
38 ende = " | ";
39 string maxhossz = *max_element(abra.begin(), abra.end(), hossz_szerint);
40
41 for(auto sor: abra)
42 {
43 for(int i = 0; i < ism; i++)
44 {
45 cout << left << setw(maxhossz.size()+2) << sor << ende;
46 if(fajl != "") fki << left << setw(maxhossz.size()+2) << sor << ende;
47 }
48 cout << endl;
49 if(fajl != "") fki << endl;
50 }
51 if(fajl != "") fki.close();
52 }
53
54 string atalakit(string blokkok)
55 {
56 string tomoritetlen = "";
57 int x;
58 for(int i = 0; i < blokkok.size(); i++)
59 {
60 if(i % 2 == 0)
61 x = blokkok[i] - '0';
62 else
63 for(int j = 0; j < x; j++) tomoritetlen += blokkok[i];
64 }
65 return tomoritetlen;
66 }
67
68 void szg(string fajlin, string fajlout)
69 {
70 cout << "\n4. feladat" << endl;
71 vector<string> forras = beolvas(fajlin);
72 vector<string> abra;
73 for(string sor: forras)
74 abra.push_back(atalakit(sor));
75 kiir(abra, 1, fajlout);
76 }
77
78 void tomorites_vizsgalat()
79 {
80 cout << "\n5. feladat" << endl;
81 string t1, t2;
82
83 cout << "Kérem adja meg a tömörített ábra fájlnevét: "; // konyv_t.txt
84 cin >> t1;
85 cout << "Kérem adja meg a tömörítetlen ábra fájlnevét: "; // konyv.txt
86 cin >> t2;
87 ifstream fbe1, fbe2;
88 fbe1.open(t1);
89 fbe2.open(t2);
90 string sor, text1 = "", text2 = "";
91 while(getline(fbe1, sor)) text1 += sor;
92 while(getline(fbe2, sor)) text2 += sor;
93 int t1_hossz = text1.size() - count(text1.begin(), text1.end(), '\n');
94 int t2_hossz = text2.size() - count(text2.begin(), text2.end(), '\n');
95 cout << "A karakterek száma a tömörített állományban: " << t1_hossz << endl;
96 cout << "A karakterek száma a tömörítetlen állományban: " << t2_hossz << endl;
97 cout << "A tömörítési arány: " << setprecision(2) << float(t1_hossz)/float(t2_hossz) << endl;
98 }
99
100 void statisztika(string fajl)
101 {
102 cout << "\n6. feladat" << endl;
103 vector<string> abra = beolvas(fajl);
104 cout << "Az ábra magassága sorokban: " << abra.size() << endl;
105 vector<int> hosszak;
106 int blokkok = 0, hossz;
107 for(string sor: abra)
108 {
109 hossz = 0;
110 for(int i = 0; i < sor.size(); i++)
111 {
112 if(i % 2 == 0)
113 {
114 hossz += (sor[i] - '0');
115 blokkok += 1;
116 }
117 }
118 hosszak.push_back(hossz);
119
120 }
121 int maxhossz = *max_element(hosszak.begin(), hosszak.end());
122 cout << "Az ábra szélessége karakterekben: " << maxhossz << endl;
123 cout << "A blokkok száma: " << blokkok << endl;
124 }
125
126 int main()
127 {
128 setlocale(LC_ALL, "");
129 cout << "1. feladat" << endl;
130 vector<string> konyv = beolvas("konyv.txt");
131 kiir(konyv, 1, "");
132 cout << "\n2. feladat" << endl;
133 int ism;
134 cout << "Kérem adja meg az ismétlések számát: ";
135 cin >> ism;
136 kiir(konyv, ism, "");
137 szg("szg_t.txt", "szg.txt");
138 tomorites_vizsgalat();
139 statisztika("konyv_t.txt");
140 return 0;
141 }