Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Расчет выражения

507
06 декабря 2002 года
PASS
45 / / 20.09.2000
Народ... имеется небольшая проблема: надо посчитать пример, записанный в текстовом поле. Т.е. пользователь вводит пример, нажимает кнопку и получает ответ... Но пример может быть сложным: содержать разные математические операции, скобки и т.д.

Может, кто-нибудь подскажет как это сделать, или хотя бы кинет ссылку почитать...

Заранее благодарен
371
07 декабря 2002 года
Non_prog
193 / / 20.03.2000
Цитата:
Originally posted by PASS
Народ... имеется небольшая проблема: надо посчитать пример, записанный в текстовом поле.



int znak[index],y1,y2,result;

for (int x=1;x<=Edit1->Text.Lenght();x++)
{
if (Edit1->Text.SubString(x,1)=="1")
y1=1;
if (Edit1->Text.SubString(x,1)=="+")
znak[]=...
if (Edit1->Text.SubString(x,1)=="1")
y2=1;
if (Edit1->Text.SubString(x,1)=="=")
znak[]=...
}
for (znak)...
switch(znak)...
result=y1+y2;
...
:)

3
08 декабря 2002 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by Non_prog


int znak[index],y1,y2,result;

for (int x=1;x<=Edit1->Text.Lenght();x++)
{
if (Edit1->Text.SubString(x,1)=="1")
y1=1;
if (Edit1->Text.SubString(x,1)=="+")
znak[]=...
if (Edit1->Text.SubString(x,1)=="1")
y2=1;
if (Edit1->Text.SubString(x,1)=="=")
znak[]=...
}
for (znak)...
switch(znak)...
result=y1+y2;
...

:)



Ага... программисты...
А если надо вывести все четные числа?
Наверное, это будет вяглядеть вот так:

void Even() {
printf(2);
printf(4);
printf(6);
printf(8);
.......
printf(256);
}

507
08 декабря 2002 года
PASS
45 / / 20.09.2000
Цитата:
Originally posted by Non_prog


int znak[index],y1,y2,result;

for (int x=1;x<=Edit1->Text.Lenght();x++)
{
if (Edit1->Text.SubString(x,1)=="1")
y1=1;
if (Edit1->Text.SubString(x,1)=="+")
znak[]=...
if (Edit1->Text.SubString(x,1)=="1")
y2=1;
if (Edit1->Text.SubString(x,1)=="=")
znak[]=...
}
for (znak)...
switch(znak)...
result=y1+y2;
...
:)



Все это, конечно, хорошо, но если пользователь вводит что-то типа: "1.236*(5+3.96*43)+23.5", то нужно же ещё учесть порядок действий, разобраться со скобками и т.д. Вот в этом-то вся проблема...

423
08 декабря 2002 года
Quasi
98 / / 20.01.2000
Цитата:
Originally posted by PASS
Народ... имеется небольшая проблема: надо посчитать пример, записанный в текстовом поле. Т.е. пользователь вводит пример, нажимает кнопку и получает ответ... Но пример может быть сложным: содержать разные математические операции, скобки и т.д.

Может, кто-нибудь подскажет как это сделать, или хотя бы кинет ссылку почитать...

Заранее благодарен



Поищи польскую обратную запись, и всё сразу станет ясно...
например здесь

507
08 декабря 2002 года
PASS
45 / / 20.09.2000
Цитата:
Originally posted by Quasi


Поищи польскую обратную запись, и всё сразу станет ясно...
например здесь



Я уже смотрел до этого польскую запись и стек операции, но до меня не доходит, как перевести пример из нормальной записи в польскую (я имею ввиду программно)...

1.6K
09 декабря 2002 года
Unexpected
137 / / 09.12.2002
Цитата:
Originally posted by PASS


Я уже смотрел до этого польскую запись и стек операции, но до меня не доходит, как перевести пример из нормальной записи в польскую (я имею ввиду программно)...

У меня в свое время была такая проблема. Решилась она путем построения дерева. типа

знак1
/\
первое_число/\второе_число

текущим является узел "знак1" если следующий знак2 имеет приоритет выше текущего - на место знак1 ставим знак2, а знак1 спускаем чилдом к знак2
Такая конструкция позволяет легко учитывать и скобки, и унарные +/- и т.д.
И пересчитывать много раз(если, например, используются переменные, ее проще и быстрее т.к. не требуется повторный анализ)

507
09 декабря 2002 года
PASS
45 / / 20.09.2000
Цитата:
Originally posted by Unexpected
У меня в свое время была такая проблема. Решилась она путем построения дерева. типа

знак1
/\
первое_число/\второе_число

текущим является узел "знак1" если следующий знак2 имеет приоритет выше текущего - на место знак1 ставим знак2, а знак1 спускаем чилдом к знак2
Такая конструкция позволяет легко учитывать и скобки, и унарные +/- и т.д.
И пересчитывать много раз(если, например, используются переменные, ее проще и быстрее т.к. не требуется повторный анализ)



Спасибо за ответ... все понял...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог