![]() |
|
|
![]()
|
|
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 6 Всего: 24 |
Народ, наверняка же кто-то сталкивался...
Вообщем, есть строка, в ней записано какое-то выражение, нужно просчитать, чему оно равно. Я когда-то тыркался с парсингом выражений, обратной польской записью и т.п., но исходников не осталось, и, по-правде говоря, не особо хочется опять этим заниматься. Может есть у кого на примете класс/библиотека/компонент, который сие делает? Киньте тогда в меня ссылкой/кодом, если не сложно. Желательно, чтобы поддерживались скобки и тригонометрические функции, но, в принципе, на крайний случай и 4 арифметических операции сойдёт. -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
| tigger |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 456 Регистрация: 30.4.2005 Репутация: 2 Всего: 4 |
Попробуй этот компанент сам не смотрел, правда он под Delphi
http://www.ishodniki.ru/base/Delphi/delphi...ing_to_math.zip |
|||
|
||||
| CatOleg |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 |
|||
|
||||
| CatOleg |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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; } |
|||
|
||||
| BreakPointMAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 6 Всего: 24 |
Всем большое спасибо за ссылки и код.
Трабла была решена с помощью класса TRxMathParser из библиотеки RxLib 2.75 для Delphi & Builder'а. -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |