Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
 Аватар для anton9017
1 / 1 / 2
Регистрация: 23.06.2010
Сообщений: 95

Вычисление формул

28.07.2010, 11:31. Показов 4243. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дана строка. В строке записана формула.
Подскажите, Самый простой способ вычисления формул.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.07.2010, 11:31
Ответы с готовыми решениями:

Доказательства формул и теорем
На самом деле эта теме косвенно относится к алгоритмам. В школе я успевал по математике, хорошо сдал ЕГЭ (это не так просто, чтобы не...

Расчет формул, синтаксический анализатор
Как написать синтаксический анализатор расчета сложных формул со скобками с нуля (не только с числами и знаками математических операций,...

Обратная Польская Нотация на большом наборе формул
Собственно проблема не в понимании алгоритма, а как лучше представить данные, когда нужно раскрутить формулу не только с бинарными...

27
 Аватар для el Gato Estelar
9 / 9 / 1
Регистрация: 26.05.2010
Сообщений: 36
28.07.2010, 13:27
Синтаксическим разбором. Почитать можно, вбив в гугл "вычисление выражений".
По поводу простоты для частного случая -- нужно более конкретно знать, что за "формула"
0
 Аватар для anton9017
1 / 1 / 2
Регистрация: 23.06.2010
Сообщений: 95
28.07.2010, 14:01  [ТС]
el Gato Estelar, Программа должна быть универсальной для всех формул.
Где я только не искал. Везде искал.
0
Padawan
 Аватар для Johnny_D
473 / 323 / 30
Регистрация: 30.01.2010
Сообщений: 1,841
28.07.2010, 14:02
Единственный совет от меня, используйте деревья для разбора выражений. Иначе будет попа.
0
 Аватар для anton9017
1 / 1 / 2
Регистрация: 23.06.2010
Сообщений: 95
28.07.2010, 15:37  [ТС]
Другими словами нужно сначала записать в инфексной, префексной или в постфиксной записи.
А по другому можно?
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
28.07.2010, 16:21
Лично я бы делал рекурсивным спуском
примерно так
Надо сделать для чисел бинарные +, -, * и / и унарные + и -.
Грамматика:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
; одна и более цифр
число        :: <цифра>+
 
; плюс или минус
ун-оператор  :: "+" | "-"
 
; унарный оператор и значение
; или выражение в скобках
; или собтвенно число
значение     :: <ун-оператор> <значение> | "(" <выражение> ")" | <число>
 
; операторы умножения и деления
оп-умножения :: "*" | "/"
 
; одно значение или сколько угодно последовательных умножений/делений
умножение    :: <значение> ( <оп-умножения> <значение> )*
 
; плюс или минус
оп-сложения  :: "+" | "-"
 
; одно умножение или сколько угодно последовательных сложений/вычитаний
сложение     :: <умножение> ( <оп-сложения> <умножение> )*
 
выражение    :: <сложение>
Реализуется от меньшего к большему. Делаем функцию, которая будет парсить в коде Число согласно грамматике (одна и более цифр). Далее функцию, которая будет парсить Значение: N унарных операторов подряд и рекурсивно Значение или в скобках Выражение или Число.
Функция умножения парсит Значение и сколько угодно раз повтор: оператор умножения и Значение. Аналогично функция сложения парсит Умножение и любое число повторов: оператор сложения и Умножение. Функция выражения здесь есть фукнция сложения, как самая низкориоритетная операция.
0
 Аватар для anton9017
1 / 1 / 2
Регистрация: 23.06.2010
Сообщений: 95
28.07.2010, 16:23  [ТС]
Vovan-VE, Вы не учитываете скобки.
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
28.07.2010, 16:29
anton9017, Учитываю.

Добавлено через 18 секунд
Code
1
значение     :: <ун-оператор> <значение> | "(" <выражение> ")" | <число>
0
 Аватар для Грымзик
2507 / 1483 / 37
Регистрация: 14.09.2009
Сообщений: 2,740
28.07.2010, 18:57
Да, тут надо делать рекурсивным спуском. Посимвольно проходите строку, считая "сумму" скобок, пока не наступит момент, что вы находитесь на операторе и текущая "сумма" скобок равна 0. Тогда делите выражения на две части: что до оператора и что после и рекурсивно считаете их значения.
Если хотите, могу вам кинуть свою прогу на С++, она считает f(x) при заданном значении x, в том числе если в выражении встречаются стандартные функции, типа синуса и т.п.
0
Технофашист
228 / 216 / 11
Регистрация: 11.03.2009
Сообщений: 887
28.07.2010, 21:18
Вообще можно ПОЛИЗ использовать. Он как раз для этих целей существует.

Добавлено через 2 минуты
Насчёт рекурсивного спуска - это как из гранатомёта по воробьям палить. Не тот калибр.
0
Технофашист
228 / 216 / 11
Регистрация: 11.03.2009
Сообщений: 887
28.07.2010, 21:23
Вот наглядный пример. Здесь правдо элементарные операции одни, но скажу наперёд - практически все функции аналогичны скобкам. И это намного проще реализовать.
Вложения
Тип файла: rar poliz.rar (196.1 Кб, 35 просмотров)
0
 Аватар для anton9017
1 / 1 / 2
Регистрация: 23.06.2010
Сообщений: 95
29.07.2010, 19:49  [ТС]
darkAngel, Что такое ПОЛИЗ?

Добавлено через 17 минут
Грымзик, Скиньте, я посмотрю.
0
Технофашист
228 / 216 / 11
Регистрация: 11.03.2009
Сообщений: 887
29.07.2010, 20:05
Польская инверсаня запись. Придумана как раз для таких задач.
http://ru.wikipedia.org/wiki/%... 0%98%D0%97
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
30.07.2010, 15:09
У обратной польской нотации нельзя сделать унарные операторы.
0
 Аватар для anton9017
1 / 1 / 2
Регистрация: 23.06.2010
Сообщений: 95
30.07.2010, 17:27  [ТС]
Я завел Вас немного не в то направление. У меня есть не формула, а выражение.
К примеру 2+2*(2+2*2+2). Нужно составить программу на Delphi, которая бы считала такие варажения.
0
 Аватар для Vovan-VE
13210 / 6599 / 1041
Регистрация: 10.01.2008
Сообщений: 15,069
30.07.2010, 17:31
Цитата Сообщение от anton9017 Посмотреть сообщение
У меня есть не формула, а выражение.
Дак мы о выражениях и говорим.
0
 Аватар для anton9017
1 / 1 / 2
Регистрация: 23.06.2010
Сообщений: 95
30.07.2010, 17:32  [ТС]
Хорошо.
0
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
13.10.2010, 09:25
Цитата Сообщение от Vovan-VE Посмотреть сообщение
У обратной польской нотации нельзя сделать унарные операторы.
Можно, только необходимо ввести новый токен оператора -- унарный минус, к примеру, оперирующий с одной переменной. Правда возникают небольшие сложности в преобразовании из инфиксной нотации в постфиксную, но это уже дело техники.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
13.10.2010, 09:41
Vovan-VE
Почему же нельзя сделать унарные операторы у ОПН? Можно просто написать дополнительную функцию для их парсинга. Ведь унарный оператор может стоять только либо в самом начале выражения, либо перед скобкой. Разберём на примере унарного минуса:
Если в скобках первое число имеет унарный минус, его сразу можно парсить как отрицательное. Если перед скобкой видим минус - заменяем символ унарного оператора на "-1*". Поскольку числа с унарным минусом мы парсим без проблем, при преобразовании выражения в ОПН всё будет ништяк, такое выражение "-(2 + 2)*(-3 + 2)" спокойно преобразуется в "-1 2 2 + * -3 2 + *".
0
 Аватар для Unril
826 / 717 / 110
Регистрация: 06.10.2010
Сообщений: 825
Записей в блоге: 1
13.10.2010, 09:51
Цитата Сообщение от silent_1991 Посмотреть сообщение
Vovan-VE
Почему же нельзя сделать унарные операторы у ОПН? Можно просто написать дополнительную функцию для их парсинга. Ведь унарный оператор может стоять только либо в самом начале выражения, либо перед скобкой. Разберём на примере унарного минуса:
Если в скобках первое число имеет унарный минус, его сразу можно парсить как отрицательное. Если перед скобкой видим минус - заменяем символ унарного оператора на "-1*". Поскольку числа с унарным минусом мы парсим без проблем, при преобразовании выражения в ОПН всё будет ништяк, такое выражение "-(2 + 2)*(-3 + 2)" спокойно преобразуется в "-1 2 2 + * -3 2 + *".
Унарный минус может стоять ещё и в других местах выражения, "-(2 + -2)*(-3 + -2)", например. Вообще его можно ставить перед любым числом, чтобы показать, что оно отрицательно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.10.2010, 09:51
Помогаю со студенческими работами здесь

Вычисление формул
Добрый день, помогите написать в Python формулы

Вычисление формул
Доброго времени суток. Я не разбираюсь в C#, но сдать эти задачи по учёбе нужно. Очень надеюсь на вашу помощь, решить хотя бы часть...

Вычисление формул
Помогите составить программу в Pascal для вычисления по формуле: y=(a/x)+(b/x2) y=((x+a)2-x2)/(x2)

Вычисление математических формул
Доброго времени суток, помогите дописать корректно код пожалуйста, необходимо вычислить по формуле которая указана в коде. Sub prog() ...

Вычисление математических формул
Ребят, привет. Помогите, пожалуйста, с такой вот задачкой (желательно блок-схему, но если это проблемно, то если можно код) Спасибо. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru