Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вычисл. мат. выраж., заданного строкой 
:(
    Опции темы
BreakPointMAN
Дата 17.9.2005, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Народ, наверняка же кто-то сталкивался...
Вообщем, есть строка, в ней записано какое-то выражение, нужно просчитать, чему оно равно.
Я когда-то тыркался с парсингом выражений, обратной польской записью и т.п., но исходников не осталось, и, по-правде говоря, не особо хочется опять этим заниматься.
Может есть у кого на примете класс/библиотека/компонент, который сие делает? Киньте тогда в меня ссылкой/кодом, если не сложно.
Желательно, чтобы поддерживались скобки и тригонометрические функции, но, в принципе, на крайний случай и 4 арифметических операции сойдёт.


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
tigger
Дата 18.9.2005, 04:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

Репутация: 2
Всего: 4



Попробуй этот компанент сам не смотрел, правда он под Delphi

http://www.ishodniki.ru/base/Delphi/delphi...ing_to_math.zip


--------------------
user posted image
PM MAIL   Вверх
CatOleg
Дата 19.9.2005, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 14.7.2005
Где: Запорожье

Репутация: нет
Всего: нет



Как создать язык пpогpаммиpования и тpанслятоp А.В. Хохлов(30kb)
http://bcb-program.narod.ru/books/context.rar
Джек Креншоу. Давайте создадим компилятор!(439 kb)
http://bcb-program.narod.ru/books/crenshaw.rar
PM MAIL WWW   Вверх
CatOleg
Дата 21.9.2005, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 14.7.2005
Где: Запорожье

Репутация: нет
Всего: нет



#include <iostream.h>
#include <ctype.h>
#include <string.h>
struct name
{
char *string;
name* next;
double value;
};
const TBLSZ=23;
name*table[TBLSZ];
double number_value;
char* name_string;
char WS;
enum token_value { NAME,NUMBER,END,PLUS='+',
MINUS='-',MUL='*',DIV='/',
PRINT=';',ASSIGN='=',LP='(',STP='^',RP=')' };
token_value curr_tok;
token_value get_token(void);
double expr(void);
int no_of_errors;
double error(char *s)
{
cerr<<"error:"<<s<<"\n";
no_of_errors++;
return 1;
}

name * look(char* p,int ins=0)
{
int ii=0;
char
* pp=p;
while (*pp)ii=ii<<1^*pp++;
if(ii<0) ii=-ii;
ii %=TBLSZ;
for (name*n =table[ii];n;n=n->next)
if (strcmp(p,n->string)==0)return n;

if (ins==0) error("Ё¬п ­Ґ ­ ©¤Ґ­®");
name * nn=new name;
nn->string = new char[strlen(p)+1];
strcpy(nn->string,p);
nn->value=1;
nn->next = table[ii];
table[ii]=nn;
return nn;
}
//----------------------------------------



inline name* insert(char* s) { return look(s,1);}



double prim()
{
int loop;
double d;

switch (curr_tok){
case NUMBER:
get_token();
return number_value;
case NAME:
if (get_token() == ASSIGN) {
name* n=insert(name_string);
get_token();
n->value = expr();
return n->value;
}
return look(name_string)->value;
case MINUS:
get_token();
return-prim();

case LP:
get_token();
double e=expr();
if (curr_tok !=RP) return error("вॡгҐвбп )");
get_token();
return e;
case END:
return 1;
default:
return error("¤®«¦­® Ўлвм primary");
}
}
//
double term (void);
double expr()
{
int loop;
double d;

double left = term();
for(;;)
switch(curr_tok) {
case PLUS:
get_token();
left+=term();
break;
case MINUS:
get_token();
left-=term();
break;

default:
return left;
}
}
// ------------------------------
double term()
{
int loop;
double d;
double left = prim();
for(;;)
switch (curr_tok)
{
case MUL:
get_token();
left *= prim();
break;
case DIV:
get_token();
d=prim();
if(d==0) return error("¤Ґ«Ґ­ЁҐ ­  0");
left =left/ d;
break;
case STP:
get_token();
d=prim();
if (d==0)
{
left=1;
break;
}
double tmp_l=left;

for(loop=2;loop<=d;loop++)
left *=tmp_l;
break;


default:
return left;
}
}
//----------------------------
token_value get_token()
{
char ch;

do {
if(!cin.get(ch)) return curr_tok = END;
} while (ch!='\n' && isspace(ch));
switch (ch){
case ';':
case '\n':
// cin>>WS;
return curr_tok=PRINT;
case '*':case '/': case '+':case '-':case '(':case ')': case '^':
case '=':
return curr_tok=ch;
case '0':
case '9':
case '8':
case '7':
case '6':
case '5':
case '4':
case '3':
case '2':
case '1':
case '.':
cin.putback(ch);
cin >> number_value;
return curr_tok=NUMBER;
default:
if (isalpha(ch)){
char * p=name_string;
*p++=ch;
while (cin.get(ch) && isalnum(ch)) *p++=ch;
cin.putback(ch);
*p=0;
return curr_tok=NAME;
}
error ("Ї«®е п «ҐЄбҐ¬ ");
return curr_tok=PRINT;
}
}

int main(int argc,char* argv[])
{
switch (argc){

case 1:
break;
case 2:
cin = *new istream(strlen(argv[1]),argv[1]);
break;
default:
error("б«ЁиЄ®¬ ¬­®Ј® Ї а ¬Ґва®ў");
return 1;
}



insert("pi")->value=3.1415926535;
insert("e")->value=2.71828182845;

while (cin)
{
get_token();

if(curr_tok==END) break;
if (curr_tok==PRINT)continue;
cout<<expr()<<"\n";
}
return no_of_errors;
}


PM MAIL WWW   Вверх
BreakPointMAN
Дата 21.9.2005, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 6
Всего: 24



Всем большое спасибо за ссылки и код.
Трабла была решена с помощью класса TRxMathParser из библиотеки RxLib 2.75 для Delphi & Builder'а.


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0464 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.