|
Помогите решить, не понимаю даже с чего начать Ø (mikecool 30.06.2022 11:06) | ☑ | ||
---|---|---|---|---|
0
TheRussek15
29.06.22
✎
21:39
|
Сидел искал задания для себя, что можно порешать и нашел задачю:
Надо сделать обработку с одной строкой. В эту строку вводятся цифры, скобки и арифметическое действия. Необходимо реализовать механизм, чтобы система считала выражение с учетом скобок, но без приоритетов умножения и деления, то есть если написано 5+7*8, то система должна сложить 5 и 7, затем результат умножить на 8. |
|||
1
NorthWind
29.06.22
✎
21:46
|
(0) скобки - это просто рекурсия. То есть когда вы встречаете открывающую скобку, вы вызываете функцию вычисления саму из себя, а продолжаться работа функции должна до тех пор, пока не встретилась первая закрывающая скобка или пока строка с выражением не закончилась.
|
|||
2
Garykom
гуру
29.06.22
✎
21:51
|
(0) Просто добавь скобок и сделай Вычислить()
|
|||
3
Garykom
гуру
29.06.22
✎
21:52
|
5+7*8 = Вычислить("(5+7)*8")
|
|||
4
NorthWind
29.06.22
✎
21:53
|
(3) если скобки нужно будет добавлять автоматизированно, то это будет не сильно проще, чем написать свой парсер выражений без приоритетов, но со скобками %)
|
|||
5
Garykom
гуру
29.06.22
✎
21:54
|
(4) Неа, сильно проще ибо алгоритм простейший
|
|||
6
Garykom
гуру
29.06.22
✎
21:55
|
(5)+ причем он однопроходной
|
|||
7
TheRussek15
29.06.22
✎
21:58
|
Вся проблема в том, что:
1. Я только-только учусь и мало знаний, поэтому не могу реализовать, представляю как это сделать, но вот в коде как-то не делается 2. Человек должен сам добавлять свои значения в обработчик, допустим 2+2*2 должно 8, 3+4*5 должно 35 получатся |
|||
8
Garykom
гуру
29.06.22
✎
21:59
|
Но ТСу это не поможет
Ему что парсер писать что добавлять скобки один хрен не сделать |
|||
9
NorthWind
29.06.22
✎
22:00
|
(5) он и для вычисления однопроходный будет, если не нужен приоритет операций. Все можно считать по ходу первого и единственного разбора, скобки - рекурсия с места открытия скобки.
|
|||
10
Garykom
гуру
29.06.22
✎
22:00
|
(7) Тебе нужна теория алгоритмов и конечные автоматы
Если не понимаешь основ то задачу не решить |
|||
11
Garykom
гуру
29.06.22
✎
22:02
|
(9) Условий больше, рекурсия тоже усложняет
Я согласен что что парсер что добавить скобки тоже парсер но попроще в два раза |
|||
12
Garykom
гуру
29.06.22
✎
22:03
|
ТС надо начать с разделения одной строки на массив подстрок по порядку
В которых числа, скобки и операции отдельно |
|||
13
Garykom
гуру
29.06.22
✎
22:05
|
"5+7*8"
надо разделить на "5", "+", "7", "*", "8" |
|||
14
Ненавижу 1С
гуру
29.06.22
✎
22:37
|
Эх... Писал виртуальную машину для своего языка. Закончил на том, что она научилась распарсивать язык в псевдокод и выполнять простейшие действия.
Это был C++ |
|||
15
Злопчинский
30.06.22
✎
00:30
|
так это ж ПОЛИЗ, стековая машина.
|
|||
16
sikuda
30.06.22
✎
00:47
|
(13) Это тебе надо писать писать грамматику и парсер и лексер к ней. Лучше освоить что уже готовое (ANTLR)
|
|||
17
NorthWind
30.06.22
✎
07:23
|
(7) так никто поначалу ничего не понимает. Погуглите. Рекомендую поискать такую штуку как "обратная польская запись", это самый простой способ автоматического вычисления выражений.
|
|||
18
Ненавижу 1С
гуру
30.06.22
✎
07:25
|
(7) допустим 2+2*2 должно 8
Уверен, математику учил? |
|||
19
NorthWind
30.06.22
✎
07:28
|
(18) эта задача может ставиться с приоритетом операций и без. Коассическая задача - с приоритетом и она достаточно сложно решается, например через преобразование к обратной польской записи. Но первачкам часто ставят именно в изложении (0), без приоритетов. Тогда можно решать в лоб, разбирая строку и производя вычисления, и только использовать рекурсию для скобок.
|
|||
20
СвинТуз
30.06.22
✎
09:30
|
"Я только-только учусь и мало знаний"
А тут не нужно. Анализ строки это круто. Парсер говорите. Ну да. КоличествоСкобок = СтрЧислоВхождений(Выражение,"*")+СтрЧислоВхождений(Выражение,":"); Выражение = СтрЗаменить(Выражение,"*",")*"); Выражение = СтрЗаменить(Выражение,":","):"); Для Счетчик = 1 По КоличествоСкобок Цикл Выражение = "("+Выражение; КонецЦикла; Сообщить(Выполнить(Выражение)); Наверняка есть ошибки. Но как то так. Не понятно что будет с такого рода выражением 2*2, но это убирается. |
|||
21
СвинТуз
30.06.22
✎
09:32
|
Возможно
Выполнить("(2)*2") Не даст ошибки |
|||
22
СвинТуз
30.06.22
✎
09:34
|
"задачю"
Павлины говоришь? |
|||
23
TheRussek15
30.06.22
✎
11:05
|
(22) Спасибо большое, а не то я просто уже думал это как-то через массив делать, всю строчку разбить на символы и запихнуть в массивы и потом уже по условиям делать действие, кхем... И да, вчера уже просто вечером плыл, исправляю ЗАДАЧУ!)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |