Advertisement
SoKnight

Untitled

Feb 8th, 2023
803
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <stack>
  3. #include <fstream>
  4. #include <string>
  5. #include <Windows.h>
  6.  
  7. using namespace std;
  8.  
  9. stack<double> numbers;
  10. stack<char> operations;
  11.  
  12. bool IsNumber(string& element) {
  13.     for (int i = 0; i < element.length(); i++)
  14.         if (element[i] < '0' || element[i] > '9')
  15.             return false;
  16.    
  17.     return true;
  18. }
  19.  
  20. void Calculate() {
  21.     if (operations.empty())
  22.         return;
  23.  
  24.     double number = numbers.top();
  25.     numbers.pop();
  26.  
  27.     char operation = operations.top();
  28.     operations.pop();
  29.  
  30.     if (operation == '*' || operation == '/') {
  31.         double next = numbers.top();
  32.         numbers.pop();
  33.  
  34.         double result = operation == '*' ? next * number : next / number;
  35.         numbers.push(result);
  36.  
  37.         Calculate();
  38.     }
  39.     else {
  40.         Calculate();
  41.  
  42.         double next = numbers.top();
  43.         numbers.pop();
  44.  
  45.         double result = operation == '+' ? next + number : next - number;
  46.         numbers.push(result);
  47.     }
  48. }
  49.  
  50. int main()
  51. {
  52.     SetConsoleCP(1251);
  53.     SetConsoleOutputCP(1251);
  54.  
  55.     // --- input
  56.  
  57.     ifstream inputFile("expression.txt");
  58.     if (!inputFile.is_open())
  59.         return 1;
  60.  
  61.     while (!inputFile.eof()) {
  62.         string element;
  63.         inputFile >> element;
  64.  
  65.         if (element.empty())
  66.             continue;
  67.  
  68.         if (IsNumber(element)) {
  69.             double number = stod(element);
  70.             numbers.push(number);
  71.         }
  72.         else if (element.length() == 1) {
  73.             switch (element[0]) {
  74.             case '+':
  75.             case '-':
  76.             case '*':
  77.             case '/':
  78.                 operations.push(element[0]);
  79.                 break;
  80.             default:
  81.                 cout << "Неизвестная операция '" << element << "'." << endl;
  82.                 return 2;
  83.             }
  84.         }
  85.         else {
  86.             cout << "Недопустимый элемент '" << element << "'." << endl;
  87.             return 3;
  88.         }
  89.     }
  90.  
  91.     inputFile.close();
  92.  
  93.     // --- validation
  94.  
  95.     if (numbers.empty()) {
  96.         cout << "Выражение не содержит чисел." << endl;
  97.         return 4;
  98.     }
  99.  
  100.     if (operations.empty()) {
  101.         cout << "Выражение не содержит арифметических операций." << endl;
  102.         return 5;
  103.     }
  104.  
  105.     if (operations.size() != numbers.size() - 1) {
  106.         cout << "Кол-во операций должно быть на единицу меньше кол-ва чисел." << endl;
  107.         return 6;
  108.     }
  109.  
  110.     // --- calculation
  111.  
  112.     Calculate();
  113.     cout << "Результат вычислений: " << numbers.top() << endl;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement