Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdexcept>
- #include <limits>
- #include <iostream>
- #include <string>
- #include <vector>
- /// <summary>
- /// Waits for any key being clicked
- /// </summary>
- void WaitForAnyKey() {
- #if defined _WIN32
- system("pause");
- #elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__)
- system("read");
- #elif defined (__APPLE__)
- system("read");
- #endif
- }
- /// <summary>
- /// Clear Console
- /// </summary>
- void Clear()
- {
- #if defined _WIN32
- system("cls");
- #elif defined (__LINUX__) || defined(__gnu_linux__) || defined(__linux__)
- system("clear");
- #elif defined (__APPLE__)
- system("clear");
- #endif
- }
- /// <summary>
- /// Check If Char contains digit (by ASCII check)
- /// </summary>
- /// <param name="c">syntax</param>
- /// <returns></returns>
- bool IsDigit(char c) {
- return ('0' <= c) && (c <= '9');
- }
- /// <summary>
- /// Calculate the value of ONP expression
- /// </summary>
- /// <param name="expression">Expression in string</param>
- /// <returns></returns>
- double ONP(std::string expression) {
- if (expression.size() > 0) {
- std::vector<double> _tower;
- for (char c : expression) {
- if (c != ' ') {
- if (IsDigit(c))
- _tower.push_back(c-'0');
- else {
- switch (c) {
- case '+':
- if (_tower.size() > 1) {
- _tower.push_back(_tower[_tower.size() - 2] + _tower[_tower.size() - 1]);
- // element added so indexes changes
- _tower.erase(_tower.begin() + _tower.size() - 3);
- _tower.erase(_tower.begin() + _tower.size() - 2);
- }
- else
- throw std::invalid_argument("Expression is invalid!");
- break;
- case '-':
- if (_tower.size() > 1) {
- _tower.push_back(_tower[_tower.size() - 2] - _tower[_tower.size() - 1]);
- // element added so indexes changes
- _tower.erase(_tower.begin() + _tower.size() - 3);
- _tower.erase(_tower.begin() + _tower.size() - 2);
- }
- else
- throw std::invalid_argument("Expression is invalid!");
- break;
- case '*':
- if (_tower.size() > 1) {
- _tower.push_back(_tower[_tower.size() - 2] * _tower[_tower.size() - 1]);
- // element added so indexes changes
- _tower.erase(_tower.begin() + _tower.size() - 3);
- _tower.erase(_tower.begin() + _tower.size() - 2);
- }
- else
- throw std::invalid_argument("Expression is invalid!");
- break;
- case '/':
- if (_tower.size() > 1) {
- _tower.push_back(_tower[_tower.size() - 2] / _tower[_tower.size() - 1]);
- // element added so indexes changes
- _tower.erase(_tower.begin() + _tower.size() - 3);
- _tower.erase(_tower.begin() + _tower.size() - 2);
- }
- else
- throw std::invalid_argument("Expression is invalid!");
- break;
- default:
- throw std::invalid_argument("Expression is invalid!");
- }
- }
- }
- }
- if (_tower.size() == 1)
- return _tower[0];
- }
- throw std::invalid_argument("Expression is invalid!");
- }
- int main()
- {
- while (true) {
- std::cout << "Enter ONP expression:" << std::endl;
- std::string expression;
- std::getline(std::cin,expression);
- try {
- std::cout << "Expression's value equals to " << ONP(expression) << "." << std::endl;
- }
- catch (std::invalid_argument const& ex) {
- std::cout << "Exception occured: " << ex.what() << std::endl;
- }
- WaitForAnyKey();
- Clear();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment