Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function replace(origin:string; left, right:longint; str:string):string;
- begin
- var new_line := '';
- for var i := 1 to left-1 do
- new_line += origin[i];
- new_line += str;
- for var i := right+1 to length(origin) do
- new_line += origin[i];
- replace := new_line;
- end;
- function part(origin:string; left, right:longint):string;
- begin
- var new_line := '';
- for var i := left to right do
- new_line += origin[i];
- part := new_line;
- end;
- function find_pair_to_bracket(s:string; p:longint):longint;
- begin
- var q := 1;
- for var i := p+1 to length(s) do begin
- if s[i] = '(' then q := q + 1;
- if s[i] = ')' then q := q - 1;
- if q = 0 then begin find_pair_to_bracket := i; exit; end;
- end;
- find_pair_to_bracket := -1;
- end;
- function calculate_function(func_name:string; arg:string):string;
- begin
- var _result := 0.0;
- var _arg := StrToFloat(arg);
- case func_name of
- 'sin': _result := sin(_arg);
- 'cos': _result := cos(_arg);
- end;
- calculate_function := FloatToStr(_result);
- end;
- function find_left_number(s:string; p:longint):longint;
- begin
- var q := 0;
- for var i := p downto 1 do
- if not ((s[i] in ['0'..'9']) or (s[i] = '.')) then begin
- q := i;
- break;
- end;
- find_left_number := q+1;
- end;
- function find_right_number(s:string; p:longint):longint;
- begin
- var q := length(s)+1;
- for var i := p to length(s) do begin
- if not ((s[i] in ['0'..'9']) or (s[i] = '.')) then begin
- q := i;
- break;
- end;
- end;
- find_right_number := q-1;
- end;
- function calculate_operation(_left, _right:string; operation:char):string;
- begin
- var _result := 0.0;
- var left := StrToFloat(_left);
- var right := StrToFloat(_right);
- case operation of
- '^': _result := power(left, right);
- '*': _result := left*right;
- '/': _result := left/right;
- '+': _result := left+right;
- '-': _result := left-right;
- end;
- calculate_operation := FloatToStr(_result);
- end;
- function calculate(s:string):string;
- begin
- for var i := 1 to length(s)-1 do begin
- if (s[i] = '+') and (s[i+1] = '-') then s := replace(s, i, i+1, '-');
- if (s[i] = '+') and (s[i+1] = '+') then s := replace(s, i, i+1, '+');
- if (s[i] = '-') and (s[i+1] = '-') then s := replace(s, i, i+1, '+');
- if (s[i] = '-') and (s[i+1] = '+') then s := replace(s, i, i+1, '-');
- end;
- writeln(s);
- var func_name := '';
- var start_of_func := 0;
- for var i := 1 to length(s) do begin
- if s[i] in ['a'..'z'] then begin
- if func_name = '' then start_of_func := i;
- func_name += s[i];
- end;
- if not (s[i] in ['a'..'z']) and (func_name <> '') then
- begin
- var a := part(s, i+1, find_pair_to_bracket(s, i)-1);
- var replacing := calculate_function(func_name, calculate(a));
- calculate := calculate(replace(s, start_of_func, find_pair_to_bracket(s, i+1), replacing));
- exit;
- end;
- end;
- for var i := 1 to length(s) do begin
- if s[i] = '(' then begin calculate := calculate(replace(s, i, find_pair_to_bracket(s, i), calculate(part(s, i+1, find_pair_to_bracket(s, i)-1)))); exit; end;
- end;
- for var i := 1 to length(s) do
- if (s[i] = '^') then
- begin
- calculate := calculate(replace(s, find_left_number(s, i-1), find_right_number(s, i+1), calculate_operation(part(s, find_left_number(s, i-1), i-1), part(s, i+1, find_right_number(s, i+1)), s[i])));
- exit;
- end;
- for var i := 1 to length(s) do
- if (s[i] = '*') or (s[i] = '/') then
- begin
- calculate := calculate(replace(s, find_left_number(s, i-1), find_right_number(s, i+1), calculate_operation(part(s, find_left_number(s, i-1), i-1), part(s, i+1, find_right_number(s, i+1)), s[i])));
- exit;
- end;
- for var i := 1 to length(s) do
- if (s[i] = '+') or (s[i] = '-') then
- begin
- calculate := calculate(replace(s, find_left_number(s, i-1), find_right_number(s, i+1), calculate_operation(part(s, find_left_number(s, i-1), i-1), part(s, i+1, find_right_number(s, i+1)), s[i])));
- exit;
- end;
- calculate := s;
- end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement