MSzopa

C++ ONP Calculator

Mar 17th, 2022
1,104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.34 KB | None | 0 0
  1. #include <stdexcept>
  2. #include <limits>
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6. /// <summary>
  7. /// Waits for any key being clicked
  8. /// </summary>
  9. void WaitForAnyKey() {
  10. #if defined _WIN32
  11.     system("pause");
  12. #elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__)
  13.     system("read");
  14. #elif defined (__APPLE__)
  15.     system("read");
  16. #endif
  17. }
  18. /// <summary>
  19. /// Clear Console
  20. /// </summary>
  21. void Clear()
  22. {
  23. #if defined _WIN32
  24.     system("cls");
  25. #elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__)
  26.     system("clear");
  27. #elif defined (__APPLE__)
  28.     system("clear");
  29. #endif
  30. }
  31. /// <summary>
  32. /// Check If Char contains digit (by ASCII check)
  33. /// </summary>
  34. /// <param name="c">syntax</param>
  35. /// <returns></returns>
  36. bool IsDigit(char c) {
  37.     return ('0' <= c) && (c <= '9');
  38. }
  39. /// <summary>
  40. /// Calculate the value of ONP expression
  41. /// </summary>
  42. /// <param name="expression">Expression in string</param>
  43. /// <returns></returns>
  44. double ONP(std::string expression) {
  45.     if (expression.size() > 0) {
  46.         std::vector<double> _tower;
  47.         for (char c : expression) {
  48.             if (c != ' ') {
  49.                 if (IsDigit(c))
  50.                     _tower.push_back(c-'0');
  51.                 else {
  52.                     switch (c) {
  53.                     case '+':
  54.                         if (_tower.size() > 1) {
  55.                             _tower.push_back(_tower[_tower.size() - 2] + _tower[_tower.size() - 1]);
  56.                             // element added so indexes changes
  57.                             _tower.erase(_tower.begin() + _tower.size() - 3);
  58.                             _tower.erase(_tower.begin() + _tower.size() - 2);
  59.                         }
  60.                         else
  61.                             throw std::invalid_argument("Expression is invalid!");
  62.                         break;
  63.                     case '-':
  64.                         if (_tower.size() > 1) {
  65.                             _tower.push_back(_tower[_tower.size() - 2] - _tower[_tower.size() - 1]);
  66.                             // element added so indexes changes
  67.                             _tower.erase(_tower.begin() + _tower.size() - 3);
  68.                             _tower.erase(_tower.begin() + _tower.size() - 2);
  69.                         }
  70.                         else
  71.                             throw std::invalid_argument("Expression is invalid!");
  72.                         break;
  73.                     case '*':
  74.                         if (_tower.size() > 1) {
  75.                             _tower.push_back(_tower[_tower.size() - 2] * _tower[_tower.size() - 1]);
  76.                             // element added so indexes changes
  77.                             _tower.erase(_tower.begin() + _tower.size() - 3);
  78.                             _tower.erase(_tower.begin() + _tower.size() - 2);
  79.                         }
  80.                         else
  81.                             throw std::invalid_argument("Expression is invalid!");
  82.                         break;
  83.                     case '/':
  84.                         if (_tower.size() > 1) {
  85.                             _tower.push_back(_tower[_tower.size() - 2] / _tower[_tower.size() - 1]);
  86.                             // element added so indexes changes
  87.                             _tower.erase(_tower.begin() + _tower.size() - 3);
  88.                             _tower.erase(_tower.begin() + _tower.size() - 2);
  89.                         }
  90.                         else
  91.                             throw std::invalid_argument("Expression is invalid!");
  92.                         break;
  93.                     default:
  94.                         throw std::invalid_argument("Expression is invalid!");
  95.                     }
  96.                 }
  97.             }
  98.         }
  99.         if (_tower.size() == 1)
  100.             return _tower[0];
  101.     }
  102.     throw std::invalid_argument("Expression is invalid!");
  103. }
  104. int main()
  105. {
  106.     while (true) {
  107.         std::cout << "Enter ONP expression:" << std::endl;
  108.         std::string expression;
  109.         std::getline(std::cin,expression);
  110.         try {
  111.             std::cout << "Expression's value equals to " << ONP(expression) << "." << std::endl;
  112.         }
  113.         catch (std::invalid_argument const& ex) {
  114.             std::cout << "Exception occured: " << ex.what() << std::endl;
  115.         }
  116.         WaitForAnyKey();
  117.         Clear();
  118.     }
  119. }
  120.  
Advertisement
Add Comment
Please, Sign In to add comment