Форум программистов, компьютерный форум CyberForum.ru

Калькулятор: обратная польская запись - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как сделать двумерный массив http://www.cyberforum.ru/cpp-beginners/thread1490798.html
Доброго времени суток. Допустим с клавиатуры вводятся 25 значений. Как их записать в двумерный массив(чтоб матрица образовалась?. Помогите пожалуйста!
C++ Как реализовать ввод данных в матрицу? Дана матрица 5*4. Как сделать,что если пользователь допустим ввёл 16 значений остальные дополнить как "ооооо".? http://www.cyberforum.ru/cpp-beginners/thread1490790.html
CodeVS для linux C++
наверняка тему я написал не там где надо, но всё же скачать codevs для linux, разархивировал и дальше написано запустить исполняемый файл Code, но он не запускается. помогите, как мне быть
Передача сообщения в поток для послед. записи в файл C++
Здравствуйте форумчане. Возник вопрос. Пишу клиент сервер (tcp). Сервер принимает сообщение , переданное клиентом через функцию recv(Connect, message, sizeof(message), 0); Можно ли создать на сервере поток и записать переданное сообщение в текстовый файл ?
C++ Прокомменнтировать код http://www.cyberforum.ru/cpp-beginners/thread1490756.html
Мне нужно знать ,что вообще значит каждая из строчек в этом коде,хотя бы приближенно или кратенько,но нужно срочно. Спасибо #include "Zip.h" Zip::Zip() { } string Zip::get_file_name(string path)
C++ Исследовать на монотонность булеву функцию Привет,помогите пожалуйста, есть код,не могу нормально написать цикл для проверки на монотонность(количество переменных вводится с клавиатуры) вот теория http://ido.tsu.ru/iop_res/bulevfunc/text/g15_5.html int _tmain(int argc, _TCHAR* argv) { int *b = nullptr, n, f = 0, l = 0; cin >> n; int m = pow(2.0, (double)n); b = new(nothrow) int; cout << "Funk: " << endl; for (int i = 0; i... подробнее

Показать сообщение отдельно
Gr1f0nn
82 / 81 / 42
Регистрация: 30.09.2012
Сообщений: 408
30.06.2015, 22:07     Калькулятор: обратная польская запись
Всем доброго времени суток!
Решил написать для себя калькулятор, который бы решал сложные выражения с учетом скобок, каких-либо функций и т.д. В дальнейшем хотел прикрутить свой класс больших чисел, но до этого пока не дошел, так как наткнулся на ошибку, которая возникает при обработке скобок. Самое интересно, что в некоторых случаях, все работает корректно.
Важно: если будете тестировать, то учитывайте тот факт, что пока что обрабатываются только однозначные числа (или просто цифры, кому как удобней ^_^)

Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <iostream>
#include <stack>
#include <vector>
#include <iterator>
#include <algorithm>
#include <math.h>
bool is_symbol(char sym)
{
    switch(sym)
    {
        case '+': return true;
        case '-': return true;
        case '(': return true;
        case '^': return true;
        // ---------- //
        case '/': return true;
        case '*': return true;
    }
    return false;
}
 
bool is_mid_priority(char sym)
{
    switch(sym)
    {
        case '/': return true;
        case '*': return true;
    }
    return false;
}
 
bool is_low_priority(char sym)
{
    switch(sym)
    {
        case '-': return true;
        case '+': return true;
    }
    return false;
}
 
bool is_high_priority(char sym)
{
    return sym == '^' ? true : false;
}
 
int main()
{
    //std::string expression("(3 + 4 - 5) * 2"); // ??????
    //std::string expression("1 + (5 - 3) * (3 - 1) + 2");
    //std::string expression("2 ^ 3 * 2 + 1");
    //std::string expression("2 + 3 + 5 * 2 + 3 * 6 / 2");
    std::string expression("2 + 3 + 5 * (2 + 3 * 6) / 2"); // ???
    std::stack<char> symbols;
    std::vector<char> exit_string;
    std::stack<double> result;
    double buffer = 0;
 
    for(std::string::iterator it = expression.begin(); it != expression.end(); ++it)
    {
        if(::isdigit(*it)) exit_string.push_back(*it); // Если это цифра
        else if(is_symbol(*it)) // Если это символ
        {
            if(is_low_priority(*it))
            {
                if(symbols.size() && !is_low_priority(symbols.top()))
                {
                    exit_string.push_back(symbols.top());
                    symbols.pop();
                }
                symbols.push(*it);
            }
            else if(is_mid_priority(*it))
            {
                if(symbols.size() && is_high_priority(symbols.top()))
                {
                    exit_string.push_back(symbols.top());
                    symbols.pop();
                }
                symbols.push(*it);
            }
            else if(is_high_priority(*it))
            {
                symbols.push(*it);
            }
            else symbols.push(*it);
        }
        else if(*it == ')')
        {
            while(symbols.top() != '(')
            {
                std::cout << "\n1";
                exit_string.push_back(symbols.top());
                symbols.pop();
            }
            if(symbols.size()) { symbols.pop(); }
        }
    }
    while(symbols.size()) { exit_string.push_back(symbols.top()); symbols.pop(); }
    std::copy(exit_string.begin(), exit_string.end(), std::ostream_iterator<char>(std::cout, " "));
 
    for(std::vector<char>::iterator it = exit_string.begin(); it != exit_string.end(); ++it)
    {
        if(::isdigit(*it)) result.push(*it - '0');
        else
            switch(*it)
            {
            case '+': { buffer = result.top(); result.pop(); result.top() += buffer; break; }
            case '-': { buffer = result.top(); result.pop(); result.top() -= buffer; break; }
            case '*': { buffer = result.top(); result.pop(); result.top() *= buffer; break; }
            case '/': { buffer = result.top(); result.pop(); result.top() /= buffer; break; }
            case '^': { buffer = result.top(); result.pop(); result.top() = pow(result.top(), buffer); break; }
            }
    }
    std::cout << "\nANSWER: " << result.top();
    return 0;
}
Собственно, те выражения, которые помечены вопросами, и вызывают крах программы. По моим наблюдениям, крах происходит в цикле, который обрабатывает вхождение закрывающей скобки.
Также, если кто-то что-то подскажет по поводу улучшения реализации, да и вообще любые другие замечания по коду в целом, то также буду очень благодарен! =)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 08:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru