force1987

String Calc

Sep 21st, 2021 (edited)
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.03 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5. #define cin cin.ignore(cin.rdbuf()->in_avail())
  6.  
  7. string calc(string input)
  8. {
  9. for (int i = 0; i < input.size(); ++i)
  10. {
  11. if ((input[i] < '0' || input[i] > '9') && input[i] != '*' && input[i] != '+' && input[i] != '-' && input[i] != '/' && input[i] != '(' && input[i] != ')' && input[i] != ',' && input[i] != '.' && input[i] != ':') break;
  12. if (input[i] == ':') input[i] = '/';
  13. if (input[i] == ',') input[i] = '.';
  14. if (i == input.size() - 1)
  15. {
  16. for (int i = 0; i < input.size(); ++i)
  17. {
  18. if (input[i] == '(')
  19. {
  20. int j = i;
  21. for (int i = 1; i > 0; --i)
  22. {
  23. while (input[j] != ')')
  24. {
  25. ++j;
  26. if (input[j] == '(')
  27. ++i;
  28. }
  29. if (i > 1) ++j;
  30. }
  31.  
  32. input.replace(i, j - i + 1, calc(input.substr(i + 1, j - i - 1)));
  33. }
  34. }
  35.  
  36. for (int step = 1; step <= 2; ++step)
  37. {
  38. char x, y;
  39.  
  40. if (step == 1)
  41. x = '*', y = '/';
  42. else
  43. x = '+', y = '-';
  44.  
  45. for (int i = 0; i < input.size(); )
  46. {
  47. if (input[i] == x || input[i] == y)
  48. {
  49. long double leftOp = 0, rightOp = 0;
  50. int rightIterator = i, s = i;
  51. short sign = 1;
  52. bool flag = 0;
  53.  
  54. for (int k = 0; i > 0 && (input[i - 1] >= '0' && input[i - 1] <= '9' || input[i - 1] == '-' || input[i - 1] == '.'); ++k)
  55. {
  56. flag = 1;
  57. if (input[i - 1] == '-')
  58. {
  59. if ((i - 2) >= 0 && (input[i - 2] == '*' || input[i - 2] == '+' || input[i - 2] == '-' || input[i - 2] == '/') || i == 1)
  60. {
  61. leftOp *= -1;
  62. --i;
  63. }
  64. break;
  65. }
  66. else if (input[i - 1] == '.')
  67. {
  68. if (leftOp == 0)
  69. {
  70. --i;
  71. continue;
  72. }
  73. else
  74. {
  75. while ((int)leftOp > 0) leftOp /= 10;
  76. int temp = i;
  77. while (input[temp++] == '0') leftOp /= 10;
  78. k = -1;
  79. }
  80. }
  81. else
  82. leftOp += (input[i - 1] - 48) * pow(10, k);
  83.  
  84. --i;
  85. }
  86.  
  87. short floatCounter = 0;
  88.  
  89. for (rightIterator; rightIterator < input.size() && (input[rightIterator + 1] >= '0' && input[rightIterator + 1] <= '9' || input[rightIterator + 1] == '-' || input[rightIterator + 1] == '.'); ++rightIterator)
  90. {
  91. if (input[rightIterator + 1] == '-' && (input[rightIterator] == '*' || input[rightIterator] == '+' || input[rightIterator] == '-' || input[rightIterator] == '/'))
  92. sign = -1;
  93. else if (input[rightIterator + 1] == '-')
  94. break;
  95. else if (input[rightIterator + 1] == '.')
  96. floatCounter = 1;
  97. else if (floatCounter == 0)
  98. rightOp = rightOp * 10 + input[rightIterator + 1] - 48;
  99. else
  100. rightOp += (input[rightIterator + 1] - 48) * pow(10, -1 * floatCounter++);
  101. }
  102.  
  103. rightOp *= sign;
  104.  
  105. if (flag == 0)
  106. {
  107. ++i;
  108. continue;
  109. }
  110.  
  111. if (step == 2)
  112. input[s] == '+' ? leftOp += rightOp : leftOp -= rightOp;
  113. else if (input[s] == '*')
  114. leftOp *= rightOp;
  115. else if (rightOp != 0)
  116. leftOp /= rightOp;
  117. else
  118. {
  119. cout << "Exception! Division by zero." << endl;
  120. return input;
  121. }
  122. string temp = to_string(leftOp);
  123. if (temp[temp.size() - 1] == '0')
  124. {
  125. for (int i = temp.size() - 1; temp[i] == '0'; i--)
  126. temp.erase(i, 1);
  127.  
  128. if (temp[temp.size() - 1] == '.')
  129. temp.erase(temp.size() - 1, 1);
  130. }
  131. input.replace(i, rightIterator - i + 1, temp);
  132. }
  133. else
  134. ++i;
  135. }
  136. }
  137. return input;
  138. }
  139. }
  140. return "Incorrect input!";
  141. }
  142.  
  143. int main()
  144. {
  145. string input;
  146.  
  147. cout << "\t\tString calculator" << endl << endl;
  148.  
  149. do
  150. {
  151. cout << "Enter an arithmetic expression: ";
  152. cin >> input;
  153. if (input != "exit") cout << "Result: " << calc(input) << endl << endl;
  154. } while (input != "exit");
  155. }
Add Comment
Please, Sign In to add comment