Advertisement
NickAndNick

Polynomial

Oct 25th, 2023 (edited)
845
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.12 KB | Software | 0 0
  1. // C++20
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <set>
  5. #include <string>
  6. #include <vector>
  7.  
  8. using namespace std;
  9.  
  10. struct Coefficient
  11. {
  12.     char sign;
  13.     int value;
  14.  
  15.     Coefficient()
  16.         : sign('+'), value(1)
  17.     {
  18.     }
  19.  
  20.     Coefficient(const char sign, const int value)
  21.         : sign(sign), value(value)
  22.     {
  23.     }
  24. };
  25.  
  26. struct Unknown
  27. {
  28.     char name;
  29.     int power;
  30.  
  31.     Unknown()
  32.         : name(' '), power(1)
  33.     {
  34.     }
  35.  
  36.     Unknown(const char name)
  37.         : name(name), power(1)
  38.     {
  39.     }
  40.  
  41.     Unknown(const char name, const int power)
  42.         : name(name), power(power)
  43.     {
  44.     }
  45. private:
  46.     friend bool operator<(const Unknown& a, const Unknown& b) {
  47.         return a.name < b.name;
  48.     }
  49.  
  50.     friend bool operator==(const Unknown& a, const Unknown& b) {
  51.         return a.name == b.name && a.power == b.power;
  52.     }
  53. };
  54.  
  55. struct Member
  56. {
  57.     Coefficient coefficient;
  58.     set<Unknown> unknown;
  59.  
  60.     Member(const Coefficient& coefficient, const set<Unknown>& unknown = {})
  61.         : coefficient(coefficient), unknown(unknown)
  62.     {
  63.     }
  64.  
  65.     const Member& operator-() {
  66.         if (coefficient.sign == '-') {
  67.             coefficient.sign = '+';
  68.         }
  69.         else {
  70.             coefficient.sign = '-';
  71.         }
  72.         return *this;
  73.     }
  74.  
  75.     string tostring() const {
  76.         string member;
  77.         if (coefficient.value == 0) {
  78.             return member;
  79.         }
  80.         member += coefficient.sign;
  81.         if (coefficient.value != 1) {
  82.             member += to_string(coefficient.value);
  83.         }
  84.         else if (unknown.empty()) {
  85.             member += '1';
  86.         }
  87.         for (const auto& item : unknown) {
  88.             if (item.name != ' ') {
  89.                 member += item.name;
  90.                 if (item.power != 1) {
  91.                     member += '^' + to_string(item.power);
  92.                 }
  93.             }
  94.         }
  95.         return member;
  96.     }
  97. private:
  98.     friend Member operator+(const Member& a, const Member& b) {
  99.         const auto qa = a.coefficient.sign == '-' ? -a.coefficient.value : a.coefficient.value;
  100.         const auto qb = b.coefficient.sign == '-' ? -b.coefficient.value : b.coefficient.value;
  101.         const auto sum = qa + qb;
  102.         const auto sign = sum < 0 ? '-' : '+';
  103.         Coefficient q{ sign, abs(sum) };
  104.         return { q, a.unknown};
  105.     }
  106.  
  107.     friend Member operator-(const Member& a, const Member& b) {
  108.         const auto qa = a.coefficient.sign == '-' ? a.coefficient.value : -a.coefficient.value;
  109.         const auto qb = b.coefficient.sign == '-' ? b.coefficient.value : -b.coefficient.value;
  110.         const auto sum = qa + qb;
  111.         const auto sign = sum < 0 ? '-' : '+';
  112.         Coefficient q{ sign, abs(sum) };
  113.         return { q, a.unknown };
  114.     }
  115.  
  116.     friend bool operator==(const Member& a, const Member& b) {
  117.         return a.unknown == b.unknown;
  118.     }
  119. };
  120.  
  121. struct Polynomial
  122. {
  123.     vector<Member> polynomial;
  124.  
  125.     Polynomial() = default;
  126.  
  127.     Polynomial(const vector<Member>& polynomial)
  128.         : polynomial(polynomial)
  129.     {
  130.     }
  131.  
  132.     // Метод принимает строку многочлена
  133.     // Выполняет синтаксический анализ
  134.     // В случае успеха заносит члены в вектор и возвращает true
  135.     // В противном случае возвращает false
  136.     bool parse(const string& ps) {
  137.         if (!polynomial.empty()) {
  138.             polynomial.clear();
  139.         }
  140.         // TODO: Осталось начать и кончить :)
  141.  
  142.         return true;
  143.     }
  144. private:
  145.     // Метод собирает члены из вектора в строку многочлена
  146.     string tostring() const {
  147.         string total;
  148.         for (const auto& polynom : polynomial) {
  149.             total += polynom.tostring();
  150.         }
  151.         if (total.front() == '+') {
  152.             total = total.erase(0, 1);
  153.         }
  154.         // TODO: При необходимости расставить пробелы
  155.         return total;
  156.     }
  157.  
  158.     friend Polynomial operator+(const Polynomial& a, const Polynomial& b) {
  159.         Polynomial sum = a;
  160.         for (const auto& polynom : b.polynomial) {
  161.             auto it = find(sum.polynomial.begin(), sum.polynomial.end(), polynom);
  162.             if (it == sum.polynomial.end()) {
  163.                 sum.polynomial.push_back(polynom);
  164.             }
  165.             else {
  166.                 *it = *it + polynom;
  167.             }
  168.         }
  169.         return sum;
  170.     }
  171.  
  172.     friend Polynomial operator-(const Polynomial& a, const Polynomial& b) {
  173.         Polynomial sub = a;
  174.         for (Member polynom : b.polynomial) {
  175.             auto it = find(sub.polynomial.begin(), sub.polynomial.end(), polynom);
  176.             if (it == sub.polynomial.end()) {
  177.                 sub.polynomial.push_back(-polynom);
  178.             }
  179.             else {
  180.                 *it = *it + -polynom;
  181.             }
  182.         }
  183.         return sub;
  184.     }
  185.  
  186.     friend ostream& operator<<(ostream& out, const Polynomial& p) {
  187.         return out << p.tostring();
  188.     }
  189. };
  190.  
  191. void test() {
  192.     vector<Member> a{
  193.         {{}, {{'x', 2}}},
  194.         {{'+', 5}, {{'x', 1}}},
  195.         {{'+', 2}}
  196.     };
  197.     vector<Member> b{
  198.         {{}, {{'x', 2}}},
  199.         {{'-', 5}, {{'x', 1}}},
  200.         {{'+', 3}}
  201.     };
  202.     Polynomial pa(a);
  203.     Polynomial pb(b);
  204.     const auto ab_sum = pa + pb;
  205.     const auto pb_sub = pa - pb;
  206.     cout << pa << " + " << pb << " = " << ab_sum << '\n';
  207.     cout << pa << " - " << pb << " = " << pb_sub << '\n';
  208. }
  209.  
  210. void run() {
  211.     string a;
  212.     getline(cin, a); // >>> x^2+5x+2
  213.     Polynomial pa;
  214.     pa.parse(a);
  215.     string b;
  216.     getline(cin, b); // >>> x^2-5x+3
  217.     Polynomial pb;
  218.     pa.parse(b);
  219.     const auto sum_ab = pa + pb;
  220.     cout << pa << " + " << pb << " = " << sum_ab << '\n'; // <<< 2x^2+5
  221.     const auto sub_ab = pa - pb;
  222.     cout << pa << " - " << pb << " = " << sub_ab << '\n'; // <<< 10x-1
  223. }
  224.  
  225. int main() {
  226.     test();
  227.     //run(); // После реализации лексического анализа начнёт работать
  228. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement