Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 11 
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 18.02.2005
Откуда: Питер
смысл в том, чтобы прога распознавала функцию из строки
(напр: f(x)=x^7-7*(2-x) )
помогите найти алгоритм
заранее спасибо
PS нашел подобное на ishodniki.ru но там компилятор visual c++ а у меня его нет!

_________________
icq 9128871



Партнер
 

Junior
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: г. Новокузнецк
Когда я столкнулся с подобной задачей, я откопал
в сети книжку по конечным автоматам, покумекал и
написал две свои функции.

Одна транслировала исходное выражение в промежуточный
код (настоящий компилятор писать - это было уже выше моих сил).
В итоге получалась псевдопрограмма.
Второй функции я передавал эту псевдопрограмму и список значений
переменных. Эта функция уже выдавала конечный результат.

Нечто похожее есть здесь: http://www.delphi4all.narod.ru/alg/recogn.htm


 

Member
Статус: Не в сети
Регистрация: 01.10.2005
Есть такая вещь как обратная польская запись :)

_________________
я теперь снова Junior )


 

Junior
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: г. Новокузнецк
Esp
Да, я ей и пользовался.


 

Member
Статус: Не в сети
Регистрация: 18.02.2005
Откуда: Питер
а подробнее(я вобщем-то не новичок, но и не программер)
обьясните сам алгоритм словами плз
ну или примерной блок-схемой если не лень рисовать

_________________
icq 9128871


 

Member
Статус: Не в сети
Регистрация: 15.06.2005
Откуда: Днепропетровск
Лет 6 назад я писал такую программу на паскале в учебных целях, она у меня осталась. Могу дать если надо. Там был рекурсивный алгоритм т.е. польская запись не использовалась.


 

Member
Статус: Не в сети
Регистрация: 18.02.2005
Откуда: Питер
_Tarik_
скинь на мыло плиз
verwolf@mail.wplus.net

_________________
icq 9128871


 

Advanced member
Статус: Не в сети
Регистрация: 23.10.2003
Откуда: Иркутск/Майкоп
http://algolist.manual.ru/syntax/index.php

_________________
Края каждого совершенно нового крышка процессора не на 100% гладкая. Это связано с тем, что следов мастерства не избежать. (c) Али.


 

Junior
Статус: Не в сети
Регистрация: 30.08.2003
Откуда: г. Новокузнецк
_Tarik_
Я когда-то делал интерпретатор логических формул с помощью рекурсивного алгоритма.
У такого подхода есть один недостаткок - при вычислении формулы в цикле
расчет идет дольше, чем при использовании обратной польской записи.


 

Member
Статус: Не в сети
Регистрация: 18.02.2005
Откуда: Питер
нам препод вчера объяснил как делать
нарисовал блоксхемы, я по ним создал функции
прога запускается но возникают ошибки при распознавании
error 1 ( это если неверный символ) или Floating point error


вот сам код:

Код:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
//#include <d:\bc3\bin\strscan\s1.h>
#pragma argsused

// variables
char MouseSt[20], hBrush[20],str1[80],st[40],chkstr[10];
static int back,MsX,MsY,SizeX=75,SizeY=75,SizeWindowX=800,SizeWindowY=400,BeginX=10,BeginY=10,i,charDX=5,charDY=5,SizeWindow_X=400,SizeWindow_Y=400;
static int error=0,N=0,flagTCK=0;
float x=0;
char m_string[70];
HWND hwnd;
HWND hdlg;
HANDLE MainhInstance;
// end of variables

//        function block
int max(int value1,int value2){if (value1>value2) return(value1); else return(value2);};
int min(int value1,int value2){if (value1>value2) return(value2); else return(value1);};
static DLGPROC lpfnDlgProc;


//==============analisator

float s1();
float s2();
float s3();
int isnum(char c)
                {
                 switch(c)
                        {
                         case '0':case '1':case '2':case '3':case '4':
                         case '5':case '6':case '7':case '8':case '9':
                                return(1);
                         case '.':
                                if (flagTCK==1) return(0);
                                flagTCK=1;
                                return(1);
                        }
      }
float s3()
   {float r;

        char wst[20];
         switch(m_string[N])
                {
                case '0':case '1':case '2':case '3':case '4':
                case '5':case '6':case '7':case '8':case '9':
                        flagTCK=0;i=0;
                        do
                                        {
                                         wst[i++]=m_string[N++];
                                        }
         while(isnum(m_string[N])==1);
                        wst[i]='\0';
         sscanf(wst,"%f",&r);
                        //r=m_string[N]-'0';
                        return (r);


      case 'x':return(x);
                case'(':
                        N++;
                        r=s1();
                        if (error!=0) return(0);
                        if (m_string[N]!=')') {error=3;return(0);}
                        N++;
                        return(r);
                default: break;
                }
         }

float s2()
   {float r,r1;
         r=s3();
         if (error!=0) return(0);
                do{
      switch(m_string[N])                   
                        {
                        case '*':
                                N++;
                                r=r*s3();
                                break;
                        case '/':
                                N++;
                                r1=s3();
                                if (error!=0) return(0);
            if (fabs(r1)<0.00001) {error=2;return 0;}
                                r=r/r1;
                                break;
                        case')':case'+':case'-':return (r);
                        default:error=1;return 0;
                        }
                if (error!=0) return (0);
                }while(N<strlen(m_string));
   }

float s1()
   {float r;
    switch(m_string[N])
                {
                 case '+':      N++;
                                r=s2();
                                break;

                 case'-':       N++; r=-s2();
                                break;

       default:r=s2();
                                break;
                }
        if (error!=0) return(0);

                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 ;

case SB_THUMBPOSITION:
            i=LOWORD(lParam) ;
            break ;
default               :i=BeginY ;
                            }
if(i!=BeginY)
 {
ScrollWindow(hwnd,0,BeginY-i,NULL,NULL) ;
BeginY=i ;
SetScrollPos(hwnd,SB_VERT,BeginY,TRUE) ;
UpdateWindow(hwnd) ;
 }
return(0) ;



case WM_SIZE :  SizeWindowX=LOWORD(lParam) ;
SizeWindowY=HIWORD(lParam) ;
SetScrollRange(hwnd,SB_HORZ,0,SizeX,TRUE);
SetScrollRange(hwnd,SB_VERT,0,SizeY,TRUE);
SetScrollPos(hwnd,SB_HORZ,BeginX,TRUE);
SetScrollPos(hwnd,SB_VERT,BeginY,TRUE);
UpdateWindow(hwnd);
return(0) ;


case WM_DESTROY:
   MessageBox(hwnd,"Quit! Bue!","QUIT",MB_OK|MB_ICONQUESTION);
   PostQuitMessage(0) ;
   return(0) ;
 }return(DefWindowProc(hwnd,message,wParam,lParam)) ;
}

int InitWin(HANDLE hInstance)

{
WNDCLASS wndclass  ;
wndclass.style   =  CS_HREDRAW|CS_VREDRAW     ;
wndclass.lpfnWndProc=WinProc             ;
wndclass.cbClsExtra   =  0             ;
wndclass.cbWndExtra   =  0             ;
wndclass.hInstance   =  hInstance             ;
wndclass.hIcon   =  LoadIcon(NULL,IDI_APPLICATION);
wndclass.hCursor   =  LoadCursor(NULL,IDC_ARROW)     ;
wndclass.hbrBackground = GetStockObject(WHITE_BRUSH)     ;
wndclass.lpszMenuName  =  "STRSCAN"             ;
wndclass.lpszClassName =  "STRSCAN"             ;
/*-----------------------------------------------------------------*/
RegisterClass(&wndclass) ;
return(1) ;



int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance,LPSTR lpszCmdParam,int nCmdShow)
{

MSG  msg      ;
MainhInstance=hInstance;
if( ! hPrevInstance )   InitWin(hInstance) ;
hwnd=CreateWindow("STRSCAN","Hell",WS_OVERLAPPEDWINDOW|WS_VSCROLL|WS_HSCROLL,SizeX,SizeY,SizeWindowX,SizeWindowY, NULL,NULL,hInstance,NULL) ;
ShowWindow(hwnd,nCmdShow) ;
UpdateWindow(hwnd) ;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg) ;
     DispatchMessage(&msg) ; 
}
return(msg.wParam) ;
}


прошу помочь

_________________
icq 9128871


 

Member
Статус: Не в сети
Регистрация: 18.02.2005
Откуда: Питер
Всем спасибо все ок
сделал сам

_________________
icq 9128871


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 11 
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan