Advertisement
MrHalabaluza

Untitled

Oct 27th, 2016
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.61 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <string>
  4. #include <map>
  5.  
  6. using namespace std;
  7.  
  8. int main() {
  9.     string Polynominal; //строка с введённым полиномом
  10.     string DifferentiatedPolynominal = ""; //строка с дифференцированным полиномом
  11.     string Tmp = ""; //временная строка, в которой храним части полинома
  12.     char LastServiceSymbol; //последний из встретившихся символов +,-,*,^,x.
  13.     int Multiplier, Power; //множитель и степень текущей части полинома
  14.     map<int, int> DecomposedPolynominal = {}; //словарь, содержащий пары степень(ключ)/множитель(значение)
  15.     cout << "Enter a polynominal\n";
  16.     getline(cin, Polynominal);
  17.     if (Polynominal[0] == '-')
  18.         LastServiceSymbol = '-';
  19.     else
  20.         LastServiceSymbol = '+';
  21.     DecomposedPolynominal.clear(); //очистка словаря в начале каждой итерации
  22.     DifferentiatedPolynominal.clear(); //очистка строки
  23.     for (int i = 0; i <= Polynominal.size(); i++) {
  24.         //по последнему из встреченных символов +,-,*,^,x и текущему символу можно однозначно определить, какую часть полинома мы в данный момент проходим
  25.         if (Polynominal[i] == '+' || Polynominal[i] == '-' || Polynominal[i] == '*' || Polynominal[i] == '^' || Polynominal[i] == 'x' || Polynominal[i] == '\0') {
  26.             //множитель
  27.             if ((LastServiceSymbol == '+' || LastServiceSymbol == '-') && Polynominal[i] == '*') {
  28.                 Multiplier = stoi(Tmp);
  29.                 if (LastServiceSymbol == '-')
  30.                     Multiplier *= -1;
  31.             }
  32.             //степень
  33.             if (LastServiceSymbol == '^' && (Polynominal[i] == '+' || Polynominal[i] == '-' || Polynominal[i] == '\0')) {
  34.                 Power = stoi(Tmp);
  35.                 DecomposedPolynominal[Power] += Multiplier;
  36.             }
  37.             //единичный множитель перед x
  38.             if ((LastServiceSymbol == '+' || LastServiceSymbol == '-') && Polynominal[i] == 'x') {
  39.                 if (LastServiceSymbol == '+')
  40.                     Multiplier = 1;
  41.                 else
  42.                     Multiplier = -1;
  43.             }
  44.             //x в первой степени
  45.             if (LastServiceSymbol == 'x' && (Polynominal[i] == '+' || Polynominal[i] == '-' || Polynominal[i] == '\0')) {
  46.                 Power = 1;
  47.                 DecomposedPolynominal[Power] += Multiplier;
  48.             }
  49.             //свободный член
  50.             if ((LastServiceSymbol == '+' || LastServiceSymbol == '-') && (Polynominal[i] == '+' || Polynominal[i] == '-' || Polynominal[i] == '\0') && i != 0){
  51.                 Power = 0;
  52.                 Multiplier = stoi(Tmp);
  53.                 DecomposedPolynominal[Power] += Multiplier;
  54.             }
  55.             LastServiceSymbol = Polynominal[i];
  56.             Tmp = "";
  57.             continue;
  58.  
  59.         }
  60.         else
  61.             if (Polynominal[i] < '0' || Polynominal[i] > '9') {
  62.                 cout << "ERROR: Incorrect symbols";
  63.                 break;
  64.             }
  65.             else
  66.                 Tmp += Polynominal[i];
  67.     }
  68.     //it -- обратный итератор. rbegin() -- возвращает end, нам нужна запись перед end (т.е. максимальная степень), значит ++.
  69.     //first -- степень, second -- множитель
  70.     bool AllZeros = true;
  71.     for (auto it = DecomposedPolynominal.rbegin(); it != DecomposedPolynominal.rend(); )
  72.     {
  73.         it++;
  74.         if (it.base()->first != 0 && it.base()->second != 0)
  75.             AllZeros = false;
  76.         if (DecomposedPolynominal.size() == 1 && (++DecomposedPolynominal.rbegin()).base()->first == 0) {
  77.             DifferentiatedPolynominal = "0";
  78.             break;
  79.         }
  80.         //если множитель равен нулю, то вывод для этого члена можно не производить
  81.         if (it.base()->second != 0) {
  82.             //если множитель не 0
  83.             if (it.base()->first * it.base()->second != 0) {
  84.                 //знак не выводится для первого положительного члена
  85.                 if (!DifferentiatedPolynominal.empty() || it.base()->first * it.base()->second > 0)
  86.                     DifferentiatedPolynominal += '+';
  87.                 DifferentiatedPolynominal += to_string(it.base()->first * it.base()->second);
  88.             }
  89.             //выводим x, если степень не нулевая
  90.             if (it.base()->first - 1 > 0)
  91.                 DifferentiatedPolynominal += "*x";
  92.             //степень при x выводим, если она будет не равна единице или нулю
  93.             if (it.base()->first - 1 > 1) {
  94.                 DifferentiatedPolynominal += '^' + to_string(it.base()->first - 1);
  95.             }
  96.         }
  97.     }
  98.     if (AllZeros)
  99.         DifferentiatedPolynominal = "0";
  100.     cout << DifferentiatedPolynominal << endl;
  101.     getchar();
  102.     return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement