Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/25: Рейтинг темы: голосов - 25, средняя оценка - 4.72
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465

Ввести символы и собрать из них выражение, которое вычислит значение булевой функции

28.03.2017, 20:56. Показов 6100. Ответов 40

Студворк — интернет-сервис помощи студентам
Коллеги, доброго времени суток!
Нужна ваша помощь. Учусь на 1-м курсе Факультета математики и информатики. По дискретной математике задали лабораторную работу: нужно написать программу, которая выводила бы значение булевой функции заданной выражением, выражение вводится с консоли, ну например - (x'Vy')'^(x+z) (х отрицание дизъюнкция с у отрицанием всё это тоже отрицание конъюнкция с суммой Жигалкина x и z), ну это как пример.
Каждую операцию отдельно просчитать для таблицы истинности не проблема, но как просчитать выражение целиком, которое задаётся вводом с консоли?
Создал таблицу истинности для x, y, z. Далее решил создать новый массив, в котором прописать все эти стандартные унарные и бинарные операции в соответствии с таблицой истинности, что бы они автоматически просчитывались. Потом думал каким-то образом вводя символы с клавиатуры собирать эти, уже просчитанные и записанные в массив операции и компоновать их в заданное выражение, но как это сделать не представляю. Нас такому на уроках программирования ещё не учили, подобных примеры в литературе не нашёл ((
Даже не знаю возможно ли вызывать из консоли функции прописанные в коде программы, что бы задавать им аргументы здесь же и заставлять их выполнять действия?

Помогите пожалуйста!

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
void print(int**x, int n, int n2)
{
    for (int i = 0; i<n2; i++)
    {
        for (int j = 0; j<n; j++)
            cout << x[i][j];
        cout << endl;
 
 
    }
}
 
 
int main()
{
    setlocale(0, "");
    int n, n2;
    cout << "Кол перемен" << endl;
    cin >> n;
    n2 = pow(2.0, n);
    int** A = new int*[n2];
    for (int i = 0; i<n2; i++)
        A[i] = new int[n];
    for (int i = 0; i<n2; i++)
    {
        for (int j = 0; j<n; j++)
            A[i][j] = 0;
 
    }
    if (n == 3)
    {
        for (int i = 0; i<n2; i++)
        {
            for (int j = 0; j<n2; j++)
            {
                if (i >= 4 && j == 0) A[i][j] = 1;
                if ((j == 1 && (i >= 2 && i <= 3)) || (j == 1 && (i >= 6 && i <= 7))) A[i][j] = 1;
                if ((j == 2 && i % 2 != 0)) A[i][j] = 1;
            }
        }
    }
    if (n == 2)
    {
        for (int i = 0; i<n2; i++)
        {
            for (int j = 0; j<n2; j++)
            {
                if (i >= 2 && j == 0) A[i][j] = 1;
                if (j == 1 && i%2!=0 ) A[i][j] = 1;
            }
        }
    }
    print(A, n, n2);
    system("pause");
    return 0;
}
Добавлено через 46 минут
Можно ли вообще в С++ запускать функции из консоли с нужными параметрами? Если да, то как?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.03.2017, 20:56
Ответы с готовыми решениями:

Ввести n вещественных чисел и вывести то из них из них, которое наиболее близко к какому-нибудь целому числу.
Используя цикл, написать программу, обеспечивающую ввод n вещественных чисел и выводящую на экран то из них из них, которое наиболее близко...

Вычислит значение функции
дорогие, помогите написать программу функции: y= {x-4,при x&gt;2;x^2+14,при x&lt;-2;x/4,в остальных случаях; для -5&lt;x&lt;3 с шагом...

Составить регулярное выражение, которое считывало бы все символы в строке с 13 по 72
Приветствую! Не могу ничего толкового придумать.Нужно составить выражение, которое считывало бы все символы в строке с 13го по 72....

40
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,932
Записей в блоге: 5
08.04.2017, 10:04
Студворк — интернет-сервис помощи студентам
После вычисления выражения для конкретных значений x, y,... оно превращается в один символ 0 или 1.
Естественно, вы должны будете сохранить где-то введенное выражение, а потом восстанавливать его, когда надо будет его вычислять для других значений x, y,... По-моему, это самый легкий способ вычисления. Но если он вам не подходит, то делайте по-своему.
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
08.04.2017, 13:57  [ТС]
Цитата Сообщение от palva Посмотреть сообщение
После вычисления выражения для конкретных значений x, y,... оно превращается в один символ 0 или 1.
Ну а как туда подставлять значения x, y, z из массива? Это ведь же строка.
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,932
Записей в блоге: 5
08.04.2017, 14:52
Вы уже видели, что я туда подставлял символ '0' когда значение ложь, и '1', когда истина. Но если вам это так непривычно, то можете подставлять буквы 'Л' и 'И'. Тогда надо соответственно модифицировать дальнейший алгоритм.
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
08.04.2017, 15:17  [ТС]
Да, дело не в том, что там 0 и 1 или Л и И. Я не пойму как можно в строку циклом подставлять значения переменных из массива int, который содержит значения этих переменных, вместо символов x, y, z, что бы просчитать значение функции для всех сочетаний?
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,932
Записей в блоге: 5
08.04.2017, 17:20
Честно говоря, не понимаю вопроса. Цикл, проверка буквы, проверка значения, оператор присваивания...
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
08.04.2017, 18:20
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Да, дело не в том, что там 0 и 1 или Л и И. Я не пойму как можно в строку циклом подставлять значения переменных из массива int, который содержит значения этих переменных, вместо символов x, y, z, что бы просчитать значение функции для всех сочетаний?
Vlad__i__mir, мне трудно представить, что на первом курсе могут быть задачи такого уровня. Поэтому вам трудно понять.
С консоли вы получаете строку. Потом её нужно распарсить. Я бы создал класс talken который мог бы отразить любую сущность в такой строке. В вашем случае их не много. Это символьное имя (переменная bool), символ операции, знаки аллитерации у вас представлены скобками '(' и ')'
После парсинга у вас должен получиться список токенов. Далее имеет смысл написать функцию вычисления которая принимает список токенов и возвращает список токенов. Можно принимать по ссылке а возвращать bool ещё например. Каждый вызов - шаг упрощения. Функция ищет пару старшего приоритета ( скобки наибольшей вложенности если они есть ) и выполняя вычисление заменяет тройку токенов типа x&y одним токеном. Скобки если они окружают один токен удаляются. Рекурсия в таком разборе самый простой алгоритм вычисления. То есть вызываете пока в списке не останется один токен результата. Или пока возвращает true (сама проверяет то есть).
Если вы никогда не писали чего-то подобного, то лучше перечитайте задание. Вполне может быть, что тема показалась вам намного страшнее чем там требуется.
А вообще тема как таковая - интересна. Особенно в постановке анализа выражения с целью определения его логической эквивалентности другому выражению, выраженному синтаксически иначе. Например x && y || z означает то же самое что и z || y && x. Но могут быть и значительно более сложные. Научить прогу понимать, что это одно и тоже (всегда одинаковый результат не зависимо от x,y,z) это несколько сложнее чем просто научить её разбирать и вычислять выражение.
И да, если вы собираетесь использовать именованные переменные, то после ввода строки парсер должен уметь запросить значения найденных им переменных, для построения первого выражения. Две константы типа 'true' 'false' тоже не помешают.
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
09.04.2017, 11:11  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Если вы никогда не писали чего-то подобного, то лучше перечитайте задание. Вполне может быть, что тема показалась вам намного страшнее чем там требуется.
Раз 20 перечитал и не я один, и преподавателю объяснили, что нам по программированию ещё такого не объясняли. Но преподаватель дискретной математики с одной кафедры,а преподаватель программирования с другой кафедры и походу они не согласуют нормально свои задания.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Например x && y || z означает то же самое что и z || y && x. Но могут быть и значительно более сложные. Научить прогу понимать, что это одно и тоже (всегда одинаковый результат не зависимо от x,y,z) это несколько сложнее чем просто научить её разбирать и вычислять выражение.
До этого мне ещё далеко, сейчас бы написать прогу, которая просто бы вычисляла значения.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Я бы создал класс talken который мог бы отразить любую сущность в такой строке.
Как отразить?
Цитата Сообщение от IGPIGP Посмотреть сообщение
После парсинга у вас должен получиться список токенов.
Какие должны быть токены (пример)?
Цитата Сообщение от IGPIGP Посмотреть сообщение
Далее имеет смысл написать функцию вычисления которая принимает список токенов и возвращает список токенов.
Принимает строку с токеном и возвращает строку с токеном?

Добавлено через 2 минуты
palva, вы имели в виду следующий алгоритм?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
string varajenie;
    cin >> varajenie;
    for (int j = 0; j < n2; j++) {
        for (int i = 0; i < varajenie.length; i++)
        {
 
            if (varajenie[i] == 'x') varajenie[i] = x[j];
            if (varajenie[i] == 'y') varajenie[i] = y[j];
            if (varajenie[i] == 'z') varajenie[i] = z[j];
        }
 
        fnd = varajenie.find("0+1" && "1+0");
        if (fnd != -1) {
            varajenie[fnd] = '1';
            varajenie.erase(fnd + 1, 2);
        }
        fnd = varajenie.find("0+0");
        if (fnd != -1) {
            varajenie[fnd] = '0';
            varajenie.erase(fnd + 1, 2);
        }
    }
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,932
Записей в блоге: 5
09.04.2017, 11:23
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
C++
1
fnd = varajenie.find("0+1" && "1+0");
Такого я точно не имел в виду. У вас в аргументе метода стоит булевское выражение. Если вы не изучали методы строк, то и не применяйте.
Задание ведь вам дали для того чтобы вы продемонстрировали владение теми средствами, которые у вас были.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.04.2017, 11:31
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
походу они не согласуют нормально свои задания
если вы не представляете как написать калькулятор, то объяснять долго. Легче сказать, как называются такие преподаватели. Но не буду.
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Как отразить?
Каждый токен содержит поля всех типов - переменная (int или bool), скобка (char или string), операция (char или string)
и поле - перечисление, указывающее кто этот токен в данной ситуации (три значения соответственно). Это полиморфизм "на коленке". Можно наследованием реализовать тоже, но тогда будет список указателей на базовый токен.
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Принимает строку с токеном и возвращает строку с токеном?
Это просто нормально. Хотя ссылку конечно, но не суть. Я писал, что список (не строку) можно по ссылке передать. Тогда функция может и void возвращать. Но чтобы было красивее ( в коде не контролировать длину списка на предмет равенства 1) можно сделать, тип bool. Ей же проще самой выяснить когда уже результирующий токен остался.
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
09.04.2017, 14:58  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
если вы не представляете как написать калькулятор, то объяснять долго. Легче сказать, как называются такие преподаватели. Но не буду.
Подскажите, где можно почитать конкретно по этой теме материал что бы понять как это делается?

Иначе плохи мои дела - я не понимаю.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.04.2017, 15:47
Посмотрел в свои "закрома" и ужаснулся размеру найденного файла. Давно писал. Потом забросил в гугл:
объектно-ориентированный анализатор выражений
//первое что на ум пришло
вот сюда взгляните:
https://habrahabr.ru/post/50196/
тут арифметика, но булевы операции это же проще будет? Захотите - разберётесь, надеюсь.
и вообще пошарьте по данному запросу. Отпишитесь если что найдёте и разберёте.
1
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
09.04.2017, 16:03  [ТС]
IGPIGP, спасибо! Постараюсь разобраться.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
09.04.2017, 16:08
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
IGPIGP, спасибо! Постараюсь разобраться.
Буду рад, если это поможет.

Не по теме:

Если завтра компилятор заставят писать, - заходите. Мне тоже интересно будет посмотреть. Да-а... Сурово нынче с первокурсниками обходятся.

0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
11.04.2017, 19:08  [ТС]
Ребята! Пытаюсь адаптировать код обычного калькулятора (выполняет арифметические операции над числами) под свою задачу. Но не могу понять такой момент в этом коде, каким образом в переменную "token" в функции "get_token()" попадает текущая лексема?
Дело в том, что нигде операции присваивания данной переменной нет, а есть только операция temp = token; (но ведь здесь не присвоение переменной "token" значения, а наоборот temp = token (строки 167-187).

В течение работы программы token "очищается", то же не понятно, как?
Если token постоянно обнуляется, то где хранятся те лексемы, которые мы уже считали? В стеке памяти?
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
class parser
{
    enum typesT {UNDEFTOK, OPERATOR, NUMBER};
    enum errorsT {SERROR, PARENS, NOEXP, DIVZERO};
 
    char* exp_ptr; //указывает на выражение
    char token[80]; //содержет текущую лексему
    typesT tok_type; //содержет тип лексемы
 
    void eval_exp2 (double &rezult);
    void eval_exp3 (double &rezult);
    void eval_exp4 (double &rezult);
    void eval_exp5 (double &rezult);
    void eval_exp6 (double &rezult);
    void atom (double &rezult);
    void get_token();
    void serror (errorsT error);
    bool isdelim (char c);
 
public:
    parser();
    double eval_exp(char *exp);
 
};
// Конструктор
parser::parser()
{
    exp_ptr = 0;
}
 
// Входная точка анализатора. 
//Значение передаётся при вызове данной функции в main
double parser::eval_exp(char *exp) 
{
    double result;
    exp_ptr = exp;
 
    get_token();
    if (!*token) {
        serror(NOEXP); //выражение отсутствует
        return 0.0;
    }
    eval_exp2(result);
    if (*token) serror(SERROR); //последняя лексема должна быть нулевой
    return result;
}
// Add or subtract two terms.
void parser::eval_exp2(double &result)
{
    register char op;
    double temp;
 
    eval_exp3(result);
    while ((op = *token) == '+' || op == '-') {
        get_token();
        eval_exp3(temp);
        switch (op) {
        case '-':
            result = result - temp;
            break;
        case '+':
            result = result + temp;
            break;
        }
    }
}
 
// Multiply or divide two factors.
void parser::eval_exp3(double &result)
{
    register char op;
    double temp;
 
    eval_exp4(result);
    while ((op = *token) == '*' || op == '/' || op == '%') {
        get_token();
        eval_exp4(temp);
        switch (op) {
        case '*':
            result = result * temp;
            break;
        case '/':
            if (!temp) serror(DIVZERO); // division by zero attempted
            else result = result / temp;
            break;
        case '%':
            result = (int)result % (int)temp;
            break;
        }
    }
}
 
// Process an exponent.
void parser::eval_exp4(double &result)
{
    double temp, ex;
    register int t;
 
    eval_exp5(result);
    if (*token == '^') {
        get_token();
        eval_exp4(temp);
        ex = result;
        if (temp == 0.0) {
            result = 1.0;
            return;
        }
        for (t = (int)temp - 1; t>0; --t) result = result * (double)ex;
    }
}
 
// Evaluate a unary + or -.
void parser::eval_exp5(double &result)
{
    register char  op;
 
    op = 0;
    if ((tok_type == OPERATOR) && *token == '+' || *token == '-') {
        op = *token;
        get_token();
    }
    eval_exp6(result);
    if (op == '-') result = -result;
}
 
// Process a parenthesized expression.
void parser::eval_exp6(double &result)
{
    if ((*token == '(')) {
        get_token();
        eval_exp2(result);
        if (*token != ')')
            serror(PARENS);
        get_token();
    }
    else atom(result);
}
 
// Get the value of a number.
void parser::atom(double &result)
{
    switch (tok_type) {
    case NUMBER:
        result = atof(token); //преобразование строки в тип double
        get_token();
        return;
    default:
        serror(SERROR);
    }
}
 
// Display a syntax error.
void parser::serror(errorsT error)
{
    static char *e[] = {
        "Syntax Error",
        "Unbalanced Parentheses",
        "No expression Present",
        "Division by zero"
    };
    cout << e[error] << endl;
}
 
 
// Извлечь следующую лексему.
void parser::get_token()
{
    register char *temp;
    tok_type = UNDEFTOK; //обнуление типа для анализа следующей лексемы
    temp = token; // Присваивается текущая лексема (token)
    *temp = '\0';
 
    if (!*exp_ptr) return; //конец выражения
 
    while (isspace(*exp_ptr)) ++exp_ptr; //пропустить пробелы
 
    if (strchr("+-*/%^=()", *exp_ptr)) { //ищет нужный оператор в 1-ом аргументе и возвращаетуказатель на него
        tok_type = OPERATOR;
        *temp++ = *exp_ptr++; //перейти к следующему символу
    }
    
    else if (isdigit(*exp_ptr)) { //проверяет на принадлежность к числу
        while (!isdelim(*exp_ptr)) *temp++ = *exp_ptr++; //проверка на разделители
        tok_type = NUMBER;
    }
    *temp = '\0';
}
// Return true if c is a delimiter.
bool parser::isdelim(char c)
{
    if (strchr(" +-/*%^=()", c) || c == 9 || c == '\r' || c == 0)
        return true;
    return false;
}
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
11.04.2017, 21:26
последний метод чего-то делает.
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
// Извлечь следующую лексему.
void parser::get_token()
{
    register char *temp;
    tok_type = UNDEFTOK; //обнуление типа для анализа следующей лексемы
    temp = token; // Присваивается текущая лексема (token)
    *temp = '\0';
 
    if (!*exp_ptr) return; //конец выражения
 
    while (isspace(*exp_ptr)) ++exp_ptr; //пропустить пробелы
 
    if (strchr("+-*/%^=()", *exp_ptr)) { //ищет нужный оператор в 1-ом аргументе и возвращаетуказатель на него
        tok_type = OPERATOR;
        *temp++ = *exp_ptr++; //перейти к следующему символу
    }
    
    else if (isdigit(*exp_ptr)) { //проверяет на принадлежность к числу
        while (!isdelim(*exp_ptr)) *temp++ = *exp_ptr++; //проверка на разделители
        tok_type = NUMBER;
    }
    *temp = '\0';
}
// Return true if c is a delimiter.
bool parser::isdelim(char c)
{
    if (strchr(" +-/*%^=()", c) || c == 9 || c == '\r' || c == 0)
        return true;
    return false;
}
пока не вдаваясь в подробности видно что он работает с указателем exp_ptr и типом выражения tok_type
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
11.04.2017, 21:52  [ТС]
Да, но exp_ptr он помещает выражение целиком, а потом постепенно, разбирая его на лексемы, смещается по этому массиву символов как бы, а разобранные лексемы помещает по одной в token, но как не понятно.

И ещё после того как он проверит лексему он обнуляет token и начинает разбирать следующий символ. А куда деваются уже разобранные лексемы и как они потом воспроизводятся, после погружения рекурсии, тоже не пойму. Где хранятся конечные данные, по которым он в делает в конце окончательный расчёт?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
12.04.2017, 00:07
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Где хранятся конечные данные, по которым он в делает в конце окончательный расчёт?
Он не делает в конце. Он на лету делает, подставляет результат в виде лексемы же ( если нужно убирает скобки может быть и согласует знак) и передаёт парсеру опять. По идее должна быть взаиморекурсия парсера и вычисляющего метода. Хотя может и просто парсерсера.
В конце чтобы, - нужно дерево разбора строить. Пока это не понятно туда не нужно Вам.
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
12.04.2017, 08:17  [ТС]
Понять бы как он меняет token!

Цитата Сообщение от IGPIGP Посмотреть сообщение
Он не делает в конце. Он на лету делает, подставляет результат в виде лексемы же ( если нужно убирает скобки может быть и согласует знак) и передаёт парсеру опять.
Но по отладчику я определил, что он выполняет действия исходя из приоритета, т. е. может начать и с конца, а разбор на лексемы он ведёт строго с начала (слева на право). Значит он где-то должен хранить промежуточные данные?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
12.04.2017, 08:31
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Значит он где-то должен хранить промежуточные данные?
Святые слова. Это происходит всегда и везде, потому как фраза уж очень общая.
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
он выполняет действия исходя из приоритета, т. е. может начать и с конца,
До первой запятой - вполне законченная мысль. Посмотрите на всё выражение как на "первое в выбранном направлении (у нас слева-на -право) доступное действие". Программа его ищет, выполняет, составляет лексему результата, подставляет в исходное выражение вместо подстроки операции и операндов/да, которая была вычислена. Новое выражение (данное в данном случае, опять же, - строкой) передаётся снова в парсер. То есть, снова разбирается справа налево. Это самая простая реализация. Обычно применяют два взаимнорекурсивных метода - собственно лексический анализатор парсер и вычислитель. Недостатком является необходимость многократного парсинга, всреднем, половины лексем выражения. Поэтому я предложил создать полиморфный класс список которого будет исходником для вычислителя. Но пока пусть будет так как проще.
То есть промежуточных данных по большому счёту (не имея ввиду временные локальные переменные) и нет. Мы из строки делаем строку, но каждый раз меньшего размера.
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
12.04.2017, 09:53  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Посмотрите на всё выражение как на "первое в выбранном направлении (у нас слева-на -право) доступное действие". Программа его ищет, выполняет, составляет лексему результата,
Как же она все действия сразу может вычислить? Может вы имели в виду часть выражения? Но тогда я не пойму где хранится эта часть выражения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.04.2017, 09:53

Регулярное выражение, которое пропускает все символы, кроме пробелов
Я состряпал такое вот выражение preg_match(&quot;#^+$#&quot;,$password) но оно по какой-то причине не пропускает русские буквы в $password. А если...

Регулярное выражение, которое убирало бы из строки все символы, не являющиеся буквами
Всем привет! Ребят, помогите пожалуйста составить выражение для регулярок, которое убирало бы из строки все символы которые не являются...

Ввести символы, формируя из них стек. Удалить минимальный элемент
плиз,помогите, я совсем не понимаю:cry:

Regex выражение которое будет проверять, что в строке есть только символы латинского алфавита и спецсимволы
Задача написать выражение которое будет проверять, что в строке есть только символы латинского алфавита+ спецсимволы (. ^ $ * + ? { } \ |...

Ввести символы, формируя из них стек. Найти минимальный элемент и вставить на его место 0
Задание: Ввести символы, формируя из них стек.Найти минимальный элемент и вставить на его место 0. Вывести полученный стек на экран....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru