HOME ПРИМЕРЫ THANKS НОВИЧКАМ ДОКИ LINKS JavaScript Mail | |||
| |||
|
Turbo Pascal Examples. Простейший синтаксический анализатор. |
Графика: Также написана процедура xPowerN вычисления степенной функции x N Смотри также комментарии в самой программе. const maxN = 20; arrStrN = 40; type component = object { a component of mnogochlen: an*x**n} a:real; n:integer; function value(x:real):real; end; mnogochlen = object n:byte; c:array[1..maxN] of component; function value(x:real):real; end; str_arr = array [1..arrStrN] of string; {*****************************************} function xPowerN(x:real;n:byte):real; { Возвращает х в степени n } const eps = 1e-8; { полагаем число нулем, если меньше eps } var z:shortint; r:real; begin if n=0 then xPowerN := 1 { любое число в нулевой степени = 1 } else if abs(x)<eps then xPowerN := 0 { 0 в любой положительной степени = 0 } else begin r := exp(n*ln(abs(x))); z := 1; if (x<0) then z := -1; if n mod 2 = 0 then xPowerN := r { четная степень всегда положительна } else xPowerN := z * r { нечетная сохраняет знак } end; end; {*****************************************} function component.value(x:real):real; { Вычисление значения одной компоненты при заданном х } begin value:=a*xPowerN(x,n); end; function mnogochlen.value(x:real):real; { Вычисление значения многочлена при заданном х } var s:real; i:byte; begin for i:=1 to n do s:=s+c[i].value(x); value:=s; end; {*****************************************} { String functions } function explode(sep,s:string;var a:str_arr):integer; { Разбить строку s на кусочки подстрокой sep и записать результат в строковый массив str_arr. Сама функция вернет число кусочков Например: explode('mp','This is an simple example',a) вернет число 3, и строки в массиве a: a[1]='This is an si'; a[2]='le exa'; a[3]='le'; explode(' ','This is an simple example',a) - вернет 5 и отдельные слова в массиве a 'This','is','an','simple','example' } var L:byte absolute s; i,n,k,d:byte; begin n:=0; for i:=1 to arrStrN do a[i]:=''; k:=Pos(sep,s); d:=length(sep)-1; while (L*k>0) do begin inc(n); a[n]:=copy(s,1,k-1); delete(s,1,k+d); k:=Pos(sep,s); end; inc(n); a[n]:=s; explode:=n; end; function strReplace(findWhat,replaceTo,inString:string):string; { В строке inString заменить все вхождения подстроки findWhat на подстроку replaceTo } var sa:str_arr; n,i:byte; res:string; begin n:=explode(findWhat,inString,sa); res:=sa[1]; for i:=2 to n do res:=res+replaceTo+sa[i]; strReplace:=res; end; function strToInt(s:string):integer; { Преобразовать строку к целому числу. } var i, code: Integer; begin val(s, i, code); if code <> 0 then begin WriteLn('strToInt. Error at position: ', code, ' in line ', s, '. Program halted'); halt end else strToInt := i; end; function strToReal(s:string):real; { Преобразовать строку к вещественному числу. } var code: Integer; r: real; begin val(s, r, code); if code <> 0 then begin WriteLn('strToReal. Error at position: ', code, ' in line ', s, '. Program halted'); halt end else strToReal := r; end; {*****************************************} var s1,xPower:string; nParts:integer; b,sc:str_arr; mn:mnogochlen; i,t1,t2:byte; x:real; function F(x:real):real; { Для проверки } begin F:=3+4*x+6.5*x*x-2.6*x*x*x*x; end; begin { F(x) } s1:='3+4*x+6.5*x**2-2.6*x**4'; writeln('F(x)=',s1); s1:=strReplace('-','+-',s1); nParts:=explode('+',s1,b); { Разбили на слагаемые } mn.n:=nParts; for i:=1 to nParts do begin { b[i] - член многочлена, имеет вид a*x**n если n >= 2 то просто выделяем степень. Частные случаи, когда n=1 член имеет вид a*x, n=0 - просто a } t1:=explode('**',b[i],sc); { Здесь: sc[1] - a*x; sc[2] - n } xPower := sc[2]; t2:=explode('*',sc[1],sc); { Теперь уже sc[1] - a; sc[2] - x} mn.c[i].a:=strToReal(sc[1]); if t1>1 then mn.c[i].n:=strToInt(xPower) { n >= 2 } else if t2>1 then mn.c[i].n:=1 else mn.c[i].n:=0; { если была только одна компонента, то значит это просто константа } end; randomize; x:=5-random(1000)/100; writeln(' x=',x:8:3,' F(x)=',mn.value(x):8:3, ' Check: ',F(x):8:3); end.             |
HOME |