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

Высчитать значение выражения с приоритетами - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Двумерный массив через вектор http://www.cyberforum.ru/cpp-beginners/thread799073.html
Задача состоит в том, что надо создать массив строк через вектор, т.е. я хочу иметь возмость изменять как количество строк, так и их длину.
C++ Воспользовавшись указателями, поменяйте местами элементы массива с четными и нечетными индексами Решить задачи через Указатели... 3. Дан массив целых чисел. Воспользовавшись указателями, поменяйте местами элементы массива с четными и нечетными индексами (т.е. те элементы массива, которые стоят на четных местах, поменяйте с элементами, которые стоят на нечетных местах). Кто поможет огромное СПАСИБО. http://www.cyberforum.ru/cpp-beginners/thread799061.html
C++ Выбрать из строки все чётные цифры (нуль отнести к ним), если они есть в строке, и поместить их в первый динамический массив, и все нечётные цифры, ес
Решить задачи через Указатели... 2. .Пользователь вводит строку с клавиатуры (максимальная длина строки — 80 символов). Программа должна выбрать из строки все чётные цифры (нуль отнести к ним), если они есть в строке, и поместить их в первый динамический массив, и все нечётные цифры, если они есть — поместить их во второй динамический массив. Вывести оба динамических массива (если они...
определить, является ли число a делителем числа b? C++
определить, является ли число a делителем числа b?
C++ Использование строк http://www.cyberforum.ru/cpp-beginners/thread799043.html
Помогите с алгоритмом программы: вводим текст происходит проверка на наличие цифр прописью, заменяет их и выводит исправленый текст...например ввод: "Вышли тридцать три богатыря.." вывод: "Вышли 33 богатыря......код не нужен просто помогите с алгоритмом с использованием строк
C++ нахождение целого числа по информации о его цифрах! в трехзначном числе зачеркнули его последнюю цифру когда в оставшимся двузначном числе переставили цифры а затем приписали к ним слева последнюю цифру числа x, то получилось число n. По заданному n найти число x( значение n вводится с клавиатуры 1<=n<=999 и при это число единиц в n не равно нулю) подробнее

Показать сообщение отдельно
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 438
04.03.2013, 02:33     Высчитать значение выражения с приоритетами
Как вариант (с использование boost::rational, но можно его на свой тип заменить):
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <boost/rational.hpp>
 
#include <fstream>
#include <sstream>
#include <string>
 
using namespace std;
 
typedef boost::rational<int> rational_t;
typedef const char* iter_t;
 
rational_t vars[26];
 
bool is_var(char c)
{
    return ('a' <= c) && (c <= 'z');
}
 
struct error {}; // throw in case of errors
 
void print_error(const string &s, iter_t iter)
{
    int consumed = iter - s.c_str();
    cerr << s << endl << string(consumed, ' ') << '^' << endl;
}
 
rational_t expr(iter_t &iter);
rational_t term(iter_t &iter);
rational_t factor(iter_t &iter);
 
bool eval(const string &s, rational_t &value)
{
    iter_t iter = s.c_str();
    try {
        value = expr(iter);
        if (*iter) {
            // not all consumed!
            print_error(s, iter);
            return false;
        }
    } catch (error &e) {
        print_error(s, iter);
        return false;
    }
    return true;
}
 
rational_t expr(iter_t &iter)
{
    if (!*iter)
        throw error();
    rational_t res = term(iter);
    while (*iter == '+' || *iter == '-') {
        bool plus = (*iter++ == '+');
        rational_t r = term(iter);
        if (plus)
            res += r;
        else
            res -= r;
    }
    return res;
}
 
rational_t term(iter_t &iter)
{
    if (!*iter)
        throw error();
    rational_t res = factor(iter);
    while (*iter == '*' || *iter == '/') {
        bool mult = (*iter++ == '*');
        rational_t r = factor(iter);
        if (mult)
            res *= r;
        else
            res /= r;
    }
    return res;
}
 
rational_t factor(iter_t &iter)
{
    if (!is_var(*iter) && *iter != '(')
        throw error();
    if (is_var(*iter))
        return vars[*iter++ - 'a'];
    rational_t r = expr(++iter);
    if (*iter != ')')
        throw error();
    ++iter;
    return r;
}
 
int main()
{
    const char* fname = "input.txt";
    ifstream inp(fname);
    if (!inp) {
        cerr << "Can't open input file " << fname << "!" << endl;
        return 1;
    }
    int n;
    inp >> n;
    if (!inp) {
        cerr << "Not a number on first line!";
        return 1;
    }
    inp.ignore(numeric_limits<std::streamsize>::max(), '\n');
    for (int i = 0; i < n; ++i) {
        string s;
        getline(inp, s);
        char v = s[0];
        if (!is_var(v) || s[1] != '=') {
            cerr << "wrong assignment in line \"" << s << "\", skipped!" << endl;
            continue;
        }
        if (s.find('/') == string::npos)
            s += "/1";
        istringstream iss(s.substr(2));
        iss >> vars[v - 'a'];
    }
    string expr;
    getline(inp, expr);
    rational_t value;
    if (eval(expr, value)) {
        cout << expr << "=";
        if (value.denominator() == 1)
            cout << value.numerator();
        else
            cout << value;
        cout << endl;
    } else {
        cerr << "wrong expression!" << endl;
    }
}
Цитата Сообщение от input.txt
4
a=1/3
b=5/3
x=15
z=10/3
(a+b)*x/z
(a+b)*x/z=9
 
Текущее время: 21:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru