Member
Статус: Не в сети Регистрация: 18.02.2005 Откуда: Питер
смысл в том, чтобы прога распознавала функцию из строки
(напр: f(x)=x^7-7*(2-x) )
помогите найти алгоритм
заранее спасибо
PS нашел подобное на ishodniki.ru но там компилятор visual c++ а у меня его нет!
Junior
Статус: Не в сети Регистрация: 30.08.2003 Откуда: г. Новокузнецк
Когда я столкнулся с подобной задачей, я откопал
в сети книжку по конечным автоматам, покумекал и
написал две свои функции.
Одна транслировала исходное выражение в промежуточный
код (настоящий компилятор писать - это было уже выше моих сил).
В итоге получалась псевдопрограмма.
Второй функции я передавал эту псевдопрограмму и список значений
переменных. Эта функция уже выдавала конечный результат.
Member
Статус: Не в сети Регистрация: 15.06.2005 Откуда: Днепропетровск
Лет 6 назад я писал такую программу на паскале в учебных целях, она у меня осталась. Могу дать если надо. Там был рекурсивный алгоритм т.е. польская запись не использовалась.
Junior
Статус: Не в сети Регистрация: 30.08.2003 Откуда: г. Новокузнецк
_Tarik_
Я когда-то делал интерпретатор логических формул с помощью рекурсивного алгоритма.
У такого подхода есть один недостаткок - при вычислении формулы в цикле
расчет идет дольше, чем при использовании обратной польской записи.
Member
Статус: Не в сети Регистрация: 18.02.2005 Откуда: Питер
нам препод вчера объяснил как делать
нарисовал блоксхемы, я по ним создал функции
прога запускается но возникают ошибки при распознавании
error 1 ( это если неверный символ) или Floating point error
do{ switch(m_string[N]) { case '+': N++; r=r+s2(); break; case '-': N++; r=r-s2(); break; case ')':return (r); default: error=1;return(0); } }while(N<strlen(m_string)); }
//==============end of analisator========================== float result,r_; char f_s[20]={"error 0"}; //end of function block
BOOL CALLBACK _export DlgProc(HWND hdlg,UINT msg,WPARAM wParam,LPARAM lParam) { switch(msg) { case WM_INITDIALOG:SetDlgItemText(hdlg,552,str1);return(1) ; case WM_COMMAND:switch(wParam) {
case IDOK: GetDlgItemText(hdlg,552,m_string,80); MessageBox(hdlg,m_string,"Input string",MB_OK); error=0;N=0;x=5; r_=s1(); switch(error) { case 0:result=r_;strcpy(str1,m_string); sscanf(st,"%f",result); MessageBox(hdlg,st,"Result",MB_OK);break;
case 1:case 2: case 3:f_s[6]=error+'0'; MessageBox(hdlg,f_s,"Error",MB_OK); }
case IDCANCEL: EndDialog(hdlg,0); return(TRUE) ; } } return(FALSE) ; }
long FAR PASCAL WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
HDC hdc ; PAINTSTRUCT ps ;
switch(message) { case WM_PAINT : hdc=BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps); return(0) ;
case WM_COMMAND: switch(wParam) { case 21:lpfnDlgProc=(DLGPROC) MakeProcInstance((FARPROC)DlgProc,MainhInstance); DialogBox(MainhInstance,"DIALOG_1",hwnd,lpfnDlgProc); break; case 5: DestroyWindow(hwnd); }
case WM_HSCROLL:switch(wParam) { case SB_TOP : i=0 ; break ; case SB_BOTTOM : i=SizeX ; break ; case SB_LINEUP : i=max(0,BeginX-charDX) ; break ; case SB_LINEDOWN:i=min(SizeX,BeginX+charDX) ; break ; case SB_PAGEUP : i=max(0,BeginX-SizeWindowX) ; break ; case SB_PAGEDOWN:i=min(SizeX, BeginX+SizeWindow_X); break ; case SB_THUMBPOSITION: i=LOWORD(lParam) ; break ; default : i=BeginX ; }
if(i!=BeginX) { ScrollWindow(hwnd,BeginX-i,0,NULL,NULL) ; BeginX=i ; SetScrollPos(hwnd,SB_HORZ,BeginX,TRUE) ; UpdateWindow(hwnd) ; message=WM_PAINT ; } return(0) ; case WM_VSCROLL:switch(wParam) { case SB_TOP : i= 0 ; break ; case SB_BOTTOM : i=SizeY ; break ; case SB_LINEUP : i=max(0,BeginY-charDY) ; break ; case SB_LINEDOWN: i=min(SizeY,BeginY+charDY) ; break ; case SB_PAGEUP : i=max(0,BeginY-SizeWindowY) ; break ; case SB_PAGEDOWN:i=min(SizeY,BeginY+SizeWindowY); break ;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения