#include #include #include #include using namespace std; namespace zad_5 { class ParaSlow { protected: int n; string m_c; bool m_wewnatrz; bool m_sklejenie; public: // Definiujemy terminy, którymi dalej będziemy się posługiwać. // Początkowe n znaków. string poczatek(const string &s) { return s.substr(0, n); } // Końcowe n znaków. string koniec(const string &s) { return s.substr(s.length() - n, n); } // Reszta poza początkowymi n znakami. string reszta(const string &s) { return s.substr(n); } ParaSlow(const string &a, const string &b): m_wewnatrz(false), m_sklejenie(false) { // Program jest poprawny tylko jeśli długość a >= długości b // co wynika z treści zadania. assert(a.length() >= b.length()); if (a.find(b) != string::npos) { m_c = a; m_wewnatrz = true; return; } // Jest chyba oczywiste co robi poniższa pętla :) for(n = b.length(); n > 0; n--) { if (koniec(b) == poczatek(a)) { m_c = b + reszta(a); return; } if (koniec(a) == poczatek(b)) { m_c = a + reszta(b); return; } } m_c = a + b; m_sklejenie = true; } string c() { return m_c; } bool sklejenie() { return m_sklejenie; } bool wewnatrz() { return m_wewnatrz; } }; bool palindrom(const string &s) { for(int i = 0; i < s.length() / 2; i++) { if (s[i] != s[s.length() - 1 - i]) return false; } return true; } class Slowa { protected: int m_palindromy; int m_wewnatrz; int m_sklejenia; public: Slowa(): m_palindromy(0), m_wewnatrz(0), m_sklejenia(0) {}; string c(const string &a, const string &b) { m_palindromy += palindrom(a) + palindrom(b); ParaSlow p = ParaSlow(a, b); m_wewnatrz += p.wewnatrz(); m_sklejenia += p.sklejenie(); return p.c(); } int palindromy() { return m_palindromy; } int wewnatrz() { return m_wewnatrz; } int sklejenia() { return m_sklejenia; } }; int main(void) { ifstream dane; dane.open("dane.txt"); ofstream slowa; slowa.open("slowa.txt"); Slowa s; string a, b; while(dane >> a >> b) slowa << s.c(a, b) << endl; ofstream zad_5; zad_5.open("zad_5.txt"); zad_5 << "a) palindromy: " << s.palindromy() << endl; zad_5 << "b) wewnątrz: " << s.wewnatrz() << endl; zad_5 << "c) sklejenia: " << s.sklejenia() << endl; return 0; } } // namespace int main(void) { return zad_5::main(); }