Имя: Пароль:
1C
1С v8
Помогите решить, не понимаю даже с чего начать
Ø (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) Спасибо большое, а не то я просто уже думал это как-то через массив делать, всю строчку разбить на символы и запихнуть в массивы и потом уже по условиям делать действие, кхем... И да, вчера уже просто вечером плыл, исправляю ЗАДАЧУ!)
Основная теорема систематики: Новые системы плодят новые проблемы.